bundle.js 2.0 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956
  1. var __extends = (this && this.__extends) || (function () {
  2. var extendStatics = Object.setPrototypeOf ||
  3. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  4. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  5. return function (d, b) {
  6. extendStatics(d, b);
  7. function __() { this.constructor = d; }
  8. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  9. };
  10. })();
  11. (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
  12. "use strict";
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  15. var DispatcherManager_1 = require("../utils/DispatcherManager");
  16. var Singleton_1 = require("../utils/Singleton");
  17. var ServerSocket_1 = require("../WXSDK/ServerSocket");
  18. var RoleData_1 = require("../Data/RoleData");
  19. /*
  20. * name;
  21. */
  22. var AgencyBaseControl = /** @class */ (function (_super) {
  23. __extends(AgencyBaseControl, _super);
  24. function AgencyBaseControl() {
  25. var _this = _super.call(this) || this;
  26. _this._objectPool = PanelResDic_1.PanelResDic.Instance;
  27. _this.initSelf();
  28. return _this;
  29. }
  30. AgencyBaseControl.prototype.initSelf = function () {
  31. };
  32. /**********混淆 */
  33. AgencyBaseControl.prototype.drawSomething = function () {
  34. this.sp = new Laya.Sprite();
  35. Laya.stage.addChild(this.sp);
  36. //画线
  37. this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
  38. //画连续直线
  39. this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5);
  40. //画曲线
  41. this.sp.graphics.drawCurves(352, 58, [0, 0, 19, -100, 39, 0, 58, 100, 78, 0, 97, -100, 117, 0, 136, 100, 156, 0], "#ff0000", 5);
  42. //画矩形
  43. this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00");
  44. //画多边形
  45. this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00");
  46. //画三角形
  47. this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00");
  48. //画圆
  49. this.sp.graphics.drawCircle(98, 332, 50, "#00ffff");
  50. //画扇形
  51. this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff");
  52. //绘制圆角矩形,自定义路径
  53. this.sp.graphics.drawPath(400, 310, [["moveTo", 5, 0], ["lineTo", 105, 0], ["arcTo", 110, 0, 110, 5, 5], ["lineTo", 110, 55], ["arcTo", 110, 60, 105, 60, 5], ["lineTo", 5, 60], ["arcTo", 0, 60, 0, 55, 5], ["lineTo", 0, 5], ["arcTo", 0, 0, 5, 0, 5], ["closePath"]], { fillStyle: "#00ffff" });
  54. };
  55. /********** */
  56. /**
  57. * 注册全局侦听事件
  58. *
  59. */
  60. AgencyBaseControl.prototype.DisOn = function (type, callbackobj, callbackHandler) {
  61. DispatcherManager_1.DispatcherManager.addEventListener(type, callbackobj, callbackHandler);
  62. };
  63. /**
  64. * 抛出全局事件
  65. */
  66. AgencyBaseControl.prototype.DisTrigger = function (type, data) {
  67. if (data === void 0) { data = null; }
  68. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  69. };
  70. /**
  71. * 移除全局侦听事件
  72. */
  73. AgencyBaseControl.prototype.DisOff = function (type, callbackobj, callbackHandler) {
  74. DispatcherManager_1.DispatcherManager.removeEventListener(type, callbackobj, callbackHandler);
  75. };
  76. /************************** */
  77. AgencyBaseControl.prototype.setup = function () {
  78. var textBox = new Laya.Sprite();
  79. // 随机摆放文本
  80. var text;
  81. for (var i = 0; i < 1000; i++) {
  82. text = new Laya.Text();
  83. text.fontSize = 20;
  84. text.text = (Math.random() * 100).toFixed(0);
  85. text.rotation = Math.random() * 360;
  86. text.color = "#CCCCCC";
  87. text.x = Math.random() * Laya.stage.width;
  88. text.y = Math.random() * Laya.stage.height;
  89. textBox.addChild(text);
  90. }
  91. //缓存为静态图像
  92. textBox.cacheAs = "bitmap";
  93. Laya.stage.addChild(textBox);
  94. };
  95. /********* ********************/
  96. AgencyBaseControl.prototype.getSingleTon = function (ref) {
  97. return this._objectPool.getSingleTon(ref);
  98. };
  99. AgencyBaseControl.prototype.sendMessage = function (act, data, isShowWait) {
  100. if (data === void 0) { data = null; }
  101. if (isShowWait === void 0) { isShowWait = true; }
  102. ServerSocket_1.ServerSocket.Instance.sendMessage(act, data, isShowWait);
  103. };
  104. Object.defineProperty(AgencyBaseControl.prototype, "RoleData", {
  105. get: function () {
  106. if (!this.roleData) {
  107. this.roleData = RoleData_1.RoleData.Instance;
  108. }
  109. return this.roleData;
  110. },
  111. enumerable: true,
  112. configurable: true
  113. });
  114. return AgencyBaseControl;
  115. }(Singleton_1.Singleton));
  116. exports.AgencyBaseControl = AgencyBaseControl;
  117. },{"../Data/RoleData":33,"../PrefabControl/PanelResDic":48,"../WXSDK/ServerSocket":78,"../utils/DispatcherManager":85,"../utils/Singleton":91}],2:[function(require,module,exports){
  118. "use strict";
  119. Object.defineProperty(exports, "__esModule", { value: true });
  120. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  121. var GameState_1 = require("../utils/GameState");
  122. var ViewManager_1 = require("../View/ViewManager");
  123. var CompletePanel_1 = require("../View/CompletePanel");
  124. var GameStateControl_1 = require("../Control/GameStateControl");
  125. var GameUtils_1 = require("../utils/GameUtils");
  126. var SceneControl_1 = require("../Control/SceneControl");
  127. var PropManager_1 = require("../PrefabControl/PropManager");
  128. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  129. var Sdk_1 = require("../WXSDK/Sdk");
  130. var AgencyTrial_1 = require("./AgencyTrial");
  131. var GiftView_1 = require("../View/GiftView");
  132. var RecordManager_1 = require("../WXSDK/RecordManager");
  133. var MainPanel_1 = require("../View/MainPanel");
  134. var AgencyInGame = /** @class */ (function (_super) {
  135. __extends(AgencyInGame, _super);
  136. function AgencyInGame() {
  137. return _super.call(this) || this;
  138. }
  139. AgencyInGame.prototype.initSelf = function () {
  140. this.DisOn(GameState_1.GameState.end, this, this.endgameHandler);
  141. this.DisOn(GameState_1.GameState.revive, this, this.RevivegameHandler);
  142. this.DisOn(GameState_1.GameState.lose, this, this.LosegameHandler);
  143. };
  144. /**复活界面 */
  145. AgencyInGame.prototype.RevivegameHandler = function () {
  146. Laya.timer.once(1000, this, this.reviveView);
  147. };
  148. /**失败界面 */
  149. AgencyInGame.prototype.LosegameHandler = function () {
  150. Laya.timer.once(1000, this, this.loseView);
  151. };
  152. AgencyInGame.prototype.reviveView = function () {
  153. RecordManager_1.RecordManager.Instance.RecordStop();
  154. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  155. var getGold = 0;
  156. Sdk_1.WxApi.recordAldEvent("打开结算界面(复活)");
  157. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  158. };
  159. AgencyInGame.prototype.loseView = function () {
  160. RecordManager_1.RecordManager.Instance.RecordStop();
  161. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  162. var getGold = 0;
  163. Sdk_1.WxApi.recordAldEvent("打开结算界面(失败)");
  164. this.RecropLevelEnd(false);
  165. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  166. };
  167. AgencyInGame.prototype.endgameHandler = function () {
  168. RecordManager_1.RecordManager.Instance.RecordStop();
  169. Laya.timer.once(1000, this, this.startEndView);
  170. };
  171. AgencyInGame.prototype.startEndView = function () {
  172. var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
  173. var getGold = 0;
  174. if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
  175. getGold = this.RoleData.levelcfg.winGold;
  176. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏胜利)");
  177. this.RecropLevelEnd(true);
  178. }
  179. else {
  180. var arr = GameUtils_1.GameUtils.cutstrtoArr(this.RoleData.levelcfg.failGod);
  181. getGold = GameUtils_1.GameUtils.randRangeint(Number(arr[0]), Number(arr[1]));
  182. Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏失败)");
  183. this.RecropLevelEnd(false);
  184. }
  185. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
  186. // ViewManager.Instance.add( ChoutiPanView,2 );
  187. };
  188. AgencyInGame.prototype.RecropLevelEnd = function (_win) {
  189. // if(!Laya.Browser.onWeiXin)return;
  190. // var stageid = this.RoleData.LevelID.toString();
  191. // var useid = PlayerAccount.CurrentAccount.CurAccountData.UseId;
  192. // var stagename = "第" + this.RoleData.LevelID + "关";
  193. // if(_win)
  194. // {
  195. // WxApi.levelSuccess(stageid,stagename,stageid);
  196. // }
  197. // else
  198. // {
  199. // var equipid = this.RoleData.CharacterID.toString();
  200. // var carname = this.RoleData.roleCfg.name;
  201. // WxApi.levelFail(stageid,stagename,stageid,"0",carname);
  202. // }
  203. };
  204. AgencyInGame.prototype.returnmainview = function (win) {
  205. if (win && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  206. var ran = Math.random();
  207. console.log("误触几率为---", ran);
  208. if (ran <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.EndCheat) {
  209. ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
  210. }
  211. GameState_1.GameState.fuhuocishu = 1;
  212. GameState_1.GameState.recordscree = false;
  213. GameState_1.GameState.isdie = false;
  214. PropManager_1.PropManager.Instance.CloseGameOverEffect();
  215. ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
  216. this.DisTrigger(GameState_1.GameState.returnMainView);
  217. SceneControl_1.SceneControl.Instance.ShowTheGameScene();
  218. var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
  219. if (agencytrial.isshiyonging) {
  220. SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
  221. agencytrial.isshiyonging = false;
  222. }
  223. }
  224. else {
  225. GameState_1.GameState.fuhuocishu = 1;
  226. GameState_1.GameState.recordscree = false;
  227. GameState_1.GameState.isdie = false;
  228. PropManager_1.PropManager.Instance.CloseGameOverEffect();
  229. ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
  230. this.DisTrigger(GameState_1.GameState.returnMainView);
  231. SceneControl_1.SceneControl.Instance.ShowTheGameScene();
  232. var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
  233. if (agencytrial.isshiyonging) {
  234. SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
  235. agencytrial.isshiyonging = false;
  236. }
  237. }
  238. if (GameState_1.GameState.GameNum % 3 == 0) {
  239. MainPanel_1.MainPanel.instance.skinclick();
  240. }
  241. //打开好友邀请界面
  242. // ViewManager.Instance.add(FriendInviteView);
  243. };
  244. AgencyInGame.prototype.startGame = function () {
  245. AgencyInGame.gamenum++;
  246. var stageid = this.RoleData.getNowServerLevel().toString().toString();
  247. var stagename = "第" + stageid + "关";
  248. var useid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId;
  249. Sdk_1.WxApi.levelStart(stageid, stagename, useid);
  250. GameStateControl_1.GameStateControl.Instance.startGame();
  251. };
  252. AgencyInGame.key = "AgencyInGame";
  253. AgencyInGame.gamenum = 0;
  254. return AgencyInGame;
  255. }(AgencyBaseControl_1.AgencyBaseControl));
  256. exports.AgencyInGame = AgencyInGame;
  257. },{"../Control/GameStateControl":21,"../Control/SceneControl":29,"../PrefabControl/PropManager":49,"../View/CompletePanel":61,"../View/GiftView":63,"../View/MainPanel":67,"../View/ViewManager":70,"../WXSDK/PlayerAccount":75,"../WXSDK/RecordManager":76,"../WXSDK/Sdk":77,"../utils/GameState":86,"../utils/GameUtils":87,"./AgencyBaseControl":1,"./AgencyTrial":7}],3:[function(require,module,exports){
  258. "use strict";
  259. Object.defineProperty(exports, "__esModule", { value: true });
  260. var ViewManager_1 = require("../View/ViewManager");
  261. var LoadingPanel_1 = require("../View/LoadingPanel");
  262. var AgencyUserMessage_1 = require("./AgencyUserMessage");
  263. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  264. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  265. var AgencyMain_1 = require("./AgencyMain");
  266. var RoleCFG_1 = require("../CFG/RoleCFG");
  267. var LevelCFG_1 = require("../CFG/LevelCFG");
  268. var BuildCFG_1 = require("../CFG/BuildCFG");
  269. var NpcCFG_1 = require("../CFG/NpcCFG");
  270. var GameCFG_1 = require("../CFG/GameCFG");
  271. var AgencySkin_1 = require("./AgencySkin");
  272. var Sdk_1 = require("../WXSDK/Sdk");
  273. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  274. var NetworkManager_1 = require("../WXSDK/NetworkManager");
  275. var Global_1 = require("../Global");
  276. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  277. var AgencyLottery_1 = require("./AgencyLottery");
  278. var ttad_1 = require("../WXSDK/ttad");
  279. var AgencyLogin = /** @class */ (function (_super) {
  280. __extends(AgencyLogin, _super);
  281. function AgencyLogin() {
  282. return _super.call(this) || this;
  283. }
  284. AgencyLogin.prototype.initSelf = function () {
  285. this.DisOn(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_loginSucceed, this, this.Success);
  286. };
  287. AgencyLogin.prototype.Login = function () {
  288. ViewManager_1.ViewManager.Instance.add(LoadingPanel_1.LoadingPanel);
  289. this.loginprogress(0);
  290. // if(Laya.Browser.onWeiXin)
  291. // {
  292. // this.LoginWX();
  293. // }
  294. // else
  295. // {
  296. this.LoginLocal();
  297. // }
  298. };
  299. AgencyLogin.prototype.LoginWX = function () {
  300. var _this = this;
  301. Sdk_1.WxApi.recordAldEvent("开始微信登录");
  302. Sdk_1.WxApi.WXLogin(function (res) {
  303. if (res != "error") {
  304. Sdk_1.WxApi.recordAldEvent("微信登录成功");
  305. console.log("hplogin:" + "querychannel->" + Sdk_1.WxApi.querychannel + " referrerInfoappId->" + Sdk_1.WxApi.referrerInfoappId);
  306. _this.LoginLocal();
  307. }
  308. else {
  309. Sdk_1.WxApi.recordAldEvent("微信登录失败");
  310. _this.LoginWX();
  311. }
  312. });
  313. };
  314. AgencyLogin.prototype.LoginLocal = function (res) {
  315. if (res === void 0) { res = null; }
  316. Sdk_1.WxApi.recordAldEvent("开始本地登录");
  317. if (res) {
  318. new PlayerAccount_1.PlayerAccount(res.code, "", "", 0, "", "", "", "", Sdk_1.WxApi.shareOpenId, Sdk_1.WxApi.shareOpenId, Global_1.Global.gameVersion);
  319. }
  320. NetworkManager_1.NetworkManager.Instance.login(null, Laya.Handler.create(this, this.LoginComplete), null);
  321. //this.LoadSbp();
  322. };
  323. AgencyLogin.prototype.LoginComplete = function () {
  324. Sdk_1.WxApi.recordAldEvent("本地服务器登录完成...");
  325. // ShareUtil.Instance.onRegister();
  326. // GuangGao.InitVideo();
  327. Sdk_1.WxApi.aldSendOpenid(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid);
  328. this.Success();
  329. };
  330. AgencyLogin.prototype.loginprogress = function (value) {
  331. var loadingPanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
  332. if (loadingPanel) {
  333. loadingPanel.showWord(value);
  334. }
  335. };
  336. AgencyLogin.prototype.Success = function () {
  337. this.ResolveData();
  338. this.initData();
  339. this.StartMain();
  340. ttad_1.ttad.InitAD();
  341. };
  342. AgencyLogin.prototype.StartMain = function () {
  343. console.log("当前配置表总关卡:", LevelCFG_1.default.vec.length);
  344. this.getSingleTon(AgencyMain_1.AgencyMain).StartMain();
  345. };
  346. /**
  347. * 解析配置数据
  348. */
  349. AgencyLogin.prototype.ResolveData = function () {
  350. var byteData = PlayerAccount_1.PlayerAccount.CurrentAccount.nowConfig.gameConfig[0].config;
  351. if (byteData && byteData != "") {
  352. var arr = byteData.split("%file%");
  353. var i;
  354. var nums = arr.length;
  355. for (i = 0; i < nums; i++) {
  356. var itemarr = arr[i].split("%cfg%");
  357. var cla = AgencyLogin.configClass[itemarr[0]];
  358. if (cla) {
  359. cla.initCfg(itemarr[1]);
  360. }
  361. else {
  362. }
  363. }
  364. return true;
  365. }
  366. return false;
  367. };
  368. /**
  369. * 初始化游戏数据
  370. */
  371. AgencyLogin.prototype.initData = function () {
  372. this.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).init();
  373. this.getSingleTon(AgencySkin_1.AgencySkin).init();
  374. this.getSingleTon(AgencyLottery_1.AgencyLottery).init();
  375. };
  376. AgencyLogin.key = "AgencyLogin";
  377. AgencyLogin.configClass = {
  378. RoleCFG: RoleCFG_1.default,
  379. LevelCFG: LevelCFG_1.default,
  380. BuildCFG: BuildCFG_1.default,
  381. NpcCFG: NpcCFG_1.default,
  382. GameCFG: GameCFG_1.default,
  383. LotteryCFG: LotteryCFG_1.default
  384. };
  385. return AgencyLogin;
  386. }(AgencyBaseControl_1.AgencyBaseControl));
  387. exports.AgencyLogin = AgencyLogin;
  388. },{"../CFG/BuildCFG":9,"../CFG/GameCFG":10,"../CFG/LevelCFG":11,"../CFG/LotteryCFG":12,"../CFG/NpcCFG":13,"../CFG/RoleCFG":14,"../Global":41,"../View/LoadingPanel":65,"../View/ViewManager":70,"../WXSDK/NetworkManager":73,"../WXSDK/PlayerAccount":75,"../WXSDK/Sdk":77,"../WXSDK/WECHATEVENT":80,"../WXSDK/ttad":83,"./AgencyBaseControl":1,"./AgencyLottery":4,"./AgencyMain":5,"./AgencySkin":6,"./AgencyUserMessage":8}],4:[function(require,module,exports){
  389. "use strict";
  390. Object.defineProperty(exports, "__esModule", { value: true });
  391. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  392. var ViewManager_1 = require("../View/ViewManager");
  393. var LotteryPanel_1 = require("../View/LotteryPanel");
  394. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  395. var GameUtils_1 = require("../utils/GameUtils");
  396. var GlobalTip_1 = require("../utils/GlobalTip");
  397. var RoleCFG_1 = require("../CFG/RoleCFG");
  398. var AgencySkin_1 = require("./AgencySkin");
  399. var AgencyLottery = /** @class */ (function (_super) {
  400. __extends(AgencyLottery, _super);
  401. function AgencyLottery() {
  402. var _this = _super.call(this) || this;
  403. _this.mStartX = 400;
  404. _this.mStartY = 500;
  405. _this.mActionIndex = 0;
  406. _this.mCurrIndex = 0;
  407. _this.mCurrSkinIndex = 0;
  408. return _this;
  409. }
  410. AgencyLottery.prototype.init = function () {
  411. };
  412. AgencyLottery.prototype.openView = function () {
  413. ViewManager_1.ViewManager.Instance.add(LotteryPanel_1.LotteryPanel);
  414. };
  415. /**************************** */
  416. AgencyLottery.prototype.createAnimation = function () {
  417. var ani = new Laya.Animation();
  418. // ani.loadAtlas(this.AniConfPath); // 加载图集动画
  419. ani.interval = 30; // 设置播放间隔(单位:毫秒)
  420. ani.index = 1; // 当前播放索引
  421. ani.play(); // 播放图集动画
  422. // 获取动画的边界信息
  423. var bounds = ani.getGraphicBounds();
  424. ani.pivot(bounds.width / 2, bounds.height / 2);
  425. ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  426. Laya.stage.addChild(ani);
  427. };
  428. /************************* */
  429. AgencyLottery.prototype.getreward = function (cfg) {
  430. if (cfg) {
  431. switch (cfg.type) {
  432. case 1:
  433. this.RoleData.Money += Number(cfg.value);
  434. GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得" + cfg.value + "金币!");
  435. break;
  436. case 2:
  437. var rolecfg = RoleCFG_1.default.dict[cfg.value];
  438. this.getSingleTon(AgencySkin_1.AgencySkin).setRoleState(rolecfg, 1);
  439. GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得角色" + rolecfg.rolename);
  440. break;
  441. }
  442. }
  443. };
  444. AgencyLottery.prototype.GetReward = function () {
  445. var index = 0;
  446. var dicts = LotteryCFG_1.default.vec;
  447. var maxNum = 0;
  448. var cfg;
  449. var i = 0;
  450. for (i = 0; i < dicts.length; i++) {
  451. cfg = dicts[i];
  452. maxNum += cfg.weight;
  453. }
  454. var sordvalue = GameUtils_1.GameUtils.randRangeint(1, maxNum);
  455. var totalnum = 0;
  456. for (i = 0; i < dicts.length; i++) {
  457. cfg = dicts[i];
  458. totalnum += cfg.weight;
  459. if (totalnum >= sordvalue) {
  460. index = i;
  461. break;
  462. }
  463. }
  464. return index;
  465. };
  466. /************************************************ */
  467. AgencyLottery.prototype.startFun = function () {
  468. this.mAniPath = "res/spine/spineRes1/dragon.sk";
  469. // this.mFactory = new Templet();
  470. // this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
  471. // this.mFactory.on(Event.ERROR, this, this.onError);
  472. // this.mFactory.loadAni(this.mAniPath);
  473. };
  474. AgencyLottery.prototype.onError = function () {
  475. console.log("error");
  476. };
  477. AgencyLottery.prototype.parseComplete = function () {
  478. //创建模式为1,可以启用换装
  479. this.mArmature = this.mFactory.buildArmature(1);
  480. this.mArmature.x = this.mStartX;
  481. this.mArmature.y = this.mStartY;
  482. this.mArmature.scale(0.5, 0.5);
  483. Laya.stage.addChild(this.mArmature);
  484. // this.mArmature.on(Event.STOPPED, this, this.completeHandler);
  485. this.play();
  486. };
  487. AgencyLottery.prototype.completeHandler = function () {
  488. this.play();
  489. };
  490. AgencyLottery.prototype.play = function () {
  491. this.mCurrIndex++;
  492. if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
  493. this.mCurrIndex = 0;
  494. }
  495. this.mArmature.play(this.mCurrIndex, false);
  496. };
  497. AgencyLottery.key = "AgencyLottery";
  498. return AgencyLottery;
  499. }(AgencyBaseControl_1.AgencyBaseControl));
  500. exports.AgencyLottery = AgencyLottery;
  501. },{"../CFG/LotteryCFG":12,"../CFG/RoleCFG":14,"../View/LotteryPanel":66,"../View/ViewManager":70,"../utils/GameUtils":87,"../utils/GlobalTip":88,"./AgencyBaseControl":1,"./AgencySkin":6}],5:[function(require,module,exports){
  502. "use strict";
  503. Object.defineProperty(exports, "__esModule", { value: true });
  504. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  505. var ResourceControl_1 = require("../Control/ResourceControl");
  506. var LoadingPanel_1 = require("../View/LoadingPanel");
  507. var ViewManager_1 = require("../View/ViewManager");
  508. var ResDataControl_1 = require("../Control/ResDataControl");
  509. var MainPanel_1 = require("../View/MainPanel");
  510. var SceneControl_1 = require("../Control/SceneControl");
  511. var AssetPath_1 = require("../Config/AssetPath");
  512. var GameStateControl_1 = require("../Control/GameStateControl");
  513. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  514. var NpcCFG_1 = require("../CFG/NpcCFG");
  515. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  516. var PropManager_1 = require("../PrefabControl/PropManager");
  517. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  518. var GiftView_1 = require("../View/GiftView");
  519. var AssetManager_1 = require("../Control/AssetManager");
  520. var AgencyMain = /** @class */ (function (_super) {
  521. __extends(AgencyMain, _super);
  522. function AgencyMain() {
  523. var _this = _super.call(this) || this;
  524. _this._loadjd = 0;
  525. _this._alljd = 0;
  526. return _this;
  527. }
  528. AgencyMain.prototype.initSelf = function () {
  529. };
  530. AgencyMain.prototype.StartMain = function () {
  531. this._loadjd = 0;
  532. this._alljd = 20;
  533. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage", this, this.sub1complete, this.loadprogress, null);
  534. };
  535. AgencyMain.prototype.sub1complete = function () {
  536. this._loadjd = 20;
  537. this._alljd = 30;
  538. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage1", this, this.SubpackageOver, this.loadprogress, null);
  539. };
  540. AgencyMain.prototype.onComplete = function () {
  541. //添加父级猴子
  542. var dude = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/skinModel/dude/dude.lh"));
  543. //缩放
  544. var scale = new Laya.Vector3(0.1, 0.1, 0.1);
  545. dude.transform.localScale = scale;
  546. dude.transform.rotate(new Laya.Vector3(0, 3.14, 0));
  547. };
  548. /*************************************** */
  549. AgencyMain.prototype.SubpackageOver = function () {
  550. var _this = this;
  551. AssetManager_1.AssetManager.LoadAssetFun(function () {
  552. _this._loadjd = 50;
  553. _this._alljd = 40;
  554. var pathArr = [];
  555. var urlArr = [];
  556. urlArr.push(AssetPath_1.AssetPath.get3DModel("startpanel"));
  557. urlArr.push(AssetPath_1.AssetPath.get3DModel("endpanel"));
  558. urlArr.push(AssetPath_1.AssetPath.get3DModel("speedupeffect"));
  559. urlArr.push(AssetPath_1.AssetPath.get3DModel("color_white"));
  560. urlArr.push(AssetPath_1.AssetPath.get3DModel("color_yellow"));
  561. urlArr.push(AssetPath_1.AssetPath.get3DModel("winline"));
  562. urlArr.push(AssetPath_1.AssetPath.get3DModel("fireworks"));
  563. urlArr.push(AssetPath_1.AssetPath.get3DModel("DirectionalLight"));
  564. // urlArr.push( AssetPath.get3DModel( "distantview" ) );
  565. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(_this.RoleData.roleCfg.name));
  566. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel("Arrow"));
  567. var arr = _this.RoleData.levelmapArr;
  568. var i = 0;
  569. for (i = 0; i < arr.length; i++) {
  570. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
  571. urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
  572. }
  573. }
  574. var npcArr = _this.RoleData.levelcfg.npc;
  575. for (i = 0; i < npcArr.length; i++) {
  576. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  577. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  578. }
  579. }
  580. for (i = 0; i < urlArr.length; i++) {
  581. pathArr.push({ url: urlArr[i] });
  582. }
  583. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, _this, _this.load3Dcomplete, _this.loadprogress);
  584. });
  585. };
  586. AgencyMain.prototype.load3Dcomplete = function () {
  587. this._loadjd = 90;
  588. this._alljd = 10;
  589. ResourceControl_1.ResourceControl.Instance.loadGroup("main", this, this.loadcomplete, this.loadprogress, false);
  590. };
  591. AgencyMain.prototype.loadprogress = function (value) {
  592. var loadingpanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
  593. if (loadingpanel) {
  594. value = this._loadjd + Math.ceil(value / 100 * this._alljd);
  595. loadingpanel.showWord(value);
  596. }
  597. };
  598. AgencyMain.prototype.loadcomplete = function () {
  599. fairygui.UIConfig.buttonSound = "ui://lecxynh2iz9y26";
  600. GameStateControl_1.GameStateControl.Instance.init();
  601. ResDataControl_1.ResDataControl.Instance.AddViewPackByName("main");
  602. ViewManager_1.ViewManager.Instance.close(LoadingPanel_1.LoadingPanel);
  603. // FYHD_Sdk.InitSdk();
  604. ViewManager_1.ViewManager.Instance.add(MainPanel_1.MainPanel);
  605. console.log("新用户FYHD_Sdk.isnewuser---", FYHD_Sdk_1.FYHD_Sdk.isnewuser);
  606. var newuser = Laya.LocalStorage.getItem("is_newuser");
  607. if (FYHD_Sdk_1.FYHD_Sdk.isnewuser) {
  608. Laya.timer.once(500, this, function () {
  609. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  610. ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
  611. }
  612. });
  613. }
  614. else {
  615. Laya.LocalStorage.setItem("is_newuser", "1");
  616. }
  617. SceneControl_1.SceneControl.Instance.SetScene();
  618. PropManager_1.PropManager.Instance.InitEffect();
  619. };
  620. AgencyMain.key = "AgencyMain";
  621. return AgencyMain;
  622. }(AgencyBaseControl_1.AgencyBaseControl));
  623. exports.AgencyMain = AgencyMain;
  624. },{"../CFG/NpcCFG":13,"../Config/AssetPath":15,"../Control/AssetManager":17,"../Control/GameStateControl":21,"../Control/ResDataControl":27,"../Control/ResourceControl":28,"../Control/SceneControl":29,"../PrefabControl/PropManager":49,"../View/GiftView":63,"../View/LoadingPanel":65,"../View/MainPanel":67,"../View/ViewManager":70,"../WXSDK/FYHD_Sdk":71,"../WXSDK/PlayerAccount":75,"../WXSDK/WXGamePlatform":81,"./AgencyBaseControl":1}],6:[function(require,module,exports){
  625. "use strict";
  626. Object.defineProperty(exports, "__esModule", { value: true });
  627. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  628. var LocalDataControl_1 = require("../Control/LocalDataControl");
  629. var UserDataInfo_1 = require("../Data/UserDataInfo");
  630. var SkinData_1 = require("../Data/SkinData");
  631. var RoleCFG_1 = require("../CFG/RoleCFG");
  632. var ViewManager_1 = require("../View/ViewManager");
  633. var SkinPanel_1 = require("../View/SkinPanel");
  634. var GlobalTip_1 = require("../utils/GlobalTip");
  635. var GameState_1 = require("../utils/GameState");
  636. var AgencySkin = /** @class */ (function (_super) {
  637. __extends(AgencySkin, _super);
  638. function AgencySkin() {
  639. var _this = _super.call(this) || this;
  640. AgencySkin.instance = _this;
  641. return _this;
  642. }
  643. AgencySkin.prototype.initSelf = function () {
  644. };
  645. AgencySkin.prototype.init = function () {
  646. this.localdata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin);
  647. var pifuData;
  648. if (!this.localdata.hasOwnProperty("pifu")) {
  649. this.localdata["pifu"] = {};
  650. }
  651. pifuData = this.localdata["pifu"];
  652. this.pifuArr = [];
  653. this.pifuDict = {};
  654. var i = 0;
  655. var nums = RoleCFG_1.default.vec.length;
  656. for (i = 0; i < nums; i++) {
  657. var pifuvo = new SkinData_1.SkinData;
  658. var cfg = RoleCFG_1.default.vec[i];
  659. pifuvo.roleCFG = cfg;
  660. var d = pifuData[cfg.id];
  661. if (d) {
  662. pifuvo.state = Number(d.state);
  663. pifuvo.hasnum = Number(d.hasnum);
  664. }
  665. else {
  666. pifuvo.state = 0;
  667. pifuvo.hasnum = 0;
  668. }
  669. if (cfg.getState == 0) {
  670. pifuvo.state = 1;
  671. }
  672. this.pifuArr.push(pifuvo);
  673. this.pifuDict[pifuvo.roleCFG.id] = pifuvo;
  674. }
  675. };
  676. AgencySkin.prototype.openview = function () {
  677. ViewManager_1.ViewManager.Instance.add(SkinPanel_1.SkinPanel);
  678. };
  679. AgencySkin.prototype.setRoleState = function (cfg, value) {
  680. var pifuvo = this.pifuDict[cfg.id];
  681. if (pifuvo) {
  682. pifuvo.state = 1;
  683. this.AddLocalSkinData(pifuvo.roleCFG.id, pifuvo.state, pifuvo.hasnum);
  684. }
  685. };
  686. AgencySkin.prototype.AddLocalSkinData = function (id, state, hasnum) {
  687. this.localdata["pifu"][id] = {};
  688. this.localdata["pifu"][id]["state"] = state;
  689. this.localdata["pifu"][id]["hasnum"] = hasnum;
  690. LocalDataControl_1.LocalDataControl.Instance.AddData(UserDataInfo_1.UserDataInfo.skin, this.localdata);
  691. };
  692. AgencySkin.prototype.createCantralRect = function () {
  693. this.rect = new Laya.Sprite();
  694. this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
  695. Laya.stage.addChild(this.rect);
  696. this.updateRectPos();
  697. };
  698. AgencySkin.prototype.updateRectPos = function () {
  699. this.rect.x = Laya.stage.width / 2;
  700. this.rect.y = Laya.stage.height / 2;
  701. };
  702. /****************************************** */
  703. AgencySkin.prototype.GainPifu = function (_skinitem) {
  704. if (_skinitem.state == 1) {
  705. this.RoleData.CharacterID = _skinitem.roleCFG.id;
  706. this.DisTrigger(GameState_1.GameState.updateSKinView);
  707. }
  708. else {
  709. switch (_skinitem.roleCFG.getState) {
  710. case 1: //视频获取
  711. _skinitem.hasnum++;
  712. if (_skinitem.roleCFG.need <= _skinitem.hasnum) {
  713. _skinitem.state = 1;
  714. }
  715. this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
  716. this.DisTrigger(GameState_1.GameState.updateSKinView);
  717. break;
  718. case 2: //金币购买
  719. if (this.RoleData.Money >= _skinitem.roleCFG.need) {
  720. this.RoleData.Money -= _skinitem.roleCFG.need;
  721. _skinitem.state = 1;
  722. this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
  723. this.DisTrigger(GameState_1.GameState.updateSKinView);
  724. GlobalTip_1.GlobalTip.Instance.showWordTips("购买成功");
  725. }
  726. else {
  727. GlobalTip_1.GlobalTip.Instance.showWordTips("金币不足");
  728. }
  729. break;
  730. case 3: //活动获取
  731. break;
  732. }
  733. }
  734. };
  735. AgencySkin.prototype.GainNoHaveSkin = function () {
  736. var arr = [];
  737. for (var s in this.pifuDict) {
  738. if (this.pifuDict[s].state == 0) {
  739. arr.push(this.pifuDict[s]);
  740. }
  741. }
  742. return arr;
  743. };
  744. AgencySkin.key = "AgencySkin";
  745. return AgencySkin;
  746. }(AgencyBaseControl_1.AgencyBaseControl));
  747. exports.AgencySkin = AgencySkin;
  748. },{"../CFG/RoleCFG":14,"../Control/LocalDataControl":23,"../Data/SkinData":34,"../Data/UserDataInfo":35,"../View/SkinPanel":68,"../View/ViewManager":70,"../utils/GameState":86,"../utils/GlobalTip":88,"./AgencyBaseControl":1}],7:[function(require,module,exports){
  749. "use strict";
  750. Object.defineProperty(exports, "__esModule", { value: true });
  751. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  752. var ViewManager_1 = require("../View/ViewManager");
  753. var TrialPanel_1 = require("../View/TrialPanel");
  754. var GameStateControl_1 = require("../Control/GameStateControl");
  755. var AssetPath_1 = require("../Config/AssetPath");
  756. var ResourceControl_1 = require("../Control/ResourceControl");
  757. var SceneControl_1 = require("../Control/SceneControl");
  758. var AgencyInGame_1 = require("./AgencyInGame");
  759. var EggPanel_1 = require("../View/EggPanel");
  760. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  761. var AgencyTrial = /** @class */ (function (_super) {
  762. __extends(AgencyTrial, _super);
  763. function AgencyTrial() {
  764. var _this = _super.call(this) || this;
  765. _this.isshiyonging = false;
  766. return _this;
  767. }
  768. AgencyTrial.prototype.openview = function (arr) {
  769. ViewManager_1.ViewManager.Instance.add(TrialPanel_1.TrialPanel, arr);
  770. };
  771. /**退出界面 */
  772. AgencyTrial.prototype.ExitPanel = function (_data) {
  773. this.isshiyonging = _data ? true : false;
  774. this._selectvo = _data;
  775. if (_data) {
  776. var urlArr = [];
  777. urlArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(_data.roleCFG.name) });
  778. ResourceControl_1.ResourceControl.Instance.loader3DArr(urlArr, this, this.SceneCreateComplete, null, true);
  779. }
  780. else {
  781. // if(AgencyInGame.gamenum>1){
  782. var random = Math.random();
  783. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser && random <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.HitEgg) {
  784. ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
  785. }
  786. else {
  787. GameStateControl_1.GameStateControl.Instance.entergame();
  788. }
  789. // }
  790. // else{
  791. // GameStateControl.Instance.entergame();
  792. // }
  793. }
  794. ViewManager_1.ViewManager.Instance.close(TrialPanel_1.TrialPanel);
  795. };
  796. /************************************************ */
  797. AgencyTrial.prototype.createSprite = function () {
  798. this.sprit = new Laya.Sprite();
  799. this.sprit.graphics.drawRect(0, 0, 200, 200, "#D2691E");
  800. this.sprit.pivot(100, 100);
  801. this.sprit.x = Laya.stage.width / 2;
  802. this.sprit.y = Laya.stage.height / 2;
  803. this.sprit.size(200, 200);
  804. Laya.stage.addChild(this.sprit);
  805. // this.sp.on(Interaction_CustomEvent.ROTATE, this, this.onRotate); // 侦听自定义的事件
  806. // this.sprit.on(Event.CLICK, this, this.onSpriteClick);
  807. };
  808. AgencyTrial.prototype.onSpriteClick = function (e) {
  809. var randomAngle = Math.random() * 180;
  810. //发送自定义事件
  811. // this.sprit.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
  812. };
  813. // 触发自定义的rotate事件
  814. AgencyTrial.prototype.onRotate = function (newAngle) {
  815. // Tween.to(this.sp, { "rotation": newAngle }, 1000, Ease.elasticOut);
  816. };
  817. /******************************* */
  818. AgencyTrial.prototype.SceneCreateComplete = function () {
  819. SceneControl_1.SceneControl.Instance.CreatePlayer(this._selectvo.roleCFG);
  820. if (AgencyInGame_1.AgencyInGame.gamenum > 1) {
  821. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
  822. ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
  823. }
  824. else {
  825. GameStateControl_1.GameStateControl.Instance.entergame();
  826. }
  827. }
  828. else {
  829. GameStateControl_1.GameStateControl.Instance.entergame();
  830. }
  831. };
  832. /******************************* */
  833. AgencyTrial.prototype.createText = function () {
  834. var txt = new Laya.Text();
  835. //给文本的text属性赋值
  836. txt.text = "Layabox是性能最强的HTML5引擎技术提供商与优秀的游戏发行商,面向Flash开发者提供HTML5开发技术方案!";
  837. //设置宽度,高度自动匹配
  838. txt.width = 400;
  839. //自动换行
  840. txt.wordWrap = true;
  841. txt.align = "center";
  842. txt.fontSize = 40;
  843. txt.font = "Microsoft YaHei";
  844. txt.color = "#ff0000";
  845. txt.bold = true;
  846. txt.leading = 5;
  847. //设置描边属性
  848. txt.stroke = 2;
  849. txt.strokeColor = "#ffffff";
  850. txt.borderColor = "#00ff00";
  851. txt.x = (Laya.stage.width - txt.textWidth) / 2;
  852. txt.y = (Laya.stage.height - txt.textHeight) / 2;
  853. Laya.stage.addChild(txt);
  854. };
  855. /************************** */
  856. AgencyTrial.prototype.createInput = function () {
  857. var inputText = new Laya.Input();
  858. // 移动端输入提示符
  859. inputText.prompt = "Type some word...";
  860. //多行输入
  861. inputText.multiline = true;
  862. inputText.wordWrap = true;
  863. inputText.size(350, 100);
  864. inputText.x = Laya.stage.width - inputText.width >> 1;
  865. inputText.y = Laya.stage.height - inputText.height >> 1;
  866. inputText.padding = [2, 2, 2, 2];
  867. inputText.bgColor = "#666666";
  868. inputText.color = "#ffffff";
  869. inputText.fontSize = 20;
  870. Laya.stage.addChild(inputText);
  871. };
  872. AgencyTrial.key = "AgencyTrial";
  873. return AgencyTrial;
  874. }(AgencyBaseControl_1.AgencyBaseControl));
  875. exports.AgencyTrial = AgencyTrial;
  876. },{"../Config/AssetPath":15,"../Control/GameStateControl":21,"../Control/ResourceControl":28,"../Control/SceneControl":29,"../View/EggPanel":62,"../View/TrialPanel":69,"../View/ViewManager":70,"../WXSDK/PlayerAccount":75,"./AgencyBaseControl":1,"./AgencyInGame":2}],8:[function(require,module,exports){
  877. "use strict";
  878. Object.defineProperty(exports, "__esModule", { value: true });
  879. var AgencyBaseControl_1 = require("./AgencyBaseControl");
  880. var AgencyUserMessage = /** @class */ (function (_super) {
  881. __extends(AgencyUserMessage, _super);
  882. function AgencyUserMessage() {
  883. var _this = _super.call(this) || this;
  884. _this.roleisinit = false;
  885. return _this;
  886. }
  887. AgencyUserMessage.prototype.initSelf = function () {
  888. };
  889. /**加金币 */
  890. AgencyUserMessage.prototype.GoldUp = function (_num) {
  891. this.RoleData.Money += _num;
  892. };
  893. /**************************** */
  894. AgencyUserMessage.prototype.createInput = function () {
  895. var inputText = new Laya.Input();
  896. inputText.size(350, 100);
  897. inputText.x = Laya.stage.width - inputText.width >> 1;
  898. inputText.y = Laya.stage.height - inputText.height >> 1;
  899. inputText.text = "这段文本不可编辑,但可复制";
  900. inputText.editable = false;
  901. // 设置字体样式
  902. inputText.bold = true;
  903. inputText.bgColor = "#666666";
  904. inputText.color = "#ffffff";
  905. inputText.fontSize = 20;
  906. Laya.stage.addChild(inputText);
  907. };
  908. /******************************** */
  909. AgencyUserMessage.prototype.init = function () {
  910. this.RoleData.init();
  911. this.roleisinit = true;
  912. };
  913. /************************ */
  914. AgencyUserMessage.prototype.createText = function () {
  915. var txt = new Laya.Text();
  916. txt.text =
  917. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
  918. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
  919. "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
  920. txt.borderColor = "#FFFF00";
  921. txt.size(300, 50);
  922. txt.fontSize = 20;
  923. txt.color = "#ffffff";
  924. Laya.stage.addChild(txt);
  925. return txt;
  926. };
  927. /**************************** */
  928. /**升级 */
  929. AgencyUserMessage.prototype.LevelUp = function () {
  930. this.RoleData.LevelUp();
  931. };
  932. AgencyUserMessage.key = "AgencyUserMessage";
  933. return AgencyUserMessage;
  934. }(AgencyBaseControl_1.AgencyBaseControl));
  935. exports.AgencyUserMessage = AgencyUserMessage;
  936. },{"./AgencyBaseControl":1}],9:[function(require,module,exports){
  937. "use strict";
  938. Object.defineProperty(exports, "__esModule", { value: true });
  939. //------------------------------------------------------------------------------
  940. //工具生成,请勿修改。
  941. //配置文件名称:build.xlsx。
  942. //------------------------------------------------------------------------------
  943. var BuildCFG = /** @class */ (function () {
  944. function BuildCFG() {
  945. }
  946. BuildCFG.initCfg = function (str) {
  947. var i = 0;
  948. var arr = str.split("\n");
  949. var i = 0;
  950. for (i = 0; i < arr.length; i++) {
  951. var singleStr = arr[i];
  952. var singleArr = singleStr.split("&");
  953. if (BuildCFG.dict[singleArr[0]])
  954. continue;
  955. var item = new BuildCFG();
  956. item.name = singleArr[0];
  957. item.buffx = Number(singleArr[1]);
  958. item.buffy = Number(singleArr[2]);
  959. item.buffz = Number(singleArr[3]);
  960. item.time = Number(singleArr[4]);
  961. BuildCFG.dict[item.name] = item;
  962. BuildCFG.vec.push(item);
  963. }
  964. };
  965. BuildCFG.dict = {};
  966. BuildCFG.vec = [];
  967. return BuildCFG;
  968. }());
  969. exports.default = BuildCFG;
  970. },{}],10:[function(require,module,exports){
  971. "use strict";
  972. Object.defineProperty(exports, "__esModule", { value: true });
  973. //------------------------------------------------------------------------------
  974. //工具生成,请勿修改。
  975. //配置文件名称:game.xlsx。
  976. //------------------------------------------------------------------------------
  977. var GameCFG = /** @class */ (function () {
  978. function GameCFG() {
  979. }
  980. GameCFG.initCfg = function (str) {
  981. var i = 0;
  982. var arr = str.split("\n");
  983. var i = 0;
  984. for (i = 0; i < arr.length; i++) {
  985. var singleStr = arr[i];
  986. var singleArr = singleStr.split("&");
  987. if (GameCFG.dict[singleArr[0]])
  988. continue;
  989. var item = new GameCFG();
  990. item.id = Number(singleArr[0]);
  991. item.value = singleArr[1];
  992. GameCFG.dict[item.id] = item;
  993. GameCFG.vec.push(item);
  994. }
  995. };
  996. GameCFG.dict = {};
  997. GameCFG.vec = [];
  998. return GameCFG;
  999. }());
  1000. exports.default = GameCFG;
  1001. },{}],11:[function(require,module,exports){
  1002. "use strict";
  1003. Object.defineProperty(exports, "__esModule", { value: true });
  1004. //------------------------------------------------------------------------------
  1005. //工具生成,请勿修改。
  1006. //配置文件名称:level.xlsx。
  1007. //------------------------------------------------------------------------------
  1008. var LevelCFG = /** @class */ (function () {
  1009. function LevelCFG() {
  1010. }
  1011. LevelCFG.initCfg = function (str) {
  1012. var i = 0;
  1013. var arr = str.split("\n");
  1014. var i = 0;
  1015. for (i = 0; i < arr.length; i++) {
  1016. var singleStr = arr[i];
  1017. var singleArr = singleStr.split("&");
  1018. if (LevelCFG.dict[singleArr[0]])
  1019. continue;
  1020. var item = new LevelCFG();
  1021. item.id = Number(singleArr[0]);
  1022. item.road = singleArr[1];
  1023. item.roleinitpos = JSON.parse(singleArr[2]);
  1024. item.npc = JSON.parse(singleArr[3]);
  1025. item.firstScenepos = singleArr[4];
  1026. item.winGold = Number(singleArr[5]);
  1027. item.failGod = singleArr[6];
  1028. LevelCFG.dict[item.id] = item;
  1029. LevelCFG.vec.push(item);
  1030. }
  1031. };
  1032. LevelCFG.dict = {};
  1033. LevelCFG.vec = [];
  1034. return LevelCFG;
  1035. }());
  1036. exports.default = LevelCFG;
  1037. },{}],12:[function(require,module,exports){
  1038. "use strict";
  1039. Object.defineProperty(exports, "__esModule", { value: true });
  1040. //------------------------------------------------------------------------------
  1041. //工具生成,请勿修改。
  1042. //配置文件名称:lottery.xlsx。
  1043. //------------------------------------------------------------------------------
  1044. var LotteryCFG = /** @class */ (function () {
  1045. function LotteryCFG() {
  1046. }
  1047. LotteryCFG.initCfg = function (str) {
  1048. var i = 0;
  1049. var arr = str.split("\n");
  1050. var i = 0;
  1051. for (i = 0; i < arr.length; i++) {
  1052. var singleStr = arr[i];
  1053. var singleArr = singleStr.split("&");
  1054. if (LotteryCFG.dict[singleArr[0]])
  1055. continue;
  1056. var item = new LotteryCFG();
  1057. item.id = Number(singleArr[0]);
  1058. item.type = Number(singleArr[1]);
  1059. item.value = singleArr[2];
  1060. item.weight = Number(singleArr[3]);
  1061. LotteryCFG.dict[item.id] = item;
  1062. LotteryCFG.vec.push(item);
  1063. }
  1064. };
  1065. LotteryCFG.dict = {};
  1066. LotteryCFG.vec = [];
  1067. return LotteryCFG;
  1068. }());
  1069. exports.default = LotteryCFG;
  1070. },{}],13:[function(require,module,exports){
  1071. "use strict";
  1072. Object.defineProperty(exports, "__esModule", { value: true });
  1073. //------------------------------------------------------------------------------
  1074. //工具生成,请勿修改。
  1075. //配置文件名称:npc.xlsx。
  1076. //------------------------------------------------------------------------------
  1077. var NpcCFG = /** @class */ (function () {
  1078. function NpcCFG() {
  1079. }
  1080. NpcCFG.initCfg = function (str) {
  1081. var i = 0;
  1082. var arr = str.split("\n");
  1083. var i = 0;
  1084. for (i = 0; i < arr.length; i++) {
  1085. var singleStr = arr[i];
  1086. var singleArr = singleStr.split("&");
  1087. if (NpcCFG.dict[singleArr[0]])
  1088. continue;
  1089. var item = new NpcCFG();
  1090. item.id = Number(singleArr[0]);
  1091. item.name = singleArr[1];
  1092. item.speed = Number(singleArr[2]);
  1093. item.frontjump = JSON.parse(singleArr[3]);
  1094. item.leftjump = JSON.parse(singleArr[4]);
  1095. item.rightjump = JSON.parse(singleArr[5]);
  1096. item.upclimb = Number(singleArr[6]);
  1097. item.slideclimb = JSON.parse(singleArr[7]);
  1098. item.jump_left = Number(singleArr[8]);
  1099. item.jump_right = Number(singleArr[9]);
  1100. item.start_ahead = Number(singleArr[10]);
  1101. item.distance = Number(singleArr[11]);
  1102. item.gravity = Number(singleArr[12]);
  1103. NpcCFG.dict[item.id] = item;
  1104. NpcCFG.vec.push(item);
  1105. }
  1106. };
  1107. NpcCFG.dict = {};
  1108. NpcCFG.vec = [];
  1109. return NpcCFG;
  1110. }());
  1111. exports.default = NpcCFG;
  1112. },{}],14:[function(require,module,exports){
  1113. "use strict";
  1114. Object.defineProperty(exports, "__esModule", { value: true });
  1115. //------------------------------------------------------------------------------
  1116. //工具生成,请勿修改。
  1117. //配置文件名称:role.xlsx。
  1118. //------------------------------------------------------------------------------
  1119. var RoleCFG = /** @class */ (function () {
  1120. function RoleCFG() {
  1121. }
  1122. RoleCFG.initCfg = function (str) {
  1123. var i = 0;
  1124. var arr = str.split("\n");
  1125. var i = 0;
  1126. for (i = 0; i < arr.length; i++) {
  1127. var singleStr = arr[i];
  1128. var singleArr = singleStr.split("&");
  1129. if (RoleCFG.dict[singleArr[0]])
  1130. continue;
  1131. var item = new RoleCFG();
  1132. item.id = Number(singleArr[0]);
  1133. item.name = singleArr[1];
  1134. item.speed = Number(singleArr[2]);
  1135. item.frontjump = JSON.parse(singleArr[3]);
  1136. item.leftjump = JSON.parse(singleArr[4]);
  1137. item.rightjump = JSON.parse(singleArr[5]);
  1138. item.upclimb = Number(singleArr[6]);
  1139. item.slideclimb = JSON.parse(singleArr[7]);
  1140. item.getState = Number(singleArr[8]);
  1141. item.need = Number(singleArr[9]);
  1142. item.icon = singleArr[10];
  1143. item.gravity = Number(singleArr[11]);
  1144. item.rolename = singleArr[12];
  1145. RoleCFG.dict[item.id] = item;
  1146. RoleCFG.vec.push(item);
  1147. }
  1148. };
  1149. RoleCFG.dict = {};
  1150. RoleCFG.vec = [];
  1151. return RoleCFG;
  1152. }());
  1153. exports.default = RoleCFG;
  1154. },{}],15:[function(require,module,exports){
  1155. "use strict";
  1156. Object.defineProperty(exports, "__esModule", { value: true });
  1157. var Global_1 = require("../Global");
  1158. /*
  1159. * name;
  1160. */
  1161. var AssetPath = /** @class */ (function () {
  1162. function AssetPath() {
  1163. }
  1164. AssetPath.init = function () {
  1165. AssetPath.versionrandom = "?v=" + Math.random();
  1166. };
  1167. AssetPath.getsound = function (id) {
  1168. return Global_1.Global.getUrl(AssetPath.resources + AssetPath.music + id + ".mp3");
  1169. };
  1170. AssetPath.getResConfig = function () {
  1171. return Global_1.Global.getUrl(AssetPath.resources + "resConfig.json");
  1172. };
  1173. AssetPath.getConfig = function (configname) {
  1174. return Global_1.Global.getUrl(AssetPath.resources + configname + ".bin");
  1175. };
  1176. AssetPath.get3Dscene = function (name) {
  1177. return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".ls");
  1178. };
  1179. AssetPath.get3DModel = function (name) {
  1180. return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".lh");
  1181. };
  1182. AssetPath.get3DRoleModel = function (name) {
  1183. return Global_1.Global.getUrl(AssetPath.res + "character/Conventional/" + name + ".lh");
  1184. };
  1185. AssetPath.getroleicon = function (id) {
  1186. return Global_1.Global.getUrl(AssetPath.res + "skinicon/" + id + ".png");
  1187. };
  1188. AssetPath.getVerisonurl = function () {
  1189. if (Global_1.Global.isdebug) {
  1190. return Global_1.Global.getUrl(AssetPath.res + "version.json") + AssetPath.versionrandom;
  1191. }
  1192. return Global_1.Global.getUrl(AssetPath.res + "version" + Global_1.Global.resconfigVersion + ".json");
  1193. };
  1194. AssetPath.getGameVersion = function () {
  1195. return Global_1.Global.getUrl("gameversion.json");
  1196. };
  1197. /**获取匹配人物头像icon */
  1198. AssetPath.pipeiicon = function (id) {
  1199. return Global_1.Global.getUrl(AssetPath.res + "icon/" + id + ".png");
  1200. };
  1201. AssetPath.res = "res/";
  1202. AssetPath.resources = "resources/";
  1203. // export var configs:string = "configs/";
  1204. AssetPath.ui = "ui/";
  1205. AssetPath.subpacksgeui = "character/ui/";
  1206. AssetPath.music = "music/";
  1207. AssetPath.versionrandom = "";
  1208. AssetPath.prop = "prop/";
  1209. AssetPath.skinicon = "skinicon/";
  1210. return AssetPath;
  1211. }());
  1212. exports.AssetPath = AssetPath;
  1213. },{"../Global":41}],16:[function(require,module,exports){
  1214. "use strict";
  1215. Object.defineProperty(exports, "__esModule", { value: true });
  1216. var AssetPath_1 = require("./AssetPath");
  1217. var Global_1 = require("../Global");
  1218. /*
  1219. * name;
  1220. */
  1221. var RecConfigs = /** @class */ (function (_super) {
  1222. __extends(RecConfigs, _super);
  1223. function RecConfigs() {
  1224. var _this = _super.call(this) || this;
  1225. RecConfigs.ins = _this;
  1226. return _this;
  1227. }
  1228. Object.defineProperty(RecConfigs, "Instance", {
  1229. get: function () {
  1230. if (RecConfigs.ins == null) {
  1231. return new RecConfigs();
  1232. }
  1233. return RecConfigs.ins;
  1234. },
  1235. enumerable: true,
  1236. configurable: true
  1237. });
  1238. RecConfigs.prototype.init = function () {
  1239. this.ResDic = {};
  1240. };
  1241. /****************************************************************** */
  1242. RecConfigs.prototype.loadUI = function () {
  1243. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
  1244. var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "正常模式"));
  1245. changeActionButton.size(160, 40);
  1246. changeActionButton.labelBold = true;
  1247. changeActionButton.labelSize = 30;
  1248. changeActionButton.sizeGrid = "4,4,4,4";
  1249. changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1250. changeActionButton.pos(Laya.stage.width / 2 - changeActionButton.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 100 * Laya.Browser.pixelRatio);
  1251. changeActionButton.on(Laya.Event.CLICK, this, function () {
  1252. if (++this.curStateIndex % 2 == 1) {
  1253. this.sprite3D.active = false;
  1254. this.lineSprite3D.active = true;
  1255. changeActionButton.label = "网格模式";
  1256. }
  1257. else {
  1258. this.sprite3D.active = true;
  1259. this.lineSprite3D.active = false;
  1260. changeActionButton.label = "正常模式";
  1261. }
  1262. });
  1263. }));
  1264. };
  1265. /****************************************************************** */
  1266. RecConfigs.prototype.initRec = function (_res) {
  1267. if (_res != null && !RecConfigs.inited) {
  1268. RecConfigs.inited = true;
  1269. var groupsArr = _res.groups;
  1270. var resourcesArr = _res.resources;
  1271. var resourcesDict = {};
  1272. for (var item in resourcesArr) {
  1273. var child = resourcesArr[item];
  1274. switch (child.type) {
  1275. case "bin":
  1276. child.type = Laya.Loader.BUFFER;
  1277. break;
  1278. case "ls":
  1279. child.type = Laya.Scene;
  1280. break;
  1281. case "lh":
  1282. child.type = Laya.Sprite3D;
  1283. break;
  1284. case "lm":
  1285. child.type = Laya.MeshSprite3D;
  1286. break;
  1287. }
  1288. resourcesDict[child.name] = child;
  1289. }
  1290. for (var grouptype in groupsArr) {
  1291. var groupchild = groupsArr[grouptype];
  1292. var arr = groupchild.keys.split(",");
  1293. var childArr = [];
  1294. var chidstr;
  1295. for (chidstr in arr) {
  1296. var strChild = arr[chidstr];
  1297. if (strChild != "") {
  1298. var urls = resourcesDict[strChild].url;
  1299. urls = urls.replace("res/", AssetPath_1.AssetPath.res);
  1300. childArr.push({ url: Global_1.Global.getUrl(urls), type: resourcesDict[strChild].type });
  1301. }
  1302. }
  1303. this.ResDic[groupchild.name] = childArr;
  1304. }
  1305. Laya.loader.clearRes(AssetPath_1.AssetPath.getResConfig());
  1306. }
  1307. };
  1308. /**
  1309. * 是否已经初始化
  1310. */
  1311. RecConfigs.inited = false;
  1312. return RecConfigs;
  1313. }(Laya.EventDispatcher));
  1314. exports.RecConfigs = RecConfigs;
  1315. },{"../Global":41,"./AssetPath":15}],17:[function(require,module,exports){
  1316. "use strict";
  1317. Object.defineProperty(exports, "__esModule", { value: true });
  1318. var AssetPath = /** @class */ (function () {
  1319. function AssetPath() {
  1320. }
  1321. /*粒子特效地址*/
  1322. AssetPath.FxPrefabsPath = "res/character/FX/Conventional/FX.lh";
  1323. return AssetPath;
  1324. }());
  1325. exports.AssetPath = AssetPath;
  1326. var AssetManager = /** @class */ (function () {
  1327. function AssetManager() {
  1328. }
  1329. /**加载资源*/
  1330. AssetManager.LoadAssetFun = function (fun) {
  1331. var _this = this;
  1332. var respaths = [];
  1333. respaths = respaths.concat(AssetPath.FxPrefabsPath);
  1334. Laya.loader.create(respaths, Laya.Handler.create(this, function () {
  1335. var PlayerPrefabs = Laya.loader.getRes(AssetPath.FxPrefabsPath);
  1336. if (PlayerPrefabs) {
  1337. for (var i = 0; i < PlayerPrefabs.numChildren; i++) {
  1338. var asset = PlayerPrefabs.getChildAt(i);
  1339. asset.active = false;
  1340. _this.AllMapDic.push(asset);
  1341. }
  1342. Laya.loader.clearRes(AssetPath.FxPrefabsPath);
  1343. }
  1344. else {
  1345. console.log("PolicePrefabs为空");
  1346. }
  1347. if (fun) {
  1348. fun();
  1349. }
  1350. else {
  1351. console.log("fun为空");
  1352. }
  1353. }));
  1354. };
  1355. /**所有地图*/
  1356. AssetManager.AllMapDic = new Array();
  1357. return AssetManager;
  1358. }());
  1359. exports.AssetManager = AssetManager;
  1360. },{}],18:[function(require,module,exports){
  1361. "use strict";
  1362. Object.defineProperty(exports, "__esModule", { value: true });
  1363. var AssetPath_1 = require("../Config/AssetPath");
  1364. /*
  1365. * name;
  1366. */
  1367. var AudioControl = /** @class */ (function (_super) {
  1368. __extends(AudioControl, _super);
  1369. function AudioControl() {
  1370. var _this = _super.call(this) || this;
  1371. _this._isbgOpen = true;
  1372. _this.open = true;
  1373. _this._isAllOpen = true;
  1374. _this._nowBgName = "";
  1375. _this._isPlaybging = false;
  1376. /**
  1377. * 声音开关引用索引
  1378. */
  1379. _this._soundIndex = 0;
  1380. AudioControl.ins = _this;
  1381. return _this;
  1382. }
  1383. Object.defineProperty(AudioControl, "Instance", {
  1384. get: function () {
  1385. if (AudioControl.ins == null) {
  1386. return new AudioControl();
  1387. }
  1388. return AudioControl.ins;
  1389. },
  1390. enumerable: true,
  1391. configurable: true
  1392. });
  1393. AudioControl.prototype.init = function () {
  1394. Laya.SoundManager.autoReleaseSound = false;
  1395. Laya.SoundManager.autoStopMusic = true;
  1396. };
  1397. Object.defineProperty(AudioControl.prototype, "gamesoundOpen", {
  1398. set: function (value) {
  1399. this.open = value;
  1400. Laya.SoundManager.soundMuted = !value;
  1401. if (value == true) {
  1402. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  1403. }
  1404. else {
  1405. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  1406. }
  1407. },
  1408. enumerable: true,
  1409. configurable: true
  1410. });
  1411. Object.defineProperty(AudioControl.prototype, "GetSoundSwitch", {
  1412. /**
  1413. * 音效是否开启
  1414. */
  1415. get: function () {
  1416. return this.open;
  1417. },
  1418. enumerable: true,
  1419. configurable: true
  1420. });
  1421. Object.defineProperty(AudioControl.prototype, "isbgOpen", {
  1422. /**
  1423. * 背景音乐是否开启
  1424. */
  1425. get: function () {
  1426. return this._isbgOpen;
  1427. },
  1428. set: function (value) {
  1429. this._isbgOpen = value;
  1430. Laya.SoundManager.musicMuted = !value;
  1431. },
  1432. enumerable: true,
  1433. configurable: true
  1434. });
  1435. Object.defineProperty(AudioControl.prototype, "isAllOpen", {
  1436. /**
  1437. * 所有音乐是否开启
  1438. */
  1439. get: function () {
  1440. return this._isAllOpen;
  1441. },
  1442. set: function (value) {
  1443. if (value) {
  1444. this._soundIndex--;
  1445. if (this._soundIndex < 0) {
  1446. this._soundIndex = 0;
  1447. }
  1448. if (!this._isPlaybging && this._soundIndex == 0) {
  1449. this._isAllOpen = true;
  1450. this.setGameVolume(1);
  1451. this.playbgSound(this._nowBgName);
  1452. fairygui.UIConfig.buttonSoundVolumeScale = 1;
  1453. }
  1454. else {
  1455. this._isAllOpen = false;
  1456. }
  1457. }
  1458. else {
  1459. this._isAllOpen = false;
  1460. if (this._soundIndex < 0) {
  1461. this._soundIndex = 0;
  1462. }
  1463. this._soundIndex++;
  1464. if (this._isPlaybging) {
  1465. this.stopbgSound();
  1466. }
  1467. this.setGameVolume(0);
  1468. fairygui.UIConfig.buttonSoundVolumeScale = 0;
  1469. }
  1470. },
  1471. enumerable: true,
  1472. configurable: true
  1473. });
  1474. /**
  1475. * 停止播放音效
  1476. */
  1477. AudioControl.prototype.stopGameSound = function () {
  1478. Laya.SoundManager.stopAllSound();
  1479. };
  1480. /**
  1481. * 停止所有声音
  1482. */
  1483. AudioControl.prototype.ClearAllSOUND = function () {
  1484. this.stopGameSound();
  1485. this.stopbgSound();
  1486. };
  1487. /**
  1488. * 播放背景音乐
  1489. * @param soundName 声音名
  1490. */
  1491. AudioControl.prototype.playbgSound = function (soundName) {
  1492. this._nowBgName = soundName;
  1493. if (this._isAllOpen && this._nowBgName != "" && this._soundIndex <= 0 && !this._isPlaybging) {
  1494. this._isPlaybging = true;
  1495. Laya.SoundManager.playMusic(AssetPath_1.AssetPath.getsound(this._nowBgName));
  1496. this.bgSoundVolume = 0.4;
  1497. }
  1498. };
  1499. /**
  1500. * 停止背景音乐
  1501. */
  1502. AudioControl.prototype.stopbgSound = function () {
  1503. this._isPlaybging = false;
  1504. Laya.SoundManager.stopMusic();
  1505. };
  1506. Object.defineProperty(AudioControl.prototype, "bgSoundVolume", {
  1507. get: function () {
  1508. return Laya.SoundManager.musicVolume;
  1509. },
  1510. /**
  1511. * 设置背景音乐音量
  1512. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1513. */
  1514. set: function (value) {
  1515. Laya.SoundManager.setMusicVolume(value);
  1516. },
  1517. enumerable: true,
  1518. configurable: true
  1519. });
  1520. Object.defineProperty(AudioControl.prototype, "soundVolume", {
  1521. get: function () {
  1522. return Laya.SoundManager.soundVolume;
  1523. },
  1524. /**
  1525. * 设置背景音乐音量
  1526. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1527. */
  1528. set: function (value) {
  1529. Laya.SoundManager.setSoundVolume(value);
  1530. },
  1531. enumerable: true,
  1532. configurable: true
  1533. });
  1534. /**
  1535. * 设置所有声音音量
  1536. * @param value 音量范围从 0(静音)至 1(最大音量)。
  1537. */
  1538. AudioControl.prototype.setGameVolume = function (value) {
  1539. this.bgSoundVolume = value;
  1540. this.soundVolume = value;
  1541. };
  1542. /**
  1543. * 播放音效
  1544. * @param soundName 音效名
  1545. * @param loop 播放次数
  1546. */
  1547. AudioControl.prototype.playGameSound = function (soundName, loop) {
  1548. if (loop === void 0) { loop = 1; }
  1549. if (this._isAllOpen && soundName != "" && Laya.SoundManager.soundVolume != 0) {
  1550. Laya.SoundManager.playSound(AssetPath_1.AssetPath.getsound(soundName), loop);
  1551. }
  1552. };
  1553. return AudioControl;
  1554. }(Laya.EventDispatcher));
  1555. exports.AudioControl = AudioControl;
  1556. },{"../Config/AssetPath":15}],19:[function(require,module,exports){
  1557. "use strict";
  1558. Object.defineProperty(exports, "__esModule", { value: true });
  1559. var ResourceControl_1 = require("./ResourceControl");
  1560. var SkinItem_1 = require("../utils/SkinItem");
  1561. var CpaDownsView_1 = require("../Push/CpaDownsView");
  1562. var CpaItem_1 = require("../Push/CpaItem");
  1563. var BaoKuanGameView_1 = require("../Push/BaoKuanGameView");
  1564. var ShiwantuijianView_1 = require("../Push/ShiwantuijianView");
  1565. /*
  1566. * name;
  1567. */
  1568. var ConnectControl = /** @class */ (function (_super) {
  1569. __extends(ConnectControl, _super);
  1570. function ConnectControl() {
  1571. var _this = _super.call(this) || this;
  1572. /****************************************************** */
  1573. _this.motionCross = false;
  1574. _this.blendType = 0;
  1575. _this.motionIndex = 0;
  1576. _this.motions = ["run", "run_2", "attack", "attack_1", "attack_2", "dead", "idle_2", "idle_3", "idle_4", "idle4", "reload", "replace", "replace_2", "stop"];
  1577. return _this;
  1578. }
  1579. /**
  1580. * 组件绑定
  1581. */
  1582. ConnectControl.ConnectComponent = function () {
  1583. //main
  1584. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2pwlk1a", SkinItem_1.SkinItem);
  1585. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c527", CpaDownsView_1.default);
  1586. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c528", CpaItem_1.default);
  1587. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c529", BaoKuanGameView_1.default);
  1588. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52a", CpaItem_1.default);
  1589. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52b", ShiwantuijianView_1.default);
  1590. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52c", CpaItem_1.default);
  1591. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc21", CpaItem_1.default);
  1592. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc22", CpaItem_1.default);
  1593. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52e", CpaItem_1.default);
  1594. fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2uotu6h", CpaItem_1.default);
  1595. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2ip616l", GiftView);
  1596. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52d", TuijianView);
  1597. // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2kalr6k",FriendInviteView);
  1598. };
  1599. ConnectControl.prototype.sceneLoaded = function (scene) {
  1600. Laya.stage.addChild(scene);
  1601. var animator = scene.getChildAt(2).getComponent(Laya.Animator);
  1602. this.addButton(100, 100, 160, 30, "动画过渡:否", 20, function (e) {
  1603. this.motionCross = !this.motionCross;
  1604. if (this.motionCross)
  1605. e.target.label = "动画过渡:是";
  1606. else
  1607. e.target.label = "动画过渡:否";
  1608. });
  1609. this.addButton(100, 160, 160, 30, "混合模式:全身", 20, function (e) {
  1610. this.blendType++;
  1611. (this.blendType === 3) && (this.blendType = 0);
  1612. switch (this.blendType) {
  1613. case 0:
  1614. e.target.label = "混合模式:全身";
  1615. break;
  1616. case 1:
  1617. e.target.label = "混合模式:上身";
  1618. break;
  1619. case 2:
  1620. e.target.label = "混合模式:下身";
  1621. break;
  1622. }
  1623. });
  1624. this.addButton(100, 220, 260, 40, "切换动作:attack_2", 28, function (e) {
  1625. switch (this.blendType) {
  1626. case 0:
  1627. if (this.motionCross) {
  1628. animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
  1629. animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
  1630. }
  1631. else {
  1632. animator.play(this.motions[this.motionIndex], 0);
  1633. animator.play(this.motions[this.motionIndex], 1);
  1634. }
  1635. break;
  1636. case 1:
  1637. if (this.motionCross)
  1638. animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
  1639. else
  1640. animator.play(this.motions[this.motionIndex], 0);
  1641. break;
  1642. case 2:
  1643. if (this.motionCross)
  1644. animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
  1645. else
  1646. animator.play(this.motions[this.motionIndex], 1);
  1647. break;
  1648. }
  1649. e.target.label = "切换动作:" + this.motions[this.motionIndex];
  1650. this.motionIndex++;
  1651. (this.motionIndex === this.motions.length) && (this.motionIndex = 0);
  1652. });
  1653. };
  1654. ConnectControl.prototype.addButton = function (x, y, width, height, text, size, clickFun) {
  1655. var thiss = this;
  1656. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(null, function () {
  1657. var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", text));
  1658. changeActionButton.size(width, height);
  1659. changeActionButton.labelBold = true;
  1660. changeActionButton.labelSize = size;
  1661. changeActionButton.sizeGrid = "4,4,4,4";
  1662. changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1663. changeActionButton.pos(x, y);
  1664. changeActionButton.on(Laya.Event.CLICK, thiss, clickFun);
  1665. }));
  1666. };
  1667. /****************************************************** */
  1668. /**
  1669. * 数据绑定
  1670. */
  1671. ConnectControl.Connnect = function () {
  1672. this.ConnectFairygui();
  1673. this.ConnectComponent();
  1674. };
  1675. /**
  1676. * ui框架的绑定
  1677. */
  1678. ConnectControl.ConnectFairygui = function () {
  1679. fairygui.UIConfig.gameLoaderManager = ResourceControl_1.ResourceControl.Instance;
  1680. //特效绑定( url 绑定组名,只有公共特效需要绑定 ) "ui://fqpgxr1kl6mw0":"effect1"
  1681. fairygui.UIConfig.gameEffectDict = {};
  1682. };
  1683. return ConnectControl;
  1684. }(Laya.EventDispatcher));
  1685. exports.ConnectControl = ConnectControl;
  1686. },{"../Push/BaoKuanGameView":50,"../Push/CpaDownsView":52,"../Push/CpaItem":54,"../Push/ShiwantuijianView":56,"../utils/SkinItem":92,"./ResourceControl":28}],20:[function(require,module,exports){
  1687. "use strict";
  1688. Object.defineProperty(exports, "__esModule", { value: true });
  1689. var LocalDataControl_1 = require("./LocalDataControl");
  1690. var TimeUtils_1 = require("../Time/TimeUtils");
  1691. var UserDataInfo_1 = require("../Data/UserDataInfo");
  1692. var TimesTamper_1 = require("../Time/TimesTamper");
  1693. var DateControl = /** @class */ (function () {
  1694. function DateControl() {
  1695. DateControl.ins = this;
  1696. }
  1697. Object.defineProperty(DateControl, "Instance", {
  1698. get: function () {
  1699. if (DateControl.ins == null) {
  1700. return new DateControl();
  1701. }
  1702. return DateControl.ins;
  1703. },
  1704. enumerable: true,
  1705. configurable: true
  1706. });
  1707. /************************************************************** */
  1708. DateControl.prototype.loadUI = function () {
  1709. Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
  1710. var button = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "关闭HDR"));
  1711. button.size(200, 40);
  1712. button.labelBold = true;
  1713. button.labelSize = 30;
  1714. button.sizeGrid = "4,4,4,4";
  1715. button.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
  1716. button.pos(Laya.stage.width / 2 - button.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 60 * Laya.Browser.pixelRatio);
  1717. button.on(Laya.Event.CLICK, this, function () {
  1718. var enableHDR = this.camera.enableHDR;
  1719. if (enableHDR)
  1720. button.label = "开启HDR";
  1721. else
  1722. button.label = "关闭HDR";
  1723. this.camera.enableHDR = !enableHDR;
  1724. });
  1725. }));
  1726. };
  1727. /************************************************ */
  1728. DateControl.prototype.SetSelf = function () {
  1729. var lastday = LocalDataControl_1.LocalDataControl.Instance.getstr(UserDataInfo_1.UserDataInfo.lastDay);
  1730. var nowday = TimeUtils_1.TimeUtils.formatYearMonthDate1(TimesTamper_1.TimesTamper.Instance.serverTime);
  1731. if (lastday != nowday) {
  1732. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lastDay, nowday);
  1733. DateControl.Fresh = true;
  1734. }
  1735. else {
  1736. DateControl.Fresh = false;
  1737. }
  1738. };
  1739. return DateControl;
  1740. }());
  1741. exports.DateControl = DateControl;
  1742. },{"../Data/UserDataInfo":35,"../Time/TimeUtils":58,"../Time/TimesTamper":60,"./LocalDataControl":23}],21:[function(require,module,exports){
  1743. "use strict";
  1744. Object.defineProperty(exports, "__esModule", { value: true });
  1745. var JoystickModule_1 = require("../JoystickModule");
  1746. var DispatcherManager_1 = require("../utils/DispatcherManager");
  1747. var GameState_1 = require("../utils/GameState");
  1748. var SceneControl_1 = require("../Control/SceneControl");
  1749. var PropManager_1 = require("../PrefabControl/PropManager");
  1750. var TimerService_1 = require("../Time/TimerService");
  1751. var GameCFG_1 = require("../CFG/GameCFG");
  1752. var AudioControl_1 = require("../Control/AudioControl");
  1753. var Sdk_1 = require("../WXSDK/Sdk");
  1754. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  1755. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  1756. var AgencyTrial_1 = require("../Agency/AgencyTrial");
  1757. var AgencySkin_1 = require("../Agency/AgencySkin");
  1758. var RecordManager_1 = require("../WXSDK/RecordManager");
  1759. var GameStateControl = /** @class */ (function () {
  1760. function GameStateControl() {
  1761. /**
  1762. * 0:未开始,1:游戏中,2:暂停中
  1763. */
  1764. this.nowGameState = 0;
  1765. this._zhuanxiangbeishu = 0;
  1766. this._huadongSpeedX = 0;
  1767. this._huadongClimbSpeedX = 0;
  1768. this.endGamePlayerArr = [];
  1769. this._isneedShunyiX = false;
  1770. this._nowTime = 0;
  1771. this._lastAngle = 0;
  1772. this._time = 0;
  1773. this.nowMingCi = 0;
  1774. this._nums = 0;
  1775. this._all = 0;
  1776. GameStateControl.ins = this;
  1777. }
  1778. Object.defineProperty(GameStateControl, "Instance", {
  1779. get: function () {
  1780. if (GameStateControl.ins == null) {
  1781. return new GameStateControl();
  1782. }
  1783. return GameStateControl.ins;
  1784. },
  1785. enumerable: true,
  1786. configurable: true
  1787. });
  1788. GameStateControl.prototype.init = function () {
  1789. this._huadongSpeedX = Number(GameCFG_1.default.dict[4].value);
  1790. this._huadongClimbSpeedX = Number(GameCFG_1.default.dict[5].value);
  1791. if (GameCFG_1.default.dict[7]) {
  1792. this._zhuanxiangbeishu = Number(GameCFG_1.default.dict[7].value);
  1793. }
  1794. else {
  1795. this._zhuanxiangbeishu = 2;
  1796. }
  1797. this.initEvent();
  1798. };
  1799. GameStateControl.prototype.initEvent = function () {
  1800. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.lose, this, this.endGame);
  1801. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.end, this, this.endGame);
  1802. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.npcend, this, this.npcendGameHandler);
  1803. };
  1804. GameStateControl.prototype.npcendGameHandler = function (str) {
  1805. this.endGamePlayerArr.push(str);
  1806. };
  1807. GameStateControl.prototype.setClickPanel = function (panel) {
  1808. this._joystickModule = new JoystickModule_1.JoystickModule(panel);
  1809. this._joystickModule.setEventCallback(this, this.ondownfun, this.onmovefun, this.onupfun);
  1810. };
  1811. GameStateControl.prototype.ondownfun = function () {
  1812. this._lastAngle = 0;
  1813. this._nowTime = Laya.Browser.now() / 1000;
  1814. };
  1815. GameStateControl.prototype.onmovefun = function (offsetX) {
  1816. if (this.nowGameState == 1) {
  1817. var disAngle = this._joystickModule.angle - this._lastAngle;
  1818. this._lastAngle = this._joystickModule.angle;
  1819. if (PropManager_1.PropManager.iscarmanpc) {
  1820. PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, disAngle * this._zhuanxiangbeishu);
  1821. }
  1822. else {
  1823. SceneControl_1.SceneControl.Instance.PlayerScript.Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, offsetX > 0 ? this._huadongClimbSpeedX : -this._huadongClimbSpeedX, disAngle * this._zhuanxiangbeishu);
  1824. }
  1825. }
  1826. };
  1827. GameStateControl.prototype.onupfun = function () {
  1828. if (PropManager_1.PropManager.iscarmanpc) {
  1829. PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(0, 0);
  1830. }
  1831. else {
  1832. if (this.nowGameState == 1) {
  1833. SceneControl_1.SceneControl.Instance.PlayerScript.Joy(0, 0, 0);
  1834. }
  1835. }
  1836. };
  1837. GameStateControl.prototype.update = function (dt) {
  1838. if (this.nowGameState == 1) {
  1839. this._time = 0;
  1840. var npcdict = PropManager_1.PropManager.npcscriptDict;
  1841. this._nums = 0;
  1842. this._all = 0;
  1843. var s;
  1844. var npcsp;
  1845. for (s in npcdict) {
  1846. npcsp = npcdict[s];
  1847. if (npcsp.getAction() == 1) {
  1848. if (PropManager_1.PropManager.mainRole.transform.position.z < npcsp.getPostion().z) {
  1849. this._nums++;
  1850. }
  1851. this._all++;
  1852. }
  1853. }
  1854. this.nowMingCi = this.endGamePlayerArr.length + ((this._all + 1) - this._nums);
  1855. PropManager_1.PropManager.txt_mingci.text = "第" + this.nowMingCi + "名";
  1856. }
  1857. };
  1858. GameStateControl.prototype.startGame = function () {
  1859. var RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  1860. var agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
  1861. var nohasskinArr = agencyskin.GainNoHaveSkin();
  1862. if (nohasskinArr.length == 0) {
  1863. this.entergame();
  1864. }
  1865. else {
  1866. PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyTrial_1.AgencyTrial).openview(nohasskinArr);
  1867. }
  1868. };
  1869. GameStateControl.prototype.entergame = function (jiasu) {
  1870. RecordManager_1.RecordManager.Instance.RecordStart();
  1871. this.nowMingCi = 0;
  1872. this.endGamePlayerArr.length = 0;
  1873. this.nowGameState = 1;
  1874. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  1875. this.update(500);
  1876. if (jiasu) {
  1877. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start, jiasu);
  1878. }
  1879. else {
  1880. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start);
  1881. }
  1882. AudioControl_1.AudioControl.Instance.playbgSound("bgm");
  1883. Sdk_1.WxApi.recordAldEvent("主界面点击开始游戏...");
  1884. };
  1885. GameStateControl.prototype.stopGame = function () {
  1886. this.nowGameState = 2;
  1887. this.onupfun();
  1888. };
  1889. GameStateControl.prototype.endGame = function () {
  1890. if (PropManager_1.PropManager.jiantouArr && PropManager_1.PropManager.jiantouArr.length > 0) {
  1891. var arr = PropManager_1.PropManager.jiantouArr;
  1892. for (var i = arr.length - 1; i >= 0; i--) {
  1893. arr[i].destroy();
  1894. arr.splice(i, 1);
  1895. }
  1896. }
  1897. PropManager_1.PropManager.jiantouArr.length = 0;
  1898. this.nowGameState = 0;
  1899. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  1900. var npcdict = PropManager_1.PropManager.npcscriptDict;
  1901. if (npcdict) {
  1902. for (var s in npcdict) {
  1903. npcdict[s].stop();
  1904. }
  1905. }
  1906. this.onupfun();
  1907. AudioControl_1.AudioControl.Instance.stopbgSound();
  1908. };
  1909. return GameStateControl;
  1910. }());
  1911. exports.GameStateControl = GameStateControl;
  1912. },{"../Agency/AgencySkin":6,"../Agency/AgencyTrial":7,"../Agency/AgencyUserMessage":8,"../CFG/GameCFG":10,"../Control/AudioControl":18,"../Control/SceneControl":29,"../JoystickModule":43,"../PrefabControl/PanelResDic":48,"../PrefabControl/PropManager":49,"../Time/TimerService":59,"../WXSDK/RecordManager":76,"../WXSDK/Sdk":77,"../utils/DispatcherManager":85,"../utils/GameState":86}],22:[function(require,module,exports){
  1913. "use strict";
  1914. Object.defineProperty(exports, "__esModule", { value: true });
  1915. var Global_1 = require("../Global");
  1916. var LayOUT_1 = require("../utils/LayOUT");
  1917. /*
  1918. * name;
  1919. */
  1920. var LayoutControl = /** @class */ (function (_super) {
  1921. __extends(LayoutControl, _super);
  1922. function LayoutControl() {
  1923. var _this = _super.call(this) || this;
  1924. _this._uilayerZorder = 0;
  1925. _this._upuilayerZorder = 200;
  1926. _this._tipslayerZorder = 1000;
  1927. _this._guidelayerZorder = 600;
  1928. /**
  1929. * ui层
  1930. */
  1931. _this.uiLayer = new fairygui.GComponent();
  1932. /**
  1933. * 最定层
  1934. */
  1935. _this.topLayer = new fairygui.GComponent();
  1936. /**
  1937. * 背景层( 或者3D场景层 )
  1938. */
  1939. _this.background = new fairygui.GComponent();
  1940. _this._position = new Laya.Vector3();
  1941. _this._outPos = new Laya.Vector3();
  1942. _this.scaleDelta = 0;
  1943. LayoutControl.ins = _this;
  1944. return _this;
  1945. }
  1946. Object.defineProperty(LayoutControl, "Instance", {
  1947. get: function () {
  1948. if (LayoutControl.ins == null) {
  1949. return new LayoutControl();
  1950. }
  1951. return LayoutControl.ins;
  1952. },
  1953. enumerable: true,
  1954. configurable: true
  1955. });
  1956. LayoutControl.prototype.AddLayerByName = function (itemview, layer) {
  1957. if (layer == LayOUT_1.LayOUT.BG) {
  1958. LayoutControl.Instance.background.addChild(itemview);
  1959. }
  1960. else if (layer == LayOUT_1.LayOUT.UI) {
  1961. this._uilayerZorder++;
  1962. LayoutControl.Instance.uiLayer.addChild(itemview);
  1963. itemview.sortingOrder = this._uilayerZorder;
  1964. }
  1965. else if (layer == LayOUT_1.LayOUT.UITop) {
  1966. this._upuilayerZorder++;
  1967. LayoutControl.Instance.uiLayer.addChild(itemview);
  1968. itemview.sortingOrder = this._upuilayerZorder;
  1969. }
  1970. else if (layer == LayOUT_1.LayOUT.TIP) {
  1971. // GameLayerManager.Instance.tipsLayer.addChild(itemview);
  1972. this._tipslayerZorder++;
  1973. LayoutControl.Instance.uiLayer.addChild(itemview);
  1974. itemview.sortingOrder = this._tipslayerZorder;
  1975. }
  1976. else if (layer == LayOUT_1.LayOUT.GUIDE) {
  1977. this._guidelayerZorder++;
  1978. LayoutControl.Instance.uiLayer.addChild(itemview);
  1979. itemview.sortingOrder = this._guidelayerZorder;
  1980. }
  1981. };
  1982. //初始化层级
  1983. LayoutControl.prototype.initlayer = function () {
  1984. Global_1.Global.stage.addChild(fairygui.GRoot.inst.displayObject);
  1985. fairygui.GRoot.inst.addChild(this.background);
  1986. fairygui.GRoot.inst.addChild(this.uiLayer);
  1987. fairygui.GRoot.inst.addChild(this.topLayer);
  1988. };
  1989. LayoutControl.prototype.addHorizontalBox = function (x, y, z) {
  1990. var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh2));
  1991. box.meshRenderer.material = this.mat1;
  1992. box.meshRenderer.castShadow = true;
  1993. box.meshRenderer.receiveShadow = true;
  1994. this.tmpVector.setValue(x, y, z);
  1995. box.transform.position = this.tmpVector;
  1996. var rigidBody = box.addComponent(Laya.Rigidbody3D);
  1997. rigidBody.mass = 10;
  1998. rigidBody.friction = 1.0;
  1999. rigidBody.restitution = 0.2;
  2000. var boxShape = new Laya.BoxColliderShape(2, 0.33, 0.5);
  2001. rigidBody.colliderShape = boxShape;
  2002. };
  2003. /************************************************ */
  2004. LayoutControl.prototype.ClearLayerByName = function (layer) {
  2005. switch (layer) {
  2006. case LayOUT_1.LayOUT.UI:
  2007. this._uilayerZorder--;
  2008. if (this._uilayerZorder < 0) {
  2009. this._uilayerZorder = 0;
  2010. }
  2011. break;
  2012. case LayOUT_1.LayOUT.UITop:
  2013. this._upuilayerZorder--;
  2014. if (this._upuilayerZorder < 200) {
  2015. this._upuilayerZorder = 200;
  2016. }
  2017. break;
  2018. case LayOUT_1.LayOUT.TIP:
  2019. this._tipslayerZorder--;
  2020. if (this._tipslayerZorder < 1000) {
  2021. this._tipslayerZorder = 1000;
  2022. }
  2023. break;
  2024. case LayOUT_1.LayOUT.GUIDE:
  2025. this._tipslayerZorder--;
  2026. if (this._tipslayerZorder < 600) {
  2027. this._tipslayerZorder = 600;
  2028. }
  2029. break;
  2030. }
  2031. };
  2032. LayoutControl.prototype.onComplete = function () {
  2033. //加载三维地面
  2034. var grid = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/staticModel/grid/plane.lh"));
  2035. //加载二维猴子
  2036. this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
  2037. //开启定时器循环
  2038. Laya.timer.frameLoop(1, this, this.animate);
  2039. };
  2040. LayoutControl.prototype.animate = function () {
  2041. //变换位置
  2042. this._position.x = Math.sin(this.scaleDelta += 0.01);
  2043. //计算位置
  2044. this.camera.viewport.project(this._position, this.camera.projectionViewMatrix, this._outPos);
  2045. this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
  2046. };
  2047. return LayoutControl;
  2048. }(Laya.EventDispatcher));
  2049. exports.LayoutControl = LayoutControl;
  2050. },{"../Global":41,"../utils/LayOUT":90}],23:[function(require,module,exports){
  2051. "use strict";
  2052. Object.defineProperty(exports, "__esModule", { value: true });
  2053. var Global_1 = require("../Global");
  2054. var PlatfromType_1 = require("../WXSDK/PlatfromType");
  2055. /*
  2056. * 本地数据缓存管理器
  2057. */
  2058. var LocalDataControl = /** @class */ (function (_super) {
  2059. __extends(LocalDataControl, _super);
  2060. function LocalDataControl() {
  2061. var _this = _super.call(this) || this;
  2062. LocalDataControl.ins = _this;
  2063. return _this;
  2064. }
  2065. Object.defineProperty(LocalDataControl, "Instance", {
  2066. get: function () {
  2067. if (LocalDataControl.ins == null) {
  2068. return new LocalDataControl();
  2069. }
  2070. return LocalDataControl.ins;
  2071. },
  2072. enumerable: true,
  2073. configurable: true
  2074. });
  2075. LocalDataControl.prototype.init = function () {
  2076. };
  2077. /**
  2078. * 添加本地缓存数据 object
  2079. * @param key
  2080. * @param value
  2081. */
  2082. LocalDataControl.prototype.AddData = function (key, value) {
  2083. this.AddLocalData(key, value);
  2084. };
  2085. /**
  2086. * 获取本地缓存数据 object
  2087. * @param key
  2088. */
  2089. LocalDataControl.prototype.getObj = function (key) {
  2090. return this.GetLocalCaCheData(key);
  2091. };
  2092. /**
  2093. * 添加本地缓存数据 string
  2094. * @param key
  2095. * @param value
  2096. */
  2097. LocalDataControl.prototype.addstr = function (key, value) {
  2098. this.addCacheStr(key, value);
  2099. };
  2100. LocalDataControl.prototype.addnum = function (key, value) {
  2101. this.addCacheStr(key, value.toString());
  2102. };
  2103. /**
  2104. * 获取本地缓存数据 string
  2105. * @param key
  2106. */
  2107. LocalDataControl.prototype.getstr = function (key) {
  2108. return this.getCachestr(key);
  2109. };
  2110. /**
  2111. * 获取本地缓存数据 number
  2112. * @param key
  2113. */
  2114. LocalDataControl.prototype.getnum = function (key) {
  2115. return Number(this.getCachestr(key));
  2116. };
  2117. /**
  2118. * 清理指定本地缓存数据
  2119. * @param key
  2120. */
  2121. LocalDataControl.prototype.removeCache = function (key) {
  2122. this.removeselectCache(key);
  2123. };
  2124. /**
  2125. * 清理所有本地缓存数据
  2126. */
  2127. LocalDataControl.prototype.clearAll = function () {
  2128. this.clearAllCache();
  2129. };
  2130. LocalDataControl.prototype.AddLocalData = function (key, value) {
  2131. switch (Global_1.Global.nowplatfrom) {
  2132. case PlatfromType_1.PlatfromType.wx:
  2133. this.setStorageSyncWX(key, value);
  2134. break;
  2135. default:
  2136. Laya.LocalStorage.setJSON(key, value);
  2137. break;
  2138. }
  2139. };
  2140. LocalDataControl.prototype.GetLocalCaCheData = function (key) {
  2141. var obj;
  2142. switch (Global_1.Global.nowplatfrom) {
  2143. case PlatfromType_1.PlatfromType.wx:
  2144. obj = this.getStorageSyncWX(key);
  2145. break;
  2146. default:
  2147. obj = Laya.LocalStorage.getJSON(key);
  2148. break;
  2149. }
  2150. if (!obj) {
  2151. obj = {};
  2152. }
  2153. return obj;
  2154. };
  2155. LocalDataControl.prototype.addCacheStr = function (key, value) {
  2156. switch (Global_1.Global.nowplatfrom) {
  2157. case PlatfromType_1.PlatfromType.wx:
  2158. this.setStorageSyncWX(key, value);
  2159. break;
  2160. default:
  2161. Laya.LocalStorage.setItem(key, value);
  2162. break;
  2163. }
  2164. };
  2165. LocalDataControl.prototype.getCachestr = function (key) {
  2166. var str = "0";
  2167. switch (Global_1.Global.nowplatfrom) {
  2168. case PlatfromType_1.PlatfromType.wx:
  2169. str = this.getStorageSyncWX(key);
  2170. break;
  2171. default:
  2172. str = Laya.LocalStorage.getItem(key);
  2173. break;
  2174. }
  2175. if (str == null || str == "") {
  2176. str = "0";
  2177. }
  2178. return str;
  2179. };
  2180. LocalDataControl.prototype.removeselectCache = function (key) {
  2181. switch (Global_1.Global.nowplatfrom) {
  2182. case PlatfromType_1.PlatfromType.wx:
  2183. this.removeStorageWX(key);
  2184. break;
  2185. default:
  2186. Laya.LocalStorage.removeItem(key);
  2187. break;
  2188. }
  2189. };
  2190. LocalDataControl.prototype.clearAllCache = function () {
  2191. switch (Global_1.Global.nowplatfrom) {
  2192. case PlatfromType_1.PlatfromType.wx:
  2193. this.clearStorageWX();
  2194. break;
  2195. default:
  2196. Laya.LocalStorage.clear();
  2197. break;
  2198. }
  2199. };
  2200. /**
  2201. * 本地存储
  2202. * @param key
  2203. * @param data
  2204. */
  2205. LocalDataControl.prototype.setStorageSyncWX = function (key, data) {
  2206. var wx = Laya.Browser.window.wx;
  2207. if (wx) {
  2208. wx.setStorageSync(key, data);
  2209. }
  2210. };
  2211. /**
  2212. * 获取本地存储
  2213. * @param key
  2214. */
  2215. LocalDataControl.prototype.getStorageSyncWX = function (key) {
  2216. var wx = Laya.Browser.window.wx;
  2217. if (wx) {
  2218. return wx.getStorageSync(key);
  2219. }
  2220. return null;
  2221. };
  2222. /**
  2223. * 从本地缓存中移除指定 key
  2224. * @param key
  2225. */
  2226. LocalDataControl.prototype.removeStorageWX = function (key) {
  2227. if (Laya.Browser.window.wx) {
  2228. Laya.Browser.window.wx.removeStorage(key);
  2229. }
  2230. };
  2231. /**
  2232. * 清理存储数据
  2233. */
  2234. LocalDataControl.prototype.clearStorageWX = function () {
  2235. if (Laya.Browser.window.wx) {
  2236. Laya.Browser.window.wx.clearStorageSync();
  2237. }
  2238. };
  2239. return LocalDataControl;
  2240. }(Laya.EventDispatcher));
  2241. exports.LocalDataControl = LocalDataControl;
  2242. },{"../Global":41,"../WXSDK/PlatfromType":74}],24:[function(require,module,exports){
  2243. "use strict";
  2244. Object.defineProperty(exports, "__esModule", { value: true });
  2245. var ResDataControl_1 = require("../Control/ResDataControl");
  2246. var ResourceControl_1 = require("../Control/ResourceControl");
  2247. var DispatcherManager_1 = require("../utils/DispatcherManager");
  2248. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  2249. var ViewAction_1 = require("../utils/ViewAction");
  2250. var ViewManager_1 = require("../View/ViewManager");
  2251. var ComponentEventData_1 = require("../Data/ComponentEventData");
  2252. var GamePool_1 = require("../PrefabControl/GamePool");
  2253. /*
  2254. * name;
  2255. */
  2256. var PanelBaseControl = /** @class */ (function (_super) {
  2257. __extends(PanelBaseControl, _super);
  2258. /**
  2259. * 界面初始化
  2260. * @param pkgName 包名
  2261. * @param resName 界面名
  2262. * @param isAddpackage 是否添加包
  2263. * @param ActionType 界面打开动画类型
  2264. * @param clickBgIsColse 黑色背景 0:无背景 1:背景无关闭事件 2:背景有关闭事件
  2265. * @param iscache 是否添加到缓存池(如是为true,则加入进缓存池定时根据是否引用清理。 若是为false,则不清理当前缓存,如若清理,请手动清理 )
  2266. */
  2267. function PanelBaseControl(pkgName, resName, isAddpackage, ActionType, clickBgIsColse, iscache) {
  2268. if (pkgName === void 0) { pkgName = ""; }
  2269. if (resName === void 0) { resName = ""; }
  2270. if (isAddpackage === void 0) { isAddpackage = false; }
  2271. if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
  2272. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  2273. if (iscache === void 0) { iscache = true; }
  2274. var _this = _super.call(this) || this;
  2275. _this.isguideing = false;
  2276. _this.PackageName = "";
  2277. _this.ResourcesName = "";
  2278. _this._iscache = true;
  2279. _this._ActionType = ViewAction_1.ViewAction.ActionType_none;
  2280. _this._clickBgIsColse = 0;
  2281. /**
  2282. * 事件容器
  2283. */
  2284. _this.EventResDic = {};
  2285. /**
  2286. * 全局事件容器
  2287. */
  2288. _this.EventGlobal = {};
  2289. _this._iscache = iscache;
  2290. _this.PackageName = pkgName;
  2291. _this.ResourcesName = resName;
  2292. _this._isAddpackage = isAddpackage;
  2293. _this._ActionType = ActionType;
  2294. _this._clickBgIsColse = clickBgIsColse;
  2295. _this.showModalWait();
  2296. return _this;
  2297. }
  2298. PanelBaseControl.prototype.ResolveUI = function (pkgname, resname, isaddpackage, ActionType, clickBgIsColse, iscache) {
  2299. if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
  2300. if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
  2301. if (iscache === void 0) { iscache = true; }
  2302. this.PackageName = pkgname;
  2303. this.ResourcesName = resname;
  2304. this._ActionType = ActionType;
  2305. this._clickBgIsColse = clickBgIsColse;
  2306. ResDataControl_1.ResDataControl.Instance.AddViewPackByName(pkgname, isaddpackage, iscache);
  2307. this.contentPane = fairygui.UIPackage.createObject(pkgname, resname).asCom;
  2308. for (var str in this.contentPane._children) {
  2309. var item = this.contentPane._children[str];
  2310. if (item.name == "item_panel") {
  2311. var itempanel = item;
  2312. if (itempanel) {
  2313. for (var str1 in itempanel._children) {
  2314. var itempanelItem = itempanel._children[str1];
  2315. this[itempanelItem.name] = itempanelItem;
  2316. }
  2317. }
  2318. // this[item.name] = item;
  2319. this.item_panel = item;
  2320. }
  2321. else {
  2322. this[item.name] = item;
  2323. }
  2324. }
  2325. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  2326. this.contentPane.setPivot(0.5, 0.5);
  2327. this.setPivot(0.5, 0.5);
  2328. this.setclickBgIsColse();
  2329. this.initView();
  2330. this.initEvent();
  2331. this.ShowViewACTION();
  2332. };
  2333. /**
  2334. * 加载ui
  2335. * @param groupName 组名
  2336. * @param target 作用域
  2337. * @param onLoadedHandler 加载完成回调函数
  2338. */
  2339. PanelBaseControl.prototype.LoadViewUI = function (groupName, target, onLoadedHandler) {
  2340. this._loadTarget = target;
  2341. this._onLoadedHandler = onLoadedHandler;
  2342. ResourceControl_1.ResourceControl.Instance.loadGroup(groupName, this, this.LoadComplete);
  2343. };
  2344. /******************************************************************* */
  2345. PanelBaseControl.prototype.createLabel = function (color, strokeColor) {
  2346. var STROKE_WIDTH = 4;
  2347. var label = new Laya.Label();
  2348. label.font = "Microsoft YaHei";
  2349. label.text = "SAMPLE DEMO";
  2350. label.fontSize = 30;
  2351. label.color = color;
  2352. if (strokeColor) {
  2353. label.stroke = STROKE_WIDTH;
  2354. label.strokeColor = strokeColor;
  2355. }
  2356. Laya.stage.addChild(label);
  2357. return label;
  2358. };
  2359. /****************************************************************** */
  2360. /**
  2361. * 加载资源数组
  2362. * @param urls 资源数组
  2363. * @param target 作用域
  2364. * @param onLoadedHandler 加载完成回调函数
  2365. */
  2366. PanelBaseControl.prototype.loadUibyArr = function (urls, target, onLoadedHandler) {
  2367. // this.showModalWait();
  2368. this._loadTarget = target;
  2369. this._onLoadedHandler = onLoadedHandler;
  2370. ResourceControl_1.ResourceControl.Instance.Loaders(urls, this, this.LoadComplete);
  2371. };
  2372. /********************************************************************* */
  2373. PanelBaseControl.prototype.createRadioGroup = function (skin) {
  2374. var rg = new Laya.RadioGroup();
  2375. rg.skin = skin;
  2376. rg.space = 70;
  2377. rg.direction = "v";
  2378. rg.labels = "Item1, Item2, Item3";
  2379. rg.labelColors = "#787878,#d3d3d3,#FFFFFF";
  2380. rg.labelSize = 20;
  2381. rg.labelBold = true;
  2382. rg.labelPadding = "5,0,0,5";
  2383. rg.selectHandler = new Laya.Handler(this, this.onSelectChange);
  2384. Laya.stage.addChild(rg);
  2385. return rg;
  2386. };
  2387. PanelBaseControl.prototype.onSelectChange = function (index) {
  2388. console.log("你选择了第 " + (index + 1) + " 项");
  2389. };
  2390. /********************************************************************* */
  2391. PanelBaseControl.prototype.LoadComplete = function () {
  2392. if (this._loadTarget && this._onLoadedHandler) {
  2393. this._onLoadedHandler.call(this._loadTarget);
  2394. }
  2395. };
  2396. PanelBaseControl.prototype.removeEffectPackage = function (packageName) {
  2397. ResDataControl_1.ResDataControl.Instance.ClearPackByName(packageName, true);
  2398. };
  2399. PanelBaseControl.prototype.getpanelController = function (name) {
  2400. if (this.item_panel) {
  2401. return this.item_panel.getController(name);
  2402. }
  2403. return null;
  2404. };
  2405. /************************************************************ */
  2406. PanelBaseControl.prototype.setup = function () {
  2407. this.createLabel("#FFFFFF", null).pos(30, 50);
  2408. this.createLabel("#00FFFF", null).pos(290, 50);
  2409. this.createLabel("#FFFF00", "#FFFFFF").pos(30, 100);
  2410. this.createLabel("#000000", "#FFFFFF").pos(290, 100);
  2411. this.createLabel("#FFFFFF", "#00FFFF").pos(30, 150);
  2412. this.createLabel("#0080FF", "#00FFFF").pos(290, 150);
  2413. };
  2414. /************************************************************ */
  2415. PanelBaseControl.prototype.getpanelTransition = function (name) {
  2416. if (this.item_panel) {
  2417. return this.item_panel.getTransition(name);
  2418. }
  2419. return null;
  2420. };
  2421. PanelBaseControl.prototype.getChildformContentPanel = function (name) {
  2422. if (this.contentPane) {
  2423. return this.contentPane.getChild(name);
  2424. }
  2425. return null;
  2426. };
  2427. /*界面初始化*/
  2428. PanelBaseControl.prototype.onInit = function () {
  2429. _super.prototype.onInit.call(this);
  2430. if (this.PackageName != "" && this.ResourcesName != "") {
  2431. this.ResolveUI(this.PackageName, this.ResourcesName, this._isAddpackage, this._ActionType, this._clickBgIsColse, this._iscache);
  2432. }
  2433. };
  2434. //解析ui
  2435. PanelBaseControl.prototype.initView = function () {
  2436. };
  2437. PanelBaseControl.prototype.initEvent = function () {
  2438. };
  2439. PanelBaseControl.prototype.ShowViewACTION = function () {
  2440. switch (this._ActionType) {
  2441. case ViewAction_1.ViewAction.ActionType_none:
  2442. this.windowanmoend();
  2443. break;
  2444. case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
  2445. this.contentPane.x = fairygui.GRoot.inst.width;
  2446. Laya.Tween.to(this.contentPane, { x: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2447. break;
  2448. case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
  2449. this.contentPane.y = fairygui.GRoot.inst.height;
  2450. Laya.Tween.to(this.contentPane, { y: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2451. break;
  2452. case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
  2453. this.contentPane.scaleX = this.contentPane.scaleY = 0.01;
  2454. Laya.Tween.to(this.contentPane, { scaleX: 1, scaleY: 1 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
  2455. break;
  2456. }
  2457. };
  2458. /******************************************************** */
  2459. PanelBaseControl.prototype.createCheckBox = function (skin) {
  2460. var cb = new Laya.CheckBox(skin);
  2461. Laya.stage.addChild(cb);
  2462. cb.labelColors = "white";
  2463. cb.labelSize = 20;
  2464. cb.labelFont = "Microsoft YaHei";
  2465. cb.labelPadding = "3,0,0,5";
  2466. return cb;
  2467. };
  2468. PanelBaseControl.prototype.updateLabel = function (checkBox) {
  2469. checkBox.label = checkBox.selected ? "已选中" : "未选中";
  2470. };
  2471. /******************************************************** */
  2472. PanelBaseControl.prototype.windowanmoend = function () {
  2473. Laya.timer.callLater(this, this.onShowView);
  2474. };
  2475. PanelBaseControl.prototype.onShowView = function () {
  2476. this.closeModalWait();
  2477. this.showClickBg();
  2478. };
  2479. PanelBaseControl.prototype.showClickBg = function () {
  2480. if (this._clickBg) {
  2481. this._clickBg.alpha = 0.55;
  2482. if (this._clickBgIsColse == 2 && !this.hasClickListener()) {
  2483. this._clickBg.onClick(this, this.ClickExitView);
  2484. }
  2485. }
  2486. };
  2487. /**点击关闭页面按钮 */
  2488. PanelBaseControl.prototype.ClickExitView = function () {
  2489. ViewManager_1.ViewManager.Instance.close(this.viewKey, true);
  2490. };
  2491. /*获取管理数据模块*/
  2492. PanelBaseControl.prototype.getProxy = function (d) {
  2493. return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
  2494. };
  2495. /**
  2496. * 界面关闭事件
  2497. */
  2498. PanelBaseControl.prototype.ExitView = function (ActionType) {
  2499. if (ActionType === void 0) { ActionType = ""; }
  2500. if (this._clickBg) {
  2501. this._clickBg.visible = false;
  2502. }
  2503. if (ActionType == "") {
  2504. switch (this._ActionType) {
  2505. case ViewAction_1.ViewAction.ActionType_none:
  2506. this.destory();
  2507. break;
  2508. case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
  2509. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2510. break;
  2511. case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
  2512. Laya.Tween.to(this, { y: fairygui.GRoot.inst.height }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2513. break;
  2514. case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
  2515. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2516. break;
  2517. }
  2518. }
  2519. else {
  2520. switch (ActionType) {
  2521. case ViewAction_1.ViewAction.ActionType_none:
  2522. this.destory();
  2523. break;
  2524. case ViewAction_1.ViewAction.ActionType_removescaleMaxToMin:
  2525. Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2526. break;
  2527. case ViewAction_1.ViewAction.ActionType_removemoveToRight:
  2528. Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
  2529. break;
  2530. }
  2531. }
  2532. };
  2533. PanelBaseControl.prototype.getTransitionByName = function (id) {
  2534. return this.contentPane.getTransition(id);
  2535. };
  2536. /**注册事件 */
  2537. PanelBaseControl.prototype.dispacheDatatrigger = function (type, data) {
  2538. if (data === void 0) { data = null; }
  2539. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  2540. };
  2541. /**
  2542. * 注册全局事件
  2543. * @param type
  2544. * @param thisObject
  2545. * @param listener
  2546. */
  2547. PanelBaseControl.prototype.addDataEvent = function (type, thisObject, listener) {
  2548. if (!this.EventGlobal.hasOwnProperty(type)) {
  2549. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2550. this.EventGlobal[type] = vo;
  2551. vo.type = type;
  2552. vo.thisObject = thisObject;
  2553. vo.listener = listener;
  2554. DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
  2555. }
  2556. };
  2557. /**
  2558. * 移除全局事件
  2559. * @param type
  2560. * @param thisObject
  2561. * @param listener
  2562. */
  2563. PanelBaseControl.prototype.ClearEventData = function (type, thisObject, listener) {
  2564. if (this.EventGlobal[type]) {
  2565. var vo = this.EventGlobal[type];
  2566. DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
  2567. vo.clear();
  2568. delete this.EventGlobal[type];
  2569. }
  2570. };
  2571. /**
  2572. * 移除组件事件
  2573. * @param type 时间类型
  2574. * @param callbackobj 作用域
  2575. * @param callbackHandler 事件回调
  2576. */
  2577. PanelBaseControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
  2578. if (target && this.EventResDic[target.name]) {
  2579. var arr = this.EventResDic[target.name];
  2580. var i = 0;
  2581. var nums = arr.length;
  2582. var vo;
  2583. for (i; i < nums; i++) {
  2584. vo = arr[i];
  2585. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  2586. target.off(type, thisObject, listener);
  2587. vo.clear();
  2588. arr.splice(i, 1);
  2589. break;
  2590. }
  2591. }
  2592. }
  2593. };
  2594. /**
  2595. * 注册组件事件,调用此方法,界面关闭会自动移除
  2596. * @param type 时间类型
  2597. * @param callbackobj 作用域
  2598. * @param callbackHandler 事件回调
  2599. */
  2600. PanelBaseControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
  2601. if (args === void 0) { args = null; }
  2602. if (target) {
  2603. if (target.name == null || target.name == "") {
  2604. throw "baseview addListener target.name is null";
  2605. }
  2606. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2607. vo.target = target;
  2608. vo.type = type;
  2609. vo.thisObject = thisObject;
  2610. vo.listener = listener;
  2611. if (!this.EventResDic.hasOwnProperty(target.name)) {
  2612. this.EventResDic[target.name] = [];
  2613. }
  2614. var bo = this.JudgeIsHaveEvent(target, type);
  2615. if (!bo) {
  2616. target.on(type, thisObject, listener, args);
  2617. this.EventResDic[target.name].push(vo);
  2618. }
  2619. }
  2620. };
  2621. /**判断是否含有事件 */
  2622. PanelBaseControl.prototype.JudgeIsHaveEvent = function (target, type) {
  2623. var eventArr;
  2624. eventArr = this.EventResDic[target.name];
  2625. var childvo;
  2626. for (var s in eventArr) {
  2627. childvo = eventArr[s];
  2628. if (childvo && childvo.type == type) {
  2629. return true;
  2630. }
  2631. }
  2632. return false;
  2633. };
  2634. PanelBaseControl.prototype.getComById = function (id) {
  2635. return this.contentPane.getChild(id).asCom;
  2636. };
  2637. PanelBaseControl.prototype.getControllerByBame = function (id) {
  2638. return this.contentPane.getController(id);
  2639. };
  2640. /**
  2641. * 移除所有组件事件
  2642. */
  2643. PanelBaseControl.prototype.ClearEvent = function () {
  2644. if (this.EventResDic) {
  2645. var s;
  2646. var dict = this.EventResDic;
  2647. var arr;
  2648. var i;
  2649. var nums = 0;
  2650. var vo;
  2651. for (s in dict) {
  2652. arr = dict[s];
  2653. if (arr && arr.length > 0) {
  2654. i = 0;
  2655. nums = arr.length;
  2656. for (i = nums - 1; i >= 0; i--) {
  2657. vo = arr[i];
  2658. if (vo) {
  2659. if (vo.target) {
  2660. vo.target.off(vo.type, vo.thisObject, vo.listener);
  2661. }
  2662. vo.clear();
  2663. }
  2664. arr.splice(i, 1);
  2665. }
  2666. }
  2667. delete this.EventResDic[s];
  2668. }
  2669. }
  2670. this.EventResDic = {};
  2671. };
  2672. PanelBaseControl.prototype.clearEvent = function () {
  2673. };
  2674. /* 销毁*/
  2675. PanelBaseControl.prototype.destory = function () {
  2676. this.clearEvent();
  2677. this.closeModalWait();
  2678. this.ClearGlobalEvent();
  2679. this.ClearEvent();
  2680. this._loadTarget = null;
  2681. this._onLoadedHandler = null;
  2682. Laya.Tween.clearTween(this);
  2683. ResDataControl_1.ResDataControl.Instance.ClearPackByName(this.PackageName, false);
  2684. this.PackageName = null;
  2685. this.ResourcesName = null;
  2686. if (this._clickBg) {
  2687. this._clickBg.offClick(this, this.ClickExitView);
  2688. this._clickBg.dispose();
  2689. this._clickBg = null;
  2690. }
  2691. this.viewKey = null;
  2692. this.dispose();
  2693. };
  2694. PanelBaseControl.prototype.setclickBgIsColse = function () {
  2695. if (this.isShowing && this._clickBgIsColse > 0 && this.contentPane) {
  2696. if (!this._clickBg && PanelBaseControl.viewbgUrl != "") {
  2697. this._clickBg = new fairygui.GLoader();
  2698. this._clickBg.touchable = true;
  2699. this._clickBg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  2700. this._clickBg.url = PanelBaseControl.viewbgUrl;
  2701. this._clickBg.fill = fairygui.LoaderFillType.ScaleFree;
  2702. this._clickBg.alpha = 0;
  2703. this.contentPane.addChildAt(this._clickBg, 0);
  2704. }
  2705. }
  2706. };
  2707. /**
  2708. * 移除所有全局事件
  2709. */
  2710. PanelBaseControl.prototype.ClearGlobalEvent = function () {
  2711. if (this.EventGlobal) {
  2712. var s;
  2713. var dict = this.EventGlobal;
  2714. for (s in dict) {
  2715. var vo = dict[s];
  2716. if (vo) {
  2717. this.ClearEventData(vo.type, vo.thisObject, vo.listener);
  2718. }
  2719. }
  2720. }
  2721. this.EventGlobal = {};
  2722. };
  2723. PanelBaseControl.viewbgUrl = "";
  2724. return PanelBaseControl;
  2725. }(fairygui.Window));
  2726. exports.PanelBaseControl = PanelBaseControl;
  2727. },{"../Control/ResDataControl":27,"../Control/ResourceControl":28,"../Data/ComponentEventData":30,"../PrefabControl/GamePool":47,"../PrefabControl/PanelResDic":48,"../View/ViewManager":70,"../utils/DispatcherManager":85,"../utils/ViewAction":93}],25:[function(require,module,exports){
  2728. "use strict";
  2729. Object.defineProperty(exports, "__esModule", { value: true });
  2730. var DispatcherManager_1 = require("../utils/DispatcherManager");
  2731. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  2732. var ComponentEventData_1 = require("../Data/ComponentEventData");
  2733. var GamePool_1 = require("../PrefabControl/GamePool");
  2734. var PanelChildControl = /** @class */ (function (_super) {
  2735. __extends(PanelChildControl, _super);
  2736. function PanelChildControl() {
  2737. var _this = _super.call(this) || this;
  2738. /**
  2739. * 事件容器
  2740. */
  2741. _this.EventResDic = {};
  2742. /**
  2743. * 全局事件容器
  2744. */
  2745. _this.EventGlobal = {};
  2746. /******************************************** */
  2747. _this.DIALOG_WIDTH = 220;
  2748. _this.DIALOG_HEIGHT = 275;
  2749. _this.CLOSE_BTN_WIDTH = 43;
  2750. _this.CLOSE_BTN_PADDING = 5;
  2751. return _this;
  2752. }
  2753. /**
  2754. * 移除所有组件事件
  2755. */
  2756. PanelChildControl.prototype.ClearEvent = function () {
  2757. if (this.EventResDic) {
  2758. var s;
  2759. var dict = this.EventResDic;
  2760. var arr;
  2761. var i;
  2762. var nums = 0;
  2763. var vo;
  2764. for (s in dict) {
  2765. arr = dict[s];
  2766. if (arr && arr.length > 0) {
  2767. i = 0;
  2768. nums = arr.length;
  2769. for (i = nums - 1; i >= 0; i--) {
  2770. vo = arr[i];
  2771. if (vo) {
  2772. if (vo.target) {
  2773. vo.target.off(vo.type, vo.thisObject, vo.listener);
  2774. }
  2775. vo.clear();
  2776. }
  2777. arr.splice(i, 1);
  2778. }
  2779. }
  2780. delete this.EventResDic[s];
  2781. }
  2782. }
  2783. this.EventResDic = {};
  2784. };
  2785. PanelChildControl.prototype.dispose = function () {
  2786. this.ClearGlobalEvent();
  2787. this.ClearEvent();
  2788. _super.prototype.dispose.call(this);
  2789. };
  2790. PanelChildControl.prototype.constructFromXML = function (xml) {
  2791. _super.prototype.constructFromXML.call(this, xml);
  2792. for (var str in this._children) {
  2793. var item = this._children[str];
  2794. this[item.name] = item;
  2795. }
  2796. this.onInit();
  2797. };
  2798. PanelChildControl.prototype.onInit = function () {
  2799. };
  2800. /*获取管理数据模块*/
  2801. PanelChildControl.prototype.getProxy = function (d) {
  2802. return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
  2803. };
  2804. PanelChildControl.prototype.dispacheDatatrigger = function (type, data) {
  2805. if (data === void 0) { data = null; }
  2806. DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
  2807. };
  2808. PanelChildControl.prototype.hasDataEvent = function (type) {
  2809. return DispatcherManager_1.DispatcherManager.hasEventListener(type);
  2810. };
  2811. /**
  2812. * 注册全局事件
  2813. * @param type
  2814. * @param thisObject
  2815. * @param listener
  2816. */
  2817. PanelChildControl.prototype.AddEventData = function (type, thisObject, listener) {
  2818. if (!this.EventGlobal.hasOwnProperty(type)) {
  2819. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2820. this.EventGlobal[type] = vo;
  2821. vo.type = type;
  2822. vo.thisObject = thisObject;
  2823. vo.listener = listener;
  2824. DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
  2825. }
  2826. };
  2827. PanelChildControl.prototype.onSkinLoadComplete = function () {
  2828. var dialog = new Laya.Dialog();
  2829. var bg = new Laya.Image(this.assets[0]);
  2830. dialog.addChild(bg);
  2831. var button = new Laya.Button(this.assets[1]);
  2832. // button.name = Dialog.CLOSE;
  2833. button.pos(this.DIALOG_WIDTH - this.CLOSE_BTN_WIDTH - this.CLOSE_BTN_PADDING, this.CLOSE_BTN_PADDING);
  2834. dialog.addChild(button);
  2835. dialog.dragArea = "0,0," + this.DIALOG_WIDTH + "," + this.DIALOG_HEIGHT;
  2836. dialog.show();
  2837. };
  2838. /******************************************** */
  2839. /**
  2840. * 移除全局事件
  2841. * @param type
  2842. * @param thisObject
  2843. * @param listener
  2844. */
  2845. PanelChildControl.prototype.removeDataEvent = function (type, thisObject, listener) {
  2846. if (this.EventGlobal[type]) {
  2847. var vo = this.EventGlobal[type];
  2848. DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
  2849. vo.clear();
  2850. delete this.EventGlobal[type];
  2851. }
  2852. };
  2853. /**
  2854. * 注册组件事件,调用此方法,界面关闭会自动移除
  2855. * @param type 时间类型
  2856. * @param callbackobj 作用域
  2857. * @param callbackHandler 事件回调
  2858. */
  2859. PanelChildControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
  2860. if (args === void 0) { args = null; }
  2861. if (target) {
  2862. if (target.name == null || target.name == "") {
  2863. throw "childbaseview addListener target.name is null";
  2864. }
  2865. var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
  2866. vo.target = target;
  2867. vo.type = type;
  2868. vo.thisObject = thisObject;
  2869. vo.listener = listener;
  2870. if (!this.EventResDic.hasOwnProperty(target.name)) {
  2871. this.EventResDic[target.name] = [];
  2872. }
  2873. var bo = this.JudgeIsHaveEvent(target, type);
  2874. if (!bo) {
  2875. target.on(type, thisObject, listener, args);
  2876. this.EventResDic[target.name].push(vo);
  2877. }
  2878. }
  2879. };
  2880. PanelChildControl.prototype.JudgeIsHaveEvent = function (target, type) {
  2881. var eventArr;
  2882. eventArr = this.EventResDic[target.name];
  2883. var childvo;
  2884. for (var s in eventArr) {
  2885. childvo = eventArr[s];
  2886. if (childvo && childvo.type == type) {
  2887. return true;
  2888. }
  2889. }
  2890. return false;
  2891. };
  2892. /**
  2893. * 移除组件事件
  2894. * @param type 时间类型
  2895. * @param callbackobj 作用域
  2896. * @param callbackHandler 事件回调
  2897. */
  2898. PanelChildControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
  2899. if (target && this.EventResDic[target.name]) {
  2900. var arr = this.EventResDic[target.name];
  2901. var i = 0;
  2902. var nums = arr.length;
  2903. var vo;
  2904. for (i; i < nums; i++) {
  2905. vo = arr[i];
  2906. if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
  2907. target.off(type, thisObject, listener);
  2908. vo.clear();
  2909. arr.splice(i, 1);
  2910. break;
  2911. }
  2912. }
  2913. }
  2914. };
  2915. /**
  2916. * 移除所有全局事件
  2917. */
  2918. PanelChildControl.prototype.ClearGlobalEvent = function () {
  2919. if (this.EventGlobal) {
  2920. var s;
  2921. var dict = this.EventGlobal;
  2922. for (s in dict) {
  2923. var vo = dict[s];
  2924. if (vo) {
  2925. this.removeDataEvent(vo.type, vo.thisObject, vo.listener);
  2926. }
  2927. }
  2928. }
  2929. this.EventGlobal = {};
  2930. };
  2931. /***************************************************** */
  2932. PanelChildControl.prototype.placeHScroller = function () {
  2933. var hs = new Laya.HScrollBar();
  2934. hs.skin = "res/ui/hscroll.png";
  2935. hs.width = 300;
  2936. hs.pos(50, 170);
  2937. hs.min = 0;
  2938. hs.max = 100;
  2939. hs.changeHandler = new Laya.Handler(this, this.onChange);
  2940. Laya.stage.addChild(hs);
  2941. };
  2942. PanelChildControl.prototype.placeVScroller = function () {
  2943. var vs = new Laya.VScrollBar();
  2944. vs.skin = "res/ui/vscroll.png";
  2945. vs.height = 300;
  2946. vs.pos(400, 50);
  2947. vs.min = 0;
  2948. vs.max = 100;
  2949. vs.changeHandler = new Laya.Handler(this, this.onChange);
  2950. Laya.stage.addChild(vs);
  2951. };
  2952. PanelChildControl.prototype.onChange = function (value) {
  2953. console.log("滚动条的位置: value=" + value);
  2954. };
  2955. return PanelChildControl;
  2956. }(fairygui.GComponent));
  2957. exports.PanelChildControl = PanelChildControl;
  2958. },{"../Data/ComponentEventData":30,"../PrefabControl/GamePool":47,"../PrefabControl/PanelResDic":48,"../utils/DispatcherManager":85}],26:[function(require,module,exports){
  2959. "use strict";
  2960. Object.defineProperty(exports, "__esModule", { value: true });
  2961. var PoolManager = /** @class */ (function () {
  2962. function PoolManager() {
  2963. PoolManager.PoolManagerInstance = this;
  2964. }
  2965. Object.defineProperty(PoolManager, "Instance", {
  2966. get: function () {
  2967. if (PoolManager.PoolManagerInstance) {
  2968. return PoolManager.PoolManagerInstance;
  2969. }
  2970. else {
  2971. var instance = new PoolManager();
  2972. return instance;
  2973. }
  2974. },
  2975. enumerable: true,
  2976. configurable: true
  2977. });
  2978. PoolManager.GetSprite3D = function (_obj) {
  2979. var objName = _obj.name;
  2980. if (this.Sprite3DDic[objName] != null && this.Sprite3DDic[objName] != undefined) {
  2981. if (this.Sprite3DDic[objName].length > 0) {
  2982. var obj = this.Sprite3DDic[objName][0];
  2983. if (!obj || obj.destroyed)
  2984. obj = Laya.Sprite3D.instantiate(_obj);
  2985. this.Sprite3DDic[objName].splice(0, 1);
  2986. // obj.transform.position = _obj.transform.position.clone();
  2987. // obj.transform.rotation = _obj.transform.rotation.clone();
  2988. obj.transform.scale = _obj.transform.scale.clone();
  2989. obj.active = true;
  2990. return obj;
  2991. }
  2992. else {
  2993. var newobj = Laya.Sprite3D.instantiate(_obj);
  2994. newobj.active = true;
  2995. return newobj;
  2996. }
  2997. }
  2998. else {
  2999. var newobj = Laya.Sprite3D.instantiate(_obj);
  3000. newobj.active = true;
  3001. return newobj;
  3002. }
  3003. };
  3004. PoolManager.RecoverSprite3D = function (_obj, _active) {
  3005. if (_active === void 0) { _active = false; }
  3006. if (!_obj) {
  3007. console.warn("PoolManager Recover Error!", null);
  3008. return;
  3009. }
  3010. if (_obj.destroyed) {
  3011. console.warn("PoolManager Recover Error!", "destroyed");
  3012. return;
  3013. }
  3014. if (!_active && _obj.active == false) {
  3015. console.warn("PoolManager Recover Error!", _obj.name);
  3016. return;
  3017. }
  3018. var objName = _obj.name;
  3019. if (this.Sprite3DDic[objName] != null && this.Sprite3DDic[objName] != undefined) {
  3020. var array = this.Sprite3DDic[objName];
  3021. if (array.length > this.PoolSize) {
  3022. _obj.destroy();
  3023. return;
  3024. }
  3025. else {
  3026. array.push(_obj);
  3027. }
  3028. }
  3029. else {
  3030. array = [];
  3031. array.push(_obj);
  3032. this.Sprite3DDic[objName] = array;
  3033. //console.log(objName,array.length);
  3034. }
  3035. _obj.transform.position = new Laya.Vector3(0, 0, -100);
  3036. _obj.removeSelf();
  3037. _obj.active = false;
  3038. };
  3039. PoolManager.ClearPool = function () {
  3040. for (var key in this.Sprite3DDic) {
  3041. var objs = this.Sprite3DDic[key];
  3042. for (var i = 0; i < objs.length; i++) {
  3043. objs[i].destroy();
  3044. }
  3045. }
  3046. this.Sprite3DDic = {};
  3047. };
  3048. PoolManager.PoolSize = 80;
  3049. PoolManager.Sprite3DDic = {};
  3050. return PoolManager;
  3051. }());
  3052. exports.default = PoolManager;
  3053. },{}],27:[function(require,module,exports){
  3054. "use strict";
  3055. Object.defineProperty(exports, "__esModule", { value: true });
  3056. var ResourceControl_1 = require("./ResourceControl");
  3057. var LocalData_1 = require("../Data/LocalData");
  3058. var GamePool_1 = require("../PrefabControl/GamePool");
  3059. var AssetPath_1 = require("../Config/AssetPath");
  3060. var TimerService_1 = require("../Time/TimerService");
  3061. var Tab = Laya.Tab;
  3062. /*
  3063. * 资源管理器;
  3064. */
  3065. var ResDataControl = /** @class */ (function () {
  3066. function ResDataControl() {
  3067. /************************************************ */
  3068. this._time = 0;
  3069. this.ClearInterval = 50000;
  3070. this.CheckInterval = 20000;
  3071. /******************************************************************* */
  3072. this.skins = ["res/ui/tab1.png", "res/ui/tab2.png"];
  3073. ResDataControl.ins = this;
  3074. }
  3075. Object.defineProperty(ResDataControl, "Instance", {
  3076. get: function () {
  3077. if (ResDataControl.ins == null) {
  3078. return new ResDataControl();
  3079. }
  3080. return ResDataControl.ins;
  3081. },
  3082. enumerable: true,
  3083. configurable: true
  3084. });
  3085. /**
  3086. * 添加包
  3087. * @param path 路径( 事例:res/ui/ )
  3088. * @param pkgname 包名
  3089. * @param isaddpackage 是否添加
  3090. * @param isCache 是否缓存
  3091. */
  3092. ResDataControl.prototype.AddPackByName = function (path, pkgname, isaddpackage, isCache) {
  3093. if (isaddpackage === void 0) { isaddpackage = true; }
  3094. if (isCache === void 0) { isCache = true; }
  3095. if (isaddpackage) {
  3096. fairygui.UIPackage.addPackage(path + pkgname, pkgname);
  3097. }
  3098. this.AddLocalLiveData(pkgname, isCache);
  3099. };
  3100. ResDataControl.prototype.init = function () {
  3101. GamePool_1.GamePool.Mark(LocalData_1.LocalData.ResDicValue, LocalData_1.LocalData);
  3102. this.urlRes = {};
  3103. this.packageRes = {};
  3104. this.NoLiveData = { "loading": true, "main": true, "uicomponent": true };
  3105. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  3106. };
  3107. /**
  3108. * 清理资源缓存(Array)
  3109. * @param urls 资源数组
  3110. * @param packageName 包名
  3111. */
  3112. ResDataControl.prototype.RemoveResources = function (urls, packageName) {
  3113. if (packageName === void 0) { packageName = ""; }
  3114. if (packageName != "") {
  3115. fairygui.UIPackage.removePackage(packageName);
  3116. }
  3117. for (var s in urls) {
  3118. this.RemoveResourcesByurl(urls[s].url, true);
  3119. }
  3120. };
  3121. /************************************************ */
  3122. ResDataControl.prototype.placeHSlider = function () {
  3123. var hs = new Laya.HSlider();
  3124. hs.skin = "res/ui/hslider.png";
  3125. hs.width = 300;
  3126. hs.pos(50, 170);
  3127. hs.min = 0;
  3128. hs.max = 100;
  3129. hs.value = 50;
  3130. hs.tick = 1;
  3131. Laya.stage.addChild(hs);
  3132. };
  3133. ResDataControl.prototype.placeVSlider = function () {
  3134. var vs = new Laya.VSlider();
  3135. vs.skin = "res/ui/vslider.png";
  3136. vs.height = 300;
  3137. vs.pos(400, 50);
  3138. vs.min = 0;
  3139. vs.max = 100;
  3140. vs.value = 50;
  3141. vs.tick = 1;
  3142. Laya.stage.addChild(vs);
  3143. };
  3144. ResDataControl.prototype.update = function (dt) {
  3145. this._time += dt;
  3146. if (this._time > this.CheckInterval) //1分钟检查一次
  3147. {
  3148. if (ResourceControl_1.ResourceControl.Instance.running) //如果当前在加载中,延时1秒检测
  3149. {
  3150. this._time -= 1000;
  3151. return;
  3152. }
  3153. this.RefreshGroupRes();
  3154. this._time = 0;
  3155. }
  3156. };
  3157. /**
  3158. * 清理资源缓存(url)
  3159. * @param url 要清理的资源url
  3160. * @param isClear 对于缓存池中的数据,当引用为0时,是否直接强制清除( 如果为false,则等待缓存定时刷新时候再去判断 )
  3161. */
  3162. ResDataControl.prototype.RemoveResourcesByurl = function (url, isClear) {
  3163. if (isClear === void 0) { isClear = false; }
  3164. if (this.urlRes.hasOwnProperty(url)) {
  3165. if (isClear) {
  3166. Laya.loader.clearRes(url);
  3167. delete this.urlRes[url];
  3168. }
  3169. else {
  3170. this.urlRes[url]--;
  3171. }
  3172. }
  3173. else {
  3174. Laya.loader.clearRes(url);
  3175. }
  3176. };
  3177. ResDataControl.prototype.ClearLiveDataByPackName = function (pkgName) {
  3178. if (this.packageRes[pkgName]) {
  3179. var vo = this.packageRes[pkgName];
  3180. vo.clear();
  3181. delete this.packageRes[pkgName];
  3182. }
  3183. };
  3184. /**
  3185. * 添加ui包
  3186. * @param pkgname 包名
  3187. * @param isaddpackage 是否创建uipackage
  3188. * @param isCache 是否添加到组缓存中( 如果添加,则参与定时清理的逻辑,常驻资源请勿设置为ture )
  3189. */
  3190. ResDataControl.prototype.AddViewPackByName = function (pkgname, isaddpackage, isCache) {
  3191. if (isaddpackage === void 0) { isaddpackage = true; }
  3192. if (isCache === void 0) { isCache = true; }
  3193. if (isaddpackage) {
  3194. if (pkgname == "main") {
  3195. fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.res + AssetPath_1.AssetPath.subpacksgeui + pkgname, pkgname);
  3196. }
  3197. else {
  3198. fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.resources + AssetPath_1.AssetPath.ui + pkgname, pkgname);
  3199. }
  3200. }
  3201. this.AddLocalLiveData(pkgname, isCache);
  3202. };
  3203. /**
  3204. * 移除包
  3205. * @param pkgname 包名
  3206. * @param isclear 是否强制清除( 如果为false则等待定时器判断清理,如果为true则强制清除 )
  3207. */
  3208. ResDataControl.prototype.ClearPackByName = function (pkgname, isclear) {
  3209. if (isclear === void 0) { isclear = false; }
  3210. if (pkgname == "" || pkgname == null) {
  3211. return;
  3212. }
  3213. if (isclear) {
  3214. fairygui.UIPackage.removePackage(pkgname);
  3215. if (this.packageRes.hasOwnProperty(pkgname)) {
  3216. delete this.packageRes[pkgname];
  3217. }
  3218. }
  3219. else {
  3220. if (this.packageRes.hasOwnProperty(pkgname)) {
  3221. var vo = this.packageRes[pkgname];
  3222. if (vo) {
  3223. vo.ref--;
  3224. }
  3225. }
  3226. }
  3227. };
  3228. ResDataControl.prototype.RefreshGroupRes = function () {
  3229. var nowTime = Laya.Browser.now();
  3230. var s;
  3231. if (this.packageRes) {
  3232. var vo;
  3233. for (s in this.packageRes) {
  3234. vo = this.packageRes[s];
  3235. if (vo.ref <= 0 && (nowTime - vo.time) > this.ClearInterval) {
  3236. this.ClearPackByName(vo.packageName, true);
  3237. this.ClearLiveDataByPackName(vo.packageName);
  3238. }
  3239. }
  3240. }
  3241. //清理图片缓存
  3242. if (this.urlRes) {
  3243. var resourceurlPool = this.urlRes;
  3244. for (s in resourceurlPool) {
  3245. if (resourceurlPool[s] <= 0) {
  3246. this.RemoveResourcesByurl(s, true);
  3247. }
  3248. }
  3249. }
  3250. };
  3251. ResDataControl.prototype.onSkinLoaded = function () {
  3252. var tabA = this.createTab(this.skins[0]);
  3253. tabA.pos(40, 120);
  3254. tabA.labelColors = "#000000,#d3d3d3,#333333";
  3255. var tabB = this.createTab(this.skins[1]);
  3256. tabB.pos(40, 220);
  3257. tabB.labelColors = "#FFFFFF,#8FB299,#FFFFFF";
  3258. };
  3259. ResDataControl.prototype.createTab = function (skin) {
  3260. var tab = new Tab();
  3261. tab.skin = skin;
  3262. tab.labelBold = true;
  3263. tab.labelSize = 20;
  3264. tab.labelStrokeColor = "#000000";
  3265. tab.labels = "Tab Control 1,Tab Control 2,Tab Control 3";
  3266. tab.labelPadding = "0,0,0,0";
  3267. tab.selectedIndex = 1;
  3268. Laya.stage.addChild(tab);
  3269. return tab;
  3270. };
  3271. /******************************************************************* */
  3272. /**
  3273. * 获取已经加载过的数据
  3274. * @param url 资源url
  3275. * @param isCache 是否存储在缓存池中,默认为true
  3276. */
  3277. ResDataControl.prototype.GainResources = function (url, isCache) {
  3278. if (isCache === void 0) { isCache = true; }
  3279. if (isCache) {
  3280. if (this.urlRes[url] == null) {
  3281. this.urlRes[url] = 0;
  3282. }
  3283. this.urlRes[url]++;
  3284. }
  3285. return Laya.loader.getRes(url);
  3286. };
  3287. ResDataControl.prototype.AddLocalLiveData = function (pkgname, isCache) {
  3288. if (isCache && !this.NoLiveData.hasOwnProperty(pkgname)) {
  3289. var vo;
  3290. if (!this.packageRes.hasOwnProperty(pkgname)) {
  3291. vo = GamePool_1.GamePool.GetItem(LocalData_1.LocalData.ResDicValue);
  3292. vo.packageName = pkgname;
  3293. this.packageRes[pkgname] = vo;
  3294. }
  3295. else {
  3296. vo = this.packageRes[pkgname];
  3297. }
  3298. vo.ref++;
  3299. vo.time = Laya.Browser.now();
  3300. }
  3301. };
  3302. return ResDataControl;
  3303. }());
  3304. exports.ResDataControl = ResDataControl;
  3305. },{"../Config/AssetPath":15,"../Data/LocalData":32,"../PrefabControl/GamePool":47,"../Time/TimerService":59,"./ResourceControl":28}],28:[function(require,module,exports){
  3306. "use strict";
  3307. Object.defineProperty(exports, "__esModule", { value: true });
  3308. /*
  3309. * name;
  3310. */
  3311. var Handler = Laya.Handler;
  3312. var DispatcherManager_1 = require("../utils/DispatcherManager");
  3313. var RecConfigs_1 = require("../Config/RecConfigs");
  3314. var ResourceControl = /** @class */ (function (_super) {
  3315. __extends(ResourceControl, _super);
  3316. function ResourceControl() {
  3317. var _this = _super.call(this) || this;
  3318. _this._groupIndex = 0;
  3319. _this.running = false;
  3320. /**
  3321. * 要加载的总数量
  3322. */
  3323. _this._loadNum = 0;
  3324. /**
  3325. * 已经加载的数量
  3326. */
  3327. _this._loadedNum = 0;
  3328. _this._preloadNum = 0;
  3329. _this._cut = 0;
  3330. _this._nowLoadArr = null;
  3331. ResourceControl.ins = _this;
  3332. return _this;
  3333. }
  3334. Object.defineProperty(ResourceControl, "Instance", {
  3335. get: function () {
  3336. if (ResourceControl.ins == null) {
  3337. return new ResourceControl();
  3338. }
  3339. return ResourceControl.ins;
  3340. },
  3341. enumerable: true,
  3342. configurable: true
  3343. });
  3344. ResourceControl.prototype.init = function () {
  3345. this._configs = new Array();
  3346. this._groups = {};
  3347. Laya.loader.retryNum = 4;
  3348. Laya.loader.on(Laya.Event.ERROR, this, this.onError);
  3349. Laya.loader.on("errorsMsg", this, this.errorsMsghandler);
  3350. Laya.loader.on("gameerrorsMsg", this, this.gameerrorsMsghandler);
  3351. };
  3352. ResourceControl.prototype.onLoadConfigComplete = function () {
  3353. if (this._onConfigCompleteTarget != null && this._onConfigComplete != null) {
  3354. this._onConfigComplete.call(this._onConfigCompleteTarget);
  3355. }
  3356. };
  3357. ResourceControl.prototype.errorsMsghandler = function (msg) {
  3358. DispatcherManager_1.DispatcherManager.dispatchEvent("loadfailEvent", msg);
  3359. };
  3360. ResourceControl.prototype.gameerrorsMsghandler = function (msg) {
  3361. DispatcherManager_1.DispatcherManager.dispatchEvent("gameserrosEvent", msg);
  3362. };
  3363. /**
  3364. * 加载资源组
  3365. * @param groupName 组名
  3366. * @param onResourceLoadTarget 作用域
  3367. * @param ResourceLoadComplete 完成事件
  3368. * @param onResourceProgress 加载进度事件
  3369. * @param isShow 是否显示加载状态
  3370. */
  3371. ResourceControl.prototype.loadGroup = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3372. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3373. if (isShow === void 0) { isShow = true; }
  3374. if (args === void 0) { args = null; }
  3375. // Debuger.log(groupName);
  3376. var data = {};
  3377. data.complete = ResourceLoadComplete;
  3378. data.completeTarget = onResourceLoadTarget;
  3379. data.progress = onResourceProgress;
  3380. data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3381. data.isShow = isShow;
  3382. data.args = args;
  3383. data.type = "group";
  3384. data.resouseType = "2D";
  3385. this._configs.push(data);
  3386. this.loadStart();
  3387. };
  3388. /**
  3389. * 加载单个资源
  3390. * @param url 资源url
  3391. * @param type 资源类型
  3392. * @param onResourceLoadTarget 作用域
  3393. * @param ResourceLoadComplete 完成事件
  3394. * @param onResourceProgress 加载进度事件
  3395. * @param isShow 是否显示加载状态
  3396. */
  3397. ResourceControl.prototype.Loader = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3398. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3399. if (isShow === void 0) { isShow = true; }
  3400. if (args === void 0) { args = null; }
  3401. var data = {};
  3402. data.complete = ResourceLoadComplete;
  3403. data.completeTarget = onResourceLoadTarget;
  3404. data.progress = onResourceProgress;
  3405. data.urls = [{ url: url, type: type }];
  3406. data.isShow = isShow;
  3407. data.args = args;
  3408. data.type = "single";
  3409. data.resouseType = "2D";
  3410. this._configs.push(data);
  3411. this.loadStart();
  3412. };
  3413. /**
  3414. * 加载数组资源
  3415. * @param urls
  3416. * @param onResourceLoadTarget
  3417. * @param ResourceLoadComplete
  3418. * @param onResourceProgress
  3419. * @param isShow
  3420. */
  3421. ResourceControl.prototype.Loaders = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3422. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3423. if (isShow === void 0) { isShow = true; }
  3424. if (args === void 0) { args = null; }
  3425. var data = {};
  3426. data.complete = ResourceLoadComplete;
  3427. data.completeTarget = onResourceLoadTarget;
  3428. data.progress = onResourceProgress;
  3429. data.urls = urls;
  3430. data.isShow = isShow;
  3431. data.type = "arr";
  3432. data.args = args;
  3433. data.resouseType = "2D";
  3434. this._configs.push(data);
  3435. this.loadStart();
  3436. };
  3437. /**
  3438. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  3439. * @param urls
  3440. * @param onResourceLoadTarget
  3441. * @param ResourceLoadComplete
  3442. * @param onResourceProgress
  3443. * @param isShow
  3444. */
  3445. ResourceControl.prototype.loaderArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, cut) {
  3446. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3447. if (cut === void 0) { cut = 3; }
  3448. var data = {};
  3449. data.complete = ResourceLoadComplete;
  3450. data.completeTarget = onResourceLoadTarget;
  3451. data.progress = onResourceProgress;
  3452. data.urls = urls;
  3453. data.isShow = false;
  3454. data.type = "loaderArr";
  3455. data.cut = cut;
  3456. data.resouseType = "2D";
  3457. this._configs.push(data);
  3458. this.startLoad1();
  3459. };
  3460. ResourceControl.prototype.startLoad1 = function () {
  3461. if (!this.running && this._configs.length > 0) {
  3462. this._nowLoadData = this._configs.shift();
  3463. this._nowLoadArr = this._nowLoadData.urls.concat().reverse();
  3464. this._loadNum = this._nowLoadArr.length;
  3465. this._loadedNum = 0;
  3466. this._preloadNum = this._loadedNum;
  3467. this._cut = Number(this._nowLoadData.cut);
  3468. this.loadStart1();
  3469. }
  3470. };
  3471. ResourceControl.prototype.loadStart1 = function () {
  3472. if (this.running) {
  3473. return;
  3474. }
  3475. if (this._nowLoadArr && this._nowLoadArr.length > 0) {
  3476. this.running = true;
  3477. var needArr;
  3478. if (this._nowLoadArr.length > this._cut) {
  3479. needArr = this._nowLoadArr.splice(0, this._cut);
  3480. }
  3481. else {
  3482. needArr = this._nowLoadArr.splice(0);
  3483. }
  3484. this._cut = needArr.length;
  3485. this._preloadNum = this._loadedNum;
  3486. this.onLoadingArr(0);
  3487. var resouseType = this._nowLoadData.resouseType;
  3488. if (resouseType == "2D" || resouseType == null) {
  3489. Laya.loader.load(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  3490. }
  3491. else {
  3492. Laya.loader.create(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
  3493. }
  3494. }
  3495. else {
  3496. this._nowLoadData = null;
  3497. this.startLoad1();
  3498. }
  3499. };
  3500. ResourceControl.prototype.onLoadingArr = function (value) {
  3501. this._loadedNum = this._preloadNum + value * this._cut;
  3502. if (this._nowLoadData) {
  3503. var allvalue = Math.ceil((this._loadedNum / this._loadNum) * 100);
  3504. if (this._nowLoadData.progress != null) {
  3505. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, allvalue, Math.floor(value * 100));
  3506. }
  3507. }
  3508. };
  3509. ResourceControl.prototype.onLoadCompleteArr = function () {
  3510. this.onLoadingArr(1);
  3511. this._loadedNum = this._preloadNum + this._cut;
  3512. this.running = false;
  3513. if (this._loadedNum == this._loadNum) {
  3514. if (this._nowLoadData && this._nowLoadData.complete) {
  3515. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  3516. }
  3517. }
  3518. Laya.timer.callLater(this, this.loadStart1);
  3519. // this.loadStart1();
  3520. };
  3521. ResourceControl.prototype.loadStart = function () {
  3522. if (this.running || this._configs.length == 0) {
  3523. return;
  3524. }
  3525. this.running = true;
  3526. this._nowLoadData = this._configs[0];
  3527. var arr = this._nowLoadData.urls;
  3528. var isShow = this._nowLoadData.isShow;
  3529. if (isShow) {
  3530. fairygui.GRoot.inst.showModalWait();
  3531. }
  3532. var resouseType = this._nowLoadData.resouseType;
  3533. if (arr != null) {
  3534. if (resouseType == "2D" || resouseType == null) {
  3535. Laya.loader.load(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  3536. }
  3537. else {
  3538. Laya.loader.create(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
  3539. }
  3540. }
  3541. };
  3542. // 加载进度侦听器
  3543. ResourceControl.prototype.onLoading = function (progress) {
  3544. if (this._nowLoadData) {
  3545. progress = Math.ceil(Number(progress * 100));
  3546. if (this._nowLoadData.progress != null) {
  3547. this._nowLoadData.progress.call(this._nowLoadData.completeTarget, progress);
  3548. }
  3549. }
  3550. };
  3551. ResourceControl.prototype.onLoadComplete = function (args) {
  3552. if (args === void 0) { args = null; }
  3553. fairygui.GRoot.inst.closeModalWait();
  3554. if (this._nowLoadData && this._nowLoadData.complete) {
  3555. if (this._nowLoadData.args) {
  3556. this._nowLoadData.complete.call(this._nowLoadData.completeTarget, this._nowLoadData.args);
  3557. }
  3558. else {
  3559. this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
  3560. }
  3561. }
  3562. this.running = false;
  3563. this._nowLoadData = null;
  3564. this._configs.shift();
  3565. this.loadStart();
  3566. };
  3567. ResourceControl.prototype.onError = function (err) {
  3568. fairygui.GRoot.inst.closeModalWait();
  3569. };
  3570. /**
  3571. * 加载3D单个资源
  3572. * @param url 资源url
  3573. * @param type 资源类型
  3574. * @param onResourceLoadTarget 作用域
  3575. * @param ResourceLoadComplete 完成事件
  3576. * @param onResourceProgress 加载进度事件
  3577. * @param isShow 是否显示加载状态
  3578. */
  3579. ResourceControl.prototype.Loader3D = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow) {
  3580. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3581. if (isShow === void 0) { isShow = true; }
  3582. var data = {};
  3583. data.complete = ResourceLoadComplete;
  3584. data.completeTarget = onResourceLoadTarget;
  3585. data.progress = onResourceProgress;
  3586. data.urls = [{ url: url, type: type }];
  3587. data.isShow = isShow;
  3588. data.type = "single";
  3589. data.resouseType = "3D";
  3590. this._configs.push(data);
  3591. this.loadStart();
  3592. };
  3593. /**
  3594. * 加载3D资源组
  3595. * @param groupName 组名
  3596. * @param onResourceLoadTarget 作用域
  3597. * @param ResourceLoadComplete 完成事件
  3598. * @param onResourceProgress 加载进度事件
  3599. * @param isShow 是否显示加载状态
  3600. */
  3601. ResourceControl.prototype.loadGroup3D = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
  3602. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3603. if (isShow === void 0) { isShow = true; }
  3604. if (args === void 0) { args = null; }
  3605. var data = {};
  3606. data.complete = ResourceLoadComplete;
  3607. data.completeTarget = onResourceLoadTarget;
  3608. data.progress = onResourceProgress;
  3609. data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3610. data.isShow = isShow;
  3611. data.args = args;
  3612. data.type = "group";
  3613. data.resouseType = "3D";
  3614. this._configs.push(data);
  3615. this.loadStart();
  3616. };
  3617. /**
  3618. * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
  3619. * @param urls
  3620. * @param onResourceLoadTarget
  3621. * @param ResourceLoadComplete
  3622. * @param onResourceProgress
  3623. * @param isShow
  3624. */
  3625. ResourceControl.prototype.loader3DArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isshow, args) {
  3626. if (onResourceProgress === void 0) { onResourceProgress = null; }
  3627. if (isshow === void 0) { isshow = false; }
  3628. if (args === void 0) { args = null; }
  3629. var data = {};
  3630. data.complete = ResourceLoadComplete;
  3631. data.completeTarget = onResourceLoadTarget;
  3632. data.progress = onResourceProgress;
  3633. data.urls = urls;
  3634. data.isShow = isshow;
  3635. data.args = args;
  3636. data.type = "loaderArr";
  3637. data.resouseType = "3D";
  3638. this._configs.push(data);
  3639. this.loadStart();
  3640. };
  3641. /**
  3642. * 加载特效
  3643. * @param groupName
  3644. * @param onResourceLoadTarget
  3645. * @param ResourceLoadComplete
  3646. * @param args
  3647. */
  3648. ResourceControl.prototype.loadEffect = function (groupName, onResourceLoadTarget, ResourceLoadComplete, args) {
  3649. if (args === void 0) { args = null; }
  3650. var urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
  3651. if (urls && urls.length > 0) {
  3652. Laya.loader.load(urls, Handler.create(onResourceLoadTarget, ResourceLoadComplete, [args]));
  3653. }
  3654. };
  3655. return ResourceControl;
  3656. }(Laya.EventDispatcher));
  3657. exports.ResourceControl = ResourceControl;
  3658. },{"../Config/RecConfigs":16,"../utils/DispatcherManager":85}],29:[function(require,module,exports){
  3659. "use strict";
  3660. Object.defineProperty(exports, "__esModule", { value: true });
  3661. var LayoutControl_1 = require("./LayoutControl");
  3662. var AssetPath_1 = require("../Config/AssetPath");
  3663. var CameraManager_1 = require("../Game/CameraManager");
  3664. var PropManager_1 = require("../PrefabControl/PropManager");
  3665. var Player_1 = require("../Game/Player");
  3666. var DispatcherManager_1 = require("../utils/DispatcherManager");
  3667. var GameState_1 = require("../utils/GameState");
  3668. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  3669. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  3670. var GameUtils_1 = require("../utils/GameUtils");
  3671. var NpcCFG_1 = require("../CFG/NpcCFG");
  3672. var NpcScript_1 = require("../Game/NpcScript");
  3673. var ResourceControl_1 = require("./ResourceControl");
  3674. var GameCFG_1 = require("../CFG/GameCFG");
  3675. var CharacterState_1 = require("../PrefabControl/CharacterState");
  3676. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  3677. var CharacterPool_1 = require("../PrefabControl/CharacterPool");
  3678. var Sprite = Laya.Sprite;
  3679. var Event = Laya.Event;
  3680. var SceneControl = /** @class */ (function () {
  3681. function SceneControl() {
  3682. this._initPosY = 1;
  3683. this.index = 0;
  3684. this.preRadian = 0;
  3685. SceneControl.ins = this;
  3686. }
  3687. Object.defineProperty(SceneControl, "Instance", {
  3688. get: function () {
  3689. if (SceneControl.ins == null) {
  3690. return new SceneControl();
  3691. }
  3692. return SceneControl.ins;
  3693. },
  3694. enumerable: true,
  3695. configurable: true
  3696. });
  3697. //创建主角
  3698. SceneControl.prototype.CreatePlayer = function (rolecfg) {
  3699. var iscreate = false;
  3700. if (!PropManager_1.PropManager.mainRole) {
  3701. iscreate = true;
  3702. }
  3703. else if (PropManager_1.PropManager.mainRole.name != "Character" + rolecfg.name) {
  3704. iscreate = true;
  3705. this.ClearMomentCharacter();
  3706. }
  3707. if (iscreate) {
  3708. // var sp:Laya.Sprite3D = Laya.Loader.getRes(AssetPath.get3DRoleModel(RoleData.roleCfg.name)) as Laya.Sprite3D;
  3709. // PropManager.mainRole = Laya.Sprite3D.instantiate(sp, PropManager.scene3D, false,new Laya.Vector3( 0,0,0 )) as Laya.Sprite3D;
  3710. PropManager_1.PropManager.mainRole = CharacterPool_1.CharacterPool.AddCharacter(rolecfg.name, Player_1.Player, PropManager_1.PropManager.scene3D);
  3711. PropManager_1.PropManager.mainRole.name = "Character" + rolecfg.name;
  3712. this.PlayerScript = PropManager_1.PropManager.mainRole.getComponent(Player_1.Player);
  3713. // this.mainRoleScript.resouseName = RoleData.roleCfg.name;
  3714. // if( )
  3715. // this.mainRoleScript = PropManager.mainRole.addComponent( MainRAoleScript );
  3716. }
  3717. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3718. var RoleData = agencyusermessage.RoleData;
  3719. var info = RoleData.levelcfg.roleinitpos;
  3720. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(info.offsetPos);
  3721. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  3722. var posVec = new Laya.Vector3;
  3723. var selectVec;
  3724. if (info.initbuild == "startpanel") {
  3725. posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
  3726. posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + offsetPos.y;
  3727. posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
  3728. selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
  3729. }
  3730. else {
  3731. var childpos = PropManager_1.PropManager.getPosVecbyScene(RoleData.levelmapArr[0], info.initbuild);
  3732. posVec.x = childpos.x + offsetPos.x;
  3733. posVec.y = childpos.y + offsetPos.y;
  3734. posVec.z = childpos.z + offsetPos.z;
  3735. selectVec = childpos;
  3736. }
  3737. PropManager_1.PropManager.mainRole.transform.position = posVec;
  3738. this.cameraScript.SetCameraPosition(PropManager_1.PropManager.mainRole.transform.position);
  3739. this.PlayerScript.setnowSelectVec(selectVec);
  3740. this.PlayerScript.nowAction = CharacterState_1.CharacterState.stand;
  3741. this.PlayerScript.PlayAnimator(CharacterState_1.CharacterState.stand);
  3742. // var UIPos = PropManager.mainRole.transform.position;
  3743. // var NAMEUI = new Laya.Text();
  3744. // NAMEUI.text = "自己";
  3745. // NAMEUI.fontSize = 60;
  3746. // NAMEUI.color = "#ffffff";
  3747. // NAMEUI.scaleX = 0.5;
  3748. // NAMEUI.scaleY = 0.5;
  3749. // NAMEUI.align = "center";
  3750. // NAMEUI.valign = "middle";
  3751. // Laya.stage.addChild(NAMEUI);
  3752. // Laya.timer.frameLoop(1, this, () => {
  3753. // let ScreenPos = new Laya.Vector3();
  3754. // PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
  3755. // NAMEUI.pos(ScreenPos.x, ScreenPos.y);
  3756. // })
  3757. };
  3758. //创建npc
  3759. SceneControl.prototype.createNpc = function () {
  3760. console.log("CreatNpc---");
  3761. this.ClearNpc();
  3762. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3763. var RoleData = agencyusermessage.RoleData;
  3764. var arr = RoleData.levelcfg.npc;
  3765. var childdict;
  3766. var index = 0;
  3767. PropManager_1.PropManager.npcnum = arr.length;
  3768. for (var s in arr) {
  3769. childdict = arr[s];
  3770. var selectVec = null;
  3771. var npccfg = NpcCFG_1.default.dict[childdict.id];
  3772. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(npccfg.name));
  3773. var chidarr = GameUtils_1.GameUtils.cutstrtoArr(childdict.offsetPos);
  3774. var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
  3775. var posVec = new Laya.Vector3;
  3776. if (childdict.scene == "startpanel") {
  3777. posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
  3778. posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + 1 + offsetPos.y;
  3779. posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
  3780. selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
  3781. }
  3782. else {
  3783. var childpos = PropManager_1.PropManager.getPosVecbyScene(childdict.scene, childdict.initbuild);
  3784. posVec.x = childpos.x + offsetPos.x;
  3785. posVec.y = childpos.y + offsetPos.y;
  3786. posVec.z = childpos.z + offsetPos.z;
  3787. selectVec = childpos;
  3788. }
  3789. var npcsp = CharacterPool_1.CharacterPool.AddCharacter(npccfg.name, NpcScript_1.NpcScript, PropManager_1.PropManager.scene3D);
  3790. npcsp.name = "npc_" + index;
  3791. npcsp.transform.position = posVec;
  3792. var npcscript = npcsp.getComponent(NpcScript_1.NpcScript);
  3793. npcscript.setnowSelectVec(selectVec);
  3794. npcscript.npcinfo(npccfg);
  3795. PropManager_1.PropManager.npcDict[npcsp.name] = npcsp;
  3796. PropManager_1.PropManager.npcscriptDict[npcsp.name] = npcscript;
  3797. npcscript.PlayAnimator(CharacterState_1.CharacterState.stand);
  3798. index++;
  3799. // this.ShowUI(npcsp);
  3800. }
  3801. console.log("CreatNpc2---");
  3802. };
  3803. SceneControl.prototype.ShowUI = function (_sprite) {
  3804. var UIPos = _sprite.transform.position;
  3805. var NAMEUI = new Laya.Text();
  3806. var random = GameUtils_1.GameUtils.randRangeint(1, 30);
  3807. NAMEUI.text = "npc_" + this.index;
  3808. NAMEUI.fontSize = 60;
  3809. NAMEUI.color = "#ffffff";
  3810. NAMEUI.scaleX = 0.5;
  3811. NAMEUI.scaleY = 0.5;
  3812. NAMEUI.align = "center";
  3813. NAMEUI.valign = "middle";
  3814. Laya.stage.addChild(NAMEUI);
  3815. Laya.timer.frameLoop(1, this, function () {
  3816. var ScreenPos = new Laya.Vector3();
  3817. PropManager_1.PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
  3818. NAMEUI.pos(ScreenPos.x, ScreenPos.y + 20);
  3819. });
  3820. this.index++;
  3821. };
  3822. SceneControl.prototype.ShowTheGameScene = function () {
  3823. var pathArr = [];
  3824. var urlArr = [];
  3825. this.cameraScript.iscanfollow = true;
  3826. var roleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  3827. var arr = roleData.levelmapArr;
  3828. var i = 0;
  3829. for (i = 0; i < arr.length; i++) {
  3830. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
  3831. urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
  3832. }
  3833. }
  3834. var npcArr = roleData.levelcfg.npc;
  3835. for (i = 0; i < npcArr.length; i++) {
  3836. if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
  3837. urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
  3838. }
  3839. }
  3840. for (i = 0; i < urlArr.length; i++) {
  3841. pathArr.push({ url: urlArr[i] });
  3842. }
  3843. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.SceneCreatComplete, null, true);
  3844. };
  3845. SceneControl.prototype.SceneCreatComplete = function () {
  3846. this.RefreshTerrain();
  3847. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3848. var RoleData = agencyusermessage.RoleData;
  3849. this.CreatePlayer(RoleData.roleCfg);
  3850. this.createNpc();
  3851. };
  3852. SceneControl.prototype.ListenOnEvent = function () {
  3853. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.start, this, this.EnterGame);
  3854. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.jump, this, this.Jump);
  3855. DispatcherManager_1.DispatcherManager.addEventListener(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.RefreshCharacterModel);
  3856. };
  3857. SceneControl.prototype.CharacterLoadEnd = function (url) {
  3858. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  3859. var RoleData = agencyusermessage.RoleData;
  3860. if (AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name) == url) {
  3861. this.CreatePlayer(RoleData.roleCfg);
  3862. }
  3863. };
  3864. SceneControl.prototype.Jump = function () {
  3865. this.PlayerScript.TestJump();
  3866. };
  3867. /************************************************************** */
  3868. SceneControl.prototype.setup = function () {
  3869. this.createSprite();
  3870. Laya.stage.on(Event.MOUSE_UP, this, this.onMouseUp);
  3871. Laya.stage.on(Event.MOUSE_OUT, this, this.onMouseUp);
  3872. };
  3873. SceneControl.prototype.createSprite = function () {
  3874. this.sp = new Sprite();
  3875. var w = 200, h = 300;
  3876. this.sp.graphics.drawRect(0, 0, w, h, "#FF7F50");
  3877. this.sp.size(w, h);
  3878. this.sp.pivot(w / 2, h / 2);
  3879. this.sp.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  3880. Laya.stage.addChild(this.sp);
  3881. this.sp.on(Event.MOUSE_DOWN, this, this.onMouseDown);
  3882. };
  3883. SceneControl.prototype.onMouseDown = function (e) {
  3884. var touches = e.touches;
  3885. if (touches && touches.length == 2) {
  3886. this.preRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
  3887. Laya.stage.on(Event.MOUSE_MOVE, this, this.onMouseMove);
  3888. }
  3889. };
  3890. SceneControl.prototype.onMouseMove = function (e) {
  3891. var touches = e.touches;
  3892. if (touches && touches.length == 2) {
  3893. var nowRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
  3894. this.sp.rotation += 180 / Math.PI * (nowRadian - this.preRadian);
  3895. this.preRadian = nowRadian;
  3896. }
  3897. };
  3898. SceneControl.prototype.onMouseUp = function (e) {
  3899. Laya.stage.off(Event.MOUSE_MOVE, this, this.onMouseMove);
  3900. };
  3901. /********************************** */
  3902. SceneControl.prototype.EnterGame = function (jiasu) {
  3903. this.PlayerScript.startRun(jiasu);
  3904. var npcdict = PropManager_1.PropManager.npcscriptDict;
  3905. for (var s in npcdict) {
  3906. var npcscript = npcdict[s];
  3907. npcscript.startRun();
  3908. }
  3909. };
  3910. SceneControl.prototype.ClearMomentCharacter = function () {
  3911. if (PropManager_1.PropManager.mainRole && this.PlayerScript) {
  3912. CharacterPool_1.CharacterPool.ClearCharacter(PropManager_1.PropManager.mainRole, this.PlayerScript.resouseName, this.PlayerScript);
  3913. this.PlayerScript = null;
  3914. PropManager_1.PropManager.mainRole = null;
  3915. }
  3916. };
  3917. SceneControl.prototype.SetScene = function () {
  3918. var backgroundParent = LayoutControl_1.LayoutControl.Instance.background.displayObject;
  3919. var scenebg = fairygui.UIPackage.createObject("main", "gambg");
  3920. scenebg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  3921. LayoutControl_1.LayoutControl.Instance.background.addChild(scenebg);
  3922. // UiManager.instance.add( GameBgView,null,LayerNotify.LAYER_BACKGROUND );
  3923. //添加3D场景
  3924. PropManager_1.PropManager.scene3D = backgroundParent.addChild(new Laya.Scene3D());
  3925. PropManager_1.PropManager.scene3D.physicsSimulation.continuousCollisionDetection = true;
  3926. //添加照相机
  3927. PropManager_1.PropManager.carma = (PropManager_1.PropManager.scene3D.addChild(new Laya.Camera(0, 0.1, 70)));
  3928. this.cameraScript = PropManager_1.PropManager.carma.addComponent(CameraManager_1.CameraManager);
  3929. PropManager_1.PropManager.carma.clearFlag = Laya.BaseCamera.CLEARFLAG_DEPTHONLY;
  3930. //添加方向光
  3931. var directionLight = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("DirectionalLight")); //PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  3932. PropManager_1.PropManager.scene3D.addChild(directionLight);
  3933. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  3934. // var directionLight: Laya.DirectionLight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  3935. // directionLight.color = new Laya.Vector3(1,1,1);
  3936. // directionLight.intensity = 0.5;
  3937. // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  3938. PropManager_1.PropManager.startPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("startpanel"));
  3939. PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.startPlane);
  3940. PropManager_1.PropManager.endPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("endpanel"));
  3941. PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.endPlane);
  3942. // PropManager.bgsprite3d = Laya.Loader.getRes(AssetPath.get3DModel("distantview"));
  3943. // PropManager.scene3D.addChild(PropManager.bgsprite3d);
  3944. //雾化代码
  3945. PropManager_1.PropManager.scene3D.enableFog = true;
  3946. //设置雾化的颜色
  3947. var fogArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[2].value);
  3948. if (GameCFG_1.default.dict[8]) {
  3949. var wucolor = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[8].value);
  3950. PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(Number(wucolor[0]), Number(wucolor[1]), Number(wucolor[2]));
  3951. }
  3952. else {
  3953. PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(0, 0, 0.6);
  3954. }
  3955. //设置雾化的起始位置,相对于相机的距离
  3956. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[3].value);
  3957. PropManager_1.PropManager.scene3D.fogStart = Number(valueArr[0]);
  3958. //设置雾化最浓处的距离。
  3959. PropManager_1.PropManager.scene3D.fogRange = Number(valueArr[1]);
  3960. this.ShowTheGameScene();
  3961. this.ListenOnEvent();
  3962. };
  3963. /**清除所有NPC */
  3964. SceneControl.prototype.ClearNpc = function () {
  3965. var npcdict = PropManager_1.PropManager.npcDict;
  3966. var s;
  3967. for (s in npcdict) {
  3968. var sp = npcdict[s];
  3969. var npcscript = PropManager_1.PropManager.npcscriptDict[s];
  3970. var resousename = npcscript.resouseName;
  3971. CharacterPool_1.CharacterPool.ClearCharacter(sp, resousename, npcscript);
  3972. delete PropManager_1.PropManager.npcscriptDict[s];
  3973. delete npcdict[s];
  3974. }
  3975. };
  3976. SceneControl.prototype.Pattern = function (mapSprite3D) {
  3977. console.log("Pattern1----");
  3978. if (PropManager_1.PropManager.patternDict[mapSprite3D.name]) {
  3979. delete PropManager_1.PropManager.patternDict[mapSprite3D.name];
  3980. }
  3981. var BlocksSprite = mapSprite3D.getChildByName("Blocks");
  3982. var chiddict = {};
  3983. var chidsp;
  3984. var buildSp;
  3985. var index = 0;
  3986. while (BlocksSprite.getChildByName("build_all_" + index)) {
  3987. buildSp = BlocksSprite.getChildByName("build_all_" + index);
  3988. chidsp = buildSp.getChildByName("child_pos");
  3989. chiddict["build_all_" + index] = chidsp.transform.position;
  3990. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  3991. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  3992. }
  3993. index++;
  3994. }
  3995. index = 0;
  3996. while (BlocksSprite.getChildByName("build_front_" + index)) {
  3997. buildSp = BlocksSprite.getChildByName("build_front_" + index);
  3998. chidsp = buildSp.getChildByName("child_pos");
  3999. chiddict["build_front_" + index] = chidsp.transform.position;
  4000. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  4001. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  4002. }
  4003. index++;
  4004. }
  4005. index = 0;
  4006. while (BlocksSprite.getChildByName("build_left_" + index)) {
  4007. buildSp = BlocksSprite.getChildByName("build_left_" + index);
  4008. chidsp = buildSp.getChildByName("child_pos");
  4009. chiddict["build_left_" + index] = chidsp.transform.position;
  4010. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  4011. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  4012. }
  4013. index++;
  4014. }
  4015. index = 0;
  4016. while (BlocksSprite.getChildByName("build_right_" + index)) {
  4017. buildSp = BlocksSprite.getChildByName("build_right_" + index);
  4018. chidsp = buildSp.getChildByName("child_pos");
  4019. chiddict["build_right_" + index] = chidsp.transform.position;
  4020. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  4021. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  4022. }
  4023. index++;
  4024. }
  4025. index = 0;
  4026. while (BlocksSprite.getChildByName("build_frontleft_" + index)) {
  4027. buildSp = BlocksSprite.getChildByName("build_frontleft_" + index);
  4028. chidsp = buildSp.getChildByName("child_pos");
  4029. chiddict["build_frontleft_" + index] = chidsp.transform.position;
  4030. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  4031. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  4032. }
  4033. index++;
  4034. }
  4035. index = 0;
  4036. while (BlocksSprite.getChildByName("build_frontright_" + index)) {
  4037. buildSp = BlocksSprite.getChildByName("build_frontright_" + index);
  4038. chidsp = buildSp.getChildByName("child_pos");
  4039. chiddict["build_frontright_" + index] = chidsp.transform.position;
  4040. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  4041. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  4042. }
  4043. index++;
  4044. }
  4045. index = 0;
  4046. while (BlocksSprite.getChildByName("build_leftright_" + index)) {
  4047. buildSp = BlocksSprite.getChildByName("build_leftright_" + index);
  4048. chidsp = buildSp.getChildByName("child_pos");
  4049. chiddict["build_leftright_" + index] = chidsp.transform.position;
  4050. if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
  4051. PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
  4052. }
  4053. index++;
  4054. }
  4055. index = 0;
  4056. var Props = mapSprite3D.getChildByName("Props");
  4057. while (Props.getChildByName("Scaffolding_" + index)) {
  4058. chidsp = Props.getChildByName("Scaffolding_" + index).getChildByName("child_pos");
  4059. chiddict["Scaffolding_" + index] = chidsp.transform.position;
  4060. index++;
  4061. }
  4062. index = 0;
  4063. while (Props.getChildByName("grilling_" + index)) {
  4064. chidsp = Props.getChildByName("grilling_" + index).getChildByName("child_pos");
  4065. chiddict["grilling_" + index] = chidsp.transform.position;
  4066. index++;
  4067. }
  4068. index = 0;
  4069. var jumpchildSp;
  4070. var iscreatejt = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData.LevelID < 3 ? true : false;
  4071. while (Props.getChildByName("JumpBoost_" + index)) {
  4072. jumpchildSp = Props.getChildByName("JumpBoost_" + index);
  4073. if (iscreatejt) {
  4074. var pos = jumpchildSp.transform.position.clone();
  4075. pos.y += 3;
  4076. var jiantou = Laya.Sprite3D.instantiate(Laya.loader.getRes(AssetPath_1.AssetPath.get3DRoleModel("Arrow")), PropManager_1.PropManager.scene3D, false, pos);
  4077. PropManager_1.PropManager.jiantouArr.push(jiantou);
  4078. }
  4079. index++;
  4080. }
  4081. PropManager_1.PropManager.patternDict[mapSprite3D.name] = chiddict;
  4082. console.log("Pattern2----");
  4083. };
  4084. /***************************************************** */
  4085. SceneControl.prototype.onSpriteClick = function (e) {
  4086. var randomAngle = Math.random() * 180;
  4087. //发送自定义事件
  4088. // this.sp.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
  4089. };
  4090. // 触发自定义的rotate事件
  4091. SceneControl.prototype.onRotate = function (newAngle) {
  4092. Laya.Tween.to(this.sp, { "rotation": newAngle }, 1000, Laya.Ease.elasticOut);
  4093. };
  4094. /***************************************************** */
  4095. SceneControl.prototype.RefreshCharacterModel = function () {
  4096. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  4097. var RoleData = agencyusermessage.RoleData;
  4098. var pathArr = [];
  4099. pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
  4100. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.CharacterLoadEnd, null, true, AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name));
  4101. };
  4102. /*********更新地形 */
  4103. SceneControl.prototype.RefreshTerrain = function () {
  4104. var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
  4105. var RoleData = agencyusermessage.RoleData;
  4106. var nowlevelcfg = RoleData.levelcfg;
  4107. var mapArr = RoleData.levelmapArr;
  4108. var mapSprite3D;
  4109. var mapname;
  4110. var _lastmapSprite3D;
  4111. for (var s in PropManager_1.PropManager.nowmapDict) {
  4112. PropManager_1.PropManager.nowmapDict[s].active = false;
  4113. }
  4114. for (var i = 0; i < mapArr.length; i++) {
  4115. mapname = mapArr[i];
  4116. console.log("mapname1----", mapname);
  4117. if (PropManager_1.PropManager.nowmapDict[mapname]) {
  4118. mapSprite3D = PropManager_1.PropManager.nowmapDict[mapname];
  4119. mapSprite3D.active = true;
  4120. }
  4121. else {
  4122. console.log("mapname2----", mapname);
  4123. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(mapname));
  4124. console.log("mapname3----", mapname);
  4125. mapSprite3D = Laya.Sprite3D.instantiate(sp, PropManager_1.PropManager.scene3D, false, null);
  4126. console.log("mapname4----", mapname);
  4127. PropManager_1.PropManager.nowmapDict[mapname] = mapSprite3D;
  4128. console.log("mapname5----", mapname);
  4129. }
  4130. if (i == 0) {
  4131. var arr = GameUtils_1.GameUtils.cutstrtoArr(nowlevelcfg.firstScenepos);
  4132. mapSprite3D.transform.position = new Laya.Vector3(Number(arr[0]), Number(arr[1]), Number(arr[2]));
  4133. }
  4134. else {
  4135. var endPos = _lastmapSprite3D.getChildByName("END").transform.position.clone();
  4136. endPos.x = 0;
  4137. endPos.y = 0;
  4138. mapSprite3D.transform.position = endPos;
  4139. }
  4140. this.Pattern(mapSprite3D);
  4141. _lastmapSprite3D = mapSprite3D;
  4142. var endPos1 = mapSprite3D.getChildByName("END").transform.position.clone();
  4143. endPos1.z += Number(GameCFG_1.default.dict[6].value);
  4144. PropManager_1.PropManager.endPlane.transform.position = endPos1;
  4145. PropManager_1.PropManager.gamewinPosZ = endPos1.z;
  4146. PropManager_1.PropManager.gamewinPosZ -= 2;
  4147. // PropManager.bgsprite3d.transform.position = new Laya.Vector3( 0,-20,-40 );
  4148. }
  4149. };
  4150. /*使用界面显示,0:砸蛋,1:宝箱*/
  4151. SceneControl.EggGGroup = 0;
  4152. /**签到是否正在显示 */
  4153. SceneControl.IsShowSign = false;
  4154. return SceneControl;
  4155. }());
  4156. exports.SceneControl = SceneControl;
  4157. },{"../Agency/AgencyUserMessage":8,"../CFG/GameCFG":10,"../CFG/NpcCFG":13,"../Config/AssetPath":15,"../Data/UserInfoEvent":36,"../Game/CameraManager":38,"../Game/NpcScript":39,"../Game/Player":40,"../PrefabControl/CharacterPool":45,"../PrefabControl/CharacterState":46,"../PrefabControl/PanelResDic":48,"../PrefabControl/PropManager":49,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/GameUtils":87,"./LayoutControl":22,"./ResourceControl":28}],30:[function(require,module,exports){
  4158. "use strict";
  4159. Object.defineProperty(exports, "__esModule", { value: true });
  4160. var GamePool_1 = require("../PrefabControl/GamePool");
  4161. var ComponentEventData = /** @class */ (function () {
  4162. function ComponentEventData() {
  4163. }
  4164. ComponentEventData.prototype.listenKeyboard = function () {
  4165. this.keyDownList = [];
  4166. //添加键盘按下事件,一直按着某按键则会不断触发
  4167. Laya.stage.on(Laya.Event.KEY_DOWN, this, this.onKeyDown);
  4168. //添加键盘抬起事件
  4169. Laya.stage.on(Laya.Event.KEY_UP, this, this.onKeyUp);
  4170. };
  4171. /**键盘按下处理*/
  4172. ComponentEventData.prototype.onKeyDown = function (e) {
  4173. var keyCode = e["keyCode"];
  4174. this.keyDownList[keyCode] = true;
  4175. };
  4176. ComponentEventData.prototype.clear = function () {
  4177. this.target = null;
  4178. this.type = null;
  4179. this.thisObject = null;
  4180. this.listener = null;
  4181. GamePool_1.GamePool.RemoveItem(ComponentEventData.ResDicValue, this);
  4182. };
  4183. /**键盘抬起处理*/
  4184. ComponentEventData.prototype.onKeyUp = function (e) {
  4185. delete this.keyDownList[e["keyCode"]];
  4186. };
  4187. ComponentEventData.ResDicValue = "ComponentEventData";
  4188. return ComponentEventData;
  4189. }());
  4190. exports.ComponentEventData = ComponentEventData;
  4191. },{"../PrefabControl/GamePool":47}],31:[function(require,module,exports){
  4192. "use strict";
  4193. Object.defineProperty(exports, "__esModule", { value: true });
  4194. /*
  4195. * name;
  4196. */
  4197. var DataInfoBase = /** @class */ (function (_super) {
  4198. __extends(DataInfoBase, _super);
  4199. function DataInfoBase() {
  4200. return _super.call(this) || this;
  4201. }
  4202. /***********混淆********* */
  4203. DataInfoBase.prototype.showApe = function () {
  4204. var monkey1Path = "./res/apes/monkey1.png", monkey2Path = "./res/apes/monkey2.png";
  4205. // 方法1:使用loadImage
  4206. var ape = new Laya.Sprite();
  4207. Laya.stage.addChild(ape);
  4208. ape.loadImage(monkey1Path);
  4209. // 方法2:使用drawTexture
  4210. Laya.loader.load(monkey2Path, Laya.Handler.create(this, function () {
  4211. var monkey2 = Laya.loader.getRes(monkey2Path);
  4212. var ape2 = new Laya.Sprite();
  4213. Laya.stage.addChild(ape2);
  4214. ape2.graphics.drawTexture(monkey2, 100, 0);
  4215. }));
  4216. };
  4217. /*********************** */
  4218. DataInfoBase.prototype.DataInfo = function (data) {
  4219. if (data) {
  4220. for (var s in data) {
  4221. var itemd = this[s];
  4222. if (itemd != null) {
  4223. this[s] = data[s];
  4224. }
  4225. // else
  4226. // {
  4227. // Debuger.log( "VO:未定义属性-" + s );
  4228. // }
  4229. }
  4230. }
  4231. };
  4232. /*********混淆 */
  4233. DataInfoBase.prototype.createButton = function (skin, name, cb, index) {
  4234. var btn = new Laya.Button(skin, name);
  4235. Laya.stage.addChild(btn);
  4236. btn.on(Laya.Event.CLICK, this, cb);
  4237. btn.size(147, 55);
  4238. btn.name = name;
  4239. btn.right = 10;
  4240. btn.top = index * (btn.height + 10);
  4241. return btn;
  4242. };
  4243. /***************** */
  4244. DataInfoBase.prototype.dispatchEvent = function (type, data) {
  4245. this.event(type, data);
  4246. };
  4247. return DataInfoBase;
  4248. }(Laya.EventDispatcher));
  4249. exports.DataInfoBase = DataInfoBase;
  4250. },{}],32:[function(require,module,exports){
  4251. "use strict";
  4252. Object.defineProperty(exports, "__esModule", { value: true });
  4253. var GamePool_1 = require("../PrefabControl/GamePool");
  4254. var Sprite = Laya.Sprite;
  4255. var Event = Laya.Event;
  4256. /*
  4257. * name;
  4258. */
  4259. var LocalData = /** @class */ (function (_super) {
  4260. __extends(LocalData, _super);
  4261. function LocalData() {
  4262. var _this = _super !== null && _super.apply(this, arguments) || this;
  4263. /**
  4264. * 引用次数
  4265. */
  4266. _this.ref = 0;
  4267. /**
  4268. * 最后一次被引用的时间
  4269. */
  4270. _this.time = 0;
  4271. /**
  4272. * 包名
  4273. */
  4274. _this.packageName = "";
  4275. return _this;
  4276. }
  4277. LocalData.prototype.createCoralRect = function () {
  4278. var coralRect = new Sprite();
  4279. coralRect.graphics.drawRect(0, 0, Laya.stage.width, Laya.stage.height / 2, "#FF7F50");
  4280. //设置名称
  4281. coralRect.name = "珊瑚色容器";
  4282. coralRect.size(Laya.stage.width, Laya.stage.height / 2);
  4283. Laya.stage.addChild(coralRect);
  4284. coralRect.on(Event.MOUSE_DOWN, this, this.onDown);
  4285. };
  4286. LocalData.prototype.createDeepSkyblueRect = function () {
  4287. var deepSkyblueRect = new Sprite();
  4288. deepSkyblueRect.graphics.drawRect(0, 0, 100, 100, "#00BFFF");
  4289. //设置名称
  4290. deepSkyblueRect.name = "天蓝色矩形";
  4291. //设置宽高(要接收鼠标事件必须设置宽高,否则不会被命中)
  4292. deepSkyblueRect.size(100, 100);
  4293. deepSkyblueRect.pos(10, 10);
  4294. Laya.stage.addChild(deepSkyblueRect);
  4295. deepSkyblueRect.on(Event.MOUSE_DOWN, this, this.onDown);
  4296. };
  4297. LocalData.prototype.clear = function () {
  4298. this.ref = 0;
  4299. this.time = 0;
  4300. this.packageName = "";
  4301. GamePool_1.GamePool.RemoveItem(LocalData.ResDicValue, this);
  4302. };
  4303. /**侦听处理方法*/
  4304. LocalData.prototype.onDown = function (e) {
  4305. this.logger.text += "点击 - " + e.target.name + "\n";
  4306. };
  4307. LocalData.ResDicValue = "LocalData";
  4308. return LocalData;
  4309. }(Laya.EventDispatcher));
  4310. exports.LocalData = LocalData;
  4311. },{"../PrefabControl/GamePool":47}],33:[function(require,module,exports){
  4312. "use strict";
  4313. Object.defineProperty(exports, "__esModule", { value: true });
  4314. var DispatcherManager_1 = require("../utils/DispatcherManager");
  4315. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  4316. var LocalDataControl_1 = require("../Control/LocalDataControl");
  4317. var UserDataInfo_1 = require("../Data/UserDataInfo");
  4318. var RoleCFG_1 = require("../CFG/RoleCFG");
  4319. var LevelCFG_1 = require("../CFG/LevelCFG");
  4320. var GameUtils_1 = require("../utils/GameUtils");
  4321. var DataInfoBase_1 = require("./DataInfoBase");
  4322. var Templet = Laya.Templet;
  4323. var Event = Laya.Event;
  4324. var RoleData = /** @class */ (function (_super) {
  4325. __extends(RoleData, _super);
  4326. function RoleData() {
  4327. var _this = _super.call(this) || this;
  4328. /**
  4329. * 金币
  4330. */
  4331. _this._Gold = 0;
  4332. _this._roleid = 0;
  4333. _this._leveid = 0;
  4334. _this.mStartX = 400;
  4335. _this.mStartY = 500;
  4336. _this.mActionIndex = 0;
  4337. _this.mCurrIndex = 0;
  4338. _this.mCurrSkinIndex = 0;
  4339. /****************************************************** */
  4340. _this.movespeed = 0;
  4341. _this.frontjump = new Laya.Vector3;
  4342. _this.leftjump = new Laya.Vector3;
  4343. _this.rightjump = new Laya.Vector3;
  4344. _this.upclimb = 0;
  4345. _this.slideclimb = new Laya.Vector3;
  4346. RoleData.ins = _this;
  4347. return _this;
  4348. }
  4349. Object.defineProperty(RoleData, "Instance", {
  4350. get: function () {
  4351. if (RoleData.ins == null) {
  4352. return new RoleData();
  4353. }
  4354. return RoleData.ins;
  4355. },
  4356. enumerable: true,
  4357. configurable: true
  4358. });
  4359. RoleData.prototype.init = function () {
  4360. var localdatacontrol = LocalDataControl_1.LocalDataControl.Instance;
  4361. // var nowGold:number = Number(PlayerAccount.CurrentAccount.CurAccountData.GetUser(AccountUser.money));
  4362. // this.Gold = nowGold;
  4363. this.Money = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.gold);
  4364. this._roleid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.roleid);
  4365. if (this.CharacterID == 0) {
  4366. this.CharacterID = 1;
  4367. }
  4368. else {
  4369. this.InitCharacterInfo();
  4370. }
  4371. this._leveid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.levelid);
  4372. if (this._leveid == 0) {
  4373. this._leveid = 1;
  4374. }
  4375. this.RefreshLevel();
  4376. };
  4377. Object.defineProperty(RoleData.prototype, "nowlevel", {
  4378. get: function () {
  4379. return this._leveid;
  4380. },
  4381. enumerable: true,
  4382. configurable: true
  4383. });
  4384. RoleData.prototype.getNowServerLevel = function () {
  4385. return this._leveid;
  4386. };
  4387. RoleData.prototype.LevelUp = function () {
  4388. this._leveid++;
  4389. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.levelid, this._leveid.toString());
  4390. this.RefreshLevel();
  4391. };
  4392. /*********************************************************** */
  4393. RoleData.prototype.startFun = function () {
  4394. this.mAniPath = "res/spine/spineRes6/alien.sk";
  4395. this.mFactory = new Templet();
  4396. this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
  4397. this.mFactory.on(Event.ERROR, this, this.onError);
  4398. this.mFactory.loadAni(this.mAniPath);
  4399. };
  4400. RoleData.prototype.onError = function () {
  4401. console.log("error");
  4402. };
  4403. RoleData.prototype.parseComplete = function () {
  4404. //创建模式为1,可以启用换装
  4405. this.mArmature = this.mFactory.buildArmature(1);
  4406. this.mArmature.x = this.mStartX;
  4407. this.mArmature.y = this.mStartY;
  4408. this.mArmature.scale(0.5, 0.5);
  4409. Laya.stage.addChild(this.mArmature);
  4410. this.mArmature.on(Event.LABEL, this, this.onEvent);
  4411. this.play();
  4412. };
  4413. /******************************************************************** */
  4414. RoleData.prototype.RefreshLevel = function () {
  4415. var lv = this._leveid;
  4416. var nowcfglv = 0;
  4417. var allnums = LevelCFG_1.default.vec.length;
  4418. if (lv > allnums) {
  4419. var value = (lv - allnums) % (allnums - 2);
  4420. if (value == 0) {
  4421. nowcfglv = allnums;
  4422. }
  4423. else {
  4424. nowcfglv = value + 2;
  4425. }
  4426. }
  4427. else {
  4428. nowcfglv = lv;
  4429. }
  4430. this.levelcfg = LevelCFG_1.default.dict[nowcfglv];
  4431. this.levelmapArr = GameUtils_1.GameUtils.cutstrtoArr(this.levelcfg.road);
  4432. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_levelid);
  4433. };
  4434. RoleData.prototype.play = function () {
  4435. this.mCurrIndex++;
  4436. if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
  4437. this.mCurrIndex = 0;
  4438. }
  4439. this.mArmature.play(this.mCurrIndex, false);
  4440. };
  4441. RoleData.prototype.onEvent = function (e) {
  4442. Laya.stage.addChild(this.mLabelSprite);
  4443. this.mLabelSprite.x = this.mStartX;
  4444. this.mLabelSprite.y = this.mStartY;
  4445. this.mLabelSprite.graphics.clear();
  4446. };
  4447. RoleData.prototype.InitCharacterInfo = function () {
  4448. this.roleCfg = RoleCFG_1.default.dict[this._roleid];
  4449. this.movespeed = this.roleCfg.speed;
  4450. this.frontjump = this.roleCfg.frontjump;
  4451. this.leftjump = this.roleCfg.leftjump;
  4452. this.rightjump = this.roleCfg.rightjump;
  4453. this.upclimb = Number(this.roleCfg.upclimb);
  4454. this.slideclimb = this.roleCfg.slideclimb;
  4455. // this.frontjump.x = Number( this.roleCfg.frontjump.x );
  4456. // this.frontjump.y = Number( this.roleCfg.frontjump.y );
  4457. // this.frontjump.z = Number( this.roleCfg.frontjump.z );
  4458. // this.leftjump.x = Number( this.roleCfg.leftjump.x );
  4459. // this.leftjump.y = Number( this.roleCfg.leftjump.y );
  4460. // this.leftjump.z = Number( this.roleCfg.leftjump.z );
  4461. // this.rightjump.x = Number( this.roleCfg.rightjump.x );
  4462. // this.rightjump.y = Number( this.roleCfg.rightjump.y );
  4463. // this.rightjump.z = Number( this.roleCfg.rightjump.z );
  4464. // this.slideclimb.x = Number( this.roleCfg.slideclimb.x );
  4465. // this.slideclimb.y = Number( this.roleCfg.slideclimb.y );
  4466. // this.slideclimb.z = Number( this.roleCfg.slideclimb.z );
  4467. };
  4468. Object.defineProperty(RoleData.prototype, "LevelID", {
  4469. // public set leveid( value:number )
  4470. // {
  4471. // if( this._leveid != value )
  4472. // {
  4473. // this._leveid = value;
  4474. // this.levelcfg = LevelCFG.dict[ this._leveid ];
  4475. // this.levelmapArr = GameUtils.cutstrtoArr(this.levelcfg.road);
  4476. // CacheManager.getInstance().addstr( UserDataInfo.levelid,this._leveid.toString() );
  4477. // DispatcherManager.dispatchEvent( UserInfoEvent.userinfoEvent_updateroleid );
  4478. // }
  4479. // }
  4480. get: function () {
  4481. return this._leveid;
  4482. },
  4483. enumerable: true,
  4484. configurable: true
  4485. });
  4486. Object.defineProperty(RoleData.prototype, "CharacterID", {
  4487. get: function () {
  4488. return this._roleid;
  4489. },
  4490. set: function (value) {
  4491. if (this._roleid != value) {
  4492. this._roleid = value;
  4493. this.InitCharacterInfo();
  4494. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.roleid, this._roleid.toString());
  4495. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid);
  4496. }
  4497. },
  4498. enumerable: true,
  4499. configurable: true
  4500. });
  4501. Object.defineProperty(RoleData.prototype, "Money", {
  4502. get: function () {
  4503. return this._Gold;
  4504. },
  4505. set: function (value) {
  4506. if (this._Gold != value) {
  4507. this._Gold = value;
  4508. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.gold, this._Gold.toString());
  4509. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData);
  4510. }
  4511. },
  4512. enumerable: true,
  4513. configurable: true
  4514. });
  4515. return RoleData;
  4516. }(DataInfoBase_1.DataInfoBase));
  4517. exports.RoleData = RoleData;
  4518. },{"../CFG/LevelCFG":11,"../CFG/RoleCFG":14,"../Control/LocalDataControl":23,"../Data/UserDataInfo":35,"../Data/UserInfoEvent":36,"../utils/DispatcherManager":85,"../utils/GameUtils":87,"./DataInfoBase":31}],34:[function(require,module,exports){
  4519. "use strict";
  4520. Object.defineProperty(exports, "__esModule", { value: true });
  4521. var SkinData = /** @class */ (function () {
  4522. function SkinData() {
  4523. /**
  4524. * 0:未拥有,1:已经拥有
  4525. */
  4526. this.state = 0;
  4527. this.hasnum = 0;
  4528. /************************************ */
  4529. }
  4530. /************************************ */
  4531. SkinData.prototype.createText = function () {
  4532. var txt = new Laya.Text();
  4533. txt.text = "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
  4534. txt.width = 300;
  4535. txt.fontSize = 40;
  4536. txt.color = "#ffffff";
  4537. //设置文本为多行文本
  4538. txt.wordWrap = true;
  4539. txt.x = Laya.stage.width - txt.textWidth >> 1;
  4540. txt.y = Laya.stage.height - txt.textHeight >> 1;
  4541. Laya.stage.addChild(txt);
  4542. };
  4543. return SkinData;
  4544. }());
  4545. exports.SkinData = SkinData;
  4546. },{}],35:[function(require,module,exports){
  4547. "use strict";
  4548. Object.defineProperty(exports, "__esModule", { value: true });
  4549. var Event = Laya.Event;
  4550. var UserDataInfo = /** @class */ (function () {
  4551. function UserDataInfo() {
  4552. }
  4553. /******************************* */
  4554. UserDataInfo.prototype.onCallLater = function () {
  4555. console.log("onCallLater triggered");
  4556. var text = new Laya.Text();
  4557. text.font = "SimHei";
  4558. text.fontSize = 30;
  4559. text.color = "#FFFFFF";
  4560. text.text = "打开控制台可见该函数仅触发了一次";
  4561. text.size(Laya.stage.width, Laya.stage.height);
  4562. text.wordWrap = true;
  4563. text.valign = "middle";
  4564. text.align = "center";
  4565. Laya.stage.addChild(text);
  4566. };
  4567. UserDataInfo.prototype.onDecreaseAlpha1 = function (e) {
  4568. //移除鼠标单击事件
  4569. this.button1.off(Event.CLICK, this, this.onDecreaseAlpha1);
  4570. //定时执行一次(间隔时间)
  4571. Laya.timer.once(3000, this, this.onComplete1);
  4572. };
  4573. UserDataInfo.prototype.onDecreaseAlpha2 = function (e) {
  4574. //移除鼠标单击事件
  4575. this.button2.off(Event.CLICK, this, this.onDecreaseAlpha2);
  4576. //定时执行一次(基于帧率)
  4577. Laya.timer.frameOnce(60, this, this.onComplete2);
  4578. };
  4579. UserDataInfo.prototype.onComplete1 = function () {
  4580. //spBtn1的透明度减少0.5
  4581. this.button1.alpha -= 0.5;
  4582. };
  4583. UserDataInfo.prototype.onComplete2 = function () {
  4584. //spBtn2的透明度减少0.5
  4585. this.button2.alpha -= 0.5;
  4586. };
  4587. /******************************************************** */
  4588. /**
  4589. * 记录上次离开时间
  4590. */
  4591. UserDataInfo.lasttime = "lasttime";
  4592. UserDataInfo.caplastflushtime = "captime";
  4593. UserDataInfo.capstorageappids = "capappids";
  4594. UserDataInfo.hasgetappids = "hasgetappids";
  4595. /******************************* */
  4596. /**
  4597. * 角色信息
  4598. */
  4599. UserDataInfo.roleData = "roleData";
  4600. /********************************************************************** */
  4601. UserDataInfo.gold = "gold";
  4602. UserDataInfo.roleid = "roleid";
  4603. UserDataInfo.levelid = "levelid";
  4604. /**
  4605. * 皮肤
  4606. */
  4607. UserDataInfo.skin = "skin";
  4608. UserDataInfo.lastDay = "lastDay";
  4609. UserDataInfo.nowdayShare = "dayshare";
  4610. UserDataInfo.nowdayVideo = "dayvideo";
  4611. return UserDataInfo;
  4612. }());
  4613. exports.UserDataInfo = UserDataInfo;
  4614. },{}],36:[function(require,module,exports){
  4615. "use strict";
  4616. Object.defineProperty(exports, "__esModule", { value: true });
  4617. var UserInfoEvent = /** @class */ (function () {
  4618. function UserInfoEvent() {
  4619. }
  4620. UserInfoEvent.UserInfoEvent_updateUserData = "UserInfoEvent_updateUserData";
  4621. UserInfoEvent.userinfoEvent_updateroleid = "userinfoEvent_updateroleid";
  4622. UserInfoEvent.userinfoEvent_levelid = "userinfoEvent_levelid";
  4623. UserInfoEvent.updatePlayerInfo = "UserInfoEvent_updatePlayerInfo";
  4624. return UserInfoEvent;
  4625. }());
  4626. exports.UserInfoEvent = UserInfoEvent;
  4627. },{}],37:[function(require,module,exports){
  4628. "use strict";
  4629. Object.defineProperty(exports, "__esModule", { value: true });
  4630. var Global_1 = require("./Global");
  4631. var PanelResDic_1 = require("./PrefabControl/PanelResDic");
  4632. var DispatcherManager_1 = require("./utils/DispatcherManager");
  4633. var ComponentEventData_1 = require("./Data/ComponentEventData");
  4634. var RecConfigs_1 = require("./Config/RecConfigs");
  4635. var TimesTamper_1 = require("./Time/TimesTamper");
  4636. var AssetPath_1 = require("./Config/AssetPath");
  4637. var TimerService_1 = require("./Time/TimerService");
  4638. var GlobalWaiting_1 = require("./GlobalWaiting");
  4639. var PanelBaseControl_1 = require("./Control/PanelBaseControl");
  4640. var GamePool_1 = require("./PrefabControl/GamePool");
  4641. var LayoutControl_1 = require("./Control/LayoutControl");
  4642. var ViewManager_1 = require("./View/ViewManager");
  4643. var ResourceControl_1 = require("./Control/ResourceControl");
  4644. var ResDataControl_1 = require("./Control/ResDataControl");
  4645. var AudioControl_1 = require("./Control/AudioControl");
  4646. var ConnectControl_1 = require("./Control/ConnectControl");
  4647. var pingtaiutils_1 = require("./WXSDK/pingtaiutils");
  4648. var AgencyLogin_1 = require("./Agency/AgencyLogin");
  4649. var AgencyUserMessage_1 = require("./Agency/AgencyUserMessage");
  4650. var AgencyMain_1 = require("./Agency/AgencyMain");
  4651. var AgencyInGame_1 = require("./Agency/AgencyInGame");
  4652. var AgencySkin_1 = require("./Agency/AgencySkin");
  4653. var AgencyTrial_1 = require("./Agency/AgencyTrial");
  4654. var AgencyLottery_1 = require("./Agency/AgencyLottery");
  4655. /*
  4656. * name;
  4657. */
  4658. var GameContents = /** @class */ (function (_super) {
  4659. __extends(GameContents, _super);
  4660. function GameContents() {
  4661. return _super.call(this) || this;
  4662. }
  4663. /**
  4664. * 初始化游戏
  4665. */
  4666. GameContents.prototype.initGame = function () {
  4667. RecConfigs_1.RecConfigs.Instance.init();
  4668. DispatcherManager_1.DispatcherManager.init();
  4669. TimerService_1.TimerService.Instance.init();
  4670. LayoutControl_1.LayoutControl.Instance.initlayer();
  4671. ViewManager_1.ViewManager.Instance.init();
  4672. ResourceControl_1.ResourceControl.Instance.init();
  4673. ResDataControl_1.ResDataControl.Instance.init();
  4674. AudioControl_1.AudioControl.Instance.init();
  4675. ConnectControl_1.ConnectControl.Connnect();
  4676. TimesTamper_1.TimesTamper.Instance.init();
  4677. pingtaiutils_1.pingtaiutils.Instance.init();
  4678. this.initPoolObject();
  4679. this.initProxy();
  4680. this.initmapView();
  4681. this.beginLoadHandler();
  4682. };
  4683. /**
  4684. * 初始化对象池
  4685. */
  4686. GameContents.prototype.initPoolObject = function () {
  4687. GamePool_1.GamePool.Mark(ComponentEventData_1.ComponentEventData.ResDicValue, ComponentEventData_1.ComponentEventData);
  4688. };
  4689. /**
  4690. * 初始化模块代理类
  4691. */
  4692. GameContents.prototype.initProxy = function () {
  4693. var mvcpool = PanelResDic_1.PanelResDic.Instance;
  4694. mvcpool.AgencyAdd(AgencyLogin_1.AgencyLogin);
  4695. mvcpool.AgencyAdd(AgencyUserMessage_1.AgencyUserMessage);
  4696. mvcpool.AgencyAdd(AgencyMain_1.AgencyMain);
  4697. mvcpool.AgencyAdd(AgencyInGame_1.AgencyInGame);
  4698. mvcpool.AgencyAdd(AgencySkin_1.AgencySkin);
  4699. mvcpool.AgencyAdd(AgencyTrial_1.AgencyTrial);
  4700. mvcpool.AgencyAdd(AgencyLottery_1.AgencyLottery);
  4701. };
  4702. GameContents.prototype.initmapView = function () {
  4703. var mvcpool = PanelResDic_1.PanelResDic.Instance;
  4704. // mvcpool.mapView( MapViewType.DailyrewardView,DailyrewardView );
  4705. };
  4706. GameContents.prototype.beginLoadHandler = function () {
  4707. var patharr = [];
  4708. patharr.push({ url: AssetPath_1.AssetPath.getResConfig(), type: Laya.Loader.JSON });
  4709. patharr.push({ url: AssetPath_1.AssetPath.getGameVersion(), type: Laya.Loader.JSON });
  4710. ResourceControl_1.ResourceControl.Instance.Loaders(patharr, this, this.recloadComplete);
  4711. };
  4712. GameContents.prototype.recloadComplete = function () {
  4713. var gameversion = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getGameVersion(), false);
  4714. if (gameversion) {
  4715. Global_1.Global.gameVersion = gameversion.version;
  4716. }
  4717. else {
  4718. Global_1.Global.gameVersion = "1.0.0";
  4719. }
  4720. var configres = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getResConfig(), false);
  4721. RecConfigs_1.RecConfigs.Instance.initRec(configres);
  4722. ResourceControl_1.ResourceControl.Instance.loadGroup("loading", this, this.onPreLoaded, this.onPreprogress);
  4723. };
  4724. GameContents.prototype.onPreprogress = function (value) {
  4725. };
  4726. GameContents.prototype.onPreLoaded = function () {
  4727. ResDataControl_1.ResDataControl.Instance.AddViewPackByName("loading", true, false);
  4728. var globalwaiturl = fairygui.UIPackage.getItemURL("loading", "globalWaiting");
  4729. PanelBaseControl_1.PanelBaseControl.viewbgUrl = fairygui.UIPackage.getItemURL("loading", "img_black");
  4730. fairygui.UIObjectFactory.setPackageItemExtension(globalwaiturl, GlobalWaiting_1.GlobalWaiting);
  4731. fairygui.UIConfig.globalModalWaiting = globalwaiturl;
  4732. fairygui.UIConfig.windowModalWaiting = globalwaiturl;
  4733. // CPAUtils.init();
  4734. this.Login();
  4735. };
  4736. GameContents.prototype.Login = function () {
  4737. PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyLogin_1.AgencyLogin).Login();
  4738. };
  4739. return GameContents;
  4740. }(Laya.EventDispatcher));
  4741. exports.GameContents = GameContents;
  4742. },{"./Agency/AgencyInGame":2,"./Agency/AgencyLogin":3,"./Agency/AgencyLottery":4,"./Agency/AgencyMain":5,"./Agency/AgencySkin":6,"./Agency/AgencyTrial":7,"./Agency/AgencyUserMessage":8,"./Config/AssetPath":15,"./Config/RecConfigs":16,"./Control/AudioControl":18,"./Control/ConnectControl":19,"./Control/LayoutControl":22,"./Control/PanelBaseControl":24,"./Control/ResDataControl":27,"./Control/ResourceControl":28,"./Data/ComponentEventData":30,"./Global":41,"./GlobalWaiting":42,"./PrefabControl/GamePool":47,"./PrefabControl/PanelResDic":48,"./Time/TimerService":59,"./Time/TimesTamper":60,"./View/ViewManager":70,"./WXSDK/pingtaiutils":82,"./utils/DispatcherManager":85}],38:[function(require,module,exports){
  4743. "use strict";
  4744. Object.defineProperty(exports, "__esModule", { value: true });
  4745. var PropManager_1 = require("../PrefabControl/PropManager");
  4746. var GameUtils_1 = require("../utils/GameUtils");
  4747. var GameCFG_1 = require("../CFG/GameCFG");
  4748. var Sprite = Laya.Sprite;
  4749. var TiledMap = Laya.TiledMap;
  4750. var Point = Laya.Point;
  4751. var Rectangle = Laya.Rectangle;
  4752. var Handler = Laya.Handler;
  4753. var CameraManager = /** @class */ (function (_super) {
  4754. __extends(CameraManager, _super);
  4755. function CameraManager() {
  4756. var _this = _super.call(this) || this;
  4757. _this.iscanfollow = false;
  4758. /***************************************************************** */
  4759. _this._upvec = new Laya.Vector3(0, 1, 0);
  4760. _this._index = 0;
  4761. _this._slerpValue = 8;
  4762. _this._lookatVec = new Laya.Vector3;
  4763. return _this;
  4764. }
  4765. CameraManager.prototype.onAwake = function () {
  4766. //获取脚本所属对象
  4767. this.camera = this.owner;
  4768. this._toVec = new Laya.Vector3();
  4769. this.camera.fieldOfView = 90;
  4770. };
  4771. CameraManager.prototype.onStart = function () {
  4772. this._transform = this.camera.transform;
  4773. //旋转摄像机角度
  4774. this._transform.rotate(new Laya.Vector3(0, 0, 0), true, false);
  4775. // this.camera.clearColor = null;
  4776. };
  4777. CameraManager.prototype.createMap = function () {
  4778. this.tiledMap = new TiledMap();
  4779. this.tiledMap.createMap("res/tiledMap/isometric_grass_and_water.json", new Rectangle(0, 0, Laya.stage.width, Laya.stage.height), Handler.create(this, this.mapLoaded), null, new Point(1600, 800));
  4780. };
  4781. CameraManager.prototype.onStageClick = function () {
  4782. var p = new Point(0, 0);
  4783. this.layer.getTilePositionByScreenPos(Laya.stage.mouseX, Laya.stage.mouseY, p);
  4784. this.layer.getScreenPositionByTilePos(Math.floor(p.x), Math.floor(p.y), p);
  4785. this.sprite.pos(p.x, p.y);
  4786. };
  4787. CameraManager.prototype.mapLoaded = function () {
  4788. this.layer = this.tiledMap.getLayerByIndex(0);
  4789. var radiusX = 32;
  4790. var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
  4791. var color = "#FF7F50";
  4792. this.sprite = new Sprite();
  4793. this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
  4794. this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
  4795. this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
  4796. this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
  4797. Laya.stage.addChild(this.sprite);
  4798. };
  4799. CameraManager.prototype.onUpdate = function () {
  4800. if (this.iscanfollow) {
  4801. if (PropManager_1.PropManager.iscarmanpc) {
  4802. if (PropManager_1.PropManager.npcDict["npc_0"]) {
  4803. Laya.Vector3.add(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._disVector, this._toVec);
  4804. this._transform.position = this._toVec;
  4805. this._transform.position.x = PropManager_1.PropManager.npcDict["npc_0"].transform.position.x;
  4806. this._transform.lookAt(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._upvec);
  4807. }
  4808. }
  4809. else {
  4810. if (PropManager_1.PropManager.mainRole) {
  4811. Laya.Vector3.add(PropManager_1.PropManager.mainRole.transform.position, this._disVector, this._toVec);
  4812. // this._toVec.x = PropManager.mainRole.transform.position.x;
  4813. // this._transform.position = this._toVec;
  4814. // this._transform.lookAt( PropManager.mainRole.transform.position,this._upvec );
  4815. Laya.Vector3.lerp(this._transform.position, this._toVec, 16 / 1000 * this._slerpValue, this._toVec);
  4816. // this._toVec.z = PropManager.mainRole.transform.position.z+this._disVector.z;
  4817. // this._toVec.y = PropManager.mainRole.transform.position.y + this._disVector.y;
  4818. this._transform.position = this._toVec;
  4819. this._lookatVec.x = this._toVec.x;
  4820. this._lookatVec.y = PropManager_1.PropManager.mainRole.transform.position.y;
  4821. this._lookatVec.z = PropManager_1.PropManager.mainRole.transform.position.z;
  4822. this._transform.lookAt(this._lookatVec, this._upvec);
  4823. }
  4824. }
  4825. }
  4826. };
  4827. CameraManager.prototype.GameEndRotate = function (targetPos, speed) {
  4828. this.iscanfollow = false;
  4829. this._transform.translate(speed, false);
  4830. this._transform.lookAt(targetPos, this._upvec);
  4831. };
  4832. CameraManager.prototype.SetCameraPosition = function (vec) {
  4833. var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[1].value);
  4834. this._disVector = new Laya.Vector3(Number(valueArr[0]), Number(valueArr[1]), Number(valueArr[2]));
  4835. Laya.Vector3.add(vec, this._disVector, this._toVec);
  4836. this.camera.transform.position = this._toVec;
  4837. this.camera.transform.position.x = vec.x;
  4838. // this.camera.transform.lookAt( vec,new Laya.Vector3( 0,1,0 ) );
  4839. };
  4840. return CameraManager;
  4841. }(Laya.Script3D));
  4842. exports.CameraManager = CameraManager;
  4843. },{"../CFG/GameCFG":10,"../PrefabControl/PropManager":49,"../utils/GameUtils":87}],39:[function(require,module,exports){
  4844. "use strict";
  4845. Object.defineProperty(exports, "__esModule", { value: true });
  4846. var TimerService_1 = require("../Time/TimerService");
  4847. var PropManager_1 = require("../PrefabControl/PropManager");
  4848. var CharacterState_1 = require("../PrefabControl/CharacterState");
  4849. var BuildCFG_1 = require("../CFG/BuildCFG");
  4850. var CameraManager_1 = require("./CameraManager");
  4851. var DispatcherManager_1 = require("../utils/DispatcherManager");
  4852. var GameState_1 = require("../utils/GameState");
  4853. var GameUtils_1 = require("../utils/GameUtils");
  4854. var AssetManager_1 = require("../Control/AssetManager");
  4855. var PoolManager_1 = require("../Control/PoolManager");
  4856. var NpcScript = /** @class */ (function (_super) {
  4857. __extends(NpcScript, _super);
  4858. function NpcScript() {
  4859. var _this = _super.call(this) || this;
  4860. _this._nowAction = "";
  4861. _this.resouseName = "";
  4862. _this._shangpaVec = new Laya.Vector3;
  4863. /**是否发生碰撞 */
  4864. _this.haveCollision = false;
  4865. _this._TargetCollision = "";
  4866. _this._normalizeVec = new Laya.Vector3;
  4867. _this.staybuild = "";
  4868. _this.stayscene = "";
  4869. /**
  4870. * 0:未锁,1:锁左边,2:锁右边
  4871. */
  4872. _this._lockxstate = 0;
  4873. /**
  4874. * 状态,0:等待状态,1:开始状态,2:完成状态
  4875. */
  4876. _this._nowRoleState = 0;
  4877. _this.movespeed = 0;
  4878. _this.frontjumpspeed = new Laya.Vector3;
  4879. _this.leftjumpspeed = new Laya.Vector3;
  4880. _this.rightjumpspeed = new Laya.Vector3;
  4881. _this.climbspeed = 0;
  4882. _this.sideclimbspeed = new Laya.Vector3;
  4883. _this._lockbyBuildname = "";
  4884. /**
  4885. * 0:未被锁,1:锁定左边,2:锁定右边,
  4886. */
  4887. _this._lockstate = 0;
  4888. _this.LastAction = "";
  4889. _this._moveTime = 0;
  4890. _this._chixuTime = 0;
  4891. _this._isActionNums = false;
  4892. _this._isneedactionnum = 0;
  4893. _this._needactiontime = 0;
  4894. _this.NowLastActionState = "";
  4895. _this._moveVec = new Laya.Vector3;
  4896. _this.jumpSpeed = new Laya.Vector3;
  4897. _this.jumpHight = 0;
  4898. _this._disy = 0;
  4899. _this.Gravity_g = 10; //重力加速度
  4900. _this._checktime = 0;
  4901. _this._ending = false;
  4902. _this._endAnmoSpeed = new Laya.Vector3();
  4903. _this._endanmotime = 1;
  4904. _this._endAnmoSpeed1 = new Laya.Vector3;
  4905. _this._changeMoveX = 0;
  4906. _this.HaveForceJump = false;
  4907. _this.quaternion = new Laya.Quaternion;
  4908. return _this;
  4909. }
  4910. NpcScript.prototype.onAwake = function () {
  4911. this._animator = this.owner.getComponent(Laya.Animator);
  4912. PropManager_1.PropManager.setAnimator(this._animator);
  4913. };
  4914. NpcScript.prototype.onStart = function () {
  4915. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  4916. this._transform = this.owner.transform;
  4917. var sp = this.owner;
  4918. // (sp.getChildByName("lefttrail") as Laya.TrailSprite3D).active = false;
  4919. // (sp.getChildByName("righttrail") as Laya.TrailSprite3D ).active = false;
  4920. var LeftTrial1 = sp.getChildByName("lefttrail");
  4921. var RightTrial1 = sp.getChildByName("righttrail");
  4922. console.log();
  4923. var scale = 0.001;
  4924. var index = GameUtils_1.GameUtils.randRangeint(0, AssetManager_1.AssetManager.AllMapDic.length - 1);
  4925. index = index % AssetManager_1.AssetManager.AllMapDic.length;
  4926. var prefabs = AssetManager_1.AssetManager.AllMapDic[index];
  4927. this.LeftTrial = PoolManager_1.default.GetSprite3D(prefabs);
  4928. LeftTrial1.parent.addChild(this.LeftTrial);
  4929. this.LeftTrial.transform.localPosition = LeftTrial1.transform.localPosition.clone();
  4930. this.LeftTrial.transform.localRotationEuler = LeftTrial1.transform.localRotationEuler.clone();
  4931. this.LeftTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
  4932. this.RightTrial = PoolManager_1.default.GetSprite3D(prefabs);
  4933. RightTrial1.parent.addChild(this.RightTrial);
  4934. this.RightTrial.transform.localPosition = RightTrial1.transform.localPosition.clone();
  4935. this.RightTrial.transform.localRotationEuler = RightTrial1.transform.localRotationEuler.clone();
  4936. this.RightTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
  4937. RightTrial1.active = false;
  4938. LeftTrial1.active = false;
  4939. console.log(sp.name);
  4940. };
  4941. NpcScript.prototype.startRun = function () {
  4942. if (this._nowNpcinfo.gravity) {
  4943. this.Gravity_g = this._nowNpcinfo.gravity;
  4944. }
  4945. else {
  4946. this.Gravity_g = 10;
  4947. }
  4948. this._checktime = 500;
  4949. this._nowRoleState = 1;
  4950. this._ending = false;
  4951. this._changeMoveX = 0;
  4952. this._initPosVec = this._transform.position.clone();
  4953. this.staybuild = "";
  4954. this.stayscene = "";
  4955. this._nowAction = CharacterState_1.CharacterState.stand;
  4956. this.nowAction = CharacterState_1.CharacterState.run;
  4957. this._speedMoveV3.x = 0;
  4958. this._speedMoveV3.y = 0;
  4959. this._speedMoveV3.z = -this.movespeed;
  4960. this._iscanMove = true;
  4961. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  4962. };
  4963. NpcScript.prototype.npcinfo = function (cfg) {
  4964. this._nowNpcinfo = cfg;
  4965. this.movespeed = this._nowNpcinfo.speed;
  4966. this.climbspeed = Number(this._nowNpcinfo.upclimb);
  4967. this.frontjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.frontjump.x), Number(this._nowNpcinfo.frontjump.y), Number(this._nowNpcinfo.frontjump.z));
  4968. this.leftjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.leftjump.x), Number(this._nowNpcinfo.leftjump.y), Number(this._nowNpcinfo.leftjump.z));
  4969. this.rightjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.rightjump.x), Number(this._nowNpcinfo.rightjump.y), Number(this._nowNpcinfo.rightjump.z));
  4970. this.sideclimbspeed = new Laya.Vector3(Number(this._nowNpcinfo.slideclimb.x), Number(this._nowNpcinfo.slideclimb.y), Number(this._nowNpcinfo.slideclimb.z));
  4971. // this.frontjump.x = Number( this._nowNpcinfo.frontjump.x );
  4972. // this.frontjump.y = Number( this._nowNpcinfo.frontjump.y );
  4973. // this.frontjump.z = Number( this._nowNpcinfo.frontjump.z );
  4974. // this.leftjump.x = Number( this._nowNpcinfo.leftjump.x );
  4975. // this.leftjump.y = Number( this._nowNpcinfo.leftjump.y );
  4976. // this.leftjump.z = Number( this._nowNpcinfo.leftjump.z );
  4977. // this.rightjump.x = Number( this._nowNpcinfo.rightjump.x );
  4978. // this.rightjump.y = Number( this._nowNpcinfo.rightjump.y );
  4979. // this.rightjump.z = Number( this._nowNpcinfo.rightjump.z );
  4980. // this.upclimb = Number( this._nowNpcinfo.upclimb );
  4981. // this.slideclimb.x = Number( this._nowNpcinfo.slideclimb.x );
  4982. // this.slideclimb.y = Number( this._nowNpcinfo.slideclimb.y );
  4983. // this.slideclimb.z = Number( this._nowNpcinfo.slideclimb.z );
  4984. };
  4985. /**
  4986. * 开始碰撞时执行
  4987. */
  4988. NpcScript.prototype.onCollisionEnter = function (collision) {
  4989. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  4990. var contactPoint = collision.contacts[0];
  4991. this.Calculate(contactPoint.normal, collision.other.owner);
  4992. }
  4993. };
  4994. NpcScript.prototype.setnowSelectVec = function (pos) {
  4995. this._nowselectVec = pos;
  4996. };
  4997. NpcScript.prototype.Calculate = function (normal, target) {
  4998. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  4999. return;
  5000. }
  5001. this._TargetCollision = target.name;
  5002. var n = new Laya.Vector3;
  5003. Laya.Vector3.normalize(normal, this._normalizeVec);
  5004. if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
  5005. this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  5006. {
  5007. if (this._TargetCollision.indexOf("build") != -1) {
  5008. this.staybuild = this._TargetCollision;
  5009. this.stayscene = target.parent.parent.name;
  5010. }
  5011. if (this._TargetCollision.indexOf("irongauze") != -1) {
  5012. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  5013. }
  5014. else {
  5015. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
  5016. }
  5017. if (this._normalizeVec.z == -1) //上爬
  5018. {
  5019. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.1)) {
  5020. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5021. this.nowAction = CharacterState_1.CharacterState.run;
  5022. }
  5023. else {
  5024. this.nowAction = CharacterState_1.CharacterState.climbup;
  5025. this._shangpaVec = this._nowselectVec.clone();
  5026. }
  5027. }
  5028. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  5029. this.nowAction = CharacterState_1.CharacterState.run;
  5030. }
  5031. else if (this._normalizeVec.x == -1) {
  5032. if (this.nowAction == CharacterState_1.CharacterState.run) {
  5033. this._lockxstate = 1;
  5034. }
  5035. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  5036. this._lockxstate = 1;
  5037. }
  5038. else {
  5039. this.nowAction = CharacterState_1.CharacterState.climbleft;
  5040. }
  5041. }
  5042. else if (this._normalizeVec.x == 1) {
  5043. if (this.nowAction == CharacterState_1.CharacterState.run) {
  5044. this._lockxstate = 2;
  5045. }
  5046. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  5047. this._lockxstate = 2;
  5048. }
  5049. else {
  5050. this.nowAction = CharacterState_1.CharacterState.climbright;
  5051. }
  5052. }
  5053. else {
  5054. if (this._normalizeVec.z != 1) {
  5055. this.nowAction = CharacterState_1.CharacterState.climbupblock;
  5056. this._shangpaVec = this._nowselectVec.clone();
  5057. }
  5058. }
  5059. }
  5060. else if (this._TargetCollision.indexOf("panel_jump") != -1) //加速板跳跃
  5061. {
  5062. this.nowAction = CharacterState_1.CharacterState.speedupjump;
  5063. // this.setJump( this.nowAction );
  5064. }
  5065. else if (this._TargetCollision.indexOf("panel_downslip") != -1) {
  5066. this.nowAction = CharacterState_1.CharacterState.downmove;
  5067. // this.setJump( this.nowAction );
  5068. }
  5069. else if (this._TargetCollision.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
  5070. if (this._normalizeVec.z == -1) //上爬
  5071. {
  5072. this.nowAction = CharacterState_1.CharacterState.climbup;
  5073. this._shangpaVec = this._nowselectVec.clone();
  5074. }
  5075. }
  5076. else if (this._TargetCollision.indexOf("box_sidejump") != -1) {
  5077. this.nowAction = CharacterState_1.CharacterState.sidespeedup;
  5078. // this.setJump( this.nowAction );
  5079. }
  5080. else if (this._TargetCollision.indexOf("box_Surmount") != -1) {
  5081. this.nowAction = CharacterState_1.CharacterState.cross;
  5082. // this.setJump( this.nowAction );
  5083. }
  5084. else if (this._TargetCollision.indexOf("irongauze") != -1) {
  5085. this.nowAction = CharacterState_1.CharacterState.climbup;
  5086. this._shangpaVec = this._nowselectVec.clone();
  5087. }
  5088. };
  5089. /**
  5090. * 持续碰撞时执行
  5091. */
  5092. NpcScript.prototype.onCollisionStay = function (collision) {
  5093. // Debuger.log( "碰撞中" );
  5094. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5095. this.haveCollision = true;
  5096. var contactPoint = collision.contacts[0];
  5097. var target = collision.other.owner;
  5098. var targetname = target.name;
  5099. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1 && targetname.indexOf("role") == -1) {
  5100. this._TargetCollision = targetname;
  5101. }
  5102. if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
  5103. this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  5104. {
  5105. if (this._TargetCollision.indexOf("build") != -1) {
  5106. this.staybuild = this._TargetCollision;
  5107. this.stayscene = target.parent.parent.name;
  5108. }
  5109. if (this._TargetCollision.indexOf("irongauze") != -1) {
  5110. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  5111. }
  5112. else {
  5113. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
  5114. }
  5115. }
  5116. }
  5117. };
  5118. /**
  5119. * 结束碰撞时执行
  5120. */
  5121. NpcScript.prototype.onCollisionExit = function (collision) {
  5122. this.haveCollision = false;
  5123. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5124. var contactPoint = collision.contacts[0];
  5125. this.CheckEnd(contactPoint.normal, collision.other.owner);
  5126. }
  5127. };
  5128. NpcScript.prototype.CheckEnd = function (normal, target) {
  5129. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
  5130. return;
  5131. }
  5132. if (this.HaveForceJump) {
  5133. this.HaveForceJump = false;
  5134. return;
  5135. }
  5136. if (this._lockxstate) {
  5137. this._lockxstate = 0;
  5138. return;
  5139. }
  5140. if (this._TargetCollision != target.name) {
  5141. return;
  5142. }
  5143. if (target.name.indexOf("panel_jump") != -1) {
  5144. return;
  5145. }
  5146. switch (this.nowAction) {
  5147. case CharacterState_1.CharacterState.climbup:
  5148. case CharacterState_1.CharacterState.climbupblock:
  5149. if (this._TargetCollision.indexOf("box_Board") != -1) {
  5150. this.JumpAction(this._changeMoveX);
  5151. }
  5152. else {
  5153. if (this._changeMoveX > 0) {
  5154. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5155. }
  5156. else if (this._changeMoveX < 0) {
  5157. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5158. }
  5159. }
  5160. break;
  5161. case CharacterState_1.CharacterState.climbright:
  5162. case CharacterState_1.CharacterState.climbleft:
  5163. this.JumpAction(this._changeMoveX);
  5164. break;
  5165. case CharacterState_1.CharacterState.run:
  5166. this.JumpAction(this._changeMoveX);
  5167. break;
  5168. case CharacterState_1.CharacterState.MoveX:
  5169. this.JumpAction(this._speedMoveV3.x);
  5170. break;
  5171. }
  5172. };
  5173. NpcScript.prototype.JumpAction = function (value, isquanzhong) {
  5174. if (isquanzhong === void 0) { isquanzhong = false; }
  5175. if (value > 0) {
  5176. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5177. }
  5178. else if (value < 0) {
  5179. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5180. }
  5181. else {
  5182. if (isquanzhong) {
  5183. if (this._TargetCollision.indexOf("build") != -1) {
  5184. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5185. var allvalue = 0;
  5186. var sort;
  5187. var selectdir = "";
  5188. if (this._TargetCollision.indexOf("leftright") != -1) {
  5189. allvalue = this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
  5190. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5191. if (sort <= this._nowNpcinfo.jump_left) {
  5192. selectdir = "left";
  5193. }
  5194. else {
  5195. selectdir = "right";
  5196. }
  5197. }
  5198. else if (this._TargetCollision.indexOf("frontright") != -1) {
  5199. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_right;
  5200. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5201. if (sort <= this._nowNpcinfo.start_ahead) {
  5202. selectdir = "front";
  5203. }
  5204. else {
  5205. selectdir = "right";
  5206. }
  5207. }
  5208. else if (this._TargetCollision.indexOf("frontleft") != -1) {
  5209. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left;
  5210. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5211. if (sort <= this._nowNpcinfo.start_ahead) {
  5212. selectdir = "front";
  5213. }
  5214. else {
  5215. selectdir = "left";
  5216. }
  5217. }
  5218. else if (this._TargetCollision.indexOf("right") != -1) {
  5219. selectdir = "right";
  5220. }
  5221. else if (this._TargetCollision.indexOf("left") != -1) {
  5222. selectdir = "left";
  5223. }
  5224. else if (this._TargetCollision.indexOf("front") != -1) {
  5225. selectdir = "front";
  5226. }
  5227. else {
  5228. allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
  5229. sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
  5230. if (sort <= this._nowNpcinfo.start_ahead) {
  5231. selectdir = "front";
  5232. }
  5233. else if (sort <= this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left) {
  5234. selectdir = "left";
  5235. }
  5236. else {
  5237. selectdir = "right";
  5238. }
  5239. }
  5240. switch (selectdir) {
  5241. case "left":
  5242. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5243. break;
  5244. case "right":
  5245. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5246. break;
  5247. case "front":
  5248. this.nowAction = CharacterState_1.CharacterState.jump;
  5249. break;
  5250. default:
  5251. this.nowAction = CharacterState_1.CharacterState.jump;
  5252. break;
  5253. }
  5254. }
  5255. else {
  5256. this.nowAction = CharacterState_1.CharacterState.jump;
  5257. }
  5258. }
  5259. else {
  5260. this.nowAction = CharacterState_1.CharacterState.jump;
  5261. }
  5262. }
  5263. };
  5264. Object.defineProperty(NpcScript.prototype, "nowAction", {
  5265. get: function () {
  5266. return this._nowAction;
  5267. },
  5268. set: function (value) {
  5269. if (this._nowRoleState == 1) {
  5270. if (this._nowAction != value || this.LastAction == CharacterState_1.CharacterState.speedupjump || this.LastAction == CharacterState_1.CharacterState.jumpright) {
  5271. this.LastAction = this._nowAction;
  5272. this._nowAction = value;
  5273. this._moveTime = 0;
  5274. switch (this._nowAction) {
  5275. case CharacterState_1.CharacterState.stand:
  5276. this._isActionNums = false;
  5277. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  5278. break;
  5279. case CharacterState_1.CharacterState.run:
  5280. if (this.LastAction == CharacterState_1.CharacterState.jump || this.LastAction == CharacterState_1.CharacterState.jumpleft || this.LastAction == CharacterState_1.CharacterState.jumpright) {
  5281. this._isActionNums = true;
  5282. this._isneedactionnum = 1;
  5283. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5284. if (sort < 50) {
  5285. this.PlayAnimator(CharacterState_1.CharacterState.land1);
  5286. }
  5287. else {
  5288. this.PlayAnimator(CharacterState_1.CharacterState.land2);
  5289. }
  5290. }
  5291. else {
  5292. this._isActionNums = false;
  5293. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5294. }
  5295. break;
  5296. case CharacterState_1.CharacterState.jump:
  5297. this.PlayAnimator(CharacterState_1.CharacterState.jump);
  5298. this._isActionNums = true;
  5299. this._isneedactionnum = 1;
  5300. this.jumpSpeed.x = this.frontjumpspeed.x;
  5301. this.jumpSpeed.y = this.frontjumpspeed.y;
  5302. this.jumpSpeed.z = this.frontjumpspeed.z;
  5303. break;
  5304. case CharacterState_1.CharacterState.jumpleft:
  5305. this.jumpSpeed = this.leftjumpspeed;
  5306. // this.jumpSpeed.x = this.leftjumpspeed.x;
  5307. // this.jumpSpeed.y = this.leftjumpspeed.y;
  5308. // this.jumpSpeed.z = this.leftjumpspeed.z;
  5309. this._isActionNums = true;
  5310. this._isneedactionnum = 1;
  5311. this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
  5312. break;
  5313. case CharacterState_1.CharacterState.jumpright:
  5314. this.jumpSpeed = this.rightjumpspeed;
  5315. // this.jumpSpeed.x = this.rightjumpspeed.x;
  5316. // this.jumpSpeed.y = this.rightjumpspeed.y;
  5317. // this.jumpSpeed.z = this.rightjumpspeed.z;
  5318. this._isActionNums = true;
  5319. this._isneedactionnum = 1;
  5320. this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
  5321. break;
  5322. case CharacterState_1.CharacterState.speedupjump:
  5323. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  5324. this.jumpSpeed.x = buildcfg.buffx;
  5325. this.jumpSpeed.y = buildcfg.buffy;
  5326. if (this.LastAction == CharacterState_1.CharacterState.speedupjump) {
  5327. this.jumpSpeed.z = this.jumpSpeed.z * buildcfg.buffz;
  5328. }
  5329. else {
  5330. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5331. }
  5332. if (this.NowLastActionState == value) {
  5333. this.jumpSpeed.y = buildcfg.buffy * 2;
  5334. }
  5335. else {
  5336. this.jumpSpeed.y = buildcfg.buffy;
  5337. }
  5338. this._isActionNums = true;
  5339. this._isneedactionnum = 1;
  5340. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  5341. if (sort < 50) {
  5342. this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
  5343. }
  5344. else {
  5345. this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
  5346. }
  5347. break;
  5348. case CharacterState_1.CharacterState.downmove:
  5349. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  5350. this.jumpSpeed.x = buildcfg.buffx;
  5351. this.jumpSpeed.y = buildcfg.buffy;
  5352. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5353. this._chixuTime = buildcfg.time;
  5354. this._isActionNums = true;
  5355. this._isneedactionnum = 1;
  5356. this.PlayAnimator(CharacterState_1.CharacterState.huachan);
  5357. break;
  5358. case CharacterState_1.CharacterState.cross:
  5359. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  5360. this.jumpSpeed.x = buildcfg.buffx;
  5361. this.jumpSpeed.y = buildcfg.buffy + 0.5;
  5362. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
  5363. this._chixuTime = buildcfg.time;
  5364. this._isActionNums = true;
  5365. this._isneedactionnum = 1;
  5366. this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
  5367. break;
  5368. case CharacterState_1.CharacterState.climbup:
  5369. case CharacterState_1.CharacterState.climbupblock:
  5370. this.jumpSpeed.x = 0;
  5371. this.jumpSpeed.y = this.climbspeed;
  5372. this.jumpSpeed.z = 0;
  5373. this._isActionNums = false;
  5374. this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
  5375. break;
  5376. case CharacterState_1.CharacterState.climbleft:
  5377. this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z);
  5378. // this.jumpSpeed.x = 0;
  5379. // this.jumpSpeed.y = this.sideclimbspeed.y;
  5380. // this.jumpSpeed.z = this.sideclimbspeed.z;
  5381. this._isActionNums = false;
  5382. this.PlayAnimator(CharacterState_1.CharacterState.runwallleft);
  5383. break;
  5384. case CharacterState_1.CharacterState.climbright:
  5385. this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z);
  5386. // this.jumpSpeed.x = 0;
  5387. // this.jumpSpeed.y = this.sideclimbspeed.y;
  5388. // this.jumpSpeed.z = this.sideclimbspeed.z;
  5389. this._isActionNums = false;
  5390. this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
  5391. break;
  5392. case CharacterState_1.CharacterState.ClimbMotion:
  5393. this._isActionNums = true;
  5394. this._isneedactionnum = 0;
  5395. this._needactiontime = 0.3;
  5396. this._moveTime = 0;
  5397. this.PlayAnimator(CharacterState_1.CharacterState.climbend);
  5398. break;
  5399. }
  5400. this.NowLastActionState = value;
  5401. }
  5402. }
  5403. },
  5404. enumerable: true,
  5405. configurable: true
  5406. });
  5407. NpcScript.prototype.update = function (dt) {
  5408. if (this._nowRoleState == 1) {
  5409. dt = 16;
  5410. this._checktime += dt;
  5411. if (PropManager_1.PropManager.iscarmanpc) {
  5412. }
  5413. else {
  5414. if (this._checktime >= 500) {
  5415. this._checktime = 0;
  5416. if (this._nowNpcinfo && PropManager_1.PropManager.mainRole) {
  5417. if (this._transform.position.z + this._nowNpcinfo.distance < PropManager_1.PropManager.mainRole.transform.position.z) {
  5418. this._iscanMove = false;
  5419. }
  5420. else {
  5421. this._iscanMove = true;
  5422. }
  5423. }
  5424. }
  5425. }
  5426. if (this._iscanMove) {
  5427. var distime = dt / 1000;
  5428. this._moveTime += distime;
  5429. switch (this.nowAction) {
  5430. case CharacterState_1.CharacterState.run: //跑动
  5431. this._moveVec.y = 0;
  5432. this._moveVec.z = distime * this._speedMoveV3.z;
  5433. if (this._lockxstate == 0) {
  5434. this._moveVec.x = this._changeMoveX * distime;
  5435. }
  5436. else if (this._lockxstate == 1) {
  5437. if (this._changeMoveX < 0) {
  5438. this._moveVec.x = 0;
  5439. }
  5440. else {
  5441. this._moveVec.x = this._changeMoveX * distime;
  5442. }
  5443. }
  5444. else if (this._lockxstate == 2) {
  5445. if (this._changeMoveX > 0) {
  5446. this._moveVec.x = 0;
  5447. }
  5448. else {
  5449. this._moveVec.x = this._changeMoveX * distime;
  5450. }
  5451. }
  5452. this._transform.translate(this._moveVec, false);
  5453. break;
  5454. case CharacterState_1.CharacterState.climbup: //爬升
  5455. this._moveVec.z = 0;
  5456. this._moveVec.y = distime * this.jumpSpeed.y;
  5457. if (this._lockxstate == 1) {
  5458. if (this._changeMoveX < 0) {
  5459. this._moveVec.x = 0;
  5460. }
  5461. else {
  5462. this._moveVec.x = this._changeMoveX * distime;
  5463. }
  5464. }
  5465. else if (this._lockstate == 2) {
  5466. if (this._changeMoveX > 0) {
  5467. this._moveVec.x = 0;
  5468. }
  5469. else {
  5470. this._moveVec.x = this._changeMoveX * distime;
  5471. }
  5472. }
  5473. else {
  5474. this._moveVec.x = this._changeMoveX * distime;
  5475. }
  5476. this._transform.translate(this._moveVec, false);
  5477. if (this._shangpaVec) {
  5478. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  5479. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5480. }
  5481. }
  5482. else if (this._nowselectVec) {
  5483. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  5484. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5485. }
  5486. }
  5487. break;
  5488. case CharacterState_1.CharacterState.climbupblock:
  5489. this._moveVec.z = 0;
  5490. this._moveVec.y = distime * this.jumpSpeed.y;
  5491. this._moveVec.x = 0;
  5492. this._transform.translate(this._moveVec, false);
  5493. if (this._shangpaVec) {
  5494. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  5495. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5496. }
  5497. }
  5498. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  5499. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  5500. }
  5501. break;
  5502. case CharacterState_1.CharacterState.jump: //跳跃
  5503. case CharacterState_1.CharacterState.jumpleft:
  5504. case CharacterState_1.CharacterState.jumpright:
  5505. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5506. this.jumpSpeed.y = this._disy;
  5507. this._moveVec.x = this.jumpSpeed.x * distime;
  5508. this._moveVec.y = this._disy * distime;
  5509. this._moveVec.z = this.jumpSpeed.z * distime;
  5510. this._transform.translate(this._moveVec, false);
  5511. break;
  5512. case CharacterState_1.CharacterState.speedupjump:
  5513. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5514. this.jumpSpeed.y = this._disy;
  5515. this._moveVec.x = this.jumpSpeed.x * distime;
  5516. this._moveVec.y = this._disy * distime;
  5517. this._moveVec.z = this.jumpSpeed.z * distime;
  5518. this._transform.translate(this._moveVec, false);
  5519. break;
  5520. case CharacterState_1.CharacterState.climbleft:
  5521. case CharacterState_1.CharacterState.climbright:
  5522. this._moveVec.z = distime * this.jumpSpeed.y;
  5523. this._moveVec.y = this.jumpSpeed.y * distime;
  5524. this._moveVec.x = 0;
  5525. this._transform.translate(this._moveVec, false);
  5526. break;
  5527. case CharacterState_1.CharacterState.MoveX:
  5528. this._moveVec.z = distime * this._speedMoveV3.z;
  5529. this._moveVec.x = this._speedMoveV3.x * distime;
  5530. this._transform.translate(this._moveVec, false);
  5531. if (this._moveTime > 0.1) {
  5532. this.nowAction = CharacterState_1.CharacterState.run;
  5533. }
  5534. break;
  5535. case CharacterState_1.CharacterState.downmove:
  5536. this._moveVec.y = this.jumpSpeed.x;
  5537. this._moveVec.x = this.jumpSpeed.y;
  5538. this._moveVec.z = this.jumpSpeed.z * distime;
  5539. this._transform.translate(this._moveVec, false);
  5540. if (this._moveTime > this._chixuTime) {
  5541. this.nowAction = CharacterState_1.CharacterState.run;
  5542. }
  5543. break;
  5544. case CharacterState_1.CharacterState.sidespeedup:
  5545. this._moveVec.y = 0;
  5546. this._moveVec.x = 0;
  5547. this._moveVec.z = this.jumpSpeed.z * distime;
  5548. this._transform.translate(this._moveVec, false);
  5549. if (this._moveTime > this._chixuTime && this.LastAction == CharacterState_1.CharacterState.climbleft || this.LastAction == CharacterState_1.CharacterState.climbright) {
  5550. this.nowAction = this.LastAction;
  5551. }
  5552. else {
  5553. this.nowAction = CharacterState_1.CharacterState.jump;
  5554. // this.setJump( this.nowAction );
  5555. }
  5556. break;
  5557. case CharacterState_1.CharacterState.cross:
  5558. this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
  5559. this.jumpSpeed.y = this._disy;
  5560. this._moveVec.x = this.jumpSpeed.x * distime;
  5561. this._moveVec.y = this._disy * distime;
  5562. this._moveVec.z = this.jumpSpeed.z * distime;
  5563. this._transform.translate(this._moveVec, false);
  5564. break;
  5565. case CharacterState_1.CharacterState.ClimbMotion:
  5566. if (this._nowselectVec) {
  5567. if (this._transform.position.y < this._nowselectVec.y) {
  5568. this._moveVec.x = 0;
  5569. this._moveVec.y = (1 / 0.3) * distime;
  5570. this._moveVec.z = 0;
  5571. this._transform.translate(this._moveVec, false);
  5572. }
  5573. }
  5574. break;
  5575. }
  5576. if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this.haveCollision) {
  5577. if (this._transform.position.z <= this._nowselectVec.z) {
  5578. if (this._changeMoveX > 0) {
  5579. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5580. }
  5581. else if (this._changeMoveX < 0) {
  5582. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5583. }
  5584. else {
  5585. this.nowAction = CharacterState_1.CharacterState.jump;
  5586. }
  5587. }
  5588. }
  5589. if (this._transform.position.y < PropManager_1.PropManager.diePosY) //角色死亡
  5590. {
  5591. if (this.stayscene == "" || this.staybuild == "") {
  5592. this._transform.position = this._initPosVec.clone();
  5593. }
  5594. else {
  5595. this._transform.position = PropManager_1.PropManager.getPosVecbyScene(this.stayscene, this.staybuild).clone();
  5596. }
  5597. this.nowAction = CharacterState_1.CharacterState.run;
  5598. }
  5599. if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) {
  5600. this.Win();
  5601. }
  5602. if (this._isActionNums) {
  5603. //如果当前播放state已经播放完了一次
  5604. if (this._isneedactionnum > 0) {
  5605. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  5606. switch (this._nowActionName) {
  5607. case CharacterState_1.CharacterState.jump:
  5608. case CharacterState_1.CharacterState.leftjump:
  5609. case CharacterState_1.CharacterState.rightjump:
  5610. case CharacterState_1.CharacterState.highjump1:
  5611. case CharacterState_1.CharacterState.highjump2:
  5612. case CharacterState_1.CharacterState.hurdle:
  5613. this._isActionNums = false;
  5614. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5615. break;
  5616. case CharacterState_1.CharacterState.huachan:
  5617. case CharacterState_1.CharacterState.climbend:
  5618. this._isActionNums = false;
  5619. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5620. this.nowAction = CharacterState_1.CharacterState.run;
  5621. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5622. break;
  5623. case CharacterState_1.CharacterState.land1:
  5624. case CharacterState_1.CharacterState.land2:
  5625. this._isActionNums = false;
  5626. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5627. break;
  5628. }
  5629. }
  5630. }
  5631. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  5632. switch (this._nowActionName) {
  5633. case CharacterState_1.CharacterState.jump:
  5634. case CharacterState_1.CharacterState.leftjump:
  5635. case CharacterState_1.CharacterState.rightjump:
  5636. case CharacterState_1.CharacterState.highjump1:
  5637. case CharacterState_1.CharacterState.highjump2:
  5638. case CharacterState_1.CharacterState.hurdle:
  5639. this._isActionNums = false;
  5640. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5641. break;
  5642. case CharacterState_1.CharacterState.huachan:
  5643. case CharacterState_1.CharacterState.climbend:
  5644. this._isActionNums = false;
  5645. this.PlayAnimator(CharacterState_1.CharacterState.run);
  5646. this.nowAction = CharacterState_1.CharacterState.run;
  5647. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  5648. break;
  5649. }
  5650. }
  5651. }
  5652. }
  5653. else {
  5654. if (this._ending) {
  5655. var distime = dt / 1000;
  5656. this._moveTime += distime;
  5657. if (this._moveTime >= this._endanmotime) {
  5658. this.GameOver();
  5659. }
  5660. else {
  5661. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  5662. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  5663. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  5664. PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
  5665. }
  5666. }
  5667. }
  5668. }
  5669. };
  5670. NpcScript.prototype.GameOver = function () {
  5671. this._ending = false;
  5672. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5673. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
  5674. };
  5675. NpcScript.prototype.Win = function () {
  5676. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5677. this._nowRoleState = 2;
  5678. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  5679. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.npcend, this.owner.name);
  5680. };
  5681. NpcScript.prototype.stop = function () {
  5682. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5683. };
  5684. NpcScript.prototype.destroy = function () {
  5685. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  5686. _super.prototype.destroy.call(this);
  5687. };
  5688. NpcScript.prototype.Joy = function (value, angle) {
  5689. if (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
  5690. this._changeMoveX = value;
  5691. }
  5692. if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
  5693. {
  5694. this.HaveForceJump = true;
  5695. this.nowAction = CharacterState_1.CharacterState.jumpright;
  5696. }
  5697. else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
  5698. this.HaveForceJump = true;
  5699. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  5700. }
  5701. if (this.nowAction == CharacterState_1.CharacterState.jump ||
  5702. this.nowAction == CharacterState_1.CharacterState.jumpleft ||
  5703. this.nowAction == CharacterState_1.CharacterState.jumpright ||
  5704. this.nowAction == CharacterState_1.CharacterState.speedupjump)
  5705. angle = -angle * Math.PI / 180;
  5706. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  5707. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  5708. };
  5709. NpcScript.prototype.PlayAnimator = function (actionName) {
  5710. // this._nowActionName = actionName;
  5711. var _actionname = this.TransitionActionName(actionName);
  5712. this._nowActionName = actionName;
  5713. if (this._animator) {
  5714. if (this._nowActionName == CharacterState_1.CharacterState.climbend) {
  5715. this._animator.speed = 1.5;
  5716. }
  5717. else {
  5718. this._animator.speed = 1;
  5719. }
  5720. this._animator.play(_actionname, 0, 0);
  5721. }
  5722. };
  5723. /**转换动作名称 */
  5724. NpcScript.prototype.TransitionActionName = function (_actionname) {
  5725. switch (_actionname) {
  5726. case "rollover1":
  5727. return "cefan1";
  5728. case "rollover2":
  5729. return "cefan2";
  5730. case "runwallleft":
  5731. return "paoqiangleft";
  5732. case "rightjump":
  5733. return "rightjump";
  5734. case "runwallright":
  5735. return "paoqiangright";
  5736. case "leftjump":
  5737. return "leftjump";
  5738. case "climbwall":
  5739. return "paqiang";
  5740. case "climbend":
  5741. return "climbend";
  5742. case "stand":
  5743. return "stand";
  5744. case "sky":
  5745. return "kongzhong";
  5746. case "land1":
  5747. return "luodi1";
  5748. case "land2":
  5749. return "luodi2";
  5750. case "highjump1":
  5751. return "datiao1";
  5752. case "highjump2":
  5753. return "datiao2";
  5754. case "run":
  5755. return "run";
  5756. case "jump":
  5757. return "jump";
  5758. case "climbup":
  5759. return "Climb";
  5760. case "falldown":
  5761. return "Freefalling";
  5762. case "climbleft":
  5763. return "left_climb";
  5764. case "climbright":
  5765. return "right_climb";
  5766. case "jumpright":
  5767. return "right_jump";
  5768. case "jumpleft":
  5769. return "left_jump";
  5770. case "ClimbMotion":
  5771. return "PlayPalouAction";
  5772. case "huachan":
  5773. return "huachan";
  5774. case "hurdle":
  5775. return "kualan";
  5776. case "speedupjump":
  5777. return "jiasuJump";
  5778. case "MoveX":
  5779. return "xshunyi";
  5780. case "downmove":
  5781. return "downSlide";
  5782. case "sidespeedup":
  5783. return "slidejiasu";
  5784. case "cross":
  5785. return "surmount";
  5786. case "climbupblock":
  5787. return "lockclimb";
  5788. }
  5789. };
  5790. NpcScript.prototype.TestJump = function () {
  5791. this.nowAction = CharacterState_1.CharacterState.jump;
  5792. };
  5793. NpcScript.prototype.getPostion = function () {
  5794. return this._transform.position;
  5795. };
  5796. NpcScript.prototype.getAction = function () {
  5797. return this._nowRoleState;
  5798. };
  5799. NpcScript.prototype.onDestroy = function () {
  5800. PoolManager_1.default.RecoverSprite3D(this.LeftTrial);
  5801. PoolManager_1.default.RecoverSprite3D(this.RightTrial);
  5802. };
  5803. return NpcScript;
  5804. }(Laya.Script3D));
  5805. exports.NpcScript = NpcScript;
  5806. },{"../CFG/BuildCFG":9,"../Control/AssetManager":17,"../Control/PoolManager":26,"../PrefabControl/CharacterState":46,"../PrefabControl/PropManager":49,"../Time/TimerService":59,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/GameUtils":87,"./CameraManager":38}],40:[function(require,module,exports){
  5807. "use strict";
  5808. Object.defineProperty(exports, "__esModule", { value: true });
  5809. var TimerService_1 = require("../Time/TimerService");
  5810. var PropManager_1 = require("../PrefabControl/PropManager");
  5811. var CharacterState_1 = require("../PrefabControl/CharacterState");
  5812. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  5813. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  5814. var BuildCFG_1 = require("../CFG/BuildCFG");
  5815. var CameraManager_1 = require("./CameraManager");
  5816. var DispatcherManager_1 = require("../utils/DispatcherManager");
  5817. var GameState_1 = require("../utils/GameState");
  5818. var GameUtils_1 = require("../utils/GameUtils");
  5819. var GameStateControl_1 = require("../Control/GameStateControl");
  5820. var AudioControl_1 = require("../Control/AudioControl");
  5821. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  5822. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  5823. var AssetManager_1 = require("../Control/AssetManager");
  5824. var PoolManager_1 = require("../Control/PoolManager");
  5825. var Player = /** @class */ (function (_super) {
  5826. __extends(Player, _super);
  5827. function Player() {
  5828. var _this = _super.call(this) || this;
  5829. _this._isActionNums = false;
  5830. _this._isneedactionnum = 0;
  5831. _this._needactiontime = 0;
  5832. _this._nowActionState = "";
  5833. _this._multiple = new Laya.Vector3(1, 1, 1);
  5834. _this.LastActionState = "";
  5835. _this._moveTime = 0;
  5836. /**
  5837. * 加速buffvec
  5838. */
  5839. _this._lastjiasuState = "";
  5840. _this.buff_speeduptime = 0;
  5841. _this.canshake = false;
  5842. _this.shaketime = 0;
  5843. _this.doublespeedup = false;
  5844. _this.resouseName = "";
  5845. _this._isColling = false;
  5846. _this._nowCollTargetName = "";
  5847. _this._normalizeVec = new Laya.Vector3;
  5848. _this._nowbuildname = "";
  5849. _this._nowscenename = "";
  5850. /**
  5851. * 0:未锁,1:锁左边,2:锁右边
  5852. */
  5853. _this._lockxstate = 0;
  5854. _this._lockbyBuildname = "";
  5855. /**
  5856. * 0:未被锁,1:锁定左边,2:锁定右边,
  5857. */
  5858. _this._lockstate = 0;
  5859. _this._shangpaVec = new Laya.Vector3;
  5860. _this.NowLastActionState = "";
  5861. _this._moveVec = new Laya.Vector3;
  5862. _this.jumpSpeed = new Laya.Vector3;
  5863. _this.jumpHight = 0;
  5864. _this._disy = 0;
  5865. _this.g = 10; //重力加速度
  5866. _this._ending = false;
  5867. _this._endAnmoSpeed = new Laya.Vector3();
  5868. _this._endanmotime = 1;
  5869. _this._endAnmoSpeed1 = new Laya.Vector3;
  5870. _this._changeMoveX = 0;
  5871. _this.isforceJump = false;
  5872. _this.quaternion = new Laya.Quaternion;
  5873. Player.ins = _this;
  5874. return _this;
  5875. }
  5876. Object.defineProperty(Player, "Instance", {
  5877. get: function () {
  5878. if (Player.ins == null) {
  5879. return new Player();
  5880. }
  5881. return Player.ins;
  5882. },
  5883. enumerable: true,
  5884. configurable: true
  5885. });
  5886. Player.prototype.onAwake = function () {
  5887. this._animator = this.owner.getComponent(Laya.Animator);
  5888. PropManager_1.PropManager.setAnimator(this._animator);
  5889. this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
  5890. var sp = this.owner;
  5891. this._transform = sp.transform;
  5892. this._RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
  5893. sp.getComponent(Laya.Rigidbody3D).ccdMotionThreshold = 0.001;
  5894. var LeftTrial1 = sp.getChildByName("lefttrail");
  5895. var RightTrial1 = sp.getChildByName("righttrail");
  5896. // this.LeftTrial = sp.getChildByName("lefttrail") as Laya.TrailSprite3D;
  5897. // this.RightTrial = sp.getChildByName("righttrail") as Laya.TrailSprite3D;
  5898. var scale = 0.001;
  5899. var index = GameUtils_1.GameUtils.randRangeint(0, AssetManager_1.AssetManager.AllMapDic.length - 1);
  5900. index = index % AssetManager_1.AssetManager.AllMapDic.length;
  5901. var prefabs = AssetManager_1.AssetManager.AllMapDic[index];
  5902. this.LeftTrial = PoolManager_1.default.GetSprite3D(prefabs);
  5903. LeftTrial1.parent.addChild(this.LeftTrial);
  5904. this.LeftTrial.transform.localPosition = LeftTrial1.transform.localPosition.clone();
  5905. this.LeftTrial.transform.localRotationEuler = LeftTrial1.transform.localRotationEuler.clone();
  5906. this.LeftTrial.transform.localScale = LeftTrial1.transform.localScale.clone();
  5907. this.LeftTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
  5908. this.RightTrial = PoolManager_1.default.GetSprite3D(prefabs);
  5909. RightTrial1.parent.addChild(this.RightTrial);
  5910. this.RightTrial.transform.localPosition = RightTrial1.transform.localPosition.clone();
  5911. this.RightTrial.transform.localRotationEuler = RightTrial1.transform.localRotationEuler.clone();
  5912. this.RightTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
  5913. RightTrial1.active = false;
  5914. LeftTrial1.active = false;
  5915. };
  5916. Player.prototype.startRun = function (jiasu) {
  5917. var _this = this;
  5918. if (this._RoleData.roleCfg.gravity) {
  5919. this.g = this._RoleData.roleCfg.gravity;
  5920. }
  5921. else {
  5922. this.g = 10;
  5923. }
  5924. this._multiple.x = 1;
  5925. this._multiple.y = 1;
  5926. this._multiple.z = 1;
  5927. this.buff_speeduptime = 0;
  5928. this.doublespeedup = false;
  5929. this._lastjiasuState = "";
  5930. this._ending = false;
  5931. this._changeMoveX = 0;
  5932. this._initPosVec = this._transform.position.clone();
  5933. console.log("玩家的初始位置----", this._initPosVec);
  5934. this._nowbuildname = "";
  5935. this._nowscenename = "";
  5936. this.nowAction = CharacterState_1.CharacterState.run;
  5937. this._speedMoveV3.x = 0;
  5938. this._speedMoveV3.y = 0;
  5939. if (jiasu) {
  5940. this._speedMoveV3.z = -this._RoleData.movespeed * 2;
  5941. Laya.timer.once(3000, this, function () {
  5942. _this._speedMoveV3.z = -_this._RoleData.movespeed;
  5943. });
  5944. }
  5945. else {
  5946. this._speedMoveV3.z = -this._RoleData.movespeed;
  5947. }
  5948. this._iscanMove = true;
  5949. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  5950. };
  5951. // private pzdict:any = {};
  5952. // private pzarr:Array<any> = [];
  5953. /**
  5954. * 开始碰撞时执行
  5955. */
  5956. Player.prototype.onCollisionEnter = function (collision) {
  5957. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5958. var contactPoint = collision.contacts[0];
  5959. this.Calculate(contactPoint.normal, collision.other.owner, contactPoint.positionOnB);
  5960. }
  5961. };
  5962. /**
  5963. * 持续碰撞时执行
  5964. */
  5965. Player.prototype.onCollisionStay = function (collision) {
  5966. // Debuger.log( "碰撞中" );
  5967. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5968. this._isColling = true;
  5969. var contactPoint = collision.contacts[0];
  5970. var target = collision.other.owner;
  5971. var targetname = target.name;
  5972. if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1) {
  5973. this._nowCollTargetName = targetname;
  5974. }
  5975. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  5976. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  5977. {
  5978. if (this._nowCollTargetName.indexOf("build") != -1) {
  5979. this._nowbuildname = this._nowCollTargetName;
  5980. this._nowscenename = target.parent.parent.name;
  5981. }
  5982. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  5983. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  5984. }
  5985. else {
  5986. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  5987. }
  5988. }
  5989. }
  5990. };
  5991. /**
  5992. * 结束碰撞时执行
  5993. */
  5994. Player.prototype.onCollisionExit = function (collision) {
  5995. this._isColling = false;
  5996. if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
  5997. var contactPoint = collision.contacts[0];
  5998. this.CheckEnd(contactPoint.normal, collision.other.owner);
  5999. }
  6000. };
  6001. /**检测结束碰撞 */
  6002. Player.prototype.CheckEnd = function (normal, target) {
  6003. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  6004. return;
  6005. }
  6006. if (this.isforceJump) {
  6007. this.isforceJump = false;
  6008. return;
  6009. }
  6010. if (this._lockxstate) {
  6011. this._lockxstate = 0;
  6012. return;
  6013. }
  6014. if (this._nowCollTargetName != target.name) {
  6015. return;
  6016. }
  6017. if (target.name.indexOf("panel_jump") != -1) {
  6018. return;
  6019. }
  6020. switch (this.nowAction) {
  6021. case CharacterState_1.CharacterState.climbup:
  6022. case CharacterState_1.CharacterState.climbupblock:
  6023. if (this._nowCollTargetName.indexOf("box_Board") != -1) {
  6024. this.JumpAction(this._changeMoveX);
  6025. }
  6026. else {
  6027. if (this._changeMoveX > 0) {
  6028. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6029. }
  6030. else if (this._changeMoveX < 0) {
  6031. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6032. }
  6033. }
  6034. break;
  6035. case CharacterState_1.CharacterState.climbright:
  6036. case CharacterState_1.CharacterState.climbleft:
  6037. this.JumpAction(this._changeMoveX);
  6038. break;
  6039. case CharacterState_1.CharacterState.run:
  6040. this.JumpAction(this._changeMoveX);
  6041. break;
  6042. case CharacterState_1.CharacterState.MoveX:
  6043. this.JumpAction(this._speedMoveV3.x);
  6044. break;
  6045. }
  6046. };
  6047. Player.prototype.setnowSelectVec = function (pos) {
  6048. this._nowselectVec = pos;
  6049. };
  6050. /**计算碰撞 */
  6051. Player.prototype.Calculate = function (normal, target, collpoint) {
  6052. if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
  6053. return;
  6054. }
  6055. this._nowCollTargetName = target.name;
  6056. var n = new Laya.Vector3;
  6057. Laya.Vector3.normalize(normal, this._normalizeVec);
  6058. if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
  6059. this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
  6060. {
  6061. if (this._nowCollTargetName.indexOf("build") != -1) {
  6062. this._nowbuildname = this._nowCollTargetName;
  6063. this._nowscenename = target.parent.parent.name;
  6064. }
  6065. if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  6066. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
  6067. }
  6068. else {
  6069. this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
  6070. }
  6071. if (this._normalizeVec.z == -1) //上爬
  6072. {
  6073. if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.2)) {
  6074. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  6075. this.nowAction = CharacterState_1.CharacterState.run;
  6076. }
  6077. else {
  6078. this.nowAction = CharacterState_1.CharacterState.climbup;
  6079. this._shangpaVec = this._nowselectVec.clone();
  6080. }
  6081. }
  6082. else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
  6083. this.nowAction = CharacterState_1.CharacterState.run;
  6084. }
  6085. else if (this._normalizeVec.x == -1) {
  6086. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6087. this._lockxstate = 1;
  6088. }
  6089. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  6090. this._lockxstate = 1;
  6091. }
  6092. else {
  6093. this.nowAction = CharacterState_1.CharacterState.climbleft;
  6094. }
  6095. }
  6096. else if (this._normalizeVec.x == 1) {
  6097. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6098. this._lockxstate = 2;
  6099. }
  6100. else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
  6101. this._lockxstate = 2;
  6102. }
  6103. else {
  6104. this.nowAction = CharacterState_1.CharacterState.climbright;
  6105. }
  6106. }
  6107. else {
  6108. if (this._normalizeVec.z != 1) {
  6109. this.nowAction = CharacterState_1.CharacterState.climbupblock;
  6110. this._shangpaVec = this._nowselectVec.clone();
  6111. }
  6112. }
  6113. }
  6114. else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃
  6115. {
  6116. this.nowAction = CharacterState_1.CharacterState.speedupjump;
  6117. }
  6118. else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) {
  6119. this.nowAction = CharacterState_1.CharacterState.downmove;
  6120. }
  6121. else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
  6122. if (this._normalizeVec.z == -1) //上爬
  6123. {
  6124. this.nowAction = CharacterState_1.CharacterState.climbup;
  6125. this._shangpaVec = this._nowselectVec.clone();
  6126. }
  6127. }
  6128. else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) {
  6129. this.nowAction = CharacterState_1.CharacterState.sidespeedup;
  6130. }
  6131. else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) {
  6132. this.nowAction = CharacterState_1.CharacterState.cross;
  6133. }
  6134. else if (this._nowCollTargetName.indexOf("irongauze") != -1) {
  6135. this.nowAction = CharacterState_1.CharacterState.climbup;
  6136. this._shangpaVec = this._nowselectVec.clone();
  6137. }
  6138. };
  6139. Player.prototype.JumpAction = function (value) {
  6140. if (value > 0) {
  6141. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6142. // this.setJump( this.nowAction );
  6143. }
  6144. else if (value < 0) {
  6145. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6146. // this.setJump( this.nowAction );
  6147. }
  6148. else {
  6149. this.nowAction = CharacterState_1.CharacterState.jump;
  6150. // this.setJump( this.nowAction );
  6151. }
  6152. };
  6153. Player.prototype.PlayAnimator = function (actionName) {
  6154. var _actionname = this.TransitionActionName(actionName);
  6155. this._StateName = actionName;
  6156. if (this._animator) {
  6157. if (this._StateName == CharacterState_1.CharacterState.climbend || this._StateName == CharacterState_1.CharacterState.land1 || this._StateName == CharacterState_1.CharacterState.land2) {
  6158. this._animator.speed = 1.5;
  6159. }
  6160. else {
  6161. this._animator.speed = 1;
  6162. }
  6163. this._animator.play(_actionname, 0, 0);
  6164. }
  6165. };
  6166. /**转换动作名称 */
  6167. Player.prototype.TransitionActionName = function (_actionname) {
  6168. switch (_actionname) {
  6169. case "rollover1":
  6170. return "cefan1";
  6171. case "rollover2":
  6172. return "cefan2";
  6173. case "runwallleft":
  6174. return "paoqiangleft";
  6175. case "rightjump":
  6176. return "rightjump";
  6177. case "runwallright":
  6178. return "paoqiangright";
  6179. case "leftjump":
  6180. return "leftjump";
  6181. case "climbwall":
  6182. return "paqiang";
  6183. case "climbend":
  6184. return "climbend";
  6185. case "stand":
  6186. return "stand";
  6187. case "sky":
  6188. return "kongzhong";
  6189. case "land1":
  6190. return "luodi1";
  6191. case "land2":
  6192. return "luodi2";
  6193. case "highjump1":
  6194. return "datiao1";
  6195. case "highjump2":
  6196. return "datiao2";
  6197. case "run":
  6198. return "run";
  6199. case "jump":
  6200. return "jump";
  6201. case "climbup":
  6202. return "Climb";
  6203. case "falldown":
  6204. return "Freefalling";
  6205. case "climbleft":
  6206. return "left_climb";
  6207. case "climbright":
  6208. return "right_climb";
  6209. case "jumpright":
  6210. return "right_jump";
  6211. case "jumpleft":
  6212. return "left_jump";
  6213. case "ClimbMotion":
  6214. return "PlayPalouAction";
  6215. case "huachan":
  6216. return "huachan";
  6217. case "hurdle":
  6218. return "kualan";
  6219. case "speedupjump":
  6220. return "jiasuJump";
  6221. case "MoveX":
  6222. return "xshunyi";
  6223. case "downmove":
  6224. return "downSlide";
  6225. case "sidespeedup":
  6226. return "slidejiasu";
  6227. case "cross":
  6228. return "surmount";
  6229. case "climbupblock":
  6230. return "lockclimb";
  6231. }
  6232. };
  6233. Object.defineProperty(Player.prototype, "nowAction", {
  6234. get: function () {
  6235. return this._nowActionState;
  6236. },
  6237. set: function (value) {
  6238. if (this._nowActionState != value || this.LastActionState == CharacterState_1.CharacterState.speedupjump || this._nowActionState == CharacterState_1.CharacterState.speedupjump) {
  6239. this.LastActionState = this._nowActionState;
  6240. this._nowActionState = value;
  6241. this._moveTime = 0;
  6242. this.canshake = false;
  6243. this.ChangeTrial(true);
  6244. switch (this._nowActionState) {
  6245. case CharacterState_1.CharacterState.stand:
  6246. this._isActionNums = false;
  6247. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6248. break;
  6249. case CharacterState_1.CharacterState.run:
  6250. if (this.LastActionState == CharacterState_1.CharacterState.jump || this.LastActionState == CharacterState_1.CharacterState.jumpleft || this.LastActionState == CharacterState_1.CharacterState.jumpright) {
  6251. this._isActionNums = true;
  6252. this._isneedactionnum = 1;
  6253. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  6254. if (sort < 50) {
  6255. this.PlayAnimator(CharacterState_1.CharacterState.land1);
  6256. }
  6257. else {
  6258. this.PlayAnimator(CharacterState_1.CharacterState.land2);
  6259. }
  6260. }
  6261. else {
  6262. this._isActionNums = false;
  6263. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6264. }
  6265. break;
  6266. case CharacterState_1.CharacterState.jump:
  6267. this.PlayAnimator(CharacterState_1.CharacterState.jump);
  6268. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6269. this._isActionNums = true;
  6270. this._isneedactionnum = 1;
  6271. this.jumpSpeed.x = this._RoleData.frontjump.x;
  6272. this.jumpSpeed.y = this._RoleData.frontjump.y;
  6273. this.jumpSpeed.z = this._RoleData.frontjump.z;
  6274. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6275. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6276. break;
  6277. case CharacterState_1.CharacterState.jumpleft:
  6278. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6279. this.jumpSpeed.x = this._RoleData.leftjump.x;
  6280. this.jumpSpeed.y = this._RoleData.leftjump.y;
  6281. this.jumpSpeed.z = this._RoleData.leftjump.z;
  6282. this._isActionNums = true;
  6283. this._isneedactionnum = 1;
  6284. this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
  6285. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6286. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6287. break;
  6288. case CharacterState_1.CharacterState.jumpright:
  6289. PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
  6290. this.jumpSpeed.x = this._RoleData.rightjump.x;
  6291. this.jumpSpeed.y = this._RoleData.rightjump.y;
  6292. this.jumpSpeed.z = this._RoleData.rightjump.z;
  6293. this._isActionNums = true;
  6294. this._isneedactionnum = 1;
  6295. this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
  6296. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6297. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6298. break;
  6299. case CharacterState_1.CharacterState.speedupjump:
  6300. var buildcfg = BuildCFG_1.default.dict["panel_jump"];
  6301. if (this.buff_speeduptime > 0) {
  6302. this._multiple.x = 1;
  6303. this._multiple.y = 1;
  6304. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6305. this.doublespeedup = true;
  6306. }
  6307. else {
  6308. this._multiple.x = 1;
  6309. this._multiple.y = 1;
  6310. this._multiple.z = buildcfg.buffz;
  6311. }
  6312. this.buff_speeduptime = buildcfg.time;
  6313. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6314. if (this.NowLastActionState == value) {
  6315. this.jumpSpeed.y = buildcfg.buffy * 2;
  6316. }
  6317. else {
  6318. this.jumpSpeed.y = buildcfg.buffy;
  6319. }
  6320. this.jumpSpeed.y = buildcfg.buffy;
  6321. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6322. this._isActionNums = true;
  6323. this._isneedactionnum = 1;
  6324. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  6325. if (sort < 50) {
  6326. this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
  6327. }
  6328. else {
  6329. this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
  6330. }
  6331. AudioControl_1.AudioControl.Instance.playGameSound("tiao");
  6332. Laya.timer.clear(this, this.playspeedSound);
  6333. Laya.timer.once(200, this, this.playspeedSound);
  6334. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6335. break;
  6336. case CharacterState_1.CharacterState.downmove:
  6337. var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
  6338. if (this.buff_speeduptime > 0) {
  6339. this._multiple.x = 1;
  6340. this._multiple.y = 1;
  6341. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6342. this.doublespeedup = true;
  6343. }
  6344. else {
  6345. this._multiple.x = 1;
  6346. this._multiple.y = 1;
  6347. this._multiple.z = buildcfg.buffz;
  6348. }
  6349. this.buff_speeduptime = buildcfg.time;
  6350. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6351. this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
  6352. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6353. this._isActionNums = true;
  6354. this._isneedactionnum = 1;
  6355. this.PlayAnimator(CharacterState_1.CharacterState.huachan);
  6356. this.playspeedSound();
  6357. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6358. break;
  6359. case CharacterState_1.CharacterState.sidespeedup:
  6360. var buildcfg = BuildCFG_1.default.dict["box_sidejump"];
  6361. if (this.buff_speeduptime > 0) {
  6362. this._multiple.x = 1;
  6363. this._multiple.y = 1;
  6364. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6365. this.doublespeedup = true;
  6366. }
  6367. else {
  6368. this._multiple.x = 1;
  6369. this._multiple.y = 1;
  6370. this._multiple.z = buildcfg.buffz;
  6371. }
  6372. this.buff_speeduptime = buildcfg.time;
  6373. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6374. this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
  6375. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6376. this._isActionNums = false;
  6377. this.playspeedSound();
  6378. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6379. // this.PlayAnimator( CharacterState. );
  6380. break;
  6381. case CharacterState_1.CharacterState.cross:
  6382. var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
  6383. if (this.buff_speeduptime > 0) {
  6384. this._multiple.x = 1;
  6385. this._multiple.y = 1;
  6386. this._multiple.z = buildcfg.buffz * buildcfg.buffz;
  6387. this.doublespeedup = true;
  6388. }
  6389. else {
  6390. this._multiple.x = 1;
  6391. this._multiple.y = 1;
  6392. this._multiple.z = buildcfg.buffz;
  6393. }
  6394. this.buff_speeduptime = buildcfg.time;
  6395. this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
  6396. this.jumpSpeed.y = (buildcfg.buffy + 0.5) * this._multiple.y;
  6397. this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
  6398. this._isActionNums = true;
  6399. this._isneedactionnum = 1;
  6400. this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
  6401. break;
  6402. case CharacterState_1.CharacterState.climbup:
  6403. case CharacterState_1.CharacterState.climbupblock:
  6404. this.jumpSpeed.x = 0;
  6405. this.jumpSpeed.y = this._RoleData.upclimb;
  6406. this.jumpSpeed.z = 0;
  6407. this._isActionNums = false;
  6408. this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
  6409. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6410. this.canshake = true;
  6411. this.shaketime = 0;
  6412. this.ChangeTrial(false);
  6413. break;
  6414. case CharacterState_1.CharacterState.climbleft:
  6415. this.jumpSpeed.x = 0;
  6416. this.jumpSpeed.y = this._RoleData.slideclimb.y;
  6417. this.jumpSpeed.z = this._RoleData.slideclimb.z;
  6418. this._isActionNums = false;
  6419. this.PlayAnimator(CharacterState_1.CharacterState.runwallleft);
  6420. this.ChangeTrial(false);
  6421. break;
  6422. case CharacterState_1.CharacterState.climbright:
  6423. this.jumpSpeed.x = 0;
  6424. this.jumpSpeed.y = this._RoleData.slideclimb.y;
  6425. this.jumpSpeed.z = this._RoleData.slideclimb.z;
  6426. this._isActionNums = false;
  6427. this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
  6428. this.ChangeTrial(false);
  6429. break;
  6430. case CharacterState_1.CharacterState.ClimbMotion:
  6431. this._isActionNums = true;
  6432. this._isneedactionnum = 0;
  6433. this._needactiontime = 0.3;
  6434. this._moveTime = 0;
  6435. this.PlayAnimator(CharacterState_1.CharacterState.climbend);
  6436. break;
  6437. }
  6438. this.NowLastActionState = value;
  6439. }
  6440. },
  6441. enumerable: true,
  6442. configurable: true
  6443. });
  6444. Player.prototype.playspeedSound = function () {
  6445. AudioControl_1.AudioControl.Instance.playGameSound("speedup");
  6446. };
  6447. Player.prototype.ChangeTrial = function (bo) {
  6448. if (this.LeftTrial && this.RightTrial && this.LeftTrial.active != bo) {
  6449. this.LeftTrial.active = bo;
  6450. this.RightTrial.active = bo;
  6451. }
  6452. };
  6453. Player.prototype.Joy = function (value, value1, angle) {
  6454. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6455. this._changeMoveX = value;
  6456. }
  6457. else if (this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
  6458. this._changeMoveX = value1;
  6459. }
  6460. if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
  6461. {
  6462. this.isforceJump = true;
  6463. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6464. }
  6465. else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
  6466. this.isforceJump = true;
  6467. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6468. }
  6469. if (this.nowAction == CharacterState_1.CharacterState.jump ||
  6470. this.nowAction == CharacterState_1.CharacterState.jumpleft ||
  6471. this.nowAction == CharacterState_1.CharacterState.jumpright ||
  6472. this.nowAction == CharacterState_1.CharacterState.speedupjump) {
  6473. angle = -angle * Math.PI / 180;
  6474. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
  6475. var jumpz = this.jumpSpeed.z;
  6476. Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
  6477. this.jumpSpeed.z = jumpz;
  6478. }
  6479. };
  6480. Player.prototype.update = function (dt) {
  6481. dt = 16;
  6482. if (this._iscanMove) {
  6483. var distime = dt / 1000;
  6484. this._moveTime += distime;
  6485. switch (this.nowAction) {
  6486. case CharacterState_1.CharacterState.run: //跑动
  6487. this._moveVec.y = 0;
  6488. this._moveVec.z = distime * (this._speedMoveV3.z * this._multiple.z);
  6489. if (this._lockxstate == 0) {
  6490. this._moveVec.x = this._changeMoveX * distime;
  6491. }
  6492. else if (this._lockxstate == 1) {
  6493. if (this._changeMoveX < 0) {
  6494. this._moveVec.x = 0;
  6495. }
  6496. else {
  6497. this._moveVec.x = this._changeMoveX * distime;
  6498. }
  6499. }
  6500. else if (this._lockxstate == 2) {
  6501. if (this._changeMoveX > 0) {
  6502. this._moveVec.x = 0;
  6503. }
  6504. else {
  6505. this._moveVec.x = this._changeMoveX * distime;
  6506. }
  6507. }
  6508. this._transform.translate(this._moveVec, false);
  6509. break;
  6510. case CharacterState_1.CharacterState.climbup: //爬升
  6511. this._moveVec.z = 0;
  6512. this._moveVec.y = distime * this.jumpSpeed.y;
  6513. if (this._lockxstate == 1) {
  6514. if (this._changeMoveX < 0) {
  6515. this._moveVec.x = 0;
  6516. }
  6517. else {
  6518. this._moveVec.x = this._changeMoveX * distime;
  6519. }
  6520. }
  6521. else if (this._lockstate == 2) {
  6522. if (this._changeMoveX > 0) {
  6523. this._moveVec.x = 0;
  6524. }
  6525. else {
  6526. this._moveVec.x = this._changeMoveX * distime;
  6527. }
  6528. }
  6529. else {
  6530. this._moveVec.x = this._changeMoveX * distime;
  6531. }
  6532. this._transform.translate(this._moveVec, false);
  6533. if (this._shangpaVec) {
  6534. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  6535. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6536. }
  6537. }
  6538. else if (this._nowselectVec) {
  6539. if (this._transform.position.y + 1 > this._nowselectVec.y) {
  6540. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6541. }
  6542. }
  6543. break;
  6544. case CharacterState_1.CharacterState.climbupblock:
  6545. this._moveVec.z = 0;
  6546. this._moveVec.y = distime * this.jumpSpeed.y;
  6547. this._moveVec.x = 0;
  6548. this._transform.translate(this._moveVec, false);
  6549. if (this._shangpaVec) {
  6550. if (this._transform.position.y + 1 > this._shangpaVec.y) {
  6551. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6552. }
  6553. }
  6554. else if (this._transform.position.y + 1 > this._nowselectVec.y) {
  6555. this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
  6556. }
  6557. break;
  6558. case CharacterState_1.CharacterState.jump: //跳跃
  6559. case CharacterState_1.CharacterState.jumpleft:
  6560. case CharacterState_1.CharacterState.jumpright:
  6561. this._disy = this.jumpSpeed.y - this.g * distime;
  6562. this.jumpSpeed.y = this._disy;
  6563. this._moveVec.x = this.jumpSpeed.x * distime;
  6564. this._moveVec.y = this._disy * distime;
  6565. this._moveVec.z = this.jumpSpeed.z * distime;
  6566. this._transform.translate(this._moveVec, false);
  6567. break;
  6568. case CharacterState_1.CharacterState.speedupjump:
  6569. this._disy = this.jumpSpeed.y - this.g * distime;
  6570. this.jumpSpeed.y = this._disy;
  6571. this._moveVec.x = this.jumpSpeed.x * distime;
  6572. this._moveVec.y = this._disy * distime;
  6573. this._moveVec.z = this.jumpSpeed.z * distime;
  6574. this._transform.translate(this._moveVec, false);
  6575. break;
  6576. case CharacterState_1.CharacterState.climbleft:
  6577. case CharacterState_1.CharacterState.climbright:
  6578. this._moveVec.z = distime * this.jumpSpeed.y;
  6579. this._moveVec.y = this.jumpSpeed.y * distime;
  6580. this._moveVec.x = 0;
  6581. this._transform.translate(this._moveVec, false);
  6582. break;
  6583. case CharacterState_1.CharacterState.MoveX:
  6584. this._moveVec.z = distime * this._speedMoveV3.z;
  6585. this._moveVec.x = this._speedMoveV3.x * distime;
  6586. this._transform.translate(this._moveVec, false);
  6587. if (this._moveTime > 0.1) {
  6588. this.nowAction = CharacterState_1.CharacterState.run;
  6589. }
  6590. break;
  6591. case CharacterState_1.CharacterState.downmove:
  6592. this._moveVec.y = this.jumpSpeed.x;
  6593. this._moveVec.x = this.jumpSpeed.y;
  6594. this._moveVec.z = this.jumpSpeed.z * distime;
  6595. this._transform.translate(this._moveVec, false);
  6596. break;
  6597. case CharacterState_1.CharacterState.sidespeedup:
  6598. this._moveVec.y = 0;
  6599. this._moveVec.x = 0;
  6600. this._moveVec.z = this.jumpSpeed.z * distime;
  6601. this._transform.translate(this._moveVec, false);
  6602. if (this.buff_speeduptime <= 0 && this.LastActionState == CharacterState_1.CharacterState.climbleft || this.LastActionState == CharacterState_1.CharacterState.climbright) {
  6603. this.nowAction = this.LastActionState;
  6604. }
  6605. else {
  6606. this.nowAction = CharacterState_1.CharacterState.jump;
  6607. }
  6608. break;
  6609. case CharacterState_1.CharacterState.cross:
  6610. this._disy = this.jumpSpeed.y - this.g * distime;
  6611. this.jumpSpeed.y = this._disy;
  6612. this._moveVec.x = this.jumpSpeed.x * distime;
  6613. this._moveVec.y = this._disy * distime;
  6614. this._moveVec.z = this.jumpSpeed.z * distime;
  6615. this._transform.translate(this._moveVec, false);
  6616. break;
  6617. case CharacterState_1.CharacterState.ClimbMotion:
  6618. if (this._nowselectVec) {
  6619. if (this._transform.position.y < this._nowselectVec.y) {
  6620. this._moveVec.x = 0;
  6621. this._moveVec.y = (1 / 0.3) * distime;
  6622. this._moveVec.z = 0;
  6623. this._transform.translate(this._moveVec, false);
  6624. }
  6625. }
  6626. break;
  6627. }
  6628. if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this._isColling) {
  6629. if (this._transform.position.z <= this._nowselectVec.z) {
  6630. if (this._changeMoveX > 0) {
  6631. this.nowAction = CharacterState_1.CharacterState.jumpright;
  6632. }
  6633. else if (this._changeMoveX < 0) {
  6634. this.nowAction = CharacterState_1.CharacterState.jumpleft;
  6635. }
  6636. else {
  6637. this.nowAction = CharacterState_1.CharacterState.jump;
  6638. }
  6639. }
  6640. }
  6641. if (this._transform.position.y < PropManager_1.PropManager.diePosY - PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.DieDistance) //角色死亡
  6642. {
  6643. if (this._nowscenename == "" || this._nowbuildname == "") {
  6644. if (GameState_1.GameState.fuhuocishu > 0) {
  6645. this.Revive();
  6646. }
  6647. else {
  6648. this.Lose();
  6649. }
  6650. }
  6651. else {
  6652. if (GameState_1.GameState.fuhuocishu > 0) {
  6653. this.Revive();
  6654. }
  6655. else {
  6656. this.Lose();
  6657. }
  6658. }
  6659. this.nowAction = CharacterState_1.CharacterState.stand;
  6660. }
  6661. if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) //到达终点
  6662. {
  6663. this.Win();
  6664. }
  6665. else {
  6666. PropManager_1.PropManager.pro_jindu.value = this._transform.position.z / PropManager_1.PropManager.gamewinPosZ * 100;
  6667. }
  6668. if (this._isActionNums) {
  6669. if (this._isneedactionnum > 0) {
  6670. if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
  6671. switch (this._StateName) {
  6672. case CharacterState_1.CharacterState.jump:
  6673. case CharacterState_1.CharacterState.leftjump:
  6674. case CharacterState_1.CharacterState.rightjump:
  6675. case CharacterState_1.CharacterState.highjump1:
  6676. case CharacterState_1.CharacterState.highjump2:
  6677. case CharacterState_1.CharacterState.hurdle:
  6678. this._isActionNums = false;
  6679. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6680. break;
  6681. case CharacterState_1.CharacterState.huachan:
  6682. case CharacterState_1.CharacterState.climbend:
  6683. this._isActionNums = false;
  6684. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6685. this.nowAction = CharacterState_1.CharacterState.run;
  6686. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  6687. break;
  6688. case CharacterState_1.CharacterState.land1:
  6689. // this._isActionNums = false;
  6690. // this.PlayAnimator( CharacterState.run );
  6691. case CharacterState_1.CharacterState.land2:
  6692. this._isActionNums = false;
  6693. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6694. break;
  6695. case CharacterState_1.CharacterState.huachan:
  6696. this.nowAction = CharacterState_1.CharacterState.run;
  6697. break;
  6698. }
  6699. }
  6700. }
  6701. else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
  6702. switch (this._StateName) {
  6703. case CharacterState_1.CharacterState.jump:
  6704. case CharacterState_1.CharacterState.leftjump:
  6705. case CharacterState_1.CharacterState.rightjump:
  6706. case CharacterState_1.CharacterState.highjump1:
  6707. case CharacterState_1.CharacterState.highjump2:
  6708. this._isActionNums = false;
  6709. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6710. this._changeMoveX = 0;
  6711. break;
  6712. case CharacterState_1.CharacterState.hurdle:
  6713. this._isActionNums = false;
  6714. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6715. break;
  6716. case CharacterState_1.CharacterState.huachan:
  6717. case CharacterState_1.CharacterState.climbend:
  6718. this._isActionNums = false;
  6719. this.PlayAnimator(CharacterState_1.CharacterState.run);
  6720. this.nowAction = CharacterState_1.CharacterState.run;
  6721. this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
  6722. break;
  6723. }
  6724. }
  6725. }
  6726. if (this.buff_speeduptime > 0) {
  6727. this.buff_speeduptime -= distime;
  6728. PropManager_1.PropManager.Instance.SpeedUpEffect("jiasulizi", this._transform.position);
  6729. if (this.doublespeedup) {
  6730. PropManager_1.PropManager.Instance.SpeedUpEffect1("jiasulizi", this._transform.position);
  6731. }
  6732. }
  6733. else {
  6734. this._multiple.x = 1;
  6735. this._multiple.y = 1;
  6736. this._multiple.z = 1;
  6737. this.doublespeedup = false;
  6738. PropManager_1.PropManager.Instance.CloseSpeedUpEffect();
  6739. PropManager_1.PropManager.Instance.CloseSpeedUpEffect1();
  6740. }
  6741. if (this.canshake) {
  6742. this.shaketime += distime;
  6743. if (this.shaketime >= 0.5) {
  6744. this.shaketime = 0;
  6745. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  6746. }
  6747. }
  6748. }
  6749. else {
  6750. if (this._ending) {
  6751. var distime = dt / 1000;
  6752. this._moveTime += distime;
  6753. if (this._moveTime >= this._endanmotime) {
  6754. this.GameOver();
  6755. }
  6756. else {
  6757. this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
  6758. this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
  6759. this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
  6760. PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
  6761. }
  6762. }
  6763. }
  6764. };
  6765. Player.prototype.Win = function () {
  6766. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6767. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
  6768. var carmaTrans = PropManager_1.PropManager.carma.transform;
  6769. this._endAnmoSpeed.z = (this._transform.position.z - 2 - carmaTrans.position.z) / this._endanmotime;
  6770. this._endAnmoSpeed.y = (this._transform.position.y - carmaTrans.position.y) / this._endanmotime;
  6771. this._endAnmoSpeed.x = (this._transform.position.x + 3 - carmaTrans.position.x) / this._endanmotime;
  6772. this._moveTime = 0;
  6773. this._iscanMove = false;
  6774. this._ending = true;
  6775. this.PlayAnimator(CharacterState_1.CharacterState.sky);
  6776. PropManager_1.PropManager.Instance.GameOverEffecf("yanhua", this._transform.position, GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0 ? true : false);
  6777. };
  6778. /**出现复活界面 */
  6779. Player.prototype.Revive = function () {
  6780. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6781. GameState_1.GameState.isdie = true;
  6782. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.revive);
  6783. this._iscanMove = false;
  6784. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6785. // this._ending = true;
  6786. };
  6787. Player.prototype.Lose = function () {
  6788. AudioControl_1.AudioControl.Instance.playGameSound("over");
  6789. GameState_1.GameState.isdie = true;
  6790. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  6791. this._iscanMove = false;
  6792. this.PlayAnimator(CharacterState_1.CharacterState.stand);
  6793. this._ending = true;
  6794. };
  6795. Player.prototype.GameOver = function () {
  6796. this._ending = false;
  6797. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6798. };
  6799. Player.prototype.TestJump = function () {
  6800. this.nowAction = CharacterState_1.CharacterState.jump;
  6801. };
  6802. Player.prototype.destroy = function () {
  6803. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6804. _super.prototype.destroy.call(this);
  6805. };
  6806. Player.prototype.XMove = function (state) {
  6807. if (this.nowAction == CharacterState_1.CharacterState.run) {
  6808. this._moveTime = 0;
  6809. this._speedMoveV3.x = state * 20;
  6810. this.nowAction = CharacterState_1.CharacterState.MoveX;
  6811. }
  6812. };
  6813. Player.prototype.dispose = function () {
  6814. PoolManager_1.default.RecoverSprite3D(this.LeftTrial);
  6815. PoolManager_1.default.RecoverSprite3D(this.RightTrial);
  6816. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  6817. };
  6818. return Player;
  6819. }(Laya.Script3D));
  6820. exports.Player = Player;
  6821. },{"../Agency/AgencyUserMessage":8,"../CFG/BuildCFG":9,"../Control/AssetManager":17,"../Control/AudioControl":18,"../Control/GameStateControl":21,"../Control/PoolManager":26,"../PrefabControl/CharacterState":46,"../PrefabControl/PanelResDic":48,"../PrefabControl/PropManager":49,"../Time/TimerService":59,"../WXSDK/PlayerAccount":75,"../WXSDK/WXGamePlatform":81,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/GameUtils":87,"./CameraManager":38}],41:[function(require,module,exports){
  6822. "use strict";
  6823. Object.defineProperty(exports, "__esModule", { value: true });
  6824. var Global = /** @class */ (function () {
  6825. function Global() {
  6826. }
  6827. Global.curHeight = function () {
  6828. return Laya.stage.height;
  6829. };
  6830. Global.curWidth = function () {
  6831. return Laya.stage.width;
  6832. };
  6833. Global.setVars = function () {
  6834. Global.stage = Laya.stage;
  6835. Global.sethttpurl();
  6836. };
  6837. Global.getUrl = function (url) {
  6838. if (url.indexOf("wxlocal") == -1) {
  6839. return Global.resourcehtttp + url + Global.versions;
  6840. }
  6841. return url;
  6842. };
  6843. Global.sethttpurl = function () {
  6844. if (Global.isdebug) {
  6845. Global.httpurl = "https://wxgamedev.51yoyoyo.com/";
  6846. }
  6847. else {
  6848. Global.httpurl = "https://minport.51yoyoyo.com/";
  6849. }
  6850. };
  6851. Global.httpurl = "";
  6852. Global.resourcehtttp = "";
  6853. Global.cdnurl = "https://wxgame.51yoyoyo.com/";
  6854. /**
  6855. * 资源后缀版本号
  6856. */
  6857. Global.versions = ""; //"?v=1.0.7";
  6858. Global.initWidth = 720;
  6859. Global.initHeight = 1280;
  6860. /**
  6861. * 资源版本号
  6862. */
  6863. Global.resconfigVersion = "";
  6864. /**
  6865. * 当前平台
  6866. */
  6867. Global.nowplatfrom = "";
  6868. /**
  6869. * 当前游戏appid
  6870. */
  6871. Global.appid = "wx46f4626932e5f48b";
  6872. /**
  6873. * 游戏版本号
  6874. */
  6875. Global.gameVersion = "1.0.1";
  6876. /**
  6877. * 是否调试版本
  6878. */
  6879. Global.isdebug = false;
  6880. Global.AppKeyID = 0;
  6881. Global.MemberID = 0;
  6882. return Global;
  6883. }());
  6884. exports.Global = Global;
  6885. },{}],42:[function(require,module,exports){
  6886. "use strict";
  6887. Object.defineProperty(exports, "__esModule", { value: true });
  6888. var GlobalWaiting = /** @class */ (function (_super) {
  6889. __extends(GlobalWaiting, _super);
  6890. function GlobalWaiting() {
  6891. var _this = _super.call(this) || this;
  6892. _this._isforcehide = false;
  6893. _this._lastTime = 0;
  6894. return _this;
  6895. }
  6896. GlobalWaiting.prototype.constructFromXML = function (xml) {
  6897. this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
  6898. _super.prototype.constructFromXML.call(this, xml);
  6899. this.img_0 = this.getChild("img_0").asImage;
  6900. this.img_0.visible = false;
  6901. this.on(Laya.Event.DISPLAY, this, this.onAddedToStage);
  6902. this.on(Laya.Event.UNDISPLAY, this, this.onRemoveFromStage);
  6903. };
  6904. GlobalWaiting.prototype.onAddedToStage = function () {
  6905. this._lastTime = Laya.Browser.now();
  6906. Laya.timer.frameLoop(1, this, this.onTimer);
  6907. };
  6908. GlobalWaiting.prototype.onTimer = function () {
  6909. if (this.img_0) {
  6910. var nowtime = Laya.Browser.now();
  6911. var distime = nowtime - this._lastTime;
  6912. if (distime / 1000 >= 0) {
  6913. if (!this._isforcehide) {
  6914. this.img_0.visible = true;
  6915. }
  6916. var i = this.img_0.rotation;
  6917. i += 10;
  6918. if (i > 360)
  6919. i = i % 360;
  6920. this.img_0.rotation = i;
  6921. }
  6922. else {
  6923. this.img_0.visible = false;
  6924. }
  6925. }
  6926. };
  6927. GlobalWaiting.prototype.hideimg = function () {
  6928. this._isforcehide = true;
  6929. if (this.img_0) {
  6930. this.img_0.visible = false;
  6931. }
  6932. };
  6933. GlobalWaiting.prototype.onRemoveFromStage = function () {
  6934. Laya.timer.clear(this, this.onTimer);
  6935. };
  6936. return GlobalWaiting;
  6937. }(fairygui.GComponent));
  6938. exports.GlobalWaiting = GlobalWaiting;
  6939. },{}],43:[function(require,module,exports){
  6940. "use strict";
  6941. Object.defineProperty(exports, "__esModule", { value: true });
  6942. var JoystickModule = /** @class */ (function (_super) {
  6943. __extends(JoystickModule, _super);
  6944. function JoystickModule(clickpanel) {
  6945. var _this = _super.call(this) || this;
  6946. _this.dis = 0;
  6947. _this.degree = 0;
  6948. _this.angle = 0;
  6949. _this.offx = 0;
  6950. _this._iscanCBack = false;
  6951. _this.mLastMouseX = 0;
  6952. _this.mLastMouseY = 0;
  6953. _this.mX = 0;
  6954. _this.mY = 0;
  6955. _this._iacanCallback = false;
  6956. _this._clickpanel = clickpanel;
  6957. _this._button = new Laya.Point();
  6958. _this.touchId = -1;
  6959. _this.radius = 400;
  6960. _this._curPos = new Laya.Point();
  6961. _this._clickpanel.on(Laya.Event.MOUSE_DOWN, _this, _this.onTouchDown);
  6962. return _this;
  6963. }
  6964. JoystickModule.prototype.onTouchDown = function (evt) {
  6965. if (this.touchId == -1) { //First touch
  6966. this.touchId = evt.touchId;
  6967. this.offx = 0;
  6968. this._iscanCBack = false;
  6969. fairygui.GRoot.inst.globalToLocal(Laya.stage.mouseX, Laya.stage.mouseY, this._curPos);
  6970. var bx = this._curPos.x;
  6971. var by = this._curPos.y;
  6972. this._lastStageX = bx;
  6973. this._lastStageY = by;
  6974. this._startStageX = bx;
  6975. this._startStageY = by;
  6976. this._button.x = bx;
  6977. this._button.y = by;
  6978. if (this._callobj && this._downCallback) {
  6979. this._downCallback.call(this._callobj);
  6980. }
  6981. this._clickpanel.on(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  6982. this._clickpanel.on(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  6983. this._clickpanel.on(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  6984. }
  6985. };
  6986. JoystickModule.prototype.setEventCallback = function (callobj, downCallback, movecallback, upcallback) {
  6987. this._callobj = callobj;
  6988. this._downCallback = downCallback;
  6989. this._movecallback = movecallback;
  6990. this._updatecallback = upcallback;
  6991. };
  6992. JoystickModule.prototype.Trigger = function (evt) {
  6993. this.onTouchDown(evt);
  6994. };
  6995. //创建地图
  6996. JoystickModule.prototype.createMap = function () {
  6997. //创建地图对象
  6998. this.tiledMap = new Laya.TiledMap();
  6999. this.mX = this.mY = 0;
  7000. //创建地图,适当的时候调用destory销毁地图
  7001. this.tiledMap.createMap("res/tiledMap/desert.json", new Laya.Rectangle(0, 0, Laya.Browser.width, Laya.Browser.height), new Laya.Handler(this, this.completeHandler));
  7002. };
  7003. /**
  7004. * 地图加载完成的回调
  7005. */
  7006. JoystickModule.prototype.completeHandler = function () {
  7007. console.log("地图创建完成");
  7008. console.log("ClientW:" + Laya.Browser.clientWidth + " ClientH:" + Laya.Browser.clientHeight);
  7009. };
  7010. /************************************************* */
  7011. JoystickModule.prototype.OnTouchUp = function (evt) {
  7012. if (evt === void 0) { evt = null; }
  7013. if (this.touchId != -1 && evt.touchId == this.touchId) {
  7014. this.touchup();
  7015. if (this._callobj && this._updatecallback) {
  7016. this._updatecallback.call(this._callobj);
  7017. }
  7018. }
  7019. };
  7020. JoystickModule.prototype.touchup = function () {
  7021. this._iscanCBack = false;
  7022. this.touchId = -1;
  7023. this._clickpanel.off(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
  7024. this._clickpanel.off(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
  7025. this._clickpanel.off(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
  7026. this._iacanCallback = false;
  7027. this.degree = 0;
  7028. };
  7029. JoystickModule.prototype.OnTouchMove = function (evt) {
  7030. if (this.touchId != -1 && evt.touchId == this.touchId) {
  7031. var bx = Laya.stage.mouseX;
  7032. var by = Laya.stage.mouseY;
  7033. var moveX = bx - this._lastStageX;
  7034. var moveY = by - this._lastStageY;
  7035. this._lastStageX = bx;
  7036. this._lastStageY = by;
  7037. var buttonX = this._button.x + moveX;
  7038. var buttonY = this._button.y + moveY;
  7039. var offsetX = buttonX - this._startStageX;
  7040. var offsetY = buttonY - this._startStageY;
  7041. var disX = 0;
  7042. if (moveX >= 2 || moveX <= -2) {
  7043. this._iscanCBack = true;
  7044. }
  7045. else {
  7046. this._iscanCBack = false;
  7047. }
  7048. this.offx = moveX;
  7049. if (offsetX == 0 && offsetY == 0) {
  7050. return;
  7051. }
  7052. if (offsetX > 0) {
  7053. if (offsetX > this.radius) {
  7054. disX = this.radius;
  7055. this.angle = 90;
  7056. }
  7057. else {
  7058. disX = this.radius - offsetX;
  7059. this.angle = 90 - disX / this.radius * 90;
  7060. }
  7061. }
  7062. else if (offsetX == 0) {
  7063. this.angle = 0;
  7064. }
  7065. else {
  7066. if (-offsetX > this.radius) {
  7067. disX = this.radius;
  7068. this.angle = -90;
  7069. }
  7070. else {
  7071. disX = this.radius + offsetX;
  7072. this.angle = -(90 - disX / this.radius * 90);
  7073. }
  7074. }
  7075. var rad = Math.atan2(offsetY, offsetX);
  7076. this.degree = rad;
  7077. var maxX = this.radius * Math.cos(rad);
  7078. var maxY = this.radius * Math.sin(rad);
  7079. if (Math.abs(offsetX) > Math.abs(maxX))
  7080. offsetX = maxX;
  7081. if (Math.abs(offsetY) > Math.abs(maxY))
  7082. offsetY = maxY;
  7083. buttonX = this._startStageX + offsetX;
  7084. buttonY = this._startStageY + offsetY;
  7085. if (buttonX < 0)
  7086. buttonX = 0;
  7087. if (buttonY > fairygui.GRoot.inst.height)
  7088. buttonY = fairygui.GRoot.inst.height;
  7089. this._button.x = buttonX;
  7090. this._button.y = buttonY;
  7091. this.dis = Math.sqrt(offsetX * offsetX + offsetY * offsetY);
  7092. this._iacanCallback = true;
  7093. if (this._iscanCBack && this._callobj && this._movecallback && this._iacanCallback) {
  7094. this._movecallback.call(this._callobj, this.offx);
  7095. }
  7096. }
  7097. };
  7098. JoystickModule.prototype.dispose = function () {
  7099. this._clickpanel.off(Laya.Event.MOUSE_DOWN, this, this.onTouchDown);
  7100. };
  7101. // private _center:fairygui.GImage;
  7102. JoystickModule.JoystickMoving = "JoystickMoving";
  7103. JoystickModule.JoystickUp = "JoystickUp";
  7104. return JoystickModule;
  7105. }(Laya.EventDispatcher));
  7106. exports.JoystickModule = JoystickModule;
  7107. },{}],44:[function(require,module,exports){
  7108. "use strict";
  7109. Object.defineProperty(exports, "__esModule", { value: true });
  7110. var Global_1 = require("./Global");
  7111. var Stage = Laya.Stage;
  7112. var AssetPath_1 = require("./Config/AssetPath");
  7113. var GameContents_1 = require("./GameContents");
  7114. var Sdk_1 = require("./WXSDK/Sdk");
  7115. var Main = /** @class */ (function () {
  7116. function Main() {
  7117. //根据IDE设置初始化引擎
  7118. // Laya.init(Global.initWidth, Global.initHeight, Laya["WebGL"]);
  7119. Laya3D.init(Global_1.Global.initWidth, Global_1.Global.initHeight);
  7120. Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH;
  7121. Laya.stage.alignH = Stage.ALIGN_CENTER;
  7122. Laya.stage.alignV = Stage.ALIGN_TOP;
  7123. Laya.stage.screenMode = Stage.SCREEN_VERTICAL;
  7124. Laya.stage.bgColor = "#54B9F6";
  7125. // Laya.Stat.show();
  7126. Laya.alertGlobalError = true;
  7127. window['Config3D'] && (window['Config3D']["_default"]["_defaultPhysicsMemory"] = 128);
  7128. if (Laya.Browser.window.tt) {
  7129. // WxApi.WxInit();
  7130. Sdk_1.WxApi.CheckWXUpdate();
  7131. }
  7132. Laya.stage.on("resize", this, this.onResize);
  7133. }
  7134. Main.prototype.onResize = function () {
  7135. Laya.stage.off("resize", this, this.onResize);
  7136. Global_1.Global.setVars();
  7137. AssetPath_1.AssetPath.init();
  7138. fairygui.UIConfig.packageFileExtension = "bin";
  7139. fairygui.UIConfig.textureLinearSampling = true;
  7140. fairygui.UIConfig.defaultFont = "黑体";
  7141. fairygui.UIConfig.versions = Global_1.Global.versions;
  7142. var gameContent = new GameContents_1.GameContents();
  7143. gameContent.initGame();
  7144. };
  7145. return Main;
  7146. }());
  7147. //激活启动类
  7148. new Main();
  7149. },{"./Config/AssetPath":15,"./GameContents":37,"./Global":41,"./WXSDK/Sdk":77}],45:[function(require,module,exports){
  7150. "use strict";
  7151. Object.defineProperty(exports, "__esModule", { value: true });
  7152. var AssetPath_1 = require("../Config/AssetPath");
  7153. var CharacterPool = /** @class */ (function () {
  7154. function CharacterPool() {
  7155. }
  7156. CharacterPool.AddCharacter = function (resouceName, clas, parent) {
  7157. var skinnedmesh;
  7158. var arr = CharacterPool.roledict[resouceName];
  7159. if (arr && arr.length > 0) {
  7160. skinnedmesh = arr.shift();
  7161. skinnedmesh.active = true;
  7162. parent.addChild(skinnedmesh);
  7163. }
  7164. else {
  7165. var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(resouceName));
  7166. skinnedmesh = Laya.Sprite3D.instantiate(sp, parent, false, new Laya.Vector3(0, 0, 0));
  7167. }
  7168. if (clas) {
  7169. var cla = skinnedmesh.addComponent(clas);
  7170. cla.resouseName = resouceName;
  7171. }
  7172. var _out = new Laya.Quaternion;
  7173. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), 180 * Math.PI / 180, _out);
  7174. skinnedmesh.transform.rotation = _out;
  7175. return skinnedmesh;
  7176. };
  7177. CharacterPool.ClearCharacter = function (sp, resouceName, cla) {
  7178. if (!CharacterPool.roledict[resouceName]) {
  7179. CharacterPool.roledict[resouceName] = [];
  7180. }
  7181. if (cla) {
  7182. cla.destroy();
  7183. }
  7184. sp.active = false;
  7185. sp.removeSelf();
  7186. CharacterPool.roledict[resouceName].push(sp);
  7187. };
  7188. CharacterPool.roledict = {};
  7189. return CharacterPool;
  7190. }());
  7191. exports.CharacterPool = CharacterPool;
  7192. },{"../Config/AssetPath":15}],46:[function(require,module,exports){
  7193. "use strict";
  7194. Object.defineProperty(exports, "__esModule", { value: true });
  7195. var CharacterState = /** @class */ (function () {
  7196. function CharacterState() {
  7197. }
  7198. /**侧翻 cefan1 */
  7199. CharacterState.rollover1 = "rollover1";
  7200. /**侧翻 cefan2 */
  7201. CharacterState.rollover2 = "rollover2";
  7202. /**跑墙左 paoqiangleft */
  7203. CharacterState.runwallleft = "runwallleft";
  7204. /**右跳 rightjump */
  7205. CharacterState.rightjump = "rightjump";
  7206. /**跑墙右 paoqiangright */
  7207. CharacterState.runwallright = "runwallright";
  7208. /**左跳 leftjump*/
  7209. CharacterState.leftjump = "leftjump";
  7210. /**爬墙 paqiang */
  7211. CharacterState.climbwall = "climbwall";
  7212. /** ? climbend */
  7213. CharacterState.climbend = "climbend";
  7214. /**站立 stand*/
  7215. CharacterState.stand = "stand";
  7216. /**空中 kongzhong */
  7217. CharacterState.sky = "sky";
  7218. /**落地 luodi1 */
  7219. CharacterState.land1 = "land1";
  7220. /**落地 luodi2 */
  7221. CharacterState.land2 = "land2";
  7222. /**大跳 datiao1 */
  7223. CharacterState.highjump1 = "highjump1";
  7224. /**大跳 datiao2 */
  7225. CharacterState.highjump2 = "highjump2";
  7226. /**跑动 run */
  7227. CharacterState.run = "run";
  7228. /**跳跃 jump*/
  7229. CharacterState.jump = "jump";
  7230. /**爬升 Climb */
  7231. CharacterState.climbup = "climbup";
  7232. /**自由落体 Freefalling */
  7233. CharacterState.falldown = "falldown";
  7234. /**左爬 left_climb */
  7235. CharacterState.climbleft = "climbleft";
  7236. /**右爬 right_climb*/
  7237. CharacterState.climbright = "climbright";
  7238. /**右跳 right_jump */
  7239. CharacterState.jumpright = "jumpright";
  7240. /**左跳 left_jump */
  7241. CharacterState.jumpleft = "jumpleft";
  7242. /** PlayPalouAction*/
  7243. CharacterState.ClimbMotion = "ClimbMotion";
  7244. /** ? huachan */
  7245. CharacterState.huachan = "huachan";
  7246. /**跨栏 kualan */
  7247. CharacterState.hurdle = "hurdle";
  7248. /**
  7249. * 加速板跳跃 jiasuJump
  7250. */
  7251. CharacterState.speedupjump = "speedupjump";
  7252. /**
  7253. * x方向瞬移 xshunyi
  7254. */
  7255. CharacterState.MoveX = "MoveX";
  7256. /**
  7257. * 下滑位移 downSlide
  7258. */
  7259. CharacterState.downmove = "downmove";
  7260. /**
  7261. * 侧面加速 slidejiasu
  7262. */
  7263. CharacterState.sidespeedup = "sidespeedup";
  7264. /**
  7265. * 翻越 surmount
  7266. */
  7267. CharacterState.cross = "cross";
  7268. /**
  7269. * 锁定爬升 lockclimb
  7270. */
  7271. CharacterState.climbupblock = "climbupblock";
  7272. return CharacterState;
  7273. }());
  7274. exports.CharacterState = CharacterState;
  7275. },{}],47:[function(require,module,exports){
  7276. "use strict";
  7277. Object.defineProperty(exports, "__esModule", { value: true });
  7278. /*
  7279. * 对象池类
  7280. */
  7281. var Animation = Laya.Animation;
  7282. var GamePool = /** @class */ (function (_super) {
  7283. __extends(GamePool, _super);
  7284. function GamePool() {
  7285. var _this = _super.call(this) || this;
  7286. _this.AniConfPath = "res/fighter/fighter.json";
  7287. return _this;
  7288. }
  7289. GamePool.RemoveItem = function (key, obj) {
  7290. if (GamePool.contain[key]) {
  7291. var index = GamePool.contain[key].indexOf(obj);
  7292. if (index == -1) {
  7293. GamePool.contain[key].push(obj);
  7294. }
  7295. }
  7296. };
  7297. GamePool.GetItem = function (key) {
  7298. var args = [];
  7299. for (var _i = 1; _i < arguments.length; _i++) {
  7300. args[_i - 1] = arguments[_i];
  7301. }
  7302. if (GamePool.contain[key]) {
  7303. var arr = GamePool.contain[key];
  7304. if (arr.length == 0) {
  7305. var calssobj = GamePool.sprite3DArray[key];
  7306. var vo = new calssobj();
  7307. return vo;
  7308. }
  7309. return GamePool.contain[key].shift();
  7310. }
  7311. else {
  7312. console.log("此key值对应的类未被注册");
  7313. return null;
  7314. }
  7315. };
  7316. /******************************************* */
  7317. GamePool.prototype.createAnimation = function () {
  7318. var ani = new Animation();
  7319. ani.loadAtlas(this.AniConfPath); // 加载图集动画
  7320. ani.interval = 30; // 设置播放间隔(单位:毫秒)
  7321. ani.index = 1; // 当前播放索引
  7322. ani.play(); // 播放图集动画
  7323. // 获取动画的边界信息
  7324. var bounds = ani.getGraphicBounds();
  7325. ani.pivot(bounds.width / 2, bounds.height / 2);
  7326. ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
  7327. Laya.stage.addChild(ani);
  7328. };
  7329. /******************************************* */
  7330. GamePool.GetItemFairyGUI = function (url) {
  7331. if (!GamePool.contain[url]) {
  7332. GamePool.contain[url] = [];
  7333. }
  7334. var arr = GamePool.contain[url];
  7335. if (arr.length == 0) {
  7336. var vo = fairygui.UIPackage.createObjectFromURL(url);
  7337. return vo;
  7338. }
  7339. return GamePool.contain[url].shift();
  7340. };
  7341. GamePool.Mark = function (key, classarg) {
  7342. GamePool.sprite3DArray[key] = classarg;
  7343. GamePool.contain[key] = [];
  7344. };
  7345. GamePool.sprite3DArray = {};
  7346. GamePool.contain = {};
  7347. return GamePool;
  7348. }(Laya.EventDispatcher));
  7349. exports.GamePool = GamePool;
  7350. },{}],48:[function(require,module,exports){
  7351. "use strict";
  7352. Object.defineProperty(exports, "__esModule", { value: true });
  7353. var Singleton_1 = require("../utils/Singleton");
  7354. /*
  7355. * name;
  7356. */
  7357. var PanelResDic = /** @class */ (function (_super) {
  7358. __extends(PanelResDic, _super);
  7359. function PanelResDic() {
  7360. var _this = _super.call(this) || this;
  7361. PanelResDic.ins = _this;
  7362. return _this;
  7363. }
  7364. Object.defineProperty(PanelResDic, "Instance", {
  7365. get: function () {
  7366. if (PanelResDic.ins == null) {
  7367. return new PanelResDic();
  7368. }
  7369. return PanelResDic.ins;
  7370. },
  7371. enumerable: true,
  7372. configurable: true
  7373. });
  7374. PanelResDic.getView = function (viewkey) {
  7375. if (!PanelResDic._mapviewDict[viewkey]) {
  7376. throw "err0 未绑定的viewkey:" + viewkey;
  7377. }
  7378. return PanelResDic._mapviewDict[viewkey];
  7379. };
  7380. PanelResDic.prototype.getSingleTon = function (ref) {
  7381. return Singleton_1.Singleton.Instance(ref);
  7382. };
  7383. PanelResDic.prototype.mapView = function (viewkey, ref) {
  7384. if (!PanelResDic._mapviewDict[viewkey]) {
  7385. PanelResDic._mapviewDict[viewkey] = ref;
  7386. ref.key = viewkey;
  7387. }
  7388. };
  7389. PanelResDic.prototype.AgencyAdd = function (ref) {
  7390. Singleton_1.Singleton.create(ref);
  7391. };
  7392. PanelResDic.prototype.AgencyClear = function (ref) {
  7393. Singleton_1.Singleton.remove(ref);
  7394. };
  7395. PanelResDic._mapviewDict = {};
  7396. return PanelResDic;
  7397. }(Laya.EventDispatcher));
  7398. exports.PanelResDic = PanelResDic;
  7399. },{"../utils/Singleton":91}],49:[function(require,module,exports){
  7400. "use strict";
  7401. Object.defineProperty(exports, "__esModule", { value: true });
  7402. var AssetPath_1 = require("../Config/AssetPath");
  7403. var GameUtils_1 = require("../utils/GameUtils");
  7404. var PropManager = /** @class */ (function () {
  7405. function PropManager() {
  7406. this._outQUaternion4 = new Laya.Quaternion;
  7407. this._outQUaternion = new Laya.Quaternion;
  7408. PropManager.ins = this;
  7409. }
  7410. Object.defineProperty(PropManager, "Instance", {
  7411. get: function () {
  7412. if (PropManager.ins == null) {
  7413. return new PropManager();
  7414. }
  7415. return PropManager.ins;
  7416. },
  7417. enumerable: true,
  7418. configurable: true
  7419. });
  7420. PropManager.getPosVecbyScene = function (sceneName, buildname) {
  7421. if (PropManager.patternDict[sceneName]) {
  7422. return PropManager.patternDict[sceneName][buildname];
  7423. }
  7424. return null;
  7425. };
  7426. /**
  7427. * @param animator
  7428. * @param animatorDict
  7429. */
  7430. PropManager.setAnimator = function (animator) {
  7431. var chiddict;
  7432. for (var s in PropManager.actionDict) {
  7433. if (!animator.getControllerLayer().getAnimatorState(s)) {
  7434. chiddict = PropManager.actionDict[s];
  7435. //创建一个动画动作状态
  7436. var state1 = new Laya.AnimatorState();
  7437. //设置动作状态的名称
  7438. state1.name = s;
  7439. //设置动作状态播放的起始时间(起始时间与结束时间的设置为0-1的百分比数值) 要截取的时间点 / 动画的总时长
  7440. state1.clipStart = chiddict.s / PropManager.actionnums;
  7441. //设置动作状态播放的结束时间
  7442. state1.clipEnd = chiddict.e / PropManager.actionnums;
  7443. //得到默认动画赋值给Clip(getDefaultState默认动画为Unity中animation的数组顺序0下标的动画)
  7444. state1.clip = animator.getDefaultState().clip;
  7445. //动画播放是否循环
  7446. state1.clip.islooping = chiddict.islooping;
  7447. //添加动画状态到动画组件里
  7448. animator.addState(state1);
  7449. }
  7450. }
  7451. };
  7452. PropManager.prototype.InitEffect = function () {
  7453. var lizi = PropManager.getlizibyName("speedupeffect");
  7454. lizi.particleSystem.play();
  7455. lizi.active = false;
  7456. var lizi = PropManager.getlizibyName("color_white");
  7457. lizi.particleSystem.play();
  7458. lizi.active = false;
  7459. var lizi = PropManager.getlizibyName("color_yellow");
  7460. lizi.particleSystem.play();
  7461. lizi.active = false;
  7462. };
  7463. PropManager.prototype.SetEffectColor = function (name, pos) {
  7464. var closetime = 0;
  7465. Laya.timer.clear(this, this.EffectEnd);
  7466. this.EffectEndColor();
  7467. if (name == "color_white") {
  7468. var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
  7469. if (sort > 50) {
  7470. name = "color_yellow";
  7471. }
  7472. }
  7473. closetime = 500;
  7474. this._tanselizi = PropManager.getlizibyName(name);
  7475. this._tanselizi.transform.position = pos;
  7476. this._tanselizi.particleSystem.play();
  7477. if (closetime != 0) {
  7478. Laya.timer.once(closetime, this, this.EffectEndColor);
  7479. }
  7480. };
  7481. PropManager.prototype.EffectEndColor = function () {
  7482. if (this._tanselizi) {
  7483. this._tanselizi.particleSystem.stop();
  7484. this._tanselizi.active = false;
  7485. }
  7486. };
  7487. PropManager.prototype.SpeedUpEffect1 = function (name, pos) {
  7488. if (!this._engamelizi4 || (this._engamelizi4 && !this._engamelizi4.active)) {
  7489. this._engamelizi4 = PropManager.getlizibyName("speedupeffect");
  7490. this._engamelizi4.particleSystem.looping = true;
  7491. this._engamelizi4.transform.scale = new Laya.Vector3(20, 20, 20);
  7492. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion4);
  7493. this._engamelizi4.transform.rotation = this._outQUaternion4;
  7494. this._engamelizi4.particleSystem.play();
  7495. }
  7496. var lzpos = pos.clone();
  7497. lzpos.y += 5;
  7498. lzpos.z -= 10;
  7499. this._engamelizi4.transform.position = lzpos;
  7500. };
  7501. PropManager.prototype.CloseSpeedUpEffect1 = function () {
  7502. if (this._engamelizi4 && this._engamelizi4.active) {
  7503. this._engamelizi4.active = false;
  7504. }
  7505. };
  7506. PropManager.prototype.SpeedUpEffect = function (name, pos) {
  7507. if (!this._engamelizi3 || (this._engamelizi3 && !this._engamelizi3.active)) {
  7508. this._engamelizi3 = PropManager.getlizibyName("speedupeffect");
  7509. this._engamelizi3.particleSystem.looping = true;
  7510. this._engamelizi3.transform.scale = new Laya.Vector3(20, 20, 20);
  7511. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion);
  7512. this._engamelizi3.transform.rotation = this._outQUaternion;
  7513. this._engamelizi3.particleSystem.play();
  7514. }
  7515. var lzpos = pos.clone();
  7516. lzpos.y += 5;
  7517. this._engamelizi3.transform.position = lzpos;
  7518. };
  7519. PropManager.prototype.CloseSpeedUpEffect = function () {
  7520. if (this._engamelizi3 && this._engamelizi3.active) {
  7521. this._engamelizi3.active = false;
  7522. }
  7523. };
  7524. PropManager.prototype.GameOverEffecf = function (name, pos, iswin) {
  7525. this._engamelizi1 = PropManager.getlizibyName("fireworks");
  7526. this._engamelizi1.transform.position = pos;
  7527. this._engamelizi1.particleSystem.play();
  7528. if (iswin) {
  7529. this._engamelizi2 = PropManager.getlizibyName("winline");
  7530. this._engamelizi2.transform.position = pos;
  7531. this._engamelizi2.particleSystem.play();
  7532. }
  7533. };
  7534. PropManager.prototype.CloseGameOverEffect = function () {
  7535. if (this._engamelizi1) {
  7536. this._engamelizi1.particleSystem.stop();
  7537. this._engamelizi1.active = false;
  7538. }
  7539. if (this._engamelizi2) {
  7540. this._engamelizi2.particleSystem.stop();
  7541. this._engamelizi2.active = false;
  7542. }
  7543. };
  7544. // public setliziPlay( name:string,pos:Laya.Vector3 ):void
  7545. // {
  7546. // var closetime:number = 0;
  7547. // Laya.timer.clear( this,this.liziend );
  7548. // switch( name )
  7549. // {
  7550. // case "tanse_bai":
  7551. // if( name == "tanse_bai" )
  7552. // {
  7553. // var sort:number = GameUtils.randRangeint( 0,100 );
  7554. // if( sort > 50 )
  7555. // {
  7556. // name = "tanse_huang";
  7557. // }
  7558. // }
  7559. // closetime = 500;
  7560. // break;
  7561. // case "jiasulizi":
  7562. // break;
  7563. // case "win_xian":
  7564. // closetime = 0;
  7565. // break;
  7566. // case "yanhua":
  7567. // closetime = 0;
  7568. // break;
  7569. // }
  7570. // var lizi:Laya.ShuriKenParticle3D = PropManager.getlizibyName( name );
  7571. // lizi.transform.position = pos;
  7572. // lizi.particleSystem.play();
  7573. // if( closetime != 0 )
  7574. // {
  7575. // Laya.timer.once( closetime,this,this.liziend,[lizi] );
  7576. // }
  7577. // }
  7578. PropManager.prototype.EffectEnd = function (lizi) {
  7579. if (lizi) {
  7580. lizi.particleSystem.stop();
  7581. lizi.active = false;
  7582. }
  7583. };
  7584. PropManager.getlizibyName = function (name) {
  7585. var lizisp;
  7586. if (PropManager.liziDict[name]) {
  7587. lizisp = PropManager.liziDict[name];
  7588. }
  7589. else {
  7590. lizisp = Laya.Sprite3D.instantiate(Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(name)));
  7591. PropManager.liziDict[name] = lizisp;
  7592. PropManager.scene3D.addChild(lizisp);
  7593. }
  7594. lizisp.active = true;
  7595. return lizisp;
  7596. };
  7597. PropManager.nowmapDict = {};
  7598. PropManager.diePosY = 0;
  7599. PropManager.gamewinPosZ = 0;
  7600. PropManager.patternDict = {};
  7601. PropManager.npcDict = {};
  7602. PropManager.npcscriptDict = {};
  7603. PropManager.npcnum = 0;
  7604. PropManager.iscarmanpc = false;
  7605. PropManager.liziDict = {};
  7606. PropManager.jiantouArr = [];
  7607. // /**
  7608. // * 判断是否爬到顶端
  7609. // */
  7610. // static checkisClimbTop( sceneName:string,buildname:string, pos:Laya.Vector3 ):boolean
  7611. // {
  7612. // var vec:Laya.Vector3 = PropManager.getPosVecbyScene( sceneName,buildname );
  7613. // if( vec && Math.abs(vec.y - pos.y) < 1.5 )
  7614. // {
  7615. // return true;
  7616. // }
  7617. // return false;
  7618. // }
  7619. PropManager.actionnums = 575;
  7620. PropManager.actionDict = {
  7621. "climbend": { s: 550, e: 575, islooping: false },
  7622. "stand": { s: 0, e: 80, islooping: true },
  7623. "run": { s: 90, e: 106, islooping: true },
  7624. "jump": { s: 110, e: 132, islooping: true },
  7625. "kongzhong": { s: 132, e: 145, islooping: true },
  7626. "luodi1": { s: 145, e: 160, islooping: true },
  7627. "luodi2": { s: 170, e: 202, islooping: true },
  7628. "datiao1": { s: 210, e: 235, islooping: true },
  7629. "datiao2": { s: 240, e: 273, islooping: true },
  7630. "huachan": { s: 280, e: 310, islooping: true },
  7631. "kualan": { s: 310, e: 346, islooping: true },
  7632. "cefan1": { s: 350, e: 391, islooping: true },
  7633. "cefan2": { s: 400, e: 434, islooping: true },
  7634. "paoqiangleft": { s: 440, islooping: true, e: 456 },
  7635. "rightjump": { s: 460, e: 477, islooping: true },
  7636. "paoqiangright": { s: 480, e: 496, islooping: true },
  7637. "leftjump": { s: 500, e: 517, islooping: true },
  7638. "paqiang": { s: 520, e: 542, islooping: true }
  7639. };
  7640. return PropManager;
  7641. }());
  7642. exports.PropManager = PropManager;
  7643. },{"../Config/AssetPath":15,"../utils/GameUtils":87}],50:[function(require,module,exports){
  7644. "use strict";
  7645. Object.defineProperty(exports, "__esModule", { value: true });
  7646. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7647. var CpaEvent_1 = require("./CpaEvent");
  7648. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  7649. var RecommendView_1 = require("./RecommendView");
  7650. var TimerService_1 = require("../Time/TimerService");
  7651. var BaoKuanGameView = /** @class */ (function (_super) {
  7652. __extends(BaoKuanGameView, _super);
  7653. function BaoKuanGameView() {
  7654. var _this = _super.call(this) || this;
  7655. _this._time = 0;
  7656. _this.key = 0;
  7657. _this._istart = false;
  7658. return _this;
  7659. }
  7660. BaoKuanGameView.prototype.onInit = function () {
  7661. this.initView();
  7662. this.initEvent();
  7663. };
  7664. BaoKuanGameView.prototype.initView = function () {
  7665. this.c_state = this.getController("c_state");
  7666. this.t0 = this.getTransition("t0");
  7667. this.c_state.selectedIndex = 0;
  7668. };
  7669. BaoKuanGameView.prototype.initEvent = function () {
  7670. console.log("监听互推事件---BaokuanGame0");
  7671. this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  7672. };
  7673. BaoKuanGameView.prototype.yqhomedataHandler = function () {
  7674. console.log("监听互推事件---BaokuanGame1");
  7675. this.RefreshBKYX();
  7676. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7677. };
  7678. BaoKuanGameView.prototype.update = function (dt) {
  7679. if (this._istart) {
  7680. this._time += dt;
  7681. if (this._time >= 5000) {
  7682. this._time = 0;
  7683. this.RefreshBKYX(true);
  7684. }
  7685. }
  7686. };
  7687. BaoKuanGameView.prototype.RefreshBKYX = function (isanmo) {
  7688. if (isanmo === void 0) { isanmo = false; }
  7689. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.recommend)
  7690. return;
  7691. console.log("监听互推事件---BaokuanGame2");
  7692. this.c_state.selectedIndex = 1;
  7693. var datas = RecommendView_1.Recommend.cainixihuanData;
  7694. var item;
  7695. for (var i = 0; i < 4; i++) {
  7696. if (this.key + i >= datas.length - 1) {
  7697. this.key = 0;
  7698. }
  7699. var curdata = datas[this.key + i];
  7700. item = this["item_" + i];
  7701. item.showData(curdata, true);
  7702. if (curdata == null)
  7703. continue;
  7704. }
  7705. this.key += 4;
  7706. if (this.key >= datas.length - 1) {
  7707. this.key = 0;
  7708. }
  7709. this._istart = true;
  7710. if (isanmo) {
  7711. this.t0.play(null, 1);
  7712. }
  7713. };
  7714. return BaoKuanGameView;
  7715. }(PanelChildControl_1.PanelChildControl));
  7716. exports.default = BaoKuanGameView;
  7717. },{"../Control/PanelChildControl":25,"../Time/TimerService":59,"../WXSDK/PlayerAccount":75,"./CpaEvent":53,"./RecommendView":55}],51:[function(require,module,exports){
  7718. "use strict";
  7719. Object.defineProperty(exports, "__esModule", { value: true });
  7720. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  7721. var RecommendView_1 = require("./RecommendView");
  7722. var ViewManager_1 = require("../View/ViewManager");
  7723. var TimerService_1 = require("../Time/TimerService");
  7724. var DispatcherManager_1 = require("../utils/DispatcherManager");
  7725. var GameState_1 = require("../utils/GameState");
  7726. var CompletePanel_1 = require("../View/CompletePanel");
  7727. var RoleData_1 = require("../Data/RoleData");
  7728. var ChoutiPanView = /** @class */ (function (_super) {
  7729. __extends(ChoutiPanView, _super);
  7730. function ChoutiPanView(end) {
  7731. var _this = _super.call(this, "main", "choutipanView") || this;
  7732. _this._iscanmove = false;
  7733. _this.isend = 0;
  7734. _this._movetime = 0;
  7735. _this._flushtime = 0;
  7736. _this.dir = true;
  7737. _this._nowvalue = 0;
  7738. _this.isend = end;
  7739. return _this;
  7740. }
  7741. ChoutiPanView.prototype.initView = function () {
  7742. this.list_0.setVirtual();
  7743. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7744. this.list_1.setVirtual();
  7745. this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
  7746. this._nowList0 = RecommendView_1.Recommend.gdyxData;
  7747. this._nowList1 = RecommendView_1.Recommend.gdyxData;
  7748. this.list_0.numItems = this._nowList0.length;
  7749. this.list_1.numItems = this._nowList1.length;
  7750. this._isStart = true;
  7751. this._iscanmove = true;
  7752. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7753. };
  7754. ChoutiPanView.prototype.initEvent = function () {
  7755. this.AddEventByType(this.btn_return, Laya.Event.CLICK, this, this.onclosefun);
  7756. this.AddEventByType(this.btn_jixugame, Laya.Event.CLICK, this, this.onclosefun);
  7757. this.AddEventByType(this.list_1, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7758. this.AddEventByType(this.list_1, Laya.Event.MOUSE_UP, this, this.upclick);
  7759. this.AddEventByType(this.list_1, Laya.Event.MOUSE_OUT, this, this.upclick);
  7760. };
  7761. ChoutiPanView.prototype.itemrenderlist = function (index, item) {
  7762. if (index < this._nowList0.length) {
  7763. item.showData(this._nowList0[index]);
  7764. }
  7765. };
  7766. ChoutiPanView.prototype.itemrenderlist1 = function (index, item) {
  7767. if (index < this._nowList1.length) {
  7768. item.showData(this._nowList1[index]);
  7769. }
  7770. };
  7771. ChoutiPanView.prototype.downclick = function () {
  7772. this._isdown = true;
  7773. this._iscanmove = false;
  7774. Laya.timer.clear(this, this.timeoutCallback);
  7775. };
  7776. ChoutiPanView.prototype.timeoutCallback = function () {
  7777. this._iscanmove = true;
  7778. };
  7779. ChoutiPanView.prototype.upclick = function () {
  7780. if (this._isdown) {
  7781. this._isdown = false;
  7782. this._nowvalue = this.list_1.scrollPane.percY;
  7783. Laya.timer.once(2000, this, this.timeoutCallback);
  7784. }
  7785. };
  7786. ChoutiPanView.prototype.update = function (dt) {
  7787. if (this._isStart) {
  7788. if (this.list_1.scrollPane && this._nowList1 && this._iscanmove) {
  7789. if (this.dir) {
  7790. this._nowvalue += 0.001;
  7791. if (this._nowvalue >= 1) {
  7792. this._nowvalue = 1;
  7793. this.dir = false;
  7794. }
  7795. }
  7796. else {
  7797. this._nowvalue -= 0.001;
  7798. if (this._nowvalue <= 0) {
  7799. this._nowvalue = 0;
  7800. this.dir = true;
  7801. }
  7802. }
  7803. this.list_1.scrollPane.setPercY(this._nowvalue);
  7804. }
  7805. }
  7806. };
  7807. ChoutiPanView.prototype.onclosefun = function () {
  7808. if (this.isend == 1) {
  7809. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7810. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  7811. }
  7812. else if (this.isend == 2) {
  7813. var gold = RoleData_1.RoleData.Instance.levelcfg.winGold;
  7814. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7815. ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, gold);
  7816. }
  7817. else {
  7818. ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
  7819. }
  7820. };
  7821. ChoutiPanView.prototype.destory = function () {
  7822. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  7823. _super.prototype.destory.call(this);
  7824. };
  7825. ChoutiPanView.key = "ChoutiPanView";
  7826. return ChoutiPanView;
  7827. }(PanelBaseControl_1.PanelBaseControl));
  7828. exports.default = ChoutiPanView;
  7829. },{"../Control/PanelBaseControl":24,"../Data/RoleData":33,"../Time/TimerService":59,"../View/CompletePanel":61,"../View/ViewManager":70,"../utils/DispatcherManager":85,"../utils/GameState":86,"./RecommendView":55}],52:[function(require,module,exports){
  7830. "use strict";
  7831. Object.defineProperty(exports, "__esModule", { value: true });
  7832. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7833. var CpaEvent_1 = require("./CpaEvent");
  7834. var RecommendView_1 = require("./RecommendView");
  7835. var TimerService_1 = require("../Time/TimerService");
  7836. var SceneControl_1 = require("../Control/SceneControl");
  7837. var CpaDownsView = /** @class */ (function (_super) {
  7838. __extends(CpaDownsView, _super);
  7839. function CpaDownsView() {
  7840. var _this = _super.call(this) || this;
  7841. _this._iscanmove = false;
  7842. _this._movetime = 0;
  7843. _this._flushtime = 0;
  7844. _this.dir = true;
  7845. _this._nowvalue = 0;
  7846. return _this;
  7847. }
  7848. CpaDownsView.prototype.onInit = function () {
  7849. this.c_state = this.getController("c_state");
  7850. this.c_state.selectedIndex = 0;
  7851. this.initView();
  7852. this.initEvent();
  7853. };
  7854. CpaDownsView.prototype.initView = function () {
  7855. this.list_0.setVirtual();
  7856. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  7857. this._isStart = false;
  7858. };
  7859. CpaDownsView.prototype.initEvent = function () {
  7860. this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
  7861. this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  7862. this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  7863. this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  7864. };
  7865. CpaDownsView.prototype.downclick = function () {
  7866. if (SceneControl_1.SceneControl.IsShowSign)
  7867. return;
  7868. this._isdown = true;
  7869. this._iscanmove = false;
  7870. Laya.timer.clear(this, this.timeoutCallback);
  7871. // ttad.CreateMoreGameBtn();
  7872. };
  7873. CpaDownsView.prototype.timeoutCallback = function () {
  7874. if (SceneControl_1.SceneControl.IsShowSign)
  7875. return;
  7876. this._iscanmove = true;
  7877. };
  7878. CpaDownsView.prototype.upclick = function () {
  7879. if (SceneControl_1.SceneControl.IsShowSign)
  7880. return;
  7881. if (this._isdown) {
  7882. this._isdown = false;
  7883. this._nowvalue = this.list_0.scrollPane.percX;
  7884. Laya.timer.once(2000, this, this.timeoutCallback);
  7885. }
  7886. };
  7887. CpaDownsView.prototype.update = function (dt) {
  7888. if (this._isStart) {
  7889. if (this.list_0.scrollPane && this._nowList && this._iscanmove) {
  7890. if (this.dir) {
  7891. this._nowvalue += 0.001;
  7892. if (this._nowvalue >= 1) {
  7893. this._nowvalue = 1;
  7894. this.dir = false;
  7895. }
  7896. }
  7897. else {
  7898. this._nowvalue -= 0.001;
  7899. if (this._nowvalue <= 0) {
  7900. this._nowvalue = 0;
  7901. this.dir = true;
  7902. }
  7903. }
  7904. this.list_0.scrollPane.setPercX(this._nowvalue);
  7905. }
  7906. }
  7907. };
  7908. CpaDownsView.prototype.itemrenderlist = function (index, item) {
  7909. if (index < this._nowList.length) {
  7910. item.showData(this._nowList[index], true);
  7911. }
  7912. };
  7913. CpaDownsView.prototype.yqhomedataHandler = function () {
  7914. this.c_state.selectedIndex = 1;
  7915. this._nowList = RecommendView_1.Recommend.cainixihuanData;
  7916. this.list_0.numItems = this._nowList.length;
  7917. for (var i = 0; i < this._nowList.length; i++) {
  7918. }
  7919. this._isStart = true;
  7920. this._iscanmove = true;
  7921. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  7922. };
  7923. CpaDownsView.prototype.dispose = function () {
  7924. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  7925. _super.prototype.dispose.call(this);
  7926. };
  7927. return CpaDownsView;
  7928. }(PanelChildControl_1.PanelChildControl));
  7929. exports.default = CpaDownsView;
  7930. },{"../Control/PanelChildControl":25,"../Control/SceneControl":29,"../Time/TimerService":59,"./CpaEvent":53,"./RecommendView":55}],53:[function(require,module,exports){
  7931. "use strict";
  7932. Object.defineProperty(exports, "__esModule", { value: true });
  7933. var CpaEvent = /** @class */ (function () {
  7934. function CpaEvent() {
  7935. }
  7936. CpaEvent.YQHomeData = "CpaEvent_YQHomeData";
  7937. return CpaEvent;
  7938. }());
  7939. exports.default = CpaEvent;
  7940. },{}],54:[function(require,module,exports){
  7941. "use strict";
  7942. Object.defineProperty(exports, "__esModule", { value: true });
  7943. var PanelChildControl_1 = require("../Control/PanelChildControl");
  7944. var GameUtils_1 = require("../utils/GameUtils");
  7945. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  7946. var CpaItem = /** @class */ (function (_super) {
  7947. __extends(CpaItem, _super);
  7948. function CpaItem() {
  7949. var _this = _super.call(this) || this;
  7950. _this.ispenchoutipan = false;
  7951. return _this;
  7952. }
  7953. CpaItem.prototype.onInit = function () {
  7954. this.name = "capItem";
  7955. this.AddEventByType(this, Laya.Event.CLICK, this, this.onbtnclick);
  7956. };
  7957. CpaItem.prototype.onbtnclick = function () {
  7958. if (this._vo) {
  7959. var data = this._vo;
  7960. FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(data, this.ispenchoutipan);
  7961. // var appid = data.to_appid;
  7962. // var path = data.jump_path;
  7963. // let param = {"appId":appid.toString(),"path":path.toString()};
  7964. // if(Laya.Browser.onMobile)
  7965. // {
  7966. // Laya.Browser.window.wx.navigateToMiniProgram(
  7967. // {
  7968. // appId:appid.toString(),
  7969. // path:path.toString(),
  7970. // success:res=>
  7971. // {
  7972. // WxApi.recordAldEvent("跳转到游戏失成功","1");
  7973. // },
  7974. // fail:res=>
  7975. // {
  7976. // if( this.ispenchoutipan )
  7977. // {
  7978. // ViewManager.Instance.add( ChoutiPanView );
  7979. // }
  7980. // }
  7981. // });
  7982. // }
  7983. }
  7984. };
  7985. CpaItem.prototype.showData = function (data, isopenchoutipan) {
  7986. if (isopenchoutipan === void 0) { isopenchoutipan = false; }
  7987. this.ispenchoutipan = isopenchoutipan;
  7988. this._vo = data;
  7989. if (data) {
  7990. this.load_icon.url = data.icon;
  7991. if (this.txt_word) {
  7992. this.txt_word.text = data.togame_name;
  7993. }
  7994. if (this.img_tip) {
  7995. this.img_tip.visible = Math.random() > 0.5 ? true : false;
  7996. }
  7997. if (this.txt_word1) {
  7998. this.txt_word1.text = GameUtils_1.GameUtils.randRangeint(235470, 1561430).toString() + "人玩";
  7999. }
  8000. }
  8001. };
  8002. return CpaItem;
  8003. }(PanelChildControl_1.PanelChildControl));
  8004. exports.default = CpaItem;
  8005. },{"../Control/PanelChildControl":25,"../WXSDK/FYHD_Sdk":71,"../utils/GameUtils":87}],55:[function(require,module,exports){
  8006. "use strict";
  8007. Object.defineProperty(exports, "__esModule", { value: true });
  8008. var DispatcherManager_1 = require("../utils/DispatcherManager");
  8009. var CpaEvent_1 = require("./CpaEvent");
  8010. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  8011. var recommendPan = /** @class */ (function () {
  8012. function recommendPan(data) {
  8013. this.game_flg = data["game_flg"];
  8014. this.game_id = data["game_id"];
  8015. this.game_name = data["game_name"];
  8016. this.id = data["id"];
  8017. this.location_flg = data["location_flg"];
  8018. this.location_id = data["location_id"];
  8019. this.location_name = data["location_name"];
  8020. this.matter_type = data["matter_type"];
  8021. }
  8022. return recommendPan;
  8023. }());
  8024. exports.recommendPan = recommendPan;
  8025. var Recommend = /** @class */ (function () {
  8026. function Recommend() {
  8027. Recommend.InitData();
  8028. }
  8029. Recommend.InitData = function () {
  8030. Recommend.cainixihuanData = Recommend.GetCaiNiXiaHuanDatas();
  8031. Recommend.jiesuanData = Recommend.GetJIeSuanDatas();
  8032. Recommend.gdyxData = Recommend.GetGDYXDatas();
  8033. Recommend.baokuanyouxiData = Recommend.GetBaoKuanYouXiDatas();
  8034. Recommend.moreData = Recommend.GetMoreDatas();
  8035. for (var key in FYHD_Sdk_1.FYHD_Sdk.pushData) {
  8036. Recommend.recommendDic[FYHD_Sdk_1.FYHD_Sdk.pushData[key].location_flg] = new recommendPan(FYHD_Sdk_1.FYHD_Sdk.pushData[key]);
  8037. }
  8038. Recommend.getdata = true;
  8039. DispatcherManager_1.DispatcherManager.dispatchEvent(CpaEvent_1.default.YQHomeData);
  8040. console.log("互推数据初始化recommend--------------");
  8041. };
  8042. Recommend.GetSSDatas = function () {
  8043. var items = [];
  8044. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  8045. return items;
  8046. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  8047. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  8048. }
  8049. return items;
  8050. };
  8051. Recommend.GetCaiNiXiaHuanDatas = function () {
  8052. var items = [];
  8053. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  8054. return items;
  8055. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  8056. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  8057. }
  8058. return items;
  8059. };
  8060. Recommend.GetMoreDatas = function () {
  8061. var items = [];
  8062. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  8063. return items;
  8064. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  8065. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  8066. }
  8067. return items;
  8068. };
  8069. Recommend.GetBaoKuanYouXiDatas = function () {
  8070. var items = [];
  8071. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  8072. return items;
  8073. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  8074. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  8075. }
  8076. return items;
  8077. };
  8078. Recommend.GetJIeSuanDatas = function () {
  8079. var items = [];
  8080. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  8081. return items;
  8082. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  8083. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  8084. }
  8085. return items;
  8086. };
  8087. Recommend.GetGDYXDatas = function () {
  8088. var items = [];
  8089. if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
  8090. return items;
  8091. for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
  8092. items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
  8093. }
  8094. return items;
  8095. };
  8096. Recommend.getdata = false;
  8097. Recommend.recommendDic = {};
  8098. Recommend.cainixihuanData = [];
  8099. Recommend.baokuanyouxiData = [];
  8100. Recommend.gdyxData = [];
  8101. Recommend.jiesuanData = [];
  8102. Recommend.moreData = [];
  8103. return Recommend;
  8104. }());
  8105. exports.Recommend = Recommend;
  8106. var RecommendItem = /** @class */ (function () {
  8107. function RecommendItem(Data) {
  8108. this.icon = Data["icon"];
  8109. this.to_appid = Data["to_appid"];
  8110. this.togame_name = Data["togame_name"];
  8111. this.jump_path = Data["jump_path"];
  8112. this.jump_type = Data["jump_type"];
  8113. this.panel = Data["panel"];
  8114. this.qrcode = Data["qrcode"];
  8115. }
  8116. return RecommendItem;
  8117. }());
  8118. exports.RecommendItem = RecommendItem;
  8119. var RecommendView = /** @class */ (function () {
  8120. function RecommendView() {
  8121. }
  8122. return RecommendView;
  8123. }());
  8124. exports.default = RecommendView;
  8125. },{"../WXSDK/FYHD_Sdk":71,"../utils/DispatcherManager":85,"./CpaEvent":53}],56:[function(require,module,exports){
  8126. "use strict";
  8127. Object.defineProperty(exports, "__esModule", { value: true });
  8128. var PanelChildControl_1 = require("../Control/PanelChildControl");
  8129. var RecommendView_1 = require("./RecommendView");
  8130. var TimerService_1 = require("../Time/TimerService");
  8131. // import { ttad } from "../ttad";
  8132. var ShiwantuijianView = /** @class */ (function (_super) {
  8133. __extends(ShiwantuijianView, _super);
  8134. function ShiwantuijianView() {
  8135. var _this = _super.call(this) || this;
  8136. _this._iscanmove = false;
  8137. _this._movetime = 0;
  8138. _this._flushtime = 0;
  8139. _this.dir = true;
  8140. _this._nowvalue = 0;
  8141. return _this;
  8142. }
  8143. ShiwantuijianView.prototype.onInit = function () {
  8144. this.initView();
  8145. this.initEvent();
  8146. };
  8147. ShiwantuijianView.prototype.initView = function () {
  8148. this.list_0.setVirtual();
  8149. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
  8150. this._nowlist = RecommendView_1.Recommend.jiesuanData;
  8151. if (this._nowlist.length > 0) {
  8152. this.list_0.numItems = this._nowlist.length;
  8153. this.visible = true;
  8154. for (var i = 0; i < this._nowlist.length; i++) {
  8155. }
  8156. this._isStart = true;
  8157. this._iscanmove = true;
  8158. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  8159. }
  8160. else {
  8161. this.visible = false;
  8162. }
  8163. };
  8164. ShiwantuijianView.prototype.initEvent = function () {
  8165. this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
  8166. this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
  8167. this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
  8168. };
  8169. ShiwantuijianView.prototype.downclick = function () {
  8170. this._isdown = true;
  8171. this._iscanmove = false;
  8172. Laya.timer.clear(this, this.timeoutCallback);
  8173. // ttad.CreateMoreGameBtn();
  8174. };
  8175. ShiwantuijianView.prototype.timeoutCallback = function () {
  8176. this._iscanmove = true;
  8177. };
  8178. ShiwantuijianView.prototype.upclick = function () {
  8179. if (this._isdown) {
  8180. this._isdown = false;
  8181. this._nowvalue = this.list_0.scrollPane.percY;
  8182. Laya.timer.once(2000, this, this.timeoutCallback);
  8183. }
  8184. };
  8185. ShiwantuijianView.prototype.itemrenderlist = function (index, item) {
  8186. if (index < this._nowlist.length) {
  8187. item.showData(this._nowlist[index], true);
  8188. }
  8189. };
  8190. ShiwantuijianView.prototype.update = function (dt) {
  8191. if (this._isStart) {
  8192. if (this.list_0.scrollPane && this._nowlist && this._nowlist.length > 0 && this._iscanmove) {
  8193. if (this.dir) {
  8194. this._nowvalue += 0.001;
  8195. if (this._nowvalue >= 1) {
  8196. this._nowvalue = 1;
  8197. this.dir = false;
  8198. }
  8199. }
  8200. else {
  8201. this._nowvalue -= 0.001;
  8202. if (this._nowvalue <= 0) {
  8203. this._nowvalue = 0;
  8204. this.dir = true;
  8205. }
  8206. }
  8207. this.list_0.scrollPane.setPercY(this._nowvalue);
  8208. }
  8209. }
  8210. };
  8211. ShiwantuijianView.prototype.dispose = function () {
  8212. this._iscanmove = false;
  8213. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  8214. _super.prototype.dispose.call(this);
  8215. };
  8216. return ShiwantuijianView;
  8217. }(PanelChildControl_1.PanelChildControl));
  8218. exports.default = ShiwantuijianView;
  8219. },{"../Control/PanelChildControl":25,"../Time/TimerService":59,"./RecommendView":55}],57:[function(require,module,exports){
  8220. "use strict";
  8221. Object.defineProperty(exports, "__esModule", { value: true });
  8222. var RecommendView_1 = require("./RecommendView");
  8223. var ViewManager_1 = require("../View/ViewManager");
  8224. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8225. var GameUtils_1 = require("../utils/GameUtils");
  8226. var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
  8227. var TuijianView = /** @class */ (function (_super) {
  8228. __extends(TuijianView, _super);
  8229. function TuijianView() {
  8230. return _super.call(this, "main", "tuijianView") || this;
  8231. }
  8232. TuijianView.prototype.initView = function () {
  8233. this.list_1.setVirtual();
  8234. this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
  8235. this.list_2.setVirtual();
  8236. this.list_2.itemRenderer = Laya.Handler.create(this, this.itemrenderlist2, null, false);
  8237. this._nowlist1 = RecommendView_1.Recommend.gdyxData;
  8238. this._nowlist2 = RecommendView_1.Recommend.gdyxData;
  8239. this.list_1.numItems = 7;
  8240. this.list_2.numItems = this._nowlist2.length;
  8241. };
  8242. TuijianView.prototype.initEvent = function () {
  8243. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  8244. this.AddEventByType(this.more, Laya.Event.CLICK, this, this.JumpApp);
  8245. };
  8246. TuijianView.prototype.itemrenderlist1 = function (index, item) {
  8247. if (index < 7) {
  8248. item.showData(this._nowlist1[index]);
  8249. }
  8250. };
  8251. TuijianView.prototype.itemrenderlist2 = function (index, item) {
  8252. if (index < this._nowlist2.length) {
  8253. item.showData(this._nowlist2[index]);
  8254. }
  8255. };
  8256. TuijianView.prototype.onclosefun = function () {
  8257. ViewManager_1.ViewManager.Instance.close(TuijianView);
  8258. };
  8259. //随机跳转游戏
  8260. TuijianView.prototype.JumpApp = function () {
  8261. var ran = GameUtils_1.GameUtils.randRangeint(0, this._nowlist1.length - 1);
  8262. FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(this._nowlist1[ran], false);
  8263. };
  8264. TuijianView.key = "TuijianView";
  8265. return TuijianView;
  8266. }(PanelBaseControl_1.PanelBaseControl));
  8267. exports.default = TuijianView;
  8268. },{"../Control/PanelBaseControl":24,"../View/ViewManager":70,"../WXSDK/FYHD_Sdk":71,"../utils/GameUtils":87,"./RecommendView":55}],58:[function(require,module,exports){
  8269. "use strict";
  8270. Object.defineProperty(exports, "__esModule", { value: true });
  8271. var TimeUtils = /** @class */ (function () {
  8272. function TimeUtils() {
  8273. }
  8274. /**
  8275. * 月/日 小时:分钟
  8276. * @param value
  8277. */
  8278. TimeUtils.formatData = function (value) {
  8279. var str = "";
  8280. var date = new Date(value * 1000);
  8281. str = this.getTwo(date.getMonth() + 1) + "/" + this.getTwo(date.getDate()) + " " + this.getTwo(date.getHours()) + ":" + this.getTwo(date.getMinutes());
  8282. return str;
  8283. };
  8284. /**
  8285. * 月/日
  8286. * @param value
  8287. */
  8288. TimeUtils.formatData1 = function (value) {
  8289. var str = "";
  8290. var date = new Date(value * 1000);
  8291. str = (date.getMonth() + 1) + "月" + date.getDate() + "日";
  8292. return str;
  8293. };
  8294. /**
  8295. * 年月日
  8296. * @param value
  8297. */
  8298. TimeUtils.formatYearMonthDate = function (value) {
  8299. var str = "";
  8300. var date = new Date(value * 1000);
  8301. str = date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate();
  8302. return str;
  8303. };
  8304. /**
  8305. * 年-月-日
  8306. * @param value
  8307. */
  8308. TimeUtils.formatYearMonthDate1 = function (value) {
  8309. var str = "";
  8310. var date = new Date(value * 1000);
  8311. var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1).toString() : "0" + (date.getMonth() + 1);
  8312. var dates = date.getDate() >= 10 ? date.getDate().toString() : "0" + date.getDate();
  8313. str = date.getFullYear() + "-" + month + "-" + dates;
  8314. return str;
  8315. };
  8316. TimeUtils.LXandJXTimeType = function (value) {
  8317. var str = "";
  8318. if (value < 0) {
  8319. str = "0秒";
  8320. }
  8321. else if (value < 60) {
  8322. str = Math.floor(value) + "秒";
  8323. }
  8324. else if (value < 60 * 60) {
  8325. str = Math.floor(value / 60) + "分钟";
  8326. }
  8327. else {
  8328. var hour;
  8329. hour = Math.floor(value / 60 / 60);
  8330. str = hour + "小时";
  8331. str += Math.floor((value - hour * 60 * 60) / 60) + "分钟";
  8332. }
  8333. return str;
  8334. };
  8335. /**
  8336. * 格式化时间
  8337. * @param time 秒
  8338. * @return 返回24:59:59
  8339. */
  8340. TimeUtils.formatTime = function (time) {
  8341. var str = "";
  8342. var hours = Math.floor(time / 3600);
  8343. if (hours > 0) {
  8344. str += hours >= 10 ? (hours + ":") : ("0" + hours + ":");
  8345. }
  8346. var minutes = Math.floor((time % 3600) / 60);
  8347. str += minutes >= 10 ? (minutes + ":") : ("0" + minutes + ":");
  8348. var second = Math.floor(time % 60);
  8349. str += second >= 10 ? (second + "") : ("0" + second);
  8350. return str;
  8351. };
  8352. /**
  8353. * 格式化时间
  8354. * @param time 秒
  8355. * @return 返回24小时59分59秒
  8356. */
  8357. TimeUtils.formatTime1 = function (time) {
  8358. var str = "";
  8359. var hours = Math.floor(time / 3600);
  8360. if (hours > 0) {
  8361. str += hours + "小时";
  8362. }
  8363. var minutes = Math.floor((time % 3600) / 60);
  8364. str += minutes + "分钟";
  8365. var second = Math.floor(time % 60);
  8366. str += second + "秒";
  8367. return str;
  8368. };
  8369. /**
  8370. * 格式化时间
  8371. * @param time 秒
  8372. * @return 返回1小时24分10秒
  8373. */
  8374. TimeUtils.formatTime5 = function (time) {
  8375. var str = "";
  8376. var hours = Math.floor(time / 3600);
  8377. if (hours > 0) {
  8378. str += hours + "小时";
  8379. }
  8380. var minutes = Math.floor((time % 3600) / 60);
  8381. if (minutes > 0) {
  8382. str += minutes + "分";
  8383. }
  8384. var second = Math.floor(time % 60);
  8385. str += second + "秒";
  8386. return str;
  8387. };
  8388. /**
  8389. * 格式化时间
  8390. * @param time 秒
  8391. * @return 返回1天24小时59分59秒
  8392. */
  8393. TimeUtils.formatTime2 = function (time) {
  8394. var str = "";
  8395. var day = Math.floor(time / 86400);
  8396. if (day > 0) {
  8397. str += day + "天";
  8398. }
  8399. var hours = Math.floor(time / 3600);
  8400. if (hours > 0) {
  8401. str += hours + "小时";
  8402. }
  8403. var minutes = Math.floor((time % 3600) / 60);
  8404. if (minutes > 0) {
  8405. str += minutes + "分钟";
  8406. }
  8407. var second = Math.ceil(time % 60);
  8408. str += second + "秒";
  8409. return str;
  8410. };
  8411. /**
  8412. * 格式化时间
  8413. * @param time 秒
  8414. * @return 返回1天24小时( 只保留两个 )
  8415. */
  8416. TimeUtils.formatTime6 = function (time) {
  8417. var str = "";
  8418. var index = 0;
  8419. var day = Math.floor(time / 86400);
  8420. if (day > 0) {
  8421. str += day + "天";
  8422. index++;
  8423. }
  8424. var hours = Math.floor((time % 86400) / 3600);
  8425. if (hours > 0) {
  8426. str += hours + "小时";
  8427. index++;
  8428. }
  8429. if (index < 2) {
  8430. var minutes = Math.floor((time % 3600) / 60);
  8431. if (minutes > 0) {
  8432. str += minutes + "分";
  8433. index++;
  8434. }
  8435. }
  8436. if (index < 2) {
  8437. var second = Math.ceil(time % 60);
  8438. str += second + "秒";
  8439. }
  8440. return str;
  8441. };
  8442. /**
  8443. * 格式化时间
  8444. * @param time 秒
  8445. * @return 返回1天24小时59分
  8446. */
  8447. TimeUtils.formatTime3 = function (time) {
  8448. var str = "";
  8449. var day = Math.floor(time / 86400);
  8450. str += day + "天";
  8451. var hours = Math.floor(time % 86400 / 3600);
  8452. str += hours + "小时";
  8453. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8454. str += minutes + "分";
  8455. return str;
  8456. };
  8457. /**
  8458. * 格式化时间
  8459. * @param time 秒
  8460. * @return 返回1天24小时59分
  8461. */
  8462. TimeUtils.formatTime4 = function (time) {
  8463. var str = "";
  8464. if (time > 86400) {
  8465. var day = Math.floor(time / 86400);
  8466. str += day + "天";
  8467. }
  8468. if (time > 3600) {
  8469. var hours = Math.floor(time % 86400 / 3600);
  8470. str += hours + "小时";
  8471. }
  8472. if (time > 60) {
  8473. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8474. str += minutes + "分钟";
  8475. }
  8476. return str;
  8477. };
  8478. /**
  8479. * 格式化时间
  8480. * @param time 秒
  8481. * @return 返回1天24小时59分
  8482. */
  8483. TimeUtils.formatTime4Arr = function (time) {
  8484. var arrTime = [];
  8485. var str = "";
  8486. // if (time >= 86400) {
  8487. // var day: number = Math.floor(time / 86400);
  8488. // arrTime.unshift(String(day));
  8489. // }
  8490. if (time >= 3600) {
  8491. var hours = Math.floor(time % 86400 / 3600);
  8492. arrTime.unshift(String(hours));
  8493. }
  8494. if (time >= 60) {
  8495. var minutes = Math.floor((time % 86400 % 3600) / 60);
  8496. arrTime.unshift(String(minutes));
  8497. }
  8498. return arrTime;
  8499. };
  8500. TimeUtils.getTwo = function (value) {
  8501. var str = String(value);
  8502. if (str.length < 2) {
  8503. str = "0" + str;
  8504. }
  8505. return str;
  8506. };
  8507. /**
  8508. * 日期转时间戳
  8509. * @param str 2018-1-1
  8510. */
  8511. TimeUtils.datetoTime = function (str) {
  8512. return Date.parse(str) / 1000;
  8513. };
  8514. return TimeUtils;
  8515. }());
  8516. exports.TimeUtils = TimeUtils;
  8517. },{}],59:[function(require,module,exports){
  8518. "use strict";
  8519. Object.defineProperty(exports, "__esModule", { value: true });
  8520. /*
  8521. * name;
  8522. */
  8523. var TimerService = /** @class */ (function (_super) {
  8524. __extends(TimerService, _super);
  8525. function TimerService() {
  8526. var _this = _super.call(this) || this;
  8527. _this._timeScale = 1;
  8528. _this._unscalableList = [];
  8529. TimerService.ins = _this;
  8530. return _this;
  8531. }
  8532. Object.defineProperty(TimerService, "Instance", {
  8533. get: function () {
  8534. if (TimerService.ins == null) {
  8535. return new TimerService();
  8536. }
  8537. return TimerService.ins;
  8538. },
  8539. enumerable: true,
  8540. configurable: true
  8541. });
  8542. TimerService.prototype.init = function () {
  8543. Laya.timer.frameLoop(1, this, this.onTimer);
  8544. };
  8545. TimerService.prototype.initEvent = function () {
  8546. };
  8547. TimerService.prototype.stop = function () {
  8548. Laya.timer.clear(this, this.onTimer);
  8549. };
  8550. TimerService.prototype.recover = function () {
  8551. this.stop();
  8552. Laya.timer.frameLoop(1, this, this.onTimer);
  8553. };
  8554. TimerService.prototype.onTimer = function () {
  8555. var i = 0;
  8556. for (i = 0; i < this._unscalableList.length; i++) {
  8557. this._unscalableList[i].update(Laya.timer.delta * this._timeScale);
  8558. }
  8559. };
  8560. TimerService.prototype.hasUpdataTarget = function (updateTarget) {
  8561. var index;
  8562. index = this._unscalableList.indexOf(updateTarget);
  8563. if (index != -1) {
  8564. return true;
  8565. }
  8566. return false;
  8567. };
  8568. TimerService.prototype.addUpdateTarget = function (updateTarget) {
  8569. var index;
  8570. index = this._unscalableList.indexOf(updateTarget);
  8571. if (index == -1) {
  8572. this._unscalableList.push(updateTarget);
  8573. }
  8574. };
  8575. TimerService.prototype.removeUpdateTarget = function (updateTarget) {
  8576. var index = this._unscalableList.indexOf(updateTarget);
  8577. if (index != -1) {
  8578. this._unscalableList.splice(index, 1);
  8579. }
  8580. };
  8581. Object.defineProperty(TimerService.prototype, "timeScale", {
  8582. get: function () {
  8583. return this._timeScale;
  8584. },
  8585. /**
  8586. * @private
  8587. */
  8588. set: function (value) {
  8589. if (value < 0 || isNaN(value)) {
  8590. value = 1;
  8591. }
  8592. this._timeScale = value;
  8593. },
  8594. enumerable: true,
  8595. configurable: true
  8596. });
  8597. return TimerService;
  8598. }(Laya.EventDispatcher));
  8599. exports.TimerService = TimerService;
  8600. },{}],60:[function(require,module,exports){
  8601. "use strict";
  8602. Object.defineProperty(exports, "__esModule", { value: true });
  8603. var UserDataInfo_1 = require("../Data/UserDataInfo");
  8604. var LocalDataControl_1 = require("../Control/LocalDataControl");
  8605. var TimesTamper = /** @class */ (function () {
  8606. function TimesTamper() {
  8607. this.lastgameTime = 0;
  8608. /**
  8609. * 同步服务器时间(秒)
  8610. */
  8611. this._serverTime = 0;
  8612. this.iscan = false;
  8613. this._onlinedistime = 0;
  8614. this._time = 0;
  8615. this._onlinetime = 0;
  8616. }
  8617. Object.defineProperty(TimesTamper, "Instance", {
  8618. get: function () {
  8619. if (TimesTamper.ins == null) {
  8620. return new TimesTamper();
  8621. }
  8622. return TimesTamper.ins;
  8623. },
  8624. enumerable: true,
  8625. configurable: true
  8626. });
  8627. TimesTamper.prototype.init = function () {
  8628. this.lastgameTime = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.lasttime);
  8629. Laya.timer.frameLoop(1, this, this.update);
  8630. };
  8631. TimesTamper.prototype.updateServiceTime = function (serverTime) {
  8632. this._serverTime = Number(serverTime);
  8633. this.iscan = true;
  8634. this._onlinedistime = this._serverTime;
  8635. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
  8636. };
  8637. TimesTamper.prototype.update = function () {
  8638. if (this.iscan) {
  8639. this._time += Laya.timer.delta;
  8640. this._onlinetime += Laya.timer.delta;
  8641. this._serverTime += Laya.timer.delta / 1000;
  8642. if (this._time >= 30000) {
  8643. this._time = 0;
  8644. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
  8645. }
  8646. if (this._onlinetime >= 90000) {
  8647. this._onlinetime = 0;
  8648. this.sendonlineTongji();
  8649. }
  8650. }
  8651. };
  8652. TimesTamper.prototype.sendonlineTongji = function () {
  8653. var distime = this.serverTime - this._onlinedistime;
  8654. if (distime > 0) {
  8655. this._onlinedistime = this.serverTime;
  8656. }
  8657. };
  8658. Object.defineProperty(TimesTamper.prototype, "serverTime", {
  8659. /**
  8660. * 服务器时间 ( 秒 )
  8661. * @return
  8662. *
  8663. */
  8664. get: function () {
  8665. return this._serverTime;
  8666. },
  8667. enumerable: true,
  8668. configurable: true
  8669. });
  8670. return TimesTamper;
  8671. }());
  8672. exports.TimesTamper = TimesTamper;
  8673. },{"../Control/LocalDataControl":23,"../Data/UserDataInfo":35}],61:[function(require,module,exports){
  8674. "use strict";
  8675. Object.defineProperty(exports, "__esModule", { value: true });
  8676. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  8677. var ViewAction_1 = require("../utils/ViewAction");
  8678. var GameStateControl_1 = require("../Control/GameStateControl");
  8679. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  8680. var AgencyInGame_1 = require("../Agency/AgencyInGame");
  8681. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  8682. var ViewManager_1 = require("../View/ViewManager");
  8683. var GuangGao_1 = require("../WXSDK/GuangGao");
  8684. var GameState_1 = require("../utils/GameState");
  8685. var Player_1 = require("../Game/Player");
  8686. var PropManager_1 = require("../PrefabControl/PropManager");
  8687. var DispatcherManager_1 = require("../utils/DispatcherManager");
  8688. var CharacterState_1 = require("../PrefabControl/CharacterState");
  8689. var RecordManager_1 = require("../WXSDK/RecordManager");
  8690. var ttad_1 = require("../WXSDK/ttad");
  8691. // import ChoutiPanView from "../Push/ChoutiPanView";
  8692. var CompletePanel = /** @class */ (function (_super) {
  8693. __extends(CompletePanel, _super);
  8694. function CompletePanel(gold) {
  8695. var _this = _super.call(this, "main", "gameresult", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  8696. _this.getgold = 0;
  8697. _this._position = new Laya.Vector3();
  8698. _this._outPos = new Laya.Vector3();
  8699. _this.scaleDelta = 0;
  8700. _this.scale = new Laya.Vector3(0.1, 0.1, 0.1);
  8701. _this.time = 9;
  8702. _this.count = false;
  8703. _this.fuhuo = false;
  8704. _this.getgold = gold;
  8705. return _this;
  8706. }
  8707. /*************************************************************** */
  8708. CompletePanel.prototype.loadScene = function () {
  8709. Laya.Scene3D.load("res/threeDimen/scene/ParticleScene/Example_01.ls", Laya.Handler.create(this, function (scene) {
  8710. this.scene = Laya.stage.addChildAt(scene, 0);
  8711. var camera = this.scene.addChild(new Laya.Camera(0, 0.1, 100));
  8712. camera.transform.translate(new Laya.Vector3(0, 1, 0));
  8713. }));
  8714. };
  8715. CompletePanel.prototype.garbageCollection = function () {
  8716. this.scene.destroy(); //销毁场景
  8717. this.scene = null;
  8718. Laya.Resource.destroyUnusedResources(); //销毁无用资源(没有被场景树引用,并且没有加资源锁的)
  8719. };
  8720. /*************************************************************** */
  8721. CompletePanel.prototype.btn1click = function () {
  8722. if (this.c_state.selectedIndex == 0) {
  8723. if (this.duihao.visible) {
  8724. this.playvideocallback();
  8725. }
  8726. else {
  8727. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8728. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp();
  8729. this._gameProxy.returnmainview(true);
  8730. }
  8731. }
  8732. else if (this.c_state.selectedIndex == 1) {
  8733. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8734. this._gameProxy.returnmainview();
  8735. // ViewManager.Instance.add( ChoutiPanView );
  8736. }
  8737. else if (this.c_state.selectedIndex == 2) {
  8738. // ShareUtil.shareImage("分享复活----",this.sharerevive,"1")
  8739. this.sharerevive();
  8740. }
  8741. };
  8742. CompletePanel.prototype.onComplete = function () {
  8743. Laya.Sprite3D.load("res/threeDimen/skinModel/LayaMonkey/LayaMonkey.lh", Laya.Handler.create(this, function (layaMonkey3D) {
  8744. this.layaMonkey3D = layaMonkey3D;
  8745. this.scene.addChild(layaMonkey3D);
  8746. this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
  8747. Laya.timer.frameLoop(1, this, this.animate);
  8748. }));
  8749. };
  8750. CompletePanel.prototype.animate = function () {
  8751. this._position.x = Math.sin(this.scaleDelta += 0.01);
  8752. this.layaMonkey3D.transform.position = this._position;
  8753. this.layaMonkey3D.transform.scale = this.scale;
  8754. //转换坐标
  8755. this.camera.viewport.project(this.layaMonkey3D.transform.position, this.camera.projectionViewMatrix, this._outPos);
  8756. //赋值给2D
  8757. this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
  8758. };
  8759. /******************************************** */
  8760. CompletePanel.prototype.btn0click = function () {
  8761. if (this.c_state.selectedIndex == 0) {
  8762. this.playvideocallback();
  8763. // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
  8764. }
  8765. else if (this.c_state.selectedIndex == 1) {
  8766. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
  8767. this._gameProxy.returnmainview();
  8768. // ViewManager.Instance.add( ChoutiPanView );
  8769. }
  8770. else if (this.c_state.selectedIndex == 2) {
  8771. this.count = false;
  8772. // pingtaiutils.Instance.playVideo("",this,this.playvideorevive);
  8773. this.playvideorevive();
  8774. }
  8775. };
  8776. /**看视频复活成功 */
  8777. CompletePanel.prototype.playvideorevive = function () {
  8778. var _this = this;
  8779. ttad_1.ttad.ShowVideo((function (isLoad) {
  8780. if (isLoad) {
  8781. // ViewManager.Instance.add(ChoutiPanView);
  8782. GameState_1.GameState.fuhuocishu--;
  8783. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8784. GameState_1.GameState.isdie = false;
  8785. Player_1.Player.Instance._iscanMove = true;
  8786. // Player.Instance.PlayAnimator( CharacterState.run );
  8787. Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
  8788. if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
  8789. console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
  8790. console.log("玩家速度_moveVec", Player_1.Player.Instance._moveVec);
  8791. Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
  8792. }
  8793. else {
  8794. console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
  8795. console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
  8796. console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
  8797. Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
  8798. }
  8799. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
  8800. Laya.timer.once(3000, _this, function () {
  8801. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
  8802. });
  8803. }
  8804. else {
  8805. _this.count = true;
  8806. }
  8807. }));
  8808. };
  8809. /**分享复活成功 */
  8810. CompletePanel.prototype.sharerevive = function () {
  8811. var _this = this;
  8812. RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
  8813. if (isLoad) {
  8814. RecordManager_1.RecordManager.Instance.RecordStart();
  8815. GameState_1.GameState.fuhuocishu--;
  8816. // GameState.recordscree = true;
  8817. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  8818. GameState_1.GameState.isdie = false;
  8819. Player_1.Player.Instance._iscanMove = true;
  8820. // Player.Instance.PlayAnimator( CharacterState.run );
  8821. Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
  8822. if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
  8823. console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
  8824. Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
  8825. }
  8826. else {
  8827. console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
  8828. console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
  8829. console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
  8830. Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
  8831. }
  8832. // GlobalTip.Instance.showWordTips("复活加速成功");
  8833. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
  8834. Laya.timer.once(3000, _this, function () {
  8835. Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
  8836. });
  8837. }
  8838. else {
  8839. _this.count = true;
  8840. }
  8841. });
  8842. // if(_success){
  8843. // // ViewManager.Instance.add(ChoutiPanView);
  8844. // GameState.fuhuocishu --;
  8845. // ViewManager.Instance.close( CompletePanel );
  8846. // GameState.isdie = false;
  8847. // Player.Instance._iscanMove = true;
  8848. // // Player.Instance.PlayAnimator( CharacterState.run );
  8849. // Player.Instance.nowAction = CharacterState.run;
  8850. // if (Player.Instance._nowscenename == "" || Player.Instance._nowbuildname == "") {
  8851. // console.log("玩家位置----",Player.Instance._initPosVec);
  8852. // Player.Instance._transform.position = Player.Instance._initPosVec.clone()
  8853. // }
  8854. // else {
  8855. // console.log("当前场景名字---",Player.Instance._nowscenename);
  8856. // console.log("当前建筑名字---",Player.Instance._nowbuildname);
  8857. // console.log("建筑物位置----",PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname));
  8858. // Player.Instance._transform.position = PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname).clone();
  8859. // }
  8860. // // GlobalTip.Instance.showWordTips("复活加速成功");
  8861. // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed*2;
  8862. // Laya.timer.once(3000,this,()=>{
  8863. // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed;
  8864. // })
  8865. // }
  8866. // else{
  8867. // this.count = true;
  8868. // }
  8869. };
  8870. CompletePanel.prototype.playvideocallback = function () {
  8871. var _this = this;
  8872. ttad_1.ttad.ShowVideo((function (isLoad) {
  8873. if (isLoad) {
  8874. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3);
  8875. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp();
  8876. _this._gameProxy.returnmainview(true);
  8877. _this.BattleBtn.visible = false;
  8878. }
  8879. }));
  8880. // ttad.ShowVideo((isLoad=>{
  8881. // if(isLoad){
  8882. // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( this.getgold*3 );
  8883. // this._gameProxy.returnmainview(true);
  8884. // }
  8885. // }))
  8886. };
  8887. //分享视频
  8888. CompletePanel.prototype.ShareVideoCallBack = function () {
  8889. var _this = this;
  8890. RecordManager_1.RecordManager.Instance.ShareVideo((function (isLoad) {
  8891. if (isLoad) {
  8892. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3);
  8893. _this.BattleBtn.visible = false;
  8894. _this.ShareVideo.visible = false;
  8895. }
  8896. }));
  8897. };
  8898. //点击勾选框
  8899. CompletePanel.prototype.ClickKuang = function () {
  8900. if (this.duihao.visible) {
  8901. this.duihao.visible = false;
  8902. this.btn_1.visible = this.duihao.visible;
  8903. this.btn_2.visible = !this.duihao.visible;
  8904. }
  8905. else {
  8906. this.duihao.visible = true;
  8907. this.btn_1.visible = this.duihao.visible;
  8908. this.btn_2.visible = !this.duihao.visible;
  8909. }
  8910. };
  8911. CompletePanel.prototype.destory = function () {
  8912. Laya.timer.clear(this, this.CountTime);
  8913. // Laya.timer.clear(this,this.playanimator);
  8914. // GuangGao.Clear();
  8915. ttad_1.ttad.Clear();
  8916. _super.prototype.destory.call(this);
  8917. };
  8918. CompletePanel.prototype.initView = function () {
  8919. var _this = this;
  8920. this.tianjia.visible = false;
  8921. this.TianJiaAni = this.getTransitionByName("tianjiaani");
  8922. this.TianJiaAni.stop();
  8923. // Laya.timer.loop(2000,this,this.playanimator);
  8924. this.count = true;
  8925. this._gameProxy = this.getProxy(AgencyInGame_1.AgencyInGame);
  8926. this.c_state = this.getControllerByBame("c_state");
  8927. this.txt_gold.text = this.getgold.toString();
  8928. this.duihao = this.kuang.getChildAt(1);
  8929. this.duihao.visible = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.Choose;
  8930. this.share_goldnum = this.ShareVideo.getChildAt(4);
  8931. this.ShareVideoBtn = this.ShareVideo.getChildAt(1);
  8932. this.jiesuanbtn = this.ShareVideo.getChildAt(2);
  8933. this.share_goldnum.text = this.getgold.toString();
  8934. this.btn_1.visible = this.duihao.visible;
  8935. this.btn_2.visible = !this.duihao.visible;
  8936. if (GameState_1.GameState.recordscree) {
  8937. this.BattleBtn.visible = false;
  8938. }
  8939. else {
  8940. this.BattleBtn.visible = false;
  8941. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShowBattleBtn) {
  8942. this.BattleBtn.visible = true;
  8943. }
  8944. }
  8945. // this.BattleBtn.visible = !GameState.recordscree;
  8946. if (!GameState_1.GameState.isdie) { //玩家未死亡的状态
  8947. if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
  8948. this.c_state.selectedIndex = 0;
  8949. }
  8950. else {
  8951. this.c_state.selectedIndex = 1;
  8952. }
  8953. }
  8954. else {
  8955. if (GameState_1.GameState.fuhuocishu > 0) {
  8956. this.c_state.selectedIndex = 2;
  8957. Laya.timer.loop(1000, this, this.CountTime);
  8958. }
  8959. else {
  8960. this.c_state.selectedIndex = 1;
  8961. }
  8962. }
  8963. if (this.c_state.selectedIndex == 0) {
  8964. this.ShareVideo.visible = true;
  8965. this.jiesuanbtn.visible = false;
  8966. Laya.timer.once(2000, this, function () {
  8967. _this.jiesuanbtn.visible = true;
  8968. });
  8969. }
  8970. else {
  8971. this.ShareVideo.visible = false;
  8972. }
  8973. GuangGao_1.GuangGao.CheatBanner(this.btn_1);
  8974. };
  8975. CompletePanel.prototype.playanimator = function () {
  8976. this.TianJiaAni.play(null, 1);
  8977. };
  8978. CompletePanel.prototype.ClickJieSuan = function () {
  8979. this.ShareVideo.visible = false;
  8980. };
  8981. CompletePanel.prototype.initEvent = function () {
  8982. this.AddEventByType(this.btn_0, Laya.Event.CLICK, this, this.btn0click);
  8983. this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.btn1click);
  8984. this.AddEventByType(this.BattleBtn, Laya.Event.CLICK, this, this.ShareBattle);
  8985. this.AddEventByType(this.btn_2, Laya.Event.CLICK, this, this.btn1click);
  8986. this.AddEventByType(this.kuang, Laya.Event.CLICK, this, this.ClickKuang);
  8987. this.AddEventByType(this.ShareVideoBtn, Laya.Event.CLICK, this, this.ShareVideoCallBack);
  8988. this.AddEventByType(this.jiesuanbtn, Laya.Event.CLICK, this, this.ClickJieSuan);
  8989. };
  8990. //倒计时
  8991. CompletePanel.prototype.CountTime = function () {
  8992. if (this.count && this.time > 0) {
  8993. this.time -= 1;
  8994. this.timenum.text = this.time.toString();
  8995. if (this.time < 1) {
  8996. Laya.timer.clear(this, this.CountTime);
  8997. GameState_1.GameState.fuhuocishu--;
  8998. // Laya.timer.clear(this,this.playanimator);
  8999. ViewManager_1.ViewManager.Instance.close(CompletePanel);
  9000. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
  9001. }
  9002. }
  9003. };
  9004. //录屏分享
  9005. CompletePanel.prototype.ShareBattle = function () {
  9006. var _this = this;
  9007. RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
  9008. if (isLoad) {
  9009. _this.BattleBtn.visible = false;
  9010. }
  9011. });
  9012. // RecordManager.Instance.ShareVideo((isLoad=>{
  9013. // if(isLoad){
  9014. // this.BattleBtn.visible = false;
  9015. // }
  9016. // }))
  9017. };
  9018. CompletePanel.key = "CompletePanel";
  9019. return CompletePanel;
  9020. }(PanelBaseControl_1.PanelBaseControl));
  9021. exports.CompletePanel = CompletePanel;
  9022. },{"../Agency/AgencyInGame":2,"../Agency/AgencyUserMessage":8,"../Control/GameStateControl":21,"../Control/PanelBaseControl":24,"../Game/Player":40,"../PrefabControl/CharacterState":46,"../PrefabControl/PropManager":49,"../View/ViewManager":70,"../WXSDK/GuangGao":72,"../WXSDK/PlayerAccount":75,"../WXSDK/RecordManager":76,"../WXSDK/ttad":83,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/ViewAction":93}],62:[function(require,module,exports){
  9023. "use strict";
  9024. Object.defineProperty(exports, "__esModule", { value: true });
  9025. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9026. var GameUtils_1 = require("../utils/GameUtils");
  9027. var TimerService_1 = require("../Time/TimerService");
  9028. var GuangGao_1 = require("../WXSDK/GuangGao");
  9029. var ViewAction_1 = require("../utils/ViewAction");
  9030. var ViewManager_1 = require("./ViewManager");
  9031. var SceneControl_1 = require("../Control/SceneControl");
  9032. var GameStateControl_1 = require("../Control/GameStateControl");
  9033. var GlobalTip_1 = require("../utils/GlobalTip");
  9034. var ttad_1 = require("../WXSDK/ttad");
  9035. var EggPanel = /** @class */ (function (_super) {
  9036. __extends(EggPanel, _super);
  9037. function EggPanel() {
  9038. var _this = _super.call(this, "main", "eggview", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  9039. _this._isComplete = false;
  9040. _this._isShowBanner = false;
  9041. _this._bannerVal = 0.5;
  9042. _this._maxClickCnt = 18;
  9043. _this._clickCnt = 0;
  9044. _this._interval = 100;
  9045. _this._decrement = 1;
  9046. _this._time = 0;
  9047. return _this;
  9048. }
  9049. EggPanel.prototype.initView = function () {
  9050. this.hitani = this.getTransitionByName("hitani");
  9051. this.pro_0.value = 1;
  9052. this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
  9053. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  9054. // GuangGao.CheatBanner(this.btn_1);
  9055. // GuangGao.Clear();//h["default"].Clear()r["default"]
  9056. ttad_1.ttad.Clear();
  9057. var sceneheight = Laya.stage.height;
  9058. this.btn_1.y = sceneheight - this.btn_1.height - 15;
  9059. this.getrewardbtn.y = this.btn_1.y;
  9060. this.getrewardbtn.visible = false;
  9061. if (SceneControl_1.SceneControl.EggGGroup == 0) {
  9062. this.n6.visible = true;
  9063. }
  9064. };
  9065. EggPanel.prototype.bannercallback = function () {
  9066. };
  9067. EggPanel.prototype.initEvent = function () {
  9068. this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.qiaoDa);
  9069. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, EggPanel.onclosefun);
  9070. this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, EggPanel.VideoGetReward);
  9071. };
  9072. EggPanel.prototype.update = function (dt) {
  9073. this._time += dt;
  9074. if (this._time >= this._interval) {
  9075. this._time = 0;
  9076. this.Daojishi();
  9077. }
  9078. };
  9079. EggPanel.prototype.Daojishi = function () {
  9080. var pv = this.pro_0.value;
  9081. pv -= this._decrement;
  9082. if (pv <= 0)
  9083. pv = 1;
  9084. this.pro_0.value = pv;
  9085. this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
  9086. };
  9087. EggPanel.prototype.qiaoDa = function () {
  9088. var _this = this;
  9089. if (!this._isComplete) {
  9090. if (this.hitani != null && !this.hitani.playing) {
  9091. this.hitani.play(null, 1);
  9092. }
  9093. this._clickCnt++;
  9094. if (this._clickCnt > this._maxClickCnt)
  9095. this._clickCnt = this._maxClickCnt;
  9096. var pv = this._clickCnt / this._maxClickCnt;
  9097. if (pv > 1) {
  9098. pv = 1;
  9099. }
  9100. this.pro_0.value = pv * 100;
  9101. if (pv >= this._bannerVal && !this._isShowBanner) {
  9102. this._isShowBanner = true;
  9103. this.getrewardbtn.visible = true;
  9104. // GuangGao.OpenBanner();
  9105. Laya.timer.once(2000, this, function () {
  9106. _this.getrewardbtn.visible = false;
  9107. });
  9108. }
  9109. if (pv >= 1) {
  9110. this._isComplete = true;
  9111. EggPanel.getreward();
  9112. }
  9113. }
  9114. };
  9115. EggPanel.getreward = function () {
  9116. // var zpproxy:AgencyLottery = this.getProxy( AgencyLottery ) as AgencyLottery;
  9117. // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
  9118. // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
  9119. // zpproxy.getreward( selectcfg );
  9120. // TimerService.Instance.removeUpdateTarget( this );
  9121. GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
  9122. EggPanel.onclosefun();
  9123. };
  9124. //看视频得奖励
  9125. EggPanel.VideoGetReward = function () {
  9126. ttad_1.ttad.ShowVideo((function (isLoad) {
  9127. if (isLoad) {
  9128. GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
  9129. EggPanel.onclosefun();
  9130. }
  9131. else {
  9132. EggPanel.onclosefun();
  9133. }
  9134. }));
  9135. };
  9136. EggPanel.prototype.hidebanner = function () {
  9137. // PlatformTool.getInstance().hideBanner("EggView");
  9138. GuangGao_1.GuangGao.hidebanner();
  9139. };
  9140. EggPanel.onclosefun = function () {
  9141. ViewManager_1.ViewManager.Instance.close(EggPanel);
  9142. };
  9143. EggPanel.prototype.destory = function () {
  9144. // PlatformTool.getInstance().hideBanner("EggView");
  9145. // GuangGao.hidebanner();
  9146. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  9147. _super.prototype.destory.call(this);
  9148. GameStateControl_1.GameStateControl.Instance.entergame(true);
  9149. };
  9150. EggPanel.key = "EggPanel";
  9151. return EggPanel;
  9152. }(PanelBaseControl_1.PanelBaseControl));
  9153. exports.default = EggPanel;
  9154. },{"../Control/GameStateControl":21,"../Control/PanelBaseControl":24,"../Control/SceneControl":29,"../Time/TimerService":59,"../WXSDK/GuangGao":72,"../WXSDK/ttad":83,"../utils/GameUtils":87,"../utils/GlobalTip":88,"../utils/ViewAction":93,"./ViewManager":70}],63:[function(require,module,exports){
  9155. "use strict";
  9156. Object.defineProperty(exports, "__esModule", { value: true });
  9157. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9158. var GameUtils_1 = require("../utils/GameUtils");
  9159. var TimerService_1 = require("../Time/TimerService");
  9160. var GuangGao_1 = require("../WXSDK/GuangGao");
  9161. var ViewManager_1 = require("./ViewManager");
  9162. var GlobalTip_1 = require("../utils/GlobalTip");
  9163. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  9164. var RoleData_1 = require("../Data/RoleData");
  9165. var ttad_1 = require("../WXSDK/ttad");
  9166. var GiftView = /** @class */ (function (_super) {
  9167. __extends(GiftView, _super);
  9168. function GiftView() {
  9169. var _this = _super.call(this, "main", "giftcheatview") || this;
  9170. _this._isComplete = false;
  9171. _this._isShowBanner = false;
  9172. _this._bannerVal = 0.5;
  9173. _this._maxClickCnt = 18;
  9174. _this._clickCnt = 0;
  9175. _this._interval = 100;
  9176. _this._decrement = 1;
  9177. _this._time = 0;
  9178. return _this;
  9179. }
  9180. GiftView.prototype.initView = function () {
  9181. this.anniu = this.item.asCom.getChildAt(2);
  9182. this.kuaisudianji = this.item.asCom.getChildAt(0);
  9183. this.shou = this.item.asCom.getChildAt(3);
  9184. this.di = this.item.asCom.getChildAt(1);
  9185. this.getrewardbtn = this.item.asCom.getChildAt(4);
  9186. this.getrewardbtn.visible = false;
  9187. this.clickani = this.item.getTransition("clickbtnani");
  9188. this.jindu.value = 1;
  9189. this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
  9190. TimerService_1.TimerService.Instance.addUpdateTarget(this);
  9191. // GuangGao.Clear();
  9192. ttad_1.ttad.Clear();
  9193. Laya.timer.loop(2000, this, this.playAnimator);
  9194. // var sceneheight = Laya.stage.height;
  9195. // this.btnbox.y=sceneheight-this.btnbox.y-15;
  9196. };
  9197. GiftView.prototype.playAnimator = function () {
  9198. this.clickani.play(null, 1);
  9199. };
  9200. GiftView.prototype.initEvent = function () {
  9201. this.AddEventByType(this.anniu, Laya.Event.CLICK, this, this.qiaoDa);
  9202. this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, this.VideoGetReward);
  9203. };
  9204. GiftView.prototype.update = function (dt) {
  9205. this._time += dt;
  9206. if (this._time >= this._interval) {
  9207. this._time = 0;
  9208. this.Daojishi();
  9209. }
  9210. };
  9211. GiftView.prototype.Daojishi = function () {
  9212. var pv = this.jindu.value;
  9213. pv -= this._decrement;
  9214. if (pv <= 0)
  9215. pv = 1;
  9216. this.jindu.value = pv;
  9217. this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
  9218. };
  9219. GiftView.prototype.qiaoDa = function () {
  9220. var _this = this;
  9221. if (this.shou.visible) {
  9222. this.shou.visible = false;
  9223. this.kuaisudianji.visible = false;
  9224. Laya.timer.clear(this, this.playAnimator);
  9225. }
  9226. if (!this._isComplete) {
  9227. this._clickCnt++;
  9228. if (this._clickCnt > this._maxClickCnt)
  9229. this._clickCnt = this._maxClickCnt;
  9230. var pv = this._clickCnt / this._maxClickCnt;
  9231. if (pv > 1) {
  9232. pv = 1;
  9233. }
  9234. this.jindu.value = pv * 100;
  9235. if (pv >= this._bannerVal && !this._isShowBanner) {
  9236. this._isShowBanner = true;
  9237. this.getrewardbtn.visible = true;
  9238. Laya.timer.once(2000, this, function () {
  9239. _this.getrewardbtn.visible = false;
  9240. });
  9241. }
  9242. if (pv >= 1) {
  9243. this._isComplete = true;
  9244. GiftView.getreward();
  9245. }
  9246. }
  9247. };
  9248. GiftView.getreward = function () {
  9249. RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
  9250. // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( PlayerAccount.CurrentAccount.CurAccountData.CheatReward );
  9251. // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
  9252. // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
  9253. // zpproxy.getreward( selectcfg );
  9254. // TimerService.Instance.removeUpdateTarget( this );
  9255. GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
  9256. GiftView.onclosefun();
  9257. };
  9258. //看视频得奖励
  9259. GiftView.prototype.VideoGetReward = function () {
  9260. ttad_1.ttad.ShowVideo((function (isLoad) {
  9261. if (isLoad) {
  9262. RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
  9263. GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
  9264. GiftView.onclosefun();
  9265. }
  9266. else {
  9267. GiftView.onclosefun();
  9268. }
  9269. }));
  9270. };
  9271. GiftView.prototype.hidebanner = function () {
  9272. GuangGao_1.GuangGao.hidebanner();
  9273. };
  9274. GiftView.onclosefun = function () {
  9275. ViewManager_1.ViewManager.Instance.close(GiftView);
  9276. };
  9277. GiftView.prototype.destory = function () {
  9278. GuangGao_1.GuangGao.hidebanner();
  9279. TimerService_1.TimerService.Instance.removeUpdateTarget(this);
  9280. _super.prototype.destory.call(this);
  9281. };
  9282. GiftView.key = "GiftView";
  9283. return GiftView;
  9284. }(PanelBaseControl_1.PanelBaseControl));
  9285. exports.default = GiftView;
  9286. },{"../Control/PanelBaseControl":24,"../Data/RoleData":33,"../Time/TimerService":59,"../WXSDK/GuangGao":72,"../WXSDK/PlayerAccount":75,"../WXSDK/ttad":83,"../utils/GameUtils":87,"../utils/GlobalTip":88,"./ViewManager":70}],64:[function(require,module,exports){
  9287. "use strict";
  9288. Object.defineProperty(exports, "__esModule", { value: true });
  9289. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9290. var DispatcherManager_1 = require("../utils/DispatcherManager");
  9291. var GameState_1 = require("../utils/GameState");
  9292. /*
  9293. * name;
  9294. */
  9295. var WordTipsPanel = /** @class */ (function (_super) {
  9296. __extends(WordTipsPanel, _super);
  9297. function WordTipsPanel() {
  9298. var _this = _super.call(this, "loading", "wordTips") || this;
  9299. _this.nowword = "";
  9300. return _this;
  9301. }
  9302. /****************************************** */
  9303. WordTipsPanel.prototype.showText = function () {
  9304. var text = new Laya.Text();
  9305. text.text = "Orientation-Portrait";
  9306. text.color = "gray";
  9307. text.font = "Impact";
  9308. text.fontSize = 50;
  9309. text.x = Laya.stage.width - text.width >> 1;
  9310. text.y = Laya.stage.height - text.height >> 1;
  9311. Laya.stage.addChild(text);
  9312. };
  9313. /****************************************** */
  9314. WordTipsPanel.prototype.showWord = function (word) {
  9315. this.nowword = word;
  9316. this.text_word.text = word;
  9317. this.t1.play(Laya.Handler.create(this, this.playEndCallback), 1);
  9318. };
  9319. WordTipsPanel.prototype.onInit = function () {
  9320. _super.prototype.onInit.call(this);
  9321. this.t1 = this.getpanelTransition("t1");
  9322. };
  9323. WordTipsPanel.prototype.createCantralRect = function () {
  9324. this.rect = new Laya.Sprite();
  9325. this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
  9326. Laya.stage.addChild(this.rect);
  9327. this.updateRectPos();
  9328. };
  9329. WordTipsPanel.prototype.updateRectPos = function () {
  9330. this.rect.x = Laya.stage.width / 2;
  9331. this.rect.y = Laya.stage.height / 2;
  9332. };
  9333. /*************************************************** */
  9334. WordTipsPanel.prototype.playEndCallback = function () {
  9335. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.removeselect, this);
  9336. };
  9337. WordTipsPanel.key = "WordTipsPanel";
  9338. return WordTipsPanel;
  9339. }(PanelBaseControl_1.PanelBaseControl));
  9340. exports.WordTipsPanel = WordTipsPanel;
  9341. },{"../Control/PanelBaseControl":24,"../utils/DispatcherManager":85,"../utils/GameState":86}],65:[function(require,module,exports){
  9342. "use strict";
  9343. Object.defineProperty(exports, "__esModule", { value: true });
  9344. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9345. var LoadingPanel = /** @class */ (function (_super) {
  9346. __extends(LoadingPanel, _super);
  9347. function LoadingPanel() {
  9348. return _super.call(this, "loading", "loading") || this;
  9349. }
  9350. LoadingPanel.prototype.onInit = function () {
  9351. _super.prototype.onInit.call(this);
  9352. };
  9353. LoadingPanel.prototype.showWord = function (value) {
  9354. this.pro.value = value;
  9355. };
  9356. LoadingPanel.prototype.onBoyClick = function (e) {
  9357. //点击后小人会放大缩小
  9358. var boy = e.target;
  9359. if (boy.scaleX === 1) {
  9360. boy.scale(1.2, 1.2);
  9361. }
  9362. else {
  9363. boy.scale(1, 1);
  9364. }
  9365. };
  9366. LoadingPanel.prototype.onTxtClick = function (e) {
  9367. //点击后切换适配模式
  9368. e.stopPropagation();
  9369. };
  9370. LoadingPanel.prototype.destory = function () {
  9371. this.clearEvent();
  9372. _super.prototype.destory.call(this);
  9373. };
  9374. LoadingPanel.key = "LoadingPanel";
  9375. return LoadingPanel;
  9376. }(PanelBaseControl_1.PanelBaseControl));
  9377. exports.LoadingPanel = LoadingPanel;
  9378. },{"../Control/PanelBaseControl":24}],66:[function(require,module,exports){
  9379. "use strict";
  9380. Object.defineProperty(exports, "__esModule", { value: true });
  9381. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9382. var ViewAction_1 = require("../utils/ViewAction");
  9383. var ViewManager_1 = require("../View/ViewManager");
  9384. var LotteryCFG_1 = require("../CFG/LotteryCFG");
  9385. var AssetPath_1 = require("../Config/AssetPath");
  9386. var RoleCFG_1 = require("../CFG/RoleCFG");
  9387. var AgencyLottery_1 = require("../Agency/AgencyLottery");
  9388. var GuangGao_1 = require("../WXSDK/GuangGao");
  9389. var ttad_1 = require("../WXSDK/ttad");
  9390. var LotteryPanel = /** @class */ (function (_super) {
  9391. __extends(LotteryPanel, _super);
  9392. function LotteryPanel() {
  9393. return _super.call(this, "main", "LotteryView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  9394. }
  9395. LotteryPanel.prototype.showLogger = function () {
  9396. this.logger = new Laya.Text();
  9397. this.logger.fontSize = 30;
  9398. this.logger.color = "#FFFFFF";
  9399. this.logger.align = 'center';
  9400. this.logger.valign = 'middle';
  9401. this.logger.size(Laya.stage.width, Laya.stage.height);
  9402. this.logger.text = "等待响应...\n";
  9403. Laya.stage.addChild(this.logger);
  9404. };
  9405. /************************************* */
  9406. LotteryPanel.prototype.onHttpRequestError = function (e) {
  9407. console.log(e);
  9408. };
  9409. LotteryPanel.prototype.initEvent = function () {
  9410. this.AddEventByType(this.backbtn, Laya.Event.CLICK, this, this.onclosefun);
  9411. this.AddEventByType(this.lotterybtn, Laya.Event.CLICK, this, this.choujiangclick);
  9412. };
  9413. LotteryPanel.prototype.playComplte = function () {
  9414. if (this.tw) {
  9415. this.tw.clear();
  9416. this.tw = null;
  9417. }
  9418. this.backbtn.enabled = true;
  9419. this.lotterybtn.enabled = true;
  9420. this.agencylottery.getreward(this._selectcfg);
  9421. };
  9422. LotteryPanel.prototype.onclosefun = function () {
  9423. if (this.tw) {
  9424. this.tw.clear();
  9425. this.tw = null;
  9426. }
  9427. GuangGao_1.GuangGao.Clear();
  9428. ViewManager_1.ViewManager.Instance.close(LotteryPanel);
  9429. };
  9430. LotteryPanel.prototype.initView = function () {
  9431. this.agencylottery = this.getProxy(AgencyLottery_1.AgencyLottery);
  9432. var vec = LotteryCFG_1.default.vec;
  9433. for (var i = 0; i < vec.length; i++) {
  9434. var cfg = vec[i];
  9435. if (cfg.type == 1) {
  9436. this["icon_" + i].url = fairygui.UIPackage.getItemURL("main", "img_gold");
  9437. this["txt_" + i].text = "X" + cfg.value;
  9438. }
  9439. else {
  9440. var rolecfg = RoleCFG_1.default.dict[cfg.value];
  9441. this["icon_" + i].url = AssetPath_1.AssetPath.getroleicon(rolecfg.icon);
  9442. this["txt_" + i].text = rolecfg.rolename;
  9443. }
  9444. }
  9445. GuangGao_1.GuangGao.CheatBanner(this.lotterybtn);
  9446. };
  9447. /**************************************** */
  9448. LotteryPanel.prototype.onSocketClose = function () {
  9449. console.log("Socket closed");
  9450. };
  9451. LotteryPanel.prototype.onMessageReveived = function (message) {
  9452. console.log("Message from server:");
  9453. if (typeof message == "string") {
  9454. console.log(message);
  9455. }
  9456. else if (message instanceof ArrayBuffer) {
  9457. }
  9458. };
  9459. /**************************************** */
  9460. LotteryPanel.prototype.choujiangclick = function () {
  9461. this.videocallback();
  9462. // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
  9463. };
  9464. LotteryPanel.prototype.videocallback = function () {
  9465. var _this = this;
  9466. ttad_1.ttad.ShowVideo((function (isLoad) {
  9467. if (isLoad) {
  9468. _this.startPlay();
  9469. }
  9470. }));
  9471. };
  9472. LotteryPanel.prototype.startPlay = function () {
  9473. var index = this.agencylottery.GetReward();
  9474. this._selectcfg = LotteryCFG_1.default.vec[index];
  9475. this.backbtn.enabled = false;
  9476. this.lotterybtn.enabled = false;
  9477. this._nowgetIndex = index;
  9478. var angle = 360 * 6 + (this._nowgetIndex) * 45 - 15;
  9479. if (this.item_panel.rotation == 0) {
  9480. this._tweeObject = { value: 0 };
  9481. }
  9482. else {
  9483. this._tweeObject = { value: this._preIndex * 45 - 15 };
  9484. }
  9485. this._preIndex = this._nowgetIndex;
  9486. this.tw = laya.utils.Tween.to(this._tweeObject, { value: angle }, 3000, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.playComplte));
  9487. this.tw.update = Laya.Handler.create(this, function () {
  9488. var value = this._tweeObject.value % 360;
  9489. this.item_panel.rotation = value;
  9490. }, null, false);
  9491. };
  9492. LotteryPanel.key = "LotteryPanel";
  9493. return LotteryPanel;
  9494. }(PanelBaseControl_1.PanelBaseControl));
  9495. exports.LotteryPanel = LotteryPanel;
  9496. },{"../Agency/AgencyLottery":4,"../CFG/LotteryCFG":12,"../CFG/RoleCFG":14,"../Config/AssetPath":15,"../Control/PanelBaseControl":24,"../View/ViewManager":70,"../WXSDK/GuangGao":72,"../WXSDK/ttad":83,"../utils/ViewAction":93}],67:[function(require,module,exports){
  9497. "use strict";
  9498. Object.defineProperty(exports, "__esModule", { value: true });
  9499. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9500. var GameStateControl_1 = require("../Control/GameStateControl");
  9501. var DispatcherManager_1 = require("../utils/DispatcherManager");
  9502. var GameState_1 = require("../utils/GameState");
  9503. var PropManager_1 = require("../PrefabControl/PropManager");
  9504. var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
  9505. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  9506. var AgencySkin_1 = require("../Agency/AgencySkin");
  9507. var AgencyInGame_1 = require("../Agency/AgencyInGame");
  9508. var ViewManager_1 = require("../View/ViewManager");
  9509. var AgencyLottery_1 = require("../Agency/AgencyLottery");
  9510. var TuijianView_1 = require("../Push/TuijianView");
  9511. var ttad_1 = require("../WXSDK/ttad");
  9512. var Sdk_1 = require("../WXSDK/Sdk");
  9513. var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
  9514. var AssetPath_1 = require("../Config/AssetPath");
  9515. var LocalDataControl_1 = require("../Control/LocalDataControl");
  9516. var UserDataInfo_1 = require("../Data/UserDataInfo");
  9517. var SceneControl_1 = require("../Control/SceneControl");
  9518. var MainPanel = /** @class */ (function (_super) {
  9519. __extends(MainPanel, _super);
  9520. function MainPanel() {
  9521. var _this = _super.call(this, "main", "mainview") || this;
  9522. /****************************************** */
  9523. // 一只凤凰的分辨率是550 * 400
  9524. _this.phoenixWidth = 550;
  9525. _this.phoenixHeight = 400;
  9526. _this.bgColorTweener = new Laya.Tween();
  9527. _this.gradientInterval = 2000;
  9528. _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
  9529. //#endregion
  9530. //#region 初始化签到
  9531. _this.isShowSign = false;
  9532. _this.PaoKuSign = "PaoKuSignInfo";
  9533. _this.SignInfo = null;
  9534. MainPanel.instance = _this;
  9535. return _this;
  9536. }
  9537. MainPanel.prototype.updateUserDataHandler = function () {
  9538. this.txt_gold.text = this.agencyusermessage.RoleData.Money.toString();
  9539. };
  9540. MainPanel.prototype.returnmainHandler = function () {
  9541. var RoleData = this.agencyusermessage.RoleData;
  9542. // if( RoleData.nowlevel <= 2 )
  9543. // {
  9544. // this.c_state.selectedIndex = 0;
  9545. // }
  9546. // else
  9547. // {
  9548. this.c_state.selectedIndex = 1;
  9549. // }
  9550. };
  9551. MainPanel.prototype.onInit = function () {
  9552. _super.prototype.onInit.call(this);
  9553. };
  9554. MainPanel.prototype.createPhoenixes = function () {
  9555. var scaleFactor = Math.min(Laya.stage.width / (this.phoenixWidth * 2), Laya.stage.height / this.phoenixHeight);
  9556. // 加了混合模式的凤凰
  9557. var blendedPhoenix;
  9558. blendedPhoenix.blendMode = "lighter";
  9559. blendedPhoenix.scale(scaleFactor, scaleFactor);
  9560. blendedPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
  9561. // 正常模式的凤凰
  9562. var normalPhoenix;
  9563. normalPhoenix.scale(scaleFactor, scaleFactor);
  9564. normalPhoenix.x = this.phoenixWidth * scaleFactor;
  9565. normalPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
  9566. };
  9567. /****************************************** */
  9568. MainPanel.prototype.initView = function () {
  9569. this.ExitBtn.visible = false;
  9570. this.MoreFunBtn.visible = false;
  9571. this.MoreGameBtn.visible = false;
  9572. ttad_1.ttad.Showbanner();
  9573. // Laya.timer.once(500,this,()=>{
  9574. // console.log("main界面白名单----",FYHD_Sdk.iswhite);
  9575. // if(FYHD_Sdk.iswhite){
  9576. // this.ExitBtn.visible = true;
  9577. // }
  9578. // else{
  9579. // this.ExitBtn.visible = false;
  9580. // }
  9581. // })
  9582. this.MoreFunBtnScale = this.getTransitionByName("morefunbtnscale");
  9583. Laya.timer.loop(1000, this, this.playanimator2);
  9584. this.SkinAni = this.SkinBtn.getTransition("skinani");
  9585. this.LotteryAni = this.LotteryBtn.getTransition("lotteryani");
  9586. this.MoreAni = this.MoreGameBtn.getTransition("moreani");
  9587. Laya.timer.loop(3000, this, this.playanimator);
  9588. this.agencyusermessage = this.getProxy(AgencyUserMessage_1.AgencyUserMessage);
  9589. PropManager_1.PropManager.pro_jindu = this.pro_dis;
  9590. PropManager_1.PropManager.txt_mingci = this.txt_mingci;
  9591. this.c_state = this.getControllerByBame("c_state");
  9592. GameStateControl_1.GameStateControl.Instance.setClickPanel(this.load_clickpanel);
  9593. this.returnmainHandler();
  9594. this.updateUserDataHandler();
  9595. this.InitSignItem();
  9596. };
  9597. MainPanel.prototype.playanimator = function () {
  9598. this.SkinAni.play(null, 1);
  9599. this.LotteryAni.play(null, 1);
  9600. this.MoreAni.play(null, 1);
  9601. };
  9602. MainPanel.prototype.playanimator2 = function () {
  9603. this.MoreFunBtnScale.play(null, 1);
  9604. };
  9605. MainPanel.prototype.choujiangclick = function () {
  9606. if (SceneControl_1.SceneControl.IsShowSign)
  9607. return;
  9608. ttad_1.ttad.Clear();
  9609. this.getProxy(AgencyLottery_1.AgencyLottery).openView();
  9610. };
  9611. MainPanel.prototype.tuijianclick = function () {
  9612. if (SceneControl_1.SceneControl.IsShowSign)
  9613. return;
  9614. ViewManager_1.ViewManager.Instance.add(TuijianView_1.default);
  9615. };
  9616. MainPanel.prototype.skinclick = function () {
  9617. if (SceneControl_1.SceneControl.IsShowSign)
  9618. return;
  9619. ttad_1.ttad.Clear();
  9620. this.getProxy(AgencySkin_1.AgencySkin).openview();
  9621. };
  9622. MainPanel.prototype.moreclick = function () {
  9623. if (SceneControl_1.SceneControl.IsShowSign)
  9624. return;
  9625. // ViewManager.Instance.add( ChoutiPanView );
  9626. ttad_1.ttad.CreateMoreGameBtn();
  9627. };
  9628. MainPanel.prototype.btnclick = function () {
  9629. if (SceneControl_1.SceneControl.IsShowSign)
  9630. return;
  9631. GameState_1.GameState.GameNum++;
  9632. ttad_1.ttad.Clear();
  9633. this.c_state.selectedIndex = 2;
  9634. this.txt_lv.text = this.agencyusermessage.RoleData.getNowServerLevel().toString();
  9635. this.getProxy(AgencyInGame_1.AgencyInGame).startGame();
  9636. };
  9637. MainPanel.prototype.setclick = function () {
  9638. };
  9639. MainPanel.prototype.mapLoaded = function () {
  9640. this.layer = this.tiledMap.getLayerByIndex(0);
  9641. var radiusX = 32;
  9642. var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
  9643. var color = "#FF7F50";
  9644. this.sprite = new Laya.Sprite();
  9645. this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
  9646. this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
  9647. this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
  9648. this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
  9649. Laya.stage.addChild(this.sprite);
  9650. };
  9651. /*************************************** */
  9652. MainPanel.prototype.initEvent = function () {
  9653. this.AddEventByType(this.load_start, Laya.Event.CLICK, this, this.btnclick);
  9654. this.AddEventByType(this.SkinBtn, Laya.Event.CLICK, this, this.skinclick);
  9655. // this.AddEventByType( this.MoreGameBtn,Laya.Event.CLICK,this,this.moreclick );
  9656. // this.AddEventByType( this.MoreFunBtn,Laya.Event.CLICK,this,this.moreclick );
  9657. // this.AddEventByType( this.ExitBtn,Laya.Event.CLICK,this,this.tuijianclick );
  9658. this.addDataEvent(GameState_1.GameState.returnMainView, this, this.returnmainHandler);
  9659. this.AddEventByType(this.LotteryBtn, Laya.Event.CLICK, this, this.choujiangclick);
  9660. this.addDataEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData, this, this.updateUserDataHandler);
  9661. };
  9662. MainPanel.prototype.InitSignItem = function () {
  9663. this.LoadSignData();
  9664. var _bo = true;
  9665. if (this.getSystemTime() == this.SignInfo["time"]) {
  9666. _bo = false;
  9667. }
  9668. else {
  9669. this.SignInfo["FisstLoad"] = 0;
  9670. }
  9671. if (this.SignInfo["FisstLoad"] == 1) {
  9672. _bo = false;
  9673. }
  9674. // if(PlayerAccount.CurrentAccount.CurAccountData.SignDebug)
  9675. // {
  9676. // _bo=true;
  9677. // }
  9678. SceneControl_1.SceneControl.IsShowSign = _bo;
  9679. this.SignPanel.visible = _bo;
  9680. if (!_bo) {
  9681. return;
  9682. }
  9683. this.SignFun();
  9684. };
  9685. MainPanel.prototype.btn_SignFun = function () {
  9686. if (this.getSystemTime() == this.SignInfo["time"]) {
  9687. this.isShowSign = true;
  9688. }
  9689. this.SignFun();
  9690. if (this.isShowSign) {
  9691. Sdk_1.WxApi.ShowTxt("已签到"); //y.WxApi.ShowTxt("已签到")
  9692. this.SignSelectedMoney = 0 + "";
  9693. }
  9694. };
  9695. MainPanel.prototype.SignFun = function () {
  9696. this.SignItem = new Array();
  9697. this.SignItem.push(this.SignItem1);
  9698. this.SignItem.push(this.SignItem2);
  9699. this.SignItem.push(this.SignItem3);
  9700. this.SignItem.push(this.SignItem4);
  9701. this.SignItem.push(this.SignItem5);
  9702. this.SignItem.push(this.SignItem6);
  9703. this.SignItem.push(this.SignItem7);
  9704. this.SignTickImage = this.SignAd.asCom.getChildAt(2);
  9705. var signTickButton = this.SignAd.asCom.getChildAt(1);
  9706. this.signAdButton = this.SignAd.asCom.getChildAt(3);
  9707. this.signNoramButton = this.SignAd.asCom.getChildAt(4);
  9708. this.SignDanbeiBtn = this.SignAd.asCom.getChildAt(5);
  9709. this.SignTickImage.visible = (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShowSign);
  9710. this.signNoramButton.visible = this.SignTickImage.visible;
  9711. this.SignDanbeiBtn.visible = !this.signNoramButton.visible;
  9712. this.AddEventByType(signTickButton, Laya.Event.CLICK, this, this.SignTickButtonFun);
  9713. this.AddEventByType(this.signAdButton, Laya.Event.CLICK, this, this.SignAdButtonFun);
  9714. this.AddEventByType(this.signNoramButton, Laya.Event.CLICK, this, this.SignAdButtonFun);
  9715. this.AddEventByType(this.SignDanbeiBtn, Laya.Event.CLICK, this, this.SignNormalButtonFun);
  9716. var num = this.SignInfo["day"];
  9717. var numIndex = 100;
  9718. if (num < 7) {
  9719. numIndex = 100;
  9720. }
  9721. else {
  9722. numIndex = 107;
  9723. num = num % 7;
  9724. }
  9725. this.SignPiFu = null;
  9726. this.SignSelectedMoney = 0 + "";
  9727. for (var index = 0; index < this.SignItem.length; index++) {
  9728. var data = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetRewardConfig((numIndex + 1 + index));
  9729. var pifu = null;
  9730. if (data["reward_item"] != 1000) {
  9731. if (Number(data["reward_item"]) > 6000) {
  9732. var pifuIndedx = Number(data["reward_item"]) % 6000;
  9733. pifu = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetSkinAttr(pifuIndedx);
  9734. console.log(pifu);
  9735. }
  9736. }
  9737. var isOk = true;
  9738. var isCnaSign = true;
  9739. if (index < num) {
  9740. isOk = true;
  9741. isCnaSign = false;
  9742. }
  9743. else if (index == num) {
  9744. isOk = false;
  9745. isCnaSign = true;
  9746. }
  9747. else {
  9748. isOk = false;
  9749. isCnaSign = false;
  9750. }
  9751. var text;
  9752. if (index < 6) {
  9753. text = "第 " + (index + 1) + " 天";
  9754. }
  9755. else {
  9756. text = "豪华皮肤";
  9757. }
  9758. this.SetSignItemInfo(this.SignItem[index], text, data, isOk, isCnaSign, pifu);
  9759. }
  9760. ttad_1.ttad.Showbanner(); //
  9761. };
  9762. /**签到*/
  9763. MainPanel.prototype.SetSignItemInfo = function (_signItem, text, data, _isOk, _isCanSign, pifu) {
  9764. console.log(data);
  9765. if (pifu == null) {
  9766. console.log(111111111111);
  9767. var mytext = _signItem.asCom.getChildAt(2);
  9768. mytext.text = text;
  9769. var mymoney = _signItem.asCom.getChildAt(3);
  9770. mymoney.text = data["reward_num"];
  9771. _signItem.asCom.getChildAt(5).visible = false;
  9772. if (_isOk) {
  9773. _signItem.asCom.getChildAt(1).visible = false;
  9774. _signItem.asCom.getChildAt(6).visible = true;
  9775. _signItem.asCom.getChildAt(7).visible = true;
  9776. }
  9777. else if (_isCanSign) {
  9778. _signItem.asCom.getChildAt(1).visible = true;
  9779. _signItem.asCom.getChildAt(7).visible = false;
  9780. _signItem.asCom.getChildAt(6).visible = false;
  9781. this.SignSelectedItem = _signItem;
  9782. this.SignSelectedText = text;
  9783. this.SignSelectedMoney = data["reward_num"];
  9784. // var child1=_signItem.asCom.getChildAt(7) as fairygui.GButton;
  9785. // child1.visible=true;
  9786. // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null);
  9787. // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun );
  9788. }
  9789. else {
  9790. _signItem.asCom.getChildAt(1).visible = false;
  9791. _signItem.asCom.getChildAt(6).visible = false;
  9792. _signItem.asCom.getChildAt(7).visible = false;
  9793. }
  9794. }
  9795. else {
  9796. console.log(2222222222);
  9797. var mytext = _signItem.asCom.getChildAt(2);
  9798. var mymoney = _signItem.asCom.getChildAt(3);
  9799. mymoney.visible = false;
  9800. var myimage = _signItem.asCom.getChildAt(4);
  9801. myimage.visible = false;
  9802. var GLoader = _signItem.asCom.getChildAt(5);
  9803. if (_isOk) {
  9804. GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon);
  9805. _signItem.asCom.getChildAt(1).visible = false;
  9806. _signItem.asCom.getChildAt(6).visible = true;
  9807. _signItem.asCom.getChildAt(7).visible = true;
  9808. }
  9809. else if (_isCanSign) {
  9810. _signItem.asCom.getChildAt(1).visible = true;
  9811. _signItem.asCom.getChildAt(7).visible = false;
  9812. _signItem.asCom.getChildAt(6).visible = false;
  9813. this.SignSelectedItem = _signItem;
  9814. this.SignSelectedText = text;
  9815. this.SignSelectedMoney = 0 + "";
  9816. this.SignPiFu = pifu;
  9817. GLoader.visible = true;
  9818. GLoader.icon = AssetPath_1.AssetPath.getroleicon(this.SignPiFu.icon);
  9819. // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null);
  9820. // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun );
  9821. }
  9822. else {
  9823. GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon);
  9824. _signItem.asCom.getChildAt(1).visible = false;
  9825. _signItem.asCom.getChildAt(6).visible = false;
  9826. _signItem.asCom.getChildAt(7).visible = false;
  9827. }
  9828. }
  9829. };
  9830. MainPanel.prototype.SignButtonFun = function () {
  9831. var _this = this;
  9832. console.log("收取了");
  9833. if (this.getSystemTime == this.SignInfo["time"]) {
  9834. return;
  9835. }
  9836. this.SignAd.visible = true;
  9837. Laya.timer.once(3000, this, function () { _this.signNoramButton.visible = true; });
  9838. this.SetSignItemInfo(this.SignSelectedItem, this.SignSelectedText, this.SignSelectedMoney, true, false, this.SignPiFu);
  9839. this.SaveSignData();
  9840. };
  9841. /*勾选方法*/
  9842. MainPanel.prototype.SignTickButtonFun = function () {
  9843. this.SignTickImage.visible = !this.SignTickImage.visible;
  9844. this.SignDanbeiBtn.visible = !this.SignTickImage.visible;
  9845. this.signNoramButton.visible = this.SignTickImage.visible;
  9846. };
  9847. /*点击视频双倍领取*/
  9848. MainPanel.prototype.SignAdButtonFun = function () {
  9849. this.WinAdButtonFun();
  9850. };
  9851. /*普通领取*/
  9852. MainPanel.prototype.SignNormalButtonFun = function () {
  9853. this.SaveSignData();
  9854. if (this.SignTickImage.visible == true) {
  9855. this.WinAdButtonFun();
  9856. }
  9857. else {
  9858. this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(this.SignSelectedMoney) * 1);
  9859. if (this.SignPiFu != null) {
  9860. this.SignAddPifu();
  9861. }
  9862. this.updateUserDataHandler();
  9863. }
  9864. SceneControl_1.SceneControl.IsShowSign = false;
  9865. this.SignPanel.visible = false;
  9866. ttad_1.ttad.Clear(); //;y.WxApi.ShowTxt("签到成功")
  9867. };
  9868. /**胜利界面广告按钮*/
  9869. MainPanel.prototype.WinAdButtonFun = function () {
  9870. var _this = this;
  9871. Sdk_1.WxApi.recordAldEvent("签到...");
  9872. if (!Laya.Browser.onMobile) {
  9873. return;
  9874. }
  9875. ttad_1.ttad.ShowVideo(function (flag) {
  9876. console.log("播放视频返回成功" + flag);
  9877. if (flag) {
  9878. console.log("播放视频返回");
  9879. _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(_this.SignSelectedMoney) * 2);
  9880. if (_this.SignPiFu != null) {
  9881. _this.SignAddPifu();
  9882. }
  9883. _this.SaveSignData(); //this.SaveSignData()
  9884. _this.SignPanel.visible = false;
  9885. SceneControl_1.SceneControl.IsShowSign = false;
  9886. _this.updateUserDataHandler();
  9887. }
  9888. });
  9889. };
  9890. MainPanel.prototype.LoadSignData = function () {
  9891. // this.SignInfo={"day":0,"time":0,"FisstLoad":0};
  9892. // Laya.LocalStorage.setJSON("PaoKuSign",this.SignInfo);
  9893. this.SignInfo = Laya.LocalStorage.getJSON(this.PaoKuSign);
  9894. if (this.SignInfo == 0 || this.SignInfo == null) {
  9895. var time = this.getSystemTime();
  9896. this.SignInfo = { "day": 0, "time": 0, "FisstLoad": 0 };
  9897. Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo);
  9898. }
  9899. console.log("asdasd");
  9900. };
  9901. MainPanel.prototype.SaveSignData = function () {
  9902. this.SignInfo["FisstLoad"] = 1;
  9903. this.SignInfo["day"]++;
  9904. this.SignInfo["time"] = this.getSystemTime();
  9905. Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo);
  9906. };
  9907. MainPanel.prototype.getSystemTime = function () {
  9908. var curDate = new Date();
  9909. var month = curDate.getMonth() + 1;
  9910. console.log("月:" + month.toString());
  9911. var date = curDate.getDate();
  9912. console.log("日:" + date.toString());
  9913. return Number((month + "" + date));
  9914. };
  9915. MainPanel.prototype.SignAddPifu = function () {
  9916. var cachedata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin);
  9917. // var cachedata = CacheManager.getInstance().getCacheObj( UserCacheType.skin );
  9918. var id = this.SignPiFu["id"];
  9919. var _skinProxy = this.getProxy(AgencySkin_1.AgencySkin);
  9920. var piFuVO = null;
  9921. for (var index = 0; index < _skinProxy.pifuArr.length; index++) {
  9922. piFuVO = _skinProxy.pifuArr[index];
  9923. if (piFuVO.roleCFG.id == id) {
  9924. break;
  9925. }
  9926. }
  9927. piFuVO.state = 1;
  9928. AgencySkin_1.AgencySkin.instance.AddLocalSkinData(piFuVO.roleCFG.id, piFuVO.state, piFuVO.hasnum);
  9929. DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.updateSKinView);
  9930. console.log("获取皮肤");
  9931. console.log(cachedata);
  9932. };
  9933. MainPanel.key = "MainPanel";
  9934. return MainPanel;
  9935. }(PanelBaseControl_1.PanelBaseControl));
  9936. exports.MainPanel = MainPanel;
  9937. },{"../Agency/AgencyInGame":2,"../Agency/AgencyLottery":4,"../Agency/AgencySkin":6,"../Agency/AgencyUserMessage":8,"../Config/AssetPath":15,"../Control/GameStateControl":21,"../Control/LocalDataControl":23,"../Control/PanelBaseControl":24,"../Control/SceneControl":29,"../Data/UserDataInfo":35,"../Data/UserInfoEvent":36,"../PrefabControl/PropManager":49,"../Push/TuijianView":57,"../View/ViewManager":70,"../WXSDK/PlayerAccount":75,"../WXSDK/Sdk":77,"../WXSDK/ttad":83,"../utils/DispatcherManager":85,"../utils/GameState":86}],68:[function(require,module,exports){
  9938. "use strict";
  9939. Object.defineProperty(exports, "__esModule", { value: true });
  9940. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  9941. var ViewAction_1 = require("../utils/ViewAction");
  9942. var AgencySkin_1 = require("../Agency/AgencySkin");
  9943. var GameState_1 = require("../utils/GameState");
  9944. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  9945. var ResourceControl_1 = require("../Control/ResourceControl");
  9946. var AssetPath_1 = require("../Config/AssetPath");
  9947. var CharacterState_1 = require("../PrefabControl/CharacterState");
  9948. var ViewManager_1 = require("../View/ViewManager");
  9949. var CharacterPool_1 = require("../PrefabControl/CharacterPool");
  9950. var Player_1 = require("../Game/Player");
  9951. var SkinPanel = /** @class */ (function (_super) {
  9952. __extends(SkinPanel, _super);
  9953. function SkinPanel() {
  9954. var _this = _super.call(this, "main", "skinview", false, ViewAction_1.ViewAction.ActionType_none, 0) || this;
  9955. _this._isdestorys = false;
  9956. _this._out = new Laya.Quaternion;
  9957. return _this;
  9958. }
  9959. SkinPanel.prototype.initView = function () {
  9960. this._isdestorys = false;
  9961. this.c_title = this.getControllerByBame("c_title");
  9962. this.agencyskin = this.getProxy(AgencySkin_1.AgencySkin);
  9963. this.list_0.setVirtual();
  9964. this.list_0.itemRenderer = Laya.Handler.create(this, this.itemlistrender, null, false);
  9965. this.c_title.selectedIndex = 0;
  9966. this.onchange();
  9967. //添加3D场景
  9968. this._ui3DScene = this.displayObject.addChildAt(new Laya.Scene3D(), 0);
  9969. //添加照相机
  9970. this._uicarma3D = (this._ui3DScene.addChild(new Laya.Camera(0, 0.1, 80)));
  9971. // this._uicarma3D.clearColor = null;
  9972. this._uicarma3D.viewport = new Laya.Viewport(this.x, this.y, this.width, this.height);
  9973. this._uicarma3D.transform.translate(new Laya.Vector3(0, 1.2, 5), false);
  9974. // //添加方向光
  9975. // this._uilight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
  9976. // this._uilight.color = new Laya.Vector3(0.6,0.6,0.6);
  9977. // this._uilight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
  9978. this.updateroleHandler();
  9979. };
  9980. SkinPanel.prototype.initEvent = function () {
  9981. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  9982. this.AddEventByType(this.c_title, fairygui.Events.STATE_CHANGED, this, this.onchange);
  9983. this.addDataEvent(GameState_1.GameState.updateSKinView, this, this.onchange);
  9984. this.addDataEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.updateroleHandler);
  9985. };
  9986. SkinPanel.prototype.ClearCharacter = function () {
  9987. if (this._rolemo) {
  9988. var script = this._rolemo.getComponent(Player_1.Player);
  9989. CharacterPool_1.CharacterPool.ClearCharacter(this._rolemo, script.resouseName, script);
  9990. this._rolemo = null;
  9991. }
  9992. };
  9993. SkinPanel.prototype.onclosefun = function () {
  9994. ViewManager_1.ViewManager.Instance.close(SkinPanel);
  9995. };
  9996. SkinPanel.prototype.destory = function () {
  9997. this._isdestorys = true;
  9998. this.ClearCharacter();
  9999. if (this._uicarma3D) {
  10000. this._uicarma3D.destroy();
  10001. this._uicarma3D = null;
  10002. }
  10003. if (this._ui3DScene) {
  10004. this._ui3DScene.destroy();
  10005. this._ui3DScene = null;
  10006. }
  10007. _super.prototype.destory.call(this);
  10008. };
  10009. SkinPanel.prototype.onchange = function () {
  10010. if (this.c_title.selectedIndex == 0) {
  10011. this.list_0.numItems = this.agencyskin.pifuArr.length;
  10012. }
  10013. else {
  10014. this.list_0.numItems = 0;
  10015. }
  10016. };
  10017. SkinPanel.prototype.itemlistrender = function (index, item) {
  10018. if (this.c_title.selectedIndex == 0) {
  10019. if (index < this.agencyskin.pifuArr.length) {
  10020. item.showData(this.agencyskin.pifuArr[index]);
  10021. }
  10022. }
  10023. };
  10024. SkinPanel.prototype.updateroleHandler = function () {
  10025. var RoleData = this.agencyskin.RoleData;
  10026. this.ClearCharacter();
  10027. var pathArr = [];
  10028. pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
  10029. ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.loadcomplete, null, true, RoleData.roleCfg.name);
  10030. };
  10031. SkinPanel.prototype.loadcomplete = function (resousename) {
  10032. var RoleData = this.agencyskin.RoleData;
  10033. if (!this._isdestorys && this._ui3DScene && resousename == RoleData.roleCfg.name) {
  10034. this._rolemo = CharacterPool_1.CharacterPool.AddCharacter(resousename, Player_1.Player, this._ui3DScene);
  10035. this._rolemo.transform.position = new Laya.Vector3(0, 2, 0);
  10036. Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), -135 * 180 / Math.PI, this._out);
  10037. this._rolemo.transform.rotation = this._out;
  10038. this._rolemo.getComponent(Player_1.Player).PlayAnimator(CharacterState_1.CharacterState.stand);
  10039. }
  10040. };
  10041. SkinPanel.key = "SkinPanel";
  10042. return SkinPanel;
  10043. }(PanelBaseControl_1.PanelBaseControl));
  10044. exports.SkinPanel = SkinPanel;
  10045. },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../Control/PanelBaseControl":24,"../Control/ResourceControl":28,"../Data/UserInfoEvent":36,"../Game/Player":40,"../PrefabControl/CharacterPool":45,"../PrefabControl/CharacterState":46,"../View/ViewManager":70,"../utils/GameState":86,"../utils/ViewAction":93}],69:[function(require,module,exports){
  10046. "use strict";
  10047. Object.defineProperty(exports, "__esModule", { value: true });
  10048. var PanelBaseControl_1 = require("../Control/PanelBaseControl");
  10049. var ViewAction_1 = require("../utils/ViewAction");
  10050. var GameUtils_1 = require("../utils/GameUtils");
  10051. var AssetPath_1 = require("../Config/AssetPath");
  10052. var AgencyTrial_1 = require("../Agency/AgencyTrial");
  10053. var GuangGao_1 = require("../WXSDK/GuangGao");
  10054. var ttad_1 = require("../WXSDK/ttad");
  10055. var TrialPanel = /** @class */ (function (_super) {
  10056. __extends(TrialPanel, _super);
  10057. function TrialPanel(arr) {
  10058. var _this = _super.call(this, "main", "shiyongView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
  10059. _this.skinarr = arr;
  10060. return _this;
  10061. }
  10062. TrialPanel.prototype.onInit = function () {
  10063. _super.prototype.onInit.call(this);
  10064. };
  10065. TrialPanel.prototype.initView = function () {
  10066. this.agencytrial = this.getProxy(AgencyTrial_1.AgencyTrial);
  10067. var index = GameUtils_1.GameUtils.randRangeint(0, this.skinarr.length - 1);
  10068. this._selectvo = this.skinarr[index];
  10069. this.load_icon.url = AssetPath_1.AssetPath.getroleicon(this._selectvo.roleCFG.icon);
  10070. // pingtaiutils.Instance.createBanner( "ShiYongView" );
  10071. GuangGao_1.GuangGao.CheatBanner(this.btn_close);
  10072. };
  10073. TrialPanel.prototype.initEvent = function () {
  10074. this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
  10075. this.AddEventByType(this.btn_video, Laya.Event.CLICK, this, this.videofun);
  10076. };
  10077. TrialPanel.prototype.videofun = function () {
  10078. // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
  10079. this.videocallback();
  10080. };
  10081. TrialPanel.prototype.videocallback = function () {
  10082. var _this = this;
  10083. ttad_1.ttad.ShowVideo((function (isLoad) {
  10084. if (isLoad) {
  10085. _this.agencytrial.ExitPanel(_this._selectvo);
  10086. }
  10087. }));
  10088. };
  10089. TrialPanel.prototype.onclosefun = function () {
  10090. this.agencytrial.ExitPanel(null);
  10091. };
  10092. TrialPanel.prototype.destory = function () {
  10093. // GuangGao.Clear();
  10094. ttad_1.ttad.Clear();
  10095. _super.prototype.destory.call(this);
  10096. };
  10097. TrialPanel.key = "TrialPanel";
  10098. return TrialPanel;
  10099. }(PanelBaseControl_1.PanelBaseControl));
  10100. exports.TrialPanel = TrialPanel;
  10101. },{"../Agency/AgencyTrial":7,"../Config/AssetPath":15,"../Control/PanelBaseControl":24,"../WXSDK/GuangGao":72,"../WXSDK/ttad":83,"../utils/GameUtils":87,"../utils/ViewAction":93}],70:[function(require,module,exports){
  10102. "use strict";
  10103. Object.defineProperty(exports, "__esModule", { value: true });
  10104. var LayOUT_1 = require("../utils/LayOUT");
  10105. var LayoutControl_1 = require("../Control/LayoutControl");
  10106. /**
  10107. *
  10108. * @author
  10109. *
  10110. */
  10111. var ViewManager = /** @class */ (function (_super) {
  10112. __extends(ViewManager, _super);
  10113. function ViewManager() {
  10114. var _this = _super.call(this) || this;
  10115. ViewManager.ins = _this;
  10116. return _this;
  10117. }
  10118. Object.defineProperty(ViewManager, "Instance", {
  10119. get: function () {
  10120. if (ViewManager.ins == null) {
  10121. return new ViewManager();
  10122. }
  10123. return ViewManager.ins;
  10124. },
  10125. enumerable: true,
  10126. configurable: true
  10127. });
  10128. ViewManager.prototype.init = function () {
  10129. this._views = {};
  10130. this.initEvent();
  10131. };
  10132. ViewManager.prototype.initEvent = function () {
  10133. };
  10134. /**
  10135. * view 视图对象类
  10136. * data 绑定数据 ( data 如果不为空,代表构造函数传参 )
  10137. * layer 层级
  10138. */
  10139. ViewManager.prototype.add = function (view, data, layer) {
  10140. if (data === void 0) { data = null; }
  10141. if (layer === void 0) { layer = LayOUT_1.LayOUT.UI; }
  10142. if (view.key == null) {
  10143. throw new Error("view have no key");
  10144. }
  10145. var type = view.key;
  10146. if (this._views[type]) {
  10147. var itemview = this._views[type];
  10148. return itemview;
  10149. }
  10150. var d;
  10151. if (data != null) {
  10152. d = new view(data);
  10153. }
  10154. else {
  10155. d = new view();
  10156. }
  10157. d.viewKey = view;
  10158. d.gameLayer = layer;
  10159. LayoutControl_1.LayoutControl.Instance.AddLayerByName(d, layer);
  10160. this._views[type] = d;
  10161. return d;
  10162. };
  10163. /**
  10164. * 关闭界面
  10165. * @param view 界面
  10166. * @param isbgclose 是否是点击背景关闭的状态
  10167. * @param isplayAnmo 是否播放关闭动画( 主要用于强制关闭 )
  10168. */
  10169. ViewManager.prototype.close = function (view, isbgclose, isplayAnmo) {
  10170. if (isbgclose === void 0) { isbgclose = false; }
  10171. if (isplayAnmo === void 0) { isplayAnmo = true; }
  10172. var type = view.key;
  10173. var item = this._views[type];
  10174. if (!item) {
  10175. return;
  10176. }
  10177. LayoutControl_1.LayoutControl.Instance.ClearLayerByName(item.gameLayer);
  10178. if (isplayAnmo) {
  10179. item.ExitView();
  10180. }
  10181. else {
  10182. item.destory();
  10183. }
  10184. delete this._views[type];
  10185. };
  10186. ViewManager.prototype.onresize = function (w, h) {
  10187. if (this._views != null) {
  10188. var itemview;
  10189. for (var item in this._views) {
  10190. itemview = this._views[item];
  10191. itemview.setSize(w, h);
  10192. }
  10193. }
  10194. };
  10195. ViewManager.prototype.getView = function (view) {
  10196. var type = view.key;
  10197. return this._views[type];
  10198. };
  10199. return ViewManager;
  10200. }(Laya.EventDispatcher));
  10201. exports.ViewManager = ViewManager;
  10202. },{"../Control/LayoutControl":22,"../utils/LayOUT":90}],71:[function(require,module,exports){
  10203. "use strict";
  10204. Object.defineProperty(exports, "__esModule", { value: true });
  10205. var RecommendView_1 = require("../Push/RecommendView");
  10206. var ViewManager_1 = require("../View/ViewManager");
  10207. var ChoutiPanView_1 = require("../Push/ChoutiPanView");
  10208. // import { Main } from "../Main";
  10209. // import ListItem from "../GameTools/ListItem";
  10210. // import { PanelManager, PanelType } from "../View/PanelManager";
  10211. // import GuangGao from "./GuangGao";
  10212. // import { WXSDK } from "./WXSDK";
  10213. var FYHD_Sdk = /** @class */ (function () {
  10214. function FYHD_Sdk() {
  10215. }
  10216. //初始化sdk
  10217. FYHD_Sdk.InitSdk = function () {
  10218. Laya.Browser.window.sdk.getFyhd().startSdk();
  10219. FYHD_Sdk.UserInfoAuth();
  10220. // let white = Laya.LocalStorage.getItem("is_white");
  10221. // if(white){
  10222. // FYHD_Sdk.iswhite = true;
  10223. // }
  10224. // else{
  10225. // FYHD_Sdk.getWhiteConfig();
  10226. // }
  10227. // let newuser = Laya.LocalStorage.getItem("is_newuser");
  10228. // if(!newuser){
  10229. // FYHD_Sdk.isnewuser = true;
  10230. // Laya.LocalStorage.setItem("is_newuser","1");
  10231. // }
  10232. // else{
  10233. // FYHD_Sdk.isnewuser = false;
  10234. // }
  10235. // FYHD_Sdk.PushData();
  10236. };
  10237. //用户授权
  10238. FYHD_Sdk.UserInfoAuth = function () {
  10239. if (!Laya.Browser.onWeiXin)
  10240. return;
  10241. Laya.Browser.window.sdk.getFyhd().getFyhdUserInfo(null, false, function (data) {
  10242. console.log("无授权回调:" + JSON.stringify(data));
  10243. if (data.result.user) {
  10244. FYHD_Sdk.openid = data.result.user.openid;
  10245. FYHD_Sdk.AuthInfo();
  10246. }
  10247. });
  10248. };
  10249. FYHD_Sdk.AuthInfo = function () {
  10250. var args = {
  10251. openid: FYHD_Sdk.openid,
  10252. };
  10253. Laya.Browser.window.sdk.getFyhd().loginData(args, function (data) {
  10254. console.log("授权上报回调:" + JSON.stringify(data));
  10255. FYHD_Sdk.ValueUser();
  10256. });
  10257. };
  10258. FYHD_Sdk.ValueUser = function () {
  10259. var args = {
  10260. openid: FYHD_Sdk.openid,
  10261. };
  10262. Laya.Browser.window.sdk.getFyhd().valueuser(args, function (data) {
  10263. console.log("有效用户上报:" + JSON.stringify(data));
  10264. });
  10265. };
  10266. FYHD_Sdk.getWhiteConfig = function () {
  10267. Laya.Browser.window.sdk.getFyhd().whiteConfig(function (e) {
  10268. FYHD_Sdk.iswhite = e.data.is_white;
  10269. if (FYHD_Sdk.iswhite) {
  10270. Laya.LocalStorage.setItem("is_white", "1");
  10271. }
  10272. console.log("白名单---", e);
  10273. });
  10274. };
  10275. FYHD_Sdk.SetHuTuiList = function (list, scrol, type) {
  10276. if (scrol === void 0) { scrol = 1; }
  10277. if (type === void 0) { type = ""; }
  10278. var arr = this.pushData;
  10279. if (!arr || arr.length == 0)
  10280. return;
  10281. list.selectEnable = false;
  10282. scrol == 1 ? list.vScrollBarSkin = "" : list.hScrollBarSkin = "";
  10283. list.renderHandler = Laya.Handler.create(this, this.updateItem, [type], false);
  10284. list.array = arr;
  10285. list.refresh();
  10286. };
  10287. FYHD_Sdk.updateItem = function (type, cell, index) {
  10288. // var aditem = cell.getComponent(ListItem) as ListItem;
  10289. // aditem.Refresh(type);
  10290. };
  10291. //点击事件上报
  10292. FYHD_Sdk.ClickAd = function (ad_type) {
  10293. console.log("上报类型---", ad_type);
  10294. if (!Laya.Browser.onWeiXin)
  10295. return;
  10296. var param = {
  10297. ad_type: ad_type,
  10298. //此处添加openid
  10299. openid: FYHD_Sdk.openid
  10300. };
  10301. console.log("点击参数:" + param);
  10302. Laya.Browser.window.sdk.getFyhd().advertisement(param, function (data) {
  10303. console.log("点击结果:" + JSON.stringify(data));
  10304. });
  10305. };
  10306. //互推信息
  10307. FYHD_Sdk.PushData = function () {
  10308. //console.log("pushdata--",Main.WX);
  10309. if (!Laya.Browser.onWeiXin)
  10310. return;
  10311. var param = {};
  10312. Laya.Browser.window.sdk.getFyhd().shareRecommend(param, function (data) {
  10313. console.log("热门游戏数据--", data);
  10314. if (data.data) {
  10315. FYHD_Sdk.pushData = data.data;
  10316. FYHD_Sdk.pushData.sort(FYHD_Sdk.ListSort);
  10317. FYHD_Sdk.isHaveDate = true;
  10318. //此处派发事件,展示互推
  10319. //EventManager.event(FYHD_Sdk.ShowAd);
  10320. }
  10321. console.log("获取互推信息:" + JSON.stringify(FYHD_Sdk.pushData));
  10322. new RecommendView_1.Recommend();
  10323. });
  10324. };
  10325. FYHD_Sdk.ShowHuTuiJump = function (data, open) {
  10326. if (!Laya.Browser.onWeiXin)
  10327. return;
  10328. if (data.jump_type == 2) //二维码跳转方法
  10329. {
  10330. Laya.Browser.window.wx.previewImage({ current: data.qrcode, urls: [data.qrcode] });
  10331. }
  10332. else if (data.jump_type == 1) //直跳方法
  10333. {
  10334. Laya.Browser.window.wx.navigateToMiniProgram({
  10335. appId: data.to_appid,
  10336. path: data.jump_path,
  10337. success: function (res) {
  10338. // 打开成功
  10339. console.log("上报成功:" + JSON.stringify(res));
  10340. FYHD_Sdk.PushClick(data.to_appid);
  10341. },
  10342. fail: function (res) {
  10343. if (open) {
  10344. ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
  10345. }
  10346. }
  10347. });
  10348. }
  10349. else if (data.jump_type == 0) //平台跳转方法
  10350. {
  10351. Laya.Browser.window.wx.navigateToMiniProgram({
  10352. appId: data.platform_appid,
  10353. path: data.jump_path,
  10354. success: function (res) {
  10355. // 打开成功
  10356. console.log("上报成功:" + JSON.stringify(res));
  10357. FYHD_Sdk.PushClick(data.to_appid);
  10358. },
  10359. fail: function (res) {
  10360. if (open) {
  10361. ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
  10362. }
  10363. }
  10364. });
  10365. }
  10366. };
  10367. //互推点击
  10368. FYHD_Sdk.PushClick = function (to_appid) {
  10369. if (!Laya.Browser.onWeiXin)
  10370. return;
  10371. var param = {
  10372. openid: FYHD_Sdk.openid,
  10373. to_appid: to_appid,
  10374. };
  10375. Laya.Browser.window.sdk.getFyhd().sharePlay(param, function (data) {
  10376. console.log("点击上报结果:" + JSON.stringify(data));
  10377. });
  10378. };
  10379. FYHD_Sdk.ListSort = function (a, b) {
  10380. if (Number(a["panel"]) < Number(b["panel"])) {
  10381. return -1;
  10382. }
  10383. if (Number(a["panel"]) == Number(b["panel"])) {
  10384. return 0;
  10385. }
  10386. if (Number(a["panel"]) > Number(b["panel"])) {
  10387. return 1;
  10388. }
  10389. };
  10390. FYHD_Sdk.Ad_ClickType = {
  10391. Video: "video_click",
  10392. Watch: "watch",
  10393. Share: "share",
  10394. Banner: "banner",
  10395. Push: "push",
  10396. PushClick: "icon_click"
  10397. };
  10398. FYHD_Sdk.pushData = [];
  10399. FYHD_Sdk.isHaveDate = false;
  10400. FYHD_Sdk.ShowAd = "ShowAd";
  10401. return FYHD_Sdk;
  10402. }());
  10403. exports.FYHD_Sdk = FYHD_Sdk;
  10404. },{"../Push/ChoutiPanView":51,"../Push/RecommendView":55,"../View/ViewManager":70}],72:[function(require,module,exports){
  10405. "use strict";
  10406. Object.defineProperty(exports, "__esModule", { value: true });
  10407. var PlayerAccount_1 = require("./PlayerAccount");
  10408. var ttad_1 = require("./ttad");
  10409. var WxGameItem = /** @class */ (function () {
  10410. function WxGameItem() {
  10411. this.appNameHidden = false;
  10412. this.color = "C93B3BFF";
  10413. this.size = 100;
  10414. this.borderWidth = 50;
  10415. this.borderColor = "A1A0A0FF";
  10416. }
  10417. return WxGameItem;
  10418. }());
  10419. exports.WxGameItem = WxGameItem;
  10420. var GuangGao = /** @class */ (function () {
  10421. function GuangGao() {
  10422. this.isVideoLoadCom = false;
  10423. }
  10424. Object.defineProperty(GuangGao, "hasbanner", {
  10425. get: function () {
  10426. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner) {
  10427. return true;
  10428. }
  10429. else {
  10430. return false;
  10431. }
  10432. },
  10433. enumerable: true,
  10434. configurable: true
  10435. });
  10436. Object.defineProperty(GuangGao, "hasvideo", {
  10437. get: function () {
  10438. if (Laya.Browser.onWeiXin && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) {
  10439. var videonum = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetGlobe;
  10440. return true;
  10441. }
  10442. else {
  10443. return false;
  10444. }
  10445. },
  10446. enumerable: true,
  10447. configurable: true
  10448. });
  10449. //预先加载视屏广告
  10450. GuangGao.InitVideo = function () {
  10451. var _this = this;
  10452. if (!Laya.Browser.onWeiXin || !PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video)
  10453. return;
  10454. console.log(this.bannerAdUnitId);
  10455. //vedio
  10456. this.fsaasfafssfa = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
  10457. this.fsaasfafssfa.onLoad(function () {
  10458. console.log('激励视频 广告加载成功');
  10459. _this.asfasfsaffsa = true;
  10460. });
  10461. this.fsaasfafssfa.onError(function (err) {
  10462. console.log("激励视屏加载失败:" + err);
  10463. _this.asfasfsaffsa = false;
  10464. });
  10465. this.afsfsaafsfsa = true;
  10466. };
  10467. //看视频
  10468. GuangGao.ShowVideo = function (callback) {
  10469. var _this = this;
  10470. if (this.hasvideo) {
  10471. if (this.asfasfsaffsa) {
  10472. console.log("showVideoAd:" + this.asfasfsaffsa);
  10473. this.SetVideoCallBack(callback);
  10474. this.fsaasfafssfa.show().catch(function (err) {
  10475. _this.fsaasfafssfa.load().then(function () {
  10476. _this.SetVideoCallBack(callback);
  10477. _this.fsaasfafssfa.show();
  10478. });
  10479. });
  10480. }
  10481. else {
  10482. // ShareUtil.shareImage("视频没有分享", callback
  10483. // , "1");
  10484. }
  10485. }
  10486. else {
  10487. callback(false);
  10488. // ShareUtil.shareImage("视频没有分享", callback
  10489. // , "1");
  10490. }
  10491. };
  10492. GuangGao.SetVideoCallBack = function (callback) {
  10493. var _this = this;
  10494. this.fsaasfafssfa.offClose();
  10495. this.fsaasfafssfa.onClose(function (res) {
  10496. console.log("激励视频关闭:" + res.isEnded);
  10497. if (res && res.isEnded || res === undefined) {
  10498. callback && callback(true);
  10499. }
  10500. else {
  10501. callback && callback(false);
  10502. }
  10503. _this.fsaasfafssfa.offClose();
  10504. });
  10505. };
  10506. //打开banner
  10507. GuangGao.OpenBanner = function (gap, callVack, iswait) {
  10508. // if (!this.hasbanner)
  10509. // {
  10510. // callVack(null);
  10511. // return;
  10512. // }
  10513. var _this = this;
  10514. if (gap === void 0) { gap = 0; }
  10515. if (callVack === void 0) { callVack = null; }
  10516. if (iswait === void 0) { iswait = false; }
  10517. if (!Laya.Browser.onWeiXin) {
  10518. callVack(null);
  10519. return;
  10520. }
  10521. this.canshowbanner = true;
  10522. var idd = this.bannerAdUnitId;
  10523. console.log("adUnitId:" + idd);
  10524. var newBanner = Laya.Browser.window.wx.createBannerAd({
  10525. adUnitId: idd,
  10526. style: {
  10527. left: 0,
  10528. top: 0,
  10529. width: 460
  10530. }
  10531. });
  10532. newBanner.onError(function (err) {
  10533. console.log(err);
  10534. callVack(null);
  10535. });
  10536. newBanner.onLoad(function () {
  10537. if (_this.curbanner)
  10538. _this.curbanner.destroy();
  10539. _this.curbanner = newBanner;
  10540. var hight = _this.GetRealHight(gap);
  10541. if (callVack != null) {
  10542. callVack(hight);
  10543. }
  10544. if (_this.canshowbanner && !iswait) {
  10545. _this.curbanner.show();
  10546. }
  10547. else {
  10548. _this.curbanner.hide();
  10549. }
  10550. });
  10551. };
  10552. GuangGao.GetRealHight = function (gap) {
  10553. if (this.curbanner) {
  10554. var info = Laya.Browser.window.wx.getSystemInfoSync();
  10555. this.curbanner.style.width = info.windowWidth;
  10556. this.curbanner.style.top = info.windowHeight - this.curbanner.style.realHeight - gap;
  10557. return Laya.stage.height / info.windowHeight * this.curbanner.style.realHeight;
  10558. }
  10559. };
  10560. //clear
  10561. GuangGao.Clear = function () {
  10562. GuangGao.clearTween();
  10563. Laya.timer.clearAll(this);
  10564. Laya.Tween.clearAll(this);
  10565. this.canshowbanner = false;
  10566. if (this.curbanner)
  10567. this.curbanner.hide();
  10568. // if (!Laya.Browser.onWeiXin) return;
  10569. // if (this.curbanner) this.curbanner.hide();
  10570. };
  10571. GuangGao.hidebanner = function () {
  10572. if (!Laya.Browser.onWeiXin)
  10573. return;
  10574. if (this.curbanner)
  10575. this.curbanner.hide();
  10576. };
  10577. GuangGao.showbanner = function () {
  10578. if (!Laya.Browser.onWeiXin)
  10579. return;
  10580. if (this.curbanner)
  10581. this.curbanner.show();
  10582. };
  10583. Object.defineProperty(GuangGao, "cancheat", {
  10584. get: function () {
  10585. if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheat) {
  10586. return true;
  10587. }
  10588. else {
  10589. return false;
  10590. }
  10591. // if(!PlayerAccount.CurrentAccount.CurAccountData.cheat)
  10592. // {
  10593. // console.log("cheat:false-> CurAccountData.cheat != 1");
  10594. // return false;
  10595. // }
  10596. // var checkscence = PlayerAccount.CurrentAccount.CurAccountData.checkscence;
  10597. // if (checkscence == false)
  10598. // {
  10599. // console.log("cheat:true-> " + WxApi.sceneValue);
  10600. // return true;
  10601. // }
  10602. // if (WxApi.sceneValue == "1037" || WxApi.sceneValue == "1058"|| WxApi.sceneValue == "1067" || WxApi.sceneValue == "1095")
  10603. // {
  10604. // console.log("cheat:true-> " + WxApi.sceneValue);
  10605. // return true;
  10606. // }
  10607. // console.log("cheat:false-> " + WxApi.sceneValue);
  10608. // return false;
  10609. },
  10610. enumerable: true,
  10611. configurable: true
  10612. });
  10613. GuangGao.SetPosBanner = function (btn, complete) {
  10614. var _this = this;
  10615. if (Laya.Browser.onPC) {
  10616. complete(false);
  10617. return;
  10618. }
  10619. var info = Laya.Browser.window.wx.getSystemInfoSync();
  10620. //console.log(info);
  10621. //console.log(btn);
  10622. //console.log(btn.y,Laya.stage.height,info.windowHeight);
  10623. var reshight = btn.y * info.windowHeight / Laya.stage.height;
  10624. //console.log("reshight",reshight);
  10625. var idd = this.bannerAdUnitId;
  10626. console.log("adUnitId:" + idd);
  10627. if (this.curbanner)
  10628. this.curbanner.destroy();
  10629. var newBanner = Laya.Browser.window.wx.createBannerAd({
  10630. adUnitId: idd,
  10631. style: {
  10632. left: 0,
  10633. top: 0,
  10634. width: 720
  10635. }
  10636. });
  10637. newBanner.onError(function (err) {
  10638. console.log(err);
  10639. complete(false);
  10640. });
  10641. newBanner.onLoad(function () {
  10642. _this.curbanner = newBanner;
  10643. _this.curbanner.style.top = reshight;
  10644. //console.log("top",this.asgagassga.style.top);
  10645. if (_this.curbanner) {
  10646. console.log("banner show");
  10647. _this.curbanner.show();
  10648. Laya.timer.once(2300, _this, function () {
  10649. _this.curbanner.style.top = info.windowHeight - GuangGao.bannerhigt;
  10650. complete(true);
  10651. });
  10652. }
  10653. });
  10654. newBanner.onResize(function (res) {
  10655. GuangGao.bannerhigt = res.height;
  10656. _this.curbanner.style.width = info.windowWidth;
  10657. _this.curbanner.style.top = reshight;
  10658. });
  10659. };
  10660. //按钮误导
  10661. GuangGao.CheatBanner = function (btn, complete, gap) {
  10662. if (complete === void 0) { complete = null; }
  10663. if (gap === void 0) { gap = 0; }
  10664. ttad_1.ttad.Showbanner();
  10665. // if(!GuangGao.cancheat)
  10666. // {
  10667. // console.log("ignorecheat");
  10668. // GuangGao.OpenBanner(0,(height) =>
  10669. // {
  10670. // if(height == null)
  10671. // {
  10672. // }
  10673. // });
  10674. // }
  10675. // else
  10676. // {
  10677. // btn.y = Laya.stage.height-btn.height - 100;
  10678. // GuangGao.OpenBanner(gap,(height) =>
  10679. // {
  10680. // if(height == null)
  10681. // {
  10682. // }
  10683. // else
  10684. // {
  10685. // console.log("cheatstart","bottom:100");
  10686. // // btn.mouseEnabled = false;
  10687. // var end=Laya.stage.height-height-btn.height - 80;
  10688. // console.log("y:" + end);
  10689. // Laya.timer.once(PlayerAccount.CurrentAccount.CurAccountData.cheattime*1000,this,()=>
  10690. // {
  10691. // // btn.mouseEnabled = true;
  10692. // this.showbanner();
  10693. // GuangGao.clearTween();
  10694. // GuangGao.tween = Laya.Tween.to(btn,{y:end},200,null,Laya.Handler.create(this,()=>
  10695. // {
  10696. // if(complete != null)
  10697. // {
  10698. // complete();
  10699. // }
  10700. // }))
  10701. // })
  10702. // }
  10703. // },true);
  10704. // }
  10705. };
  10706. GuangGao.clearTween = function () {
  10707. if (GuangGao.tween) {
  10708. GuangGao.tween.clear();
  10709. GuangGao.tween = null;
  10710. }
  10711. };
  10712. GuangGao.prototype.loadVideo = function (cb) {
  10713. var _this = this;
  10714. if (!Laya.Browser.onWeiXin) {
  10715. if (cb)
  10716. cb(true);
  10717. return;
  10718. }
  10719. ;
  10720. this._onLoadVideo = cb;
  10721. if (!this._rewardedVideoAd) {
  10722. var index = GuangGao.videlAdUnitId;
  10723. this._rewardedVideoAd = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: index });
  10724. var isc = false;
  10725. this._rewardedVideoAd.onLoad(function () {
  10726. console.log("[LOG] 激励视频广告加载成功");
  10727. _this.isVideoLoadCom = true;
  10728. if (isc)
  10729. return;
  10730. isc = true;
  10731. _this._onLoadVideo && _this._onLoadVideo(true);
  10732. _this._onLoadVideo = null;
  10733. });
  10734. this._rewardedVideoAd.onError(function (err) {
  10735. console.log("[LOG] 激励视频广告加载失败");
  10736. console.log(err);
  10737. _this.isVideoLoadCom = false;
  10738. _this._onLoadVideo && _this._onLoadVideo(false);
  10739. _this._onLoadVideo = null;
  10740. });
  10741. this._rewardedVideoAd.onClose(function (res) {
  10742. if (!res || res.isEnded) {
  10743. _this._onVideoClose && _this._onVideoClose(true);
  10744. _this._onVideoClose = null;
  10745. }
  10746. else {
  10747. _this._onVideoClose && _this._onVideoClose(false);
  10748. _this._onVideoClose = null;
  10749. }
  10750. });
  10751. }
  10752. else {
  10753. if (this.isVideoLoadCom) {
  10754. this._onLoadVideo && this._onLoadVideo(true);
  10755. this._onLoadVideo = null;
  10756. }
  10757. else {
  10758. this._onLoadVideo && this._onLoadVideo(false);
  10759. this._onLoadVideo = null;
  10760. }
  10761. }
  10762. };
  10763. GuangGao.prototype.showVideo = function (cb) {
  10764. var _this = this;
  10765. if (!Laya.Browser.onWeiXin) {
  10766. if (cb)
  10767. cb(true);
  10768. return;
  10769. }
  10770. ;
  10771. this._onVideoClose = cb;
  10772. this._rewardedVideoAd.show().catch(function (err) {
  10773. _this._rewardedVideoAd.load().then(function () {
  10774. _this._rewardedVideoAd.show();
  10775. });
  10776. });
  10777. };
  10778. GuangGao.videlAdUnitId = "adunit-0c687084c908ee89";
  10779. GuangGao.bannerAdUnitId = "adunit-8c2d586135fa6d4f";
  10780. GuangGao.afsfsaafsfsa = false;
  10781. //视屏广告是否加载成功
  10782. GuangGao.asfasfsaffsa = false;
  10783. GuangGao.canshowbanner = true;
  10784. GuangGao.bannerhigt = 0;
  10785. return GuangGao;
  10786. }());
  10787. exports.GuangGao = GuangGao;
  10788. },{"./PlayerAccount":75,"./ttad":83}],73:[function(require,module,exports){
  10789. "use strict";
  10790. Object.defineProperty(exports, "__esModule", { value: true });
  10791. var Event = Laya.Event;
  10792. var HttpRequest = Laya.HttpRequest;
  10793. var PlayerAccount_1 = require("./PlayerAccount");
  10794. var Sdk_1 = require("./Sdk");
  10795. var TimesTamper_1 = require("../Time/TimesTamper");
  10796. var Global_1 = require("../Global");
  10797. // const PROTOCOL_URL:string = "https://pipelineapi.xwxgame.com/";
  10798. var PROTOCOL_URL = "https://parkourracetoutiao2api.xwxgame.com/";
  10799. var PROTOCOLS = /** @class */ (function () {
  10800. function PROTOCOLS() {
  10801. }
  10802. PROTOCOLS.Login = "user/login"; // not token
  10803. PROTOCOLS.game = "game/start";
  10804. PROTOCOLS.end = "game/play";
  10805. PROTOCOLS.Sign = "sign/sign";
  10806. // public static EquipHero = "theme/equipHero";
  10807. // public static BuyHero = "theme/buyHero";
  10808. // public static EquipHat = "theme/equipHat";
  10809. // public static BuyHat = "theme/buyHat";
  10810. // public static BuyDance = "theme/buyDance";
  10811. // public static EquipDance = "theme/equipDance";
  10812. PROTOCOLS.Buy = "theme/buy";
  10813. PROTOCOLS.Equip = "theme/equip";
  10814. PROTOCOLS.share = "fission/share";
  10815. PROTOCOLS.vd = "fission/vd";
  10816. PROTOCOLS.revival = "game/revival";
  10817. PROTOCOLS.fission = "theme/fission";
  10818. PROTOCOLS.themefission = "theme/fission";
  10819. PROTOCOLS.treasure = "treasure/click";
  10820. PROTOCOLS.Config = "config/table";
  10821. PROTOCOLS.Lottery = "lottery/lottery";
  10822. PROTOCOLS.GetAchieve = "achievement/getRewards";
  10823. PROTOCOLS.usersync = "user/sync";
  10824. return PROTOCOLS;
  10825. }());
  10826. exports.PROTOCOLS = PROTOCOLS;
  10827. ;
  10828. var NetworkManager = /** @class */ (function () {
  10829. function NetworkManager() {
  10830. NetworkManager.instance = this;
  10831. }
  10832. Object.defineProperty(NetworkManager, "Instance", {
  10833. get: function () {
  10834. if (NetworkManager.instance) {
  10835. return NetworkManager.instance;
  10836. }
  10837. else {
  10838. return new NetworkManager();
  10839. }
  10840. },
  10841. enumerable: true,
  10842. configurable: true
  10843. });
  10844. //#region 登入
  10845. /******************************* login *****************************/
  10846. NetworkManager.prototype.login = function (progresscb, completecb, errorcb) {
  10847. var userInfor = PlayerAccount_1.PlayerAccount.CurrentAccount;
  10848. var ver = Global_1.Global.gameVersion;
  10849. var args = "code=" + userInfor.Code + "&nickname=" + userInfor.NickName + "&avatar=" + userInfor.Avatar + "&gender=" + userInfor.Gender + "&country=" + userInfor.Country + "&province=" + userInfor.Province + "&city=" + userInfor.City + "& device=" + userInfor.Device + "$&share_id=" + userInfor.ShareId + "&scene=" + userInfor.Scene + "&v=" + ver;
  10850. var httpRequest = new HttpRequest();
  10851. httpRequest.once(Event.PROGRESS, this, this.onHttpRequestProgress, [progresscb, httpRequest]);
  10852. httpRequest.once(Event.COMPLETE, this, this.onLoginRequestComplete, [completecb, httpRequest]);
  10853. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  10854. httpRequest.send(PROTOCOL_URL + PROTOCOLS.Login, args, "post", "text");
  10855. };
  10856. NetworkManager.prototype.onHttpRequestProgress = function (progresscb, httpRequest) {
  10857. if (progresscb) {
  10858. console.log("HttpRequestProgress:...");
  10859. progresscb.run();
  10860. }
  10861. };
  10862. NetworkManager.prototype.onLoginRequestComplete = function (completecb, httpRequest) {
  10863. //console.log("登录数据:", httpRequest.data);
  10864. var data = JSON.parse(httpRequest.data);
  10865. if (data["code"] != "0") {
  10866. console.log("登录异常错误!错误信息:", httpRequest.data);
  10867. Sdk_1.WxApi.recordAldEvent("登录异常错误!错误信息:= " + data["code"], "httpRequest.dat");
  10868. //completecb.runWith(data);
  10869. return;
  10870. }
  10871. PlayerAccount_1.PlayerAccount.ServerTime = data["t"];
  10872. TimesTamper_1.TimesTamper.Instance.updateServiceTime(Number(data["t"]));
  10873. Sdk_1.WxApi.recordAldEvent("登录正式成功");
  10874. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, completecb);
  10875. // ShareUtil.ShareMessage();
  10876. };
  10877. NetworkManager.prototype.onHttpRequestError = function (errorcb, httpRequest) {
  10878. if (errorcb != null) {
  10879. errorcb.runWith(httpRequest);
  10880. }
  10881. Sdk_1.WxApi.recordAldEvent("Error! Http request error.. ", "httpRequest.dat");
  10882. Sdk_1.WxApi.ShowLoading("连接网络失败...");
  10883. Laya.timer.once(8000, this, function () { Sdk_1.WxApi.HideLoading(); });
  10884. console.log("Error! Http request error..." + httpRequest.data);
  10885. };
  10886. //#endregion
  10887. /*
  10888. * 通用Http Post协议发送
  10889. * protocol 对应“PROTOCOLS”字典中协议名称
  10890. * hasToken 是否使用token,目前只有login协议不需要token,其他都需要token,所以此处自动组合
  10891. * param 参数列表,key是字段名,val是值,值需要先转string
  10892. * completecb 协议发送成功回调函数
  10893. * errorcb 协议发送失败回调函数
  10894. * return 返回值为void
  10895. */
  10896. NetworkManager.prototype.HttpPostRequest = function (protocol, param, completecb, errorcb, hasToken) {
  10897. if (hasToken === void 0) { hasToken = true; }
  10898. var args = "";
  10899. var url = PROTOCOL_URL + protocol;
  10900. // chechk add token
  10901. var account = PlayerAccount_1.PlayerAccount.CurrentAccount;
  10902. var accountdata = account.CurAccountData;
  10903. if (hasToken == true) {
  10904. args = "token=" + accountdata.m_token + "&";
  10905. }
  10906. Sdk_1.WxApi.ShowLoading("连接网络中...");
  10907. if (protocol == PROTOCOLS.game || protocol == PROTOCOLS.end || protocol == PROTOCOLS.fission || protocol == PROTOCOLS.vd ||
  10908. protocol == PROTOCOLS.themefission || protocol == PROTOCOLS.Lottery || protocol == PROTOCOLS.usersync) {
  10909. var str = "abcdefghijkimnopqrstuvwxyz0123456789";
  10910. var code = "{";
  10911. var mask = "";
  10912. for (var i = 0; i < 4; i++) {
  10913. mask += str[Math.floor(Math.random() * 100) % str.length];
  10914. }
  10915. for (var i = 0; i < param.length; i++) {
  10916. for (var key in param[i]) {
  10917. code += "\"" + key + "\":\"" + param[i][key] + "\"";
  10918. }
  10919. if (i < param.length - 1) {
  10920. code += ",";
  10921. }
  10922. else {
  10923. code += "}";
  10924. }
  10925. }
  10926. args += "_r=" + mask + this.base64Encode(code);
  10927. }
  10928. else {
  10929. if (param != null) {
  10930. for (var i = 0; i < param.length; i++) {
  10931. for (var key in param[i]) {
  10932. var val = param[i][key];
  10933. args += key + "=" + val;
  10934. if (i < param.length - 1) {
  10935. args += "&";
  10936. }
  10937. }
  10938. }
  10939. }
  10940. }
  10941. var httpRequest = new HttpRequest();
  10942. httpRequest.once(Event.COMPLETE, this, this.onHttpRequestComplete, [completecb, errorcb, httpRequest]);
  10943. httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
  10944. httpRequest.send(url, args, "post", "text");
  10945. };
  10946. NetworkManager.prototype.onHttpRequestComplete = function (succeedcb, failurecb, httpRequest) {
  10947. Sdk_1.WxApi.HideLoading();
  10948. var data = JSON.parse(httpRequest.data);
  10949. if (data["code"] == 0) {
  10950. PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, null);
  10951. if (succeedcb != null) {
  10952. succeedcb.runWith(data);
  10953. }
  10954. }
  10955. else {
  10956. if (failurecb != null) {
  10957. failurecb.runWith(data);
  10958. }
  10959. console.log("Error! Http request complete error, code: " + data["code"] + " message: " + data["message"]);
  10960. }
  10961. };
  10962. NetworkManager.prototype.base64Encode = function (str) {
  10963. var c1, c2, c3;
  10964. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  10965. var i = 0, len = str.length, string = '';
  10966. while (i < len) {
  10967. c1 = str.charCodeAt(i++) & 0xff;
  10968. if (i == len) {
  10969. string += base64EncodeChars.charAt(c1 >> 2);
  10970. string += base64EncodeChars.charAt((c1 & 0x3) << 4);
  10971. string += "==";
  10972. break;
  10973. }
  10974. c2 = str.charCodeAt(i++);
  10975. if (i == len) {
  10976. string += base64EncodeChars.charAt(c1 >> 2);
  10977. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  10978. string += base64EncodeChars.charAt((c2 & 0xF) << 2);
  10979. string += "=";
  10980. break;
  10981. }
  10982. c3 = str.charCodeAt(i++);
  10983. string += base64EncodeChars.charAt(c1 >> 2);
  10984. string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  10985. string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  10986. string += base64EncodeChars.charAt(c3 & 0x3F);
  10987. }
  10988. return string;
  10989. };
  10990. return NetworkManager;
  10991. }());
  10992. exports.NetworkManager = NetworkManager;
  10993. },{"../Global":41,"../Time/TimesTamper":60,"./PlayerAccount":75,"./Sdk":77}],74:[function(require,module,exports){
  10994. "use strict";
  10995. Object.defineProperty(exports, "__esModule", { value: true });
  10996. var PlatfromType = /** @class */ (function () {
  10997. function PlatfromType() {
  10998. }
  10999. /**
  11000. * 电脑
  11001. */
  11002. PlatfromType.pc = "pc";
  11003. /**
  11004. * 微信小游戏
  11005. */
  11006. PlatfromType.wx = "wx";
  11007. /**
  11008. * qq小游戏
  11009. */
  11010. PlatfromType.qq = "qq";
  11011. /**
  11012. * 抖音
  11013. */
  11014. PlatfromType.tt = "tt";
  11015. return PlatfromType;
  11016. }());
  11017. exports.PlatfromType = PlatfromType;
  11018. },{}],75:[function(require,module,exports){
  11019. "use strict";
  11020. Object.defineProperty(exports, "__esModule", { value: true });
  11021. var Sdk_1 = require("../WXSDK/Sdk");
  11022. var GameUtils_1 = require("../utils/GameUtils");
  11023. var NetworkManager_1 = require("./NetworkManager");
  11024. var DispatcherManager_1 = require("../utils/DispatcherManager");
  11025. var UserInfoEvent_1 = require("../Data/UserInfoEvent");
  11026. var requiretype;
  11027. (function (requiretype) {
  11028. requiretype[requiretype["\u7CFB\u7EDF\u8D60\u9001"] = 1] = "\u7CFB\u7EDF\u8D60\u9001";
  11029. requiretype[requiretype["\u91D1\u5E01\u8D2D\u4E70"] = 2] = "\u91D1\u5E01\u8D2D\u4E70";
  11030. requiretype[requiretype["\u89C2\u770B\u89C6\u9891"] = 3] = "\u89C2\u770B\u89C6\u9891";
  11031. requiretype[requiretype["\u5206\u4EAB"] = 4] = "\u5206\u4EAB";
  11032. requiretype[requiretype["\u7B7E\u5230"] = 5] = "\u7B7E\u5230";
  11033. requiretype[requiretype["\u6D3B\u52A8"] = 6] = "\u6D3B\u52A8";
  11034. requiretype[requiretype["\u901A\u8FC7\u5173\u5361"] = 7] = "\u901A\u8FC7\u5173\u5361";
  11035. requiretype[requiretype["\u7D2F\u8BA1\u767B\u9646"] = 8] = "\u7D2F\u8BA1\u767B\u9646";
  11036. requiretype[requiretype["\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"] = 9] = "\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230";
  11037. requiretype[requiretype["\u7816\u77F3\u8D2D\u4E70"] = 10] = "\u7816\u77F3\u8D2D\u4E70";
  11038. })(requiretype = exports.requiretype || (exports.requiretype = {}));
  11039. var AccountConfig;
  11040. (function (AccountConfig) {
  11041. AccountConfig[AccountConfig["crop"] = 0] = "crop";
  11042. AccountConfig[AccountConfig["things"] = 1] = "things";
  11043. AccountConfig[AccountConfig["land"] = 2] = "land";
  11044. AccountConfig[AccountConfig["global"] = 3] = "global";
  11045. AccountConfig[AccountConfig["entity"] = 4] = "entity";
  11046. AccountConfig[AccountConfig["sign"] = 5] = "sign";
  11047. AccountConfig[AccountConfig["rewards"] = 6] = "rewards";
  11048. AccountConfig[AccountConfig["achievement"] = 7] = "achievement";
  11049. AccountConfig[AccountConfig["invite"] = 8] = "invite";
  11050. AccountConfig[AccountConfig["mission"] = 9] = "mission";
  11051. AccountConfig[AccountConfig["treasure_click"] = 10] = "treasure_click";
  11052. AccountConfig[AccountConfig["theme"] = 11] = "theme";
  11053. AccountConfig[AccountConfig["lottery"] = 12] = "lottery";
  11054. })(AccountConfig = exports.AccountConfig || (exports.AccountConfig = {}));
  11055. var AccountUser;
  11056. (function (AccountUser) {
  11057. AccountUser[AccountUser["money"] = 0] = "money";
  11058. AccountUser[AccountUser["diamond"] = 1] = "diamond";
  11059. AccountUser[AccountUser["user_id"] = 2] = "user_id";
  11060. AccountUser[AccountUser["game_times"] = 3] = "game_times";
  11061. AccountUser[AccountUser["get_themes"] = 4] = "get_themes";
  11062. AccountUser[AccountUser["video_times"] = 5] = "video_times";
  11063. AccountUser[AccountUser["equip_themes"] = 6] = "equip_themes";
  11064. AccountUser[AccountUser["last_action_time"] = 7] = "last_action_time";
  11065. AccountUser[AccountUser["last_favorite_time"] = 8] = "last_favorite_time";
  11066. AccountUser[AccountUser["progress_themes"] = 9] = "progress_themes";
  11067. AccountUser[AccountUser["revival"] = 10] = "revival";
  11068. AccountUser[AccountUser["stage"] = 11] = "stage";
  11069. AccountUser[AccountUser["vmoney"] = 12] = "vmoney";
  11070. })(AccountUser = exports.AccountUser || (exports.AccountUser = {}));
  11071. var heroAttr;
  11072. (function (heroAttr) {
  11073. heroAttr[heroAttr["id"] = 0] = "id";
  11074. heroAttr[heroAttr["name"] = 1] = "name";
  11075. heroAttr[heroAttr["quality"] = 2] = "quality";
  11076. heroAttr[heroAttr["icon"] = 3] = "icon";
  11077. heroAttr[heroAttr["prefab"] = 4] = "prefab";
  11078. heroAttr[heroAttr["require_num"] = 5] = "require_num";
  11079. heroAttr[heroAttr["require_type"] = 6] = "require_type";
  11080. })(heroAttr = exports.heroAttr || (exports.heroAttr = {}));
  11081. var signdata;
  11082. (function (signdata) {
  11083. signdata[signdata["sign_days"] = 0] = "sign_days";
  11084. signdata[signdata["sign_time"] = 1] = "sign_time";
  11085. })(signdata = exports.signdata || (exports.signdata = {}));
  11086. var entity;
  11087. (function (entity) {
  11088. entity[entity["id"] = 0] = "id";
  11089. entity[entity["name"] = 1] = "name";
  11090. entity[entity["entity_id"] = 2] = "entity_id";
  11091. entity[entity["icon"] = 3] = "icon";
  11092. })(entity = exports.entity || (exports.entity = {}));
  11093. var skinattr;
  11094. (function (skinattr) {
  11095. skinattr[skinattr["effectValue_1"] = 0] = "effectValue_1";
  11096. skinattr[skinattr["effectValue_2"] = 1] = "effectValue_2";
  11097. skinattr[skinattr["effectValue_3"] = 2] = "effectValue_3";
  11098. skinattr[skinattr["effectValue_4"] = 3] = "effectValue_4";
  11099. })(skinattr = exports.skinattr || (exports.skinattr = {}));
  11100. var AccountData = /** @class */ (function () {
  11101. function AccountData(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_stage, _user_sign, _user_achievement, _lottery, _use_land_task, _user_video) {
  11102. if (_useInvite === void 0) { _useInvite = null; }
  11103. if (_user_stage === void 0) { _user_stage = null; }
  11104. this.openid = "";
  11105. this.userId = "";
  11106. this.roadconfig = {};
  11107. this.m_RewardDic = {};
  11108. this.m_EntityDic = {};
  11109. this.m_AchievementDic = {};
  11110. this.m_token = _token;
  11111. this.m_app_setting = _appSetting;
  11112. this.m_user = _user;
  11113. this.m_user_base = _userbase;
  11114. this.m_sign = _user_sign;
  11115. this.m_task = _user_achievement;
  11116. this.lottery = _lottery;
  11117. this.m_use_land_task = _use_land_task;
  11118. this.m_user_video = _user_video;
  11119. this.userId = this.m_user["user_id"];
  11120. this.openid = this.m_user_base["openid"];
  11121. console.log("user_id:" + this.userId);
  11122. //console.log("open_id:"+this.openid);
  11123. }
  11124. Object.defineProperty(AccountData.prototype, "DieDistance", {
  11125. // public m_skinDic:Dictionary<number,SkinData> = new Dictionary();
  11126. //获取玩家落入空中死亡距离
  11127. get: function () {
  11128. return Number(this.m_app_setting["DieDistance"]);
  11129. },
  11130. enumerable: true,
  11131. configurable: true
  11132. });
  11133. Object.defineProperty(AccountData.prototype, "HitEgg", {
  11134. //获取开局砸蛋几率
  11135. get: function () {
  11136. return Number(this.m_app_setting["HitEgg"]);
  11137. },
  11138. enumerable: true,
  11139. configurable: true
  11140. });
  11141. Object.defineProperty(AccountData.prototype, "EndCheat", {
  11142. //获取结算后砸蛋出现几率
  11143. get: function () {
  11144. return Number(this.m_app_setting["EndCheat"]);
  11145. },
  11146. enumerable: true,
  11147. configurable: true
  11148. });
  11149. Object.defineProperty(AccountData.prototype, "CheatReward", {
  11150. //获取误触奖励金币数
  11151. get: function () {
  11152. return Number(this.m_app_setting["CheatReward"]);
  11153. },
  11154. enumerable: true,
  11155. configurable: true
  11156. });
  11157. Object.defineProperty(AccountData.prototype, "WhiteUser", {
  11158. //白名单用户
  11159. get: function () {
  11160. return this.m_app_setting["WhiteUser"] == "1";
  11161. },
  11162. enumerable: true,
  11163. configurable: true
  11164. });
  11165. Object.defineProperty(AccountData.prototype, "StrategySwitch", {
  11166. //签到功能是否开启
  11167. get: function () {
  11168. return this.m_app_setting["StrategySwitch"] == "1";
  11169. },
  11170. enumerable: true,
  11171. configurable: true
  11172. });
  11173. Object.defineProperty(AccountData.prototype, "ShowSign", {
  11174. //签到功能是否开启
  11175. get: function () {
  11176. return this.m_app_setting["ShowSign"] == "1";
  11177. },
  11178. enumerable: true,
  11179. configurable: true
  11180. });
  11181. Object.defineProperty(AccountData.prototype, "Choose", {
  11182. //自动勾选
  11183. get: function () {
  11184. return this.m_app_setting["choose"] == "1";
  11185. },
  11186. enumerable: true,
  11187. configurable: true
  11188. });
  11189. Object.defineProperty(AccountData.prototype, "ShowBattleBtn", {
  11190. //发起挑战按钮开关
  11191. get: function () {
  11192. return this.m_app_setting["ShowBattleBtn"] == "1";
  11193. },
  11194. enumerable: true,
  11195. configurable: true
  11196. });
  11197. Object.defineProperty(AccountData.prototype, "lotterytime", {
  11198. get: function () {
  11199. return Number(this.lottery["day_video_times"]);
  11200. },
  11201. enumerable: true,
  11202. configurable: true
  11203. });
  11204. Object.defineProperty(AccountData.prototype, "share", {
  11205. get: function () {
  11206. return this.m_app_setting["share"] == "1";
  11207. },
  11208. enumerable: true,
  11209. configurable: true
  11210. });
  11211. Object.defineProperty(AccountData.prototype, "sharecontent", {
  11212. get: function () {
  11213. return this.m_app_setting["sharecontent"];
  11214. },
  11215. enumerable: true,
  11216. configurable: true
  11217. });
  11218. Object.defineProperty(AccountData.prototype, "ShareImage", {
  11219. get: function () {
  11220. return this.m_app_setting["ShareImage"];
  11221. },
  11222. enumerable: true,
  11223. configurable: true
  11224. });
  11225. Object.defineProperty(AccountData.prototype, "cheattime", {
  11226. get: function () {
  11227. return Number(this.m_app_setting["cheattime"]);
  11228. },
  11229. enumerable: true,
  11230. configurable: true
  11231. });
  11232. Object.defineProperty(AccountData.prototype, "banner", {
  11233. get: function () {
  11234. return this.m_app_setting["banner"] == "1";
  11235. },
  11236. enumerable: true,
  11237. configurable: true
  11238. });
  11239. Object.defineProperty(AccountData.prototype, "video", {
  11240. get: function () {
  11241. return this.m_app_setting["video"] == "1";
  11242. },
  11243. enumerable: true,
  11244. configurable: true
  11245. });
  11246. Object.defineProperty(AccountData.prototype, "BtnCanMove", {
  11247. get: function () {
  11248. return this.m_app_setting["BtnCanMove"] == "1";
  11249. },
  11250. enumerable: true,
  11251. configurable: true
  11252. });
  11253. Object.defineProperty(AccountData.prototype, "checkscence", {
  11254. get: function () {
  11255. return this.m_app_setting["checkscence"] == "1";
  11256. },
  11257. enumerable: true,
  11258. configurable: true
  11259. });
  11260. Object.defineProperty(AccountData.prototype, "banner_dis", {
  11261. get: function () {
  11262. return Number(this.m_app_setting["banner_dis"]);
  11263. },
  11264. enumerable: true,
  11265. configurable: true
  11266. });
  11267. Object.defineProperty(AccountData.prototype, "bannerMoveTime", {
  11268. get: function () {
  11269. return Number(this.m_app_setting["bannerMoveTime"]);
  11270. },
  11271. enumerable: true,
  11272. configurable: true
  11273. });
  11274. Object.defineProperty(AccountData.prototype, "createBannerTimes", {
  11275. get: function () {
  11276. return Number(this.m_app_setting["createBannerTimes"]);
  11277. },
  11278. enumerable: true,
  11279. configurable: true
  11280. });
  11281. Object.defineProperty(AccountData.prototype, "bannerMoveProp", {
  11282. get: function () {
  11283. return Number(this.m_app_setting["bannerMoveProp"]);
  11284. },
  11285. enumerable: true,
  11286. configurable: true
  11287. });
  11288. Object.defineProperty(AccountData.prototype, "isShareThenVideo", {
  11289. get: function () {
  11290. return this.m_app_setting["isShareThenVideo"] == "1";
  11291. },
  11292. enumerable: true,
  11293. configurable: true
  11294. });
  11295. Object.defineProperty(AccountData.prototype, "isShowHuiTui", {
  11296. get: function () {
  11297. return this.m_app_setting["isShowHuiTui"] == "1";
  11298. },
  11299. enumerable: true,
  11300. configurable: true
  11301. });
  11302. Object.defineProperty(AccountData.prototype, "start_sprint", {
  11303. get: function () {
  11304. return Number(this.m_app_setting["start_sprint"]);
  11305. },
  11306. enumerable: true,
  11307. configurable: true
  11308. });
  11309. Object.defineProperty(AccountData.prototype, "IsVideoModel", {
  11310. get: function () {
  11311. return this.m_app_setting["IsVideoModel"] == "1";
  11312. },
  11313. enumerable: true,
  11314. configurable: true
  11315. });
  11316. Object.defineProperty(AccountData.prototype, "videoModelNum", {
  11317. get: function () {
  11318. return Number(this.m_app_setting["videoModelNum"]);
  11319. },
  11320. enumerable: true,
  11321. configurable: true
  11322. });
  11323. Object.defineProperty(AccountData.prototype, "VideoModelTitle", {
  11324. get: function () {
  11325. return this.m_app_setting["VideoModelTitle"];
  11326. },
  11327. enumerable: true,
  11328. configurable: true
  11329. });
  11330. Object.defineProperty(AccountData.prototype, "failcount", {
  11331. get: function () {
  11332. return Number(this.m_app_setting["failcount"]);
  11333. },
  11334. enumerable: true,
  11335. configurable: true
  11336. });
  11337. Object.defineProperty(AccountData.prototype, "spminspeed", {
  11338. get: function () {
  11339. return Number(this.m_app_setting["spminspeed"]);
  11340. },
  11341. enumerable: true,
  11342. configurable: true
  11343. });
  11344. Object.defineProperty(AccountData.prototype, "bgm", {
  11345. get: function () {
  11346. return this.m_app_setting["bgm"] == "1";
  11347. },
  11348. enumerable: true,
  11349. configurable: true
  11350. });
  11351. Object.defineProperty(AccountData.prototype, "camerahight", {
  11352. get: function () {
  11353. return Number(this.m_app_setting["camerahight"]);
  11354. },
  11355. enumerable: true,
  11356. configurable: true
  11357. });
  11358. Object.defineProperty(AccountData.prototype, "ctnfilename", {
  11359. get: function () {
  11360. return this.m_app_setting["ctnfilename"];
  11361. },
  11362. enumerable: true,
  11363. configurable: true
  11364. });
  11365. Object.defineProperty(AccountData.prototype, "cheat", {
  11366. get: function () {
  11367. return this.m_app_setting["cheat"] == "1";
  11368. },
  11369. enumerable: true,
  11370. configurable: true
  11371. });
  11372. Object.defineProperty(AccountData.prototype, "shakestage", {
  11373. get: function () {
  11374. return this.m_app_setting["shakestage"] && this.m_app_setting["shakestage"] == "1";
  11375. },
  11376. enumerable: true,
  11377. configurable: true
  11378. });
  11379. Object.defineProperty(AccountData.prototype, "stageconfigcdn", {
  11380. get: function () {
  11381. return this.m_app_setting["stageconfigcdn"] == "1";
  11382. },
  11383. enumerable: true,
  11384. configurable: true
  11385. });
  11386. Object.defineProperty(AccountData.prototype, "playerspeed", {
  11387. get: function () {
  11388. return Number(this.m_app_setting["playerspeed"]);
  11389. },
  11390. enumerable: true,
  11391. configurable: true
  11392. });
  11393. Object.defineProperty(AccountData.prototype, "videlAdUnitId", {
  11394. get: function () {
  11395. return this.m_app_setting["videlAdUnitId"];
  11396. },
  11397. enumerable: true,
  11398. configurable: true
  11399. });
  11400. Object.defineProperty(AccountData.prototype, "bannerAdUnitId", {
  11401. get: function () {
  11402. return this.m_app_setting["bannerAdUnitId"];
  11403. },
  11404. enumerable: true,
  11405. configurable: true
  11406. });
  11407. Object.defineProperty(AccountData.prototype, "tri", {
  11408. get: function () {
  11409. return this.m_app_setting["tri"] == "1";
  11410. },
  11411. enumerable: true,
  11412. configurable: true
  11413. });
  11414. Object.defineProperty(AccountData.prototype, "recommend", {
  11415. get: function () {
  11416. return this.m_app_setting["recommend"] == "1";
  11417. },
  11418. enumerable: true,
  11419. configurable: true
  11420. });
  11421. Object.defineProperty(AccountData.prototype, "recommendflg", {
  11422. get: function () {
  11423. return this.m_app_setting["recommendflg"];
  11424. },
  11425. enumerable: true,
  11426. configurable: true
  11427. });
  11428. Object.defineProperty(AccountData.prototype, "egg", {
  11429. get: function () {
  11430. return this.m_app_setting["egg"] == "1";
  11431. },
  11432. enumerable: true,
  11433. configurable: true
  11434. });
  11435. Object.defineProperty(AccountData.prototype, "eggrate", {
  11436. get: function () {
  11437. return Number(this.m_app_setting["eggrate"]);
  11438. },
  11439. enumerable: true,
  11440. configurable: true
  11441. });
  11442. Object.defineProperty(AccountData.prototype, "UseId", {
  11443. get: function () {
  11444. return this.userId;
  11445. },
  11446. enumerable: true,
  11447. configurable: true
  11448. });
  11449. AccountData.prototype.GetConfig = function (_type) {
  11450. var type = AccountConfig[_type];
  11451. return this.m_configs[type];
  11452. };
  11453. AccountData.prototype.GetUser = function (_type) {
  11454. var type = AccountUser[_type];
  11455. return this.m_user[type];
  11456. };
  11457. Object.defineProperty(AccountData.prototype, "GetVideoTotal", {
  11458. get: function () {
  11459. return Number(this.m_user_video["total"]);
  11460. },
  11461. enumerable: true,
  11462. configurable: true
  11463. });
  11464. AccountData.prototype.GetSign = function (_datatype) {
  11465. var type = signdata[_datatype];
  11466. return this.m_sign[type];
  11467. };
  11468. AccountData.prototype.GetRewardConfig = function (_rewardid) {
  11469. var reward = this.m_RewardDic[_rewardid];
  11470. return reward;
  11471. };
  11472. AccountData.prototype.GetEntity = function (_id, attr) {
  11473. if (!this.m_EntityDic[_id])
  11474. return null;
  11475. return this.m_EntityDic[_id][entity[attr]];
  11476. };
  11477. AccountData.prototype.GetRewardDic = function () {
  11478. var config = this.GetConfig(AccountConfig.rewards);
  11479. for (var key in config) {
  11480. this.m_RewardDic[config[key].id] = config[key];
  11481. }
  11482. };
  11483. AccountData.prototype.GetEntityDic = function () {
  11484. var config = this.GetConfig(AccountConfig.entity);
  11485. for (var key in config) {
  11486. this.m_EntityDic[config[key].entity_id] = config[key];
  11487. }
  11488. };
  11489. AccountData.prototype.GetThemeById = function (_id) {
  11490. var data = this.GetConfig(AccountConfig.theme);
  11491. if (data) {
  11492. for (var index = 0; index < data.length; index++) {
  11493. var element = data[index];
  11494. if (element.id == _id) {
  11495. return element;
  11496. }
  11497. }
  11498. }
  11499. };
  11500. AccountData.prototype.GetSkinAttr = function (_id) {
  11501. var config = this.GetConfig(AccountConfig.theme);
  11502. for (var i = 0; i < config.length; i++) {
  11503. if (config[i].id == _id) {
  11504. return config[i];
  11505. }
  11506. }
  11507. };
  11508. AccountData.prototype.GetAchievementData = function () {
  11509. var data = this.GetConfig(AccountConfig.achievement);
  11510. var dic = {};
  11511. for (var key1 in data) {
  11512. var type1 = data[key1].type;
  11513. //var obj = {};
  11514. if (dic[type1]) {
  11515. continue;
  11516. }
  11517. var array = [];
  11518. for (var key2 in data) {
  11519. var type2 = data[key2].type;
  11520. if (type1 == type2) {
  11521. array.push(data[key2]);
  11522. }
  11523. }
  11524. dic[type1] = array;
  11525. }
  11526. this.m_AchievementDic = dic;
  11527. };
  11528. AccountData.prototype.HasTheme = function (_id) {
  11529. var has = false;
  11530. var getthemes = this.GetUser(AccountUser.get_themes);
  11531. for (var i = 0; i < getthemes.length; i++) {
  11532. if (getthemes[i] == _id) {
  11533. has = true;
  11534. }
  11535. }
  11536. return has;
  11537. };
  11538. AccountData.prototype.GetSkinDic = function (_config) {
  11539. };
  11540. AccountData.prototype.GetHeroProgress = function (_id) {
  11541. var config = this.m_user["progress_heroes"];
  11542. var progress = config[_id] ? config[_id] : 0;
  11543. return progress;
  11544. };
  11545. AccountData.prototype.GetHatProgress = function (_id) {
  11546. var config = this.m_user["progress_hats"];
  11547. var progress = config[_id] ? config[_id] : 0;
  11548. return progress;
  11549. };
  11550. AccountData.prototype.GetCbProgress = function (_id) {
  11551. var config = this.m_user["progress_dances"];
  11552. var progress = config[_id] ? config[_id] : 0;
  11553. return progress;
  11554. };
  11555. AccountData.prototype.HasMotor = function (_id) {
  11556. var data = this.GetUser(AccountUser.get_themes);
  11557. for (var i = 0; i < data.length; i++) {
  11558. var hd = data[i];
  11559. if (_id == hd) {
  11560. return true;
  11561. }
  11562. }
  11563. return false;
  11564. };
  11565. //获取皮肤的进度
  11566. AccountData.prototype.GetMotorProgress = function (_id) {
  11567. var config = this.m_user["progress_themes"];
  11568. var progress = config[_id] ? config[_id] : 0;
  11569. return progress;
  11570. };
  11571. AccountData.prototype.GetSeverConfig = function (_config) {
  11572. this.m_configs = _config;
  11573. this.GetSkinDic(this.m_configs);
  11574. this.GetRewardDic();
  11575. this.GetEntityDic();
  11576. // this.GetAchievementData();
  11577. var _globe = _config["global"];
  11578. for (var index = 0; index < _globe.length; index++) {
  11579. var element = _globe[index];
  11580. if (element.key == "tilirec") {
  11581. PlayerAccount.CurrentAccount.tilirec = Number(element.value);
  11582. return;
  11583. }
  11584. }
  11585. };
  11586. AccountData.prototype.UpdateSkinDic = function () {
  11587. this.GetSkinDic(this.m_configs);
  11588. };
  11589. AccountData.prototype.GetGlobe = function (_key) {
  11590. var globe = this.GetConfig(AccountConfig.global);
  11591. for (var key in globe) {
  11592. var obj = globe[key];
  11593. var kkk = obj["key"];
  11594. if (kkk == _key) {
  11595. var value = obj["value"];
  11596. return value;
  11597. }
  11598. }
  11599. return null;
  11600. };
  11601. return AccountData;
  11602. }());
  11603. exports.AccountData = AccountData;
  11604. var PlayerAccount = /** @class */ (function () {
  11605. function PlayerAccount(_code, _nickname, _avatar, _gender, _country, _province, _city, _device, _shareid, _scence, _ver) {
  11606. this.IsTest = false;
  11607. this.localTime = Laya.timer.currTimer;
  11608. this.Code = _code;
  11609. this.NickName = _nickname;
  11610. this.Avatar = _avatar;
  11611. this.Gender = _gender;
  11612. this.Country = _country;
  11613. this.Province = _province;
  11614. this.City = _city;
  11615. this.Device = _device;
  11616. this.ShareId = _shareid;
  11617. this.Scene = _scence;
  11618. this.ver = _ver;
  11619. this.IsTest = false;
  11620. PlayerAccount.instance = this;
  11621. }
  11622. Object.defineProperty(PlayerAccount, "CurrentAccount", {
  11623. get: function () {
  11624. if (PlayerAccount.instance == null) {
  11625. console.log("生成本地测试账号...");
  11626. return PlayerAccount.TestAccount;
  11627. }
  11628. return PlayerAccount.instance;
  11629. },
  11630. enumerable: true,
  11631. configurable: true
  11632. });
  11633. Object.defineProperty(PlayerAccount, "TestAccount", {
  11634. get: function () {
  11635. var code = Laya.LocalStorage.getItem("localcode");
  11636. if (!code) {
  11637. var time = new Date().getTime().toString();
  11638. var random = GameUtils_1.GameUtils.randRangeint(10000, 99999).toString();
  11639. code = "xj_" + time + random;
  11640. Laya.LocalStorage.setItem("localcode", code);
  11641. console.log(time, random);
  11642. console.log("新用户", code);
  11643. }
  11644. else {
  11645. console.log("老用户", code);
  11646. }
  11647. var curaccount = new PlayerAccount(code, null, null, null, null, null, null, null, null, null, null);
  11648. curaccount.IsTest = true;
  11649. return curaccount;
  11650. },
  11651. enumerable: true,
  11652. configurable: true
  11653. });
  11654. PlayerAccount.prototype.SetAccountData = function (data, completecb) {
  11655. var _this = this;
  11656. var token = data["token"];
  11657. var configs = data["configs"];
  11658. var app_setting = data["app_setting"];
  11659. var user = data["user"];
  11660. var user_base = data["user_base"];
  11661. var user_sign = data["user_sign"];
  11662. var user_achievement = data["user_achievement"];
  11663. var user_lottery = data["user_lottery"];
  11664. var user_land_task = data["user_land_task"];
  11665. var user_video = data["user_video"];
  11666. if (this.CurAccountData == null) {
  11667. Sdk_1.WxApi.recordAldEvent("开始获取config数据");
  11668. this.CurAccountData = new AccountData(token, configs, app_setting, user, user_base, null, null, user_sign, user_achievement, user_lottery, user_land_task, user_video);
  11669. this.CheckLocalConfig(data.table_version, function (_config) {
  11670. _this.CurAccountData.GetSeverConfig(_config);
  11671. _this.nowConfig = _config;
  11672. if (completecb != null) {
  11673. completecb.runWith(data);
  11674. }
  11675. });
  11676. }
  11677. else {
  11678. if (configs) {
  11679. this.CurAccountData.m_configs = configs;
  11680. }
  11681. if (app_setting) {
  11682. this.CurAccountData.m_app_setting = app_setting;
  11683. }
  11684. if (user) {
  11685. this.CurAccountData.m_user = user;
  11686. }
  11687. if (user_base) {
  11688. this.CurAccountData.m_user_base = user_base;
  11689. }
  11690. if (user_sign) {
  11691. this.CurAccountData.m_sign = user_sign;
  11692. }
  11693. if (user_achievement) {
  11694. this.CurAccountData.m_task = user_achievement;
  11695. }
  11696. if (user_lottery) {
  11697. this.CurAccountData.lottery = user_lottery;
  11698. }
  11699. if (user_land_task) {
  11700. this.CurAccountData.m_use_land_task = user_land_task;
  11701. }
  11702. if (user_video) {
  11703. this.CurAccountData.m_user_video = user_video;
  11704. }
  11705. }
  11706. DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.updatePlayerInfo);
  11707. };
  11708. PlayerAccount.prototype.CheckLocalConfig = function (_ver, cb) {
  11709. var curconfig = Laya.LocalStorage.getJSON(PlayerAccount.localcofigkey);
  11710. if (curconfig) {
  11711. //Laya.LocalStorage.removeItem(PlayerAccount.localcofigkey);
  11712. if (curconfig.ver == _ver) {
  11713. console.log("sever配置是最新的...", _ver);
  11714. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11715. cb(curconfig);
  11716. }
  11717. else {
  11718. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  11719. data.configs.ver = _ver;
  11720. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  11721. console.log("sever配置更新完成...", _ver);
  11722. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11723. cb(data.configs);
  11724. }), Laya.Handler.create(this, function (data) {
  11725. console.log("配置获取失败" + data);
  11726. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  11727. }));
  11728. }
  11729. }
  11730. else {
  11731. NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
  11732. data.configs.ver = _ver;
  11733. Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
  11734. console.log("sever保存配置完成...", _ver);
  11735. Sdk_1.WxApi.recordAldEvent("config接口获取成功");
  11736. cb(data.configs);
  11737. }), Laya.Handler.create(this, function (data) {
  11738. console.log("配置获取失败" + data);
  11739. Sdk_1.WxApi.recordAldEvent("config接口获取失败");
  11740. }));
  11741. }
  11742. };
  11743. Object.defineProperty(PlayerAccount.prototype, "ServerTime", {
  11744. get: function () {
  11745. var time = Laya.timer.currTimer;
  11746. var stime = PlayerAccount.ServerTime + Math.ceil((time - this.localTime) / 1000);
  11747. return stime;
  11748. },
  11749. enumerable: true,
  11750. configurable: true
  11751. });
  11752. PlayerAccount.localcofigkey = "mconfig";
  11753. return PlayerAccount;
  11754. }());
  11755. exports.PlayerAccount = PlayerAccount;
  11756. },{"../Data/UserInfoEvent":36,"../WXSDK/Sdk":77,"../utils/DispatcherManager":85,"../utils/GameUtils":87,"./NetworkManager":73}],76:[function(require,module,exports){
  11757. "use strict";
  11758. Object.defineProperty(exports, "__esModule", { value: true });
  11759. var RecordManager = /** @class */ (function () {
  11760. function RecordManager() {
  11761. RecordManager.instance = this;
  11762. console.log("new record");
  11763. }
  11764. Object.defineProperty(RecordManager, "Instance", {
  11765. get: function () {
  11766. if (RecordManager.instance) {
  11767. return RecordManager.instance;
  11768. }
  11769. else {
  11770. var curmanager = new RecordManager();
  11771. curmanager.OnNew();
  11772. return curmanager;
  11773. }
  11774. },
  11775. enumerable: true,
  11776. configurable: true
  11777. });
  11778. RecordManager.prototype.RecordStart = function () {
  11779. if (!Laya.Browser.onMobile)
  11780. return;
  11781. console.log("RecordStart");
  11782. this.record.start({
  11783. duration: 60,
  11784. });
  11785. };
  11786. RecordManager.prototype.RecordStop = function () {
  11787. if (!Laya.Browser.onMobile)
  11788. return;
  11789. console.log("RecordStop");
  11790. this.record.stop();
  11791. };
  11792. RecordManager.prototype.ShareVideo = function (_cb) {
  11793. if (!Laya.Browser.onMobile)
  11794. return;
  11795. Laya.Browser.window.tt.shareAppMessage({
  11796. channel: "video",
  11797. query: "",
  11798. templateId: "266q4fgb8al7i3e7ie",
  11799. title: "赢得了我,认你做大哥又如何",
  11800. desc: "赢得了我,认你做大哥又如何",
  11801. extra: {
  11802. videoPath: this.completepath,
  11803. videoTopics: ["赢得了我,认你做大哥又如何"]
  11804. },
  11805. success: function () {
  11806. _cb && _cb(true);
  11807. console.log("分享视频成功");
  11808. },
  11809. fail: function (e) {
  11810. _cb && _cb(false);
  11811. console.log("分享视频失败");
  11812. }
  11813. });
  11814. };
  11815. RecordManager.prototype.OnNew = function () {
  11816. var _this = this;
  11817. if (!Laya.Browser.onMobile)
  11818. return;
  11819. this.record = Laya.Browser.window.tt.getGameRecorderManager();
  11820. this.record.onStart(function (res) {
  11821. // 录屏开始
  11822. console.log(res);
  11823. });
  11824. this.record.onStop(function (res) {
  11825. _this.completepath = res.videoPath;
  11826. console.log(res.videoPath);
  11827. });
  11828. };
  11829. return RecordManager;
  11830. }());
  11831. exports.RecordManager = RecordManager;
  11832. },{}],77:[function(require,module,exports){
  11833. "use strict";
  11834. Object.defineProperty(exports, "__esModule", { value: true });
  11835. var systemtype;
  11836. (function (systemtype) {
  11837. systemtype[systemtype["ios"] = 0] = "ios";
  11838. systemtype[systemtype["android"] = 1] = "android";
  11839. systemtype[systemtype["other"] = 2] = "other";
  11840. })(systemtype = exports.systemtype || (exports.systemtype = {}));
  11841. var WxApi = /** @class */ (function () {
  11842. function WxApi() {
  11843. }
  11844. WxApi.recordAldEvent = function (key, value) {
  11845. if (value === void 0) { value = ""; }
  11846. // if(Laya.Browser.window && Laya.Browser.window.wx)
  11847. // {
  11848. // Laya.Browser.window.wx.aldSendEvent(key,{key:value});
  11849. // }
  11850. console.log("事件: ", key);
  11851. };
  11852. WxApi.WXLogin = function (cb) {
  11853. var that = this;
  11854. Laya.Browser.window.wx.login({
  11855. success: function (res) {
  11856. if (res.code) {
  11857. console.log("code:", res.code);
  11858. cb(res);
  11859. }
  11860. else {
  11861. console.log('获取用户登录态失败!' + res.errMsg);
  11862. }
  11863. },
  11864. fail: function (res) { console.log("wx.login: failed, res=" + res); }
  11865. });
  11866. };
  11867. WxApi.WxInit = function () {
  11868. var _this = this;
  11869. if (!Laya.Browser.onWeiXin)
  11870. return;
  11871. Laya.Browser.window.wx.showShareMenu({
  11872. withShareTicket: true
  11873. });
  11874. Laya.Browser.window.wx.onShow(function (option) {
  11875. console.log(option);
  11876. _this.shareOpenId = option.query.userId;
  11877. _this.querychannel = option.query.channel;
  11878. if (option.referrerInfo) {
  11879. _this.referrerInfoappId = option.referrerInfo.appId;
  11880. console.log("onShow appId is:", option.referrerInfo.appId);
  11881. }
  11882. _this.sceneValue = option.scene;
  11883. var scene = Laya.LocalStorage.getItem("scene");
  11884. if (scene) {
  11885. _this.sceneValue = scene;
  11886. console.log("读取配置场景值:" + scene);
  11887. }
  11888. else {
  11889. console.log("第一次拉取场景值:" + _this.sceneValue);
  11890. Laya.LocalStorage.setItem("scene", _this.sceneValue);
  11891. }
  11892. });
  11893. };
  11894. WxApi.ShowLoading = function (title) {
  11895. if (title === void 0) { title = "加载中..."; }
  11896. // if (this.isShowing) return;
  11897. // this.isShowing = true;
  11898. // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.showLoading({ title: title, mask: true });
  11899. };
  11900. WxApi.HideLoading = function () {
  11901. // this.isShowing = false;
  11902. // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.hideLoading();
  11903. };
  11904. WxApi.aldSendOpenid = function (_openid) {
  11905. // if(Laya.Browser.onMiniGame)
  11906. // {
  11907. // console.log("aldSendOpenid",_openid);
  11908. // Laya.Browser.window.wx.aldSendOpenid(_openid);
  11909. // }
  11910. };
  11911. //检测更新
  11912. WxApi.CheckWXUpdate = function () {
  11913. var updateManager = Laya.Browser.window.tt.getUpdateManager();
  11914. updateManager.onCheckForUpdate(function (res) {
  11915. console.log("最新版本:" + res.hasUpdate);
  11916. });
  11917. updateManager.onUpdateReady(function () {
  11918. Laya.Browser.window.tt.showModal({
  11919. showCancel: false,
  11920. title: '更新提示',
  11921. content: '新版本已经准备好,是否重启应用?',
  11922. success: function (res) {
  11923. updateManager.applyUpdate();
  11924. },
  11925. fail: function (res) {
  11926. updateManager.applyUpdate();
  11927. }
  11928. });
  11929. });
  11930. };
  11931. WxApi.levelStart = function (stageId, stageName, userId) {
  11932. // console.log("开始记录关卡:" + stageId);
  11933. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11934. // Laya.Browser.window.wx.aldStage.onStart(
  11935. // {
  11936. // stageId: stageId, //关卡ID 该字段必传
  11937. // stageName: stageName, //关卡名称 该字段必传
  11938. // userId: userId //用户ID 可选
  11939. // }
  11940. // );
  11941. // if(WxApi.newaccount)
  11942. // {
  11943. // Laya.Browser.window.wx.aldStage.onStart(
  11944. // {
  11945. // stageId: "新用户:" + stageId, //关卡ID 该字段必传
  11946. // stageName: stageName, //关卡名称 该字段必传
  11947. // userId: userId //用户ID 可选
  11948. // }
  11949. // );
  11950. // }
  11951. // }
  11952. };
  11953. WxApi.levelRunning = function (stageId, stageName, userId, userevive) {
  11954. console.log("记录关卡中:" + stageId);
  11955. // if(Laya.Browser.window && Laya.Browser.window.wx)
  11956. // {
  11957. // Laya.Browser.window.wx.aldStage.onRunning({
  11958. // stageId : stageId, //关卡ID 该字段必传
  11959. // stageName : stageName, //关卡名称 该字段必传
  11960. // userId : userId, //用户ID 可选
  11961. // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
  11962. // params : {
  11963. // itemName : "使用复活",//使用道具名称 该字段必传
  11964. // itemCount : 1, //使用道具数量 可选
  11965. // desc : userevive //使用道具描述
  11966. // }
  11967. // });
  11968. // if(WxApi.newaccount)
  11969. // {
  11970. // Laya.Browser.window.wx.aldStage.onRunning({
  11971. // stageId :"新用户:" + stageId, //关卡ID 该字段必传
  11972. // stageName : stageName, //关卡名称 该字段必传
  11973. // userId : userId, //用户ID 可选
  11974. // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
  11975. // params : {
  11976. // itemName : "使用复活",//使用道具名称 该字段必传
  11977. // itemCount : 1, //使用道具数量 可选
  11978. // desc : userevive //使用道具描述
  11979. // }
  11980. // })
  11981. // }
  11982. // }
  11983. };
  11984. WxApi.levelSuccess = function (stageId, stageName, userId) {
  11985. console.log("记录关卡:完成" + stageId);
  11986. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  11987. // Laya.Browser.window.wx.aldStage.onEnd(
  11988. // {
  11989. // stageId: stageId, //关卡ID 该字段必传
  11990. // stageName: stageName, //关卡名称 该字段必传
  11991. // userId: userId, //用户ID 可选
  11992. // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  11993. // params:
  11994. // {
  11995. // desc: "关卡完成" //描述
  11996. // }
  11997. // }
  11998. // );
  11999. // if(WxApi.newaccount)
  12000. // {
  12001. // Laya.Browser.window.wx.aldStage.onEnd(
  12002. // {
  12003. // stageId:"新用户:" + stageId, //关卡ID 该字段必传
  12004. // stageName: stageName, //关卡名称 该字段必传
  12005. // userId: userId, //用户ID 可选
  12006. // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  12007. // params:
  12008. // {
  12009. // desc: "关卡完成" //描述
  12010. // }
  12011. // }
  12012. // );
  12013. // }
  12014. // }
  12015. };
  12016. WxApi.levelFail = function (stageId, stageName, userId, score, carname) {
  12017. console.log("记录关卡:失败" + stageId);
  12018. // if (Laya.Browser.window && Laya.Browser.window.wx) {
  12019. // Laya.Browser.window.wx.aldStage.onEnd(
  12020. // {
  12021. // stageId: stageId, //关卡ID 该字段必传
  12022. // stageName: stageName, //关卡名称 该字段必传
  12023. // userId: userId, //用户ID 可选
  12024. // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  12025. // params:
  12026. // {
  12027. // desc: "失败",
  12028. // score: score,//描述
  12029. // car: carname//描述
  12030. // }
  12031. // }
  12032. // );
  12033. // if(WxApi.newaccount)
  12034. // {
  12035. // Laya.Browser.window.wx.aldStage.onEnd(
  12036. // {
  12037. // stageId:"新用户:" + stageId, //关卡ID 该字段必传
  12038. // stageName: stageName, //关卡名称 该字段必传
  12039. // userId: userId, //用户ID 可选
  12040. // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
  12041. // params:
  12042. // {
  12043. // desc: "失败",
  12044. // score: score,//描述
  12045. // car: carname//描述
  12046. // }
  12047. // }
  12048. // );
  12049. // }
  12050. // }
  12051. };
  12052. WxApi.OnShow = function (cb) {
  12053. if (!Laya.Browser.window.tt)
  12054. return;
  12055. Laya.Browser.window.tt.onShow(cb);
  12056. };
  12057. WxApi.OffShow = function (cb) {
  12058. if (!Laya.Browser.onWeiXin)
  12059. return;
  12060. Laya.Browser.window.tt.offShow(cb);
  12061. };
  12062. WxApi.shake = function () {
  12063. Laya.Browser.window.tt.vibrateShort({});
  12064. };
  12065. WxApi.shakeLong = function () {
  12066. Laya.Browser.window.tt.vibrateLong({});
  12067. };
  12068. WxApi.Shake = function (_short) {
  12069. if (_short === void 0) { _short = true; }
  12070. if (Laya.Browser.window.tt && WxApi.CanShake) {
  12071. if (_short) {
  12072. this.shake();
  12073. }
  12074. else {
  12075. this.shakeLong();
  12076. }
  12077. }
  12078. if (!_short) {
  12079. this.stageShake();
  12080. }
  12081. };
  12082. WxApi.stageShake = function (callBack, speed) {
  12083. if (callBack === void 0) { callBack = null; }
  12084. if (speed === void 0) { speed = 32; }
  12085. if (this.isShake || !this.canshakestage)
  12086. return;
  12087. this.isShake = true;
  12088. var point = new Laya.Vector2(Laya.stage.x, Laya.stage.y);
  12089. Laya.stage.timerLoop(speed, this, this.shakeObject, [point, callBack]);
  12090. };
  12091. WxApi.shakeObject = function (_point, _callBack) {
  12092. var count = (this.num++) % 4;
  12093. this.offsetArr[this.num % 2] = count < 2 ? 0 : this.offset;
  12094. Laya.stage.x = this.offsetArr[0] + _point.x;
  12095. Laya.stage.y = this.offsetArr[1] + _point.y;
  12096. if (this.num > (this.times * 4 + 1)) {
  12097. Laya.stage.clearTimer(this, this.shakeObject);
  12098. Laya.stage.pos(0, 0);
  12099. this.num = 0;
  12100. this.isShake = false;
  12101. if (_callBack != null) {
  12102. _callBack();
  12103. }
  12104. }
  12105. };
  12106. WxApi.ShowTxt = function (text) {
  12107. if (Laya.Browser.window.tt) {
  12108. Laya.Browser.window.tt.showToast({ title: text });
  12109. }
  12110. else {
  12111. console.log(text);
  12112. }
  12113. };
  12114. Object.defineProperty(WxApi, "SystemFrom", {
  12115. get: function () {
  12116. if (!Laya.Browser.onWeiXin)
  12117. return systemtype.other;
  12118. var info = Laya.Browser.window.wx.getSystemInfoSync();
  12119. var system = info.system;
  12120. var IOS = system.indexOf("iOS") != -1;
  12121. var Android = system.indexOf("Android") != -1;
  12122. if (IOS) {
  12123. return systemtype.ios;
  12124. }
  12125. else if (Android) {
  12126. return systemtype.android;
  12127. }
  12128. else {
  12129. return systemtype.other;
  12130. }
  12131. },
  12132. enumerable: true,
  12133. configurable: true
  12134. });
  12135. Object.defineProperty(WxApi, "IsLongScreenSystem", {
  12136. get: function () {
  12137. if (!Laya.Browser.onWeiXin)
  12138. return false;
  12139. var systemInfo = Laya.Browser.window.wx.getSystemInfoSync();
  12140. var platformModel = "ipx";
  12141. if (systemInfo != null) {
  12142. var model = systemInfo.model;
  12143. platformModel = systemInfo.brand + "_" + model + "_" + systemInfo.system + "_wx" + systemInfo.version + "_SDKVer" + systemInfo.SDKVersion;
  12144. console.log("platformModel:" + platformModel);
  12145. return !(model.indexOf("X") < 0) ||
  12146. ((model.indexOf("oppo") >= 0 || model.indexOf("OPPO") >= 0) && (model.indexOf("R15") >= 0 || model.indexOf("r15") >= 0)) ||
  12147. systemInfo.statusBarHeight > 20 ||
  12148. (model.indexOf("Note") >= 0 && (model.indexOf("7") >= 0 || model.indexOf("8") >= 0)) ||
  12149. ((model.indexOf("iPhone") >= 0) && (model.indexOf("11") >= 0));
  12150. }
  12151. },
  12152. enumerable: true,
  12153. configurable: true
  12154. });
  12155. WxApi.writeStage = function (stage) {
  12156. var kvDataList = new Array();
  12157. var date = new Date().getTime();
  12158. var myValue = JSON.stringify({
  12159. "wxgame": {
  12160. "stage": stage,
  12161. "update_time": date.toString(),
  12162. }
  12163. });
  12164. kvDataList.push({ key: "stage", value: myValue });
  12165. if (Laya.Browser.window.wx) {
  12166. Laya.Browser.window.wx.setUserCloudStorage({
  12167. KVDataList: kvDataList,
  12168. success: function (r) {
  12169. console.log("上传分数成功");
  12170. }
  12171. });
  12172. }
  12173. };
  12174. WxApi.cpVersionGreaterOrEqual = function (v1, v2) {
  12175. console.log("[LOG]\u57FA\u7840\u5E93\u7248\u672C\u53F7 curVer:" + v1 + " targVer:" + v2);
  12176. var v1Arr = v1.split(".");
  12177. var v2Arr = v2.split(".");
  12178. var len = v1Arr.length;
  12179. if (v2Arr.length < len) {
  12180. len = v2Arr.length;
  12181. }
  12182. for (var i = 0; i < len; i++) {
  12183. var ver1 = Number(v1Arr[i]);
  12184. var ver2 = Number(v2Arr[i]);
  12185. if (ver1 > ver2) {
  12186. return true;
  12187. }
  12188. else if (ver1 < ver2) {
  12189. return false;
  12190. }
  12191. }
  12192. return v1Arr.length >= v2Arr.length;
  12193. };
  12194. WxApi.newaccount = false;
  12195. WxApi.sceneValue = "";
  12196. WxApi.shareOpenId = "";
  12197. WxApi.querychannel = "";
  12198. WxApi.referrerInfoappId = "";
  12199. //显示加载信息
  12200. WxApi.isShowing = false;
  12201. WxApi.CanShake = true;
  12202. WxApi.times = 1.3;
  12203. WxApi.num = 0;
  12204. WxApi.offsetArr = [0, 0];
  12205. WxApi.offset = 14;
  12206. WxApi.canshakestage = false;
  12207. return WxApi;
  12208. }());
  12209. exports.WxApi = WxApi;
  12210. },{}],78:[function(require,module,exports){
  12211. "use strict";
  12212. Object.defineProperty(exports, "__esModule", { value: true });
  12213. var DispatcherManager_1 = require("../utils/DispatcherManager");
  12214. var SocketNofify_1 = require("../WXSDK/SocketNofify");
  12215. var ServerSocket = /** @class */ (function () {
  12216. /**
  12217. * socket连接中
  12218. */
  12219. function ServerSocket() {
  12220. /**
  12221. * 1:自动断线,2:主动断线
  12222. */
  12223. this._offlinestate = 0;
  12224. /**
  12225. * 断线重连次数
  12226. */
  12227. this._connetNums = 0;
  12228. this._socketconneting = false;
  12229. ServerSocket.ins = this;
  12230. }
  12231. Object.defineProperty(ServerSocket, "Instance", {
  12232. get: function () {
  12233. if (ServerSocket.ins == null) {
  12234. return new ServerSocket();
  12235. }
  12236. return ServerSocket.ins;
  12237. },
  12238. enumerable: true,
  12239. configurable: true
  12240. });
  12241. //连接服务器
  12242. ServerSocket.prototype.connectServer = function (gameHost) {
  12243. this._socketconneting = true;
  12244. this.removeSocket();
  12245. if (!this.sock || !this.sock.connected) {
  12246. this.openwaitpanel();
  12247. if (!this.sock) {
  12248. this.sock = new Laya.Socket();
  12249. this.sock.on(Laya.Event.OPEN, this, this.onSocketOpen);
  12250. this.sock.on(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  12251. this.sock.on(Laya.Event.CLOSE, this, this.onSocketClose);
  12252. this.sock.on(Laya.Event.ERROR, this, this.ioErro);
  12253. }
  12254. this.sock.connectByUrl(gameHost);
  12255. }
  12256. };
  12257. ServerSocket.prototype.isConnect = function () {
  12258. if (this.sock && this.sock.connected) {
  12259. return true;
  12260. }
  12261. return false;
  12262. };
  12263. ServerSocket.prototype.ioErro = function (e) {
  12264. if (e === void 0) { e = null; }
  12265. this._socketconneting = false;
  12266. this._connetNums++;
  12267. this.closewaitpanel();
  12268. this.removeSocket();
  12269. this._offlinestate = 1;
  12270. };
  12271. ServerSocket.prototype.removeSocket = function () {
  12272. this._socketconneting = false;
  12273. if (this.sock) {
  12274. this.sock.off(Laya.Event.OPEN, this, this.onSocketOpen);
  12275. this.sock.off(Laya.Event.MESSAGE, this, this.onReceiveMessage);
  12276. this.sock.off(Laya.Event.CLOSE, this, this.onSocketClose);
  12277. this.sock.off(Laya.Event.ERROR, this, this.ioErro);
  12278. this.sock.cleanSocket();
  12279. this.sock.close();
  12280. this.sock = null;
  12281. }
  12282. };
  12283. /**
  12284. * 手动关闭游戏socket
  12285. */
  12286. ServerSocket.prototype.colseSocket = function (offlinestate) {
  12287. if (offlinestate === void 0) { offlinestate = 1; }
  12288. if (this.isConnect()) {
  12289. this.closewaitpanel();
  12290. this.removeSocket();
  12291. if (offlinestate != -1) {
  12292. this._offlinestate = offlinestate;
  12293. }
  12294. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
  12295. }
  12296. };
  12297. ServerSocket.prototype.onSocketClose = function (e) {
  12298. if (e === void 0) { e = null; }
  12299. this._socketconneting = false;
  12300. this.closewaitpanel();
  12301. this._offlinestate = 1;
  12302. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
  12303. };
  12304. ServerSocket.prototype.closewaitpanel = function () {
  12305. fairygui.GRoot.inst.closeModalWait();
  12306. };
  12307. ServerSocket.prototype.openwaitpanel = function () {
  12308. fairygui.GRoot.inst.showModalWait();
  12309. };
  12310. //连接成功返回
  12311. ServerSocket.prototype.onSocketOpen = function (event) {
  12312. if (event === void 0) { event = null; }
  12313. this._connetNums = 0;
  12314. this.closewaitpanel();
  12315. this._offlinestate = 0;
  12316. DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CONNECT_SUCCEED, null, false);
  12317. };
  12318. //向服务端发送消息
  12319. ServerSocket.prototype.sendMessage = function (act, data, isShowWait) {
  12320. if (isShowWait === void 0) { isShowWait = true; }
  12321. if (this.sock && this.sock.connected) {
  12322. if (isShowWait) {
  12323. this.openwaitpanel();
  12324. }
  12325. if (!data) {
  12326. data = {};
  12327. }
  12328. data.ACTION = act;
  12329. this.sock.send(JSON.stringify(data));
  12330. }
  12331. else {
  12332. }
  12333. };
  12334. //消息返回后,会广播出去
  12335. //Global.addEventListener("你发送的cmd名称",监听方法,this)
  12336. ServerSocket.prototype.onReceiveMessage = function (msg) {
  12337. if (msg === void 0) { msg = null; }
  12338. var socketdata = JSON.parse(msg);
  12339. };
  12340. return ServerSocket;
  12341. }());
  12342. exports.ServerSocket = ServerSocket;
  12343. },{"../WXSDK/SocketNofify":79,"../utils/DispatcherManager":85}],79:[function(require,module,exports){
  12344. "use strict";
  12345. Object.defineProperty(exports, "__esModule", { value: true });
  12346. var SocketNofify = /** @class */ (function () {
  12347. function SocketNofify() {
  12348. }
  12349. /**
  12350. * socket连接成功
  12351. */
  12352. SocketNofify.SOCKET_CONNECT_SUCCEED = "SOCKET_CONNECT_SUCCEED";
  12353. /**
  12354. * socket关闭
  12355. */
  12356. SocketNofify.SOCKET_CLOSE = "SOCKET_CLOSE";
  12357. /**
  12358. * 游戏重新连接
  12359. */
  12360. SocketNofify.Game_againConnetSocket = "Game_againConnetSocket";
  12361. return SocketNofify;
  12362. }());
  12363. exports.SocketNofify = SocketNofify;
  12364. },{}],80:[function(require,module,exports){
  12365. "use strict";
  12366. Object.defineProperty(exports, "__esModule", { value: true });
  12367. var WECHATEVENT = /** @class */ (function () {
  12368. function WECHATEVENT() {
  12369. }
  12370. /**
  12371. * 游戏进入后台事件
  12372. */
  12373. WECHATEVENT.WECHATEVENT_onhide = "WECHATEVENT_onhide";
  12374. WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd = "WECHATEVENT_onAudioInterruptionEnd";
  12375. WECHATEVENT.WECHATEVENT_losefocus = "WECHATEVENT_losefocus";
  12376. WECHATEVENT.WECHATEVENT_getfocus = "WECHATEVENT_getfocus";
  12377. WECHATEVENT.WECHATEVENT_updateVideoNums = "WECHATEVENT_updateVideoNums";
  12378. /**
  12379. * 用户打点
  12380. */
  12381. WECHATEVENT.message_9891002 = "9891002";
  12382. /**
  12383. * 获取后台数据
  12384. */
  12385. WECHATEVENT.message_9891101 = "9891101";
  12386. WECHATEVENT.WECHATEVENT_loginSucceed = "WECHATEVENT_loginSucceed";
  12387. /**
  12388. * 游戏从后台恢复显示事件
  12389. */
  12390. WECHATEVENT.WECHATEVENT_onshow = "WECHATEVENT_onshow";
  12391. /**
  12392. * 从收藏或者浮窗进入游戏
  12393. */
  12394. WECHATEVENT.WECHATEVENT_fromscorfk = "WECHATEVENT_fromscorfk";
  12395. /**
  12396. * 登录
  12397. */
  12398. WECHATEVENT.message_9891001 = "9891001";
  12399. /**
  12400. * 广告点击
  12401. */
  12402. WECHATEVENT.message_9891102 = "9891102";
  12403. /**
  12404. * 点击确定跳转到外部游戏
  12405. */
  12406. WECHATEVENT.message_9891103 = "9891103";
  12407. return WECHATEVENT;
  12408. }());
  12409. exports.WECHATEVENT = WECHATEVENT;
  12410. },{}],81:[function(require,module,exports){
  12411. "use strict";
  12412. Object.defineProperty(exports, "__esModule", { value: true });
  12413. var GameUtils_1 = require("../utils/GameUtils");
  12414. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  12415. var Global_1 = require("../Global");
  12416. var DateControl_1 = require("../Control/DateControl");
  12417. var LocalDataControl_1 = require("../Control/LocalDataControl");
  12418. var UserDataInfo_1 = require("../Data/UserDataInfo");
  12419. var GlobalTip_1 = require("../utils/GlobalTip");
  12420. var DispatcherManager_1 = require("../utils/DispatcherManager");
  12421. var AudioControl_1 = require("../Control/AudioControl");
  12422. /*
  12423. * name;
  12424. */
  12425. var WXGamePlatform = /** @class */ (function () {
  12426. function WXGamePlatform() {
  12427. this.isShareing = false;
  12428. this.bannerRunTime = 0;
  12429. this._bannerTypeList = [];
  12430. this._screenwidth = 0;
  12431. this.bannerheight = 0;
  12432. this.bannerwidth = 0;
  12433. this.isonResize = false;
  12434. /**
  12435. * 排行榜打开类型存储
  12436. */
  12437. this._openrankDict = {};
  12438. WXGamePlatform.ins = this;
  12439. }
  12440. Object.defineProperty(WXGamePlatform, "Instance", {
  12441. get: function () {
  12442. if (WXGamePlatform.ins == null) {
  12443. return new WXGamePlatform();
  12444. }
  12445. return WXGamePlatform.ins;
  12446. },
  12447. enumerable: true,
  12448. configurable: true
  12449. });
  12450. WXGamePlatform.prototype.init = function () {
  12451. this.showShareMenu({ withShareTicket: true });
  12452. this.onAudioInterruptionBegin();
  12453. this.onAudioInterruptionEnd();
  12454. };
  12455. WXGamePlatform.prototype.initShareDian = function (data) {
  12456. if (data && data.length > 0) {
  12457. var itemd;
  12458. for (var s in data) {
  12459. itemd = data[s];
  12460. WXGamePlatform.ShareDict[itemd.key] = itemd;
  12461. }
  12462. var firstd = data[0];
  12463. this.onShareAppMessage(firstd.tile, Global_1.Global.cdnurl + firstd.img);
  12464. }
  12465. };
  12466. WXGamePlatform.prototype.initData = function () {
  12467. if (DateControl_1.DateControl.Fresh) {
  12468. WXGamePlatform.dayShareNum = 0;
  12469. WXGamePlatform.dayVideoNum = 0;
  12470. this.updateDayShareInfo();
  12471. this.updateDayVideoInfo();
  12472. }
  12473. else {
  12474. WXGamePlatform.dayShareNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayShare);
  12475. WXGamePlatform.dayVideoNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayVideo);
  12476. }
  12477. };
  12478. /**
  12479. * 存储当天分享的信息
  12480. */
  12481. WXGamePlatform.prototype.updateDayShareInfo = function () {
  12482. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayShare, WXGamePlatform.dayShareNum.toString());
  12483. };
  12484. WXGamePlatform.prototype.updateDayVideoInfo = function () {
  12485. LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayVideo, WXGamePlatform.dayVideoNum.toString());
  12486. };
  12487. WXGamePlatform.prototype.createUserAndLogin = function (callobj, succeedcallback, progressCallback, failcallback) {
  12488. if (progressCallback === void 0) { progressCallback = null; }
  12489. if (failcallback === void 0) { failcallback = null; }
  12490. WXGamePlatform.loginCallobj = callobj;
  12491. WXGamePlatform.loginsucceedcallback = succeedcallback;
  12492. WXGamePlatform.loginprogressCallback = progressCallback;
  12493. var wx = Laya.Browser.window.wx;
  12494. if (wx) {
  12495. var login_info = WXGamePlatform.Instance.getLaunchOptionsSync();
  12496. if (login_info) {
  12497. var query = login_info.query;
  12498. if (query && query.ChanID) {
  12499. WXGamePlatform.QuDaoID = query.ChanID;
  12500. }
  12501. var referrerInfo = login_info.referrerInfo;
  12502. if (WXGamePlatform.QuDaoID == "" && referrerInfo && referrerInfo.appId) {
  12503. WXGamePlatform.QuDaoID = referrerInfo.appId;
  12504. }
  12505. if (login_info.scene) {
  12506. WXGamePlatform.fromscene = Number(login_info.scene);
  12507. }
  12508. }
  12509. var systemres = wx.getSystemInfoSync();
  12510. var version = systemres.SDKVersion;
  12511. if (wx.getUpdateManager) {
  12512. var updateManager = wx.getUpdateManager();
  12513. updateManager.onCheckForUpdate(function (res) {
  12514. // 请求完新版本信息的回调
  12515. if (res.hasUpdate == true) {
  12516. updateManager.onUpdateReady(function () {
  12517. Laya.Browser.window.wx.showModal({
  12518. title: '更新提示',
  12519. content: '新版本已经准备好,是否重启应用?',
  12520. success: function (res) {
  12521. if (res.confirm) {
  12522. // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
  12523. updateManager.applyUpdate();
  12524. }
  12525. else {
  12526. WXGamePlatform.Instance.exitGame();
  12527. }
  12528. }
  12529. });
  12530. });
  12531. updateManager.onUpdateFailed(function () {
  12532. // 新版本下载失败
  12533. WXGamePlatform.Instance.exitGame();
  12534. });
  12535. }
  12536. else {
  12537. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  12538. // {
  12539. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  12540. // }
  12541. var wxplatform = WXGamePlatform.Instance;
  12542. wxplatform.login(callobj, succeedcallback, failcallback);
  12543. }
  12544. });
  12545. }
  12546. else {
  12547. // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
  12548. // {
  12549. // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
  12550. // }
  12551. var wxplatform = WXGamePlatform.Instance;
  12552. wxplatform.login(callobj, succeedcallback, failcallback);
  12553. }
  12554. }
  12555. };
  12556. WXGamePlatform.prototype.createUserInfoButton = function (callobj, callback, failcallback) {
  12557. this.userinfocallobj = callobj;
  12558. this.userinfosuccallback = callback;
  12559. this.userinfofailcallback = failcallback;
  12560. var wx = Laya.Browser.window.wx;
  12561. var res = wx.getSystemInfoSync();
  12562. if (res) {
  12563. var posx = (res.windowWidth - 151) / 2;
  12564. var posy = res.windowHeight - 172 - 40;
  12565. WXGamePlatform.Instance.userinfobutton = wx.createUserInfoButton({
  12566. type: 'image',
  12567. image: 'wxlocal/login.png',
  12568. style: {
  12569. left: posx,
  12570. top: posy,
  12571. width: 151,
  12572. height: 72
  12573. }
  12574. });
  12575. WXGamePlatform.Instance.userinfobutton.onTap(WXGamePlatform.Instance.userinfoButtonClick);
  12576. }
  12577. };
  12578. /**
  12579. * 判断是否已经授权
  12580. */
  12581. WXGamePlatform.prototype.getaccredit = function (callobj, accreditCallback) {
  12582. if (WXGamePlatform.accreditstate == 0) {
  12583. var wx = Laya.Browser.window.wx;
  12584. if (wx) {
  12585. wx.getSetting({
  12586. success: function (res) {
  12587. var itemd = res.authSetting;
  12588. if (itemd.hasOwnProperty("scope.userInfo") && itemd["scope.userInfo"] == true) //已经授权过
  12589. {
  12590. if (accreditCallback && callobj) {
  12591. accreditCallback.call(callobj, true);
  12592. }
  12593. }
  12594. else {
  12595. if (accreditCallback && callobj) {
  12596. accreditCallback.call(callobj, false);
  12597. }
  12598. }
  12599. }
  12600. });
  12601. }
  12602. else {
  12603. if (accreditCallback && callobj) {
  12604. accreditCallback.call(callobj, true);
  12605. }
  12606. }
  12607. }
  12608. else {
  12609. if (accreditCallback && callobj) {
  12610. accreditCallback.call(callobj, true);
  12611. }
  12612. }
  12613. };
  12614. WXGamePlatform.prototype.userinfoButtonClick = function (res) {
  12615. var wxplatform = WXGamePlatform.Instance;
  12616. if (res) {
  12617. var errMsg = res.errMsg;
  12618. if (errMsg == "getUserInfo:ok") {
  12619. WXGamePlatform.accreditstate = 1;
  12620. wxplatform.closeuserinfobUtton();
  12621. wxplatform.getUserInfo(false, wxplatform.userinfocallobj, wxplatform.userinfosuccallback, wxplatform.userinfofailcallback);
  12622. }
  12623. else {
  12624. if (wxplatform.userinfocallobj && wxplatform.userinfofailcallback) {
  12625. wxplatform.userinfofailcallback.call(wxplatform.userinfocallobj);
  12626. }
  12627. }
  12628. }
  12629. };
  12630. WXGamePlatform.prototype.closeuserinfobUtton = function () {
  12631. var wxplatform = WXGamePlatform.Instance;
  12632. if (wxplatform.userinfobutton) {
  12633. wxplatform.userinfobutton.offTap(wxplatform.userinfoButtonClick);
  12634. wxplatform.userinfobutton.destroy();
  12635. wxplatform.userinfobutton = null;
  12636. }
  12637. };
  12638. WXGamePlatform.prototype.getUserInfo = function (islogin, callobj, callback, failcallback) {
  12639. fairygui.GRoot.inst.showModalWait();
  12640. var wxplatform = WXGamePlatform.Instance;
  12641. var wx = Laya.Browser.window.wx;
  12642. if (wx) {
  12643. wx.getUserInfo({
  12644. success: function (res) {
  12645. var userInfo = res.userInfo;
  12646. WXGamePlatform.nickName = userInfo.nickName;
  12647. if (islogin) {
  12648. wxplatform.login(callobj, callback, failcallback);
  12649. }
  12650. else {
  12651. if (callobj && callback) {
  12652. callback.call(callobj, WXGamePlatform.nickName);
  12653. }
  12654. }
  12655. }
  12656. });
  12657. }
  12658. };
  12659. /**
  12660. * 登录
  12661. * @param callobj
  12662. * @param succeedcallback
  12663. * @param failCallback
  12664. */
  12665. WXGamePlatform.prototype.login = function (callobj, callback, failcallback) {
  12666. var wxplatform = WXGamePlatform.Instance;
  12667. if (Laya.Browser.window.wx) {
  12668. Laya.Browser.window.wx.login({
  12669. success: function (res) {
  12670. WXGamePlatform.code = res.code;
  12671. var itemd = {};
  12672. if (WXGamePlatform.QuDaoID != "") {
  12673. itemd.ChanID = WXGamePlatform.QuDaoID;
  12674. }
  12675. itemd.Code = WXGamePlatform.code;
  12676. itemd.AppID = Global_1.Global.appid;
  12677. itemd.Version = Global_1.Global.gameVersion;
  12678. },
  12679. fail: function (res) {
  12680. wxplatform.login(callobj, callback, failcallback);
  12681. }
  12682. });
  12683. }
  12684. };
  12685. WXGamePlatform.prototype.loginSucceedCallback = function (data) {
  12686. if (WXGamePlatform.loginCallobj && WXGamePlatform.loginsucceedcallback) {
  12687. WXGamePlatform.loginsucceedcallback.call(WXGamePlatform.loginCallobj, data);
  12688. }
  12689. };
  12690. WXGamePlatform.prototype.loadSubpackage = function (name, subcallobj, subcallback, updatecallback, subfailcallback) {
  12691. if (Laya.Browser.window.wx) {
  12692. this._subcallobj = subcallobj;
  12693. this._subcallback = subcallback;
  12694. this._updatecallback = updatecallback;
  12695. this._subfailcallback = subfailcallback;
  12696. var wx = Laya.Browser.window.wx;
  12697. if (wx.loadSubpackage) {
  12698. var loadTask = wx.loadSubpackage({
  12699. name: name,
  12700. success: function (res) {
  12701. // 分包加载成功后通过 success 回调
  12702. var wxgamePlatform = WXGamePlatform.Instance;
  12703. if (wxgamePlatform._subcallback && wxgamePlatform._subcallobj) {
  12704. wxgamePlatform._subcallback.call(wxgamePlatform._subcallobj);
  12705. }
  12706. },
  12707. fail: function (res) {
  12708. // 分包加载失败通过 fail 回调
  12709. var wxgamePlatform = WXGamePlatform.Instance;
  12710. if (wxgamePlatform._subfailcallback && wxgamePlatform._subcallobj) {
  12711. wxgamePlatform._subfailcallback.call(wxgamePlatform._subcallobj);
  12712. }
  12713. }
  12714. });
  12715. if (loadTask.onProgressUpdate) {
  12716. loadTask.onProgressUpdate(function (res) {
  12717. var wxgamePlatform = WXGamePlatform.Instance;
  12718. if (wxgamePlatform._updatecallback && wxgamePlatform._subcallobj) {
  12719. wxgamePlatform._updatecallback.call(wxgamePlatform._subcallobj, res.progress);
  12720. }
  12721. });
  12722. }
  12723. }
  12724. else {
  12725. if (subcallobj && subcallback) {
  12726. subcallback.call(subcallobj);
  12727. }
  12728. }
  12729. }
  12730. else {
  12731. if (subcallobj && subcallback) {
  12732. subcallback.call(subcallobj);
  12733. }
  12734. }
  12735. };
  12736. /**
  12737. * 获取转发详细信息
  12738. * @param obj
  12739. * @param callobj
  12740. * @param succeedcallback
  12741. * @param failCallback
  12742. */
  12743. WXGamePlatform.prototype.getShareInfo = function (obj, callobj, succeedcallback, failCallback) {
  12744. if (failCallback === void 0) { failCallback = null; }
  12745. if (Laya.Browser.window.wx) {
  12746. Laya.Browser.window.wx.getShareInfo({
  12747. shareTicket: obj.shareTicket,
  12748. success: function (res) {
  12749. succeedcallback.call(callobj, res);
  12750. }
  12751. });
  12752. }
  12753. };
  12754. /**
  12755. * 监听用户点击右上角菜单的“转发”按钮时触发的事件
  12756. * @param title
  12757. * @param imageUrl
  12758. */
  12759. WXGamePlatform.prototype.onShareAppMessage = function (title, imageUrl) {
  12760. if (Laya.Browser.window.wx) {
  12761. Laya.Browser.window.wx.onShareAppMessage(function () {
  12762. return {
  12763. title: title,
  12764. imageUrl: imageUrl
  12765. };
  12766. });
  12767. }
  12768. };
  12769. /**
  12770. * 主动拉起转发,进入选择通讯录界面。
  12771. * @param title
  12772. * @param imageUrl
  12773. */
  12774. WXGamePlatform.prototype.shareAppMessage = function (d) {
  12775. if (Laya.Browser.window.wx) {
  12776. Laya.Browser.window.wx.shareAppMessage(d);
  12777. }
  12778. };
  12779. /**
  12780. * 显示当前页面的转发按钮
  12781. * @param obj
  12782. */
  12783. WXGamePlatform.prototype.showShareMenu = function (obj) {
  12784. if (obj === void 0) { obj = null; }
  12785. if (Laya.Browser.window.wx) {
  12786. Laya.Browser.window.wx.showShareMenu(obj);
  12787. }
  12788. };
  12789. /**
  12790. * 更新转发属性
  12791. * @param obj
  12792. */
  12793. WXGamePlatform.prototype.updateShareMenu = function (obj) {
  12794. if (obj === void 0) { obj = null; }
  12795. if (Laya.Browser.window.wx) {
  12796. Laya.Browser.window.wx.updateShareMenu(obj);
  12797. }
  12798. };
  12799. /**
  12800. * 显示当前页面的转发按钮
  12801. */
  12802. WXGamePlatform.prototype.showMenu = function () {
  12803. if (Laya.Browser.window.wx) {
  12804. Laya.Browser.window.wx.showShareMenu();
  12805. }
  12806. };
  12807. /**
  12808. * 本地存储
  12809. * @param key
  12810. * @param data
  12811. */
  12812. WXGamePlatform.prototype.setStorageSync = function (key, data) {
  12813. var wx = Laya.Browser.window.wx;
  12814. if (wx) {
  12815. wx.setStorageSync(key, data);
  12816. }
  12817. };
  12818. /**
  12819. * 获取本地存储
  12820. * @param key
  12821. */
  12822. WXGamePlatform.prototype.getStorageSync = function (key) {
  12823. var wx = Laya.Browser.window.wx;
  12824. if (wx) {
  12825. return wx.getStorageSync(key);
  12826. }
  12827. return null;
  12828. };
  12829. WXGamePlatform.prototype.setUserCloudStorage = function (obj, callobj, succeedcallback, failCallback) {
  12830. if (callobj === void 0) { callobj = null; }
  12831. if (succeedcallback === void 0) { succeedcallback = null; }
  12832. if (failCallback === void 0) { failCallback = null; }
  12833. var wx = Laya.Browser.window.wx;
  12834. if (wx && wx.setUserCloudStorage) {
  12835. wx.setUserCloudStorage({
  12836. KVDataList: obj,
  12837. success: function (res) {
  12838. if (succeedcallback) {
  12839. succeedcallback.call(callobj, res);
  12840. }
  12841. },
  12842. fail: function (res) {
  12843. if (failCallback) {
  12844. failCallback.call(callobj);
  12845. }
  12846. }
  12847. });
  12848. }
  12849. };
  12850. /**
  12851. * 显示消息提示框
  12852. * @param word
  12853. */
  12854. WXGamePlatform.prototype.toast = function (word) {
  12855. if (Laya.Browser.window.wx) {
  12856. Laya.Browser.window.wx.showToast({ title: word });
  12857. }
  12858. };
  12859. /**
  12860. * 向开放数据域发送消息
  12861. * @param obj
  12862. */
  12863. WXGamePlatform.prototype.postMessage = function (str, data) {
  12864. if (data === void 0) { data = null; }
  12865. var wx = Laya.Browser.window.wx;
  12866. if (wx) {
  12867. var context = wx.getOpenDataContext();
  12868. context.postMessage({ action: str, data: data });
  12869. }
  12870. };
  12871. /**
  12872. * 创建一个 InnerAudioContext 实例
  12873. */
  12874. WXGamePlatform.prototype.createInnerAudioContext = function () {
  12875. if (Laya.Browser.window.wx) {
  12876. return Laya.Browser.window.wx.createInnerAudioContext();
  12877. }
  12878. return null;
  12879. };
  12880. /**
  12881. * 获取系统信息
  12882. */
  12883. WXGamePlatform.prototype.getSystemInfoSync = function () {
  12884. if (Laya.Browser.window.wx) {
  12885. return Laya.Browser.window.wx.getSystemInfoSync();
  12886. }
  12887. return null;
  12888. };
  12889. /**
  12890. * 预览图片,调用之后会在新打开的页面中全屏预览传入的图片,预览的过程中用户可以进行保存图片、发送给朋友等操作
  12891. * @param obj
  12892. */
  12893. WXGamePlatform.prototype.previewImage = function (obj) {
  12894. if (Laya.Browser.window.wx) {
  12895. Laya.Browser.window.wx.previewImage(obj);
  12896. }
  12897. };
  12898. /**
  12899. * 监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。
  12900. * @param callobj
  12901. * @param succeedcallback
  12902. */
  12903. WXGamePlatform.prototype.onHide = function (callobj, succeedcallback) {
  12904. if (Laya.Browser.window.wx) {
  12905. Laya.Browser.window.wx.onHide(function (res) {
  12906. WXGamePlatform.isShowing = false;
  12907. if (succeedcallback && callobj) {
  12908. succeedcallback.call(callobj, res);
  12909. }
  12910. });
  12911. }
  12912. };
  12913. /**
  12914. * 返回小程序启动参数
  12915. * @param callobj
  12916. * @param succeedcallback
  12917. */
  12918. WXGamePlatform.prototype.getLaunchOptionsSync = function () {
  12919. if (Laya.Browser.window.wx) {
  12920. return Laya.Browser.window.wx.getLaunchOptionsSync();
  12921. }
  12922. return null;
  12923. };
  12924. /**
  12925. * 隐藏消息提示框
  12926. * @param obj
  12927. */
  12928. WXGamePlatform.prototype.hideToast = function (obj) {
  12929. if (Laya.Browser.window.wx) {
  12930. Laya.Browser.window.wx.hideToast(obj);
  12931. }
  12932. };
  12933. /**
  12934. * 显示模态对话框
  12935. * @param obj
  12936. */
  12937. WXGamePlatform.prototype.showModal = function (obj) {
  12938. if (Laya.Browser.window.wx) {
  12939. Laya.Browser.window.wx.showModal(obj);
  12940. }
  12941. };
  12942. /**
  12943. * 清理存储数据
  12944. */
  12945. WXGamePlatform.prototype.clearStorage = function () {
  12946. if (Laya.Browser.window.wx) {
  12947. Laya.Browser.window.wx.clearStorageSync();
  12948. }
  12949. };
  12950. /**
  12951. * 使手机发生较短时间的振动(15 ms)
  12952. * @param obj
  12953. */
  12954. WXGamePlatform.prototype.vibrateShort = function () {
  12955. if (Laya.Browser.window.wx) {
  12956. Laya.Browser.window.wx.vibrateShort();
  12957. }
  12958. };
  12959. /**
  12960. * 从本地缓存中移除指定 key
  12961. * @param key
  12962. */
  12963. WXGamePlatform.prototype.removeStorage = function (key) {
  12964. if (Laya.Browser.window.wx) {
  12965. Laya.Browser.window.wx.removeStorage(key);
  12966. }
  12967. };
  12968. WXGamePlatform.prototype.onAudioInterruptionBegin = function () {
  12969. if (Laya.Browser.window.wx) {
  12970. Laya.Browser.window.wx.onAudioInterruptionBegin(function () {
  12971. // SoundssManager.Instance.playbgSound("bgm");
  12972. AudioControl_1.AudioControl.Instance.ClearAllSOUND();
  12973. });
  12974. }
  12975. };
  12976. WXGamePlatform.prototype.onAudioInterruptionEnd = function () {
  12977. if (Laya.Browser.window.wx) {
  12978. Laya.Browser.window.wx.onAudioInterruptionEnd(function () {
  12979. var wxgameplatform = WXGamePlatform.Instance;
  12980. Laya.timer.clear(wxgameplatform, wxgameplatform.onAudioEndCallback);
  12981. Laya.timer.once(500, wxgameplatform, wxgameplatform.onAudioEndCallback);
  12982. });
  12983. }
  12984. };
  12985. WXGamePlatform.prototype.onAudioEndCallback = function () {
  12986. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
  12987. };
  12988. /**
  12989. * 退出游戏
  12990. */
  12991. WXGamePlatform.prototype.exitGame = function () {
  12992. var wx = Laya.Browser.window.wx;
  12993. if (wx) {
  12994. wx.exitMiniProgram();
  12995. }
  12996. };
  12997. /**
  12998. * 打开客服对话框
  12999. */
  13000. WXGamePlatform.prototype.openCustomerService = function () {
  13001. var wx = Laya.Browser.window.wx;
  13002. if (wx) {
  13003. var version = wx.getSystemInfoSync().SDKVersion;
  13004. if (GameUtils_1.GameUtils.compareVersion(version, '2.0.3') >= 0 && wx.openCustomerServiceConversation) {
  13005. wx.openCustomerServiceConversation({
  13006. showMessageCard: true,
  13007. sendMessageImg: "https://resource.51yoyoyo.com/res/wxsendmessageimg/smi.jpg"
  13008. });
  13009. }
  13010. else {
  13011. // AlertUtils.showWordTips("当前微信版本不支持");
  13012. }
  13013. }
  13014. };
  13015. /**
  13016. * 监听内存不足告警
  13017. */
  13018. WXGamePlatform.prototype.onMemoryWarning = function () {
  13019. var wx = Laya.Browser.window.wx;
  13020. if (wx && wx.onMemoryWarning) {
  13021. wx.onMemoryWarning(function () {
  13022. });
  13023. }
  13024. };
  13025. WXGamePlatform.prototype.onError = function () {
  13026. var wx = Laya.Browser.window.wx;
  13027. if (wx && wx.onError) {
  13028. wx.onError(function (res) {
  13029. console.log("*****onError", res);
  13030. });
  13031. }
  13032. };
  13033. /**
  13034. * 开始分享
  13035. */
  13036. WXGamePlatform.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  13037. if (callobj === void 0) { callobj = null; }
  13038. if (succeedCallback === void 0) { succeedCallback = null; }
  13039. if (failCallback === void 0) { failCallback = null; }
  13040. WXGamePlatform.nowShareindex = 0;
  13041. if (WXGamePlatform.ShareDict[key]) {
  13042. this.shareApp(WXGamePlatform.ShareDict[key], callobj, succeedCallback, failCallback);
  13043. }
  13044. };
  13045. WXGamePlatform.prototype.shareApp = function (info, callobj, success, failCallback) {
  13046. this.nowshareObj = callobj;
  13047. this.nowshareinfo = info;
  13048. this.nowsharesucceedfun = success;
  13049. this.nowsharefailfun = failCallback;
  13050. this.startShareTime = Laya.Browser.now();
  13051. this.isShareing = true;
  13052. WXGamePlatform.callbackfailstate = 0;
  13053. this.shareAppMessage({
  13054. title: info.tile, imageUrl: Global_1.Global.cdnurl + info.img, query: "",
  13055. success: function (res) {
  13056. },
  13057. fail: function (res) {
  13058. GlobalTip_1.GlobalTip.Instance.showWordTips("您取消了分享");
  13059. if (failCallback && callobj) {
  13060. failCallback.call(callobj);
  13061. }
  13062. },
  13063. cancel: function (res) {
  13064. WXGamePlatform.callbackfailstate = 1;
  13065. }
  13066. });
  13067. };
  13068. /**
  13069. * 监听小游戏回到前台的事件
  13070. * @param callobj
  13071. * @param succeedcallback
  13072. * @param failCallback
  13073. */
  13074. WXGamePlatform.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  13075. if (callobj === void 0) { callobj = null; }
  13076. if (succeedcallback === void 0) { succeedcallback = null; }
  13077. if (failCallback === void 0) { failCallback = null; }
  13078. this.showobj = callobj;
  13079. this.showCallback = succeedcallback;
  13080. var wx = Laya.Browser.window.wx;
  13081. if (wx) {
  13082. wx.onShow(function (res) {
  13083. WXGamePlatform.isShowing = true;
  13084. if (res && res.scene) {
  13085. WXGamePlatform.fromscene = Number(res.scene);
  13086. }
  13087. Laya.timer.frameOnce(1, WXGamePlatform.Instance, WXGamePlatform.Instance.onShowSucceed);
  13088. });
  13089. }
  13090. };
  13091. WXGamePlatform.prototype.onShowSucceed = function () {
  13092. var wxgameplatform = WXGamePlatform.Instance;
  13093. if (wxgameplatform.showobj && wxgameplatform.showCallback) {
  13094. wxgameplatform.showCallback.call(wxgameplatform.showobj);
  13095. }
  13096. if (wxgameplatform.isShareing) //如果是分享状态
  13097. {
  13098. wxgameplatform.isShareing = false;
  13099. var isShareSucceed = false;
  13100. if (WXGamePlatform.callbackfailstate == 0) {
  13101. var nowTime = Laya.Browser.now();
  13102. var disTime = (nowTime - wxgameplatform.startShareTime) / 1000;
  13103. if (disTime >= WXGamePlatform.ShareTime || WXGamePlatform.nowShareindex >= 3) {
  13104. isShareSucceed = true;
  13105. }
  13106. }
  13107. WXGamePlatform.callbackfailstate = 0;
  13108. if (isShareSucceed) {
  13109. WXGamePlatform.dayShareNum++;
  13110. wxgameplatform.updateDayShareInfo();
  13111. if (wxgameplatform.nowshareObj && wxgameplatform.nowsharesucceedfun) {
  13112. wxgameplatform.nowsharesucceedfun.call(wxgameplatform.nowshareObj);
  13113. }
  13114. }
  13115. else {
  13116. WXGamePlatform.nowShareindex++;
  13117. wxgameplatform.showModal({
  13118. title: "提示", content: "请每次分享到不同群,是否重新分享?", showCancel: true, cancelText: '取消', confirmText: '确定',
  13119. success: function (res) {
  13120. var wxplatform = WXGamePlatform.Instance;
  13121. if (res.confirm) {
  13122. WXGamePlatform.Instance.shareApp(wxplatform.nowshareinfo, wxplatform.nowshareObj, wxplatform.nowsharesucceedfun, wxplatform.nowsharefailfun);
  13123. }
  13124. else {
  13125. if (wxplatform.nowsharefailfun && wxplatform.nowshareObj) {
  13126. wxplatform.nowsharefailfun.call(wxplatform.nowshareObj);
  13127. }
  13128. }
  13129. },
  13130. fail: function () {
  13131. },
  13132. complete: function () {
  13133. }
  13134. });
  13135. }
  13136. }
  13137. };
  13138. /**
  13139. * 看视频领奖励
  13140. * @param callobj
  13141. * @param succeedcallback
  13142. */
  13143. WXGamePlatform.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  13144. var _this = this;
  13145. if (callobj === void 0) { callobj = null; }
  13146. if (succeedcallback === void 0) { succeedcallback = null; }
  13147. if (failCallback === void 0) { failCallback = null; }
  13148. if (istongjiNum === void 0) { istongjiNum = true; }
  13149. var wx = Laya.Browser.window.wx;
  13150. if (wx && wx.createRewardedVideoAd) {
  13151. if (!WXGamePlatform.videoplaying) {
  13152. var time = this.lockVideoLeftTime();
  13153. if (time > 0) {
  13154. GlobalTip_1.GlobalTip.Instance.showWordTips("广告尚未准备好,请" + time + "秒后再试");
  13155. return;
  13156. }
  13157. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
  13158. WXGamePlatform.istongjiVideoNum = istongjiNum;
  13159. this.nowvideokey = key;
  13160. WXGamePlatform.videoplaying = true;
  13161. this.videocallobj = callobj;
  13162. this.videosucceedCallback = succeedcallback;
  13163. this.videofailCallback = failCallback;
  13164. this.videoAd = wx.createRewardedVideoAd({
  13165. adUnitId: 'adunit-0c687084c908ee89'
  13166. });
  13167. this.videoAd.onClose(this.closeAD);
  13168. this.videoAd.onError(this.onerro);
  13169. this.videoAd.load().then(function () { return _this.videoAd.show(); }).catch(function (err) { console.log(err.errMsg), WXGamePlatform.Instance.failVideo(); });
  13170. }
  13171. }
  13172. };
  13173. WXGamePlatform.prototype.lockVideoLeftTime = function () {
  13174. var time = (Laya.Browser.now() - WXGamePlatform.lastVideoTime) / 1000;
  13175. time = WXGamePlatform.VideoTime - time;
  13176. return Math.ceil(time);
  13177. };
  13178. WXGamePlatform.prototype.onerro = function (res) {
  13179. var wxgamePlatform = WXGamePlatform.Instance;
  13180. WXGamePlatform.videoplaying = false;
  13181. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  13182. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  13183. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  13184. };
  13185. // 关闭广告
  13186. WXGamePlatform.prototype.closeAD = function (status) {
  13187. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  13188. var wxgamePlatform = WXGamePlatform.Instance;
  13189. if (status && status.isEnded || status == undefined) {
  13190. if (WXGamePlatform.istongjiVideoNum) {
  13191. WXGamePlatform.dayVideoNum++;
  13192. wxgamePlatform.updateDayVideoInfo();
  13193. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_updateVideoNums);
  13194. }
  13195. if (wxgamePlatform.videocallobj && wxgamePlatform.videosucceedCallback) {
  13196. wxgamePlatform.videosucceedCallback.call(wxgamePlatform.videocallobj);
  13197. }
  13198. }
  13199. else {
  13200. GlobalTip_1.GlobalTip.Instance.showWordTips("未观看完整视频,无法获得奖励");
  13201. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  13202. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  13203. }
  13204. }
  13205. WXGamePlatform.videoplaying = false;
  13206. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  13207. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  13208. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  13209. };
  13210. // 广告失败
  13211. WXGamePlatform.prototype.failVideo = function () {
  13212. WXGamePlatform.lastVideoTime = Laya.Browser.now();
  13213. WXGamePlatform.videoplaying = false;
  13214. GlobalTip_1.GlobalTip.Instance.showWordTips("广告加载失败,试试别的方式吧~");
  13215. var wxgamePlatform = WXGamePlatform.Instance;
  13216. wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
  13217. wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
  13218. if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
  13219. wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
  13220. }
  13221. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  13222. };
  13223. WXGamePlatform.prototype.isCanVideo = function () {
  13224. if (WXGamePlatform.dayVideoNum < WXGamePlatform.VideoNum) {
  13225. if (WXGamePlatform.dayVideoNum == 0) {
  13226. return true;
  13227. }
  13228. var videobs = Math.floor(WXGamePlatform.dayVideoNum / WXGamePlatform.VideotoShare);
  13229. var sharebs = Math.floor(WXGamePlatform.dayShareNum / WXGamePlatform.SharetoVideo);
  13230. if (videobs > sharebs) {
  13231. return false;
  13232. }
  13233. else if (videobs < sharebs) {
  13234. return true;
  13235. }
  13236. else {
  13237. var videoyushu = WXGamePlatform.dayVideoNum % WXGamePlatform.VideotoShare;
  13238. if (videoyushu != 0) {
  13239. return true;
  13240. }
  13241. var shareyushu = WXGamePlatform.dayShareNum % WXGamePlatform.SharetoVideo;
  13242. if (shareyushu != 0) {
  13243. return false;
  13244. }
  13245. return true;
  13246. }
  13247. }
  13248. return false;
  13249. };
  13250. WXGamePlatform.prototype.createBanner = function (bannertype, style) {
  13251. if (bannertype === void 0) { bannertype = ""; }
  13252. if (Laya.Browser.window.wx) {
  13253. if (bannertype != "") {
  13254. var bo = false;
  13255. for (var i = 0; i < this._bannerTypeList.length; i++) {
  13256. if (bannertype == this._bannerTypeList[i].type) {
  13257. this._bannerTypeList[i].style = style;
  13258. var arr = this._bannerTypeList.splice(i, 1);
  13259. this._bannerTypeList.push(arr[0]);
  13260. bo = true;
  13261. break;
  13262. }
  13263. }
  13264. if (!bo) {
  13265. this._bannerTypeList.push({ type: bannertype, style: style });
  13266. }
  13267. }
  13268. else {
  13269. if (this._bannerTypeList.length == 0) {
  13270. return;
  13271. }
  13272. else {
  13273. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  13274. style = item.style;
  13275. }
  13276. }
  13277. if (this.bannerAd) {
  13278. var now = Laya.Browser.now();
  13279. //超过3分钟刷新
  13280. if (now - this.bannerRunTime > 60000 * 3) {
  13281. this.bannerAd.offError(this.bannerError);
  13282. this.bannerAd.offResize(this.bannerResize);
  13283. this.bannerAd.destory();
  13284. this.createNewBanner(style);
  13285. }
  13286. else {
  13287. this.showBanner(style);
  13288. }
  13289. }
  13290. else {
  13291. this.createNewBanner(style);
  13292. }
  13293. }
  13294. };
  13295. WXGamePlatform.prototype.createNewBanner = function (style) {
  13296. var wx = Laya.Browser.window.wx;
  13297. if (wx && wx.createBannerAd) {
  13298. this.nowStype = style;
  13299. this.bannerRunTime = Laya.Browser.now();
  13300. var info = this.getSystemInfoSync();
  13301. this._screenwidth = info.screenWidth;
  13302. var scale = 1;
  13303. if (style.hasOwnProperty("scale")) {
  13304. scale = style.scale;
  13305. }
  13306. this.bannerAd = wx.createBannerAd({
  13307. adUnitId: 'adunit-8c2d586135fa6d4f',
  13308. adIntervals: 30,
  13309. style: {
  13310. left: 0,
  13311. top: info.screenHeight - 105,
  13312. width: info.screenWidth * scale
  13313. }
  13314. });
  13315. if (this.bannerAd) {
  13316. this.bannerAd.onError(this.bannerError);
  13317. this.showBanner(style);
  13318. }
  13319. }
  13320. };
  13321. WXGamePlatform.prototype.bannerResize = function (res) {
  13322. var self = WXGamePlatform.Instance;
  13323. self.bannerAd.offResize(self.bannerResize);
  13324. self.isonResize = false;
  13325. var nowstype = self.nowStype;
  13326. if (!nowstype) {
  13327. return;
  13328. }
  13329. var info = self.getSystemInfoSync();
  13330. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  13331. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  13332. self.bannerwidth = res.width;
  13333. self.bannerheight = res.height;
  13334. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  13335. self.bannerAd.style.left = nowstype.x * percentageW;
  13336. }
  13337. else {
  13338. self.bannerAd.style.left = (info.windowWidth - res.width) * 0.5;
  13339. }
  13340. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  13341. self.bannerAd.style.top = nowstype.y * percentageH;
  13342. }
  13343. else {
  13344. self.bannerAd.style.top = (info.windowHeight - res.height) - 15;
  13345. }
  13346. };
  13347. WXGamePlatform.prototype.bannerError = function (err) {
  13348. };
  13349. WXGamePlatform.prototype.showBanner = function (style) {
  13350. if (this.bannerAd) {
  13351. this.nowStype = style;
  13352. var info = this.getSystemInfoSync();
  13353. var nowstype = this.nowStype;
  13354. var scale = 1;
  13355. if (nowstype.hasOwnProperty("scale")) {
  13356. scale = nowstype.scale;
  13357. }
  13358. var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
  13359. var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
  13360. if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
  13361. this.bannerAd.style.left = nowstype.x * percentageW;
  13362. }
  13363. else {
  13364. this.bannerAd.style.left = (info.windowWidth - this.bannerwidth) * 0.5;
  13365. }
  13366. if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
  13367. this.bannerAd.style.top = nowstype.y * percentageH;
  13368. }
  13369. else {
  13370. this.bannerAd.style.top = (info.windowHeight - this.bannerheight) - 15;
  13371. }
  13372. this.bannerAd.style.width = info.screenWidth * scale;
  13373. if (!this.isonResize) {
  13374. this.isonResize = true;
  13375. this.bannerAd.onResize(this.bannerResize);
  13376. }
  13377. this.bannerAd.show();
  13378. }
  13379. };
  13380. WXGamePlatform.prototype.hideBanner = function (type) {
  13381. if (type === void 0) { type = ""; }
  13382. if (this.bannerAd) {
  13383. this.bannerAd.hide();
  13384. }
  13385. if (type != "") {
  13386. for (var i = 0; i < this._bannerTypeList.length; i++) {
  13387. if (type == this._bannerTypeList[i].type) {
  13388. this._bannerTypeList.splice(i, 1);
  13389. break;
  13390. }
  13391. }
  13392. if (this._bannerTypeList.length > 0) {
  13393. var item = this._bannerTypeList[this._bannerTypeList.length - 1];
  13394. this.createBanner(item.type, item.style);
  13395. }
  13396. }
  13397. };
  13398. // private _wxOpenDataViewer:WXOpenDataViewer;
  13399. /**
  13400. * 打开好友排行榜
  13401. */
  13402. WXGamePlatform.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  13403. if (parent === void 0) { parent = null; }
  13404. if (data === void 0) { data = null; }
  13405. this.closeziyuStage();
  13406. this._openrankDict[viewType] = { type: type, viewType: viewType, rect: rect, parent: parent, data: data };
  13407. this.initziyuStage(rect, parent);
  13408. this.postMessage(type, data);
  13409. };
  13410. /**
  13411. * 排行榜打开状态时候,切换显示类型
  13412. * @param type
  13413. */
  13414. WXGamePlatform.prototype.changeFriendRank = function (type) {
  13415. this.postMessage(type);
  13416. };
  13417. /**
  13418. * 排行榜上一页
  13419. */
  13420. WXGamePlatform.prototype.prePageRank = function () {
  13421. };
  13422. /**
  13423. * 排行榜下一页
  13424. */
  13425. WXGamePlatform.prototype.nextPageRank = function () {
  13426. };
  13427. /**
  13428. * 关闭好友排行榜
  13429. */
  13430. WXGamePlatform.prototype.closeFriendRank = function (viewType) {
  13431. this.closeziyuStage();
  13432. if (this._openrankDict[viewType]) {
  13433. delete this._openrankDict[viewType];
  13434. }
  13435. for (var s in this._openrankDict) {
  13436. var itemd = this._openrankDict[s];
  13437. this.openFriendRank(itemd.type, itemd.viewType, itemd.rect, itemd.parent, itemd.data);
  13438. break;
  13439. }
  13440. };
  13441. /**
  13442. * 初始化子域
  13443. * @param rect
  13444. * @param parent
  13445. */
  13446. WXGamePlatform.prototype.initziyuStage = function (rect, parent) {
  13447. // if( !this._wxOpenDataViewer )
  13448. // {
  13449. // this._wxOpenDataViewer = new WXOpenDataViewer();
  13450. // if( parent )
  13451. // {
  13452. // parent.addChild( this._wxOpenDataViewer );
  13453. // }
  13454. // else
  13455. // {
  13456. // GameLayerManager.Instance.topLayer.displayObject.addChild( this._wxOpenDataViewer );
  13457. // }
  13458. // }
  13459. // this._wxOpenDataViewer.x = rect.x;
  13460. // this._wxOpenDataViewer.y = rect.y;
  13461. // this._wxOpenDataViewer.width = rect.width;
  13462. // this._wxOpenDataViewer.height = rect.height;
  13463. };
  13464. /**
  13465. * 销毁子域
  13466. */
  13467. WXGamePlatform.prototype.closeziyuStage = function () {
  13468. // if( this._wxOpenDataViewer )
  13469. // {
  13470. // this._wxOpenDataViewer.destroy();
  13471. // this._wxOpenDataViewer.removeSelf();
  13472. // this._wxOpenDataViewer = null;
  13473. // }
  13474. };
  13475. /**
  13476. * 数据上传(用于排行榜数据显示)
  13477. * @param param1 上报数据
  13478. * @param param2 上报数据
  13479. */
  13480. WXGamePlatform.prototype.storeToCloud = function (param1, param2) {
  13481. var cacheMager = LocalDataControl_1.LocalDataControl.Instance;
  13482. var score1 = cacheMager.getnum("param1");
  13483. // var score2:number = cacheMager.getnum( "param2" );
  13484. param1 = Math.floor(param1);
  13485. param2 = Math.floor(param2);
  13486. var result1 = param1;
  13487. var result2 = param2;
  13488. if (result1 < score1) {
  13489. result1 = score1;
  13490. }
  13491. else {
  13492. cacheMager.addstr("param1", result1.toString());
  13493. }
  13494. var arr = [];
  13495. arr.push({ key: "param1", value: result1.toString() });
  13496. arr.push({ key: "param2", value: result2 + "" });
  13497. this.setUserCloudStorage(arr);
  13498. };
  13499. WXGamePlatform.prototype.createGameClubButton = function (style, icon) {
  13500. if (icon === void 0) { icon = "green"; }
  13501. var wx = Laya.Browser.window.wx;
  13502. if (wx && style) {
  13503. style.width = 40;
  13504. style.height = 40;
  13505. WXGamePlatform.gameclubButton = wx.createGameClubButton({
  13506. icon: icon,
  13507. style: style
  13508. });
  13509. if (WXGamePlatform.gameclubButton) {
  13510. WXGamePlatform.gameclubButton.show();
  13511. }
  13512. }
  13513. };
  13514. WXGamePlatform.QuDaoID = ""; //微信广告ID
  13515. WXGamePlatform.isShowing = true;
  13516. /**
  13517. * 授权状态 0:未判断,1:已授权
  13518. */
  13519. WXGamePlatform.accreditstate = 0;
  13520. /**
  13521. * 当天分享次数
  13522. */
  13523. WXGamePlatform.dayShareNum = 0;
  13524. /**
  13525. * 当天看视频次数
  13526. */
  13527. WXGamePlatform.dayVideoNum = 0;
  13528. /**
  13529. * 判断分享是否成功时间间隔
  13530. */
  13531. WXGamePlatform.ShareTime = 0;
  13532. /**
  13533. * 每日最大看视频次数(成功累加一次)
  13534. */
  13535. WXGamePlatform.VideoNum = 0;
  13536. /**
  13537. * 看视频冷却时间
  13538. */
  13539. WXGamePlatform.VideoTime = 0;
  13540. /**
  13541. * 8好位cpa可弹出时间间隔(秒)
  13542. */
  13543. WXGamePlatform.jiliweitime = 100;
  13544. /**
  13545. * 分享几次切换到视频
  13546. */
  13547. WXGamePlatform.SharetoVideo = 1;
  13548. /**
  13549. * 视频几次切换到分享
  13550. */
  13551. WXGamePlatform.VideotoShare = 1;
  13552. /**
  13553. * 分享数据容器
  13554. */
  13555. WXGamePlatform.ShareDict = {};
  13556. /**
  13557. * 用户来源id
  13558. */
  13559. WXGamePlatform.fromscene = 0;
  13560. WXGamePlatform.nowShareindex = 0;
  13561. WXGamePlatform.callbackfailstate = 0;
  13562. WXGamePlatform.lastVideoTime = 0;
  13563. /**
  13564. * 视频是否在播放中
  13565. */
  13566. WXGamePlatform.videoplaying = false;
  13567. WXGamePlatform.istongjiVideoNum = true;
  13568. return WXGamePlatform;
  13569. }());
  13570. exports.WXGamePlatform = WXGamePlatform;
  13571. },{"../Control/AudioControl":18,"../Control/DateControl":20,"../Control/LocalDataControl":23,"../Data/UserDataInfo":35,"../Global":41,"../WXSDK/WECHATEVENT":80,"../utils/DispatcherManager":85,"../utils/GameUtils":87,"../utils/GlobalTip":88}],82:[function(require,module,exports){
  13572. "use strict";
  13573. Object.defineProperty(exports, "__esModule", { value: true });
  13574. var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
  13575. var PlatfromType_1 = require("./PlatfromType");
  13576. var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
  13577. var Global_1 = require("../Global");
  13578. var DispatcherManager_1 = require("../utils/DispatcherManager");
  13579. var TimesTamper_1 = require("../Time/TimesTamper");
  13580. var DateControl_1 = require("../Control/DateControl");
  13581. var AudioControl_1 = require("../Control/AudioControl");
  13582. /*
  13583. * name;
  13584. */
  13585. var pingtaiutils = /** @class */ (function () {
  13586. function pingtaiutils() {
  13587. this._isenable = false;
  13588. pingtaiutils.ins = this;
  13589. }
  13590. Object.defineProperty(pingtaiutils, "Instance", {
  13591. get: function () {
  13592. if (pingtaiutils.ins == null) {
  13593. return new pingtaiutils();
  13594. }
  13595. return pingtaiutils.ins;
  13596. },
  13597. enumerable: true,
  13598. configurable: true
  13599. });
  13600. /**
  13601. * 初始化平台
  13602. */
  13603. pingtaiutils.prototype.initPlatfrom = function () {
  13604. if (Laya.Browser.window.tt) {
  13605. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.tt;
  13606. }
  13607. else if (Laya.Browser.window.wx) //微信小游戏
  13608. {
  13609. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.wx;
  13610. }
  13611. else {
  13612. Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.pc;
  13613. }
  13614. };
  13615. pingtaiutils.prototype.init = function () {
  13616. this.initPlatfrom();
  13617. // switch( Global.nowplatfrom )
  13618. // {
  13619. // case PlatfromType.wx:
  13620. // WXGamePlatform.Instance.init();
  13621. // break;
  13622. // case PlatfromType.qq:
  13623. // break;
  13624. // default:
  13625. // break;
  13626. // }
  13627. // this.onShow( this,this.showcallback );
  13628. // this.onHide(this,this.hidecallback);
  13629. };
  13630. pingtaiutils.prototype.initData = function () {
  13631. DateControl_1.DateControl.Instance.SetSelf();
  13632. switch (Global_1.Global.nowplatfrom) {
  13633. case PlatfromType_1.PlatfromType.wx:
  13634. WXGamePlatform_1.WXGamePlatform.Instance.initData();
  13635. break;
  13636. default:
  13637. break;
  13638. }
  13639. };
  13640. /**
  13641. * 合违规判断 true:合规,false:违规
  13642. */
  13643. pingtaiutils.checkEnable = function () {
  13644. if (pingtaiutils.islegal == 1) {
  13645. return true;
  13646. }
  13647. return false;
  13648. };
  13649. pingtaiutils.prototype.login = function (callobj, succeedcallback, progressCallback, failcallback) {
  13650. if (callobj === void 0) { callobj = null; }
  13651. if (succeedcallback === void 0) { succeedcallback = null; }
  13652. if (progressCallback === void 0) { progressCallback = null; }
  13653. if (failcallback === void 0) { failcallback = null; }
  13654. fairygui.GRoot.inst.showModalWait();
  13655. this._logincallobj = callobj;
  13656. this._loginsucceedcallback = succeedcallback;
  13657. switch (Global_1.Global.nowplatfrom) {
  13658. case PlatfromType_1.PlatfromType.wx:
  13659. WXGamePlatform_1.WXGamePlatform.Instance.createUserAndLogin(this, this.loginSucceed, this.loginprogressCallback, this.loginfailcallback);
  13660. break;
  13661. default:
  13662. this.loginSucceed(null);
  13663. break;
  13664. }
  13665. };
  13666. pingtaiutils.prototype.loginprogressCallback = function (value) {
  13667. };
  13668. pingtaiutils.prototype.loginSucceed = function (data) {
  13669. fairygui.GRoot.inst.closeModalWait();
  13670. };
  13671. pingtaiutils.prototype.loginfailcallback = function () {
  13672. };
  13673. pingtaiutils.prototype.onShow = function (callobj, succeedcallback, failCallback) {
  13674. if (callobj === void 0) { callobj = null; }
  13675. if (succeedcallback === void 0) { succeedcallback = null; }
  13676. if (failCallback === void 0) { failCallback = null; }
  13677. switch (Global_1.Global.nowplatfrom) {
  13678. case PlatfromType_1.PlatfromType.wx:
  13679. WXGamePlatform_1.WXGamePlatform.Instance.onShow(callobj, succeedcallback, failCallback);
  13680. break;
  13681. case PlatfromType_1.PlatfromType.qq:
  13682. break;
  13683. }
  13684. };
  13685. pingtaiutils.prototype.showcallback = function () {
  13686. Laya.timer.clear(this, this.againplaybgSound);
  13687. Laya.timer.once(500, this, this.againplaybgSound);
  13688. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onshow);
  13689. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
  13690. var fromscene = pingtaiutils.fromscene();
  13691. if (fromscene == 1089 || fromscene == 1131) {
  13692. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_fromscorfk);
  13693. }
  13694. };
  13695. pingtaiutils.prototype.againplaybgSound = function () {
  13696. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
  13697. };
  13698. pingtaiutils.prototype.onHide = function (callobj, succeedcallback) {
  13699. if (callobj === void 0) { callobj = null; }
  13700. if (succeedcallback === void 0) { succeedcallback = null; }
  13701. switch (Global_1.Global.nowplatfrom) {
  13702. case PlatfromType_1.PlatfromType.wx:
  13703. WXGamePlatform_1.WXGamePlatform.Instance.onHide(callobj, succeedcallback);
  13704. break;
  13705. case PlatfromType_1.PlatfromType.qq:
  13706. break;
  13707. }
  13708. };
  13709. pingtaiutils.prototype.hidecallback = function () {
  13710. TimesTamper_1.TimesTamper.Instance.sendonlineTongji();
  13711. AudioControl_1.AudioControl.Instance.ClearAllSOUND();
  13712. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onhide);
  13713. DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
  13714. };
  13715. Object.defineProperty(pingtaiutils.prototype, "isshow", {
  13716. /**
  13717. * 当前游戏是否在显示中
  13718. */
  13719. get: function () {
  13720. var bo = true;
  13721. switch (Global_1.Global.nowplatfrom) {
  13722. case PlatfromType_1.PlatfromType.wx:
  13723. if (WXGamePlatform_1.WXGamePlatform.isShowing) {
  13724. bo = true;
  13725. }
  13726. bo = false;
  13727. break;
  13728. }
  13729. return bo;
  13730. },
  13731. enumerable: true,
  13732. configurable: true
  13733. });
  13734. /**
  13735. * 分包加载
  13736. */
  13737. pingtaiutils.prototype.loadSubpackage = function (typename, callobj, callback, callprogress, failcallback) {
  13738. if (failcallback === void 0) { failcallback = null; }
  13739. switch (Global_1.Global.nowplatfrom) {
  13740. case PlatfromType_1.PlatfromType.wx:
  13741. WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage(typename, callobj, callback, callprogress, failcallback);
  13742. break;
  13743. default:
  13744. if (callobj && callback) {
  13745. callback.call(callobj);
  13746. }
  13747. break;
  13748. }
  13749. };
  13750. /**
  13751. * 获取是否已经授权
  13752. * @param callobj
  13753. * @param callback
  13754. */
  13755. pingtaiutils.prototype.isaccredit = function (callobj, accreditCallback) {
  13756. switch (Global_1.Global.nowplatfrom) {
  13757. case PlatfromType_1.PlatfromType.wx:
  13758. WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
  13759. break;
  13760. case PlatfromType_1.PlatfromType.qq:
  13761. WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
  13762. break;
  13763. default:
  13764. if (accreditCallback && callobj) {
  13765. accreditCallback.call(callobj, true);
  13766. }
  13767. break;
  13768. }
  13769. };
  13770. /**
  13771. * 拿角色信息授权
  13772. */
  13773. pingtaiutils.prototype.createaccredit = function (callobj, callback, failcallback) {
  13774. switch (Global_1.Global.nowplatfrom) {
  13775. case PlatfromType_1.PlatfromType.wx:
  13776. WXGamePlatform_1.WXGamePlatform.Instance.createUserInfoButton(callobj, callback, failcallback);
  13777. break;
  13778. }
  13779. };
  13780. pingtaiutils.prototype.closeuserinfoButton = function () {
  13781. switch (Global_1.Global.nowplatfrom) {
  13782. case PlatfromType_1.PlatfromType.wx:
  13783. WXGamePlatform_1.WXGamePlatform.Instance.closeuserinfobUtton();
  13784. break;
  13785. }
  13786. };
  13787. /**
  13788. * 退出游戏
  13789. */
  13790. pingtaiutils.prototype.exitGame = function () {
  13791. switch (Global_1.Global.nowplatfrom) {
  13792. case PlatfromType_1.PlatfromType.wx:
  13793. WXGamePlatform_1.WXGamePlatform.Instance.exitGame();
  13794. break;
  13795. }
  13796. };
  13797. /**
  13798. * 打开客服对话框
  13799. */
  13800. pingtaiutils.prototype.openCustomerService = function () {
  13801. switch (Global_1.Global.nowplatfrom) {
  13802. case PlatfromType_1.PlatfromType.wx:
  13803. WXGamePlatform_1.WXGamePlatform.Instance.openCustomerService();
  13804. break;
  13805. }
  13806. };
  13807. /**
  13808. * 短震动
  13809. */
  13810. pingtaiutils.prototype.vibrateShort = function () {
  13811. switch (Global_1.Global.nowplatfrom) {
  13812. case PlatfromType_1.PlatfromType.wx:
  13813. WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
  13814. break;
  13815. default:
  13816. break;
  13817. }
  13818. };
  13819. pingtaiutils.isCanVideo = function () {
  13820. var bo = false;
  13821. if (pingtaiutils.checkEnable()) {
  13822. bo = true;
  13823. }
  13824. else {
  13825. switch (Global_1.Global.nowplatfrom) {
  13826. case PlatfromType_1.PlatfromType.wx:
  13827. bo = WXGamePlatform_1.WXGamePlatform.Instance.isCanVideo();
  13828. break;
  13829. default:
  13830. bo = true;
  13831. break;
  13832. }
  13833. }
  13834. return bo;
  13835. };
  13836. pingtaiutils.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
  13837. if (callobj === void 0) { callobj = null; }
  13838. if (succeedCallback === void 0) { succeedCallback = null; }
  13839. if (failCallback === void 0) { failCallback = null; }
  13840. switch (Global_1.Global.nowplatfrom) {
  13841. case PlatfromType_1.PlatfromType.wx:
  13842. WXGamePlatform_1.WXGamePlatform.Instance.startShareApp(key, callobj, succeedCallback, failCallback);
  13843. break;
  13844. default:
  13845. if (callobj && succeedCallback) {
  13846. succeedCallback.call(callobj);
  13847. }
  13848. break;
  13849. }
  13850. };
  13851. pingtaiutils.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
  13852. if (callobj === void 0) { callobj = null; }
  13853. if (succeedcallback === void 0) { succeedcallback = null; }
  13854. if (failCallback === void 0) { failCallback = null; }
  13855. if (istongjiNum === void 0) { istongjiNum = true; }
  13856. switch (Global_1.Global.nowplatfrom) {
  13857. case PlatfromType_1.PlatfromType.wx:
  13858. WXGamePlatform_1.WXGamePlatform.Instance.playVideo(key, callobj, succeedcallback, failCallback, istongjiNum);
  13859. break;
  13860. default:
  13861. if (callobj && succeedcallback) {
  13862. succeedcallback.call(callobj);
  13863. }
  13864. break;
  13865. }
  13866. };
  13867. pingtaiutils.prototype.createBanner = function (bannertype, style) {
  13868. if (style === void 0) { style = { x: 0, y: 0, scale: 1 }; }
  13869. switch (Global_1.Global.nowplatfrom) {
  13870. case PlatfromType_1.PlatfromType.wx:
  13871. WXGamePlatform_1.WXGamePlatform.Instance.createBanner(bannertype, style);
  13872. break;
  13873. default:
  13874. break;
  13875. }
  13876. };
  13877. pingtaiutils.prototype.hideBanner = function (bannertype) {
  13878. switch (Global_1.Global.nowplatfrom) {
  13879. case PlatfromType_1.PlatfromType.wx:
  13880. WXGamePlatform_1.WXGamePlatform.Instance.hideBanner(bannertype);
  13881. break;
  13882. default:
  13883. break;
  13884. }
  13885. };
  13886. /**
  13887. * 数据上传(用于排行榜数据显示)
  13888. * @param param1 上报数据1
  13889. * @param param2 上报数据2
  13890. */
  13891. pingtaiutils.prototype.storeToCloud = function (param1, param2) {
  13892. switch (Global_1.Global.nowplatfrom) {
  13893. case PlatfromType_1.PlatfromType.wx:
  13894. WXGamePlatform_1.WXGamePlatform.Instance.storeToCloud(param1, param2);
  13895. break;
  13896. default:
  13897. break;
  13898. }
  13899. };
  13900. /**
  13901. * 打开好友排行榜
  13902. */
  13903. pingtaiutils.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
  13904. if (parent === void 0) { parent = null; }
  13905. if (data === void 0) { data = null; }
  13906. switch (Global_1.Global.nowplatfrom) {
  13907. case PlatfromType_1.PlatfromType.wx:
  13908. WXGamePlatform_1.WXGamePlatform.Instance.openFriendRank(type, viewType, rect, parent, data);
  13909. break;
  13910. default:
  13911. break;
  13912. }
  13913. };
  13914. /**
  13915. * 排行榜打开状态时候,切换显示类型
  13916. * @param type
  13917. */
  13918. pingtaiutils.prototype.changeFriendRank = function (type) {
  13919. switch (Global_1.Global.nowplatfrom) {
  13920. case PlatfromType_1.PlatfromType.wx:
  13921. WXGamePlatform_1.WXGamePlatform.Instance.changeFriendRank(type);
  13922. break;
  13923. default:
  13924. break;
  13925. }
  13926. };
  13927. /**
  13928. * 排行榜上一页
  13929. */
  13930. pingtaiutils.prototype.prePageRank = function () {
  13931. switch (Global_1.Global.nowplatfrom) {
  13932. case PlatfromType_1.PlatfromType.wx:
  13933. WXGamePlatform_1.WXGamePlatform.Instance.prePageRank();
  13934. break;
  13935. default:
  13936. break;
  13937. }
  13938. };
  13939. /**
  13940. * 排行榜下一页
  13941. */
  13942. pingtaiutils.prototype.nextPageRank = function () {
  13943. switch (Global_1.Global.nowplatfrom) {
  13944. case PlatfromType_1.PlatfromType.wx:
  13945. WXGamePlatform_1.WXGamePlatform.Instance.nextPageRank();
  13946. break;
  13947. default:
  13948. break;
  13949. }
  13950. };
  13951. /**
  13952. * 关闭好友排行榜
  13953. */
  13954. pingtaiutils.prototype.closeFriendRank = function (viewType) {
  13955. switch (Global_1.Global.nowplatfrom) {
  13956. case PlatfromType_1.PlatfromType.wx:
  13957. WXGamePlatform_1.WXGamePlatform.Instance.closeFriendRank(viewType);
  13958. break;
  13959. default:
  13960. break;
  13961. }
  13962. };
  13963. pingtaiutils.prototype.lockVideoLeftTime = function () {
  13964. var time = 0;
  13965. switch (Global_1.Global.nowplatfrom) {
  13966. case PlatfromType_1.PlatfromType.wx:
  13967. time = WXGamePlatform_1.WXGamePlatform.Instance.lockVideoLeftTime();
  13968. break;
  13969. default:
  13970. break;
  13971. }
  13972. return time;
  13973. };
  13974. pingtaiutils.dayVideoNums = function () {
  13975. var time = 0;
  13976. switch (Global_1.Global.nowplatfrom) {
  13977. case PlatfromType_1.PlatfromType.wx:
  13978. time = WXGamePlatform_1.WXGamePlatform.dayVideoNum;
  13979. break;
  13980. default:
  13981. break;
  13982. }
  13983. return time;
  13984. };
  13985. /**
  13986. * 1089:添加到我的小程序,1131:添加到浮窗
  13987. */
  13988. pingtaiutils.fromscene = function () {
  13989. var scene = 0;
  13990. switch (Global_1.Global.nowplatfrom) {
  13991. case PlatfromType_1.PlatfromType.wx:
  13992. scene = WXGamePlatform_1.WXGamePlatform.fromscene;
  13993. break;
  13994. default:
  13995. break;
  13996. }
  13997. return scene;
  13998. };
  13999. pingtaiutils.createGameClubButton = function (style, icon) {
  14000. if (icon === void 0) { icon = "green"; }
  14001. switch (Global_1.Global.nowplatfrom) {
  14002. case PlatfromType_1.PlatfromType.wx:
  14003. WXGamePlatform_1.WXGamePlatform.Instance.createGameClubButton(style, icon);
  14004. break;
  14005. default:
  14006. break;
  14007. }
  14008. };
  14009. /**
  14010. * 是否合规
  14011. */
  14012. pingtaiutils.islegal = 0;
  14013. return pingtaiutils;
  14014. }());
  14015. exports.pingtaiutils = pingtaiutils;
  14016. },{"../Control/AudioControl":18,"../Control/DateControl":20,"../Global":41,"../Time/TimesTamper":60,"../WXSDK/WECHATEVENT":80,"../WXSDK/WXGamePlatform":81,"../utils/DispatcherManager":85,"./PlatfromType":74}],83:[function(require,module,exports){
  14017. "use strict";
  14018. Object.defineProperty(exports, "__esModule", { value: true });
  14019. var PlayerAccount_1 = require("./PlayerAccount");
  14020. // import { Account } from "../Account/Account";
  14021. var ttshare = /** @class */ (function () {
  14022. function ttshare() {
  14023. }
  14024. ttshare.share = function () {
  14025. Laya.Browser.window.tt.shareAppMessage({
  14026. channel: "article",
  14027. templateId: "ocgf9b46464b9anlff",
  14028. title: "冲啊冲",
  14029. imageUrl: "jiazai/123.png",
  14030. query: "res.query",
  14031. success: function () { },
  14032. fail: function () { },
  14033. });
  14034. };
  14035. return ttshare;
  14036. }());
  14037. exports.ttshare = ttshare;
  14038. var ttad = /** @class */ (function () {
  14039. function ttad() {
  14040. ttad.instance = this;
  14041. }
  14042. Object.defineProperty(ttad, "Instance", {
  14043. get: function () {
  14044. if (ttad.instance) {
  14045. return ttad.instance;
  14046. }
  14047. else {
  14048. return new ttad();
  14049. }
  14050. },
  14051. enumerable: true,
  14052. configurable: true
  14053. });
  14054. ttad.InitAD = function () {
  14055. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
  14056. return;
  14057. ttad.bannerAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId : ttad.bannerAdUnitId;
  14058. console.log("bannerAdUnitId", ttad.bannerAdUnitId);
  14059. ttad.videlAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId : ttad.videlAdUnitId;
  14060. console.log("videlAdUnitId", ttad.videlAdUnitId);
  14061. ttad.videoAd = Laya.Browser.window.tt.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
  14062. ttad.videoAd.onClose(function (res) {
  14063. if (res.isEnded) {
  14064. if (ttad.closecallback) {
  14065. ttad.closecallback(true);
  14066. }
  14067. }
  14068. else {
  14069. if (ttad.closecallback) {
  14070. ttad.closecallback(false);
  14071. }
  14072. }
  14073. });
  14074. };
  14075. ttad.ShowVideo = function (_cb) {
  14076. var _this = this;
  14077. if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
  14078. return;
  14079. console.log("show video");
  14080. ttad.closecallback = _cb;
  14081. ttad.videoAd.show().then(function () {
  14082. console.log("广告显示成功");
  14083. }).catch(function (err) {
  14084. // ttad.ShowTxt("视频正在加载中");
  14085. console.log("广告组件出现问题", err);
  14086. // 可以手动加载一次
  14087. Laya.timer.once(200, _this, function () {
  14088. ttad.videoAd.load().then(function () {
  14089. console.log("手动加载成功");
  14090. // 加载成功后需要再显示广告
  14091. return ttad.videoAd.show();
  14092. });
  14093. });
  14094. });
  14095. };
  14096. ttad.Showbanner = function () {
  14097. if (!Laya.Browser.onMobile)
  14098. return;
  14099. console.log("show banner");
  14100. ttad.canshow = true;
  14101. var infor = Laya.Browser.window.tt.getSystemInfoSync();
  14102. var targetBannerAdWidth = 200;
  14103. if (ttad.bannerAd)
  14104. ttad.bannerAd.destroy();
  14105. Laya.timer.once(200, this, function () {
  14106. ttad.bannerAd = Laya.Browser.window.tt.createBannerAd({
  14107. adUnitId: ttad.bannerAdUnitId,
  14108. style: {
  14109. width: targetBannerAdWidth,
  14110. top: infor.windowHeight - (targetBannerAdWidth / 16) * 9 // 根据系统约定尺寸计算出广告高度
  14111. }
  14112. });
  14113. ttad.bannerAd.onLoad(function () {
  14114. if (ttad.canshow) {
  14115. ttad.bannerAd.show().then(function () {
  14116. console.log("广告显示成功");
  14117. }).catch(function (err) {
  14118. console.log("广告组件出现问题", err);
  14119. });
  14120. }
  14121. });
  14122. ttad.bannerAd.onResize(function (size) {
  14123. console.log(size.width, size.height);
  14124. ttad.bannerAd.style.top = infor.windowHeight - size.height;
  14125. ttad.bannerAd.style.left = (infor.windowWidth - size.width) / 2;
  14126. });
  14127. });
  14128. };
  14129. ttad.Clear = function () {
  14130. ttad.canshow = false;
  14131. ttad.closecallback = null;
  14132. if (ttad.bannerAd)
  14133. ttad.bannerAd.hide();
  14134. };
  14135. /**抖音更多游戏方法*/
  14136. ttad.CreateMoreGameBtn = function (fun) {
  14137. if (fun === void 0) { fun = null; }
  14138. if (!Laya.Browser.onMobile)
  14139. return;
  14140. if (Laya.Browser.onIOS) {
  14141. ttad.ShowTxt("暂未开放");
  14142. return;
  14143. }
  14144. Laya.Browser.window.tt.showMoreGamesModal({
  14145. appLaunchOptions: [
  14146. {
  14147. appId: "tt66d0106df9eaa083",
  14148. query: "foo=bar&baz=qux",
  14149. extraData: {}
  14150. }
  14151. ],
  14152. success: function (res) {
  14153. console.log("success", res.errMsg);
  14154. if (fun) {
  14155. fun();
  14156. }
  14157. },
  14158. fail: function (res) {
  14159. console.log("fail", res.errMsg);
  14160. }
  14161. });
  14162. // 监听弹窗关闭
  14163. // this.onMoreGamesModalClose();
  14164. };
  14165. /*监听弹窗关闭*/
  14166. // static onMoreGamesModalClose()
  14167. // {
  14168. // if(!Laya.Browser.onMobile)return;
  14169. // if( Laya.Browser.onIOS)
  14170. // {
  14171. // ttad.ShowTxt("暂未开放");
  14172. // return;
  14173. // }
  14174. // Laya.Browser.window.tt.onMoreGamesModalClose(function() {
  14175. // console.log("modal closed");
  14176. // if(Scene3DManager.getInstance().IsGamePasue)
  14177. // {
  14178. // EventUtils.dispatchEvent( GameEvent.continueGame );
  14179. // }
  14180. // });
  14181. // }
  14182. ttad.ShowTxt = function (text) {
  14183. if (Laya.Browser.window.tt) {
  14184. Laya.Browser.window.tt.showToast({ title: text });
  14185. }
  14186. else {
  14187. console.log(text);
  14188. }
  14189. };
  14190. ttad.videlAdUnitId = "15gfgp58pocp80hbkb";
  14191. ttad.bannerAdUnitId = "dsk7cohbl2f4jpjtq5";
  14192. ttad.canshow = true;
  14193. return ttad;
  14194. }());
  14195. exports.ttad = ttad;
  14196. },{"./PlayerAccount":75}],84:[function(require,module,exports){
  14197. "use strict";
  14198. Object.defineProperty(exports, "__esModule", { value: true });
  14199. /**
  14200. * 全局侦听类及消息处理
  14201. */
  14202. var DisPatcherOn = /** @class */ (function (_super) {
  14203. __extends(DisPatcherOn, _super);
  14204. function DisPatcherOn() {
  14205. var _this = _super.call(this) || this;
  14206. _this.isInit = false;
  14207. DisPatcherOn.ins = _this;
  14208. if (_this.isInit) {
  14209. }
  14210. if (_this._dispatcher == null) {
  14211. _this._dispatcher = new Laya.EventDispatcher();
  14212. _this.isInit = true;
  14213. }
  14214. return _this;
  14215. }
  14216. Object.defineProperty(DisPatcherOn, "Instance", {
  14217. get: function () {
  14218. if (DisPatcherOn.ins == null)
  14219. return new DisPatcherOn();
  14220. return DisPatcherOn.ins;
  14221. },
  14222. enumerable: true,
  14223. configurable: true
  14224. });
  14225. DisPatcherOn.prototype.addEventListener = function (type, listener, thisObject, useCapture, priority) {
  14226. if (useCapture === void 0) { useCapture = false; }
  14227. if (priority === void 0) { priority = 0; }
  14228. this._dispatcher.on(type, thisObject, listener);
  14229. };
  14230. DisPatcherOn.prototype.removeEventListener = function (type, listener, thisObject, useCapture) {
  14231. if (useCapture === void 0) { useCapture = false; }
  14232. this._dispatcher.off(type, thisObject, listener);
  14233. };
  14234. DisPatcherOn.prototype.hasEventListener = function (type) {
  14235. return this._dispatcher.hasListener(type);
  14236. };
  14237. DisPatcherOn.prototype.dispatchEvent = function (type, data) {
  14238. return this._dispatcher.event(type, data);
  14239. };
  14240. return DisPatcherOn;
  14241. }(Laya.EventDispatcher));
  14242. exports.DisPatcherOn = DisPatcherOn;
  14243. },{}],85:[function(require,module,exports){
  14244. "use strict";
  14245. Object.defineProperty(exports, "__esModule", { value: true });
  14246. var LEvent_1 = require("./LEvent");
  14247. var DisPatcherOn_1 = require("./DisPatcherOn");
  14248. /*
  14249. * name;
  14250. */
  14251. var DispatcherManager = /** @class */ (function () {
  14252. function DispatcherManager() {
  14253. }
  14254. DispatcherManager.init = function () {
  14255. DisPatcherOn_1.DisPatcherOn.Instance;
  14256. };
  14257. //新建事件
  14258. DispatcherManager.Event = function (type, obj, bubbles, cancelable) {
  14259. if (obj === void 0) { obj = null; }
  14260. if (bubbles === void 0) { bubbles = false; }
  14261. if (cancelable === void 0) { cancelable = false; }
  14262. return new LEvent_1.LEvent(type, obj, bubbles, cancelable);
  14263. };
  14264. //派发事件
  14265. DispatcherManager.dispatchEvent = function (type, obj, bubbles, cancelable) {
  14266. if (obj === void 0) { obj = null; }
  14267. if (bubbles === void 0) { bubbles = false; }
  14268. if (cancelable === void 0) { cancelable = false; }
  14269. DisPatcherOn_1.DisPatcherOn.Instance.dispatchEvent(type, obj);
  14270. };
  14271. //监听事件
  14272. DispatcherManager.addEventListener = function (type, thisObject, listener, useCapture, priority) {
  14273. if (useCapture === void 0) { useCapture = false; }
  14274. if (priority === void 0) { priority = 0; }
  14275. DisPatcherOn_1.DisPatcherOn.Instance.addEventListener(type, listener, thisObject, useCapture, priority);
  14276. };
  14277. DispatcherManager.hasEventListener = function (type) {
  14278. return DisPatcherOn_1.DisPatcherOn.Instance.hasEventListener(type);
  14279. };
  14280. DispatcherManager.removeEventListener = function (type, thisObject, listener, useCapture, priority) {
  14281. if (useCapture === void 0) { useCapture = false; }
  14282. if (priority === void 0) { priority = 0; }
  14283. DisPatcherOn_1.DisPatcherOn.Instance.removeEventListener(type, listener, thisObject);
  14284. };
  14285. return DispatcherManager;
  14286. }());
  14287. exports.DispatcherManager = DispatcherManager;
  14288. },{"./DisPatcherOn":84,"./LEvent":89}],86:[function(require,module,exports){
  14289. "use strict";
  14290. Object.defineProperty(exports, "__esModule", { value: true });
  14291. var Sprite = Laya.Sprite;
  14292. var GameState = /** @class */ (function () {
  14293. function GameState() {
  14294. /*********************************************************************** */
  14295. this.btnArr = ["res/button.png", "res/button.png", "res/button.png"];
  14296. this.nameArr = ["canvas截图", "sprite截图", "清理"];
  14297. }
  14298. GameState.prototype.drawSomething = function () {
  14299. this.sp = new Sprite();
  14300. Laya.stage.addChild(this.sp);
  14301. //画线
  14302. this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
  14303. //画连续直线
  14304. this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5);
  14305. //画曲线
  14306. this.sp.graphics.drawCurves(352, 58, [0, 0, 19, -100, 39, 0, 58, 100, 78, 0, 97, -100, 117, 0, 136, 100, 156, 0], "#ff0000", 5);
  14307. //画矩形
  14308. this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00");
  14309. //画多边形
  14310. this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00");
  14311. //画三角形
  14312. this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00");
  14313. //画圆
  14314. this.sp.graphics.drawCircle(98, 332, 50, "#00ffff");
  14315. //画扇形
  14316. this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff");
  14317. //绘制圆角矩形,自定义路径
  14318. this.sp.graphics.drawPath(400, 310, [["moveTo", 5, 0], ["lineTo", 105, 0], ["arcTo", 110, 0, 110, 5, 5], ["lineTo", 110, 55], ["arcTo", 110, 60, 105, 60, 5], ["lineTo", 5, 60], ["arcTo", 0, 60, 0, 55, 5], ["lineTo", 0, 5], ["arcTo", 0, 0, 5, 0, 5], ["closePath"]], { fillStyle: "#00ffff" });
  14319. };
  14320. GameState.prototype._onclick = function (e) {
  14321. switch (e.target.name) {
  14322. case this.nameArr[0]:
  14323. var base64Url = this._canvas.toDataURL("image/png", 1);
  14324. this.drawImage.skin = base64Url;
  14325. break;
  14326. case this.nameArr[1]:
  14327. var text = Laya.stage.drawToTexture(Laya.Browser.clientWidth, Laya.Browser.clientHeight, 0, 0);
  14328. this.drawSp.graphics.drawTexture(text, 0, 0, this.drawSp.width, this.drawSp.height);
  14329. break;
  14330. case this.nameArr[2]:
  14331. this.drawImage.skin = null;
  14332. this.drawSp.graphics.clear();
  14333. this.drawSp.graphics.drawRect(0, 0, this.drawSp.width, this.drawSp.height, "#ff0000");
  14334. break;
  14335. }
  14336. };
  14337. GameState.removeselect = "GameState_removeselect";
  14338. GameState.npcend = "GameState_npcendGame";
  14339. /**
  14340. * 通关成功
  14341. */
  14342. GameState.win = "GameState_winGame";
  14343. /**
  14344. * 通关失败
  14345. */
  14346. GameState.fail = "GameState_failGame";
  14347. GameState.jump = "GameState_jumpgame";
  14348. /**
  14349. * 暂停游戏
  14350. */
  14351. GameState.stop = "GameState_stopGame";
  14352. /**
  14353. * 回到主界面
  14354. */
  14355. GameState.returnMainView = "returnMainView";
  14356. GameState.updateSKinView = "GameState_updateSKinView";
  14357. /*********************************************************************** */
  14358. /**
  14359. * 开始游戏
  14360. */
  14361. GameState.start = "GameState_startGame";
  14362. /**
  14363. * 结束游戏
  14364. */
  14365. GameState.end = "GameState_endGame";
  14366. /**失败 */
  14367. GameState.lose = "GameState_loseGame";
  14368. /**
  14369. * 复活
  14370. */
  14371. GameState.revive = "GameState_reviveGame";
  14372. /**是否复活 */
  14373. GameState.isdie = false;
  14374. /**允许复活次数 */
  14375. GameState.fuhuocishu = 1;
  14376. /**是否已经发布过录屏 */
  14377. GameState.recordscree = false;
  14378. /**游戏次数*/
  14379. GameState.GameNum = 0;
  14380. return GameState;
  14381. }());
  14382. exports.GameState = GameState;
  14383. },{}],87:[function(require,module,exports){
  14384. "use strict";
  14385. Object.defineProperty(exports, "__esModule", { value: true });
  14386. /*
  14387. * 公共接口
  14388. */
  14389. var GameUtils;
  14390. (function (GameUtils) {
  14391. /**
  14392. * 随机函数(返回整型)
  14393. */
  14394. function randRangeint(min, max) {
  14395. var value = Math.floor(Math.random() * (max - min + 1)) + min;
  14396. if (value > max) {
  14397. value = max;
  14398. }
  14399. return value;
  14400. }
  14401. GameUtils.randRangeint = randRangeint;
  14402. /**
  14403. * 随机函数( 不取整 )
  14404. */
  14405. function randRangefloat(min, max) {
  14406. var value = Math.random() * (max - min + 1) + min;
  14407. if (value > max) {
  14408. value = max;
  14409. }
  14410. return value;
  14411. }
  14412. GameUtils.randRangefloat = randRangefloat;
  14413. function getTexbyPkgAndName(pkgname, texname) {
  14414. var uipackage = fairygui.UIPackage.getByName(pkgname);
  14415. if (uipackage) {
  14416. return uipackage.getItemAssetByName(texname);
  14417. }
  14418. return null;
  14419. }
  14420. GameUtils.getTexbyPkgAndName = getTexbyPkgAndName;
  14421. /**
  14422. * 切割分号变成Point对象
  14423. * @param str
  14424. */
  14425. function cutfenhaoPoint(str) {
  14426. var arr = str.split(";");
  14427. return new Laya.Point(Number(arr[0]), Number(arr[1]));
  14428. }
  14429. GameUtils.cutfenhaoPoint = cutfenhaoPoint;
  14430. /**
  14431. * 切割分号变成数据(number)
  14432. */
  14433. function cutfenhaotoArrnum(str) {
  14434. var numArr = [];
  14435. if (str == "") {
  14436. return numArr;
  14437. }
  14438. var arr = str.split(";");
  14439. var i = 0;
  14440. for (i; i < arr.length; i++) {
  14441. numArr.push(Number(arr[i]));
  14442. }
  14443. return numArr;
  14444. }
  14445. GameUtils.cutfenhaotoArrnum = cutfenhaotoArrnum;
  14446. /**
  14447. * 切割分号变成数据(string)
  14448. */
  14449. function cutfenhaotoArrstr(str) {
  14450. return str.split(";");
  14451. }
  14452. GameUtils.cutfenhaotoArrstr = cutfenhaotoArrstr;
  14453. /**
  14454. * 切割分号变成数据( { key:1,value:1 } )
  14455. */
  14456. function cutfenhaotoObj(str) {
  14457. var obj = {};
  14458. var arr = str.split(";");
  14459. obj.key = arr[0];
  14460. obj.value = arr[1];
  14461. return obj;
  14462. }
  14463. GameUtils.cutfenhaotoObj = cutfenhaotoObj;
  14464. /**切割str*/
  14465. function cutstrtoArr(str) {
  14466. var arr = str.split("|");
  14467. return arr;
  14468. }
  14469. GameUtils.cutstrtoArr = cutstrtoArr;
  14470. /**切割str( 1:1|1:1 ) to Array<{ key:1,value:1 }> */
  14471. function cutstrtoArr1(str) {
  14472. var reslutArr = [];
  14473. var arr = str.split("|");
  14474. var i = 0;
  14475. for (i = 0; i < arr.length; i++) {
  14476. var itemarr = arr[i].split(";");
  14477. reslutArr.push({ key: itemarr[0], value: itemarr[1] });
  14478. }
  14479. return reslutArr;
  14480. }
  14481. GameUtils.cutstrtoArr1 = cutstrtoArr1;
  14482. function cutstrtoObj(str) {
  14483. var resultobj = {};
  14484. var arr = str.split("|");
  14485. var i = 0;
  14486. for (i = 0; i < arr.length; i++) {
  14487. var itemarr = arr[i].split(";");
  14488. resultobj[itemarr[0]] = itemarr[1];
  14489. }
  14490. return resultobj;
  14491. }
  14492. GameUtils.cutstrtoObj = cutstrtoObj;
  14493. function compareVersion(v1, v2) {
  14494. v1 = v1.split('.');
  14495. v2 = v2.split('.');
  14496. var len = Math.max(v1.length, v2.length);
  14497. while (v1.length < len) {
  14498. v1.push('0');
  14499. }
  14500. while (v2.length < len) {
  14501. v2.push('0');
  14502. }
  14503. for (var i = 0; i < len; i++) {
  14504. var num1 = parseInt(v1[i]);
  14505. var num2 = parseInt(v2[i]);
  14506. if (num1 > num2) {
  14507. return 1;
  14508. }
  14509. else if (num1 < num2) {
  14510. return -1;
  14511. }
  14512. }
  14513. return 0;
  14514. }
  14515. GameUtils.compareVersion = compareVersion;
  14516. })(GameUtils = exports.GameUtils || (exports.GameUtils = {}));
  14517. },{}],88:[function(require,module,exports){
  14518. "use strict";
  14519. Object.defineProperty(exports, "__esModule", { value: true });
  14520. var GlobalTipPanel_1 = require("../View/GlobalTipPanel");
  14521. var LayoutControl_1 = require("../Control/LayoutControl");
  14522. var LayOUT_1 = require("../utils/LayOUT");
  14523. var DispatcherManager_1 = require("../utils/DispatcherManager");
  14524. var GameState_1 = require("../utils/GameState");
  14525. /*
  14526. * name;
  14527. */
  14528. var GlobalTip = /** @class */ (function () {
  14529. function GlobalTip() {
  14530. GlobalTip.ins = this;
  14531. }
  14532. Object.defineProperty(GlobalTip, "Instance", {
  14533. get: function () {
  14534. if (GlobalTip.ins == null) {
  14535. return new GlobalTip();
  14536. }
  14537. return GlobalTip.ins;
  14538. },
  14539. enumerable: true,
  14540. configurable: true
  14541. });
  14542. GlobalTip.prototype.initEvent = function () {
  14543. GlobalTip.isEvent = true;
  14544. DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.removeselect, this, this.addwordList);
  14545. };
  14546. GlobalTip.prototype.showWordTips = function (word) {
  14547. if (!GlobalTip.isEvent) {
  14548. GlobalTip.Instance.initEvent();
  14549. }
  14550. if (GlobalTip.showWordList.length > 0) {
  14551. var lastword = GlobalTip.showWordList[GlobalTip.showWordList.length - 1].nowword;
  14552. // if( lastword == word )
  14553. // {
  14554. // return;
  14555. // }
  14556. }
  14557. if (GlobalTip.wordList.length > 0) {
  14558. var item = GlobalTip.wordList.shift();
  14559. LayoutControl_1.LayoutControl.Instance.AddLayerByName(item, LayOUT_1.LayOUT.TIP);
  14560. GlobalTip.showWordList.push(item);
  14561. item.showWord(word);
  14562. }
  14563. else {
  14564. if (GlobalTip.showWordList.length < 10) {
  14565. var item1 = new GlobalTipPanel_1.WordTipsPanel();
  14566. LayoutControl_1.LayoutControl.Instance.AddLayerByName(item1, LayOUT_1.LayOUT.TIP);
  14567. GlobalTip.showWordList.push(item1);
  14568. item1.showWord(word);
  14569. }
  14570. else {
  14571. var item1 = GlobalTip.showWordList.shift();
  14572. item1.showWord(word);
  14573. GlobalTip.showWordList.push(item1);
  14574. }
  14575. }
  14576. };
  14577. GlobalTip.prototype.addwordList = function (item) {
  14578. if (item) {
  14579. item.removeFromParent();
  14580. var index = GlobalTip.showWordList.indexOf(item);
  14581. if (index != -1) {
  14582. GlobalTip.showWordList.splice(index, 1);
  14583. }
  14584. LayoutControl_1.LayoutControl.Instance.ClearLayerByName(LayOUT_1.LayOUT.TIP);
  14585. GlobalTip.wordList.push(item);
  14586. }
  14587. };
  14588. GlobalTip.wordList = [];
  14589. GlobalTip.showWordList = [];
  14590. GlobalTip.maxNum = 10;
  14591. GlobalTip.isEvent = false;
  14592. return GlobalTip;
  14593. }());
  14594. exports.GlobalTip = GlobalTip;
  14595. },{"../Control/LayoutControl":22,"../View/GlobalTipPanel":64,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/LayOUT":90}],89:[function(require,module,exports){
  14596. "use strict";
  14597. Object.defineProperty(exports, "__esModule", { value: true });
  14598. var LEvent = /** @class */ (function (_super) {
  14599. __extends(LEvent, _super);
  14600. function LEvent(type, obj, bubbles, cancelable) {
  14601. if (obj === void 0) { obj = null; }
  14602. if (bubbles === void 0) { bubbles = false; }
  14603. if (cancelable === void 0) { cancelable = false; }
  14604. var _this = _super.call(this) || this;
  14605. _this.CLASS_NAME = "LEvent";
  14606. if (obj) {
  14607. _this._obj = obj;
  14608. }
  14609. return _this;
  14610. }
  14611. LEvent.prototype.clone = function (obj) {
  14612. return new LEvent(this.type, obj ? obj : this._obj);
  14613. };
  14614. LEvent.prototype.toString = function () {
  14615. console.log(this.CLASS_NAME, "type", "bubbles", "cancelable");
  14616. };
  14617. Object.defineProperty(LEvent.prototype, "param", {
  14618. /**
  14619. * 传参获取
  14620. * @returns {any}
  14621. */
  14622. get: function () {
  14623. return this._obj;
  14624. },
  14625. enumerable: true,
  14626. configurable: true
  14627. });
  14628. return LEvent;
  14629. }(Laya.Event));
  14630. exports.LEvent = LEvent;
  14631. },{}],90:[function(require,module,exports){
  14632. "use strict";
  14633. Object.defineProperty(exports, "__esModule", { value: true });
  14634. var LayOUT = /** @class */ (function () {
  14635. function LayOUT() {
  14636. }
  14637. /**
  14638. * 背景层
  14639. */
  14640. LayOUT.BG = "BG";
  14641. /**
  14642. * ui层
  14643. */
  14644. LayOUT.UI = "UI";
  14645. /**
  14646. * ui层上层
  14647. */
  14648. LayOUT.UITop = "UITop";
  14649. /**
  14650. * tips层
  14651. */
  14652. LayOUT.TIP = "TIP";
  14653. /**
  14654. * 新手引导层
  14655. */
  14656. LayOUT.GUIDE = "GUIDE";
  14657. return LayOUT;
  14658. }());
  14659. exports.LayOUT = LayOUT;
  14660. },{}],91:[function(require,module,exports){
  14661. "use strict";
  14662. Object.defineProperty(exports, "__esModule", { value: true });
  14663. /*
  14664. * name;
  14665. */
  14666. var Singleton = /** @class */ (function (_super) {
  14667. __extends(Singleton, _super);
  14668. function Singleton() {
  14669. return _super.call(this) || this;
  14670. }
  14671. /**
  14672. * 获取单例类,若不存在则返回空
  14673. * @param ref 继承自Singleton的类
  14674. * @return *
  14675. */
  14676. Singleton.Instance = function (ref) {
  14677. if (ref.key == null) {
  14678. throw new Error("getinstance erro");
  14679. }
  14680. return this._dict[ref.key];
  14681. };
  14682. /**
  14683. * 获取单例类,若不存在则创建
  14684. * @param ref 继承自Singleton的类
  14685. * @return *
  14686. */
  14687. Singleton.getInstanceOrCreate = function (ref) {
  14688. if (ref.key == null) {
  14689. throw new Error("getInstanceOrCreate erro");
  14690. }
  14691. this.create(ref);
  14692. return this._dict[ref.key];
  14693. };
  14694. /**
  14695. * 创建单例类
  14696. * @param ref 继承自Singleton的类
  14697. * @return void
  14698. */
  14699. Singleton.create = function (ref) {
  14700. if (ref.key == null) {
  14701. throw new Error("create erro");
  14702. }
  14703. if (this._dict[ref.key] == null) {
  14704. this._dict[ref.key] = new ref();
  14705. }
  14706. return this._dict[ref.key];
  14707. };
  14708. /**
  14709. * 删除单例类
  14710. * @param ref 继承自Singleton的类
  14711. * @return void
  14712. */
  14713. Singleton.remove = function (ref) {
  14714. var key = ref.key;
  14715. if (this._dict[key] != null) {
  14716. this._dict[key].destory();
  14717. }
  14718. };
  14719. /**
  14720. * 销毁方法
  14721. */
  14722. Singleton.prototype.destory = function () {
  14723. };
  14724. Singleton._dict = {};
  14725. return Singleton;
  14726. }(Laya.EventDispatcher));
  14727. exports.Singleton = Singleton;
  14728. },{}],92:[function(require,module,exports){
  14729. "use strict";
  14730. Object.defineProperty(exports, "__esModule", { value: true });
  14731. var AgencySkin_1 = require("../Agency/AgencySkin");
  14732. var PanelResDic_1 = require("../PrefabControl/PanelResDic");
  14733. var GlobalTip_1 = require("../utils/GlobalTip");
  14734. var AssetPath_1 = require("../Config/AssetPath");
  14735. var MovieClip = Laya.MovieClip;
  14736. var ttad_1 = require("../WXSDK/ttad");
  14737. var SkinItem = /** @class */ (function (_super) {
  14738. __extends(SkinItem, _super);
  14739. function SkinItem() {
  14740. var _this = _super.call(this) || this;
  14741. /********************************************************** */
  14742. _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
  14743. /********************************************** */
  14744. _this.SWFPath = "res/swf/dragon.swf";
  14745. _this.MCWidth = 318;
  14746. _this.MCHeight = 406;
  14747. return _this;
  14748. }
  14749. SkinItem.prototype.getHexColorString = function () {
  14750. this.bgColorChannels.r = Math.floor(this.bgColorChannels.r);
  14751. // 绿色通道使用0
  14752. this.bgColorChannels.g = 0;
  14753. //obj.g = Math.floor(obj.g);
  14754. this.bgColorChannels.b = Math.floor(this.bgColorChannels.b);
  14755. var r = this.bgColorChannels.r.toString(16);
  14756. r = r.length == 2 ? r : "0" + r;
  14757. var g = this.bgColorChannels.g.toString(16);
  14758. g = g.length == 2 ? g : "0" + g;
  14759. var b = this.bgColorChannels.b.toString(16);
  14760. b = b.length == 2 ? b : "0" + b;
  14761. return "#" + r + g + b;
  14762. };
  14763. /********************************************************** */
  14764. SkinItem.prototype.constructFromXML = function (xml) {
  14765. _super.prototype.constructFromXML.call(this, xml);
  14766. for (var str in this._children) {
  14767. var item = this._children[str];
  14768. this[item.name] = item;
  14769. }
  14770. this.onInit();
  14771. };
  14772. SkinItem.prototype.onInit = function () {
  14773. this.initView();
  14774. this.initEvent();
  14775. };
  14776. SkinItem.prototype.initView = function () {
  14777. this.agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
  14778. this.c_state = this.getController("c_state");
  14779. };
  14780. SkinItem.prototype.initEvent = function () {
  14781. this.on(Laya.Event.CLICK, this, this.btnclick);
  14782. };
  14783. SkinItem.prototype.btnclick = function () {
  14784. if (this.pifuvo) {
  14785. switch (this.c_state.selectedIndex) {
  14786. case 0:
  14787. break;
  14788. case 1: //拥有
  14789. this.agencyskin.GainPifu(this.pifuvo);
  14790. break;
  14791. case 2: //活动获取
  14792. GlobalTip_1.GlobalTip.Instance.showWordTips("暂未开放");
  14793. break;
  14794. case 3: //看视频获取
  14795. this.playvideocallback();
  14796. // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
  14797. break;
  14798. case 4: //金币购买
  14799. this.agencyskin.GainPifu(this.pifuvo);
  14800. break;
  14801. }
  14802. }
  14803. };
  14804. SkinItem.prototype.createMovieClip = function () {
  14805. var mc = new MovieClip();
  14806. mc.load(this.SWFPath);
  14807. mc.x = (Laya.stage.width - this.MCWidth) / 2;
  14808. mc.y = (Laya.stage.height - this.MCHeight) / 2;
  14809. Laya.stage.addChild(mc);
  14810. };
  14811. /********************************************** */
  14812. SkinItem.prototype.playvideocallback = function () {
  14813. var _this = this;
  14814. ttad_1.ttad.ShowVideo((function (isLoad) {
  14815. if (isLoad) {
  14816. _this.agencyskin.GainPifu(_this.pifuvo);
  14817. }
  14818. }));
  14819. };
  14820. SkinItem.prototype.showData = function (vo) {
  14821. this.pifuvo = vo;
  14822. if (this.pifuvo) {
  14823. this.load_icon.icon = AssetPath_1.AssetPath.getroleicon(this.pifuvo.roleCFG.icon);
  14824. if (this.agencyskin.RoleData.CharacterID == this.pifuvo.roleCFG.id) {
  14825. this.c_state.selectedIndex = 0;
  14826. }
  14827. else if (this.pifuvo.state == 1) {
  14828. this.c_state.selectedIndex = 1;
  14829. }
  14830. else {
  14831. switch (this.pifuvo.roleCFG.getState) {
  14832. case 1:
  14833. this.c_state.selectedIndex = 3;
  14834. this.txt_need.text = this.pifuvo.hasnum + "/" + this.pifuvo.roleCFG.need;
  14835. break;
  14836. case 2:
  14837. this.c_state.selectedIndex = 4;
  14838. this.txt_need.text = this.pifuvo.roleCFG.need.toString();
  14839. break;
  14840. case 3:
  14841. this.c_state.selectedIndex = 2;
  14842. break;
  14843. }
  14844. }
  14845. }
  14846. };
  14847. /******************************************************** */
  14848. SkinItem.prototype.preFixNumber = function (num, strLen) {
  14849. return ("0000000000" + num).slice(-strLen);
  14850. };
  14851. SkinItem.prototype.evalBgColor = function () {
  14852. var color = Math.random() * 0xFFFFFF;
  14853. var channels = this.getColorChannals(color);
  14854. };
  14855. SkinItem.prototype.getColorChannals = function (color) {
  14856. var result = [];
  14857. result.push(color >> 16);
  14858. result.push(color >> 8 & 0xFF);
  14859. result.push(color & 0xFF);
  14860. return result;
  14861. };
  14862. /******************************************************** */
  14863. SkinItem.prototype.dispose = function () {
  14864. this.off(Laya.Event.CLICK, this, this.btnclick);
  14865. _super.prototype.dispose.call(this);
  14866. };
  14867. return SkinItem;
  14868. }(fairygui.GButton));
  14869. exports.SkinItem = SkinItem;
  14870. },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../PrefabControl/PanelResDic":48,"../WXSDK/ttad":83,"../utils/GlobalTip":88}],93:[function(require,module,exports){
  14871. "use strict";
  14872. Object.defineProperty(exports, "__esModule", { value: true });
  14873. /**
  14874. * 继承baseView界面的打开关闭动效类型
  14875. */
  14876. var ViewAction = /** @class */ (function () {
  14877. function ViewAction() {
  14878. /************************ */
  14879. this._text = null;
  14880. }
  14881. /**
  14882. * 动画状态开始时执行。
  14883. */
  14884. ViewAction.prototype.onStateEnter = function () {
  14885. console.log("动画开始播放了");
  14886. this._text.text = "动画状态:动画开始播放";
  14887. };
  14888. /**
  14889. * 动画状态更新时执行。
  14890. */
  14891. ViewAction.prototype.onStateUpdate = function () {
  14892. console.log("动画状态更新了");
  14893. this._text.text = "动画状态:动画更新中";
  14894. };
  14895. /**
  14896. * 动画状态退出时执行。
  14897. */
  14898. ViewAction.prototype.onStateExit = function () {
  14899. console.log("动画退出了");
  14900. this._text.text = "动画状态:动画开始退出";
  14901. };
  14902. ViewAction.prototype.addBox = function () {
  14903. for (var i = 0; i < 8; i++) {
  14904. this.addVerticalBox(-0.65, 0.165 + i * 0.33 * 2, 0);
  14905. this.addVerticalBox(0, 0.165 + i * 0.33 * 2, 0);
  14906. this.addVerticalBox(0.65, 0.165 + i * 0.33 * 2, 0);
  14907. }
  14908. };
  14909. ViewAction.prototype.addVerticalBox = function (x, y, z) {
  14910. var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh1));
  14911. box.meshRenderer.material = this.mat1;
  14912. box.meshRenderer.castShadow = true;
  14913. box.meshRenderer.receiveShadow = true;
  14914. box.transform.position = new Laya.Vector3(x, y, z);
  14915. var rigidBody = box.addComponent(Laya.Rigidbody3D);
  14916. rigidBody.mass = 10;
  14917. rigidBody.friction = 0.4;
  14918. rigidBody.restitution = 0.2;
  14919. var boxShape = new Laya.BoxColliderShape(0.5, 0.33, 2);
  14920. rigidBody.colliderShape = boxShape;
  14921. };
  14922. /**
  14923. * 从小变大
  14924. */
  14925. ViewAction.ActionType_addscaleMinToMax = "ActionType_addscaleMinToMax";
  14926. /**
  14927. * 从大变小移出
  14928. */
  14929. ViewAction.ActionType_removescaleMaxToMin = "ActionType_removescaleMaxToMin";
  14930. /**
  14931. * 没有动效
  14932. */
  14933. ViewAction.ActionType_none = "ActionType_none";
  14934. /********************************************** */
  14935. /**
  14936. * 从右边移动到中央
  14937. */
  14938. ViewAction.ActionType_addmoveToMiddle = "ActionType_addmoveToMiddle";
  14939. /**
  14940. * 从最右边移出
  14941. */
  14942. ViewAction.ActionType_removemoveToRight = "ActionType_removemoveToRight";
  14943. /**
  14944. * 从底部向上移动
  14945. */
  14946. ViewAction.ActionType_addmoveFromBottom = "ActionType_addmoveFromBottom";
  14947. /**
  14948. * 从上向底部移动
  14949. */
  14950. ViewAction.ActionType_addmoveFromup = "ActionType_addmoveFromup";
  14951. return ViewAction;
  14952. }());
  14953. exports.ViewAction = ViewAction;
  14954. },{}]},{},[44])
  14955. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkU6L0xheWFBaXIvTGF5YTIuMy4wL3Jlc291cmNlcy9hcHAvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9BZ2VuY3kvQWdlbmN5QmFzZUNvbnRyb2wudHMiLCJzcmMvQWdlbmN5L0FnZW5jeUluR2FtZS50cyIsInNyYy9BZ2VuY3kvQWdlbmN5TG9naW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeUxvdHRlcnkudHMiLCJzcmMvQWdlbmN5L0FnZW5jeU1haW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVNraW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVRyaWFsLnRzIiwic3JjL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZS50cyIsInNyYy9DRkcvQnVpbGRDRkcudHMiLCJzcmMvQ0ZHL0dhbWVDRkcudHMiLCJzcmMvQ0ZHL0xldmVsQ0ZHLnRzIiwic3JjL0NGRy9Mb3R0ZXJ5Q0ZHLnRzIiwic3JjL0NGRy9OcGNDRkcudHMiLCJzcmMvQ0ZHL1JvbGVDRkcudHMiLCJzcmMvQ29uZmlnL0Fzc2V0UGF0aC50cyIsInNyYy9Db25maWcvUmVjQ29uZmlncy50cyIsInNyYy9Db250cm9sL0Fzc2V0TWFuYWdlci50cyIsInNyYy9Db250cm9sL0F1ZGlvQ29udHJvbC50cyIsInNyYy9Db250cm9sL0Nvbm5lY3RDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvRGF0ZUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9HYW1lU3RhdGVDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvTGF5b3V0Q29udHJvbC50cyIsInNyYy9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9QYW5lbEJhc2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9Qb29sTWFuYWdlci50cyIsInNyYy9Db250cm9sL1Jlc0RhdGFDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvU2NlbmVDb250cm9sLnRzIiwic3JjL0RhdGEvQ29tcG9uZW50RXZlbnREYXRhLnRzIiwic3JjL0RhdGEvRGF0YUluZm9CYXNlLnRzIiwic3JjL0RhdGEvTG9jYWxEYXRhLnRzIiwic3JjL0RhdGEvUm9sZURhdGEudHMiLCJzcmMvRGF0YS9Ta2luRGF0YS50cyIsInNyYy9EYXRhL1VzZXJEYXRhSW5mby50cyIsInNyYy9EYXRhL1VzZXJJbmZvRXZlbnQudHMiLCJzcmMvR2FtZUNvbnRlbnRzLnRzIiwic3JjL0dhbWUvQ2FtZXJhTWFuYWdlci50cyIsInNyYy9HYW1lL05wY1NjcmlwdC50cyIsInNyYy9HYW1lL1BsYXllci50cyIsInNyYy9HbG9iYWwudHMiLCJzcmMvR2xvYmFsV2FpdGluZy50cyIsInNyYy9Kb3lzdGlja01vZHVsZS50cyIsInNyYy9NYWluLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyUG9vbC50cyIsInNyYy9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2wudHMiLCJzcmMvUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpYy50cyIsInNyYy9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyLnRzIiwic3JjL1B1c2gvQmFvS3VhbkdhbWVWaWV3LnRzIiwic3JjL1B1c2gvQ2hvdXRpUGFuVmlldy50cyIsInNyYy9QdXNoL0NwYURvd25zVmlldy50cyIsInNyYy9QdXNoL0NwYUV2ZW50LnRzIiwic3JjL1B1c2gvQ3BhSXRlbS50cyIsInNyYy9QdXNoL1JlY29tbWVuZFZpZXcudHMiLCJzcmMvUHVzaC9TaGl3YW50dWlqaWFuVmlldy50cyIsInNyYy9QdXNoL1R1aWppYW5WaWV3LnRzIiwic3JjL1RpbWUvVGltZVV0aWxzLnRzIiwic3JjL1RpbWUvVGltZXJTZXJ2aWNlLnRzIiwic3JjL1RpbWUvVGltZXNUYW1wZXIudHMiLCJzcmMvVmlldy9Db21wbGV0ZVBhbmVsLnRzIiwic3JjL1ZpZXcvRWdnUGFuZWwudHMiLCJzcmMvVmlldy9HaWZ0Vmlldy50cyIsInNyYy9WaWV3L0dsb2JhbFRpcFBhbmVsLnRzIiwic3JjL1ZpZXcvTG9hZGluZ1BhbmVsLnRzIiwic3JjL1ZpZXcvTG90dGVyeVBhbmVsLnRzIiwic3JjL1ZpZXcvTWFpblBhbmVsLnRzIiwic3JjL1ZpZXcvU2tpblBhbmVsLnRzIiwic3JjL1ZpZXcvVHJpYWxQYW5lbC50cyIsInNyYy9WaWV3L1ZpZXdNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL0ZZSERfU2RrLnRzIiwic3JjL1dYU0RLL0d1YW5nR2FvLnRzIiwic3JjL1dYU0RLL05ldHdvcmtNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL1BsYXRmcm9tVHlwZS50cyIsInNyYy9XWFNESy9QbGF5ZXJBY2NvdW50LnRzIiwic3JjL1dYU0RLL1JlY29yZE1hbmFnZXIudHMiLCJzcmMvV1hTREsvU2RrLnRzIiwic3JjL1dYU0RLL1NlcnZlclNvY2tldC50cyIsInNyYy9XWFNESy9Tb2NrZXROb2ZpZnkudHMiLCJzcmMvV1hTREsvV0VDSEFURVZFTlQudHMiLCJzcmMvV1hTREsvV1hHYW1lUGxhdGZvcm0udHMiLCJzcmMvV1hTREsvcGluZ3RhaXV0aWxzLnRzIiwic3JjL1dYU0RLL3R0YWQudHMiLCJzcmMvdXRpbHMvRGlzUGF0Y2hlck9uLnRzIiwic3JjL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyLnRzIiwic3JjL3V0aWxzL0dhbWVTdGF0ZS50cyIsInNyYy91dGlscy9HYW1lVXRpbHMudHMiLCJzcmMvdXRpbHMvR2xvYmFsVGlwLnRzIiwic3JjL3V0aWxzL0xFdmVudC50cyIsInNyYy91dGlscy9MYXlPVVQudHMiLCJzcmMvdXRpbHMvU2luZ2xldG9uLnRzIiwic3JjL3V0aWxzL1NraW5JdGVtLnRzIiwic3JjL3V0aWxzL1ZpZXdBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsNERBQXlEO0FBQ3pELGdFQUErRDtBQUMvRCxnREFBNkM7QUFDN0Msc0RBQW1EO0FBQ25ELDZDQUEwQztBQUUxQzs7RUFFRTtBQUNGO0lBQXVDLHFDQUFTO0lBTTVDO1FBQUEsWUFDSSxpQkFBTyxTQUdWO1FBRkcsS0FBSSxDQUFDLFdBQVcsR0FBRyx5QkFBVyxDQUFDLFFBQVEsQ0FBQztRQUN4QyxLQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0lBQ3BCLENBQUM7SUFDUyxvQ0FBUSxHQUFsQjtJQUdBLENBQUM7SUFFRCxnQkFBZ0I7SUFDUix5Q0FBYSxHQUFyQjtRQUNJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUk7UUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPO1FBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRixLQUFLO1FBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEksS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRyxNQUFNO1FBQ04sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLElBQUk7UUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNELGNBQWM7UUFDZCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMs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S0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hJLEtBQUs7UUFDTCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU07UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEcsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMxRSxJQUFJO1FBQ0osSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELEtBQUs7UUFDTCxJQUFJLENBQUMs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RUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0UsU0FBUyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7SUFDdkMsQ0FBQztJQTFDRDs7T0FFRztJQUNJLHNDQUEyQixHQUFVLDZCQUE2QixDQUFDO0lBRTFFOztPQUVHO0lBQ0kseUNBQThCLEdBQVUsZ0NBQWdDLENBQUM7SUFFaEY7O09BRUc7SUFDSSwwQkFBZSxHQUFVLGlCQUFpQixDQUFDO0lBK0JsRCxrREFBa0Q7SUFHbEQ7O09BRUc7SUFDSSxxQ0FBMEIsR0FBUSw0QkFBNEIsQ0FBQztJQUN0RTs7T0FFRztJQUNJLHVDQUE0QixHQUFVLDhCQUE4QixDQUFDO0lBRTVFOztPQUVHO0lBQ0ksdUNBQTRCLEdBQVEsOEJBQThCLENBQUM7SUFDMUU7O09BRUc7SUFDSSxtQ0FBd0IsR0FBUSwwQkFBMEIsQ0FBQztJQUt0RSxpQkFBQztDQWhHRCxBQWdHQyxJQUFBO0FBaEdZLGdDQUFVIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7U2luZ2xldG9ufSBmcm9tIFwiLi4vdXRpbHMvU2luZ2xldG9uXCI7XHJcbmltcG9ydCB7U2VydmVyU29ja2V0fSBmcm9tIFwiLi4vV1hTREsvU2VydmVyU29ja2V0XCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBBZ2VuY3lCYXNlQ29udHJvbCBleHRlbmRzIFNpbmdsZXRvblxyXG57XHJcbiAgICBwcml2YXRlIF9vYmplY3RQb29sOiBQYW5lbFJlc0RpYztcclxuXHJcbiAgICBwcml2YXRlIHNwOkxheWEuU3ByaXRlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9vYmplY3RQb29sID0gUGFuZWxSZXNEaWMuSW5zdGFuY2U7XHJcbiAgICAgICAgdGhpcy5pbml0U2VsZigpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGluaXRTZWxmKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKua3t+a3hiAqL1xyXG4gICAgcHJpdmF0ZSBkcmF3U29tZXRoaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3AgPSBuZXcgTGF5YS5TcHJpdGUoKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ApO1xyXG4gICAgICAgIC8v55S757q/XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3TGluZSgxMCwgNTgsIDE0NiwgNTgsIFwiI2ZmMDAwMFwiLCAzKTtcclxuICAgICAgICAvL+eUu+i/nue7reebtOe6v1xyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmVzKDE3NiwgNTgsIFswLCAwLCAzOSwgLTUwLCA3OCwgMCwgMTE3LCA1MCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xyXG4gICAgICAgIC8v55S75puy57q/XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q3VydmVzKDM1MiwgNTgsIFswLCAwLCAxOSwgLTEwMCwgMzksIDAsIDU4LCAxMDAsIDc4LCAwLCA5NywgLTEwMCwgMTE3LCAwLCAxMzYsIDEwMCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xyXG4gICAgICAgIC8v55S755+p5b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UmVjdCgxMCwgMTY2LCAxNjYsIDkwLCBcIiNmZmZmMDBcIik7XHJcbiAgICAgICAgLy/nlLvlpJrovrnlvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDI2NCwgMTY2LCBbMCwgMCwgNjAsIDAsIDc4LjQ4LCA1NywgMzAsIDkzLjQ4LCAtMTguNDgsIDU3XSwgXCIjZmZmZjAwXCIpO1xyXG4gICAgICAgIC8v55S75LiJ6KeS5b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UG9seSg0MDAsIDE2NiwgWzAsIDEwMCwgNTAsIDAsIDEwMCwgMTAwXSwgXCIjZmZmZjAwXCIpO1xyXG4gICAgICAgIC8v55S75ZyGXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q2lyY2xlKDk4LCAzMzIsIDUwLCBcIiMwMGZmZmZcIik7XHJcbiAgICAgICAgLy/nlLvmiYflvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQaWUoMjQwLCAyOTAsIDEwMCwgMTAsIDYwLCBcIiMwMGZmZmZcIik7XHJcbiAgICAgICAgLy/nu5jliLblnIbop5Lnn6nlvaLvvIzoh6rlrprkuYnot6/lvoRcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQYXRoKDQwMCwgMzEwLCBbW1wibW92ZVRvXCIsIDUsIDBdLCBbXCJsaW5lVG9cIiwgMTA1LCAwXSwgW1wiYXJjVG9cIiwgMTEwLCAwLCAxMTAsIDUsIDVdLCBbXCJsaW5lVG9cIiwgMTEwLCA1NV0sIFtcImFyY1RvXCIsIDExMCwgNjAsIDEwNSwgNjAsIDVdLCBbXCJsaW5lVG9cIiwgNSwgNjBdLCBbXCJhcmNUb1wiLCAwLCA2MCwgMCwgNTUsIDVdLCBbXCJsaW5lVG9cIiwgMCwgNV0sIFtcImFyY1RvXCIsIDAsIDAsIDUsIDAsIDVdLCBbXCJjbG9zZVBhdGhcIl1dLCB7ZmlsbFN0eWxlOiBcIiMwMGZmZmZcIn0pO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKiogKi9cclxuXHJcbiAgICAvKipcclxuICAgICAqICDms6jlhozlhajlsYDkvqblkKzkuovku7ZcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgRGlzT24oIHR5cGU6c3RyaW5nLCBjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrb2JqLCBjYWxsYmFja0hhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICDmipvlh7rlhajlsYDkuovku7YgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBEaXNUcmlnZ2VyKHR5cGU6c3RyaW5nLCBkYXRhOmFueSA9IG51bGwpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggdHlwZSwgZGF0YSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YWo5bGA5L6m5ZCs5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBEaXNPZmYodHlwZTpzdHJpbmcsY2FsbGJhY2tvYmo6YW55LCBjYWxsYmFja0hhbmRsZXI6RnVuY3Rpb24pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrb2JqLCBjYWxsYmFja0hhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHRleHRCb3g6TGF5YS5TcHJpdGUgPSBuZXcgTGF5YS5TcHJpdGUoKTtcclxuXHJcbiAgICAgICAgLy8g6ZqP5py65pGG5pS+5paH5pysXHJcbiAgICAgICAgdmFyIHRleHQ6TGF5YS5UZXh0O1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCAxMDAwOyBpKyspIHtcclxuICAgICAgICAgICAgdGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcclxuICAgICAgICAgICAgdGV4dC5mb250U2l6ZSA9IDIwO1xyXG4gICAgICAgICAgICB0ZXh0LnRleHQgPSAoTWF0aC5yYW5kb20oKSAqIDEwMCkudG9GaXhlZCgwKTtcclxuICAgICAgICAgICAgdGV4dC5yb3RhdGlvbiA9IE1hdGgucmFuZG9tKCkgKiAzNjA7XHJcbiAgICAgICAgICAgIHRleHQuY29sb3IgPSBcIiNDQ0NDQ0NcIjtcclxuXHJcbiAgICAgICAgICAgIHRleHQueCA9IE1hdGgucmFuZG9tKCkgKiBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgICAgICB0ZXh0LnkgPSBNYXRoLnJhbmRvbSgpICogTGF5YS5zdGFnZS5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICB0ZXh0Qm94LmFkZENoaWxkKHRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL+e8k+WtmOS4uumdmeaAgeWbvuWDj1xyXG4gICAgICAgIHRleHRCb3guY2FjaGVBcyA9IFwiYml0bWFwXCI7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGV4dEJveCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqICoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuICAgIHByb3RlY3RlZCBnZXRTaW5nbGVUb24ocmVmOmFueSk6YW55XHJcblx0e1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3RQb29sLmdldFNpbmdsZVRvbihyZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZW5kTWVzc2FnZSggYWN0OnN0cmluZyxkYXRhOmFueSA9IG51bGwsaXNTaG93V2FpdDpib29sZWFuID0gdHJ1ZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBTZXJ2ZXJTb2NrZXQuSW5zdGFuY2Uuc2VuZE1lc3NhZ2UoYWN0LCBkYXRhLCBpc1Nob3dXYWl0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJvbGVEYXRhOlJvbGVEYXRhO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgUm9sZURhdGEoKTpSb2xlRGF0YVxyXG4gICAge1xyXG4gICAgICAgIGlmICghdGhpcy5yb2xlRGF0YSl7XHJcbiAgICAgICAgICAgIHRoaXMucm9sZURhdGEgPSBSb2xlRGF0YS5JbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm9sZURhdGE7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q29tcGxldGVQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvQ29tcGxldGVQYW5lbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgUFJPVE9DT0xTLCBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHtBZ2VuY3lUcmlhbH0gZnJvbSBcIi4vQWdlbmN5VHJpYWxcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuaW1wb3J0IEZyaWVuZEludml0ZVZpZXcgZnJvbSBcIi4uL1B1c2gvRnJpZW5kSW52aXRlVmlld1wiO1xyXG5pbXBvcnQgR2lmdFZpZXcgZnJvbSBcIi4uL1ZpZXcvR2lmdFZpZXdcIjtcclxuaW1wb3J0IENob3V0aVBhblZpZXcgZnJvbSBcIi4uL1B1c2gvQ2hvdXRpUGFuVmlld1wiO1xyXG5pbXBvcnQgeyBSZWNvcmRNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL1JlY29yZE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgTWFpblBhbmVsIH0gZnJvbSBcIi4uL1ZpZXcvTWFpblBhbmVsXCI7XHJcblxyXG5leHBvcnQgIGNsYXNzIEFnZW5jeUluR2FtZSBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5SW5HYW1lXCI7XHJcbiAgICBzdGF0aWMgZ2FtZW51bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRTZWxmKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuRGlzT24oIEdhbWVTdGF0ZS5lbmQsdGhpcyx0aGlzLmVuZGdhbWVIYW5kbGVyICk7XHJcbiAgICAgICAgdGhpcy5EaXNPbihHYW1lU3RhdGUucmV2aXZlLHRoaXMsdGhpcy5SZXZpdmVnYW1lSGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5EaXNPbihHYW1lU3RhdGUubG9zZSx0aGlzLHRoaXMuTG9zZWdhbWVIYW5kbGVyKTtcclxuICAgIH1cclxuICAgIC8qKuWkjea0u+eVjOmdoiAqL1xyXG4gICAgcHJpdmF0ZSBSZXZpdmVnYW1lSGFuZGxlcigpOnZvaWR7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDEwMDAsdGhpcyx0aGlzLnJldml2ZVZpZXcpO1xyXG4gICAgfVxyXG4gICAgLyoq5aSx6LSl55WM6Z2iICovXHJcbiAgICBwcml2YXRlIExvc2VnYW1lSGFuZGxlcigpOnZvaWR7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDEwMDAsdGhpcyx0aGlzLmxvc2VWaWV3KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcmV2aXZlVmlldygpe1xyXG4gICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuUmVjb3JkU3RvcCgpO1xyXG4gICAgICAgIHZhciBub3dtaW5nY3ZpOm51bWJlciA9IEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2Uubm93TWluZ0NpO1xyXG4gICAgICAgIHZhciBnZXRHb2xkOm51bWJlciA9IDA7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5aSN5rS7KVwiKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENvbXBsZXRlUGFuZWwsZ2V0R29sZCApO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBsb3NlVmlldygpOnZvaWR7XHJcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XHJcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XHJcbiAgICAgICAgdmFyIGdldEdvbGQ6bnVtYmVyID0gMDtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijlpLHotKUpXCIpO1xyXG4gICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIGZhbHNlICk7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDb21wbGV0ZVBhbmVsLGdldEdvbGQgKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZW5kZ2FtZUhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKCAxMDAwLHRoaXMsdGhpcy5zdGFydEVuZFZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydEVuZFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XHJcbiAgICAgICAgdmFyIGdldEdvbGQ6bnVtYmVyID0gMDtcclxuICAgICAgICBpZiggR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGdldEdvbGQgPSB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLndpbkdvbGQ7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOa4uOaIj+iDnOWIqSlcIik7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLmZhaWxHb2QgKTtcclxuICAgICAgICAgICAgZ2V0R29sZCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIE51bWJlcihhcnJbMF0pLE51bWJlcihhcnJbMV0pICk7XHJcbiAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOa4uOaIj+Wksei0pSlcIik7XHJcbiAgICAgICAgICAgIHRoaXMuUmVjcm9wTGV2ZWxFbmQoIGZhbHNlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ29tcGxldGVQYW5lbCxnZXRHb2xkICk7XHJcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3LDIgKTtcclxuICAgIH1cclxuXHJcbiAgICBSZWNyb3BMZXZlbEVuZChfd2luOmJvb2xlYW4pXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYoIUxheWEuQnJvd3Nlci5vbldlaVhpbilyZXR1cm47XHJcbiAgICAgICAgLy8gdmFyIHN0YWdlaWQgPSB0aGlzLlJvbGVEYXRhLkxldmVsSUQudG9TdHJpbmcoKTtcclxuICAgICAgICAvLyB2YXIgdXNlaWQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLlVzZUlkO1xyXG4gICAgICAgIC8vIHZhciBzdGFnZW5hbWUgPSBcIuesrFwiICsgdGhpcy5Sb2xlRGF0YS5MZXZlbElEICsgXCLlhbNcIjtcclxuICAgICAgICAvLyBpZihfd2luKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgV3hBcGkubGV2ZWxTdWNjZXNzKHN0YWdlaWQsc3RhZ2VuYW1lLHN0YWdlaWQpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICB2YXIgZXF1aXBpZCA9IHRoaXMuUm9sZURhdGEuQ2hhcmFjdGVySUQudG9TdHJpbmcoKTtcclxuICAgICAgICAvLyAgICAgdmFyIGNhcm5hbWUgPSB0aGlzLlJvbGVEYXRhLnJvbGVDZmcubmFtZTtcclxuICAgICAgICAvLyAgICAgV3hBcGkubGV2ZWxGYWlsKHN0YWdlaWQsc3RhZ2VuYW1lLHN0YWdlaWQsXCIwXCIsY2FybmFtZSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXR1cm5tYWludmlldyh3aW4/KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHdpbiAmJiBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlcikge1xyXG4gICAgICAgICAgICBsZXQgcmFuID0gTWF0aC5yYW5kb20oKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLor6/op6blh6DnjofkuLotLS1cIiwgcmFuKTtcclxuICAgICAgICAgICAgaWYgKHJhbiA8PSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkVuZENoZWF0KSB7XHJcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoR2lmdFZpZXcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1ID0gMTtcclxuICAgICAgICAgICAgR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5DbG9zZUdhbWVPdmVyRWZmZWN0KCk7XHJcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xyXG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoR2FtZVN0YXRlLnJldHVybk1haW5WaWV3KTtcclxuICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlNob3dUaGVHYW1lU2NlbmUoKTtcclxuICAgICAgICAgICAgdmFyIGFnZW5jeXRyaWFsOiBBZ2VuY3lUcmlhbCA9IHRoaXMuZ2V0U2luZ2xlVG9uKEFnZW5jeVRyaWFsKTtcclxuICAgICAgICAgICAgaWYgKGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZykgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5DcmVhdGVQbGF5ZXIodGhpcy5Sb2xlRGF0YS5yb2xlQ2ZnKTtcclxuICAgICAgICAgICAgICAgIGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1ID0gMTtcclxuICAgICAgICAgICAgR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5DbG9zZUdhbWVPdmVyRWZmZWN0KCk7XHJcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xyXG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoR2FtZVN0YXRlLnJldHVybk1haW5WaWV3KTtcclxuICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlNob3dUaGVHYW1lU2NlbmUoKTtcclxuICAgICAgICAgICAgdmFyIGFnZW5jeXRyaWFsOiBBZ2VuY3lUcmlhbCA9IHRoaXMuZ2V0U2luZ2xlVG9uKEFnZW5jeVRyaWFsKTtcclxuICAgICAgICAgICAgaWYgKGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZykgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5DcmVhdGVQbGF5ZXIodGhpcy5Sb2xlRGF0YS5yb2xlQ2ZnKTtcclxuICAgICAgICAgICAgICAgIGFnZW5jeXRyaWFsLmlzc2hpeW9uZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKEdhbWVTdGF0ZS5HYW1lTnVtJTMgPT0gMCl7XHJcbiAgICAgICAgICAgIE1haW5QYW5lbC5pbnN0YW5jZS5za2luY2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/miZPlvIDlpb3lj4vpgoDor7fnlYzpnaJcclxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoRnJpZW5kSW52aXRlVmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBBZ2VuY3lJbkdhbWUuZ2FtZW51bSArKztcclxuICAgICAgICB2YXIgc3RhZ2VpZCA9IHRoaXMuUm9sZURhdGEuZ2V0Tm93U2VydmVyTGV2ZWwoKS50b1N0cmluZygpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFyIHN0YWdlbmFtZSA9IFwi56ysXCIgKyBzdGFnZWlkICsgXCLlhbNcIjtcclxuICAgICAgICB2YXIgdXNlaWQgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLlVzZUlkO1xyXG4gICAgICAgIFd4QXBpLmxldmVsU3RhcnQoc3RhZ2VpZCxzdGFnZW5hbWUsdXNlaWQpO1xyXG4gICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2Uuc3RhcnRHYW1lKCk7XHJcbiAgICB9XHJcbiAgIFxyXG59IiwiaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge0xvYWRpbmdQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvTG9hZGluZ1BhbmVsXCI7XHJcblxyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge1dFQ0hBVEVWRU5UfSBmcm9tIFwiLi4vV1hTREsvV0VDSEFURVZFTlRcIjtcclxuaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtBZ2VuY3lNYWlufSBmcm9tIFwiLi9BZ2VuY3lNYWluXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xyXG5pbXBvcnQgTGV2ZWxDRkcgZnJvbSBcIi4uL0NGRy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgQnVpbGRDRkcgZnJvbSBcIi4uL0NGRy9CdWlsZENGR1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9DRkcvTnBjQ0ZHXCI7XHJcbmltcG9ydCBHYW1lQ0ZHIGZyb20gXCIuLi9DRkcvR2FtZUNGR1wiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuL0FnZW5jeVNraW5cIjtcclxuaW1wb3J0IHsgV3hBcGkgfSBmcm9tIFwiLi4vV1hTREsvU2RrXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBNYWluQ29uZmlnIH0gZnJvbSBcIi4uL01haW5Db25maWdcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcclxuaW1wb3J0IHtBZ2VuY3lMb3R0ZXJ5fSBmcm9tIFwiLi9BZ2VuY3lMb3R0ZXJ5XCI7XHJcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XHJcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuLi9XWFNESy9TaGFyZVV0aWxcIjtcclxuaW1wb3J0IHsgR3VhbmdHYW8gfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcbmltcG9ydCB7IEFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9Db250cm9sL0Fzc2V0TWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeUxvZ2luIGV4dGVuZHMgQWdlbmN5QmFzZUNvbnRyb2wgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lMb2dpblwiO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5EaXNPbiggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfbG9naW5TdWNjZWVkLHRoaXMsdGhpcy5TdWNjZXNzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvZ2luKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggTG9hZGluZ1BhbmVsICk7XHJcbiAgICAgICAgdGhpcy5sb2dpbnByb2dyZXNzKDApO1xyXG4gICAgICAgIC8vIGlmKExheWEuQnJvd3Nlci5vbldlaVhpbilcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuTG9naW5XWCgpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgICAgICB0aGlzLkxvZ2luTG9jYWwoKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcbiAgICBMb2dpbldYKClcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW8gOWni+W+ruS/oeeZu+W9lVwiKTtcclxuICAgICAgICBXeEFwaS5XWExvZ2luKChyZXMpID0+IFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzICE9IFwiZXJyb3JcIikgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvq7kv6HnmbvlvZXmiJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJocGxvZ2luOlwiICsgXCJxdWVyeWNoYW5uZWwtPlwiKyBXeEFwaS5xdWVyeWNoYW5uZWwgKyBcIiByZWZlcnJlckluZm9hcHBJZC0+XCIgKyBXeEFwaS5yZWZlcnJlckluZm9hcHBJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2dpbkxvY2FsKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5b6u5L+h55m75b2V5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuTG9naW5XWCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBMb2dpbkxvY2FsKHJlcyA9IG51bGwpIFxyXG4gICAge1xyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5byA5aeL5pys5Zyw55m75b2VXCIpO1xyXG4gICAgICAgIGlmKHJlcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5ldyBQbGF5ZXJBY2NvdW50KHJlcy5jb2RlLCBcIlwiLCBcIlwiLCAwLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBXeEFwaS5zaGFyZU9wZW5JZCwgV3hBcGkuc2hhcmVPcGVuSWQsR2xvYmFsLmdhbWVWZXJzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTmV0d29ya01hbmFnZXIuSW5zdGFuY2UubG9naW4obnVsbCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLkxvZ2luQ29tcGxldGUpLCBudWxsKTtcclxuICAgICAgICAvL3RoaXMuTG9hZFNicCgpO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2luQ29tcGxldGUoKSBcclxuICAgIHtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuacrOWcsOacjeWKoeWZqOeZu+W9leWujOaIkC4uLlwiKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBTaGFyZVV0aWwuSW5zdGFuY2Uub25SZWdpc3RlcigpO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLkluaXRWaWRlbygpO1xyXG4gICAgICAgIFd4QXBpLmFsZFNlbmRPcGVuaWQoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5vcGVuaWQpO1xyXG4gICAgIFxyXG4gICAgICAgIHRoaXMuU3VjY2VzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9naW5wcm9ncmVzcyggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsb2FkaW5nUGFuZWw6TG9hZGluZ1BhbmVsID0gVmlld01hbmFnZXIuSW5zdGFuY2UuZ2V0VmlldyggTG9hZGluZ1BhbmVsICk7XHJcbiAgICAgICAgaWYoIGxvYWRpbmdQYW5lbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsb2FkaW5nUGFuZWwuc2hvd1dvcmQoIHZhbHVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgU3VjY2VzcygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlJlc29sdmVEYXRhKCApO1xyXG4gICAgICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgICAgICB0aGlzLlN0YXJ0TWFpbigpO1xyXG4gICAgICAgIHR0YWQuSW5pdEFEKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBTdGFydE1haW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coIFwi5b2T5YmN6YWN572u6KGo5oC75YWz5Y2h77yaXCIsTGV2ZWxDRkcudmVjLmxlbmd0aCApO1xyXG4gICAgICAgIFxyXG4gICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeU1haW4gKSBhcyBBZ2VuY3lNYWluICkuU3RhcnRNYWluKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBjb25maWdDbGFzczphbnkgPVxyXG4gICAge1xyXG4gICAgICAgIFJvbGVDRkc6Um9sZUNGRyxcclxuICAgICAgICBMZXZlbENGRzpMZXZlbENGRyxcclxuICAgICAgICBCdWlsZENGRzpCdWlsZENGRyxcclxuICAgICAgICBOcGNDRkc6TnBjQ0ZHLFxyXG4gICAgICAgIEdhbWVDRkc6R2FtZUNGRyxcclxuICAgICAgICBMb3R0ZXJ5Q0ZHOkxvdHRlcnlDRkdcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOino+aekOmFjee9ruaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIFJlc29sdmVEYXRhKCk6Ym9vbGVhbiBcclxuICAgIHtcclxuICAgICAgICBsZXQgYnl0ZURhdGE6YW55ID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5ub3dDb25maWcuZ2FtZUNvbmZpZ1swXS5jb25maWc7XHJcbiAgICAgICAgaWYoIGJ5dGVEYXRhICYmIGJ5dGVEYXRhICE9IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gYnl0ZURhdGEuc3BsaXQoXCIlZmlsZSVcIik7XHJcbiAgICAgICAgICAgIHZhciBpOm51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgZm9yKCBpPTA7aTxudW1zO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtYXJyOkFycmF5PHN0cmluZz4gPSBhcnJbaV0uc3BsaXQoXCIlY2ZnJVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBjbGE6IGFueSA9IEFnZW5jeUxvZ2luLmNvbmZpZ0NsYXNzW2l0ZW1hcnJbMF1dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsYS5pbml0Q2ZnKGl0ZW1hcnJbMV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMlua4uOaIj+aVsOaNrlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXREYXRhKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5pbml0KCk7XHJcbiAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApIGFzIEFnZW5jeVNraW4gKS5pbml0KCk7XHJcbiAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnkgKS5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICBcclxufSIsImltcG9ydCB7QWdlbmN5QmFzZUNvbnRyb2x9IGZyb20gXCIuL0FnZW5jeUJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtMb3R0ZXJ5UGFuZWx9IGZyb20gXCIuLi9WaWV3L0xvdHRlcnlQYW5lbFwiO1xyXG5pbXBvcnQgTG90dGVyeUNGRyBmcm9tIFwiLi4vQ0ZHL0xvdHRlcnlDRkdcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuL0FnZW5jeVNraW5cIjtcclxuXHJcbmV4cG9ydCAgY2xhc3MgQWdlbmN5TG90dGVyeSBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5TG90dGVyeVwiO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW5WaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggTG90dGVyeVBhbmVsICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBhbmk6TGF5YS5BbmltYXRpb24gPSBuZXcgTGF5YS5BbmltYXRpb24oKTtcclxuICAgICAgICAvLyBhbmkubG9hZEF0bGFzKHRoaXMuQW5pQ29uZlBhdGgpOyAvLyDliqDovb3lm77pm4bliqjnlLtcclxuICAgICAgICBhbmkuaW50ZXJ2YWwgPSAzMDsgLy8g6K6+572u5pKt5pS+6Ze06ZqU77yI5Y2V5L2N77ya5q+r56eS77yJXHJcbiAgICAgICAgYW5pLmluZGV4ID0gMTsgLy8g5b2T5YmN5pKt5pS+57Si5byVXHJcbiAgICAgICAgYW5pLnBsYXkoKTsgLy8g5pKt5pS+5Zu+6ZuG5Yqo55S7XHJcblxyXG4gICAgICAgIC8vIOiOt+WPluWKqOeUu+eahOi+ueeVjOS/oeaBr1xyXG4gICAgICAgIHZhciBib3VuZHM6TGF5YS5SZWN0YW5nbGUgPSBhbmkuZ2V0R3JhcGhpY0JvdW5kcygpO1xyXG4gICAgICAgIGFuaS5waXZvdChib3VuZHMud2lkdGggLyAyLCBib3VuZHMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIGFuaS5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoYW5pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1BbmlQYXRoOnN0cmluZztcclxuICAgIHByaXZhdGUgbVN0YXJ0WDpudW1iZXIgPSA0MDA7XHJcbiAgICBwcml2YXRlIG1TdGFydFk6bnVtYmVyID0gNTAwO1xyXG4gICAgcHJpdmF0ZSBtRmFjdG9yeTpMYXlhLlRlbXBsZXQ7XHJcbiAgICBwcml2YXRlIG1BY3Rpb25JbmRleDpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBtQ3VyckluZGV4Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG1Bcm1hdHVyZTpMYXlhLlNrZWxldG9uO1xyXG4gICAgcHJpdmF0ZSBtQ3VyclNraW5JbmRleDpudW1iZXIgPSAwO1xyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHVibGljIGdldHJld2FyZCggY2ZnOkxvdHRlcnlDRkcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGNmZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIGNmZy50eXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUm9sZURhdGEuTW9uZXkgKz0gTnVtYmVyKGNmZy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLmga3llpzojrflvpdcIiArIGNmZy52YWx1ZSArIFwi6YeR5biB77yBXCIgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciByb2xlY2ZnOlJvbGVDRkcgPSBSb2xlQ0ZHLmRpY3RbIGNmZy52YWx1ZSBdO1xyXG4gICAgICAgICAgICAgICAgICAgICggdGhpcy5nZXRTaW5nbGVUb24oIEFnZW5jeVNraW4gKSBhcyBBZ2VuY3lTa2luICkuc2V0Um9sZVN0YXRlKCByb2xlY2ZnLDEgKTtcclxuICAgICAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuaBreWWnOiOt+W+l+inkuiJslwiICsgcm9sZWNmZy5yb2xlbmFtZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBHZXRSZXdhcmQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgZGljdHM6QXJyYXk8TG90dGVyeUNGRz4gPSBMb3R0ZXJ5Q0ZHLnZlYztcclxuICAgICAgICB2YXIgbWF4TnVtOm51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGNmZzpMb3R0ZXJ5Q0ZHO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpPTA7aTxkaWN0cy5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNmZyA9IGRpY3RzW2ldO1xyXG4gICAgICAgICAgICBtYXhOdW0gKz0gY2ZnLndlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNvcmR2YWx1ZTpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAxLG1heE51bSApO1xyXG4gICAgICAgIHZhciB0b3RhbG51bTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IGRpY3RzLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2ZnID0gZGljdHNbaV07XHJcbiAgICAgICAgICAgIHRvdGFsbnVtICs9IGNmZy53ZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmKCB0b3RhbG51bSA+PSBzb3JkdmFsdWUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRGdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tQW5pUGF0aCA9IFwicmVzL3NwaW5lL3NwaW5lUmVzMS9kcmFnb24uc2tcIjtcclxuICAgICAgICAvLyB0aGlzLm1GYWN0b3J5ID0gbmV3IFRlbXBsZXQoKTtcclxuICAgICAgICAvLyB0aGlzLm1GYWN0b3J5Lm9uKEV2ZW50LkNPTVBMRVRFLCB0aGlzLCB0aGlzLnBhcnNlQ29tcGxldGUpO1xyXG4gICAgICAgIC8vIHRoaXMubUZhY3Rvcnkub24oRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25FcnJvcik7XHJcbiAgICAgICAgLy8gdGhpcy5tRmFjdG9yeS5sb2FkQW5pKHRoaXMubUFuaVBhdGgpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBvbkVycm9yKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHBhcnNlQ29tcGxldGUoKTp2b2lkIHtcclxuICAgICAgICAvL+WIm+W7uuaooeW8j+S4ujHvvIzlj6/ku6XlkK/nlKjmjaLoo4VcclxuICAgICAgICB0aGlzLm1Bcm1hdHVyZSA9dGhpcy5tRmFjdG9yeS5idWlsZEFybWF0dXJlKDEpO1xyXG4gICAgICAgIHRoaXMubUFybWF0dXJlLnggPSB0aGlzLm1TdGFydFg7XHJcbiAgICAgICAgdGhpcy5tQXJtYXR1cmUueSA9IHRoaXMubVN0YXJ0WTtcclxuICAgICAgICB0aGlzLm1Bcm1hdHVyZS5zY2FsZSgwLjUsIDAuNSk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLm1Bcm1hdHVyZSk7XHJcbiAgICAgICAgLy8gdGhpcy5tQXJtYXR1cmUub24oRXZlbnQuU1RPUFBFRCwgdGhpcywgdGhpcy5jb21wbGV0ZUhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMucGxheSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIGNvbXBsZXRlSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnBsYXkoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBwbGF5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubUN1cnJJbmRleCsrO1xyXG4gICAgICAgIGlmICh0aGlzLm1DdXJySW5kZXggPj0gdGhpcy5tQXJtYXR1cmUuZ2V0QW5pbU51bSgpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5tQ3VyckluZGV4ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQXJtYXR1cmUucGxheSh0aGlzLm1DdXJySW5kZXgsZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7TG9hZGluZ1BhbmVsfSBmcm9tIFwiLi4vVmlldy9Mb2FkaW5nUGFuZWxcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge01haW5QYW5lbH0gZnJvbSBcIi4uL1ZpZXcvTWFpblBhbmVsXCI7XHJcbmltcG9ydCB7U2NlbmVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHtXWEdhbWVQbGF0Zm9ybX0gZnJvbSBcIi4uL1dYU0RLL1dYR2FtZVBsYXRmb3JtXCI7XHJcbmltcG9ydCBSb2xlQ0ZHIGZyb20gXCIuLi9DRkcvUm9sZUNGR1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9DRkcvTnBjQ0ZHXCI7XHJcbmltcG9ydCB7TG9jYWxEYXRhQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvTG9jYWxEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50LCBBY2NvdW50VXNlciB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vV1hTREsvTmV0d29ya01hbmFnZXJcIjtcclxuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuaW1wb3J0IEdpZnRWaWV3IGZyb20gXCIuLi9WaWV3L0dpZnRWaWV3XCI7XHJcbmltcG9ydCB7IEFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9Db250cm9sL0Fzc2V0TWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeU1haW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeU1haW5cIjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbG9hZGpkOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9hbGxqZDpudW1iZXIgPSAwO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBTdGFydE1haW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gMDtcclxuICAgICAgICB0aGlzLl9hbGxqZCA9IDIwO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmxvYWRTdWJwYWNrYWdlKCBcInN1YnBhY2thZ2VcIix0aGlzLHRoaXMuc3ViMWNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLG51bGwgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN1YjFjb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2FkamQgPSAyMDtcclxuICAgICAgICB0aGlzLl9hbGxqZCA9IDMwO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmxvYWRTdWJwYWNrYWdlKCBcInN1YnBhY2thZ2UxXCIsdGhpcyx0aGlzLlN1YnBhY2thZ2VPdmVyLHRoaXMubG9hZHByb2dyZXNzLG51bGwgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgc2NlbmU6TGF5YS5TY2VuZTNEO1xyXG4gICAgcHVibGljIG9uQ29tcGxldGUoKSB7XHJcblx0XHQvL+a3u+WKoOeItue6p+eMtOWtkFxyXG5cdFx0dmFyIGR1ZGUgPSB0aGlzLnNjZW5lLmFkZENoaWxkKExheWEuTG9hZGVyLmdldFJlcyhcInJlcy90aHJlZURpbWVuL3NraW5Nb2RlbC9kdWRlL2R1ZGUubGhcIikpIGFzIExheWEuU3ByaXRlM0Q7XHJcblx0XHQvL+e8qeaUvlxyXG5cdFx0dmFyIHNjYWxlID0gbmV3IExheWEuVmVjdG9yMygwLjEsIDAuMSwgMC4xKTtcclxuXHRcdGR1ZGUudHJhbnNmb3JtLmxvY2FsU2NhbGUgPSBzY2FsZTtcclxuXHRcdGR1ZGUudHJhbnNmb3JtLnJvdGF0ZShuZXcgTGF5YS5WZWN0b3IzKCAwLCAzLjE0LCAwKSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblx0XHJcblxyXG4gICAgcHJpdmF0ZSBTdWJwYWNrYWdlT3ZlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBBc3NldE1hbmFnZXIuTG9hZEFzc2V0RnVuKCgpPT57XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9sb2FkamQgPSA1MDtcclxuICAgICAgICAgICAgdGhpcy5fYWxsamQgPSA0MDtcclxuICAgICAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgICB2YXIgdXJsQXJyOkFycmF5PHN0cmluZz4gPSBbXTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcInN0YXJ0cGFuZWxcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJlbmRwYW5lbFwiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcInNwZWVkdXBlZmZlY3RcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJjb2xvcl93aGl0ZVwiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcImNvbG9yX3llbGxvd1wiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcIndpbmxpbmVcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJmaXJld29ya3NcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJEaXJlY3Rpb25hbExpZ2h0XCIgKSApO1xyXG4gICAgICAgICAgICAvLyB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIFwiZGlzdGFudHZpZXdcIiApICk7XHJcbiAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIHRoaXMuUm9sZURhdGEucm9sZUNmZy5uYW1lICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggXCJBcnJvd1wiICkgKTtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gdGhpcy5Sb2xlRGF0YS5sZXZlbG1hcEFycjtcclxuICAgICAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICAgICAgZm9yKCBpID0gMDtpIDwgYXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIGFycltpXSApKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgbnBjQXJyOkFycmF5PGFueT4gPSB0aGlzLlJvbGVEYXRhLmxldmVsY2ZnLm5wYztcclxuICAgICAgICAgICAgZm9yKCBpID0gMDtpIDwgbnBjQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApID09IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yKCBpID0gMDtpIDwgdXJsQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwYXRoQXJyLnB1c2goIHsgdXJsOnVybEFycltpXSB9ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRlcjNEQXJyKCBwYXRoQXJyLHRoaXMsdGhpcy5sb2FkM0Rjb21wbGV0ZSx0aGlzLmxvYWRwcm9ncmVzcyApO1xyXG5cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZDNEY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGpkID0gOTA7XHJcbiAgICAgICAgdGhpcy5fYWxsamQgPSAxMDtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZEdyb3VwKCBcIm1haW5cIix0aGlzLHRoaXMubG9hZGNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzLGZhbHNlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkcHJvZ3Jlc3MoIHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbG9hZGluZ3BhbmVsOkxvYWRpbmdQYW5lbCA9IFZpZXdNYW5hZ2VyLkluc3RhbmNlLmdldFZpZXcoIExvYWRpbmdQYW5lbCApO1xyXG4gICAgICAgIGlmKCBsb2FkaW5ncGFuZWwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9sb2FkamQgKyBNYXRoLmNlaWwoIHZhbHVlLzEwMCp0aGlzLl9hbGxqZCApO1xyXG4gICAgICAgICAgICBsb2FkaW5ncGFuZWwuc2hvd1dvcmQoIHZhbHVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZGNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kID0gXCJ1aTovL2xlY3h5bmgyaXo5eTI2XCI7XHJcbiAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkVmlld1BhY2tCeU5hbWUoIFwibWFpblwiICk7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIExvYWRpbmdQYW5lbCApO1xyXG4gICAgICAgIC8vIEZZSERfU2RrLkluaXRTZGsoKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIE1haW5QYW5lbCApO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5paw55So5oi3RllIRF9TZGsuaXNuZXd1c2VyLS0tXCIsRllIRF9TZGsuaXNuZXd1c2VyKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld3VzZXIgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNfbmV3dXNlclwiKTtcclxuICAgICAgICBpZihGWUhEX1Nkay5pc25ld3VzZXIpe1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoNTAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuV2hpdGVVc2VyKXtcclxuICAgICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoR2lmdFZpZXcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaXNfbmV3dXNlclwiLFwiMVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlNldFNjZW5lKCk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuSW5pdEVmZmVjdCgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcclxuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtTa2luUGFuZWx9IGZyb20gXCIuLi9WaWV3L1NraW5QYW5lbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeVNraW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeVNraW5cIjtcclxuICAgIHN0YXRpYyBpbnN0YW5jZTpBZ2VuY3lTa2luO1xyXG4gICAgXHJcbiAgICBsb2NhbGRhdGE6YW55O1xyXG4gICAgcGlmdUFycjpBcnJheTxTa2luRGF0YT47XHJcbiAgICBwaWZ1RGljdDphbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICAgICAgQWdlbmN5U2tpbi5pbnN0YW5jZSA9IHRoaXM7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5sb2NhbGRhdGEgPSBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLkdldExvY2FsQ2FDaGVEYXRhKCBVc2VyRGF0YUluZm8uc2tpbiApO1xyXG4gICAgICAgIHZhciBwaWZ1RGF0YTphbnk7XHJcbiAgICAgICAgaWYoICF0aGlzLmxvY2FsZGF0YS5oYXNPd25Qcm9wZXJ0eSggXCJwaWZ1XCIgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGlmdURhdGEgPSB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl07XHJcbiAgICAgICAgdGhpcy5waWZ1QXJyID0gW107XHJcbiAgICAgICAgdGhpcy5waWZ1RGljdCA9IHt9O1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gUm9sZUNGRy52ZWMubGVuZ3RoO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IG51bXM7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBwaWZ1dm86U2tpbkRhdGEgPSBuZXcgU2tpbkRhdGE7XHJcbiAgICAgICAgICAgIHZhciBjZmc6Um9sZUNGRyA9IFJvbGVDRkcudmVjW2ldO1xyXG4gICAgICAgICAgICBwaWZ1dm8ucm9sZUNGRyA9IGNmZztcclxuICAgICAgICAgICAgdmFyIGQ6YW55ID0gcGlmdURhdGFbIGNmZy5pZCBdO1xyXG4gICAgICAgICAgICBpZiggZCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IE51bWJlciggZC5zdGF0ZSApO1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLmhhc251bSA9IE51bWJlciggZC5oYXNudW0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBwaWZ1dm8uaGFzbnVtID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggY2ZnLmdldFN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwaWZ1dm8uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucGlmdUFyci5wdXNoKCBwaWZ1dm8gKTtcclxuICAgICAgICAgICAgdGhpcy5waWZ1RGljdFsgcGlmdXZvLnJvbGVDRkcuaWQgXSA9IHBpZnV2bztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVudmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIFNraW5QYW5lbCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRSb2xlU3RhdGUoIGNmZzpSb2xlQ0ZHLHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcGlmdXZvOlNraW5EYXRhID0gdGhpcy5waWZ1RGljdFsgY2ZnLmlkIF07XHJcbiAgICAgICAgaWYoIHBpZnV2byApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwaWZ1dm8uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICB0aGlzLkFkZExvY2FsU2tpbkRhdGEocGlmdXZvLnJvbGVDRkcuaWQscGlmdXZvLnN0YXRlLHBpZnV2by5oYXNudW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgIEFkZExvY2FsU2tpbkRhdGEoIGlkOmFueSxzdGF0ZTpudW1iZXIsaGFzbnVtOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl1baWRdID0ge307XHJcbiAgICAgICAgdGhpcy5sb2NhbGRhdGFbXCJwaWZ1XCJdW2lkXVtcInN0YXRlXCJdID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5sb2NhbGRhdGFbXCJwaWZ1XCJdW2lkXVtcImhhc251bVwiXSA9IGhhc251bTtcclxuICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLkFkZERhdGEoIFVzZXJEYXRhSW5mby5za2luLHRoaXMubG9jYWxkYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSByZWN0OkxheWEuU3ByaXRlO1xyXG5cclxuXHRcdHByaXZhdGUgY3JlYXRlQ2FudHJhbFJlY3QoKTogdm9pZCB7XHJcblx0XHRcdHRoaXMucmVjdCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG5cdFx0XHR0aGlzLnJlY3QuZ3JhcGhpY3MuZHJhd1JlY3QoLTEwMCwgLTEwMCwgMjAwLCAyMDAsIFwiZ3JheVwiKTtcclxuXHRcdFx0TGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnJlY3QpO1xyXG5cclxuXHRcdFx0dGhpcy51cGRhdGVSZWN0UG9zKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cHJpdmF0ZSB1cGRhdGVSZWN0UG9zKCk6IHZvaWQge1xyXG5cdFx0XHR0aGlzLnJlY3QueCA9IExheWEuc3RhZ2Uud2lkdGggLyAyO1xyXG5cdFx0XHR0aGlzLnJlY3QueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcclxuXHRcdH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgR2FpblBpZnUoIF9za2luaXRlbTpTa2luRGF0YSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggX3NraW5pdGVtLnN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5Sb2xlRGF0YS5DaGFyYWN0ZXJJRCA9IF9za2luaXRlbS5yb2xlQ0ZHLmlkO1xyXG4gICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIF9za2luaXRlbS5yb2xlQ0ZHLmdldFN0YXRlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOi8v6KeG6aKR6I635Y+WXHJcbiAgICAgICAgICAgICAgICBfc2tpbml0ZW0uaGFzbnVtKys7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIF9za2luaXRlbS5yb2xlQ0ZHLm5lZWQgPD0gX3NraW5pdGVtLmhhc251bSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfc2tpbml0ZW0uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZExvY2FsU2tpbkRhdGEoX3NraW5pdGVtLnJvbGVDRkcuaWQsX3NraW5pdGVtLnN0YXRlLF9za2luaXRlbS5oYXNudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRGlzVHJpZ2dlciggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3ICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMjovL+mHkeW4gei0reS5sFxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLlJvbGVEYXRhLk1vbmV5ID49IF9za2luaXRlbS5yb2xlQ0ZHLm5lZWQgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb2xlRGF0YS5Nb25leSAtPSBfc2tpbml0ZW0ucm9sZUNGRy5uZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfc2tpbml0ZW0uc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFkZExvY2FsU2tpbkRhdGEoX3NraW5pdGVtLnJvbGVDRkcuaWQsX3NraW5pdGVtLnN0YXRlLF9za2luaXRlbS5oYXNudW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRpc1RyaWdnZXIoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIui0reS5sOaIkOWKn1wiICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLph5HluIHkuI3otrNcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDM6Ly/mtLvliqjojrflj5ZcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIFxyXG4gICAgcHVibGljIEdhaW5Ob0hhdmVTa2luKCk6QXJyYXk8U2tpbkRhdGE+XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxTa2luRGF0YT4gPSBbXTtcclxuICAgICAgICBmb3IoIHZhciBzIGluIHRoaXMucGlmdURpY3QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoICh0aGlzLnBpZnVEaWN0W3NdIGFzIFNraW5EYXRhKS5zdGF0ZSA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goIHRoaXMucGlmdURpY3Rbc10gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge1RyaWFsUGFuZWx9IGZyb20gXCIuLi9WaWV3L1RyaWFsUGFuZWxcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7UmVzb3VyY2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lJbkdhbWUgfSBmcm9tIFwiLi9BZ2VuY3lJbkdhbWVcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuaW1wb3J0IEVnZ1ZpZXcgZnJvbSBcIi4uL1ZpZXcvRWdnUGFuZWxcIjtcclxuaW1wb3J0IEVnZ1BhbmVsIGZyb20gXCIuLi9WaWV3L0VnZ1BhbmVsXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWdlbmN5VHJpYWwgZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeVRyaWFsXCI7XHJcblxyXG4gICAgaXNzaGl5b25naW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgIHByaXZhdGUgc3ByaXQ6TGF5YS5TcHJpdGU7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcGVudmlldyggYXJyOkFycmF5PFNraW5EYXRhPiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIFRyaWFsUGFuZWwsYXJyICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6YCA5Ye655WM6Z2iICovXHJcbiAgICBwdWJsaWMgRXhpdFBhbmVsKCBfZGF0YTpTa2luRGF0YSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmlzc2hpeW9uZ2luZyA9IF9kYXRhID8gdHJ1ZTpmYWxzZTtcclxuICAgICAgICB0aGlzLl9zZWxlY3R2byA9IF9kYXRhO1xyXG4gICAgICAgIGlmKCBfZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdXJsQXJyOkFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIHsgdXJsOkFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggX2RhdGEucm9sZUNGRy5uYW1lICl9ICk7XHJcbiAgICAgICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkZXIzREFyciggdXJsQXJyLHRoaXMsdGhpcy5TY2VuZUNyZWF0ZUNvbXBsZXRlLG51bGwsdHJ1ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBpZihBZ2VuY3lJbkdhbWUuZ2FtZW51bT4xKXtcclxuICAgICAgICAgICAgICAgIGxldCByYW5kb20gPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgICAgICAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5XaGl0ZVVzZXIgJiYgIHJhbmRvbTw9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuSGl0RWdnKXtcclxuICAgICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoRWdnUGFuZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIC8vIGVsc2V7XHJcbiAgICAgICAgICAgIC8vICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSgpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggVHJpYWxQYW5lbCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NlbGVjdHZvOlNraW5EYXRhO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3ByaXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3ByaXQgPSBuZXcgTGF5YS5TcHJpdGUoKTtcclxuICAgICAgICB0aGlzLnNwcml0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIDIwMCwgMjAwLCBcIiNEMjY5MUVcIik7XHJcbiAgICAgICAgdGhpcy5zcHJpdC5waXZvdCgxMDAsIDEwMCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3ByaXQueCA9IExheWEuc3RhZ2Uud2lkdGggLyAyO1xyXG4gICAgICAgIHRoaXMuc3ByaXQueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcclxuXHJcbiAgICAgICAgdGhpcy5zcHJpdC5zaXplKDIwMCwgMjAwKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ByaXQpO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnNwLm9uKEludGVyYWN0aW9uX0N1c3RvbUV2ZW50LlJPVEFURSwgdGhpcywgdGhpcy5vblJvdGF0ZSk7ICAgIC8vIOS+puWQrOiHquWumuS5ieeahOS6i+S7tlxyXG4gICAgICAgIC8vIHRoaXMuc3ByaXQub24oRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub25TcHJpdGVDbGljayk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblNwcml0ZUNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHJhbmRvbUFuZ2xlOiBudW1iZXIgPSBNYXRoLnJhbmRvbSgpICogMTgwO1xyXG4gICAgICAgIC8v5Y+R6YCB6Ieq5a6a5LmJ5LqL5Lu2XHJcbiAgICAgICAgLy8gdGhpcy5zcHJpdC5ldmVudChJbnRlcmFjdGlvbl9DdXN0b21FdmVudC5ST1RBVEUsIFtyYW5kb21BbmdsZV0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOinpuWPkeiHquWumuS5ieeahHJvdGF0ZeS6i+S7tlxyXG4gICAgcHJpdmF0ZSBvblJvdGF0ZShuZXdBbmdsZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy8gVHdlZW4udG8odGhpcy5zcCwgeyBcInJvdGF0aW9uXCI6IG5ld0FuZ2xlIH0sIDEwMDAsIEVhc2UuZWxhc3RpY091dCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHByaXZhdGUgU2NlbmVDcmVhdGVDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuQ3JlYXRlUGxheWVyKHRoaXMuX3NlbGVjdHZvLnJvbGVDRkcpO1xyXG4gICAgICAgIGlmKEFnZW5jeUluR2FtZS5nYW1lbnVtPjEpe1xyXG4gICAgICAgICAgICBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlcil7XHJcbiAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoRWdnUGFuZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVudGVyZ2FtZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW50ZXJnYW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVUZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0eHQ6IExheWEuVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcclxuICAgICAgICAvL+e7meaWh+acrOeahHRleHTlsZ7mgKfotYvlgLxcclxuICAgICAgICB0eHQudGV4dCA9IFwiTGF5YWJveOaYr+aAp+iDveacgOW8uueahEhUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRRmxhc2jlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVwiO1xyXG4gICAgICAgIC8v6K6+572u5a695bqm77yM6auY5bqm6Ieq5Yqo5Yy56YWNXHJcbiAgICAgICAgdHh0LndpZHRoID0gNDAwO1xyXG4gICAgICAgIC8v6Ieq5Yqo5o2i6KGMXHJcbiAgICAgICAgdHh0LndvcmRXcmFwID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdHh0LmFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICB0eHQuZm9udFNpemUgPSA0MDtcclxuICAgICAgICB0eHQuZm9udCA9IFwiTWljcm9zb2Z0IFlhSGVpXCI7XHJcbiAgICAgICAgdHh0LmNvbG9yID0gXCIjZmYwMDAwXCI7XHJcbiAgICAgICAgdHh0LmJvbGQgPSB0cnVlO1xyXG4gICAgICAgIHR4dC5sZWFkaW5nID0gNTtcclxuXHJcbiAgICAgICAgLy/orr7nva7mj4/ovrnlsZ7mgKdcclxuICAgICAgICB0eHQuc3Ryb2tlID0gMjtcclxuICAgICAgICB0eHQuc3Ryb2tlQ29sb3IgPSBcIiNmZmZmZmZcIjtcclxuXHJcbiAgICAgICAgdHh0LmJvcmRlckNvbG9yID0gXCIjMDBmZjAwXCJcclxuXHJcbiAgICAgICAgdHh0LnggPSAoTGF5YS5zdGFnZS53aWR0aCAtIHR4dC50ZXh0V2lkdGgpIC8gMjtcclxuICAgICAgICB0eHQueSA9IChMYXlhLnN0YWdlLmhlaWdodCAtIHR4dC50ZXh0SGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodHh0KTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICBcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVJbnB1dCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgaW5wdXRUZXh0OkxheWEuSW5wdXQgPSBuZXcgTGF5YS5JbnB1dCgpO1xyXG5cclxuICAgICAgICAvLyDnp7vliqjnq6/ovpPlhaXmj5DnpLrnrKZcclxuICAgICAgICBpbnB1dFRleHQucHJvbXB0ID0gXCJUeXBlIHNvbWUgd29yZC4uLlwiO1xyXG5cclxuICAgICAgICAvL+WkmuihjOi+k+WFpVxyXG4gICAgICAgIGlucHV0VGV4dC5tdWx0aWxpbmUgPSB0cnVlO1xyXG4gICAgICAgIGlucHV0VGV4dC53b3JkV3JhcCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlucHV0VGV4dC5zaXplKDM1MCwgMTAwKTtcclxuICAgICAgICBpbnB1dFRleHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSBpbnB1dFRleHQud2lkdGggPj4gMTtcclxuICAgICAgICBpbnB1dFRleHQueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC0gaW5wdXRUZXh0LmhlaWdodCA+PiAxO1xyXG4gICAgICAgIGlucHV0VGV4dC5wYWRkaW5nID0gWzIsIDIsIDIsIDJdO1xyXG5cclxuICAgICAgICBpbnB1dFRleHQuYmdDb2xvciA9IFwiIzY2NjY2NlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5mb250U2l6ZSA9IDIwO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGlucHV0VGV4dCk7XHJcbiAgICB9XHJcbiBcclxufSIsImltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi4vVGltZS9UaW1lc1RhbXBlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xyXG5pbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgTGV2ZWxDRkcgZnJvbSBcIi4uL0NGRy9MZXZlbENGR1wiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50LCBBY2NvdW50VXNlciB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi4vV1hTREsvTmV0d29ya01hbmFnZXJcIjtcclxuaW1wb3J0IHtVc2VySW5mb0V2ZW50fSBmcm9tIFwiLi4vRGF0YS9Vc2VySW5mb0V2ZW50XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW5jeVVzZXJNZXNzYWdlIGV4dGVuZHMgQWdlbmN5QmFzZUNvbnRyb2xcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeVVzZXJNZXNzYWdlXCI7XHJcblxyXG4gICAgcHJpdmF0ZSByb2xlaXNpbml0OmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG4gICAgXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICBcclxuICAgIH0gICBcclxuXHJcbiAgICAvKirliqDph5HluIEgKi9cclxuICAgIHB1YmxpYyBHb2xkVXAoIF9udW06bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUm9sZURhdGEuTW9uZXkgKz0gX251bTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVJbnB1dCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgaW5wdXRUZXh0OkxheWEuSW5wdXQgPSBuZXcgTGF5YS5JbnB1dCgpO1xyXG5cclxuICAgICAgICBpbnB1dFRleHQuc2l6ZSgzNTAsIDEwMCk7XHJcbiAgICAgICAgaW5wdXRUZXh0LnggPSBMYXlhLnN0YWdlLndpZHRoIC0gaW5wdXRUZXh0LndpZHRoID4+IDE7XHJcbiAgICAgICAgaW5wdXRUZXh0LnkgPSBMYXlhLnN0YWdlLmhlaWdodCAtIGlucHV0VGV4dC5oZWlnaHQgPj4gMTtcclxuXHJcbiAgICAgICAgaW5wdXRUZXh0LnRleHQgPSBcIui/meauteaWh+acrOS4jeWPr+e8lui+ke+8jOS9huWPr+WkjeWItlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5lZGl0YWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyDorr7nva7lrZfkvZPmoLflvI9cclxuICAgICAgICBpbnB1dFRleHQuYm9sZCA9IHRydWU7XHJcbiAgICAgICAgaW5wdXRUZXh0LmJnQ29sb3IgPSBcIiM2NjY2NjZcIjtcclxuICAgICAgICBpbnB1dFRleHQuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuICAgICAgICBpbnB1dFRleHQuZm9udFNpemUgPSAyMDtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChpbnB1dFRleHQpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5Sb2xlRGF0YS5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5yb2xlaXNpbml0ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVRleHQoKTpMYXlhLlRleHQge1xyXG4gICAgICAgIHZhciB0eHQ6TGF5YS5UZXh0ID0gbmV3IExheWEuVGV4dCgpO1xyXG5cclxuICAgICAgICB0eHQudGV4dCA9XHJcbiAgICAgICAgICAgIFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVxcblwiICtcclxuICAgICAgICAgICAgXCJMYXlhYm945pivSFRNTDXlvJXmk47mioDmnK/mj5DkvpvllYbkuI7kvJjnp4DnmoTmuLjmiI/lj5HooYzllYbvvIzpnaLlkJFBUy9KUy9UU+W8gOWPkeiAheaPkOS+m0hUTUw15byA5Y+R5oqA5pyv5pa55qGI77yBXFxuXCIgK1xyXG4gICAgICAgICAgICBcIkxheWFib3jmmK9IVE1MNeW8leaTjuaKgOacr+aPkOS+m+WVhuS4juS8mOengOeahOa4uOaIj+WPkeihjOWVhu+8jOmdouWQkUFTL0pTL1RT5byA5Y+R6ICF5o+Q5L6bSFRNTDXlvIDlj5HmioDmnK/mlrnmoYjvvIFcIjtcclxuXHJcbiAgICAgICAgdHh0LmJvcmRlckNvbG9yID0gXCIjRkZGRjAwXCI7XHJcblxyXG4gICAgICAgIHR4dC5zaXplKDMwMCwgNTApO1xyXG4gICAgICAgIHR4dC5mb250U2l6ZSA9IDIwO1xyXG4gICAgICAgIHR4dC5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHR4dCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0eHQ7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIC8qKuWNh+e6pyAqL1xyXG4gICAgcHVibGljIExldmVsVXAoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5Sb2xlRGF0YS5MZXZlbFVwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmJ1aWxkLnhsc3jjgIJcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVpbGRDRkdcclxue1xyXG5cdHB1YmxpYyBuYW1lOnN0cmluZzsvL+W7uuetkeWQjVxyXG5cdHB1YmxpYyBidWZmeDpudW1iZXI7Ly9idWZmeFxyXG5cdHB1YmxpYyBidWZmeTpudW1iZXI7Ly9idWZmeVxyXG5cdHB1YmxpYyBidWZmejpudW1iZXI7Ly9idWZmelxyXG5cdHB1YmxpYyB0aW1lOm51bWJlcjsvL+aMgee7reaXtumXtCjnp5IpXHJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xyXG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PEJ1aWxkQ0ZHPiA9IFtdO1xyXG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXHJcblx0e1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcclxuXHRcdHtcclxuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XHJcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XHJcblx0XHRcdGlmKEJ1aWxkQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06QnVpbGRDRkc9IG5ldyBCdWlsZENGRygpO1xyXG5cdFx0XHRpdGVtLm5hbWU9c2luZ2xlQXJyWzBdO1xyXG5cdFx0XHRpdGVtLmJ1ZmZ4PSBOdW1iZXIoc2luZ2xlQXJyWzFdKTtcclxuXHRcdFx0aXRlbS5idWZmeT0gTnVtYmVyKHNpbmdsZUFyclsyXSk7XHJcblx0XHRcdGl0ZW0uYnVmZno9IE51bWJlcihzaW5nbGVBcnJbM10pO1xyXG5cdFx0XHRpdGVtLnRpbWU9IE51bWJlcihzaW5nbGVBcnJbNF0pO1xyXG5cdFx0XHRCdWlsZENGRy5kaWN0W2l0ZW0ubmFtZV09aXRlbTtcclxuXHRcdFx0QnVpbGRDRkcudmVjLnB1c2goaXRlbSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXHJcbi8v6YWN572u5paH5Lu25ZCN56ew77yaZ2FtZS54bHN444CCXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDRkdcclxue1xyXG5cdHB1YmxpYyBpZDpudW1iZXI7Ly9pZFxyXG5cdHB1YmxpYyB2YWx1ZTpzdHJpbmc7Ly/lrZfmrrXlgLxcclxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XHJcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8R2FtZUNGRz4gPSBbXTtcclxuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXHJcblx0XHR7XHJcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xyXG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xyXG5cdFx0XHRpZihHYW1lQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06R2FtZUNGRz0gbmV3IEdhbWVDRkcoKTtcclxuXHRcdFx0aXRlbS5pZD0gTnVtYmVyKHNpbmdsZUFyclswXSk7XHJcblx0XHRcdGl0ZW0udmFsdWU9c2luZ2xlQXJyWzFdO1xyXG5cdFx0XHRHYW1lQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcclxuXHRcdFx0R2FtZUNGRy52ZWMucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy/lt6XlhbfnlJ/miJDvvIzor7fli7/kv67mlLnjgIJcclxuLy/phY3nva7mlofku7blkI3np7DvvJpsZXZlbC54bHN444CCXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExldmVsQ0ZHXHJcbntcclxuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v5YWz5Y2hXHJcblx0cHVibGljIHJvYWQ6c3RyaW5nOy8v5YWz5Y2h5qih5Z6LXHJcblx0cHVibGljIHJvbGVpbml0cG9zOmFueTsvL+eOqeWutuinkuiJsuWIneWni+ermeS9jVxyXG5cdHB1YmxpYyBucGM6YW55Oy8vbnBjXHJcblx0cHVibGljIGZpcnN0U2NlbmVwb3M6c3RyaW5nOy8v5Yid5aeL56ys5LiA5Liq5Zy65pmv5qih5Z6L55qE5L2N572uXHJcblx0cHVibGljIHdpbkdvbGQ6bnVtYmVyOy8v6YCa5YWz5oiQ5Yqf6I635b6X6YeR5biBXHJcblx0cHVibGljIGZhaWxHb2Q6c3RyaW5nOy8v6YCa5YWz5aSx6LSl6I635b6X6YeR5biBXHJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xyXG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PExldmVsQ0ZHPiA9IFtdO1xyXG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXHJcblx0e1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcclxuXHRcdHtcclxuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XHJcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XHJcblx0XHRcdGlmKExldmVsQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06TGV2ZWxDRkc9IG5ldyBMZXZlbENGRygpO1xyXG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcclxuXHRcdFx0aXRlbS5yb2FkPXNpbmdsZUFyclsxXTtcclxuXHRcdFx0aXRlbS5yb2xlaW5pdHBvcz0gSlNPTi5wYXJzZShzaW5nbGVBcnJbMl0pO1xyXG5cdFx0XHRpdGVtLm5wYz0gSlNPTi5wYXJzZShzaW5nbGVBcnJbM10pO1xyXG5cdFx0XHRpdGVtLmZpcnN0U2NlbmVwb3M9c2luZ2xlQXJyWzRdO1xyXG5cdFx0XHRpdGVtLndpbkdvbGQ9IE51bWJlcihzaW5nbGVBcnJbNV0pO1xyXG5cdFx0XHRpdGVtLmZhaWxHb2Q9c2luZ2xlQXJyWzZdO1xyXG5cdFx0XHRMZXZlbENGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XHJcblx0XHRcdExldmVsQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmxvdHRlcnkueGxzeOOAglxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb3R0ZXJ5Q0ZHXHJcbntcclxuXHRwdWJsaWMgaWQ6bnVtYmVyOy8vaWRcclxuXHRwdWJsaWMgdHlwZTpudW1iZXI7Ly/lsZ7mgKfnsbvlnotcclxuXHRwdWJsaWMgdmFsdWU6c3RyaW5nOy8v57G75Z6L5YC8XHJcblx0cHVibGljIHdlaWdodDpudW1iZXI7Ly/mnYPph41cclxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XHJcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8TG90dGVyeUNGRz4gPSBbXTtcclxuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXHJcblx0XHR7XHJcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xyXG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xyXG5cdFx0XHRpZihMb3R0ZXJ5Q0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06TG90dGVyeUNGRz0gbmV3IExvdHRlcnlDRkcoKTtcclxuXHRcdFx0aXRlbS5pZD0gTnVtYmVyKHNpbmdsZUFyclswXSk7XHJcblx0XHRcdGl0ZW0udHlwZT0gTnVtYmVyKHNpbmdsZUFyclsxXSk7XHJcblx0XHRcdGl0ZW0udmFsdWU9c2luZ2xlQXJyWzJdO1xyXG5cdFx0XHRpdGVtLndlaWdodD0gTnVtYmVyKHNpbmdsZUFyclszXSk7XHJcblx0XHRcdExvdHRlcnlDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xyXG5cdFx0XHRMb3R0ZXJ5Q0ZHLnZlYy5wdXNoKGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mm5wYy54bHN444CCXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5wY0NGR1xyXG57XHJcblx0cHVibGljIGlkOm51bWJlcjsvL+inkuiJsmlkXHJcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v6KeS6Imy6LWE5rqQ5ZCNXHJcblx0cHVibGljIHNwZWVkOm51bWJlcjsvL+inkuiJsuWJjei/m+enu+WKqOmAn+W6pijnsbMv56eSKVxyXG5cdHB1YmxpYyBmcm9udGp1bXA6YW55Oy8v5YmN6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIGxlZnRqdW1wOmFueTsvL+W3pui3s+WKoOmAn+W6plxyXG5cdHB1YmxpYyByaWdodGp1bXA6YW55Oy8v5Y+z6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIHVwY2xpbWI6bnVtYmVyOy8v54is5Y2H6YCf5bqmXHJcblx0cHVibGljIHNsaWRlY2xpbWI6YW55Oy8v5pac552A54is5qW86YCf5bqmXHJcblx0cHVibGljIGp1bXBfbGVmdDpudW1iZXI7Ly/lkJHlt6bot7Pot4PmnYPph41cclxuXHRwdWJsaWMganVtcF9yaWdodDpudW1iZXI7Ly/lkJHlj7Pot7PmnYPph41cclxuXHRwdWJsaWMgc3RhcnRfYWhlYWQ6bnVtYmVyOy8v55u06Lez5p2D6YeNXHJcblx0cHVibGljIGRpc3RhbmNlOm51bWJlcjsvL25wY+i2hei/h+eOqeWutui3neemu+WBnOatolxyXG5cdHB1YmxpYyBncmF2aXR5Om51bWJlcjsvL+mHjeWKm+WKoOmAn+W6plxyXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcclxuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxOcGNDRkc+ID0gW107XHJcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcclxuXHR7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxyXG5cdFx0e1xyXG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcclxuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcclxuXHRcdFx0aWYoTnBjQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06TnBjQ0ZHPSBuZXcgTnBjQ0ZHKCk7XHJcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xyXG5cdFx0XHRpdGVtLm5hbWU9c2luZ2xlQXJyWzFdO1xyXG5cdFx0XHRpdGVtLnNwZWVkPSBOdW1iZXIoc2luZ2xlQXJyWzJdKTtcclxuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcclxuXHRcdFx0aXRlbS5sZWZ0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNF0pO1xyXG5cdFx0XHRpdGVtLnJpZ2h0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNV0pO1xyXG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xyXG5cdFx0XHRpdGVtLnNsaWRlY2xpbWI9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzddKTtcclxuXHRcdFx0aXRlbS5qdW1wX2xlZnQ9IE51bWJlcihzaW5nbGVBcnJbOF0pO1xyXG5cdFx0XHRpdGVtLmp1bXBfcmlnaHQ9IE51bWJlcihzaW5nbGVBcnJbOV0pO1xyXG5cdFx0XHRpdGVtLnN0YXJ0X2FoZWFkPSBOdW1iZXIoc2luZ2xlQXJyWzEwXSk7XHJcblx0XHRcdGl0ZW0uZGlzdGFuY2U9IE51bWJlcihzaW5nbGVBcnJbMTFdKTtcclxuXHRcdFx0aXRlbS5ncmF2aXR5PSBOdW1iZXIoc2luZ2xlQXJyWzEyXSk7XHJcblx0XHRcdE5wY0NGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XHJcblx0XHRcdE5wY0NGRy52ZWMucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy/lt6XlhbfnlJ/miJDvvIzor7fli7/kv67mlLnjgIJcclxuLy/phY3nva7mlofku7blkI3np7DvvJpyb2xlLnhsc3jjgIJcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9sZUNGR1xyXG57XHJcblx0cHVibGljIGlkOm51bWJlcjsvL+inkuiJsmlkXHJcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v6KeS6Imy6LWE5rqQ5ZCNXHJcblx0cHVibGljIHNwZWVkOm51bWJlcjsvL+inkuiJsuWJjei/m+enu+WKqOmAn+W6pijnsbMv56eSKVxyXG5cdHB1YmxpYyBmcm9udGp1bXA6YW55Oy8v5YmN6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIGxlZnRqdW1wOmFueTsvL+W3pui3s+WKoOmAn+W6plxyXG5cdHB1YmxpYyByaWdodGp1bXA6YW55Oy8v5Y+z6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIHVwY2xpbWI6bnVtYmVyOy8v54is5Y2H6YCf5bqmXHJcblx0cHVibGljIHNsaWRlY2xpbWI6YW55Oy8v5pac552A54is5qW86YCf5bqmXHJcblx0cHVibGljIGdldFN0YXRlOm51bWJlcjsvL+iOt+WPluinkuiJsuaWueW8j1xyXG5cdHB1YmxpYyBuZWVkOm51bWJlcjsvL+iOt+WPluinkuiJsuiKsei0uVxyXG5cdHB1YmxpYyBpY29uOnN0cmluZzsvL+Wbvuagh2ljb25cclxuXHRwdWJsaWMgZ3Jhdml0eTpudW1iZXI7Ly/ph43lipvliqDpgJ/luqZcclxuXHRwdWJsaWMgcm9sZW5hbWU6c3RyaW5nOy8v6KeS6Imy5ZCN5a2XXHJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xyXG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PFJvbGVDRkc+ID0gW107XHJcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcclxuXHR7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxyXG5cdFx0e1xyXG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcclxuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcclxuXHRcdFx0aWYoUm9sZUNGRy5kaWN0W3NpbmdsZUFyclswXV0pY29udGludWU7XHJcblx0XHRcdHZhciBpdGVtOlJvbGVDRkc9IG5ldyBSb2xlQ0ZHKCk7XHJcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xyXG5cdFx0XHRpdGVtLm5hbWU9c2luZ2xlQXJyWzFdO1xyXG5cdFx0XHRpdGVtLnNwZWVkPSBOdW1iZXIoc2luZ2xlQXJyWzJdKTtcclxuXHRcdFx0aXRlbS5mcm9udGp1bXA9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzNdKTtcclxuXHRcdFx0aXRlbS5sZWZ0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNF0pO1xyXG5cdFx0XHRpdGVtLnJpZ2h0anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbNV0pO1xyXG5cdFx0XHRpdGVtLnVwY2xpbWI9IE51bWJlcihzaW5nbGVBcnJbNl0pO1xyXG5cdFx0XHRpdGVtLnNsaWRlY2xpbWI9IEpTT04ucGFyc2Uoc2luZ2xlQXJyWzddKTtcclxuXHRcdFx0aXRlbS5nZXRTdGF0ZT0gTnVtYmVyKHNpbmdsZUFycls4XSk7XHJcblx0XHRcdGl0ZW0ubmVlZD0gTnVtYmVyKHNpbmdsZUFycls5XSk7XHJcblx0XHRcdGl0ZW0uaWNvbj1zaW5nbGVBcnJbMTBdO1xyXG5cdFx0XHRpdGVtLmdyYXZpdHk9IE51bWJlcihzaW5nbGVBcnJbMTFdKTtcclxuXHRcdFx0aXRlbS5yb2xlbmFtZT1zaW5nbGVBcnJbMTJdO1xyXG5cdFx0XHRSb2xlQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcclxuXHRcdFx0Um9sZUNGRy52ZWMucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQge1JlY0NvbmZpZ3N9IGZyb20gXCIuL1JlY0NvbmZpZ3NcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEFzc2V0UGF0aFxyXG57XHJcbiAgICBzdGF0aWMgIHJlczogc3RyaW5nID0gXCJyZXMvXCI7XHJcbiAgICBzdGF0aWMgIHJlc291cmNlczpzdHJpbmcgPSBcInJlc291cmNlcy9cIjtcclxuICAgIC8vIGV4cG9ydCB2YXIgY29uZmlnczpzdHJpbmcgPSBcImNvbmZpZ3MvXCI7XHJcbiAgICBzdGF0aWMgIHVpOnN0cmluZyA9IFwidWkvXCI7XHJcbiAgICBzdGF0aWMgIHN1YnBhY2tzZ2V1aTpzdHJpbmcgPSBcImNoYXJhY3Rlci91aS9cIlxyXG4gICAgc3RhdGljICBtdXNpYzpzdHJpbmcgPSBcIm11c2ljL1wiO1xyXG4gICAgc3RhdGljICB2ZXJzaW9ucmFuZG9tOnN0cmluZyA9IFwiXCI7XHJcbiAgICBzdGF0aWMgIHByb3A6c3RyaW5nID0gXCJwcm9wL1wiXHJcbiAgICBzdGF0aWMgIHNraW5pY29uOnN0cmluZyA9IFwic2tpbmljb24vXCJcclxuXHJcbiAgICBzdGF0aWMgIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgQXNzZXRQYXRoLnZlcnNpb25yYW5kb20gPSBcIj92PVwiICsgTWF0aC5yYW5kb20oKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldHNvdW5kKCBpZDpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlc291cmNlcyArIEFzc2V0UGF0aC5tdXNpYyArIGlkICtcIi5tcDNcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgZ2V0UmVzQ29uZmlnKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXNvdXJjZXMgICsgXCJyZXNDb25maWcuanNvblwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXRDb25maWcoIGNvbmZpZ25hbWU6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXNvdXJjZXMgICsgY29uZmlnbmFtZSArXCIuYmluXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldDNEc2NlbmUoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgKyBBc3NldFBhdGgucHJvcCArIFwiQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxzXCIgKTtcclxuICAgIH0gXHJcblxyXG4gICAgc3RhdGljICBnZXQzRE1vZGVsKCBuYW1lOmFueSApOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICsgQXNzZXRQYXRoLnByb3AgKyBcIkNvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5saFwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXQzRFJvbGVNb2RlbCggbmFtZTphbnkgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlcyArIFwiY2hhcmFjdGVyL0NvbnZlbnRpb25hbC9cIiArIG5hbWUgKyBcIi5saFwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXRyb2xlaWNvbiggaWQ6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgICsgXCJza2luaWNvbi9cIiArIGlkICsgXCIucG5nXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldFZlcmlzb251cmwoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICBpZiggR2xvYmFsLmlzZGVidWcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgKyBcInZlcnNpb24uanNvblwiICkgKyBBc3NldFBhdGgudmVyc2lvbnJhbmRvbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgKyBcInZlcnNpb25cIiArIEdsb2JhbC5yZXNjb25maWdWZXJzaW9uICsgXCIuanNvblwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXRHYW1lVmVyc2lvbigpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBcImdhbWV2ZXJzaW9uLmpzb25cIiApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuiOt+WPluWMuemFjeS6uueJqeWktOWDj2ljb24gKi9cclxuICAgIHN0YXRpYyBwaXBlaWljb24gKGlkOnN0cmluZyk6c3RyaW5ne1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICArIFwiaWNvbi9cIiArIGlkICsgXCIucG5nXCIgKTtcclxuICAgIH1cclxuXHJcbiAgXHJcbn0gIiwiaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4vQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIFJlY0NvbmZpZ3MgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UmVjQ29uZmlncztcclxuXHJcbiAgICBwdWJsaWMgUmVzRGljOmFueTtcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5bey57uP5Yid5aeL5YyWXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgaW5pdGVkOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlJlY0NvbmZpZ3NcclxuICAgIHtcclxuICAgICAgICBpZiggUmVjQ29uZmlncy5pbnMgPT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlY0NvbmZpZ3MoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFJlY0NvbmZpZ3MuaW5zO1xyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgUmVjQ29uZmlncy5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUmVzRGljID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBsb2FkVUkoKTp2b2lkIHtcclxuICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFtcInJlcy90aHJlZURpbWVuL3VpL2J1dHRvbi5wbmdcIl0sIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24oKTp2b2lkIHtcclxuICAgICAgICAgICAgdmFyIGNoYW5nZUFjdGlvbkJ1dHRvbjpMYXlhLkJ1dHRvbiA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuQnV0dG9uKFwicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiLCBcIuato+W4uOaooeW8j1wiKSkgYXMgTGF5YS5CdXR0b247XHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5zaXplKDE2MCwgNDApO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWxCb2xkID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsU2l6ZSA9IDMwO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2l6ZUdyaWQgPSBcIjQsNCw0LDRcIjtcclxuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNjYWxlKExheWEuQnJvd3Nlci5waXhlbFJhdGlvLCBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIgLSBjaGFuZ2VBY3Rpb25CdXR0b24ud2lkdGggKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC0gMTAwICogTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8pO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgZnVuY3Rpb24oKTp2b2lkIHtcclxuICAgICAgICAgICAgICAgIGlmICgrK3RoaXMuY3VyU3RhdGVJbmRleCAlIDIgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ByaXRlM0QuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lU3ByaXRlM0QuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWwgPSBcIue9keagvOaooeW8j1wiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwcml0ZTNELmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lU3ByaXRlM0QuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsID0gXCLmraPluLjmqKHlvI9cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHB1YmxpYyBpbml0UmVjKCBfcmVzOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgIGlmKCBfcmVzICE9IG51bGwgJiYgIVJlY0NvbmZpZ3MuaW5pdGVkIClcclxuICAgICAgIHtcclxuICAgICAgICAgICAgUmVjQ29uZmlncy5pbml0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgZ3JvdXBzQXJyOkFycmF5PGFueT4gPSBfcmVzLmdyb3VwcztcclxuICAgICAgICAgICAgdmFyIHJlc291cmNlc0FycjpBcnJheTxhbnk+ID0gX3Jlcy5yZXNvdXJjZXM7XHJcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXNEaWN0OmFueSA9IHt9O1xyXG4gICAgICAgICAgICBmb3IoIHZhciBpdGVtIGluIHJlc291cmNlc0FyciApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlsZDphbnkgPSByZXNvdXJjZXNBcnJbaXRlbV07XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2goIGNoaWxkLnR5cGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJiaW5cIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuTG9hZGVyLkJVRkZFUjtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibHNcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuU2NlbmU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxoXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnR5cGUgPSBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsbVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZXNEaWN0W2NoaWxkLm5hbWVdID0gY2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yKCB2YXIgZ3JvdXB0eXBlIGluIGdyb3Vwc0FyciApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBncm91cGNoaWxkOmFueSA9IGdyb3Vwc0Fycltncm91cHR5cGVdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gZ3JvdXBjaGlsZC5rZXlzLnNwbGl0KCBcIixcIiApO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkQXJyOkFycmF5PGFueT4gPSBbXTtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlkc3RyO1xyXG4gICAgICAgICAgICAgICAgZm9yKCBjaGlkc3RyIGluIGFyciApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ckNoaWxkOnN0cmluZyA9IGFycltjaGlkc3RyXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggc3RyQ2hpbGQgIT0gXCJcIiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsczpzdHJpbmcgPSByZXNvdXJjZXNEaWN0W3N0ckNoaWxkXS51cmw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybHMgPSB1cmxzLnJlcGxhY2UoXCJyZXMvXCIsQXNzZXRQYXRoLnJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQXJyLnB1c2goIHsgdXJsOkdsb2JhbC5nZXRVcmwodXJscyksIHR5cGU6cmVzb3VyY2VzRGljdFtzdHJDaGlsZF0udHlwZSB9ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5SZXNEaWNbZ3JvdXBjaGlsZC5uYW1lXSA9IGNoaWxkQXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKEFzc2V0UGF0aC5nZXRSZXNDb25maWcoKSk7XHJcbiAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbn0iLCJpbXBvcnQgRXZlbnREaXNwYXRjaGVyPUxheWEuRXZlbnREaXNwYXRjaGVyO1xyXG5pbXBvcnQgU3ByaXRlM0QgPSBMYXlhLlNwcml0ZTNEO1xyXG5pbXBvcnQgVmVjdG9yMz1MYXlhLlZlY3RvcjM7XHJcbmV4cG9ydCBjbGFzcyBBc3NldFBhdGhcclxue1xyXG4gICBcclxuICAgIC8q57KS5a2Q54m55pWI5Zyw5Z2AKi9cclxuICAgIHN0YXRpYyBGeFByZWZhYnNQYXRoPVwicmVzL2NoYXJhY3Rlci9GWC9Db252ZW50aW9uYWwvRlgubGhcIjtcclxuXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBc3NldE1hbmFnZXJcclxue1xyXG5cclxuICAgIC8qKuaJgOacieWcsOWbviovXHJcbiAgICBzdGF0aWMgQWxsTWFwRGljOlNwcml0ZTNEW109bmV3IEFycmF5KCk7XHJcblxyXG5cclxuICAgIC8qKuWKoOi9vei1hOa6kCovXHJcbiAgICBzdGF0aWMgTG9hZEFzc2V0RnVuKGZ1bjpGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVzcGF0aHM6c3RyaW5nW10gPSBbXTtcclxuICAgICAgICByZXNwYXRocz1yZXNwYXRocy5jb25jYXQoQXNzZXRQYXRoLkZ4UHJlZmFic1BhdGgpO1xyXG4gICAgICAgIExheWEubG9hZGVyLmNyZWF0ZShyZXNwYXRocyxMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsKCk9PntcclxuXHJcbiAgICAgICAgICAgdmFyIFBsYXllclByZWZhYnM9TGF5YS5sb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5GeFByZWZhYnNQYXRoKSBhcyBTcHJpdGUzRDtcclxuICAgICAgICAgICBpZihQbGF5ZXJQcmVmYWJzKVxyXG4gICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7aTxQbGF5ZXJQcmVmYWJzLm51bUNoaWxkcmVuO2krKylcclxuICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB2YXIgYXNzZXQ9UGxheWVyUHJlZmFicy5nZXRDaGlsZEF0KGkpIGFzIFNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgICBhc3NldC5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuQWxsTWFwRGljLnB1c2goYXNzZXQpO1xyXG4gICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKEFzc2V0UGF0aC5GeFByZWZhYnNQYXRoKTtcclxuICAgICAgICAgICB9ZWxzZVxyXG4gICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJQb2xpY2VQcmVmYWJz5Li656m6XCIpO1xyXG4gICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICBpZihmdW4pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZ1bigpO1xyXG5cclxuICAgICAgICAgICAgfWVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJmdW7kuLrnqbpcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSkpO1xyXG5cclxuICAgIH1cclxuXHJcblxyXG5cclxufVxyXG5cclxuIiwiaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuXHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NvbnRyb2wgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6QXVkaW9Db250cm9sO1xyXG4gICAgcHJpdmF0ZSBfaXNiZ09wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIG9wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9pc0FsbE9wZW46Ym9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9ub3dCZ05hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX2lzUGxheWJnaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKlxyXG4gICAgICog5aOw6Z+z5byA5YWz5byV55So57Si5byVXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NvdW5kSW5kZXg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpBdWRpb0NvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggQXVkaW9Db250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQXVkaW9Db250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBBdWRpb0NvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLmF1dG9SZWxlYXNlU291bmQgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5hdXRvU3RvcE11c2ljID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdhbWVzb3VuZE9wZW4odmFsdWU6Ym9vbGVhbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9wZW4gPSB2YWx1ZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zb3VuZE11dGVkID0gIXZhbHVlO1xyXG4gICAgICAgIGlmKCB2YWx1ZSA9PSB0cnVlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kVm9sdW1lU2NhbGUgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpn7PmlYjmmK/lkKblvIDlkK9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBHZXRTb3VuZFN3aXRjaCgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgaXNiZ09wZW4odmFsdWU6Ym9vbGVhbilcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2JnT3BlbiA9IHZhbHVlO1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLm11c2ljTXV0ZWQgPSAhdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDog4zmma/pn7PkuZDmmK/lkKblvIDlkK9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc2JnT3BlbigpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNiZ09wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBpc0FsbE9wZW4oIHZhbHVlOmJvb2xlYW4gKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCB2YWx1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4LS07XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9zb3VuZEluZGV4IDwgMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLl9pc1BsYXliZ2luZyYmdGhpcy5fc291bmRJbmRleD09MCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxsT3BlbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEdhbWVWb2x1bWUoIDEgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGxheWJnU291bmQoIHRoaXMuX25vd0JnTmFtZSApO1xyXG4gICAgICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0FsbE9wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0FsbE9wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3NvdW5kSW5kZXggPCAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleCsrO1xyXG4gICAgICAgICAgICBpZih0aGlzLl9pc1BsYXliZ2luZylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wYmdTb3VuZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R2FtZVZvbHVtZSggMCApO1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLmkq3mlL7pn7PmlYhcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3BHYW1lU291bmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc3RvcEFsbFNvdW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLmiYDmnInlo7Dpn7NcclxuICAgICAqL1xyXG4gICAgcHVibGljIENsZWFyQWxsU09VTkQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdG9wR2FtZVNvdW5kKCk7XHJcbiAgICAgICAgdGhpcy5zdG9wYmdTb3VuZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pKt5pS+6IOM5pmv6Z+z5LmQXHJcbiAgICAgKiBAcGFyYW0gc291bmROYW1lIOWjsOmfs+WQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGxheWJnU291bmQoIHNvdW5kTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93QmdOYW1lID0gc291bmROYW1lO1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc0FsbE9wZW4gJiYgdGhpcy5fbm93QmdOYW1lICE9IFwiXCIgJiYgdGhpcy5fc291bmRJbmRleDw9IDAgJiYgIXRoaXMuX2lzUGxheWJnaW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIucGxheU11c2ljKCBBc3NldFBhdGguZ2V0c291bmQoIHRoaXMuX25vd0JnTmFtZSApICk7XHJcbiAgICAgICAgICAgIHRoaXMuYmdTb3VuZFZvbHVtZSA9IDAuNDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlgZzmraLog4zmma/pn7PkuZBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0b3BiZ1NvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzUGxheWJnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc3RvcE11c2ljKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiYDmnInpn7PkuZDmmK/lkKblvIDlkK9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBpc0FsbE9wZW4oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWxsT3BlbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9ruiDjOaZr+mfs+S5kOmfs+mHj1xyXG4gICAgICogQHBhcmFtIHZhbHVlIOmfs+mHj+iMg+WbtOS7jiAw77yI6Z2Z6Z+z77yJ6IezIDHvvIjmnIDlpKfpn7Pph4/vvInjgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBiZ1NvdW5kVm9sdW1lKCB2YWx1ZTpudW1iZXIgKVxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnNldE11c2ljVm9sdW1lKCB2YWx1ZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgYmdTb3VuZFZvbHVtZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBMYXlhLlNvdW5kTWFuYWdlci5tdXNpY1ZvbHVtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiuvue9ruiDjOaZr+mfs+S5kOmfs+mHj1xyXG4gICAgICogQHBhcmFtIHZhbHVlIOmfs+mHj+iMg+WbtOS7jiAw77yI6Z2Z6Z+z77yJ6IezIDHvvIjmnIDlpKfpn7Pph4/vvInjgIJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCBzb3VuZFZvbHVtZSggdmFsdWU6bnVtYmVyIClcclxuICAgIHtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zZXRTb3VuZFZvbHVtZSggdmFsdWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNvdW5kVm9sdW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExheWEuU291bmRNYW5hZ2VyLnNvdW5kVm9sdW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u5omA5pyJ5aOw6Z+z6Z+z6YePXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUg6Z+z6YeP6IyD5Zu05LuOIDDvvIjpnZnpn7PvvInoh7MgMe+8iOacgOWkp+mfs+mHj++8ieOAglxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0R2FtZVZvbHVtZSh2YWx1ZTpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmJnU291bmRWb2x1bWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnNvdW5kVm9sdW1lID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7pn7PmlYhcclxuICAgICAqIEBwYXJhbSBzb3VuZE5hbWUg6Z+z5pWI5ZCNXHJcbiAgICAgKiBAcGFyYW0gbG9vcCDmkq3mlL7mrKHmlbBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBsYXlHYW1lU291bmQoIHNvdW5kTmFtZTpzdHJpbmcsIGxvb3A6bnVtYmVyID0gMSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNBbGxPcGVuICYmIHNvdW5kTmFtZSAhPSBcIlwiICYmIExheWEuU291bmRNYW5hZ2VyLnNvdW5kVm9sdW1lICE9IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIucGxheVNvdW5kKCBBc3NldFBhdGguZ2V0c291bmQoIHNvdW5kTmFtZSApLGxvb3AgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuL1Jlc0RhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7U2tpbkl0ZW19IGZyb20gXCIuLi91dGlscy9Ta2luSXRlbVwiO1xyXG5pbXBvcnQgQ3BhRG93bnNWaWV3IGZyb20gXCIuLi9QdXNoL0NwYURvd25zVmlld1wiO1xyXG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi4vUHVzaC9DcGFJdGVtXCI7XHJcbmltcG9ydCBCYW9LdWFuR2FtZVZpZXcgZnJvbSBcIi4uL1B1c2gvQmFvS3VhbkdhbWVWaWV3XCI7XHJcbmltcG9ydCBTaGl3YW50dWlqaWFuVmlldyBmcm9tIFwiLi4vUHVzaC9TaGl3YW50dWlqaWFuVmlld1wiO1xyXG5pbXBvcnQgRnJpZW5kSW52aXRlVmlldyBmcm9tIFwiLi4vUHVzaC9GcmllbmRJbnZpdGVWaWV3XCI7XHJcbmltcG9ydCBUdWlqaWFuVmlldyBmcm9tIFwiLi4vUHVzaC9UdWlqaWFuVmlld1wiO1xyXG5pbXBvcnQgR2lmdFZpZXcgZnJvbSBcIi4uL1ZpZXcvR2lmdFZpZXdcIjtcclxuXHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBDb25uZWN0Q29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnu4Tku7bnu5HlrppcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDb25uZWN0Q29tcG9uZW50KCk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgLy9tYWluXHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMnB3bGsxYVwiLCBTa2luSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyN1wiLCBDcGFEb3duc1ZpZXcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MjhcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyOVwiLCBCYW9LdWFuR2FtZVZpZXcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmFcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyYlwiLCBTaGl3YW50dWlqaWFuVmlldyk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyY1wiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyZWtzYzIxXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJla3NjMjJcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyZVwiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgydW90dTZoXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIC8vIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJpcDYxNmxcIiwgR2lmdFZpZXcpO1xyXG4gICAgICAgIC8vIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrOGM1MmRcIiwgVHVpamlhblZpZXcpO1xyXG4gICAgICAgIC8vIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJrYWxyNmtcIixGcmllbmRJbnZpdGVWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIG1vdGlvbkNyb3NzOkJvb2xlYW4gPSBmYWxzZTtcclxuXHRwcml2YXRlIGJsZW5kVHlwZTpudW1iZXIgPSAwO1xyXG5cdHByaXZhdGUgbW90aW9uSW5kZXg6bnVtYmVyID0gMDtcclxuXHRwcml2YXRlIG1vdGlvbnM6QXJyYXk8c3RyaW5nPiA9IFtcInJ1blwiLCBcInJ1bl8yXCIsIFwiYXR0YWNrXCIsIFwiYXR0YWNrXzFcIiwgXCJhdHRhY2tfMlwiLCBcImRlYWRcIiwgXCJpZGxlXzJcIiwgXCJpZGxlXzNcIiwgXCJpZGxlXzRcIiwgXCJpZGxlNFwiLCBcInJlbG9hZFwiLCBcInJlcGxhY2VcIiwgXCJyZXBsYWNlXzJcIiwgXCJzdG9wXCJdO1xyXG5cdFxyXG4gICAgcHJpdmF0ZSBzY2VuZUxvYWRlZChzY2VuZTpMYXlhLlNjZW5lM0QpOnZvaWQge1xyXG4gICAgICAgIFxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoc2NlbmUpO1xyXG4gICAgICAgIHZhciBhbmltYXRvcjpMYXlhLkFuaW1hdG9yID0gc2NlbmUuZ2V0Q2hpbGRBdCgyKS5nZXRDb21wb25lbnQoTGF5YS5BbmltYXRvcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b24oMTAwLCAxMDAsIDE2MCwgMzAsIFwi5Yqo55S76L+H5rihOuWQplwiLCAyMCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcclxuICAgICAgICAgICAgdGhpcy5tb3Rpb25Dcm9zcyA9ICF0aGlzLm1vdGlvbkNyb3NzO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tb3Rpb25Dcm9zcylcclxuICAgICAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIuWKqOeUu+i/h+a4oTrmmK9cIjtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5Yqo55S76L+H5rihOuWQplwiO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uKDEwMCwgMTYwLCAxNjAsIDMwLCBcIua3t+WQiOaooeW8jzrlhajouqtcIiwgMjAsIGZ1bmN0aW9uKGU6TGF5YS5FdmVudCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHRoaXMuYmxlbmRUeXBlKys7ICAgXHJcbiAgICAgICAgICAgICh0aGlzLmJsZW5kVHlwZSA9PT0gMykgJiYgKHRoaXMuYmxlbmRUeXBlID0gMCk7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5ibGVuZFR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAwOiBcclxuICAgICAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIua3t+WQiOaooeW8jzrlhajouqtcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6IFxyXG4gICAgICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5re35ZCI5qih5byPOuS4iui6q1wiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMjogXHJcbiAgICAgICAgICAgICAgICAoZS50YXJnZXQgYXMgTGF5YS5CdXR0b24pLmxhYmVsID0gXCLmt7flkIjmqKHlvI865LiL6LqrXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuYWRkQnV0dG9uKDEwMCwgMjIwLCAyNjAsIDQwLCBcIuWIh+aNouWKqOS9nDphdHRhY2tfMlwiLCAyOCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmJsZW5kVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIDA6IFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW90aW9uQ3Jvc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5jcm9zc0ZhZGUodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAwLjIsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLmNyb3NzRmFkZSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDAuMiwgMSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLnBsYXkodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAwKTtcclxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5wbGF5KHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAxOiBcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vdGlvbkNyb3NzKVxyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLmNyb3NzRmFkZSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDAuMiwgMCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IucGxheSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMjogXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb3Rpb25Dcm9zcylcclxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5jcm9zc0ZhZGUodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAwLjIsIDEpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLnBsYXkodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAxKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIuWIh+aNouWKqOS9nDpcIiArIHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5tb3Rpb25JbmRleCsrO1xyXG4gICAgICAgICAgICAodGhpcy5tb3Rpb25JbmRleCA9PT0gdGhpcy5tb3Rpb25zLmxlbmd0aCkgJiYgKHRoaXMubW90aW9uSW5kZXggPSAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBhZGRCdXR0b24oeDpudW1iZXIsIHk6bnVtYmVyLCB3aWR0aDpudW1iZXIsIGhlaWdodDpudW1iZXIsIHRleHQ6c3RyaW5nLCBzaXplOm51bWJlciwgY2xpY2tGdW46RnVuY3Rpb24pOnZvaWQge1xyXG4gICAgICAgIHZhciB0aGlzcyA9IHRoaXM7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIubG9hZChbXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCJdLCBMYXlhLkhhbmRsZXIuY3JlYXRlKG51bGwsIGZ1bmN0aW9uKCk6dm9pZCB7XHJcbiAgICAgICAgdmFyIGNoYW5nZUFjdGlvbkJ1dHRvbjpMYXlhLkJ1dHRvbiA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuQnV0dG9uKFwicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiLCB0ZXh0KSkgYXMgTGF5YS5CdXR0b247XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsQm9sZCA9IHRydWU7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLmxhYmVsU2l6ZSA9IHNpemU7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNpemVHcmlkID0gXCI0LDQsNCw0XCI7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNjYWxlKExheWEuQnJvd3Nlci5waXhlbFJhdGlvLCBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnBvcyh4LCB5KTtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ub24oTGF5YS5FdmVudC5DTElDSywgdGhpc3MsIGNsaWNrRnVuKTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOaVsOaNrue7keWumlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbm5uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuQ29ubmVjdEZhaXJ5Z3VpKCk7XHJcbiAgICAgICAgdGhpcy5Db25uZWN0Q29tcG9uZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeahhuaetueahOe7keWumlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbm5lY3RGYWlyeWd1aSgpOiB2b2lkIHtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nYW1lTG9hZGVyTWFuYWdlciA9IFJlc291cmNlQ29udHJvbC5JbnN0YW5jZTtcclxuICAgICAgICAvL+eJueaViOe7keWumiggdXJsIOe7keWumue7hOWQje+8jOWPquacieWFrOWFseeJueaViOmcgOimgee7keWumiApIFwidWk6Ly9mcXBneHIxa2w2bXcwXCI6XCJlZmZlY3QxXCJcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5nYW1lRWZmZWN0RGljdCA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG59IiwiaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7IFRpbWVVdGlscyB9IGZyb20gXCIuLi9UaW1lL1RpbWVVdGlsc1wiO1xyXG5pbXBvcnQge1VzZXJEYXRhSW5mb30gZnJvbSBcIi4uL0RhdGEvVXNlckRhdGFJbmZvXCI7XHJcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uL1RpbWUvVGltZXNUYW1wZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlQ29udHJvbHtcclxuICAgIHB1YmxpYyBzdGF0aWMgRnJlc2g6Ym9vbGVhbjtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOkRhdGVDb250cm9sO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBEYXRlQ29udHJvbC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0ICBJbnN0YW5jZSgpOkRhdGVDb250cm9sXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIERhdGVDb250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIERhdGVDb250cm9sLmlucztcclxuICAgIH1cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBsb2FkVUkoKTp2b2lkIHtcclxuICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFtcInJlcy90aHJlZURpbWVuL3VpL2J1dHRvbi5wbmdcIl0sIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24oKTp2b2lkIHtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuQnV0dG9uKFwicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiLCBcIuWFs+mXrUhEUlwiKSkgYXMgTGF5YS5CdXR0b247XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zaXplKDIwMCwgNDApO1xyXG4gICAgICAgICAgICBidXR0b24ubGFiZWxCb2xkID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnV0dG9uLmxhYmVsU2l6ZSA9IDMwO1xyXG4gICAgICAgICAgICBidXR0b24uc2l6ZUdyaWQgPSBcIjQsNCw0LDRcIjtcclxuICAgICAgICAgICAgYnV0dG9uLnNjYWxlKExheWEuQnJvd3Nlci5waXhlbFJhdGlvLCBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIgLSBidXR0b24ud2lkdGggKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC0gNjAgKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCBmdW5jdGlvbigpOnZvaWQge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuYWJsZUhEUjpCb29sZWFuID0gdGhpcy5jYW1lcmEuZW5hYmxlSERSO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVuYWJsZUhEUilcclxuICAgICAgICAgICAgICAgICAgICBidXR0b24ubGFiZWwgPSBcIuW8gOWQr0hEUlwiO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5sYWJlbCA9IFwi5YWz6ZetSERSXCI7XHJcblx0XHRcdFx0XHR0aGlzLmNhbWVyYS5lbmFibGVIRFIgPSAhZW5hYmxlSERSO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIFNldFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxhc3RkYXk6c3RyaW5nID0gTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRzdHIoIFVzZXJEYXRhSW5mby5sYXN0RGF5IClcclxuICAgICAgICB2YXIgbm93ZGF5OnN0cmluZyA9IFRpbWVVdGlscy5mb3JtYXRZZWFyTW9udGhEYXRlMSggVGltZXNUYW1wZXIuSW5zdGFuY2Uuc2VydmVyVGltZSApO1xyXG4gICAgICAgIGlmKCBsYXN0ZGF5ICE9IG5vd2RheSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmxhc3REYXksbm93ZGF5ICk7XHJcbiAgICAgICAgICAgIERhdGVDb250cm9sLkZyZXNoID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgRGF0ZUNvbnRyb2wuRnJlc2ggPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBKb3lzdGlja01vZHVsZSB9IGZyb20gXCIuLi9Kb3lzdGlja01vZHVsZVwiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7TnBjU2NyaXB0fSBmcm9tIFwiLi4vR2FtZS9OcGNTY3JpcHRcIjtcclxuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgR2FtZUNGRyBmcm9tIFwiLi4vQ0ZHL0dhbWVDRkdcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcclxuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcclxuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge0FnZW5jeVRyaWFsfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVRyaWFsXCI7XHJcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lTa2luXCI7XHJcbmltcG9ydCB7U2tpbkRhdGF9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XHJcbmltcG9ydCB7IERpc1BhdGNoZXJPbiB9IGZyb20gXCIuLi91dGlscy9EaXNQYXRjaGVyT25cIjtcclxuaW1wb3J0IHsgUmVjb3JkTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9SZWNvcmRNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR2FtZVN0YXRlQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6R2FtZVN0YXRlQ29udHJvbDtcclxuXHJcbiAgICBwcml2YXRlIF9qb3lzdGlja01vZHVsZTpKb3lzdGlja01vZHVsZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIDA65pyq5byA5aeL77yMMe+8mua4uOaIj+S4re+8jDLvvJrmmoLlgZzkuK1cclxuICAgICAqL1xyXG4gICAgbm93R2FtZVN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfemh1YW54aWFuZ2JlaXNodTpudW1iZXIgPSAwO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBHYW1lU3RhdGVDb250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpHYW1lU3RhdGVDb250cm9sXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIEdhbWVTdGF0ZUNvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHYW1lU3RhdGVDb250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBHYW1lU3RhdGVDb250cm9sLmlucztcclxuICAgIH0gICBcclxuXHJcbiAgICBwcml2YXRlIF9odWFkb25nU3BlZWRYOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9odWFkb25nQ2xpbWJTcGVlZFg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgZW5kR2FtZVBsYXllckFycjpBcnJheTxzdHJpbmc+ID0gW107XHJcblxyXG4gICAgcHVibGljIGluaXQoICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2h1YWRvbmdTcGVlZFggPSBOdW1iZXIoR2FtZUNGRy5kaWN0WzRdLnZhbHVlKTtcclxuICAgICAgICB0aGlzLl9odWFkb25nQ2xpbWJTcGVlZFggPSBOdW1iZXIoR2FtZUNGRy5kaWN0WzVdLnZhbHVlKTtcclxuICAgICAgICBpZiggR2FtZUNGRy5kaWN0WzddIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3podWFueGlhbmdiZWlzaHUgPSBOdW1iZXIoIEdhbWVDRkcuZGljdFs3XS52YWx1ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl96aHVhbnhpYW5nYmVpc2h1ID0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCBHYW1lU3RhdGUubG9zZSx0aGlzLHRoaXMuZW5kR2FtZSk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLmVuZCx0aGlzLHRoaXMuZW5kR2FtZSApO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5ucGNlbmQsdGhpcyx0aGlzLm5wY2VuZEdhbWVIYW5kbGVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBucGNlbmRHYW1lSGFuZGxlciggc3RyOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmVuZEdhbWVQbGF5ZXJBcnIucHVzaCggc3RyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldENsaWNrUGFuZWwoIHBhbmVsOmZhaXJ5Z3VpLkdMb2FkZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fam95c3RpY2tNb2R1bGUgPSBuZXcgSm95c3RpY2tNb2R1bGUocGFuZWwpO1xyXG4gICAgICAgIHRoaXMuX2pveXN0aWNrTW9kdWxlLnNldEV2ZW50Q2FsbGJhY2soIHRoaXMsdGhpcy5vbmRvd25mdW4sdGhpcy5vbm1vdmVmdW4sdGhpcy5vbnVwZnVuICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNuZWVkU2h1bnlpWDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9ub3dUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG9uZG93bmZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sYXN0QW5nbGUgPSAwO1xyXG4gICAgICAgIHRoaXMuX25vd1RpbWUgPSBMYXlhLkJyb3dzZXIubm93KCkvMTAwMDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2xhc3RBbmdsZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBvbm1vdmVmdW4oIG9mZnNldFg6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLm5vd0dhbWVTdGF0ZSA9PSAxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkaXNBbmdsZTpudW1iZXIgPSB0aGlzLl9qb3lzdGlja01vZHVsZS5hbmdsZSAtIHRoaXMuX2xhc3RBbmdsZTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdEFuZ2xlID0gdGhpcy5fam95c3RpY2tNb2R1bGUuYW5nbGU7XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5pc2Nhcm1hbnBjIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgKFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3RbXCJucGNfMFwiXSBhcyBOcGNTY3JpcHQpLkpveShvZmZzZXRYID4gMCA/IHRoaXMuX2h1YWRvbmdTcGVlZFg6LXRoaXMuX2h1YWRvbmdTcGVlZFgsZGlzQW5nbGUqdGhpcy5femh1YW54aWFuZ2JlaXNodSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuUGxheWVyU2NyaXB0LkpveSggb2Zmc2V0WCA+IDAgPyB0aGlzLl9odWFkb25nU3BlZWRYOi10aGlzLl9odWFkb25nU3BlZWRYLG9mZnNldFggPiAwID8gdGhpcy5faHVhZG9uZ0NsaW1iU3BlZWRYOi10aGlzLl9odWFkb25nQ2xpbWJTcGVlZFgsZGlzQW5nbGUqdGhpcy5femh1YW54aWFuZ2JlaXNodSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb251cGZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIuaXNjYXJtYW5wYyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAoUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdFtcIm5wY18wXCJdIGFzIE5wY1NjcmlwdCkuSm95KDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLm5vd0dhbWVTdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLlBsYXllclNjcmlwdC5Kb3koIDAsMCwwICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG5vd01pbmdDaTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbnVtczpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfYWxsOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgIHZhciBucGNkaWN0OmFueSA9IFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Q7XHJcbiAgICAgICAgICAgIHRoaXMuX251bXMgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLl9hbGwgPSAwO1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIG5wY3NwOk5wY1NjcmlwdDtcclxuICAgICAgICAgICAgZm9yKCBzIGluIG5wY2RpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBucGNzcCA9IG5wY2RpY3Rbc107XHJcbiAgICAgICAgICAgICAgICBpZiggbnBjc3AuZ2V0QWN0aW9uKCkgPT0gMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IDwgbnBjc3AuZ2V0UG9zdGlvbigpLnogKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbnVtcysrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGwgKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5ub3dNaW5nQ2kgPSB0aGlzLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoICsgKCggdGhpcy5fYWxsICsgMSApIC0gdGhpcy5fbnVtcyk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLnR4dF9taW5nY2kudGV4dCA9IFwi56ysXCIgKyB0aGlzLm5vd01pbmdDaSArIFwi5ZCNXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGFydEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gKFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSkuUm9sZURhdGE7XHJcbiAgICAgICAgdmFyIGFnZW5jeXNraW46QWdlbmN5U2tpbiA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApO1xyXG4gICAgICAgIHZhciBub2hhc3NraW5BcnI6QXJyYXk8U2tpbkRhdGE+ID0gYWdlbmN5c2tpbi5HYWluTm9IYXZlU2tpbigpO1xyXG4gICAgICAgIGlmKCBub2hhc3NraW5BcnIubGVuZ3RoID09IDAgIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZW50ZXJnYW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICggUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lUcmlhbCApIGFzIEFnZW5jeVRyaWFsICkub3BlbnZpZXcobm9oYXNza2luQXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVudGVyZ2FtZShqaWFzdT8pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0YXJ0KCk7XHJcbiAgICAgICAgdGhpcy5ub3dNaW5nQ2kgPSAwO1xyXG4gICAgICAgIHRoaXMuZW5kR2FtZVBsYXllckFyci5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdGhpcy51cGRhdGUoIDUwMCApO1xyXG4gICAgICAgIGlmKGppYXN1KXtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnN0YXJ0LGppYXN1ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5zdGFydCApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheWJnU291bmQoXCJiZ21cIik7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLkuLvnlYzpnaLngrnlh7vlvIDlp4vmuLjmiI8uLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0b3BHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMjtcclxuICAgICAgICB0aGlzLm9udXBmdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW5kR2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIuamlhbnRvdUFyciAmJiBQcm9wTWFuYWdlci5qaWFudG91QXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxMYXlhLk1lc2hTcHJpdGUzRD4gPSBQcm9wTWFuYWdlci5qaWFudG91QXJyO1xyXG4gICAgICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9YXJyLmxlbmd0aC0xO2kgPj0wO2ktLSAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcnJbaV0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuamlhbnRvdUFyci5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMubm93R2FtZVN0YXRlID0gMDtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdDtcclxuICAgICAgICBpZiggbnBjZGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIG5wY2RpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAobnBjZGljdFtzXSBhcyBOcGNTY3JpcHQpLnN0b3AoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9udXBmdW4oKTtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2Uuc3RvcGJnU291bmQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgTGF5b3V0Q29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpMYXlvdXRDb250cm9sO1xyXG4gICAgcHJpdmF0ZSBfdWlsYXllclpvcmRlcjpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfdXB1aWxheWVyWm9yZGVyOm51bWJlciA9IDIwMDtcclxuICAgIHByaXZhdGUgX3RpcHNsYXllclpvcmRlcjpudW1iZXIgPSAxMDAwO1xyXG4gICAgcHJpdmF0ZSBfZ3VpZGVsYXllclpvcmRlcjpudW1iZXIgPSA2MDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxglxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVpTGF5ZXI6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcbiAgICBcclxuICAgICAvKipcclxuICAgICAgKiDmnIDlrprlsYJcclxuICAgICAgKi9cclxuICAgIHB1YmxpYyB0b3BMYXllcjpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDog4zmma/lsYIoIOaIluiAhTNE5Zy65pmv5bGCIClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJhY2tncm91bmQ6ZmFpcnlndWkuR0NvbXBvbmVudCA9IG5ldyBmYWlyeWd1aS5HQ29tcG9uZW50KCk7XHJcblxyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgTGF5b3V0Q29udHJvbC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6TGF5b3V0Q29udHJvbFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlvdXRDb250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGF5b3V0Q29udHJvbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTGF5b3V0Q29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgQWRkTGF5ZXJCeU5hbWUoIGl0ZW12aWV3OmZhaXJ5Z3VpLkdPYmplY3QsbGF5ZXI6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKGxheWVyID09IExheU9VVC5CRyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLmJhY2tncm91bmQuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYobGF5ZXIgPT0gTGF5T1VULlVJKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdWlsYXllclpvcmRlcisrO1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLnVpTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgPSB0aGlzLl91aWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCBsYXllciA9PSBMYXlPVVQuVUlUb3AgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdXB1aWxheWVyWm9yZGVyKys7XHJcbiAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UudWlMYXllci5hZGRDaGlsZCggaXRlbXZpZXcgKTtcclxuICAgICAgICAgICAgaXRlbXZpZXcuc29ydGluZ09yZGVyICA9IHRoaXMuX3VwdWlsYXllclpvcmRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihsYXllciA9PSBMYXlPVVQuVElQKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gR2FtZUxheWVyTWFuYWdlci5JbnN0YW5jZS50aXBzTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLl90aXBzbGF5ZXJab3JkZXIrKztcclxuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS51aUxheWVyLmFkZENoaWxkKCBpdGVtdmlldyApO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgID0gdGhpcy5fdGlwc2xheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCBsYXllciA9PSBMYXlPVVQuR1VJREUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3VpZGVsYXllclpvcmRlcisrO1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLnVpTGF5ZXIuYWRkQ2hpbGQoaXRlbXZpZXcpO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgID0gdGhpcy5fZ3VpZGVsYXllclpvcmRlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8v5Yid5aeL5YyW5bGC57qnXHJcblx0cHVibGljIGluaXRsYXllcigpOnZvaWRcclxuXHR7XHJcblx0XHRHbG9iYWwuc3RhZ2UuYWRkQ2hpbGQoIGZhaXJ5Z3VpLkdSb290Lmluc3QuZGlzcGxheU9iamVjdCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMuYmFja2dyb3VuZCApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudWlMYXllciApO1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuYWRkQ2hpbGQoIHRoaXMudG9wTGF5ZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHNjZW5lOkxheWEuU2NlbmUzRDtcclxuICAgIHByaXZhdGUgdG1wVmVjdG9yOkxheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgbWF0MTpMYXlhLkJsaW5uUGhvbmdNYXRlcmlhbDsgXHJcbiAgICBwcml2YXRlIG1lc2gxOkxheWEuTWVzaDtcclxuICAgIHByaXZhdGUgbWVzaDI6TGF5YS5NZXNoO1xyXG4gICAgcHVibGljIGFkZEhvcml6b250YWxCb3goeDpudW1iZXIsIHk6bnVtYmVyLCB6Om51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBib3g6TGF5YS5NZXNoU3ByaXRlM0QgPSB0aGlzLnNjZW5lLmFkZENoaWxkKG5ldyBMYXlhLk1lc2hTcHJpdGUzRCh0aGlzLm1lc2gyKSkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5tYXRlcmlhbCA9IHRoaXMubWF0MTtcclxuICAgICAgICBib3gubWVzaFJlbmRlcmVyLmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50bXBWZWN0b3Iuc2V0VmFsdWUoeCwgeSwgeik7XHJcbiAgICAgICAgYm94LnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMudG1wVmVjdG9yO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciByaWdpZEJvZHk6TGF5YS5SaWdpZGJvZHkzRCA9IGJveC5hZGRDb21wb25lbnQoTGF5YS5SaWdpZGJvZHkzRCkgYXMgTGF5YS5SaWdpZGJvZHkzRDtcclxuICAgICAgICByaWdpZEJvZHkubWFzcyA9IDEwO1xyXG4gICAgICAgIHJpZ2lkQm9keS5mcmljdGlvbiA9IDEuMDtcclxuICAgICAgICByaWdpZEJvZHkucmVzdGl0dXRpb24gPSAwLjI7XHJcbiAgICAgICAgdmFyIGJveFNoYXBlOkxheWEuQm94Q29sbGlkZXJTaGFwZSA9IG5ldyBMYXlhLkJveENvbGxpZGVyU2hhcGUoMiwgMC4zMywgMC41KTtcclxuICAgICAgICByaWdpZEJvZHkuY29sbGlkZXJTaGFwZSA9IGJveFNoYXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgQ2xlYXJMYXllckJ5TmFtZSggbGF5ZXI6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggbGF5ZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBMYXlPVVQuVUk6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91aWxheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdWlsYXllclpvcmRlciA8IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMYXlPVVQuVUlUb3A6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cHVpbGF5ZXJab3JkZXItLTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl91cHVpbGF5ZXJab3JkZXIgPCAyMDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwdWlsYXllclpvcmRlciA9IDIwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5T1VULlRJUDpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlci0tO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RpcHNsYXllclpvcmRlciA8IDEwMDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlciA9IDEwMDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIExheU9VVC5HVUlERTpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlci0tO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RpcHNsYXllclpvcmRlciA8IDYwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gNjAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjYW1lcmE6TGF5YS5DYW1lcmE7XHJcbiAgICBwcml2YXRlIGxheWFNb25rZXkzRDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBsYXlhTW9ua2V5MkQ6TGF5YS5JbWFnZTtcclxuICAgIHByaXZhdGUgX3Bvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBfb3V0UG9zID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBzY2FsZURlbHRhOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNvbXBsZXRlKCkge1xyXG4gICAgICAgIC8v5Yqg6L295LiJ57u05Zyw6Z2iXHJcbiAgICAgICAgdmFyIGdyaWQgPSB0aGlzLnNjZW5lLmFkZENoaWxkKExheWEuTG9hZGVyLmdldFJlcyhcInJlcy90aHJlZURpbWVuL3N0YXRpY01vZGVsL2dyaWQvcGxhbmUubGhcIikpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgLy/liqDovb3kuoznu7TnjLTlrZBcclxuICAgICAgICB0aGlzLmxheWFNb25rZXkyRCA9IExheWEuc3RhZ2UuYWRkQ2hpbGQobmV3IExheWEuSW1hZ2UoXCJyZXMvdGhyZWVEaW1lbi9tb25rZXkucG5nXCIpKSBhcyBMYXlhLkltYWdlO1xyXG4gICAgICAgIC8v5byA5ZCv5a6a5pe25Zmo5b6q546vXHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgdGhpcy5hbmltYXRlKTtcclxuICAgIH1cclxuXHRcdFxyXG5cdHByaXZhdGUgYW5pbWF0ZSgpIHtcclxuICAgICAgICAvL+WPmOaNouS9jee9rlxyXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uLnggPSBNYXRoLnNpbih0aGlzLnNjYWxlRGVsdGEgKz0gMC4wMSk7XHJcbiAgICAgICAgLy/orqHnrpfkvY3nva5cclxuICAgICAgICB0aGlzLmNhbWVyYS52aWV3cG9ydC5wcm9qZWN0KHRoaXMuX3Bvc2l0aW9uLCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uVmlld01hdHJpeCwgdGhpcy5fb3V0UG9zKTtcclxuICAgICAgICB0aGlzLmxheWFNb25rZXkyRC5wb3ModGhpcy5fb3V0UG9zLnggLyBMYXlhLnN0YWdlLmNsaWVudFNjYWxlWCwgdGhpcy5fb3V0UG9zLnkgLyBMYXlhLnN0YWdlLmNsaWVudFNjYWxlWSk7XHJcbiAgICB9XHRcclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbn0iLCJpbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4uL1dYU0RLL3Bpbmd0YWl1dGlsc1wiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7UGxhdGZyb21UeXBlfSBmcm9tIFwiLi4vV1hTREsvUGxhdGZyb21UeXBlXCI7XHJcblxyXG4vKlxyXG4qIOacrOWcsOaVsOaNrue8k+WtmOeuoeeQhuWZqFxyXG4qL1xyXG5leHBvcnQgY2xhc3MgTG9jYWxEYXRhQ29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyIHtcclxuICAgIHByaXZhdGUgc3RhdGljIGluczogTG9jYWxEYXRhQ29udHJvbDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBMb2NhbERhdGFDb250cm9sIHtcclxuICAgICAgICBpZiAoTG9jYWxEYXRhQ29udHJvbC5pbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsRGF0YUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIExvY2FsRGF0YUNvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOacrOWcsOe8k+WtmOaVsOaNriBvYmplY3RcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGREYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZExvY2FsRGF0YShrZXksIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBvYmplY3RcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPYmooa2V5OiBzdHJpbmcpOiBhbnkgXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0TG9jYWxDYUNoZURhdGEoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOacrOWcsOe8k+WtmOaVsOaNriBzdHJpbmdcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRzdHIoa2V5OiBzdHJpbmcsIHZhbHVlOnN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkQ2FjaGVTdHIoa2V5LCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZG51bSgga2V5OnN0cmluZyx2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZGRDYWNoZVN0cihrZXksIHZhbHVlLnRvU3RyaW5nKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw57yT5a2Y5pWw5o2uIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldHN0cihrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluacrOWcsOe8k+WtmOaVsOaNriBudW1iZXJcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRudW0oIGtleTpzdHJpbmcgKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMuZ2V0Q2FjaGVzdHIoa2V5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbmjIflrprmnKzlnLDnvJPlrZjmlbDmja5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVDYWNoZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3Zlc2VsZWN0Q2FjaGUoa2V5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhuaJgOacieacrOWcsOe8k+WtmOaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbENhY2hlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFkZExvY2FsRGF0YShrZXksIHZhbHVlKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcmFnZVN5bmNXWChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldExvY2FsQ2FDaGVEYXRhKGtleTogc3RyaW5nKTogYW55IFxyXG4gICAge1xyXG4gICAgICAgIHZhciBvYmo6YW55O1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgb2JqID0gdGhpcy5nZXRTdG9yYWdlU3luY1dYKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgb2JqID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SlNPTihrZXkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoICFvYmogKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgb2JqID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZENhY2hlU3RyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RvcmFnZVN5bmNXWChrZXksIHZhbHVlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENhY2hlc3RyKGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIjBcIjtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRTdG9yYWdlU3luY1dYKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBzdHIgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RyID09IG51bGwgfHwgc3RyID09IFwiXCIpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3RyID0gXCIwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZXNlbGVjdENhY2hlKGtleTogc3RyaW5nKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3RvcmFnZVdYKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBjbGVhckFsbENhY2hlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclN0b3JhZ2VXWCgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOacrOWcsOWtmOWCqFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEBwYXJhbSBkYXRhIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0U3RvcmFnZVN5bmNXWChrZXk6c3RyaW5nLCBkYXRhOmFueSkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgd3guc2V0U3RvcmFnZVN5bmMoa2V5LCBkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw5a2Y5YKoXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3RvcmFnZVN5bmNXWChrZXk6c3RyaW5nKTphbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHd4LmdldFN0b3JhZ2VTeW5jKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5pys5Zyw57yT5a2Y5Lit56e76Zmk5oyH5a6aIGtleVxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZVN0b3JhZ2VXWChrZXk6c3RyaW5nKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5yZW1vdmVTdG9yYWdlKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riF55CG5a2Y5YKo5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhclN0b3JhZ2VXWCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmNsZWFyU3RvcmFnZVN5bmMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7Q29tcG9uZW50RXZlbnREYXRhfSBmcm9tIFwiLi4vRGF0YS9Db21wb25lbnRFdmVudERhdGFcIjtcclxuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IHtHbG9iYWxXYWl0aW5nfSBmcm9tIFwiLi4vR2xvYmFsV2FpdGluZ1wiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgUGFuZWxCYXNlQ29udHJvbCBleHRlbmRzIGZhaXJ5Z3VpLldpbmRvdyB7XHJcbiAgICBzdGF0aWMgdmlld2JnVXJsOnN0cmluZyA9IFwiXCI7XHJcbiAgICBpc2d1aWRlaW5nOmJvb2xlYW49ZmFsc2U7XHJcbiAgICBwcml2YXRlIFBhY2thZ2VOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBSZXNvdXJjZXNOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfaXNBZGRwYWNrYWdlOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfaXNjYWNoZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9BY3Rpb25UeXBlOnN0cmluZyA9IFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lO1xyXG5cclxuICAgIGl0ZW1fcGFuZWw6IGZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcbiAgICBpdGVtX2JnOiBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBfY2xpY2tCZzogZmFpcnlndWkuR0xvYWRlcjtcclxuXHJcbiAgICBwcml2YXRlIF9jbGlja0JnSXNDb2xzZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgdmlld0tleTogYW55O1xyXG4gICAgcHVibGljIGdhbWVMYXllcjpzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBFdmVudFJlc0RpYzphbnkgPSB7fTtcclxuICAgIC8qKlxyXG4gICAgICog5YWo5bGA5LqL5Lu25a655ZmoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgRXZlbnRHbG9iYWw6YW55ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlYzpnaLliJ3lp4vljJZcclxuICAgICAqIEBwYXJhbSBwa2dOYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIHJlc05hbWUg55WM6Z2i5ZCNXHJcbiAgICAgKiBAcGFyYW0gaXNBZGRwYWNrYWdlIOaYr+WQpua3u+WKoOWMhSBcclxuICAgICAqIEBwYXJhbSBBY3Rpb25UeXBlIOeVjOmdouaJk+W8gOWKqOeUu+exu+Wei1xyXG4gICAgICogQHBhcmFtIGNsaWNrQmdJc0NvbHNlIOm7keiJsuiDjOaZryAwOuaXoOiDjOaZryAxOuiDjOaZr+aXoOWFs+mXreS6i+S7tiAyOuiDjOaZr+acieWFs+mXreS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzY2FjaGUg5piv5ZCm5re75Yqg5Yiw57yT5a2Y5rGg77yI5aaC5piv5Li6dHJ1ZSzliJnliqDlhaXov5vnvJPlrZjmsaDlrprml7bmoLnmja7mmK/lkKblvJXnlKjmuIXnkIbjgIIg6Iul5piv5Li6ZmFsc2XvvIzliJnkuI3muIXnkIblvZPliY3nvJPlrZjvvIzlpoLoi6XmuIXnkIbvvIzor7fmiYvliqjmuIXnkIYg77yJXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHBrZ05hbWU6IHN0cmluZyA9IFwiXCIsIHJlc05hbWU6IHN0cmluZyA9IFwiXCIsIGlzQWRkcGFja2FnZTogYm9vbGVhbiA9IGZhbHNlLCBcclxuICAgICAgICAgICAgICAgIEFjdGlvblR5cGU6c3RyaW5nPVZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLCBjbGlja0JnSXNDb2xzZTpudW1iZXI9MCwgaXNjYWNoZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX2lzY2FjaGUgPSBpc2NhY2hlO1xyXG4gICAgICAgIHRoaXMuUGFja2FnZU5hbWUgPSBwa2dOYW1lO1xyXG4gICAgICAgIHRoaXMuUmVzb3VyY2VzTmFtZSA9IHJlc05hbWU7XHJcbiAgICAgICAgdGhpcy5faXNBZGRwYWNrYWdlID0gaXNBZGRwYWNrYWdlO1xyXG4gICAgICAgIHRoaXMuX0FjdGlvblR5cGUgPSBBY3Rpb25UeXBlO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrQmdJc0NvbHNlID0gY2xpY2tCZ0lzQ29sc2U7XHJcbiAgICAgICAgdGhpcy5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBSZXNvbHZlVUkocGtnbmFtZTogc3RyaW5nLCByZXNuYW1lOiBzdHJpbmcsIGlzYWRkcGFja2FnZTogYm9vbGVhbixBY3Rpb25UeXBlOnN0cmluZz1WaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwgY2xpY2tCZ0lzQ29sc2U6bnVtYmVyPTAsIGlzY2FjaGU6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5QYWNrYWdlTmFtZSA9IHBrZ25hbWU7XHJcbiAgICAgICAgdGhpcy5SZXNvdXJjZXNOYW1lID0gcmVzbmFtZTtcclxuICAgICAgICB0aGlzLl9BY3Rpb25UeXBlID0gQWN0aW9uVHlwZTtcclxuICAgICAgICB0aGlzLl9jbGlja0JnSXNDb2xzZSA9IGNsaWNrQmdJc0NvbHNlO1xyXG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkFkZFZpZXdQYWNrQnlOYW1lKHBrZ25hbWUsIGlzYWRkcGFja2FnZSwgaXNjYWNoZSk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50UGFuZSA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5jcmVhdGVPYmplY3QocGtnbmFtZSwgcmVzbmFtZSkuYXNDb207XHJcbiAgICAgICAgZm9yICh2YXIgc3RyIGluIHRoaXMuY29udGVudFBhbmUuX2NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtOiBmYWlyeWd1aS5HT2JqZWN0ID0gdGhpcy5jb250ZW50UGFuZS5fY2hpbGRyZW5bc3RyXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBcIml0ZW1fcGFuZWxcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1wYW5lbDogZmFpcnlndWkuR0NvbXBvbmVudCA9IGl0ZW0gYXMgZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtcGFuZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzdHIxIGluIGl0ZW1wYW5lbC5fY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW1wYW5lbEl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSBpdGVtcGFuZWwuX2NoaWxkcmVuW3N0cjFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2l0ZW1wYW5lbEl0ZW0ubmFtZV0gPSBpdGVtcGFuZWxJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fcGFuZWwgPSBpdGVtIGFzIGZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzW2l0ZW0ubmFtZV0gPSBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0U2l6ZShmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoLCBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50UGFuZS5zZXRQaXZvdCgwLjUsMC41KTtcclxuICAgICAgICB0aGlzLnNldFBpdm90KDAuNSwgMC41KTtcclxuICAgICAgICB0aGlzLnNldGNsaWNrQmdJc0NvbHNlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0VmlldygpO1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5TaG93Vmlld0FDVElPTigpO1xyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBfbG9hZFRhcmdldDphbnk7XHJcbiAgICBwcml2YXRlIF9vbkxvYWRlZEhhbmRsZXI6RnVuY3Rpb247XHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vXVpXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIHRhcmdldCAgICDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBvbkxvYWRlZEhhbmRsZXIg5Yqg6L295a6M5oiQ5Zue6LCD5Ye95pWwXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBMb2FkVmlld1VJKGdyb3VwTmFtZTogc3RyaW5nLCB0YXJnZXQ6IGFueSwgb25Mb2FkZWRIYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyID0gb25Mb2FkZWRIYW5kbGVyO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkR3JvdXAoZ3JvdXBOYW1lLCB0aGlzLCB0aGlzLkxvYWRDb21wbGV0ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUxhYmVsKGNvbG9yOiBzdHJpbmcsIHN0cm9rZUNvbG9yOiBzdHJpbmcpOkxheWEuTGFiZWwge1xyXG4gICAgICAgIGNvbnN0IFNUUk9LRV9XSURUSDogbnVtYmVyID0gNDtcclxuICAgICAgICB2YXIgbGFiZWw6TGF5YS5MYWJlbCA9IG5ldyBMYXlhLkxhYmVsKCk7XHJcbiAgICAgICAgbGFiZWwuZm9udCA9IFwiTWljcm9zb2Z0IFlhSGVpXCI7XHJcbiAgICAgICAgbGFiZWwudGV4dCA9IFwiU0FNUExFIERFTU9cIjtcclxuICAgICAgICBsYWJlbC5mb250U2l6ZSA9IDMwO1xyXG4gICAgICAgIGxhYmVsLmNvbG9yID0gY29sb3I7XHJcbiAgICAgICAgaWYgKHN0cm9rZUNvbG9yKSB7XHJcbiAgICAgICAgICAgIGxhYmVsLnN0cm9rZSA9IFNUUk9LRV9XSURUSDtcclxuICAgICAgICAgICAgbGFiZWwuc3Ryb2tlQ29sb3IgPSBzdHJva2VDb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChsYWJlbCk7XHJcbiAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ5pWw57uEXHJcbiAgICAgKiBAcGFyYW0gdXJscyDotYTmupDmlbDnu4RcclxuICAgICAqIEBwYXJhbSB0YXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gb25Mb2FkZWRIYW5kbGVyIOWKoOi9veWujOaIkOWbnuiwg+WHveaVsFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgbG9hZFVpYnlBcnIodXJsczogQXJyYXk8YW55PiwgdGFyZ2V0OiBhbnksIG9uTG9hZGVkSGFuZGxlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICAvLyB0aGlzLnNob3dNb2RhbFdhaXQoKTtcclxuICAgICAgICB0aGlzLl9sb2FkVGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlciA9IG9uTG9hZGVkSGFuZGxlcjtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UuTG9hZGVycyh1cmxzLCB0aGlzLCB0aGlzLkxvYWRDb21wbGV0ZSk7ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlUmFkaW9Hcm91cChza2luOiBzdHJpbmcpOkxheWEuIFJhZGlvR3JvdXAge1xyXG4gICAgICAgIHZhciByZzpMYXlhLiBSYWRpb0dyb3VwID0gbmV3IExheWEuUmFkaW9Hcm91cCgpO1xyXG4gICAgICAgIHJnLnNraW4gPSBza2luO1xyXG5cclxuICAgICAgICByZy5zcGFjZSA9IDcwO1xyXG4gICAgICAgIHJnLmRpcmVjdGlvbiA9IFwidlwiO1xyXG5cclxuICAgICAgICByZy5sYWJlbHMgPSBcIkl0ZW0xLCBJdGVtMiwgSXRlbTNcIjtcclxuICAgICAgICByZy5sYWJlbENvbG9ycyA9IFwiIzc4Nzg3OCwjZDNkM2QzLCNGRkZGRkZcIjtcclxuICAgICAgICByZy5sYWJlbFNpemUgPSAyMDtcclxuICAgICAgICByZy5sYWJlbEJvbGQgPSB0cnVlO1xyXG4gICAgICAgIHJnLmxhYmVsUGFkZGluZyA9IFwiNSwwLDAsNVwiO1xyXG5cclxuICAgICAgICByZy5zZWxlY3RIYW5kbGVyID0gbmV3IExheWEuSGFuZGxlcih0aGlzLCB0aGlzLm9uU2VsZWN0Q2hhbmdlKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHJnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJnO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBvblNlbGVjdENoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLkvaDpgInmi6nkuobnrKwgXCIgKyAoaW5kZXggKyAxKSArIFwiIOmhuVwiKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBMb2FkQ29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvYWRUYXJnZXQgJiYgdGhpcy5fb25Mb2FkZWRIYW5kbGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlci5jYWxsKCB0aGlzLl9sb2FkVGFyZ2V0ICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZW1vdmVFZmZlY3RQYWNrYWdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5DbGVhclBhY2tCeU5hbWUocGFja2FnZU5hbWUsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRwYW5lbENvbnRyb2xsZXIobmFtZTogc3RyaW5nKTogZmFpcnlndWkuQ29udHJvbGxlciB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9wYW5lbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtX3BhbmVsLmdldENvbnRyb2xsZXIobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgc2V0dXAoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiNGRkZGRkZcIiwgbnVsbCkucG9zKDMwLCA1MCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiMwMEZGRkZcIiwgbnVsbCkucG9zKDI5MCwgNTApO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTGFiZWwoXCIjRkZGRjAwXCIsIFwiI0ZGRkZGRlwiKS5wb3MoMzAsIDEwMCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiMwMDAwMDBcIiwgXCIjRkZGRkZGXCIpLnBvcygyOTAsIDEwMCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiNGRkZGRkZcIiwgXCIjMDBGRkZGXCIpLnBvcygzMCwgMTUwKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiIzAwODBGRlwiLCBcIiMwMEZGRkZcIikucG9zKDI5MCwgMTUwKTtcclxuICAgIH1cclxuICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgXHJcbiAgICBwcm90ZWN0ZWQgZ2V0cGFuZWxUcmFuc2l0aW9uKG5hbWU6IHN0cmluZyk6IGZhaXJ5Z3VpLlRyYW5zaXRpb24ge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1fcGFuZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbV9wYW5lbC5nZXRUcmFuc2l0aW9uKG5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q2hpbGRmb3JtQ29udGVudFBhbmVsKCBuYW1lOnN0cmluZyApOmZhaXJ5Z3VpLkdPYmplY3RcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLmNvbnRlbnRQYW5lKXtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0Q2hpbGQobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8q55WM6Z2i5Yid5aeL5YyWKi9cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuUGFja2FnZU5hbWUgIT0gXCJcIiAmJiB0aGlzLlJlc291cmNlc05hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICB0aGlzLlJlc29sdmVVSSh0aGlzLlBhY2thZ2VOYW1lLCB0aGlzLlJlc291cmNlc05hbWUsIHRoaXMuX2lzQWRkcGFja2FnZSx0aGlzLl9BY3Rpb25UeXBlLHRoaXMuX2NsaWNrQmdJc0NvbHNlLCB0aGlzLl9pc2NhY2hlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy/op6PmnpB1aVxyXG4gICAgXHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgU2hvd1ZpZXdBQ1RJT04oKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggdGhpcy5fQWN0aW9uVHlwZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lOlxyXG4gICAgICAgICAgICAgICAgdGhpcy53aW5kb3dhbm1vZW5kKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9hZGRtb3ZlVG9NaWRkbGU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnggPSBmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHg6MCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLndpbmRvd2FubW9lbmQpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX2FkZG1vdmVGcm9tQm90dG9tOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50UGFuZS55ID0gZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMuY29udGVudFBhbmUsIHsgeTowIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMud2luZG93YW5tb2VuZCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heDpcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFBhbmUuc2NhbGVYID0gdGhpcy5jb250ZW50UGFuZS5zY2FsZVkgPSAwLjAxO1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLmNvbnRlbnRQYW5lLCB7IHNjYWxlWDoxLHNjYWxlWToxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMud2luZG93YW5tb2VuZCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrQm94KHNraW46IHN0cmluZyk6TGF5YS5DaGVja0JveCB7XHJcbiAgICAgICAgdmFyIGNiOkxheWEuIENoZWNrQm94ID0gbmV3IExheWEuQ2hlY2tCb3goc2tpbik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChjYik7XHJcblxyXG4gICAgICAgIGNiLmxhYmVsQ29sb3JzID0gXCJ3aGl0ZVwiO1xyXG4gICAgICAgIGNiLmxhYmVsU2l6ZSA9IDIwO1xyXG4gICAgICAgIGNiLmxhYmVsRm9udCA9IFwiTWljcm9zb2Z0IFlhSGVpXCI7XHJcbiAgICAgICAgY2IubGFiZWxQYWRkaW5nID0gXCIzLDAsMCw1XCI7XHJcblxyXG4gICAgICAgIHJldHVybiBjYjtcclxuICAgIH1cclxuICAgIHByaXZhdGUgdXBkYXRlTGFiZWwoY2hlY2tCb3g6TGF5YS5DaGVja0JveCk6IHZvaWQge1xyXG4gICAgICAgIGNoZWNrQm94LmxhYmVsID0gY2hlY2tCb3guc2VsZWN0ZWQgPyBcIuW3sumAieS4rVwiIDogXCLmnKrpgInkuK1cIjtcclxuICAgIH1cclxuICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIHByaXZhdGUgd2luZG93YW5tb2VuZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNhbGxMYXRlciggdGhpcyx0aGlzLm9uU2hvd1ZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25TaG93VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5zaG93Q2xpY2tCZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2hvd0NsaWNrQmcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5hbHBoYSA9IDAuNTU7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9jbGlja0JnSXNDb2xzZT09MiAmJiAhdGhpcy5oYXNDbGlja0xpc3RlbmVyKCkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLm9uQ2xpY2sodGhpcywgdGhpcy5DbGlja0V4aXRWaWV3KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKirngrnlh7vlhbPpl63pobXpnaLmjInpkq4gKi9cclxuICAgIHB1YmxpYyBDbGlja0V4aXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCB0aGlzLnZpZXdLZXksdHJ1ZSApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKuiOt+WPlueuoeeQhuaVsOaNruaooeWdlyovXHJcbiAgICBwdWJsaWMgZ2V0UHJveHkoZDogYW55KTogYW55IHtcclxuICAgICAgICByZXR1cm4gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKGQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55WM6Z2i5YWz6Zet5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBFeGl0VmlldyggQWN0aW9uVHlwZTpzdHJpbmcgPSBcIlwiICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9jbGlja0JnIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggQWN0aW9uVHlwZSA9PSBcIlwiIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fQWN0aW9uVHlwZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlc3RvcnkoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX2FkZG1vdmVUb01pZGRsZTpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyB4OmZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGggfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5kZXN0b3J5KSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbTpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyB5OmZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0IH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heDpcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyBzY2FsZVg6MC4wMSxzY2FsZVk6MC4wMSB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCBBY3Rpb25UeXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RvcnkoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfcmVtb3Zlc2NhbGVNYXhUb01pbjpcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMsIHsgc2NhbGVYOjAuMDEsc2NhbGVZOjAuMDEgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5kZXN0b3J5KSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX3JlbW92ZW1vdmVUb1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHg6ZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICBcclxuXHJcbiAgICBwdWJsaWMgZ2V0VHJhbnNpdGlvbkJ5TmFtZShpZDogc3RyaW5nKTogZmFpcnlndWkuVHJhbnNpdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0VHJhbnNpdGlvbihpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgLyoq5rOo5YaM5LqL5Lu2ICovXHJcbiAgICBwdWJsaWMgZGlzcGFjaGVEYXRhdHJpZ2dlcih0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KHR5cGUsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWRkRGF0YUV2ZW50KHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggIXRoaXMuRXZlbnRHbG9iYWwuaGFzT3duUHJvcGVydHkoIHR5cGUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBHYW1lUG9vbC5HZXRJdGVtKCBDb21wb25lbnRFdmVudERhdGEuUmVzRGljVmFsdWUgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV0gPSB2bztcclxuICAgICAgICAgICAgICAgIHZvLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzT2JqZWN0LGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQ2xlYXJFdmVudERhdGEodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsIGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk57uE5Lu25LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIg5LqL5Lu25Zue6LCDIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQ2xlYXJFdmVudEJ5VHlwZSggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0ICYmIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tcG9uZW50RXZlbnREYXRhPiA9IHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcclxuICAgICAgICAgICAgZm9yKGk7aTxudW1zO2krKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSBhcnJbaV07XHJcbiAgICAgICAgICAgICAgICBpZiggdm8gJiYgdm8udHlwZT09dHlwZSAmJiB2by50aGlzT2JqZWN0ID09IHRoaXNPYmplY3QgJiYgdm8ubGlzdGVuZXIgPT0gbGlzdGVuZXIgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5vZmYoIHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lciApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhoznu4Tku7bkuovku7bvvIzosIPnlKjmraTmlrnms5XvvIznlYzpnaLlhbPpl63kvJroh6rliqjnp7vpmaRcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osINcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEV2ZW50QnlUeXBlKCB0YXJnZXQ6YW55LCB0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uLGFyZ3M6YW55PW51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBudWxsIHx8IHRhcmdldC5uYW1lID09IFwiXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBcImJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gR2FtZVBvb2wuR2V0SXRlbSggQ29tcG9uZW50RXZlbnREYXRhLlJlc0RpY1ZhbHVlICk7XHJcbiAgICAgICAgICAgIHZvLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHZvLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0O1xyXG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICBpZiggIXRoaXMuRXZlbnRSZXNEaWMuaGFzT3duUHJvcGVydHkoIHRhcmdldC5uYW1lICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gdGhpcy5KdWRnZUlzSGF2ZUV2ZW50KCB0YXJnZXQsdHlwZSApO1xyXG4gICAgICAgICAgICBpZiggIWJvIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm9uKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIsYXJncyApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKirliKTmlq3mmK/lkKblkKvmnInkuovku7YgKi9cclxuICAgIHB1YmxpYyBKdWRnZUlzSGF2ZUV2ZW50KCB0YXJnZXQ6YW55LHR5cGU6IHN0cmluZyApOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICB2YXIgZXZlbnRBcnI6QXJyYXk8Q29tcG9uZW50RXZlbnREYXRhPjtcclxuICAgICAgICBldmVudEFyciA9IHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgIHZhciBjaGlsZHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcclxuICAgICAgICBmb3IoIHZhciBzIGluIGV2ZW50QXJyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkdm8gPSBldmVudEFycltzXTtcclxuICAgICAgICAgICAgaWYoIGNoaWxkdm8gJiYgY2hpbGR2by50eXBlID09IHR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgZ2V0Q29tQnlJZChpZDogc3RyaW5nKTogZmFpcnlndWkuR0NvbXBvbmVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFBhbmUuZ2V0Q2hpbGQoaWQpLmFzQ29tO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250cm9sbGVyQnlCYW1lKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5Db250cm9sbGVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDb250cm9sbGVyKGlkKTtcclxuICAgIH1cclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuRXZlbnRSZXNEaWMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5FdmVudFJlc0RpYztcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJyID0gZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGk9MDtcclxuICAgICAgICAgICAgICAgICAgICBudW1zID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IoIGk9bnVtcy0xO2k+PTA7aS0tIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8udGFyZ2V0IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by50YXJnZXQub2ZmKCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRSZXNEaWNbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudFJlc0RpYyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiDplIDmr4EqL1xyXG4gICAgcHVibGljIGRlc3RvcnkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX29uTG9hZGVkSGFuZGxlciA9IG51bGw7XHJcbiAgICAgICAgTGF5YS5Ud2Vlbi5jbGVhclR3ZWVuKCB0aGlzICk7XHJcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQ2xlYXJQYWNrQnlOYW1lKHRoaXMuUGFja2FnZU5hbWUsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLlBhY2thZ2VOYW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLlJlc291cmNlc05hbWUgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0JnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcub2ZmQ2xpY2sodGhpcywgdGhpcy5DbGlja0V4aXRWaWV3KTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZpZXdLZXkgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgc2V0Y2xpY2tCZ0lzQ29sc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nICYmIHRoaXMuX2NsaWNrQmdJc0NvbHNlID4gMCAmJiB0aGlzLmNvbnRlbnRQYW5lKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fY2xpY2tCZyAmJiBQYW5lbEJhc2VDb250cm9sLnZpZXdiZ1VybCAhPSBcIlwiICkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZyA9IG5ldyBmYWlyeWd1aS5HTG9hZGVyKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLnRvdWNoYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLnNldFNpemUoZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCwgZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy51cmwgPSBQYW5lbEJhc2VDb250cm9sLnZpZXdiZ1VybDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcuZmlsbCA9IGZhaXJ5Z3VpLkxvYWRlckZpbGxUeXBlLlNjYWxlRnJlZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcuYWxwaGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50UGFuZS5hZGRDaGlsZEF0KHRoaXMuX2NsaWNrQmcsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+mZpOaJgOacieWFqOWxgOS6i+S7tlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2xlYXJHbG9iYWxFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5FdmVudEdsb2JhbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5FdmVudEdsb2JhbDtcclxuICAgICAgICAgICAgZm9yKCBzIGluIGRpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DbGVhckV2ZW50RGF0YSggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudEdsb2JhbD17fTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7Q29tcG9uZW50RXZlbnREYXRhfSBmcm9tIFwiLi4vRGF0YS9Db21wb25lbnRFdmVudERhdGFcIjtcclxuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQYW5lbENoaWxkQ29udHJvbCBleHRlbmRzIGZhaXJ5Z3VpLkdDb21wb25lbnQgXHJcbntcclxuICAgIC8qKlxyXG4gICAgICog5LqL5Lu25a655ZmoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgRXZlbnRSZXNEaWM6YW55ID0ge307XHJcbiAgICAvKipcclxuICAgICAqIOWFqOWxgOS6i+S7tuWuueWZqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEV2ZW50R2xvYmFsOmFueSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ57uE5Lu25LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhckV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuRXZlbnRSZXNEaWMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcztcclxuICAgICAgICAgICAgdmFyIGRpY3Q6YW55ID0gdGhpcy5FdmVudFJlc0RpYztcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJyID0gZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGk9MDtcclxuICAgICAgICAgICAgICAgICAgICBudW1zID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBmb3IoIGk9bnVtcy0xO2k+PTA7aS0tIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdm8udGFyZ2V0IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2by50YXJnZXQub2ZmKCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRSZXNEaWNbc107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudFJlc0RpYyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQ2xlYXJHbG9iYWxFdmVudCgpO1xyXG4gICAgICAgIHRoaXMuQ2xlYXJFdmVudCgpO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0RnJvbVhNTCh4bWw6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmNvbnN0cnVjdEZyb21YTUwoeG1sKTtcclxuICAgICAgICBmb3IgKHZhciBzdHIgaW4gdGhpcy5fY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSB0aGlzLl9jaGlsZHJlbltzdHJdO1xyXG4gICAgICAgICAgICB0aGlzW2l0ZW0ubmFtZV0gPSBpdGVtO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8q6I635Y+W566h55CG5pWw5o2u5qih5Z2XKi9cclxuICAgIHB1YmxpYyBnZXRQcm94eShkOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRpc3BhY2hlRGF0YXRyaWdnZXIodHlwZTogc3RyaW5nLCBkYXRhOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCh0eXBlLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaGFzRGF0YUV2ZW50KHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBEaXNwYXRjaGVyTWFuYWdlci5oYXNFdmVudExpc3RlbmVyKHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQWRkRXZlbnREYXRhKHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggIXRoaXMuRXZlbnRHbG9iYWwuaGFzT3duUHJvcGVydHkoIHR5cGUgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gR2FtZVBvb2wuR2V0SXRlbSggQ29tcG9uZW50RXZlbnREYXRhLlJlc0RpY1ZhbHVlICk7XHJcbiAgICAgICAgICAgIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV0gPSB2bztcclxuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHZvLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0O1xyXG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgICAgIHByaXZhdGUgRElBTE9HX1dJRFRIOiBudW1iZXIgPSAyMjA7XHJcbiAgICAgICAgcHJpdmF0ZSBESUFMT0dfSEVJR0hUOiBudW1iZXIgPSAyNzU7XHJcbiAgICAgICAgcHJpdmF0ZSBDTE9TRV9CVE5fV0lEVEg6IG51bWJlciA9IDQzO1xyXG4gICAgICAgIHByaXZhdGUgQ0xPU0VfQlROX1BBRERJTkc6IG51bWJlciA9IDU7XHJcbiAgICAgICAgcHJpdmF0ZSBhc3NldHM6IEFycmF5PHN0cmluZz47XHJcblxyXG4gICAgICAgIHByaXZhdGUgb25Ta2luTG9hZENvbXBsZXRlKCk6IHZvaWQge1xyXG4gICAgICAgICAgICB2YXIgZGlhbG9nOkxheWEuIERpYWxvZyA9IG5ldyBMYXlhLkRpYWxvZygpO1xyXG5cclxuICAgICAgICAgICAgdmFyIGJnOkxheWEuSW1hZ2UgPSBuZXcgTGF5YS5JbWFnZSh0aGlzLmFzc2V0c1swXSk7XHJcbiAgICAgICAgICAgIGRpYWxvZy5hZGRDaGlsZChiZyk7XHJcbiAgICAgICAgICAgIHZhciBidXR0b246TGF5YS5CdXR0b24gPSBuZXcgTGF5YS5CdXR0b24odGhpcy5hc3NldHNbMV0pO1xyXG4gICAgICAgICAgICAvLyBidXR0b24ubmFtZSA9IERpYWxvZy5DTE9TRTtcclxuICAgICAgICAgICAgYnV0dG9uLnBvcyh0aGlzLkRJQUxPR19XSURUSCAtIHRoaXMuQ0xPU0VfQlROX1dJRFRIIC0gdGhpcy5DTE9TRV9CVE5fUEFERElORywgdGhpcy5DTE9TRV9CVE5fUEFERElORyk7XHJcbiAgICAgICAgICAgIGRpYWxvZy5hZGRDaGlsZChidXR0b24pO1xyXG5cclxuICAgICAgICAgICAgZGlhbG9nLmRyYWdBcmVhID0gXCIwLDAsXCIgKyB0aGlzLkRJQUxPR19XSURUSCArIFwiLFwiICsgdGhpcy5ESUFMT0dfSEVJR0hUO1xyXG4gICAgICAgICAgICBkaWFsb2cuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YWo5bGA5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqIEBwYXJhbSB0aGlzT2JqZWN0IFxyXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRGF0YUV2ZW50KHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICBpZiggdGhpcy5FdmVudEdsb2JhbFt0eXBlXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gdGhpcy5FdmVudEdsb2JhbFt0eXBlXTtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzT2JqZWN0LCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOazqOWGjOe7hOS7tuS6i+S7tu+8jOiwg+eUqOatpOaWueazle+8jOeVjOmdouWFs+mXreS8muiHquWKqOenu+mZpFxyXG4gICAgICogQHBhcmFtIHR5cGUg5pe26Ze057G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tvYmog5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIOS6i+S7tuWbnuiwg1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQWRkRXZlbnRCeVR5cGUoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sYXJnczphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IG51bGwgfHwgdGFyZ2V0Lm5hbWUgPT0gXCJcIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFwiY2hpbGRiYXNldmlldyBhZGRMaXN0ZW5lciB0YXJnZXQubmFtZSBpcyBudWxsXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IEdhbWVQb29sLkdldEl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSApO1xyXG4gICAgICAgICAgICB2by50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgICAgIHZvLnR5cGUgPSB0eXBlO1xyXG4gICAgICAgICAgICB2by50aGlzT2JqZWN0ID0gdGhpc09iamVjdDtcclxuICAgICAgICAgICAgdm8ubGlzdGVuZXIgPSBsaXN0ZW5lcjtcclxuICAgICAgICAgICAgaWYoICF0aGlzLkV2ZW50UmVzRGljLmhhc093blByb3BlcnR5KCB0YXJnZXQubmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IHRoaXMuSnVkZ2VJc0hhdmVFdmVudCggdGFyZ2V0LHR5cGUgKTtcclxuICAgICAgICAgICAgaWYoICFibyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vbiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyLGFyZ3MgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdLnB1c2goIHZvICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIEp1ZGdlSXNIYXZlRXZlbnQoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xyXG4gICAgICAgIGV2ZW50QXJyID0gdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV07XHJcbiAgICAgICAgdmFyIGNoaWxkdm86Q29tcG9uZW50RXZlbnREYXRhO1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gZXZlbnRBcnIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpbGR2byA9IGV2ZW50QXJyW3NdO1xyXG4gICAgICAgICAgICBpZiggY2hpbGR2byAmJiBjaGlsZHZvLnR5cGUgPT0gdHlwZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+mZpOe7hOS7tuS6i+S7tlxyXG4gICAgICogQHBhcmFtIHR5cGUg5pe26Ze057G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tvYmog5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIOS6i+S7tuWbnuiwgyBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIENsZWFyRXZlbnRCeVR5cGUoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCAmJiB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbXBvbmVudEV2ZW50RGF0YT4gPSB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXTtcclxuICAgICAgICAgICAgdmFyIGk6bnVtYmVyPTA7XHJcbiAgICAgICAgICAgIHZhciBudW1zOm51bWJlciA9IGFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGE7XHJcbiAgICAgICAgICAgIGZvcihpO2k8bnVtcztpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gYXJyW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvICYmIHZvLnR5cGU9PXR5cGUgJiYgdm8udGhpc09iamVjdCA9PSB0aGlzT2JqZWN0ICYmIHZvLmxpc3RlbmVyID09IGxpc3RlbmVyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQub2ZmKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoIGksMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ5YWo5bGA5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhckdsb2JhbEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLkV2ZW50R2xvYmFsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLkV2ZW50R2xvYmFsO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGFFdmVudCggdm8udHlwZSx2by50aGlzT2JqZWN0LHZvLmxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5FdmVudEdsb2JhbD17fTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgcGxhY2VIU2Nyb2xsZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGhzOkxheWEuSFNjcm9sbEJhciA9IG5ldyBMYXlhLkhTY3JvbGxCYXIoKTtcclxuICAgICAgICBocy5za2luID0gXCJyZXMvdWkvaHNjcm9sbC5wbmdcIjtcclxuICAgICAgICBocy53aWR0aCA9IDMwMDtcclxuICAgICAgICBocy5wb3MoNTAsIDE3MCk7XHJcblxyXG4gICAgICAgIGhzLm1pbiA9IDA7XHJcbiAgICAgICAgaHMubWF4ID0gMTAwO1xyXG5cclxuICAgICAgICBocy5jaGFuZ2VIYW5kbGVyID0gbmV3IExheWEuSGFuZGxlcih0aGlzLCB0aGlzLm9uQ2hhbmdlKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGhzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHBsYWNlVlNjcm9sbGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB2czpMYXlhLlZTY3JvbGxCYXIgPSBuZXcgTGF5YS5WU2Nyb2xsQmFyKCk7XHJcbiAgICAgICAgdnMuc2tpbiA9IFwicmVzL3VpL3ZzY3JvbGwucG5nXCI7XHJcbiAgICAgICAgdnMuaGVpZ2h0ID0gMzAwO1xyXG4gICAgICAgIHZzLnBvcyg0MDAsIDUwKTtcclxuXHJcbiAgICAgICAgdnMubWluID0gMDtcclxuICAgICAgICB2cy5tYXggPSAxMDA7XHJcbiAgICAgICAgdnMuY2hhbmdlSGFuZGxlciA9IG5ldyBMYXlhLkhhbmRsZXIodGhpcywgdGhpcy5vbkNoYW5nZSk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh2cyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSh2YWx1ZTogTnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLmu5rliqjmnaHnmoTkvY3nva7vvJogdmFsdWU9XCIgKyB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBcclxufSIsIlxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9vbE1hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbE1hbmFnZXJJbnN0YW5jZTpQb29sTWFuYWdlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgUG9vbE1hbmFnZXIuUG9vbE1hbmFnZXJJbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKFBvb2xNYW5hZ2VyLlBvb2xNYW5hZ2VySW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gUG9vbE1hbmFnZXIuUG9vbE1hbmFnZXJJbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IFBvb2xNYW5hZ2VyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbFNpemUgPSA4MDtcclxuICAgIHByaXZhdGUgc3RhdGljIFNwcml0ZTNERGljOntba2V5OnN0cmluZ106QXJyYXk8TGF5YS5TcHJpdGUzRD59ID0ge307XHJcblxyXG5cclxuICAgIHN0YXRpYyBHZXRTcHJpdGUzRChfb2JqOkxheWEuU3ByaXRlM0QpOkxheWEuU3ByaXRlM0RcclxuICAgIHtcclxuICAgICAgICB2YXIgb2JqTmFtZSA9IF9vYmoubmFtZTtcclxuICAgICAgICBpZih0aGlzLlNwcml0ZTNERGljW29iak5hbWVdICE9IG51bGwgJiYgdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLlNwcml0ZTNERGljW29iak5hbWVdLmxlbmd0aD4wKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXVswXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZighb2JqIHx8IG9iai5kZXN0cm95ZWQpb2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShfb2JqKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdLnNwbGljZSgwLDEpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIG9iai50cmFuc2Zvcm0ucG9zaXRpb24gPSBfb2JqLnRyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgLy8gb2JqLnRyYW5zZm9ybS5yb3RhdGlvbiA9IF9vYmoudHJhbnNmb3JtLnJvdGF0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBvYmoudHJhbnNmb3JtLnNjYWxlPV9vYmoudHJhbnNmb3JtLnNjYWxlLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBvYmouYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3b2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShfb2JqKTtcclxuICAgICAgICAgICAgICAgIG5ld29iai5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld29iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbmV3b2JqID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShfb2JqKTtcclxuICAgICAgICAgICAgbmV3b2JqLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXdvYmo7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBSZWNvdmVyU3ByaXRlM0QoX29iajpMYXlhLlNwcml0ZTNELF9hY3RpdmUgPSBmYWxzZSlcclxuICAgIHtcclxuICAgICAgICBpZighX29iailcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlBvb2xNYW5hZ2VyIFJlY292ZXIgRXJyb3IhXCIsbnVsbCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKF9vYmouZGVzdHJveWVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiUG9vbE1hbmFnZXIgUmVjb3ZlciBFcnJvciFcIixcImRlc3Ryb3llZFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIV9hY3RpdmUgJiYgX29iai5hY3RpdmUgPT0gZmFsc2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJQb29sTWFuYWdlciBSZWNvdmVyIEVycm9yIVwiLF9vYmoubmFtZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBvYmpOYW1lID0gX29iai5uYW1lO1xyXG5cclxuICAgICAgICBpZih0aGlzLlNwcml0ZTNERGljW29iak5hbWVdICE9IG51bGwgJiYgdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXSAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdO1xyXG4gICAgICAgICAgICBpZihhcnJheS5sZW5ndGggPiB0aGlzLlBvb2xTaXplKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfb2JqLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFycmF5LnB1c2goX29iaik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgYXJyYXkucHVzaChfb2JqKTtcclxuICAgICAgICAgICAgdGhpcy5TcHJpdGUzRERpY1tvYmpOYW1lXSA9IGFycmF5O1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9iak5hbWUsYXJyYXkubGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9vYmoudHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMygwLDAsLTEwMCk7XHJcbiAgICAgICAgX29iai5yZW1vdmVTZWxmKCk7XHJcbiAgICAgICAgX29iai5hY3RpdmUgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIENsZWFyUG9vbCgpXHJcbiAgICB7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5TcHJpdGUzRERpYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBvYmpzID0gdGhpcy5TcHJpdGUzRERpY1trZXldO1xyXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwO2k8IG9ianMubGVuZ3RoO2krKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgb2Jqc1tpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5TcHJpdGUzRERpYyA9IHt9O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuL1Jlc291cmNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0xvY2FsRGF0YX0gZnJvbSBcIi4uL0RhdGEvTG9jYWxEYXRhXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgVGFiID0gTGF5YS5UYWI7XHJcbi8qXHJcbiog6LWE5rqQ566h55CG5ZmoO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgUmVzRGF0YUNvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlJlc0RhdGFDb250cm9sO1xyXG5cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDkuI3nvJPlrZjnmoTljIXmlbDmja7vvIgg6aKE6Ziy55WM6Z2i5LiK55qE54q25oCB6K6+572u6ZSZ6K+vIO+8iVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIE5vTGl2ZURhdGE6YW55O1xyXG5cclxuICAgXHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6UmVzRGF0YUNvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggUmVzRGF0YUNvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNEYXRhQ29udHJvbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVzRGF0YUNvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5YyFXHJcbiAgICAgKiBAcGFyYW0gcGF0aCDot6/lvoTvvIgg5LqL5L6L77yacmVzL3VpLyDvvIlcclxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIGlzYWRkcGFja2FnZSDmmK/lkKbmt7vliqAgXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKbnvJPlrZhcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFBhY2tCeU5hbWUocGF0aDpzdHJpbmcscGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNhZGRwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKHBhdGggKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFkZExvY2FsTGl2ZURhdGEoIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEdhbWVQb29sLk1hcmsoIExvY2FsRGF0YS5SZXNEaWNWYWx1ZSxMb2NhbERhdGEgKTtcclxuICAgICAgICB0aGlzLnVybFJlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMucGFja2FnZVJlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuTm9MaXZlRGF0YSA9IHsgXCJsb2FkaW5nXCI6dHJ1ZSxcIm1haW5cIjp0cnVlLFwidWljb21wb25lbnRcIjp0cnVlfTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAqIOa4heeQhui1hOa6kOe8k+WtmChBcnJheSlcclxuICAgICAqIEBwYXJhbSB1cmxzIOi1hOa6kOaVsOe7hFxyXG4gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIOWMheWQjVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVtb3ZlUmVzb3VyY2VzKCB1cmxzOkFycmF5PGFueT4scGFja2FnZU5hbWU6c3RyaW5nID0gXCJcIiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggcGFja2FnZU5hbWUgIT0gXCJcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSVBhY2thZ2UucmVtb3ZlUGFja2FnZSggcGFja2FnZU5hbWUgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiB1cmxzIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuUmVtb3ZlUmVzb3VyY2VzQnl1cmwoIHVybHNbc10udXJsLHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBwbGFjZUhTbGlkZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGhzOkxheWEuSFNsaWRlciA9IG5ldyBMYXlhLkhTbGlkZXIoKTtcclxuICAgICAgICBocy5za2luID0gXCJyZXMvdWkvaHNsaWRlci5wbmdcIjtcclxuXHJcbiAgICAgICAgaHMud2lkdGggPSAzMDA7XHJcbiAgICAgICAgaHMucG9zKDUwLCAxNzApO1xyXG4gICAgICAgIGhzLm1pbiA9IDA7XHJcbiAgICAgICAgaHMubWF4ID0gMTAwO1xyXG4gICAgICAgIGhzLnZhbHVlID0gNTA7XHJcbiAgICAgICAgaHMudGljayA9IDE7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoaHMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBwbGFjZVZTbGlkZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHZzOkxheWEuVlNsaWRlciA9IG5ldyBMYXlhLlZTbGlkZXIoKTtcclxuXHJcbiAgICAgICAgdnMuc2tpbiA9IFwicmVzL3VpL3ZzbGlkZXIucG5nXCI7XHJcblxyXG4gICAgICAgIHZzLmhlaWdodCA9IDMwMDtcclxuICAgICAgICB2cy5wb3MoNDAwLCA1MCk7XHJcbiAgICAgICAgdnMubWluID0gMDtcclxuICAgICAgICB2cy5tYXggPSAxMDA7XHJcbiAgICAgICAgdnMudmFsdWUgPSA1MDtcclxuICAgICAgICB2cy50aWNrID0gMTtcclxuICAgICAgIFxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodnMpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHByaXZhdGUgX3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xyXG4gICAgICAgIGlmKCB0aGlzLl90aW1lID4gdGhpcy5DaGVja0ludGVydmFsICkgLy8x5YiG6ZKf5qOA5p+l5LiA5qyhXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLnJ1bm5pbmcgKSAvL+WmguaenOW9k+WJjeWcqOWKoOi9veS4re+8jOW7tuaXtjHnp5Lmo4DmtYtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGltZS09MTAwMDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlJlZnJlc2hHcm91cFJlcygpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbotYTmupDnvJPlrZgodXJsKVxyXG4gICAgICogQHBhcmFtIHVybCDopoHmuIXnkIbnmoTotYTmupB1cmxcclxuICAgICAqIEBwYXJhbSBpc0NsZWFyIOWvueS6jue8k+WtmOaxoOS4reeahOaVsOaNru+8jOW9k+W8leeUqOS4ujDml7bvvIzmmK/lkKbnm7TmjqXlvLrliLbmuIXpmaTvvIgg5aaC5p6c5Li6ZmFsc2Us5YiZ562J5b6F57yT5a2Y5a6a5pe25Yi35paw5pe25YCZ5YaN5Y675Yik5patIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmVtb3ZlUmVzb3VyY2VzQnl1cmwoIHVybDpzdHJpbmcsaXNDbGVhcjpib29sZWFuID0gZmFsc2UgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy51cmxSZXMuaGFzT3duUHJvcGVydHkodXJsKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpc0NsZWFyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5jbGVhclJlcyh1cmwpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXJsUmVzW3VybF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVybFJlc1t1cmxdLS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXModXJsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljIXotYTmupDmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwYWNrYWdlUmVzOmFueTtcclxuXHJcblxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBDbGVhckxpdmVEYXRhQnlQYWNrTmFtZSggcGtnTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMucGFja2FnZVJlc1sgcGtnTmFtZSBdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpMb2NhbERhdGEgPSB0aGlzLnBhY2thZ2VSZXNbIHBrZ05hbWUgXTtcclxuICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMucGFja2FnZVJlc1sgcGtnTmFtZSBdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiBcclxuICAgIHByaXZhdGUgQ2xlYXJJbnRlcnZhbDpudW1iZXIgPSA1MDAwMDtcclxuXHJcbiAgICBwcml2YXRlIENoZWNrSW50ZXJ2YWw6bnVtYmVyID0gMjAwMDA7XHJcbiAgICAgLyoqXHJcbiAgICAgKiB1cmzotYTmupDmsaBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cmxSZXM6YW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75YqgdWnljIVcclxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIGlzYWRkcGFja2FnZSDmmK/lkKbliJvlu7p1aXBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBpc0NhY2hlIOaYr+WQpua3u+WKoOWIsOe7hOe8k+WtmOS4re+8iCDlpoLmnpzmt7vliqDvvIzliJnlj4LkuI7lrprml7bmuIXnkIbnmoTpgLvovpEs5bi46am76LWE5rqQ6K+35Yu/6K6+572u5Li6dHVyZSDvvIlcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFZpZXdQYWNrQnlOYW1lKHBrZ25hbWU6c3RyaW5nLGlzYWRkcGFja2FnZTpib29sZWFuID0gdHJ1ZSxpc0NhY2hlOmJvb2xlYW4gPSB0cnVlKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGlzYWRkcGFja2FnZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggcGtnbmFtZSA9PSBcIm1haW5cIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKEFzc2V0UGF0aC5yZXMgKyBBc3NldFBhdGguc3VicGFja3NnZXVpICsgcGtnbmFtZSxwa2duYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5hZGRQYWNrYWdlKEFzc2V0UGF0aC5yZXNvdXJjZXMgKyBBc3NldFBhdGgudWkgKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkFkZExvY2FsTGl2ZURhdGEoIHBrZ25hbWUsaXNDYWNoZSApO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5YyFXHJcbiAgICAgKiBAcGFyYW0gcGtnbmFtZSDljIXlkI1cclxuICAgICAqIEBwYXJhbSBpc2NsZWFyIOaYr+WQpuW8uuWItua4hemZpO+8iCDlpoLmnpzkuLpmYWxzZeWImeetieW+heWumuaXtuWZqOWIpOaWrea4heeQhu+8jOWmguaenOS4unRydWXliJnlvLrliLbmuIXpmaQg77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhclBhY2tCeU5hbWUocGtnbmFtZTpzdHJpbmcsaXNjbGVhcjpib29sZWFuID0gZmFsc2UpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggcGtnbmFtZSA9PSBcIlwiIHx8IHBrZ25hbWUgPT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBpc2NsZWFyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmYWlyeWd1aS5VSVBhY2thZ2UucmVtb3ZlUGFja2FnZSggcGtnbmFtZSApO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5wYWNrYWdlUmVzLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5wYWNrYWdlUmVzW3BrZ25hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLnBhY2thZ2VSZXMuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2bzpMb2NhbERhdGEgPSB0aGlzLnBhY2thZ2VSZXNbIHBrZ25hbWUgXTtcclxuICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdm8ucmVmLS07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBSZWZyZXNoR3JvdXBSZXMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5vd1RpbWU6bnVtYmVyID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgIHZhciBzO1xyXG4gICAgICAgIGlmKCB0aGlzLnBhY2thZ2VSZXMgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YTtcclxuICAgICAgICAgICAgZm9yKCBzIGluIHRoaXMucGFja2FnZVJlcyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gdGhpcy5wYWNrYWdlUmVzW3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvLnJlZiA8PSAwICYmIChub3dUaW1lIC0gdm8udGltZSkgPiB0aGlzLkNsZWFySW50ZXJ2YWwgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2xlYXJQYWNrQnlOYW1lKCB2by5wYWNrYWdlTmFtZSx0cnVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DbGVhckxpdmVEYXRhQnlQYWNrTmFtZSggdm8ucGFja2FnZU5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL+a4heeQhuWbvueJh+e8k+WtmFxyXG4gICAgICAgIGlmKCB0aGlzLnVybFJlcyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2V1cmxQb29sOmFueSA9IHRoaXMudXJsUmVzO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gcmVzb3VyY2V1cmxQb29sIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHJlc291cmNldXJsUG9vbFtzXSA8PSAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlJlbW92ZVJlc291cmNlc0J5dXJsKCBzLHRydWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBza2luczogQXJyYXk8c3RyaW5nPiA9IFtcInJlcy91aS90YWIxLnBuZ1wiLCBcInJlcy91aS90YWIyLnBuZ1wiXTtcclxuICAgIHByaXZhdGUgb25Ta2luTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0YWJBOiBUYWIgPSB0aGlzLmNyZWF0ZVRhYih0aGlzLnNraW5zWzBdKTtcclxuICAgICAgICB0YWJBLnBvcyg0MCwgMTIwKTtcclxuICAgICAgICB0YWJBLmxhYmVsQ29sb3JzID0gXCIjMDAwMDAwLCNkM2QzZDMsIzMzMzMzM1wiO1xyXG5cclxuICAgICAgICB2YXIgdGFiQjogVGFiID0gdGhpcy5jcmVhdGVUYWIodGhpcy5za2luc1sxXSk7XHJcbiAgICAgICAgdGFiQi5wb3MoNDAsIDIyMCk7XHJcbiAgICAgICAgdGFiQi5sYWJlbENvbG9ycyA9IFwiI0ZGRkZGRiwjOEZCMjk5LCNGRkZGRkZcIjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVRhYihza2luOiBzdHJpbmcpOiBUYWIge1xyXG4gICAgICAgIHZhciB0YWI6IFRhYiA9IG5ldyBUYWIoKTtcclxuICAgICAgICB0YWIuc2tpbiA9IHNraW47XHJcblxyXG4gICAgICAgIHRhYi5sYWJlbEJvbGQgPSB0cnVlO1xyXG4gICAgICAgIHRhYi5sYWJlbFNpemUgPSAyMDtcclxuICAgICAgICB0YWIubGFiZWxTdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xyXG5cclxuICAgICAgICB0YWIubGFiZWxzID0gXCJUYWIgQ29udHJvbCAxLFRhYiBDb250cm9sIDIsVGFiIENvbnRyb2wgM1wiO1xyXG4gICAgICAgIHRhYi5sYWJlbFBhZGRpbmcgPSBcIjAsMCwwLDBcIjtcclxuXHJcbiAgICAgICAgdGFiLnNlbGVjdGVkSW5kZXggPSAxO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGFiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRhYjtcclxuICAgIH1cclxuICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blt7Lnu4/liqDovb3ov4fnmoTmlbDmja5cclxuICAgICAqIEBwYXJhbSB1cmwg6LWE5rqQdXJsXHJcbiAgICAgKiBAcGFyYW0gaXNDYWNoZSDmmK/lkKblrZjlgqjlnKjnvJPlrZjmsaDkuK3vvIzpu5jorqTkuLp0cnVlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBHYWluUmVzb3VyY2VzKCB1cmw6c3RyaW5nLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUgKTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggaXNDYWNoZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLnVybFJlc1t1cmxdID09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXJsUmVzW3VybF0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXJsUmVzW3VybF0rKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIExheWEubG9hZGVyLmdldFJlcyh1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuXHJcbiAgICBwcml2YXRlIEFkZExvY2FsTGl2ZURhdGEoIHBrZ25hbWU6c3RyaW5nLGlzQ2FjaGU6Ym9vbGVhbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNDYWNoZSAmJiAhdGhpcy5Ob0xpdmVEYXRhLmhhc093blByb3BlcnR5KCBwa2duYW1lICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YTtcclxuICAgICAgICAgICAgaWYoICF0aGlzLnBhY2thZ2VSZXMuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZvID0gR2FtZVBvb2wuR2V0SXRlbSggTG9jYWxEYXRhLlJlc0RpY1ZhbHVlICk7XHJcbiAgICAgICAgICAgICAgICB2by5wYWNrYWdlTmFtZSA9IHBrZ25hbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhY2thZ2VSZXNbIHBrZ25hbWUgXSA9IHZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSB0aGlzLnBhY2thZ2VSZXNbcGtnbmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdm8ucmVmKys7XHJcbiAgICAgICAgICAgIHZvLnRpbWUgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgXHJcbn0iLCIvKlxyXG4qIG5hbWU7XHJcbiovXHJcbmltcG9ydCBIYW5kbGVyID0gTGF5YS5IYW5kbGVyO1xyXG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UmVjQ29uZmlnc30gZnJvbSBcIi4uL0NvbmZpZy9SZWNDb25maWdzXCI7XHJcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUNvbnRyb2wgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIF9jb25maWdzOiBBcnJheTxhbnk+O1xyXG4gICAgcHJpdmF0ZSBfb25Db25maWdDb21wbGV0ZTogRnVuY3Rpb247XHJcbiAgICBwcml2YXRlIF9vbkNvbmZpZ1Byb2dyZXNzOiBGdW5jdGlvbjsgXHJcbiAgICBwcml2YXRlIF9vbkNvbmZpZ0NvbXBsZXRlVGFyZ2V0OiBhbnk7XHJcbiAgICBwcml2YXRlIF9ncm91cHM6IGFueTtcclxuICAgIHByaXZhdGUgX2dyb3VwSW5kZXg6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgcnVubmluZzpCb29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9ub3dMb2FkRGF0YTphbnk7XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UmVzb3VyY2VDb250cm9sO1xyXG5cclxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSBcclxuXHR7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuaW5zID0gdGhpcztcclxuXHR9XHJcblx0XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBSZXNvdXJjZUNvbnRyb2xcclxuXHR7XHJcbiAgICAgICAgaWYoUmVzb3VyY2VDb250cm9sLmlucyA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFJlc291cmNlQ29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncyA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgICAgdGhpcy5fZ3JvdXBzID0ge307XHJcbiAgICAgICAgTGF5YS5sb2FkZXIucmV0cnlOdW0gPSA0O1xyXG4gICAgICAgIExheWEubG9hZGVyLm9uKExheWEuRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMub25FcnJvcik7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIub24oXCJlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5lcnJvcnNNc2doYW5kbGVyKTtcclxuICAgICAgICBMYXlhLmxvYWRlci5vbihcImdhbWVlcnJvcnNNc2dcIiwgdGhpcywgdGhpcy5nYW1lZXJyb3JzTXNnaGFuZGxlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb25maWdDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fb25Db25maWdDb21wbGV0ZVRhcmdldCAhPSBudWxsICYmIHRoaXMuX29uQ29uZmlnQ29tcGxldGUgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkNvbmZpZ0NvbXBsZXRlLmNhbGwoIHRoaXMuX29uQ29uZmlnQ29tcGxldGVUYXJnZXQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlcnJvcnNNc2doYW5kbGVyKCBtc2c6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFwibG9hZGZhaWxFdmVudFwiLG1zZyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2FtZWVycm9yc01zZ2hhbmRsZXIoIG1zZzpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggXCJnYW1lc2Vycm9zRXZlbnRcIixtc2cgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vei1hOa6kOe7hFxyXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSDnu4TlkI1cclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSDlrozmiJDkuovku7ZcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3MgICDliqDovb3ov5vluqbkuovku7ZcclxuICAgICAqIEBwYXJhbSBpc1Nob3cgICAgICAgICAgICAgICDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRHcm91cChncm91cE5hbWU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsKVxyXG4gICAge1xyXG4gICAgICAgIC8vIERlYnVnZXIubG9nKGdyb3VwTmFtZSk7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFJlY0NvbmZpZ3MuSW5zdGFuY2UuUmVzRGljWyBncm91cE5hbWUgXTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImdyb3VwXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L295Y2V5Liq6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIHR5cGUg6LWE5rqQ57G75Z6LXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlciggdXJsOmFueSwgdHlwZTpzdHJpbmcsb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFt7dXJsOnVybCx0eXBlOnR5cGV9XTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcInNpbmdsZVwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjJEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veaVsOe7hOi1hOa6kFxyXG4gICAgICogQHBhcmFtIHVybHMgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxyXG4gICAgICogQHBhcmFtIGlzU2hvdyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlcnMoIHVybHM6QXJyYXk8YW55Piwgb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc1Nob3c7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJhcnJcIjtcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDopoHliqDovb3nmoTmgLvmlbDph49cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9hZE51bTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlt7Lnu4/liqDovb3nmoTmlbDph49cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9hZGVkTnVtOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlbG9hZE51bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX2N1dDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgX25vd0xvYWRBcnI6QXJyYXk8YW55PiA9IG51bGw7XHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vei1hOa6kOaVsOe7hO+8jOatpOWKoOi9veaWueazleS8muWNleS4quWKoOi9veaVsOe7hOWGheeahOi1hOa6kO+8jOeUqOS6juaYvuekuuS4pOS4qui/m+W6puadoe+8iCDkuIDkuKrmgLvov5vluqbmnaHvvIzkuIDkuKrljZXkuKrotYTmupDov5vluqbmnaEg77yJXHJcbiAgICAgKiBAcGFyYW0gdXJscyBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCBcclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3MgXHJcbiAgICAgKiBAcGFyYW0gaXNTaG93IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZGVyQXJyKHVybHM6QXJyYXk8YW55Piwgb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsY3V0Om51bWJlciA9IDMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gdXJscztcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwibG9hZGVyQXJyXCI7XHJcbiAgICAgICAgZGF0YS5jdXQgPSBjdXQ7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLnN0YXJ0TG9hZDEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXJ0TG9hZDEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoICF0aGlzLnJ1bm5pbmcgJiYgdGhpcy5fY29uZmlncy5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhID0gdGhpcy5fY29uZmlncy5zaGlmdCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkQXJyID0gKHRoaXMuX25vd0xvYWREYXRhLnVybHMgYXMgQXJyYXk8YW55PikuY29uY2F0KCkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkTnVtID0gdGhpcy5fbm93TG9hZEFyci5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZE51bSA9MDtcclxuICAgICAgICAgICAgdGhpcy5fcHJlbG9hZE51bSA9IHRoaXMuX2xvYWRlZE51bTtcclxuICAgICAgICAgICAgdGhpcy5fY3V0ID0gTnVtYmVyKHRoaXMuX25vd0xvYWREYXRhLmN1dCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZFN0YXJ0MSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRTdGFydDEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMucnVubmluZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkQXJyICYmIHRoaXMuX25vd0xvYWRBcnIubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXIgbmVlZEFycjpBcnJheTxhbnk+O1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZEFyci5sZW5ndGggPiB0aGlzLl9jdXQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuZWVkQXJyID0gdGhpcy5fbm93TG9hZEFyci5zcGxpY2UoIDAsdGhpcy5fY3V0ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuZWVkQXJyID0gdGhpcy5fbm93TG9hZEFyci5zcGxpY2UoIDAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jdXQgPSBuZWVkQXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy5fcHJlbG9hZE51bSA9IHRoaXMuX2xvYWRlZE51bTtcclxuICAgICAgICAgICAgdGhpcy5vbkxvYWRpbmdBcnIoIDAgKTtcclxuICAgICAgICAgICAgdmFyIHJlc291c2VUeXBlOnN0cmluZyA9IHRoaXMuX25vd0xvYWREYXRhLnJlc291c2VUeXBlO1xyXG4gICAgICAgICAgICBpZihyZXNvdXNlVHlwZSA9PSBcIjJEXCJ8fHJlc291c2VUeXBlPT1udWxsKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKG5lZWRBcnIsIEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGVBcnIpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nQXJyLG51bGwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5jcmVhdGUobmVlZEFyciwgSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRDb21wbGV0ZUFyciksSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRpbmdBcnIsbnVsbCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRMb2FkMSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTG9hZGluZ0Fycih2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbG9hZGVkTnVtID0gdGhpcy5fcHJlbG9hZE51bSArIHZhbHVlKnRoaXMuX2N1dDtcclxuICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFsbHZhbHVlOm51bWJlciA9IE1hdGguY2VpbCgodGhpcy5fbG9hZGVkTnVtIC8gdGhpcy5fbG9hZE51bSApKjEwMCk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcyAhPSBudWxsIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEucHJvZ3Jlc3MuY2FsbCggdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQsYWxsdmFsdWUsTWF0aC5mbG9vcih2YWx1ZSoxMDApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb21wbGV0ZUFycigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9uTG9hZGluZ0FyciggMSApO1xyXG4gICAgICAgIHRoaXMuX2xvYWRlZE51bSA9IHRoaXMuX3ByZWxvYWROdW0gKyB0aGlzLl9jdXQ7XHJcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvYWRlZE51bSA9PSB0aGlzLl9sb2FkTnVtIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSAmJiB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEudGltZXIuY2FsbExhdGVyKCB0aGlzLCB0aGlzLmxvYWRTdGFydDEgKTtcclxuICAgICAgICAvLyB0aGlzLmxvYWRTdGFydDEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRTdGFydCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ydW5uaW5nIHx8IHRoaXMuX2NvbmZpZ3MubGVuZ3RoID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX25vd0xvYWREYXRhID0gdGhpcy5fY29uZmlnc1swXTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSB0aGlzLl9ub3dMb2FkRGF0YS51cmxzO1xyXG4gICAgICAgIHZhciBpc1Nob3c6Ym9vbGVhbiA9IHRoaXMuX25vd0xvYWREYXRhLmlzU2hvdztcclxuICAgICAgICBpZiggaXNTaG93IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3Quc2hvd01vZGFsV2FpdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzb3VzZVR5cGU6c3RyaW5nID0gdGhpcy5fbm93TG9hZERhdGEucmVzb3VzZVR5cGU7XHJcbiAgICAgICAgaWYoIGFyciAhPSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHJlc291c2VUeXBlID09IFwiMkRcInx8cmVzb3VzZVR5cGU9PW51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQoYXJyLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGUpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nLCBudWxsLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY3JlYXRlKGFycixIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZywgbnVsbCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDliqDovb3ov5vluqbkvqblkKzlmahcclxuICAgIHByaXZhdGUgb25Mb2FkaW5nKHByb2dyZXNzOiBudW1iZXIpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwcm9ncmVzcyA9IE1hdGguY2VpbCggTnVtYmVyKHByb2dyZXNzICogMTAwKSApO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93TG9hZERhdGEucHJvZ3Jlc3MgIT0gbnVsbCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzLmNhbGwoIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0LHByb2dyZXNzICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvYWRDb21wbGV0ZShhcmdzOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5jbG9zZU1vZGFsV2FpdCgpO1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSAmJiB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLl9ub3dMb2FkRGF0YS5hcmdzKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlLmNhbGwodGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQsdGhpcy5fbm93TG9hZERhdGEuYXJncyk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUuY2FsbCh0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3Muc2hpZnQoKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25FcnJvcihlcnI6IFN0cmluZyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3QuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE5Y2V5Liq6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gdXJsIOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIHR5cGUg6LWE5rqQ57G75Z6LXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyDmmK/lkKbmmL7npLrliqDovb3nirbmgIFcclxuICAgICAqL1xyXG4gICAgcHVibGljIExvYWRlcjNEKCB1cmw6YW55LCB0eXBlOmFueSxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IFt7dXJsOnVybCx0eXBlOnR5cGV9XTtcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcInNpbmdsZVwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjNEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vTNE6LWE5rqQ57uEXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyAgIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEdyb3VwM0QoZ3JvdXBOYW1lOnN0cmluZyxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUsYXJnczphbnk9bnVsbClcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gUmVjQ29uZmlncy5JbnN0YW5jZS5SZXNEaWNbIGdyb3VwTmFtZSBdO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xyXG4gICAgICAgIGRhdGEuYXJncz1hcmdzO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwiZ3JvdXBcIjtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIzRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4TvvIzmraTliqDovb3mlrnms5XkvJrljZXkuKrliqDovb3mlbDnu4TlhoXnmoTotYTmupDvvIznlKjkuo7mmL7npLrkuKTkuKrov5vluqbmnaHvvIgg5LiA5Liq5oC76L+b5bqm5p2h77yM5LiA5Liq5Y2V5Liq6LWE5rqQ6L+b5bqm5p2hIO+8iVxyXG4gICAgICogQHBhcmFtIHVybHMgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzIFxyXG4gICAgICogQHBhcmFtIGlzU2hvdyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRlcjNEQXJyKHVybHM6QXJyYXk8YW55Piwgb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNzaG93OmJvb2xlYW4gPSBmYWxzZSxhcmdzOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGRhdGE6YW55ID0ge307XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZSA9IFJlc291cmNlTG9hZENvbXBsZXRlO1xyXG4gICAgICAgIGRhdGEuY29tcGxldGVUYXJnZXQgPSBvblJlc291cmNlTG9hZFRhcmdldDtcclxuICAgICAgICBkYXRhLnByb2dyZXNzID0gb25SZXNvdXJjZVByb2dyZXNzO1xyXG4gICAgICAgIGRhdGEudXJscyA9IHVybHM7XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc3Nob3c7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJsb2FkZXJBcnJcIjtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIzRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3nibnmlYhcclxuICAgICAqIEBwYXJhbSBncm91cE5hbWUgXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQgXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUgXHJcbiAgICAgKiBAcGFyYW0gYXJncyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRFZmZlY3QoIGdyb3VwTmFtZTpzdHJpbmcsb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLGFyZ3M6YW55PW51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHVybHM6QXJyYXk8YW55PiA9IFJlY0NvbmZpZ3MuSW5zdGFuY2UuUmVzRGljWyBncm91cE5hbWUgXTtcclxuICAgICAgICBpZiggdXJscyAmJiB1cmxzLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZCh1cmxzLEhhbmRsZXIuY3JlYXRlKCBvblJlc291cmNlTG9hZFRhcmdldCxSZXNvdXJjZUxvYWRDb21wbGV0ZSxbYXJnc10gKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTGF5b3V0Q29udHJvbCB9IGZyb20gXCIuL0xheW91dENvbnRyb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtDYW1lcmFNYW5hZ2VyfSBmcm9tIFwiLi4vR2FtZS9DYW1lcmFNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UGxheWVyfSBmcm9tIFwiLi4vR2FtZS9QbGF5ZXJcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IExldmVsQ0ZHIGZyb20gXCIuLi9DRkcvTGV2ZWxDRkdcIjtcclxuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCBOcGNDRkcgZnJvbSBcIi4uL0NGRy9OcGNDRkdcIjtcclxuaW1wb3J0IHtOcGNTY3JpcHR9IGZyb20gXCIuLi9HYW1lL05wY1NjcmlwdFwiO1xyXG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCBHYW1lQ0ZHIGZyb20gXCIuLi9DRkcvR2FtZUNGR1wiO1xyXG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclBvb2x9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclBvb2xcIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xyXG5cclxuXHJcbmltcG9ydCBTcHJpdGUgPSBMYXlhLlNwcml0ZTtcclxuaW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcclxuaW1wb3J0IEV2ZW50ID0gTGF5YS5FdmVudDtcclxuaW1wb3J0IEJyb3dzZXIgPSBMYXlhLkJyb3dzZXI7XHJcbmltcG9ydCBXZWJHTCA9IExheWEuV2ViR0w7XHJcbmV4cG9ydCBjbGFzcyBTY2VuZUNvbnRyb2xcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlNjZW5lQ29udHJvbDtcclxuXHJcbiAgICBwcml2YXRlIF9pbml0UG9zWTpudW1iZXIgPSAxO1xyXG5cclxuICAgIHB1YmxpYyBjYW1lcmFTY3JpcHQ6Q2FtZXJhTWFuYWdlcjtcclxuICAgIHB1YmxpYyBQbGF5ZXJTY3JpcHQ6UGxheWVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgU2NlbmVDb250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyrkvb/nlKjnlYzpnaLmmL7npLrvvIww77ya56C46JuLLDE65a6d566xKi9cclxuICAgIHN0YXRpYyBFZ2dHR3JvdXA6bnVtYmVyPTA7XHJcblxyXG4gICAgLyoq562+5Yiw5piv5ZCm5q2j5Zyo5pi+56S6ICovXHJcbiAgICBzdGF0aWMgSXNTaG93U2lnbjpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpTY2VuZUNvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggU2NlbmVDb250cm9sLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2NlbmVDb250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTY2VuZUNvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5Yib5bu65Li76KeSXHJcbiAgICBwdWJsaWMgQ3JlYXRlUGxheWVyKCByb2xlY2ZnOlJvbGVDRkcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGlzY3JlYXRlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiggIVByb3BNYW5hZ2VyLm1haW5Sb2xlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzY3JlYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggUHJvcE1hbmFnZXIubWFpblJvbGUubmFtZSAhPSBcIkNoYXJhY3RlclwiICsgcm9sZWNmZy5uYW1lIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzY3JlYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5DbGVhck1vbWVudENoYXJhY3RlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggaXNjcmVhdGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gdmFyIHNwOkxheWEuU3ByaXRlM0QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKFJvbGVEYXRhLnJvbGVDZmcubmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIC8vIFByb3BNYW5hZ2VyLm1haW5Sb2xlID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShzcCwgUHJvcE1hbmFnZXIuc2NlbmUzRCwgZmFsc2UsbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIubWFpblJvbGUgPSBDaGFyYWN0ZXJQb29sLkFkZENoYXJhY3Rlciggcm9sZWNmZy5uYW1lLFBsYXllcixQcm9wTWFuYWdlci5zY2VuZTNEICk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm1haW5Sb2xlLm5hbWUgPSBcIkNoYXJhY3RlclwiICsgcm9sZWNmZy5uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLlBsYXllclNjcmlwdCA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLmdldENvbXBvbmVudCggUGxheWVyICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyB0aGlzLm1haW5Sb2xlU2NyaXB0LnJlc291c2VOYW1lID0gUm9sZURhdGEucm9sZUNmZy5uYW1lO1xyXG4gICAgICAgICAgICAvLyBpZiggIClcclxuICAgICAgICAgICAgLy8gdGhpcy5tYWluUm9sZVNjcmlwdCA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLmFkZENvbXBvbmVudCggTWFpblJBb2xlU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgYWdlbmN5dXNlcm1lc3NhZ2U6QWdlbmN5VXNlck1lc3NhZ2UgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICk7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XHJcbiAgICAgICAgdmFyIGluZm86YW55ID0gUm9sZURhdGEubGV2ZWxjZmcucm9sZWluaXRwb3M7XHJcbiAgICAgICAgdmFyIGNoaWRhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FycihpbmZvLm9mZnNldFBvcyk7XHJcbiAgICAgICAgdmFyIG9mZnNldFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCBOdW1iZXIoIGNoaWRhcnJbMF0pLE51bWJlciggY2hpZGFyclsxXSksTnVtYmVyKCBjaGlkYXJyWzJdKSApO1xyXG4gICAgICAgIHZhciBwb3NWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgICAgICB2YXIgc2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuICAgICAgICBpZiggaW5mby5pbml0YnVpbGQgPT0gXCJzdGFydHBhbmVsXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcG9zVmVjLnggPSBQcm9wTWFuYWdlci5zdGFydFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbi54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgIHBvc1ZlYy55ID0gUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueSArIG9mZnNldFBvcy55O1xyXG4gICAgICAgICAgICBwb3NWZWMueiA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBQcm9wTWFuYWdlci5zdGFydFBsYW5lLmdldENoaWxkQnlOYW1lKCBcImNoaWxkX3Bvc1wiICkgYXMgTGF5YS5TcHJpdGUzRCApLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNoaWxkcG9zOkxheWEuVmVjdG9yMyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIFJvbGVEYXRhLmxldmVsbWFwQXJyWzBdLGluZm8uaW5pdGJ1aWxkICk7XHJcbiAgICAgICAgICAgIHBvc1ZlYy54ID0gY2hpbGRwb3MueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICBwb3NWZWMueSA9IGNoaWxkcG9zLnkgKyBvZmZzZXRQb3MueTtcclxuICAgICAgICAgICAgcG9zVmVjLnogPSBjaGlsZHBvcy56ICsgb2Zmc2V0UG9zLno7XHJcbiAgICAgICAgICAgIHNlbGVjdFZlYyA9IGNoaWxkcG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3NWZWM7XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQuU2V0Q2FtZXJhUG9zaXRpb24oUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLlBsYXllclNjcmlwdC5zZXRub3dTZWxlY3RWZWMoIHNlbGVjdFZlYyApO1xyXG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0Lm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnN0YW5kO1xyXG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0LlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcclxuXHJcbiAgICAgICAgLy8gdmFyIFVJUG9zID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgIC8vIHZhciBOQU1FVUkgPSBuZXcgTGF5YS5UZXh0KCk7XHJcblxyXG4gICAgICAgIC8vIE5BTUVVSS50ZXh0ID0gXCLoh6rlt7FcIjtcclxuICAgICAgICAvLyBOQU1FVUkuZm9udFNpemUgPSA2MDtcclxuICAgICAgICAvLyBOQU1FVUkuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuICAgICAgICAvLyBOQU1FVUkuc2NhbGVYID0gMC41O1xyXG4gICAgICAgIC8vIE5BTUVVSS5zY2FsZVkgPSAwLjU7XHJcbiAgICAgICAgLy8gTkFNRVVJLmFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICAvLyBOQU1FVUkudmFsaWduID0gXCJtaWRkbGVcIjtcclxuICAgICAgICAvLyBMYXlhLnN0YWdlLmFkZENoaWxkKE5BTUVVSSk7XHJcbiAgICAgICAgLy8gTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBsZXQgU2NyZWVuUG9zID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgICAgIC8vICAgICBQcm9wTWFuYWdlci5jYXJtYS53b3JsZFRvVmlld3BvcnRQb2ludChVSVBvcywgU2NyZWVuUG9zKTtcclxuICAgICAgICAvLyAgICAgTkFNRVVJLnBvcyhTY3JlZW5Qb3MueCwgU2NyZWVuUG9zLnkpO1xyXG4gICAgICAgIC8vIH0pXHJcbiAgICB9XHJcbiAgICAvL+WIm+W7um5wY1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVOcGMoICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXROcGMtLS1cIik7XHJcbiAgICAgICAgdGhpcy5DbGVhck5wYygpO1xyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PGFueT4gPSBSb2xlRGF0YS5sZXZlbGNmZy5ucGM7XHJcbiAgICAgICAgdmFyIGNoaWxkZGljdDphbnk7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IDA7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIubnBjbnVtID0gYXJyLmxlbmd0aDtcclxuICAgICAgICBmb3IoIHZhciBzIGluIGFyciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlsZGRpY3QgPSBhcnJbc107XHJcbiAgICAgICAgICAgIHZhciBzZWxlY3RWZWM6TGF5YS5WZWN0b3IzID0gbnVsbDtcclxuICAgICAgICAgICAgdmFyIG5wY2NmZzpOcGNDRkcgPSBOcGNDRkcuZGljdFsgY2hpbGRkaWN0LmlkIF07XHJcbiAgICAgICAgICAgIHZhciBzcDpMYXlhLlNwcml0ZTNEID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbChucGNjZmcubmFtZSkpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIHZhciBjaGlkYXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoY2hpbGRkaWN0Lm9mZnNldFBvcyk7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXRQb3M6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMyggTnVtYmVyKCBjaGlkYXJyWzBdKSxOdW1iZXIoIGNoaWRhcnJbMV0pLE51bWJlciggY2hpZGFyclsyXSkgKTtcclxuICAgICAgICAgICAgdmFyIHBvc1ZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgICAgICBpZiggY2hpbGRkaWN0LnNjZW5lID09IFwic3RhcnRwYW5lbFwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnggPSBQcm9wTWFuYWdlci5zdGFydFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbi54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueSA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyAxICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgICAgIHNlbGVjdFZlYyA9ICggUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS5nZXRDaGlsZEJ5TmFtZSggXCJjaGlsZF9wb3NcIiApIGFzIExheWEuU3ByaXRlM0QgKS50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRwb3M6TGF5YS5WZWN0b3IzID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShjaGlsZGRpY3Quc2NlbmUgLGNoaWxkZGljdC5pbml0YnVpbGQgKTtcclxuICAgICAgICAgICAgICAgIHBvc1ZlYy54ID0gY2hpbGRwb3MueCArIG9mZnNldFBvcy54O1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnkgPSBjaGlsZHBvcy55ICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgICAgIHNlbGVjdFZlYyA9IGNoaWxkcG9zO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgbnBjc3A6TGF5YS5TcHJpdGUzRCA9IENoYXJhY3RlclBvb2wuQWRkQ2hhcmFjdGVyKCBucGNjZmcubmFtZSxOcGNTY3JpcHQsUHJvcE1hbmFnZXIuc2NlbmUzRCApO1xyXG4gICAgICAgICAgICBucGNzcC5uYW1lID0gXCJucGNfXCIgKyBpbmRleDtcclxuICAgICAgICAgICAgbnBjc3AudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zVmVjO1xyXG4gICAgICAgICAgICB2YXIgbnBjc2NyaXB0Ok5wY1NjcmlwdCA9IG5wY3NwLmdldENvbXBvbmVudCggTnBjU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5zZXRub3dTZWxlY3RWZWMoIHNlbGVjdFZlYyApO1xyXG4gICAgICAgICAgICBucGNzY3JpcHQubnBjaW5mbyggbnBjY2ZnICk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm5wY0RpY3RbIG5wY3NwLm5hbWUgXSA9IG5wY3NwO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5ucGNzY3JpcHREaWN0W25wY3NwLm5hbWVdID0gbnBjc2NyaXB0O1xyXG4gICAgICAgICAgICBucGNzY3JpcHQuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAvLyB0aGlzLlNob3dVSShucGNzcCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zb2xlLmxvZyhcIkNyZWF0TnBjMi0tLVwiKTtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBpbmRleCA9IDA7XHJcbiAgICBTaG93VUkoX3Nwcml0ZTpMYXlhLlNwcml0ZTNEKXtcclxuICAgICAgICB2YXIgVUlQb3MgPSBfc3ByaXRlLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICB2YXIgTkFNRVVJID0gbmV3IExheWEuVGV4dCgpO1xyXG4gICAgICAgIGxldCByYW5kb20gPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KDEsMzApO1xyXG4gICAgICAgXHJcbiAgICAgICAgTkFNRVVJLnRleHQgPSBcIm5wY19cIisgdGhpcy5pbmRleDtcclxuICAgICAgICBOQU1FVUkuZm9udFNpemUgPSA2MDtcclxuICAgICAgICBOQU1FVUkuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuICAgICAgICBOQU1FVUkuc2NhbGVYID0gMC41O1xyXG4gICAgICAgIE5BTUVVSS5zY2FsZVkgPSAwLjU7XHJcbiAgICAgICAgTkFNRVVJLmFsaWduID0gXCJjZW50ZXJcIjtcclxuICAgICAgICBOQU1FVUkudmFsaWduID0gXCJtaWRkbGVcIjtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKE5BTUVVSSk7XHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoMSwgdGhpcywgKCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgU2NyZWVuUG9zID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5jYXJtYS53b3JsZFRvVmlld3BvcnRQb2ludChVSVBvcywgU2NyZWVuUG9zKTtcclxuICAgICAgICAgICAgTkFNRVVJLnBvcyhTY3JlZW5Qb3MueCwgU2NyZWVuUG9zLnkrMjApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5pbmRleCsrO1xyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIFNob3dUaGVHYW1lU2NlbmUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHZhciB1cmxBcnI6QXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhU2NyaXB0LmlzY2FuZm9sbG93ID0gdHJ1ZTtcclxuICAgICAgICB2YXIgcm9sZURhdGE6Um9sZURhdGEgPSAoIFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLlJvbGVEYXRhO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHJvbGVEYXRhLmxldmVsbWFwQXJyO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgYXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHVybEFyci5pbmRleE9mKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggYXJyW2ldICkgKSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggYXJyW2ldICkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBucGNBcnI6QXJyYXk8YW55PiA9IHJvbGVEYXRhLmxldmVsY2ZnLm5wYztcclxuICAgICAgICBmb3IoIGkgPSAwO2kgPCBucGNBcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggTnBjQ0ZHLmRpY3RbIG5wY0FycltpXS5pZCBdLm5hbWUgKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IHVybEFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6dXJsQXJyW2ldIH0gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRlcjNEQXJyKCBwYXRoQXJyLHRoaXMsdGhpcy5TY2VuZUNyZWF0Q29tcGxldGUsbnVsbCx0cnVlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBTY2VuZUNyZWF0Q29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5SZWZyZXNoVGVycmFpbigpO1xyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB0aGlzLkNyZWF0ZVBsYXllciggUm9sZURhdGEucm9sZUNmZyApO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTnBjKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBMaXN0ZW5PbkV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5zdGFydCx0aGlzLHRoaXMuRW50ZXJHYW1lICk7IFxyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5qdW1wLHRoaXMsdGhpcy5KdW1wICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCx0aGlzLHRoaXMuUmVmcmVzaENoYXJhY3Rlck1vZGVsICk7XHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcbiAgICBwcml2YXRlIENoYXJhY3RlckxvYWRFbmQoIHVybDpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xyXG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IGFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhO1xyXG4gICAgICAgIGlmKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggUm9sZURhdGEucm9sZUNmZy5uYW1lICkgPT0gdXJsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3JlYXRlUGxheWVyKCBSb2xlRGF0YS5yb2xlQ2ZnICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSnVtcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlBsYXllclNjcmlwdC5UZXN0SnVtcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVNwcml0ZSgpO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLm9uKEV2ZW50Lk1PVVNFX1VQLCB0aGlzLCB0aGlzLm9uTW91c2VVcCk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5vbihFdmVudC5NT1VTRV9PVVQsIHRoaXMsIHRoaXMub25Nb3VzZVVwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNwOiBTcHJpdGU7XHJcbiAgICBwcml2YXRlIHByZVJhZGlhbjogbnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgY3JlYXRlU3ByaXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3AgPSBuZXcgU3ByaXRlKCk7XHJcbiAgICAgICAgdmFyIHc6IG51bWJlciA9IDIwMCwgaDogbnVtYmVyID0gMzAwO1xyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgdywgaCwgXCIjRkY3RjUwXCIpO1xyXG4gICAgICAgIHRoaXMuc3Auc2l6ZSh3LCBoKTtcclxuICAgICAgICB0aGlzLnNwLnBpdm90KHcgLyAyLCBoIC8gMik7XHJcbiAgICAgICAgdGhpcy5zcC5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnNwKTtcclxuXHJcbiAgICAgICAgdGhpcy5zcC5vbihFdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLm9uTW91c2VEb3duKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTW91c2VEb3duKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHRvdWNoZXM6IEFycmF5PGFueT4gPSBlLnRvdWNoZXM7XHJcblxyXG4gICAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID09IDIpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVSYWRpYW4gPSBNYXRoLmF0YW4yKFxyXG4gICAgICAgICAgICAgICAgdG91Y2hlc1swXS5zdGFnZVkgLSB0b3VjaGVzWzFdLnN0YWdlWSxcclxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uc3RhZ2VYIC0gdG91Y2hlc1sxXS5zdGFnZVgpO1xyXG5cclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5vbihFdmVudC5NT1VTRV9NT1ZFLCB0aGlzLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbk1vdXNlTW92ZShlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0b3VjaGVzOiBBcnJheTxhbnk+ID0gZS50b3VjaGVzO1xyXG4gICAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID09IDIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbm93UmFkaWFuOiBudW1iZXIgPSBNYXRoLmF0YW4yKFxyXG4gICAgICAgICAgICAgICAgdG91Y2hlc1swXS5zdGFnZVkgLSB0b3VjaGVzWzFdLnN0YWdlWSxcclxuICAgICAgICAgICAgICAgIHRvdWNoZXNbMF0uc3RhZ2VYIC0gdG91Y2hlc1sxXS5zdGFnZVgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zcC5yb3RhdGlvbiArPSAxODAgLyBNYXRoLlBJICogKG5vd1JhZGlhbiAtIHRoaXMucHJlUmFkaWFuKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucHJlUmFkaWFuID0gbm93UmFkaWFuO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTW91c2VVcChlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIExheWEuc3RhZ2Uub2ZmKEV2ZW50Lk1PVVNFX01PVkUsIHRoaXMsIHRoaXMub25Nb3VzZU1vdmUpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBFbnRlckdhbWUoamlhc3U/KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXJTY3JpcHQuc3RhcnRSdW4oamlhc3UpO1xyXG4gICAgICAgIHZhciBucGNkaWN0OmFueSA9IFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Q7XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gbnBjZGljdFtzXTtcclxuICAgICAgICAgICAgbnBjc2NyaXB0LnN0YXJ0UnVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQ2xlYXJNb21lbnRDaGFyYWN0ZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLm1haW5Sb2xlICYmIHRoaXMuUGxheWVyU2NyaXB0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIENoYXJhY3RlclBvb2wuQ2xlYXJDaGFyYWN0ZXIoIFByb3BNYW5hZ2VyLm1haW5Sb2xlLHRoaXMuUGxheWVyU2NyaXB0LnJlc291c2VOYW1lLHRoaXMuUGxheWVyU2NyaXB0ICk7XHJcbiAgICAgICAgICAgIHRoaXMuUGxheWVyU2NyaXB0ID0gbnVsbDtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIubWFpblJvbGUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgU2V0U2NlbmUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJhY2tncm91bmRQYXJlbnQ6TGF5YS5TcHJpdGUgPSBMYXlvdXRDb250cm9sLkluc3RhbmNlLmJhY2tncm91bmQuZGlzcGxheU9iamVjdDtcclxuICAgICAgICB2YXIgc2NlbmViZzpmYWlyeWd1aS5HQ29tcG9uZW50ID0gZmFpcnlndWkuVUlQYWNrYWdlLmNyZWF0ZU9iamVjdCggXCJtYWluXCIsXCJnYW1iZ1wiICkgYXMgZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgICAgICBzY2VuZWJnLnNldFNpemUoZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCwgZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpO1xyXG4gICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuYmFja2dyb3VuZC5hZGRDaGlsZCggc2NlbmViZyApO1xyXG4gICAgICAgIC8vIFVpTWFuYWdlci5pbnN0YW5jZS5hZGQoIEdhbWVCZ1ZpZXcsbnVsbCxMYXllck5vdGlmeS5MQVlFUl9CQUNLR1JPVU5EICk7XHJcblxyXG4gICAgICAgIC8v5re75YqgM0TlnLrmma9cclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNEID0gYmFja2dyb3VuZFBhcmVudC5hZGRDaGlsZChuZXcgTGF5YS5TY2VuZTNEKCkpIGFzIExheWEuU2NlbmUzRDtcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELnBoeXNpY3NTaW11bGF0aW9uLmNvbnRpbnVvdXNDb2xsaXNpb25EZXRlY3Rpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICAvL+a3u+WKoOeFp+ebuOaculxyXG4gICAgICAgIFByb3BNYW5hZ2VyLmNhcm1hID0gKFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQobmV3IExheWEuQ2FtZXJhKDAsIDAuMSwgNzApKSkgYXMgTGF5YS5DYW1lcmE7XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQgPSBQcm9wTWFuYWdlci5jYXJtYS5hZGRDb21wb25lbnQoIENhbWVyYU1hbmFnZXIgKTtcclxuXHJcbiAgICAgICAgUHJvcE1hbmFnZXIuY2FybWEuY2xlYXJGbGFnID0gTGF5YS5CYXNlQ2FtZXJhLkNMRUFSRkxBR19ERVBUSE9OTFk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy/mt7vliqDmlrnlkJHlhYlcclxuICAgICAgICB2YXIgZGlyZWN0aW9uTGlnaHQ6IExheWEuRGlyZWN0aW9uTGlnaHQgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJEaXJlY3Rpb25hbExpZ2h0XCIpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0Oy8vUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5EaXJlY3Rpb25MaWdodCgpKSBhcyBMYXlhLkRpcmVjdGlvbkxpZ2h0O1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQoIGRpcmVjdGlvbkxpZ2h0ICk7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQudHJhbnNmb3JtLndvcmxkTWF0cml4LnNldEZvcndhcmQobmV3IExheWEuVmVjdG9yMygxLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICAvLyB2YXIgZGlyZWN0aW9uTGlnaHQ6IExheWEuRGlyZWN0aW9uTGlnaHQgPSBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKG5ldyBMYXlhLkRpcmVjdGlvbkxpZ2h0KCkpIGFzIExheWEuRGlyZWN0aW9uTGlnaHQ7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQuY29sb3IgPSBuZXcgTGF5YS5WZWN0b3IzKDEsMSwxKTtcclxuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC5pbnRlbnNpdHkgPSAwLjU7XHJcbiAgICAgICAgLy8gZGlyZWN0aW9uTGlnaHQudHJhbnNmb3JtLndvcmxkTWF0cml4LnNldEZvcndhcmQobmV3IExheWEuVmVjdG9yMygxLCAtMSwgMCkpO1xyXG5cclxuICAgICAgICBQcm9wTWFuYWdlci5zdGFydFBsYW5lID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRE1vZGVsKFwic3RhcnRwYW5lbFwiKSk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChQcm9wTWFuYWdlci5zdGFydFBsYW5lKTtcclxuXHJcbiAgICAgICAgUHJvcE1hbmFnZXIuZW5kUGxhbmUgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJlbmRwYW5lbFwiKSk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChQcm9wTWFuYWdlci5lbmRQbGFuZSk7XHJcblxyXG4gICAgICAgIC8vIFByb3BNYW5hZ2VyLmJnc3ByaXRlM2QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJkaXN0YW50dmlld1wiKSk7XHJcbiAgICAgICAgLy8gUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChQcm9wTWFuYWdlci5iZ3Nwcml0ZTNkKTtcclxuXHJcbiAgICAgICAgLy/pm77ljJbku6PnoIFcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmVuYWJsZUZvZyA9IHRydWU7XHJcbiAgICAgICAgLy/orr7nva7pm77ljJbnmoTpopzoibJcclxuICAgICAgICB2YXIgZm9nQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFsyXS52YWx1ZSApO1xyXG4gICAgICAgIGlmKCBHYW1lQ0ZHLmRpY3RbOF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHd1Y29sb3I6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzhdLnZhbHVlICk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZm9nQ29sb3IgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih3dWNvbG9yWzBdKSxOdW1iZXIod3Vjb2xvclsxXSksTnVtYmVyKHd1Y29sb3JbMl0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5mb2dDb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMCwwLDAuNik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v6K6+572u6Zu+5YyW55qE6LW35aeL5L2N572u77yM55u45a+55LqO55u45py655qE6Led56a7XHJcbiAgICAgICAgdmFyIHZhbHVlQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFszXS52YWx1ZSApO1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZm9nU3RhcnQgPSBOdW1iZXIoIHZhbHVlQXJyWzBdICk7XHJcbiAgICAgICAgLy/orr7nva7pm77ljJbmnIDmtZPlpITnmoTot53nprvjgIJcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmZvZ1JhbmdlID0gTnVtYmVyKCB2YWx1ZUFyclsxXSApO1xyXG4gICAgICAgIHRoaXMuU2hvd1RoZUdhbWVTY2VuZSgpO1xyXG4gICAgICAgIHRoaXMuTGlzdGVuT25FdmVudCgpO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKirmuIXpmaTmiYDmnIlOUEMgKi9cclxuICAgIHByaXZhdGUgQ2xlYXJOcGMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjRGljdDtcclxuICAgICAgICB2YXIgcztcclxuICAgICAgICBmb3IoIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc3A6TGF5YS5NZXNoU3ByaXRlM0QgPSBucGNkaWN0W3NdO1xyXG4gICAgICAgICAgICB2YXIgbnBjc2NyaXB0Ok5wY1NjcmlwdCA9IFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Rbc107XHJcbiAgICAgICAgICAgIHZhciByZXNvdXNlbmFtZTpzdHJpbmcgPSBucGNzY3JpcHQucmVzb3VzZU5hbWU7XHJcbiAgICAgICAgICAgIENoYXJhY3RlclBvb2wuQ2xlYXJDaGFyYWN0ZXIoIHNwLHJlc291c2VuYW1lLG5wY3NjcmlwdCk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBQcm9wTWFuYWdlci5ucGNzY3JpcHREaWN0W3NdO1xyXG4gICAgICAgICAgICBkZWxldGUgbnBjZGljdFtzXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBQYXR0ZXJuKCBtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUGF0dGVybjEtLS0tXCIpO1xyXG4gICAgICAgIGlmKCBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgQmxvY2tzU3ByaXRlOkxheWEuU3ByaXRlM0QgPSBtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJCbG9ja3NcIiApIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIGNoaWRkaWN0OmFueSA9IHt9O1xyXG4gICAgICAgIHZhciBjaGlkc3A6TGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB2YXIgYnVpbGRTcDpMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2FsbF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9hbGxfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2FsbF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiYnVpbGRfZnJvbnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfbGVmdF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9yaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udGxlZnRfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRsZWZ0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9mcm9udGxlZnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfZnJvbnRyaWdodF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0cmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleD0wO1xyXG4gICAgICAgIHZhciBQcm9wczpMYXlhLlNwcml0ZTNEID0gbWFwU3ByaXRlM0QuZ2V0Q2hpbGRCeU5hbWUoIFwiUHJvcHNcIiApIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcIlNjYWZmb2xkaW5nX1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJTY2FmZm9sZGluZ19cIiArIGluZGV4ICkuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiU2NhZmZvbGRpbmdfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXg9MDtcclxuICAgICAgICB3aGlsZSggUHJvcHMuZ2V0Q2hpbGRCeU5hbWUoIFwiZ3JpbGxpbmdfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IFByb3BzLmdldENoaWxkQnlOYW1lKCBcImdyaWxsaW5nX1wiICsgaW5kZXggKS5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJncmlsbGluZ19cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgdmFyIGp1bXBjaGlsZFNwOkxheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBpc2NyZWF0ZWp0OmJvb2xlYW4gPSAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlKS5Sb2xlRGF0YS5MZXZlbElEIDwgMyA/IHRydWU6ZmFsc2U7XHJcbiAgICAgICAgd2hpbGUoIFByb3BzLmdldENoaWxkQnlOYW1lKCBcIkp1bXBCb29zdF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAganVtcGNoaWxkU3AgPSBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJKdW1wQm9vc3RfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBpZiggaXNjcmVhdGVqdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBwb3M6TGF5YS5WZWN0b3IzID0ganVtcGNoaWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBwb3MueSArPSAzO1xyXG4gICAgICAgICAgICAgICAgdmFyIGppYW50b3U6TGF5YS5NZXNoU3ByaXRlM0QgPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKCBMYXlhLmxvYWRlci5nZXRSZXMoIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggXCJBcnJvd1wiICkgKSxQcm9wTWFuYWdlci5zY2VuZTNELGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcG9zICApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuamlhbnRvdUFyci5wdXNoKCBqaWFudG91ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgUHJvcE1hbmFnZXIucGF0dGVybkRpY3RbIG1hcFNwcml0ZTNELm5hbWUgXSA9IGNoaWRkaWN0O1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIlBhdHRlcm4yLS0tLVwiKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIG9uU3ByaXRlQ2xpY2soZTogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB2YXIgcmFuZG9tQW5nbGU6IG51bWJlciA9IE1hdGgucmFuZG9tKCkgKiAxODA7XHJcbiAgICAgICAgLy/lj5HpgIHoh6rlrprkuYnkuovku7ZcclxuICAgICAgICAvLyB0aGlzLnNwLmV2ZW50KEludGVyYWN0aW9uX0N1c3RvbUV2ZW50LlJPVEFURSwgW3JhbmRvbUFuZ2xlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6Kem5Y+R6Ieq5a6a5LmJ55qEcm90YXRl5LqL5Lu2XHJcbiAgICBwcml2YXRlIG9uUm90YXRlKG5ld0FuZ2xlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgIExheWEuVHdlZW4udG8odGhpcy5zcCwgeyBcInJvdGF0aW9uXCI6IG5ld0FuZ2xlIH0sIDEwMDAsTGF5YS5FYXNlLmVsYXN0aWNPdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLyBcclxuXHJcbiAgICBwcml2YXRlIFJlZnJlc2hDaGFyYWN0ZXJNb2RlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgYWdlbmN5dXNlcm1lc3NhZ2U6QWdlbmN5VXNlck1lc3NhZ2UgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICk7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhBcnIucHVzaCgge3VybDpBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIFJvbGVEYXRhLnJvbGVDZmcubmFtZSApIH0gKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLkNoYXJhY3RlckxvYWRFbmQsbnVsbCx0cnVlLEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKirmm7TmlrDlnLDlvaIgKi9cclxuICAgIHB1YmxpYyBSZWZyZXNoVGVycmFpbiggICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB2YXIgbm93bGV2ZWxjZmc6TGV2ZWxDRkcgPSBSb2xlRGF0YS5sZXZlbGNmZztcclxuICAgICAgICB2YXIgbWFwQXJyOkFycmF5PHN0cmluZz4gPSBSb2xlRGF0YS5sZXZlbG1hcEFycjtcclxuICAgICAgICB2YXIgbWFwU3ByaXRlM0Q6TGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB2YXIgbWFwbmFtZTpzdHJpbmc7XHJcbiAgICAgICAgdmFyIF9sYXN0bWFwU3ByaXRlM0Q6TGF5YS5TcHJpdGUzRDtcclxuXHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBQcm9wTWFuYWdlci5ub3dtYXBEaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIChQcm9wTWFuYWdlci5ub3dtYXBEaWN0W3NdIGFzIExheWEuTWVzaFNwcml0ZTNEKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciggdmFyIGk6bnVtYmVyID0gMDtpIDwgbWFwQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbWFwbmFtZSA9IG1hcEFycltpXTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJtYXBuYW1lMS0tLS1cIixtYXBuYW1lKTtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLm5vd21hcERpY3RbIG1hcG5hbWUgXSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1hcFNwcml0ZTNEID0gUHJvcE1hbmFnZXIubm93bWFwRGljdFsgbWFwbmFtZSBdO1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTItLS0tXCIsbWFwbmFtZSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RNb2RlbChtYXBuYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTMtLS0tXCIsbWFwbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoc3AsIFByb3BNYW5hZ2VyLnNjZW5lM0QsIGZhbHNlLG51bGwpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcG5hbWU0LS0tLVwiLG1hcG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIubm93bWFwRGljdFsgbWFwbmFtZSBdID0gbWFwU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcG5hbWU1LS0tLVwiLG1hcG5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBpID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIG5vd2xldmVsY2ZnLmZpcnN0U2NlbmVwb3MgKTtcclxuICAgICAgICAgICAgICAgIG1hcFNwcml0ZTNELnRyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIE51bWJlciggYXJyWzBdKSxOdW1iZXIoIGFyclsxXSksTnVtYmVyKCBhcnJbMl0gKSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVuZFBvczpMYXlhLlZlY3RvcjMgPSAoX2xhc3RtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJFTkRcIiApIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgZW5kUG9zLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgZW5kUG9zLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QudHJhbnNmb3JtLnBvc2l0aW9uID0gZW5kUG9zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuUGF0dGVybiggbWFwU3ByaXRlM0QgKTtcclxuICAgICAgICAgICAgX2xhc3RtYXBTcHJpdGUzRCA9IG1hcFNwcml0ZTNEO1xyXG4gICAgICAgICAgICB2YXIgZW5kUG9zMTpMYXlhLlZlY3RvcjMgPSAobWFwU3ByaXRlM0QuZ2V0Q2hpbGRCeU5hbWUoIFwiRU5EXCIgKSBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm0ucG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICAgICAgZW5kUG9zMS56ICs9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNl0udmFsdWUpO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5lbmRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3MxO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiA9IGVuZFBvczEuejtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIuZ2FtZXdpblBvc1ogLT0gMjtcclxuICAgICAgICAgICAgLy8gUHJvcE1hbmFnZXIuYmdzcHJpdGUzZC50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCAwLC0yMCwtNDAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcblxyXG59IiwiaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRFdmVudERhdGFcclxue1xyXG4gICAgc3RhdGljIFJlc0RpY1ZhbHVlOnN0cmluZyA9IFwiQ29tcG9uZW50RXZlbnREYXRhXCI7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBsb2dnZXI6IFRleHQ7XHJcbiAgICBwcml2YXRlIGtleURvd25MaXN0OiBBcnJheTxib29sZWFuPjtcclxuXHJcblxyXG4gICAgdGFyZ2V0OmFueTtcclxuICAgIHR5cGU6c3RyaW5nO1xyXG4gICAgdGhpc09iamVjdDphbnk7XHJcbiAgICBsaXN0ZW5lcjpGdW5jdGlvbjtcclxuXHJcbiAgICBwcml2YXRlIGxpc3RlbktleWJvYXJkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMua2V5RG93bkxpc3QgPSBbXTtcclxuXHJcbiAgICAgICAgLy/mt7vliqDplK7nm5jmjInkuIvkuovku7Ys5LiA55u05oyJ552A5p+Q5oyJ6ZSu5YiZ5Lya5LiN5pat6Kem5Y+RXHJcbiAgICAgICAgTGF5YS5zdGFnZS5vbihMYXlhLkV2ZW50LktFWV9ET1dOLCB0aGlzLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICAgICAgLy/mt7vliqDplK7nm5jmiqzotbfkuovku7ZcclxuICAgICAgICBMYXlhLnN0YWdlLm9uKExheWEuRXZlbnQuS0VZX1VQLCB0aGlzLCB0aGlzLm9uS2V5VXApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKumUruebmOaMieS4i+WkhOeQhiovXHJcbiAgICBwcml2YXRlIG9uS2V5RG93bihlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBrZXlDb2RlOiBudW1iZXIgPSBlW1wia2V5Q29kZVwiXTtcclxuICAgICAgICB0aGlzLmtleURvd25MaXN0W2tleUNvZGVdID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBjbGVhcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50eXBlPW51bGw7XHJcbiAgICAgICAgdGhpcy50aGlzT2JqZWN0PW51bGw7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lcj1udWxsO1xyXG4gICAgICAgIEdhbWVQb29sLlJlbW92ZUl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSx0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6ZSu55uY5oqs6LW35aSE55CGKi9cclxuICAgIHByaXZhdGUgb25LZXlVcChlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmtleURvd25MaXN0W2VbXCJrZXlDb2RlXCJdXTtcclxuICAgIH1cclxuXHJcbn0iLCJcclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgRGF0YUluZm9CYXNlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioq5re35reGKioqKioqKioqICovXHJcbiAgICBzaG93QXBlKCkge1xyXG5cdFx0Y29uc3QgXHJcblx0XHRcdG1vbmtleTFQYXRoID0gXCIuL3Jlcy9hcGVzL21vbmtleTEucG5nXCIsXHJcblx0XHRcdG1vbmtleTJQYXRoID0gXCIuL3Jlcy9hcGVzL21vbmtleTIucG5nXCI7XHJcblxyXG5cdFx0Ly8g5pa55rOVMe+8muS9v+eUqGxvYWRJbWFnZVxyXG5cdFx0bGV0IGFwZSA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG5cdFx0TGF5YS5zdGFnZS5hZGRDaGlsZChhcGUpO1xyXG5cdFx0YXBlLmxvYWRJbWFnZShtb25rZXkxUGF0aCk7XHJcblxyXG5cdFx0Ly8g5pa55rOVMu+8muS9v+eUqGRyYXdUZXh0dXJlXHJcblx0XHRMYXlhLmxvYWRlci5sb2FkKG1vbmtleTJQYXRoLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRsZXQgbW9ua2V5MiA9IExheWEubG9hZGVyLmdldFJlcyhtb25rZXkyUGF0aCk7XHJcblx0XHRcdGxldCBhcGUyID0gbmV3IExheWEuU3ByaXRlKCk7XHJcblx0XHRcdExheWEuc3RhZ2UuYWRkQ2hpbGQoYXBlMik7XHJcblx0XHRcdGFwZTIuZ3JhcGhpY3MuZHJhd1RleHR1cmUobW9ua2V5MiwgMTAwLCAwKTtcclxuXHRcdH0pKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgXHJcblxyXG4gICAgcHVibGljIERhdGFJbmZvKCBkYXRhOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggZGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIGRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbWQ6YW55ID0gdGhpc1tzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBpdGVtZCAhPSBudWxsICkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzXSA9IGRhdGFbc107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgRGVidWdlci5sb2coIFwiVk865pyq5a6a5LmJ5bGe5oCnLVwiICsgcyApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKirmt7fmt4YgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQnV0dG9uKHNraW46IHN0cmluZyxuYW1lOnN0cmluZyxjYjpGdW5jdGlvbixpbmRleDpudW1iZXIpOkxheWEuQnV0dG9uIHtcclxuICAgICAgICB2YXIgYnRuOkxheWEuQnV0dG9uID0gbmV3IExheWEuQnV0dG9uKHNraW4sbmFtZSk7XHJcbiAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGJ0bik7XHJcbiAgICAgICAgYnRuLm9uKExheWEuRXZlbnQuQ0xJQ0ssdGhpcyxjYik7XHJcbiAgICAgICAgYnRuLnNpemUoMTQ3LDU1KTtcclxuICAgICAgICBidG4ubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgYnRuLnJpZ2h0ID0gMTA7XHJcbiAgICAgICAgYnRuLnRvcCA9IGluZGV4ICogKGJ0bi5oZWlnaHQgKyAxMCk7XHJcblx0XHRyZXR1cm4gYnRuO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIGRpc3BhdGNoRXZlbnQodHlwZTogc3RyaW5nLCBkYXRhPzogYW55KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ldmVudCh0eXBlLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIFxyXG59IiwiaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IFNwcml0ZSA9IExheWEuU3ByaXRlO1xyXG5pbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBMb2NhbERhdGEgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57ICAgXHJcbiAgICBzdGF0aWMgUmVzRGljVmFsdWU6c3RyaW5nID0gXCJMb2NhbERhdGFcIjtcclxuXHJcbiAgICBwcml2YXRlIGxvZ2dlcjpMYXlhLlRleHQ7XHJcbiAgICAvKipcclxuICAgICAqIOW8leeUqOasoeaVsFxyXG4gICAgICovXHJcbiAgICByZWY6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUNvcmFsUmVjdCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgY29yYWxSZWN0OiBTcHJpdGUgPSBuZXcgU3ByaXRlKCk7XHJcbiAgICAgICAgY29yYWxSZWN0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMiwgXCIjRkY3RjUwXCIpO1xyXG5cclxuICAgICAgICAvL+iuvue9ruWQjeensFxyXG4gICAgICAgIGNvcmFsUmVjdC5uYW1lID0gXCLnj4rnkZroibLlrrnlmahcIjtcclxuICAgICAgICBjb3JhbFJlY3Quc2l6ZShMYXlhLnN0YWdlLndpZHRoLCBMYXlhLnN0YWdlLmhlaWdodCAvIDIpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoY29yYWxSZWN0KTtcclxuXHJcbiAgICAgICAgY29yYWxSZWN0Lm9uKEV2ZW50Lk1PVVNFX0RPV04sIHRoaXMsIHRoaXMub25Eb3duKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZURlZXBTa3libHVlUmVjdCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgZGVlcFNreWJsdWVSZWN0OiBTcHJpdGUgPSBuZXcgU3ByaXRlKCk7XHJcbiAgICAgICAgZGVlcFNreWJsdWVSZWN0LmdyYXBoaWNzLmRyYXdSZWN0KDAsIDAsIDEwMCwgMTAwLCBcIiMwMEJGRkZcIik7XHJcbiAgICAgICAgLy/orr7nva7lkI3np7BcclxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3QubmFtZSA9IFwi5aSp6JOd6Imy55+p5b2iXCI7XHJcbiAgICAgICAgLy/orr7nva7lrr3pq5jvvIjopoHmjqXmlLbpvKDmoIfkuovku7blv4Xpobvorr7nva7lrr3pq5jvvIzlkKbliJnkuI3kvJrooqvlkb3kuK3vvIkgIFxyXG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5zaXplKDEwMCwgMTAwKTtcclxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3QucG9zKDEwLCAxMCk7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChkZWVwU2t5Ymx1ZVJlY3QpO1xyXG5cclxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3Qub24oRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5vbkRvd24pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOacgOWQjuS4gOasoeiiq+W8leeUqOeahOaXtumXtFxyXG4gICAgICovXHJcbiAgICB0aW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDljIXlkI1cclxuICAgICAqL1xyXG4gICAgcGFja2FnZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgY2xlYXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yZWYgPSAwO1xyXG4gICAgICAgIHRoaXMudGltZSA9IDA7XHJcbiAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IFwiXCI7XHJcbiAgICAgICAgR2FtZVBvb2wuUmVtb3ZlSXRlbSggTG9jYWxEYXRhLlJlc0RpY1ZhbHVlLHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKirkvqblkKzlpITnkIbmlrnms5UqL1xyXG5cdFx0cHJpdmF0ZSBvbkRvd24oZTogRXZlbnQpOiB2b2lkIHtcclxuXHRcdFx0dGhpcy5sb2dnZXIudGV4dCArPSBcIueCueWHuyAtIFwiICsgZS50YXJnZXQubmFtZSArIFwiXFxuXCI7XHJcblx0XHR9XHJcbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vQ0ZHL0xldmVsQ0ZHXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBEYXRhSW5mb0Jhc2UgfSBmcm9tIFwiLi9EYXRhSW5mb0Jhc2VcIjtcclxuXHJcblxyXG5pbXBvcnQgRXZlbnREYXRhID0gTGF5YS5FdmVudERhdGE7XHJcblx0aW1wb3J0IFNrZWxldG9uICA9IExheWEuU2tlbGV0b247XHJcblx0aW1wb3J0IFRlbXBsZXQgICA9IExheWEuVGVtcGxldDtcclxuXHRpbXBvcnQgU3ByaXRlICAgID0gTGF5YS5TcHJpdGU7XHJcblx0aW1wb3J0IEV2ZW50ICAgICA9IExheWEuRXZlbnQ7XHJcblx0aW1wb3J0IEJyb3dzZXIgICA9IExheWEuQnJvd3NlcjtcclxuXHRpbXBvcnQgSGFuZGxlciAgID0gTGF5YS5IYW5kbGVyO1xyXG5cdGltcG9ydCBTdGF0ICAgICAgPSBMYXlhLlN0YXQ7XHJcblx0aW1wb3J0IFR3ZWVuICAgICA9IExheWEuVHdlZW47XHJcbiAgICBpbXBvcnQgV2ViR0wgICAgID0gTGF5YS5XZWJHTDtcclxuICAgIFxyXG5leHBvcnQgY2xhc3MgUm9sZURhdGEgZXh0ZW5kcyBEYXRhSW5mb0Jhc2UgXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpSb2xlRGF0YTtcclxuICAgIC8qKlxyXG4gICAgICog6YeR5biBXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX0dvbGQ6bnVtYmVyPTA7XHJcblxyXG4gICAgcHJpdmF0ZSBfcm9sZWlkOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgcm9sZUNmZzpSb2xlQ0ZHO1xyXG5cclxuICAgIHByaXZhdGUgX2xldmVpZDpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGxldmVsY2ZnOkxldmVsQ0ZHO1xyXG4gICAgcHVibGljIGxldmVsbWFwQXJyOkFycmF5PHN0cmluZz47XHJcblxyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcigpOyBcclxuICAgICAgICBSb2xlRGF0YS5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFJvbGVEYXRhIHtcclxuICAgICAgICBpZiAoUm9sZURhdGEuaW5zID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSb2xlRGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUm9sZURhdGEuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGxldCBsb2NhbGRhdGFjb250cm9sOkxvY2FsRGF0YUNvbnRyb2wgPSBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlO1xyXG4gICAgICAgIC8vIHZhciBub3dHb2xkOm51bWJlciA9IE51bWJlcihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkdldFVzZXIoQWNjb3VudFVzZXIubW9uZXkpKTtcclxuICAgICAgICAvLyB0aGlzLkdvbGQgPSBub3dHb2xkO1xyXG4gICAgICAgIHRoaXMuTW9uZXkgPSBsb2NhbGRhdGFjb250cm9sLmdldG51bSggVXNlckRhdGFJbmZvLmdvbGQgKTtcclxuICAgICAgICB0aGlzLl9yb2xlaWQgPSBsb2NhbGRhdGFjb250cm9sLmdldG51bSggVXNlckRhdGFJbmZvLnJvbGVpZCApO1xyXG4gICAgICAgIGlmKCB0aGlzLkNoYXJhY3RlcklEID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5DaGFyYWN0ZXJJRCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuSW5pdENoYXJhY3RlckluZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgICBcclxuICAgICAgICB0aGlzLl9sZXZlaWQgPSBsb2NhbGRhdGFjb250cm9sLmdldG51bSggVXNlckRhdGFJbmZvLmxldmVsaWQgKTtcclxuICAgICAgICBpZiggdGhpcy5fbGV2ZWlkID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbGV2ZWlkID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5SZWZyZXNoTGV2ZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5vd2xldmVsKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xldmVpZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Tm93U2VydmVyTGV2ZWwoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWlkO1xyXG4gICAgfVxyXG5cclxuICAgIExldmVsVXAoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbGV2ZWlkKys7XHJcbiAgICAgICAgTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5hZGRzdHIoIFVzZXJEYXRhSW5mby5sZXZlbGlkLHRoaXMuX2xldmVpZC50b1N0cmluZygpICk7XHJcbiAgICAgICAgdGhpcy5SZWZyZXNoTGV2ZWwoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHB1YmxpYyBzdGFydEZ1bigpOnZvaWRcclxuXHRcdHtcclxuXHRcdFx0dGhpcy5tQW5pUGF0aCA9IFwicmVzL3NwaW5lL3NwaW5lUmVzNi9hbGllbi5za1wiO1xyXG5cdFx0XHR0aGlzLm1GYWN0b3J5ID0gbmV3IFRlbXBsZXQoKTtcclxuXHRcdFx0dGhpcy5tRmFjdG9yeS5vbihFdmVudC5DT01QTEVURSwgdGhpcywgdGhpcy5wYXJzZUNvbXBsZXRlKTtcclxuXHRcdFx0dGhpcy5tRmFjdG9yeS5vbihFdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkVycm9yKTtcclxuXHRcdFx0dGhpcy5tRmFjdG9yeS5sb2FkQW5pKHRoaXMubUFuaVBhdGgpO1xyXG5cdFx0fVxyXG5cdFx0cHJpdmF0ZSBvbkVycm9yKCk6dm9pZFxyXG5cdFx0e1xyXG5cdFx0XHRjb25zb2xlLmxvZyhcImVycm9yXCIpO1xyXG5cdFx0fVxyXG5cdFx0XHJcblx0XHRwcml2YXRlIHBhcnNlQ29tcGxldGUoKTp2b2lkIHtcclxuXHRcdFx0Ly/liJvlu7rmqKHlvI/kuLox77yM5Y+v5Lul5ZCv55So5o2i6KOFXHJcblx0XHRcdHRoaXMubUFybWF0dXJlID0gdGhpcy5tRmFjdG9yeS5idWlsZEFybWF0dXJlKDEpO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS54ID0gdGhpcy5tU3RhcnRYO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS55ID0gdGhpcy5tU3RhcnRZO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS5zY2FsZSgwLjUsIDAuNSk7XHJcblx0XHRcdExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5tQXJtYXR1cmUpO1xyXG5cdFx0XHR0aGlzLm1Bcm1hdHVyZS5vbihFdmVudC5MQUJFTCwgdGhpcywgdGhpcy5vbkV2ZW50KTtcclxuXHRcdFx0dGhpcy5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwcml2YXRlIFJlZnJlc2hMZXZlbCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbHYgPSB0aGlzLl9sZXZlaWQ7XHJcbiAgICAgICAgdmFyIG5vd2NmZ2x2Om51bWJlciA9IDA7XHJcbiAgICAgICAgdmFyIGFsbG51bXM6bnVtYmVyID0gTGV2ZWxDRkcudmVjLmxlbmd0aDtcclxuICAgICAgICBpZiggbHYgPiBhbGxudW1zIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZTpudW1iZXIgPSAobHYtYWxsbnVtcyklKCBhbGxudW1zLTIgKTtcclxuICAgICAgICAgICAgaWYoICB2YWx1ZSA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbm93Y2ZnbHYgPSBhbGxudW1zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbm93Y2ZnbHYgPSB2YWx1ZSArIDI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbm93Y2ZnbHYgPSBsdjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sZXZlbGNmZyA9IExldmVsQ0ZHLmRpY3RbIG5vd2NmZ2x2IF07XHJcbiAgICAgICAgdGhpcy5sZXZlbG1hcEFyciA9IEdhbWVVdGlscy5jdXRzdHJ0b0Fycih0aGlzLmxldmVsY2ZnLnJvYWQpO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQudXNlcmluZm9FdmVudF9sZXZlbGlkICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgICAgIHByaXZhdGUgbUFuaVBhdGg6c3RyaW5nO1xyXG5cdFx0cHJpdmF0ZSBtU3RhcnRYOm51bWJlciA9IDQwMDtcclxuXHRcdHByaXZhdGUgbVN0YXJ0WTpudW1iZXIgPSA1MDA7XHJcblx0XHRwcml2YXRlIG1GYWN0b3J5OlRlbXBsZXQ7XHJcblx0XHRwcml2YXRlIG1BY3Rpb25JbmRleDpudW1iZXIgPSAwO1xyXG5cdFx0cHJpdmF0ZSBtQ3VyckluZGV4Om51bWJlciA9IDA7XHJcblx0XHRwcml2YXRlIG1Bcm1hdHVyZTpTa2VsZXRvbjtcclxuXHRcdHByaXZhdGUgbUN1cnJTa2luSW5kZXg6bnVtYmVyID0gMDtcclxuXHRcdHByaXZhdGUgbUZhY3RvcnkyOlRlbXBsZXQ7XHJcblx0XHRwcml2YXRlIG1MYWJlbFNwcml0ZTpTcHJpdGU7XHJcblxyXG4gICAgcHJpdmF0ZSBwbGF5KCk6dm9pZFxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLm1DdXJySW5kZXgrKztcclxuXHRcdFx0aWYgKHRoaXMubUN1cnJJbmRleCA+PSB0aGlzLm1Bcm1hdHVyZS5nZXRBbmltTnVtKCkpXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0aGlzLm1DdXJySW5kZXggPSAwO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMubUFybWF0dXJlLnBsYXkodGhpcy5tQ3VyckluZGV4LGZhbHNlKTtcclxuXHRcdFx0XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdHByaXZhdGUgb25FdmVudChlKTp2b2lkXHJcblx0XHR7XHJcblx0XHRcdExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5tTGFiZWxTcHJpdGUpO1xyXG5cdFx0XHR0aGlzLm1MYWJlbFNwcml0ZS54ID0gdGhpcy5tU3RhcnRYO1xyXG5cdFx0XHR0aGlzLm1MYWJlbFNwcml0ZS55ID0gdGhpcy5tU3RhcnRZO1xyXG5cdFx0XHR0aGlzLm1MYWJlbFNwcml0ZS5ncmFwaGljcy5jbGVhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcblxyXG4gICAgbW92ZXNwZWVkOm51bWJlciA9IDA7XHJcbiAgICBmcm9udGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIGxlZnRqdW1wOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICByaWdodGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHVwY2xpbWI6bnVtYmVyID0gMDtcclxuICAgIHNsaWRlY2xpbWI6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgSW5pdENoYXJhY3RlckluZm8oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5yb2xlQ2ZnID0gUm9sZUNGRy5kaWN0WyB0aGlzLl9yb2xlaWQgXTtcclxuICAgICAgICB0aGlzLm1vdmVzcGVlZCA9IHRoaXMucm9sZUNmZy5zcGVlZDtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmZyb250anVtcCA9IHRoaXMucm9sZUNmZy5mcm9udGp1bXA7XHJcbiAgICAgICAgdGhpcy5sZWZ0anVtcCA9IHRoaXMucm9sZUNmZy5sZWZ0anVtcDtcclxuICAgICAgICB0aGlzLnJpZ2h0anVtcCA9IHRoaXMucm9sZUNmZy5yaWdodGp1bXA7XHJcbiAgICAgICAgdGhpcy51cGNsaW1iID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcudXBjbGltYiApO1xyXG4gICAgICAgIHRoaXMuc2xpZGVjbGltYiA9IHRoaXMucm9sZUNmZy5zbGlkZWNsaW1iO1xyXG5cclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC54ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wLnkgKTtcclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuZnJvbnRqdW1wLnogKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLmxlZnRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5sZWZ0anVtcC54ICk7XHJcbiAgICAgICAgLy8gdGhpcy5sZWZ0anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcubGVmdGp1bXAueSApO1xyXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueiA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wLnogKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcucmlnaHRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcucmlnaHRqdW1wLnkgKTtcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcucmlnaHRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5zbGlkZWNsaW1iLnggKTtcclxuICAgICAgICAvLyB0aGlzLnNsaWRlY2xpbWIueSA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnNsaWRlY2xpbWIueSApO1xyXG4gICAgICAgIC8vIHRoaXMuc2xpZGVjbGltYi56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi56ICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNldCBsZXZlaWQoIHZhbHVlOm51bWJlciApXHJcbiAgICAvLyB7XHJcbiAgICAvLyAgICAgaWYoIHRoaXMuX2xldmVpZCAhPSB2YWx1ZSApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICB0aGlzLl9sZXZlaWQgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgdGhpcy5sZXZlbGNmZyA9IExldmVsQ0ZHLmRpY3RbIHRoaXMuX2xldmVpZCBdO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XHJcbiAgICAvLyAgICAgICAgIENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZHN0ciggVXNlckRhdGFJbmZvLmxldmVsaWQsdGhpcy5fbGV2ZWlkLnRvU3RyaW5nKCkgKTtcclxuICAgIC8vICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCApO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IExldmVsSUQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgQ2hhcmFjdGVySUQoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3JvbGVpZCAhPSB2YWx1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlaWQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5Jbml0Q2hhcmFjdGVySW5mbygpO1xyXG4gICAgICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLnJvbGVpZCx0aGlzLl9yb2xlaWQudG9TdHJpbmcoKSApO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgQ2hhcmFjdGVySUQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcm9sZWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgTW9uZXkoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX0dvbGQgIT0gdmFsdWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fR29sZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmdvbGQsdGhpcy5fR29sZC50b1N0cmluZygpICk7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQuVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IE1vbmV5KCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX0dvbGQ7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU2tpbkRhdGFcclxue1xyXG4gICAgcm9sZUNGRzpSb2xlQ0ZHO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquaLpeacie+8jDHvvJrlt7Lnu4/mi6XmnIlcclxuICAgICAqL1xyXG4gICAgc3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBoYXNudW06bnVtYmVyID0gMDtcclxuICAgIFxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlVGV4dCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgdHh0OkxheWEuVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcclxuXHJcbiAgICAgICAgdHh0LnRleHQgPSBcIkxheWFib3jmmK9IVE1MNeW8leaTjuaKgOacr+aPkOS+m+WVhuS4juS8mOengOeahOa4uOaIj+WPkeihjOWVhu+8jOmdouWQkUFTL0pTL1RT5byA5Y+R6ICF5o+Q5L6bSFRNTDXlvIDlj5HmioDmnK/mlrnmoYjvvIFcIjtcclxuXHJcbiAgICAgICAgdHh0LndpZHRoID0gMzAwO1xyXG5cclxuICAgICAgICB0eHQuZm9udFNpemUgPSA0MDtcclxuICAgICAgICB0eHQuY29sb3IgPSBcIiNmZmZmZmZcIjtcclxuXHJcbiAgICAgICAgLy/orr7nva7mlofmnKzkuLrlpJrooYzmlofmnKxcclxuICAgICAgICB0eHQud29yZFdyYXAgPSB0cnVlO1xyXG5cclxuICAgICAgICB0eHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSB0eHQudGV4dFdpZHRoID4+IDE7XHJcbiAgICAgICAgdHh0LnkgPSBMYXlhLnN0YWdlLmhlaWdodCAtIHR4dC50ZXh0SGVpZ2h0ID4+IDE7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodHh0KTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xyXG5leHBvcnQgY2xhc3MgVXNlckRhdGFJbmZvXHJcbnsgICBcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDorrDlvZXkuIrmrKHnprvlvIDml7bpl7RcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGxhc3R0aW1lOnN0cmluZyA9IFwibGFzdHRpbWVcIjtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBjYXBsYXN0Zmx1c2h0aW1lOnN0cmluZyA9IFwiY2FwdGltZVwiO1xyXG4gICAgc3RhdGljIGNhcHN0b3JhZ2VhcHBpZHM6c3RyaW5nID0gXCJjYXBhcHBpZHNcIjtcclxuICAgIHN0YXRpYyBoYXNnZXRhcHBpZHM6c3RyaW5nID0gXCJoYXNnZXRhcHBpZHNcIjtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBvbkNhbGxMYXRlcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm9uQ2FsbExhdGVyIHRyaWdnZXJlZFwiKTtcclxuXHJcbiAgICAgICAgdmFyIHRleHQ6TGF5YS5UZXh0ID0gbmV3IExheWEuVGV4dCgpO1xyXG4gICAgICAgIHRleHQuZm9udCA9IFwiU2ltSGVpXCI7XHJcbiAgICAgICAgdGV4dC5mb250U2l6ZSA9IDMwO1xyXG4gICAgICAgIHRleHQuY29sb3IgPSBcIiNGRkZGRkZcIjtcclxuICAgICAgICB0ZXh0LnRleHQgPSBcIuaJk+W8gOaOp+WItuWPsOWPr+ingeivpeWHveaVsOS7heinpuWPkeS6huS4gOasoVwiO1xyXG4gICAgICAgIHRleHQuc2l6ZShMYXlhLnN0YWdlLndpZHRoLCBMYXlhLnN0YWdlLmhlaWdodCk7XHJcbiAgICAgICAgdGV4dC53b3JkV3JhcCA9IHRydWU7XHJcbiAgICAgICAgdGV4dC52YWxpZ24gPSBcIm1pZGRsZVwiO1xyXG4gICAgICAgIHRleHQuYWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGV4dCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOinkuiJsuS/oeaBr1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcm9sZURhdGE6c3RyaW5nID0gXCJyb2xlRGF0YVwiO1xyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBzdGF0aWMgZ29sZDpzdHJpbmcgPSBcImdvbGRcIjtcclxuICAgIHN0YXRpYyByb2xlaWQ6c3RyaW5nID0gXCJyb2xlaWRcIjtcclxuICAgIHN0YXRpYyBsZXZlbGlkOnN0cmluZyA9IFwibGV2ZWxpZFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55qu6IKkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBza2luOnN0cmluZyA9IFwic2tpblwiO1xyXG5cclxuICAgIHN0YXRpYyBsYXN0RGF5OnN0cmluZyA9IFwibGFzdERheVwiO1xyXG5cclxuICAgIHN0YXRpYyBub3dkYXlTaGFyZTpzdHJpbmcgPSBcImRheXNoYXJlXCI7XHJcblxyXG4gICAgc3RhdGljIG5vd2RheVZpZGVvOnN0cmluZyA9IFwiZGF5dmlkZW9cIjtcclxuXHJcbiAgICBcclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgYnV0dG9uMTpMYXlhLlNwcml0ZTtcclxuICAgIHByaXZhdGUgYnV0dG9uMjpMYXlhLlNwcml0ZTtcclxuICAgIHByaXZhdGUgb25EZWNyZWFzZUFscGhhMShlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8v56e76Zmk6byg5qCH5Y2V5Ye75LqL5Lu2XHJcbiAgICAgICAgdGhpcy5idXR0b24xLm9mZihFdmVudC5DTElDSywgdGhpcywgdGhpcy5vbkRlY3JlYXNlQWxwaGExKTtcclxuICAgICAgICAvL+WumuaXtuaJp+ihjOS4gOasoSjpl7TpmpTml7bpl7QpXHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDMwMDAsIHRoaXMsIHRoaXMub25Db21wbGV0ZTEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EZWNyZWFzZUFscGhhMihlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8v56e76Zmk6byg5qCH5Y2V5Ye75LqL5Lu2XHJcbiAgICAgICAgdGhpcy5idXR0b24yLm9mZihFdmVudC5DTElDSywgdGhpcywgdGhpcy5vbkRlY3JlYXNlQWxwaGEyKTtcclxuICAgICAgICAvL+WumuaXtuaJp+ihjOS4gOasoSjln7rkuo7luKfnjocpXHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZU9uY2UoNjAsIHRoaXMsIHRoaXMub25Db21wbGV0ZTIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db21wbGV0ZTEoKTogdm9pZCB7XHJcbiAgICAgICAgLy9zcEJ0bjHnmoTpgI/mmI7luqblh4/lsJEwLjVcclxuICAgICAgICB0aGlzLmJ1dHRvbjEuYWxwaGEgLT0gMC41O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db21wbGV0ZTIoKTogdm9pZCB7XHJcbiAgICAgICAgLy9zcEJ0bjLnmoTpgI/mmI7luqblh4/lsJEwLjVcclxuICAgICAgICB0aGlzLmJ1dHRvbjIuYWxwaGEgLT0gMC41O1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFVzZXJJbmZvRXZlbnQgXHJcbntcclxuICAgIHN0YXRpYyBVc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVVc2VyRGF0YVwiO1xyXG5cclxuICAgIHN0YXRpYyB1c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkXCI7XHJcblxyXG4gICAgc3RhdGljIHVzZXJpbmZvRXZlbnRfbGV2ZWxpZDpzdHJpbmcgPSBcInVzZXJpbmZvRXZlbnRfbGV2ZWxpZFwiO1xyXG5cclxuICAgIHN0YXRpYyB1cGRhdGVQbGF5ZXJJbmZvOnN0cmluZyA9IFwiVXNlckluZm9FdmVudF91cGRhdGVQbGF5ZXJJbmZvXCI7XHJcbn0iLCJpbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi9HbG9iYWxcIjtcclxuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcblxyXG5pbXBvcnQge0NvbXBvbmVudEV2ZW50RGF0YX0gZnJvbSBcIi4vRGF0YS9Db21wb25lbnRFdmVudERhdGFcIjtcclxuaW1wb3J0IHtSZWNDb25maWdzfSBmcm9tIFwiLi9Db25maWcvUmVjQ29uZmlnc1wiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuL1RpbWUvVGltZXNUYW1wZXJcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuaW1wb3J0IHtHbG9iYWxXYWl0aW5nfSBmcm9tIFwiLi9HbG9iYWxXYWl0aW5nXCI7XHJcbmltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7R2FtZVBvb2x9IGZyb20gXCIuL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2xcIjtcclxuaW1wb3J0IHsgTGF5b3V0Q29udHJvbCB9IGZyb20gXCIuL0NvbnRyb2wvTGF5b3V0Q29udHJvbFwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuL0NvbnRyb2wvUmVzRGF0YUNvbnRyb2xcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuL0NvbnRyb2wvQXVkaW9Db250cm9sXCI7XHJcbmltcG9ydCB7IENvbm5lY3RDb250cm9sIH0gZnJvbSBcIi4vQ29udHJvbC9Db25uZWN0Q29udHJvbFwiO1xyXG5pbXBvcnQge3Bpbmd0YWl1dGlsc30gZnJvbSBcIi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XHJcbmltcG9ydCB7QWdlbmN5TG9naW59IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lMb2dpblwiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IHtBZ2VuY3lNYWlufSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5TWFpblwiO1xyXG5pbXBvcnQge0FnZW5jeUluR2FtZX0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeUluR2FtZVwiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lTa2luXCI7XHJcbmltcG9ydCB7QWdlbmN5VHJpYWx9IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lUcmlhbFwiO1xyXG5pbXBvcnQge0FnZW5jeUxvdHRlcnl9IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBHYW1lQ29udGVudHMgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMlua4uOaIj1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVjQ29uZmlncy5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuaW5pdCgpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5pbml0bGF5ZXIoKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBDb25uZWN0Q29udHJvbC5Db25ubmVjdCgpO1xyXG4gICAgICAgIFRpbWVzVGFtcGVyLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBwaW5ndGFpdXRpbHMuSW5zdGFuY2UuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFBvb2xPYmplY3QoKTtcclxuICAgICAgICB0aGlzLmluaXRQcm94eSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdG1hcFZpZXcoKTtcclxuICAgICAgICB0aGlzLmJlZ2luTG9hZEhhbmRsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMluWvueixoeaxoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRQb29sT2JqZWN0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEdhbWVQb29sLk1hcmsoIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSxDb21wb25lbnRFdmVudERhdGEgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMluaooeWdl+S7o+eQhuexu1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRQcm94eSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbXZjcG9vbDpQYW5lbFJlc0RpYyA9IFBhbmVsUmVzRGljLkluc3RhbmNlO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lMb2dpbiApO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lNYWluICk7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeUluR2FtZSApO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lTa2luICk7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoQWdlbmN5VHJpYWwgKTtcclxuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZCggQWdlbmN5TG90dGVyeSApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdG1hcFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG12Y3Bvb2w6UGFuZWxSZXNEaWMgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZTtcclxuICAgICAgICAvLyBtdmNwb29sLm1hcFZpZXcoIE1hcFZpZXdUeXBlLkRhaWx5cmV3YXJkVmlldyxEYWlseXJld2FyZFZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJlZ2luTG9hZEhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHBhdGhhcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhhcnIucHVzaCggeyB1cmw6QXNzZXRQYXRoLmdldFJlc0NvbmZpZygpLCB0eXBlOiBMYXlhLkxvYWRlci5KU09OIH0gKTtcclxuICAgICAgICBwYXRoYXJyLnB1c2goIHsgdXJsOkFzc2V0UGF0aC5nZXRHYW1lVmVyc2lvbigpLCB0eXBlOiBMYXlhLkxvYWRlci5KU09OIH0gKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UuTG9hZGVycyggcGF0aGFycix0aGlzLHRoaXMucmVjbG9hZENvbXBsZXRlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNsb2FkQ29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdhbWV2ZXJzaW9uOmFueSA9IFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkdhaW5SZXNvdXJjZXMoIEFzc2V0UGF0aC5nZXRHYW1lVmVyc2lvbigpLGZhbHNlICk7XHJcbiAgICAgICAgaWYoIGdhbWV2ZXJzaW9uIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdsb2JhbC5nYW1lVmVyc2lvbiA9IGdhbWV2ZXJzaW9uLnZlcnNpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdsb2JhbC5nYW1lVmVyc2lvbiA9IFwiMS4wLjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGNvbmZpZ3JlczphbnkgPSBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5HYWluUmVzb3VyY2VzKCBBc3NldFBhdGguZ2V0UmVzQ29uZmlnKCksZmFsc2UgKTtcclxuICAgICAgICBSZWNDb25maWdzLkluc3RhbmNlLmluaXRSZWMoIGNvbmZpZ3JlcyApO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkR3JvdXAoXCJsb2FkaW5nXCIsdGhpcyx0aGlzLm9uUHJlTG9hZGVkLHRoaXMub25QcmVwcm9ncmVzcyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25QcmVwcm9ncmVzcyh2YWx1ZTpudW1iZXIpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uUHJlTG9hZGVkKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkFkZFZpZXdQYWNrQnlOYW1lKCBcImxvYWRpbmdcIix0cnVlLGZhbHNlICk7XHJcbiAgICAgICAgdmFyIGdsb2JhbHdhaXR1cmw6c3RyaW5nID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoXCJsb2FkaW5nXCIsXCJnbG9iYWxXYWl0aW5nXCIpO1xyXG4gICAgICAgIFBhbmVsQmFzZUNvbnRyb2wudmlld2JnVXJsID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEl0ZW1VUkwoXCJsb2FkaW5nXCIsXCJpbWdfYmxhY2tcIik7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKGdsb2JhbHdhaXR1cmwsIEdsb2JhbFdhaXRpbmcpO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmdsb2JhbE1vZGFsV2FpdGluZyA9IGdsb2JhbHdhaXR1cmw7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcud2luZG93TW9kYWxXYWl0aW5nID0gZ2xvYmFsd2FpdHVybDtcclxuICAgICAgICAvLyBDUEFVdGlscy5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5Mb2dpbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBMb2dpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lMb2dpbiApIGFzIEFnZW5jeUxvZ2luKS5Mb2dpbigpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge1Jlc0RhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCBHYW1lQ0ZHIGZyb20gXCIuLi9DRkcvR2FtZUNGR1wiO1xyXG5cclxuaW1wb3J0IFNwcml0ZSA9IExheWEuU3ByaXRlO1xyXG5cdGltcG9ydCBTdGFnZSA9IExheWEuU3RhZ2U7XHJcblx0aW1wb3J0IE1hcExheWVyID0gTGF5YS5NYXBMYXllcjtcclxuXHRpbXBvcnQgVGlsZWRNYXAgPSBMYXlhLlRpbGVkTWFwO1xyXG5cdGltcG9ydCBQb2ludCA9IExheWEuUG9pbnQ7XHJcblx0aW1wb3J0IFJlY3RhbmdsZSA9IExheWEuUmVjdGFuZ2xlO1xyXG5cdGltcG9ydCBIYW5kbGVyID0gTGF5YS5IYW5kbGVyO1xyXG4gICAgaW1wb3J0IFdlYkdMID0gTGF5YS5XZWJHTDtcclxuICAgIFxyXG5cclxuZXhwb3J0IGNsYXNzIENhbWVyYU1hbmFnZXIgZXh0ZW5kcyBMYXlhLlNjcmlwdDNEXHJcbntcclxuICAgIHByb3RlY3RlZCBjYW1lcmE6IExheWEuQ2FtZXJhO1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNmb3JtOkxheWEuVHJhbnNmb3JtM0Q7XHJcbiAgICBwcml2YXRlIF9kaXNWZWN0b3I6TGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBfdG9WZWM6TGF5YS5WZWN0b3IzO1xyXG4gICAgcHVibGljIGlzY2FuZm9sbG93OmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQXdha2UoKTp2b2lke1xyXG4gICAgICAgIC8v6I635Y+W6ISa5pys5omA5bGe5a+56LGhXHJcbiAgICAgICAgdGhpcy5jYW1lcmEgPSB0aGlzLm93bmVyIGFzIExheWEuQ2FtZXJhO1xyXG4gICAgICAgIHRoaXMuX3RvVmVjID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLmZpZWxkT2ZWaWV3ID0gOTA7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIG9uU3RhcnQoKTp2b2lke1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IHRoaXMuY2FtZXJhLnRyYW5zZm9ybTtcclxuICAgICAgICAvL+aXi+i9rOaRhOWDj+acuuinkuW6plxyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS5yb3RhdGUobmV3IExheWEuVmVjdG9yMyggMCwgMCwgMCksIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAvLyB0aGlzLmNhbWVyYS5jbGVhckNvbG9yID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgdGlsZWRNYXA6IFRpbGVkTWFwO1xyXG5cdFx0cHJpdmF0ZSBsYXllcjogTWFwTGF5ZXI7XHJcblx0XHRwcml2YXRlIHNwcml0ZTogU3ByaXRlO1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVNYXAoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50aWxlZE1hcCA9IG5ldyBUaWxlZE1hcCgpO1xyXG4gICAgICAgIHRoaXMudGlsZWRNYXAuY3JlYXRlTWFwKFwicmVzL3RpbGVkTWFwL2lzb21ldHJpY19ncmFzc19hbmRfd2F0ZXIuanNvblwiLCBuZXcgUmVjdGFuZ2xlKDAsIDAsIExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0KSwgSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5tYXBMb2FkZWQpLCBudWxsLCBuZXcgUG9pbnQoMTYwMCwgODAwKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblN0YWdlQ2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHA6IFBvaW50ID0gbmV3IFBvaW50KDAsIDApO1xyXG4gICAgICAgIHRoaXMubGF5ZXIuZ2V0VGlsZVBvc2l0aW9uQnlTY3JlZW5Qb3MoTGF5YS5zdGFnZS5tb3VzZVgsIExheWEuc3RhZ2UubW91c2VZLCBwKTtcclxuICAgICAgICB0aGlzLmxheWVyLmdldFNjcmVlblBvc2l0aW9uQnlUaWxlUG9zKE1hdGguZmxvb3IocC54KSwgTWF0aC5mbG9vcihwLnkpLCBwKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5wb3MocC54LCBwLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFwTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5ZXIgPSB0aGlzLnRpbGVkTWFwLmdldExheWVyQnlJbmRleCgwKTtcclxuXHJcbiAgICAgICAgdmFyIHJhZGl1c1g6IG51bWJlciA9IDMyO1xyXG4gICAgICAgIHZhciByYWRpdXNZOiBudW1iZXIgPSBNYXRoLnRhbigxODAgLyBNYXRoLlBJICogMzApICogcmFkaXVzWDtcclxuICAgICAgICB2YXIgY29sb3I6IHN0cmluZyA9IFwiI0ZGN0Y1MFwiO1xyXG5cclxuICAgICAgICB0aGlzLnNwcml0ZSA9IG5ldyBTcHJpdGUoKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgwLCAwLCAtcmFkaXVzWCwgcmFkaXVzWSwgY29sb3IpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKDAsIDAsIHJhZGl1c1gsIHJhZGl1c1ksIGNvbG9yKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgtcmFkaXVzWCwgcmFkaXVzWSwgMCwgcmFkaXVzWSAqIDIsIGNvbG9yKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZShyYWRpdXNYLCByYWRpdXNZLCAwLCByYWRpdXNZICogMiwgY29sb3IpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcHJpdGUpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJpdmF0ZSBfdXB2ZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKTtcclxuICAgIHByaXZhdGUgX2luZGV4Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9zbGVycFZhbHVlOm51bWJlciA9IDg7XHJcbiAgICBwcml2YXRlIF9sb29rYXRWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHB1YmxpYyBvblVwZGF0ZSgpOiB2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuaXNjYW5mb2xsb3cgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmlzY2FybWFucGMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubnBjRGljdFtcIm5wY18wXCJdIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLlZlY3RvcjMuYWRkKCBQcm9wTWFuYWdlci5ucGNEaWN0W1wibnBjXzBcIl0udHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX2Rpc1ZlY3Rvcix0aGlzLl90b1ZlYyApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3RvVmVjO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54ID0gUHJvcE1hbmFnZXIubnBjRGljdFtcIm5wY18wXCJdLnRyYW5zZm9ybS5wb3NpdGlvbi54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBQcm9wTWFuYWdlci5ucGNEaWN0W1wibnBjXzBcIl0udHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX3VwdmVjICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubWFpblJvbGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVmVjdG9yMy5hZGQoIFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy54ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fdG9WZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdHJhbnNmb3JtLmxvb2tBdCggUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX3VwdmVjICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVmVjdG9yMy5sZXJwKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fdG9WZWMsMTYvMTAwMCAqIHRoaXMuX3NsZXJwVmFsdWUsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy56ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnordGhpcy5fZGlzVmVjdG9yLno7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fdG9WZWMueSA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi55ICsgdGhpcy5fZGlzVmVjdG9yLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fdG9WZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va2F0VmVjLnggPSB0aGlzLl90b1ZlYy54O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvb2thdFZlYy55ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va2F0VmVjLnogPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24uejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCB0aGlzLl9sb29rYXRWZWMsdGhpcy5fdXB2ZWMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2FtZUVuZFJvdGF0ZSh0YXJnZXRQb3M6TGF5YS5WZWN0b3IzLCBzcGVlZDpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc2NhbmZvbGxvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUoIHNwZWVkLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLmxvb2tBdCggdGFyZ2V0UG9zLHRoaXMuX3VwdmVjICk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgU2V0Q2FtZXJhUG9zaXRpb24oIHZlYzpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHZhbHVlQXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIEdhbWVDRkcuZGljdFsxXS52YWx1ZSApO1xyXG4gICAgICAgIHRoaXMuX2Rpc1ZlY3RvciA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKCB2YWx1ZUFyclswXSApLE51bWJlciggdmFsdWVBcnJbMV0gKSxOdW1iZXIoIHZhbHVlQXJyWzJdICkpO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5hZGQodmVjICx0aGlzLl9kaXNWZWN0b3IsdGhpcy5fdG9WZWMgKTtcclxuICAgICAgICB0aGlzLmNhbWVyYS50cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICB0aGlzLmNhbWVyYS50cmFuc2Zvcm0ucG9zaXRpb24ueCA9IHZlYy54O1xyXG4gICAgICAgIC8vIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5sb29rQXQoIHZlYyxuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApICk7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclN0YXRlfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9DaGFyYWN0ZXJTdGF0ZVwiO1xyXG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vQ0ZHL0J1aWxkQ0ZHXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHtDYW1lcmFNYW5hZ2VyfSBmcm9tIFwiLi9DYW1lcmFNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vQ0ZHL05wY0NGR1wiO1xyXG5pbXBvcnQgeyBBc3NldE1hbmFnZXIgfSBmcm9tIFwiLi4vQ29udHJvbC9Bc3NldE1hbmFnZXJcIjtcclxuaW1wb3J0IFBvb2xNYW5hZ2VyIGZyb20gXCIuLi9Db250cm9sL1Bvb2xNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTnBjU2NyaXB0IGV4dGVuZHMgTGF5YS5TY3JpcHQzRCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWRNb3ZlVjM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIHByaXZhdGUgX25vd0FjdGlvbjpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHByaXZhdGUgX2FuaW1hdG9yOkxheWEuQW5pbWF0b3I7XHJcblxyXG4gICAgcmVzb3VzZU5hbWU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwcml2YXRlIF9zaGFuZ3BhVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgLyoq5piv5ZCm5Y+R55Sf56Kw5pKeICovXHJcbiAgICBwcml2YXRlIGhhdmVDb2xsaXNpb246Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfVGFyZ2V0Q29sbGlzaW9uOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9ub3JtYWxpemVWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93c2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuXHJcbiAgICBwcml2YXRlIHN0YXlidWlsZDpzdHJpbmcgPSBcIlwiO1xyXG4gICAgXHJcbiAgICBwcml2YXRlIHN0YXlzY2VuZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacqumUge+8jDHvvJrplIHlt6bovrnvvIwy77ya6ZSB5Y+z6L65XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2t4c3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS5nZXRDb21wb25lbnQoIExheWEuQW5pbWF0b3IgKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5zZXRBbmltYXRvciggdGhpcy5fYW5pbWF0b3IgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIExlZnRUcmlhbDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgcHJpdmF0ZSBSaWdodFRyaWFsOkxheWEuU3ByaXRlM0Q7XHJcblxyXG4gICAgcHVibGljIG9uU3RhcnQoKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSAodGhpcy5vd25lciBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm07XHJcbiAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSB0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgLy8gKHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRCkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gKHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0QgKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB2YXIgTGVmdFRyaWFsMSA9IHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcclxuICAgICAgICB2YXIgUmlnaHRUcmlhbDEgPSBzcC5nZXRDaGlsZEJ5TmFtZShcInJpZ2h0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKClcclxuXHJcbiAgICAgICAgXHJcblxyXG5cclxuICAgICAgICB2YXIgc2NhbGU9MC4wMDE7XHJcbiAgICAgICAgdmFyIGluZGV4PUdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMCxBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aC0xKTtcclxuICAgICAgICBpbmRleD1pbmRleCVBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aDtcclxuICAgICAgICB2YXIgcHJlZmFicz1Bc3NldE1hbmFnZXIuQWxsTWFwRGljW2luZGV4XTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbD1Qb29sTWFuYWdlci5HZXRTcHJpdGUzRChwcmVmYWJzKTtcclxuICAgICAgICBMZWZ0VHJpYWwxLnBhcmVudC5hZGRDaGlsZCggdGhpcy5MZWZ0VHJpYWwpO1xyXG4gICAgICAgIHRoaXMuTGVmdFRyaWFsLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uPShMZWZ0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlcj0oTGVmdFRyaWFsMSBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm0ubG9jYWxSb3RhdGlvbkV1bGVyLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9bmV3IExheWEuVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcblxyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbD1Qb29sTWFuYWdlci5HZXRTcHJpdGUzRChwcmVmYWJzKTtcclxuICAgICAgICBSaWdodFRyaWFsMS5wYXJlbnQuYWRkQ2hpbGQodGhpcy5SaWdodFRyaWFsKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsUG9zaXRpb249KFJpZ2h0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5SaWdodFRyaWFsLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXI9KFJpZ2h0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXIuY2xvbmUoKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9bmV3IExheWEuVmVjdG9yMyhzY2FsZSxzY2FsZSxzY2FsZSk7XHJcbiAgICAgICAgUmlnaHRUcmlhbDEuYWN0aXZlPWZhbHNlO1xyXG4gICAgICAgIExlZnRUcmlhbDEuYWN0aXZlPWZhbHNlO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhzcC5uYW1lKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHByaXZhdGUgX2luaXRQb3NWZWM6TGF5YS5WZWN0b3IzO1xyXG4gICAgLyoqXHJcbiAgICAgKiDnirbmgIHvvIww77ya562J5b6F54q25oCB77yMMe+8muW8gOWni+eKtuaAge+8jDLvvJrlrozmiJDnirbmgIFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbm93Um9sZVN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHVibGljIHN0YXJ0UnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dOcGNpbmZvLmdyYXZpdHkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HcmF2aXR5X2cgPSB0aGlzLl9ub3dOcGNpbmZvLmdyYXZpdHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuR3Jhdml0eV9nID0gMTA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NoZWNrdGltZSA9IDUwMDtcclxuICAgICAgICB0aGlzLl9ub3dSb2xlU3RhdGUgPSAxO1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gMDtcclxuICAgICAgICB0aGlzLl9pbml0UG9zVmVjID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5zdGF5YnVpbGQgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc3RheXNjZW5lID0gXCJcIjtcclxuICAgICAgICB0aGlzLl9ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5zdGFuZDtcclxuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy54ID0gMDtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy55ID0gMDtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy56ID0gLXRoaXMubW92ZXNwZWVkO1xyXG4gICAgICAgIHRoaXMuX2lzY2FuTW92ZSA9IHRydWU7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX25vd05wY2luZm86TnBjQ0ZHO1xyXG5cclxuICAgIG1vdmVzcGVlZDpudW1iZXIgPSAwO1xyXG4gICAgZnJvbnRqdW1wc3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIGxlZnRqdW1wc3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHJpZ2h0anVtcHNwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBjbGltYnNwZWVkOm51bWJlciA9IDA7XHJcbiAgICBzaWRlY2xpbWJzcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIHB1YmxpYyBucGNpbmZvKCBjZmc6TnBjQ0ZHICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX25vd05wY2luZm8gPSBjZmc7XHJcbiAgICAgICAgdGhpcy5tb3Zlc3BlZWQgPSB0aGlzLl9ub3dOcGNpbmZvLnNwZWVkO1xyXG4gICAgICAgIHRoaXMuY2xpbWJzcGVlZCA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby51cGNsaW1iICk7XHJcbiAgICAgICAgdGhpcy5mcm9udGp1bXBzcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueSksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC56KSlcclxuICAgICAgICB0aGlzLmxlZnRqdW1wc3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih0aGlzLl9ub3dOcGNpbmZvLmxlZnRqdW1wLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC55KSxOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ubGVmdGp1bXAueikpXHJcbiAgICAgICAgdGhpcy5yaWdodGp1bXBzcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueSksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC56KSlcclxuICAgICAgICB0aGlzLnNpZGVjbGltYnNwZWVkID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIodGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLngpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnkpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnopKVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5mcm9udGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueiApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLmxlZnRqdW1wLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ubGVmdGp1bXAueCApO1xyXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueSA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5sZWZ0anVtcC56ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmxlZnRqdW1wLnogKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC54ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC54ICk7XHJcbiAgICAgICAgLy8gdGhpcy5yaWdodGp1bXAueSA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueSApO1xyXG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnogPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLnogKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy51cGNsaW1iID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnVwY2xpbWIgKTtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uc2xpZGVjbGltYi54ICk7XHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnkgPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uc2xpZGVjbGltYi55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnogPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uc2xpZGVjbGltYi56ICk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog5byA5aeL56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkVudGVyKGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCB7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHRoaXMuQ2FsY3VsYXRlKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIHB1YmxpYyBzZXRub3dTZWxlY3RWZWMoIHBvczpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gcG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2xvY2tieUJ1aWxkbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacquiiq+mUge+8jDHvvJrplIHlrprlt6bovrnvvIwy77ya6ZSB5a6a5Y+z6L6577yMXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2tzdGF0ZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBDYWxjdWxhdGUoIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInJvbGVcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uID0gdGFyZ2V0Lm5hbWU7XHJcbiAgICAgICAgdmFyIG46TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgICAgICBMYXlhLlZlY3RvcjMubm9ybWFsaXplKG5vcm1hbCx0aGlzLl9ub3JtYWxpemVWZWMpO1xyXG4gICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgfHwgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XHJcbiAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF5YnVpbGQgPSB0aGlzLl9UYXJnZXRDb2xsaXNpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXlzY2VuZSA9IHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fVGFyZ2V0Q29sbGlzaW9uICk7XHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgJiYgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPiAodGhpcy5fbm93c2VsZWN0VmVjLnkgLSAwLjEpICApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLngsdGhpcy5fbm93c2VsZWN0VmVjLnksdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IDEgfHx0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDsgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OyAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ICE9IDEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJwYW5lbF9qdW1wXCIgKSAhPSAtMSApIC8v5Yqg6YCf5p2/6Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKFwicGFuZWxfZG93bnNsaXBcIikgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xICYmIHRoaXMubm93QWN0aW9uICE9IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJib3hfc2lkZWp1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc2lkZXNwZWVkdXA7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dBY3Rpb24gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYm94X1N1cm1vdW50XCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNyb3NzO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwO1xyXG4gICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDmjIHnu63norDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljICBvbkNvbGxpc2lvblN0YXkoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIC8vIERlYnVnZXIubG9nKCBcIueisOaSnuS4rVwiICk7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaGF2ZUNvbGxpc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjb2xsaXNpb24ub3RoZXIub3duZXI7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRuYW1lOnN0cmluZyA9IHRhcmdldC5uYW1lO1xyXG4gICAgICAgICAgICBpZiggdGFyZ2V0bmFtZSAhPSBcIlNsaWRlckJvb3N0XCIgJiYgdGFyZ2V0bmFtZS5pbmRleE9mKCBcIm5wY1wiICkgPT0gLTEgJiYgdGFyZ2V0bmFtZS5pbmRleE9mKCBcInJvbGVcIiApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uID0gdGFyZ2V0bmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIHx8IHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcIlNjYWZmb2xkaW5nXCIgKSAhPSAtMSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApIC8v56Kw5Yiw5bu6562R77yM5Yik5pat5piv5LiK54is77yM5bem54is6L+Y5piv5Y+z54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RheWJ1aWxkID0gdGhpcy5fVGFyZ2V0Q29sbGlzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RheXNjZW5lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQucGFyZW50Lm5hbWUsdGFyZ2V0LnBhcmVudC5uYW1lICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9UYXJnZXRDb2xsaXNpb24gKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOe7k+adn+eisOaSnuaXtuaJp+ihjFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Db2xsaXNpb25FeGl0KGNvbGxpc2lvbjpMYXlhLkNvbGxpc2lvbik6dm9pZCBcclxuICAgIHtcclxuICAgICAgICB0aGlzLmhhdmVDb2xsaXNpb24gPSBmYWxzZTtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5DaGVja0VuZCggY29udGFjdFBvaW50Lm5vcm1hbCxjb2xsaXNpb24ub3RoZXIub3duZXIgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBDaGVja0VuZCggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBcIlNsaWRlckJvb3N0XCIgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJucGNcIiApICE9IC0xIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwicm9sZVwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5IYXZlRm9yY2VKdW1wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuSGF2ZUZvcmNlSnVtcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAwO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24gIT0gdGFyZ2V0Lm5hbWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJwYW5lbF9qdW1wXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwOlxyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuSnVtcEFjdGlvbiggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5Nb3ZlWDpcclxuICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9zcGVlZE1vdmVWMy54ICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEp1bXBBY3Rpb24oIHZhbHVlOm51bWJlcixpc3F1YW56aG9uZzpib29sZWFuID0gZmFsc2UgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHZhbHVlID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdmFsdWUgPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpc3F1YW56aG9uZyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbGx2YWx1ZTpudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZGlyOnN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImxlZnRyaWdodFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsdmFsdWUgPSB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdCArIHRoaXMuX25vd05wY2luZm8uanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5qdW1wX2xlZnQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImxlZnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJmcm9udHJpZ2h0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfcmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLGFsbHZhbHVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDw9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImZyb250XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcInJpZ2h0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiZnJvbnRsZWZ0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwiZnJvbnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcInJpZ2h0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcInJpZ2h0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImxlZnRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJmcm9udFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdCArIHRoaXMuX25vd05wY2luZm8uanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwiZnJvbnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBzb3J0IDw9IHRoaXMuX25vd05wY2luZm8uc3RhcnRfYWhlYWQgKyB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggc2VsZWN0ZGlyIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmcm9udFwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBMYXN0QWN0aW9uOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9tb3ZlVGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfY2hpeHVUaW1lOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNBY3Rpb25OdW1zOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzbmVlZGFjdGlvbm51bTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbmVlZGFjdGlvbnRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIE5vd0xhc3RBY3Rpb25TdGF0ZTpzdHJpbmc9XCJcIjtcclxuICAgIHB1YmxpYyBzZXQgbm93QWN0aW9uKCB2YWx1ZTpzdHJpbmcgKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dSb2xlU3RhdGUgPT0gMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93QWN0aW9uICE9IHZhbHVlIHx8IHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcHx8dGhpcy5MYXN0QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXByaWdodCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuTGFzdEFjdGlvbiA9IHRoaXMuX25vd0FjdGlvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd0FjdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9ub3dBY3Rpb24gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc3RhbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc3RhbmQgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJ1bjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wIHx8IHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdCB8fHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDEgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuanVtcCApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5mcm9udGp1bXBzcGVlZC54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5mcm9udGp1bXBzcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5mcm9udGp1bXBzcGVlZC56O1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkID0gdGhpcy5sZWZ0anVtcHNwZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5sZWZ0anVtcHNwZWVkLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmxlZnRqdW1wc3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMubGVmdGp1bXBzcGVlZC56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXByaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSB0aGlzLnJpZ2h0anVtcHNwZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5yaWdodGp1bXBzcGVlZC54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5yaWdodGp1bXBzcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5yaWdodGp1bXBzcGVlZC56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucmlnaHRqdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJwYW5lbF9qdW1wXCIgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5qdW1wU3BlZWQueipidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLk5vd0xhc3RBY3Rpb25TdGF0ZT09dmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeSoyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDwgNTAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmRvd25tb3ZlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcInBhbmVsX2Rvd25zbGlwXCIgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGl4dVRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY3Jvc3M6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwiYm94X1N1cm1vdW50XCIgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnkrMC41O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fc3BlZWRNb3ZlVjMueipidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hpeHVUaW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmh1cmRsZSApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmNsaW1ic3BlZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1id2FsbCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoMCx0aGlzLnNpZGVjbGltYnNwZWVkLnksdGhpcy5zaWRlY2xpbWJzcGVlZC56KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuc2lkZWNsaW1ic3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuc2lkZWNsaW1ic3BlZWQuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW53YWxsbGVmdCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKDAsdGhpcy5zaWRlY2xpbWJzcGVlZC55LHRoaXMuc2lkZWNsaW1ic3BlZWQueilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLnNpZGVjbGltYnNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnNpZGVjbGltYnNwZWVkLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVud2FsbHJpZ2h0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmVlZGFjdGlvbnRpbWUgPSAwLjM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1iZW5kICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLk5vd0xhc3RBY3Rpb25TdGF0ZT12YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5vd0FjdGlvbigpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ub3dBY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbW92ZVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBqdW1wU3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUganVtcEhpZ2h0Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9kaXN5Om51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgR3Jhdml0eV9nOm51bWJlcj0xMDsvL+mHjeWKm+WKoOmAn+W6plxyXG4gICAgcHJpdmF0ZSBfY2hlY2t0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd1JvbGVTdGF0ZSA9PSAxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGR0ID0gMTY7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrdGltZSArPSBkdDtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmlzY2FybWFucGMgKVxyXG4gICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoZWNrdGltZSA+PSA1MDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrdGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd05wY2luZm8gJiYgUHJvcE1hbmFnZXIubWFpblJvbGUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICsgdGhpcy5fbm93TnBjaW5mby5kaXN0YW5jZSA8IFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9pc2Nhbk1vdmUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOi8v6LeR5YqoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IGRpc3RpbWUgKiB0aGlzLl9zcGVlZE1vdmVWMy56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6Ly/niKzljYdcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9zaGFuZ3BhVmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDovL+i3s+i3g1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5HcmF2aXR5X2cqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuR3Jhdml0eV9nKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5fZGlzeSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5Nb3ZlWDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX3NwZWVkTW92ZVYzLngqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IDAuMSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5qdW1wU3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX2NoaXh1VGltZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zaWRlc3BlZWR1cDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX2NoaXh1VGltZSAmJiB0aGlzLkxhc3RBY3Rpb249PUNoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCB0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gdGhpcy5MYXN0QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jcm9zczpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLkdyYXZpdHlfZypkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5fbm93c2VsZWN0VmVjKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPCB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAoMS8wLjMpKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgJiYgKHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biB8fCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZSApICYmICF0aGlzLmhhdmVDb2xsaXNpb24gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiA8PSB0aGlzLl9ub3dzZWxlY3RWZWMueiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IFByb3BNYW5hZ2VyLmRpZVBvc1kgKS8v6KeS6Imy5q275LqhXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuc3RheXNjZW5lID09IFwiXCIgfHwgdGhpcy5zdGF5YnVpbGQgPT0gXCJcIiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl9pbml0UG9zVmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRoaXMuc3RheXNjZW5lLHRoaXMuc3RheWJ1aWxkICkuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogPCBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5XaW4oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc0FjdGlvbk51bXMgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIC8v5aaC5p6c5b2T5YmN5pKt5pS+c3RhdGXlt7Lnu4/mkq3mlL7lrozkuobkuIDmrKFcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5faXNuZWVkYWN0aW9ubnVtID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hbmltYXRvci5nZXRDdXJyZW50QW5pbWF0b3JQbGF5U3RhdGUoKS5ub3JtYWxpemVkVGltZSA+PSB0aGlzLl9pc25lZWRhY3Rpb25udW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93QWN0aW9uTmFtZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGFuZDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbmVlZGFjdGlvbnRpbWUgIT0gMCAmJiB0aGlzLl9tb3ZlVGltZSA+IHRoaXMuX25lZWRhY3Rpb250aW1lIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93QWN0aW9uTmFtZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fZW5kaW5nIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdGltZTpudW1iZXIgPSBkdC8xMDAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lICs9IGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID49IHRoaXMuX2VuZGFubW90aW1lIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR2FtZU92ZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS54ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnkgPSB0aGlzLl9lbmRBbm1vU3BlZWQueSAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueiA9IHRoaXMuX2VuZEFubW9TcGVlZC56ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKCBQcm9wTWFuYWdlci5jYXJtYS5nZXRDb21wb25lbnQoIENhbWVyYU1hbmFnZXIgKSBhcyBDYW1lcmFNYW5hZ2VyICkuR2FtZUVuZFJvdGF0ZSggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLCB0aGlzLl9lbmRBbm1vU3BlZWQxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgR2FtZU92ZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5lbmQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoKTtcclxuICAgIHByaXZhdGUgX2VuZGFubW90aW1lOm51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQxOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIFdpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgdGhpcy5fbm93Um9sZVN0YXRlID0gMjtcclxuICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5ICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLm5wY2VuZCx0aGlzLm93bmVyLm5hbWUgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdG9wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBkZXN0cm95KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY2hhbmdlTW92ZVg6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIEhhdmVGb3JjZUp1bXA6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgcXVhdGVybmlvbjpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uOyBcclxuICAgIHB1YmxpYyBKb3koIHZhbHVlOm51bWJlcixhbmdsZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biB8fCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIHx8IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQgJiYgdGhpcy5fY2hhbmdlTW92ZVggPiAwICkgLy/lvLrliLbot7Pot4NcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuSGF2ZUZvcmNlSnVtcCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0ICYmIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkhhdmVGb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgfHxcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxyXG4gICAgICAgICAgICBhbmdsZSA9IC1hbmdsZSAqIE1hdGguUEkvMTgwO1xyXG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMCwxLDAgKSxhbmdsZSx0aGlzLnF1YXRlcm5pb24gKTtcclxuICAgICAgICAgICAgTGF5YS5WZWN0b3IzLnRyYW5zZm9ybVF1YXQoIHRoaXMuanVtcFNwZWVkLHRoaXMucXVhdGVybmlvbix0aGlzLmp1bXBTcGVlZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX25vd0FjdGlvbk5hbWU6c3RyaW5nO1xyXG4gICAgcHVibGljIFBsYXlBbmltYXRvciggYWN0aW9uTmFtZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gdGhpcy5fbm93QWN0aW9uTmFtZSA9IGFjdGlvbk5hbWU7XHJcbiAgICAgICAgdmFyIF9hY3Rpb25uYW1lID0gdGhpcy5UcmFuc2l0aW9uQWN0aW9uTmFtZShhY3Rpb25OYW1lKTtcclxuICAgICAgICB0aGlzLl9ub3dBY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcclxuICAgICAgICBpZiggdGhpcy5fYW5pbWF0b3IgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0FjdGlvbk5hbWUgPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hbmltYXRvci5zcGVlZCA9IDEuNTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hbmltYXRvci5wbGF5KF9hY3Rpb25uYW1lLDAsMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKui9rOaNouWKqOS9nOWQjeensCAqL1xyXG4gICAgVHJhbnNpdGlvbkFjdGlvbk5hbWUoX2FjdGlvbm5hbWU6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICAgICAgc3dpdGNoIChfYWN0aW9ubmFtZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwicm9sbG92ZXIxXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImNlZmFuMVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJyb2xsb3ZlcjJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2VmYW4yXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1bndhbGxsZWZ0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInBhb3FpYW5nbGVmdFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodGp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1bndhbGxyaWdodFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJwYW9xaWFuZ3JpZ2h0XCJcclxuICAgICAgICAgICAgY2FzZSBcImxlZnRqdW1wXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImxlZnRqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1id2FsbFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJwYXFpYW5nXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1iZW5kXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImNsaW1iZW5kXCJcclxuICAgICAgICAgICAgY2FzZSBcInN0YW5kXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInN0YW5kXCJcclxuICAgICAgICAgICAgY2FzZSBcInNreVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJrb25nemhvbmdcIlxyXG4gICAgICAgICAgICBjYXNlIFwibGFuZDFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibHVvZGkxXCJcclxuICAgICAgICAgICAgY2FzZSBcImxhbmQyXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImx1b2RpMlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJoaWdoanVtcDFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJoaWdoanVtcDJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiZGF0aWFvMlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJydW5cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicnVuXCJcclxuICAgICAgICAgICAgY2FzZSBcImp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwianVtcFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnVwXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkNsaW1iXCJcclxuICAgICAgICAgICAgY2FzZSBcImZhbGxkb3duXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIkZyZWVmYWxsaW5nXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1ibGVmdFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsZWZ0X2NsaW1iXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1icmlnaHRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRfY2xpbWJcIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcHJpZ2h0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInJpZ2h0X2p1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcGxlZnRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdF9qdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcIkNsaW1iTW90aW9uXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcIlBsYXlQYWxvdUFjdGlvblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJodWFjaGFuXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImh1YWNoYW5cIlxyXG4gICAgICAgICAgICBjYXNlIFwiaHVyZGxlXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImt1YWxhblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJzcGVlZHVwanVtcFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJqaWFzdUp1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwiTW92ZVhcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwieHNodW55aVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJkb3dubW92ZVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkb3duU2xpZGVcIlxyXG4gICAgICAgICAgICBjYXNlIFwic2lkZXNwZWVkdXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwic2xpZGVqaWFzdVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjcm9zc1wiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJzdXJtb3VudFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJjbGltYnVwYmxvY2tcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibG9ja2NsaW1iXCJcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBUZXN0SnVtcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXRQb3N0aW9uKCk6TGF5YS5WZWN0b3IzXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QWN0aW9uKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vd1JvbGVTdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlc3Ryb3koKVxyXG4gICAge1xyXG4gICAgICAgIFBvb2xNYW5hZ2VyLlJlY292ZXJTcHJpdGUzRCh0aGlzLkxlZnRUcmlhbClcclxuICAgICAgICBQb29sTWFuYWdlci5SZWNvdmVyU3ByaXRlM0QodGhpcy5SaWdodFRyaWFsKVxyXG4gICAgfVxyXG5cclxuICAgXHJcbn0iLCJpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IEJ1aWxkQ0ZHIGZyb20gXCIuLi9DRkcvQnVpbGRDRkdcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQge0NhbWVyYU1hbmFnZXJ9IGZyb20gXCIuL0NhbWVyYU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xyXG5pbXBvcnQge1dYR2FtZVBsYXRmb3JtfSBmcm9tIFwiLi4vV1hTREsvV1hHYW1lUGxhdGZvcm1cIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IEFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9Db250cm9sL0Fzc2V0TWFuYWdlclwiO1xyXG5pbXBvcnQgUG9vbE1hbmFnZXIgZnJvbSBcIi4uL0NvbnRyb2wvUG9vbE1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBMYXlhLlNjcmlwdDNEIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuICAgIHB1YmxpYyBfdHJhbnNmb3JtOkxheWEuVHJhbnNmb3JtM0Q7XHJcbiAgICBwdWJsaWMgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHVibGljIF9zcGVlZE1vdmVWMzpMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNBY3Rpb25OdW1zOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzbmVlZGFjdGlvbm51bTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbmVlZGFjdGlvbnRpbWU6bnVtYmVyID0gMDtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93QWN0aW9uU3RhdGU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgX1JvbGVEYXRhOlJvbGVEYXRhO1xyXG5cclxuICAgIHByaXZhdGUgX2FuaW1hdG9yOkxheWEuQW5pbWF0b3I7XHJcbiAgICBwcml2YXRlIF9tdWx0aXBsZTpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCAxLDEsMSApO1xyXG5cclxuICAgIHByaXZhdGUgTGVmdFRyaWFsOkxheWEuU3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIFJpZ2h0VHJpYWw6TGF5YS5TcHJpdGUzRDtcclxuXHJcbiAgICBwcml2YXRlIExhc3RBY3Rpb25TdGF0ZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfbW92ZVRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOmAn2J1ZmZ2ZWNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbGFzdGppYXN1U3RhdGU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgYnVmZl9zcGVlZHVwdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBjYW5zaGFrZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHNoYWtldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGRvdWJsZXNwZWVkdXA6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHJlc291c2VOYW1lOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlBsYXllcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBQbGF5ZXIuaW5zID0gdGhpcztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6UGxheWVye1xyXG4gICAgICAgIGlmKFBsYXllci5pbnMgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQbGF5ZXIuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF3YWtlKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9hbmltYXRvciA9ICh0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0QpLmdldENvbXBvbmVudCggTGF5YS5BbmltYXRvciApO1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNldEFuaW1hdG9yKCB0aGlzLl9hbmltYXRvciApO1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IHRoaXMub3duZXIgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBzcC50cmFuc2Zvcm07XHJcbiAgICAgICAgdGhpcy5fUm9sZURhdGEgPSAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlKS5Sb2xlRGF0YTtcclxuICAgICAgICAoIHNwLmdldENvbXBvbmVudCggTGF5YS5SaWdpZGJvZHkzRCApIGFzIExheWEuUmlnaWRib2R5M0QgKS5jY2RNb3Rpb25UaHJlc2hvbGQgPSAwLjAwMTtcclxuXHJcbiAgICAgICAgdmFyIExlZnRUcmlhbDEgPSBzcC5nZXRDaGlsZEJ5TmFtZShcImxlZnR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICAgICAgdmFyIFJpZ2h0VHJpYWwxID0gc3AuZ2V0Q2hpbGRCeU5hbWUoXCJyaWdodHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcclxuICAgICAgICAvLyB0aGlzLkxlZnRUcmlhbCA9IHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcclxuICAgICAgICAvLyB0aGlzLlJpZ2h0VHJpYWwgPSBzcC5nZXRDaGlsZEJ5TmFtZShcInJpZ2h0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEO1xyXG5cclxuICAgICAgICB2YXIgc2NhbGU9MC4wMDE7XHJcbiAgICAgICAgdmFyIGluZGV4PUdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMCxBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aC0xKTtcclxuICAgICAgICBpbmRleD1pbmRleCVBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aDtcclxuICAgICAgICB2YXIgcHJlZmFicz1Bc3NldE1hbmFnZXIuQWxsTWFwRGljW2luZGV4XTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbD1Qb29sTWFuYWdlci5HZXRTcHJpdGUzRChwcmVmYWJzKTtcclxuICAgICAgICBMZWZ0VHJpYWwxLnBhcmVudC5hZGRDaGlsZCggdGhpcy5MZWZ0VHJpYWwpO1xyXG4gICAgICAgIHRoaXMuTGVmdFRyaWFsLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uPShMZWZ0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlcj0oTGVmdFRyaWFsMSBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm0ubG9jYWxSb3RhdGlvbkV1bGVyLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9KExlZnRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsU2NhbGUuY2xvbmUoKTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbC50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgTGF5YS5WZWN0b3IzKHNjYWxlLHNjYWxlLHNjYWxlKTtcclxuXHJcbiAgICAgICAgdGhpcy5SaWdodFRyaWFsPVBvb2xNYW5hZ2VyLkdldFNwcml0ZTNEKHByZWZhYnMpO1xyXG4gICAgICAgIFJpZ2h0VHJpYWwxLnBhcmVudC5hZGRDaGlsZCh0aGlzLlJpZ2h0VHJpYWwpO1xyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbC50cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbj0oUmlnaHRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlcj0oUmlnaHRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlci5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbC50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgTGF5YS5WZWN0b3IzKHNjYWxlLHNjYWxlLHNjYWxlKTtcclxuICAgICAgICBSaWdodFRyaWFsMS5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgICAgTGVmdFRyaWFsMS5hY3RpdmU9ZmFsc2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBfaW5pdFBvc1ZlYzpMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgc3RhcnRSdW4oamlhc3U/KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX1JvbGVEYXRhLnJvbGVDZmcuZ3Jhdml0eSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmcgPSB0aGlzLl9Sb2xlRGF0YS5yb2xlQ2ZnLmdyYXZpdHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuZyA9IDEwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcclxuICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcclxuICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gMTtcclxuICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSAwO1xyXG4gICAgICAgIHRoaXMuZG91Ymxlc3BlZWR1cCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RqaWFzdVN0YXRlID0gXCJcIjtcclxuICAgICAgICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jaGFuZ2VNb3ZlWCA9IDA7XHJcbiAgICAgICAgdGhpcy5faW5pdFBvc1ZlYyA9IHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi546p5a6255qE5Yid5aeL5L2N572uLS0tLVwiLHRoaXMuX2luaXRQb3NWZWMpO1xyXG4gICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gXCJcIjtcclxuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy54ID0gMDtcclxuICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy55ID0gMDtcclxuICAgICAgICBpZihqaWFzdSl7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnogPSAtdGhpcy5fUm9sZURhdGEubW92ZXNwZWVkKjI7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSgzMDAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnogPSAtdGhpcy5fUm9sZURhdGEubW92ZXNwZWVkO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLl9zcGVlZE1vdmVWMy56ID0gLXRoaXMuX1JvbGVEYXRhLm1vdmVzcGVlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIF9pc0NvbGxpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfbm93Q29sbFRhcmdldE5hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX25vcm1hbGl6ZVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBfbm93c2VsZWN0VmVjOkxheWEuVmVjdG9yMztcclxuICAgIHB1YmxpYyBfbm93YnVpbGRuYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgX25vd3NjZW5lbmFtZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8vIHByaXZhdGUgcHpkaWN0OmFueSA9IHt9O1xyXG4gICAgLy8gcHJpdmF0ZSBwemFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+eisOaSnuaXtuaJp+ihjFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Db2xsaXNpb25FbnRlcihjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQge1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB0aGlzLkNhbGN1bGF0ZSggY29udGFjdFBvaW50Lm5vcm1hbCxjb2xsaXNpb24ub3RoZXIub3duZXIsY29udGFjdFBvaW50LnBvc2l0aW9uT25CKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjIHnu63norDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljICBvbkNvbGxpc2lvblN0YXkoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIC8vIERlYnVnZXIubG9nKCBcIueisOaSnuS4rVwiICk7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzQ29sbGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBjb2xsaXNpb24ub3RoZXIub3duZXI7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRuYW1lOnN0cmluZyA9IHRhcmdldC5uYW1lO1xyXG4gICAgICAgICAgICBpZiggdGFyZ2V0bmFtZSAhPSBcIlNsaWRlckJvb3N0XCIgJiYgdGFyZ2V0bmFtZS5pbmRleE9mKCBcIm5wY1wiICkgPT0gLTEgIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgPSB0YXJnZXRuYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSB8fCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcIlNjYWZmb2xkaW5nXCIgKSAhPSAtMSB8fFxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xICkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiYnVpbGRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3didWlsZG5hbWUgPSB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzY2VuZW5hbWUgPSB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImlyb25nYXV6ZVwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5wYXJlbnQubmFtZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50Lm5hbWUsdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5PmnZ/norDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRXhpdChjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNDb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYoIGNvbGxpc2lvbiAmJiBjb2xsaXNpb24uY29udGFjdHMgJiYgY29sbGlzaW9uLmNvbnRhY3RzLmxlbmd0aCA+IDAgJiYgY29sbGlzaW9uLm90aGVyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQ6TGF5YS5Db250YWN0UG9pbnQgPSBjb2xsaXNpb24uY29udGFjdHNbMF07XHJcbiAgICAgICAgICAgIHRoaXMuQ2hlY2tFbmQoIGNvbnRhY3RQb2ludC5ub3JtYWwsY29sbGlzaW9uLm90aGVyLm93bmVyICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKirmo4DmtYvnu5PmnZ/norDmkp4gKi9cclxuICAgIHByaXZhdGUgQ2hlY2tFbmQoIG5vcm1hbDpMYXlhLlZlY3RvcjMsdGFyZ2V0OkxheWEuTm9kZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gXCJTbGlkZXJCb29zdFwiIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwibnBjXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLmlzZm9yY2VKdW1wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmb3JjZUp1bXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5fbG9ja3hzdGF0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUgIT0gdGFyZ2V0Lm5hbWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJwYW5lbF9qdW1wXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCggdGhpcy5ub3dBY3Rpb24gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwOlxyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9Cb2FyZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuSnVtcEFjdGlvbiggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ6XHJcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5ydW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLk1vdmVYOlxyXG4gICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX3NwZWVkTW92ZVYzLnggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiAwOuacqumUge+8jDHvvJrplIHlt6bovrnvvIwy77ya6ZSB5Y+z6L65XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2xvY2t4c3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc2V0bm93U2VsZWN0VmVjKCBwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IHBvcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sb2NrYnlCdWlsZG5hbWU6c3RyaW5nID0gXCJcIjtcclxuICAgIC8qKlxyXG4gICAgICogMDrmnKrooqvplIHvvIwx77ya6ZSB5a6a5bem6L6577yMMu+8mumUgeWumuWPs+i+ue+8jFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2Nrc3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9zaGFuZ3BhVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgLyoq6K6h566X56Kw5pKeICovXHJcbiAgICBwcml2YXRlIENhbGN1bGF0ZSggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlLGNvbGxwb2ludDpMYXlhLlZlY3RvcjMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IFwiU2xpZGVyQm9vc3RcIiB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcIm5wY1wiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZSA9IHRhcmdldC5uYW1lO1xyXG4gICAgICAgIHZhciBuOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICAgICAgTGF5YS5WZWN0b3IzLm5vcm1hbGl6ZShub3JtYWwsdGhpcy5fbm9ybWFsaXplVmVjKTtcclxuICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgfHwgdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJTY2FmZm9sZGluZ1wiICkgIT0gLTEgfHwgXHJcbiAgICAgICAgICAgIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd2J1aWxkbmFtZSA9IHRoaXMuX25vd0NvbGxUYXJnZXROYW1lO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2NlbmVuYW1lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQucGFyZW50Lm5hbWUsdGFyZ2V0LnBhcmVudC5uYW1lICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lLHRoaXMuX25vd0NvbGxUYXJnZXROYW1lICk7XHJcbiAgICAgICAgICAgIH0gICBcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgJiYgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPiAodGhpcy5fbm93c2VsZWN0VmVjLnkgLSAwLjIpIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueSA9PSAxIHx8dGhpcy5fbm9ybWFsaXplVmVjLnkgPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueCA9PSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQ7ICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy54ID09IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1idXAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJyaWdodDsgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiAhPSAxIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jaztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJwYW5lbF9qdW1wXCIgKSAhPSAtMSApIC8v5Yqg6YCf5p2/6Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKFwicGFuZWxfZG93bnNsaXBcIikgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfQm9hcmRcIiApICE9IC0xICYmIHRoaXMubm93QWN0aW9uICE9IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueiA9PSAtMSApIC8v5LiK54isXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dDb2xsVGFyZ2V0TmFtZS5pbmRleE9mKCBcImJveF9zaWRlanVtcFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5zaWRlc3BlZWR1cDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fbm93Q29sbFRhcmdldE5hbWUuaW5kZXhPZiggXCJib3hfU3VybW91bnRcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY3Jvc3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd0NvbGxUYXJnZXROYW1lLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XHJcbiAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHJpdmF0ZSBKdW1wQWN0aW9uKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHZhbHVlID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB2YWx1ZSA8IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dBY3Rpb24gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgX1N0YXRlTmFtZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgUGxheUFuaW1hdG9yKCBhY3Rpb25OYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgX2FjdGlvbm5hbWUgPSB0aGlzLlRyYW5zaXRpb25BY3Rpb25OYW1lKGFjdGlvbk5hbWUpO1xyXG4gICAgICAgIHRoaXMuX1N0YXRlTmFtZSA9IGFjdGlvbk5hbWU7XHJcbiAgICAgICAgaWYoIHRoaXMuX2FuaW1hdG9yIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9TdGF0ZU5hbWUgPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQgfHwgdGhpcy5fU3RhdGVOYW1lID09IENoYXJhY3RlclN0YXRlLmxhbmQxIHx8IHRoaXMuX1N0YXRlTmFtZSA9PSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMS41O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3Iuc3BlZWQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnBsYXkoX2FjdGlvbm5hbWUsMCwwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6L2s5o2i5Yqo5L2c5ZCN56ewICovXHJcbiAgICBUcmFuc2l0aW9uQWN0aW9uTmFtZShfYWN0aW9ubmFtZTpzdHJpbmcpOnN0cmluZ3tcclxuICAgICAgICBzd2l0Y2ggKF9hY3Rpb25uYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyb2xsb3ZlcjFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2VmYW4xXCJcclxuICAgICAgICAgICAgY2FzZSBcInJvbGxvdmVyMlwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJjZWZhbjJcIlxyXG4gICAgICAgICAgICBjYXNlIFwicnVud2FsbGxlZnRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicGFvcWlhbmdsZWZ0XCJcclxuICAgICAgICAgICAgY2FzZSBcInJpZ2h0anVtcFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJyaWdodGp1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwicnVud2FsbHJpZ2h0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInBhb3FpYW5ncmlnaHRcIlxyXG4gICAgICAgICAgICBjYXNlIFwibGVmdGp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdGp1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJ3YWxsXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInBhcWlhbmdcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJlbmRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2xpbWJlbmRcIlxyXG4gICAgICAgICAgICBjYXNlIFwic3RhbmRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwic3RhbmRcIlxyXG4gICAgICAgICAgICBjYXNlIFwic2t5XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImtvbmd6aG9uZ1wiXHJcbiAgICAgICAgICAgIGNhc2UgXCJsYW5kMVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsdW9kaTFcIlxyXG4gICAgICAgICAgICBjYXNlIFwibGFuZDJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibHVvZGkyXCJcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hqdW1wMVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkYXRpYW8xXCJcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hqdW1wMlwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkYXRpYW8yXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1blwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJydW5cIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1idXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiQ2xpbWJcIlxyXG4gICAgICAgICAgICBjYXNlIFwiZmFsbGRvd25cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiRnJlZWZhbGxpbmdcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJsZWZ0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImxlZnRfY2xpbWJcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJyaWdodFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJyaWdodF9jbGltYlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJqdW1wcmlnaHRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRfanVtcFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJqdW1wbGVmdFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsZWZ0X2p1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwiQ2xpbWJNb3Rpb25cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiUGxheVBhbG91QWN0aW9uXCJcclxuICAgICAgICAgICAgY2FzZSBcImh1YWNoYW5cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiaHVhY2hhblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJodXJkbGVcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwia3VhbGFuXCJcclxuICAgICAgICAgICAgY2FzZSBcInNwZWVkdXBqdW1wXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImppYXN1SnVtcFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJNb3ZlWFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJ4c2h1bnlpXCJcclxuICAgICAgICAgICAgY2FzZSBcImRvd25tb3ZlXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImRvd25TbGlkZVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJzaWRlc3BlZWR1cFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJzbGlkZWppYXN1XCJcclxuICAgICAgICAgICAgY2FzZSBcImNyb3NzXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInN1cm1vdW50XCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1idXBibG9ja1wiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsb2NrY2xpbWJcIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgTm93TGFzdEFjdGlvblN0YXRlOnN0cmluZz1cIlwiO1xyXG4gICAgcHVibGljIHNldCBub3dBY3Rpb24oIHZhbHVlOnN0cmluZyApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0FjdGlvblN0YXRlICE9IHZhbHVlIHx8IHRoaXMuTGFzdEFjdGlvblN0YXRlID09IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wIHx8IHRoaXMuX25vd0FjdGlvblN0YXRlID09IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuTGFzdEFjdGlvblN0YXRlID0gdGhpcy5fbm93QWN0aW9uU3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0FjdGlvblN0YXRlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICAgICAgdGhpcy5jYW5zaGFrZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLkNoYW5nZVRyaWFsKCB0cnVlICk7XHJcbiAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fbm93QWN0aW9uU3RhdGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnN0YW5kOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJ1bjpcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5MYXN0QWN0aW9uU3RhdGUgPT0gQ2hhcmFjdGVyU3RhdGUuanVtcCB8fCB0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdCB8fHRoaXMuTGFzdEFjdGlvblN0YXRlID09IENoYXJhY3RlclN0YXRlLmp1bXByaWdodCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8IDUwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmxhbmQxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUubGFuZDIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5qdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuU2V0RWZmZWN0Q29sb3IoIFwiY29sb3Jfd2hpdGVcIiwgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLl9Sb2xlRGF0YS5mcm9udGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fUm9sZURhdGEuZnJvbnRqdW1wLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX1JvbGVEYXRhLmZyb250anVtcC56O1xyXG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwidGlhb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDpcclxuICAgICAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TZXRFZmZlY3RDb2xvciggXCJjb2xvcl93aGl0ZVwiLCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5fUm9sZURhdGEubGVmdGp1bXAueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fUm9sZURhdGEubGVmdGp1bXAueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fUm9sZURhdGEubGVmdGp1bXAuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmxlZnRqdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJ0aWFvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXByaWdodDpcclxuICAgICAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TZXRFZmZlY3RDb2xvciggXCJjb2xvcl93aGl0ZVwiLCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gdGhpcy5fUm9sZURhdGEucmlnaHRqdW1wLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX1JvbGVEYXRhLnJpZ2h0anVtcC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9Sb2xlRGF0YS5yaWdodGp1bXAuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJpZ2h0anVtcCApO1xyXG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwidGlhb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcDpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcInBhbmVsX2p1bXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IGJ1aWxkY2ZnLmJ1ZmZ6ICogYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG91Ymxlc3BlZWR1cCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS55ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueiA9IGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSBidWlsZGNmZy5idWZmeCAqIHRoaXMuX211bHRpcGxlLng7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuTm93TGFzdEFjdGlvblN0YXRlPT12YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeSoyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZnogKiB0aGlzLl9tdWx0aXBsZS56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDwgNTAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwidGlhb1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMucGxheXNwZWVkU291bmQgKTtcclxuICAgICAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMCx0aGlzLHRoaXMucGxheXNwZWVkU291bmQgKTtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcInBhbmVsX2Rvd25zbGlwXCIgXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5idWZmX3NwZWVkdXB0aW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWZmX3NwZWVkdXB0aW1lID0gYnVpbGRjZmcudGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZnggKiB0aGlzLl9tdWx0aXBsZS54O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeSAqIHRoaXMuX211bHRpcGxlLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZnogKiB0aGlzLl9tdWx0aXBsZS56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheXNwZWVkU291bmQoKTtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zaWRlc3BlZWR1cDpcclxuICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcImJveF9zaWRlanVtcFwiIF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZnogKiBidWlsZGNmZy5idWZmejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3VibGVzcGVlZHVwID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fbXVsdGlwbGUueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gYnVpbGRjZmcuYnVmZnkgKiB0aGlzLl9tdWx0aXBsZS55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fbXVsdGlwbGUuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlzcGVlZFNvdW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLiApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNyb3NzOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwiYm94X1N1cm1vdW50XCIgXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5idWZmX3NwZWVkdXB0aW1lID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS54ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnogPSBidWlsZGNmZy5idWZmeiAqIGJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZXNwZWVkdXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnkgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IGJ1aWxkY2ZnLmJ1ZmZ4ICogdGhpcy5fbXVsdGlwbGUueDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gKGJ1aWxkY2ZnLmJ1ZmZ5KzAuNSkgKiB0aGlzLl9tdWx0aXBsZS55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6ICogdGhpcy5fbXVsdGlwbGUuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmh1cmRsZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fUm9sZURhdGEudXBjbGltYjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuY2xpbWJ3YWxsICk7XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudmlicmF0ZVNob3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5zaGFrZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFrZXRpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQ2hhbmdlVHJpYWwoIGZhbHNlICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9Sb2xlRGF0YS5zbGlkZWNsaW1iLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX1JvbGVEYXRhLnNsaWRlY2xpbWIuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVud2FsbGxlZnQgKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNoYW5nZVRyaWFsKCBmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX1JvbGVEYXRhLnNsaWRlY2xpbWIueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5fUm9sZURhdGEuc2xpZGVjbGltYi56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW53YWxscmlnaHQgKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNoYW5nZVRyaWFsKCBmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZWVkYWN0aW9udGltZSA9IDAuMztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLmNsaW1iZW5kICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLk5vd0xhc3RBY3Rpb25TdGF0ZT12YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwbGF5c3BlZWRTb3VuZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcInNwZWVkdXBcIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBub3dBY3Rpb24oKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93QWN0aW9uU3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBDaGFuZ2VUcmlhbCggYm86Ym9vbGVhbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5MZWZ0VHJpYWwgJiYgdGhpcy5SaWdodFRyaWFsICYmIHRoaXMuTGVmdFRyaWFsLmFjdGl2ZSAhPSBibyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkxlZnRUcmlhbC5hY3RpdmUgPSBibztcclxuICAgICAgICAgICAgdGhpcy5SaWdodFRyaWFsLmFjdGl2ZSA9IGJvO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgSm95KCB2YWx1ZTpudW1iZXIsdmFsdWUxOm51bWJlcixhbmdsZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VNb3ZlWCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIHx8IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZU1vdmVYID0gdmFsdWUxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0ICYmIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApIC8v5by65Yi26Lez6LeDXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzZm9yY2VKdW1wID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQgJiYgdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmb3JjZUp1bXAgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQgfHxcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYW5nbGUgPSAtYW5nbGUgKiBNYXRoLlBJLzE4MDtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICksYW5nbGUsdGhpcy5xdWF0ZXJuaW9uICk7XHJcbiAgICAgICAgICAgIHZhciBqdW1wejpudW1iZXIgPSB0aGlzLmp1bXBTcGVlZC56O1xyXG4gICAgICAgICAgICBMYXlhLlZlY3RvcjMudHJhbnNmb3JtUXVhdCggdGhpcy5qdW1wU3BlZWQsdGhpcy5xdWF0ZXJuaW9uLHRoaXMuanVtcFNwZWVkICk7XHJcbiAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSBqdW1wejtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIF9tb3ZlVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIGp1bXBTcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBqdW1wSGlnaHQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2Rpc3k6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBnOm51bWJlcj0xMDsvL+mHjeWKm+WKoOmAn+W6plxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBkdCA9IDE2O1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc2Nhbk1vdmUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGRpc3RpbWU6bnVtYmVyID0gZHQvMTAwMDtcclxuICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLm5vd0FjdGlvbiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOi8v6LeR5YqoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogKHRoaXMuX3NwZWVkTW92ZVYzLnogKiB0aGlzLl9tdWx0aXBsZS56KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDovL+eIrOWNh1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gZGlzdGltZSAqIHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9sb2Nrc3RhdGUgPT0gMiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuX2NoYW5nZU1vdmVYICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9zaGFuZ3BhVmVjIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fc2hhbmdwYVZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3dzZWxlY3RWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXBibG9jazpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9zaGFuZ3BhVmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55KzEgPiB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOi8v6Lez6LeDXHJcbiAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0OlxyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuanVtcFNwZWVkLnkqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5Nb3ZlWDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogdGhpcy5fc3BlZWRNb3ZlVjMuejtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9zcGVlZE1vdmVWMy54KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID4gMC4xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5kb3dubW92ZTpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLmp1bXBTcGVlZC54O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zaWRlc3BlZWR1cDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5idWZmX3NwZWVkdXB0aW1lIDw9IDAgJiYgdGhpcy5MYXN0QWN0aW9uU3RhdGU9PUNoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCB8fCB0aGlzLkxhc3RBY3Rpb25TdGF0ZSA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0IClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gdGhpcy5MYXN0QWN0aW9uU3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY3Jvc3M6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLmcqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPCB0aGlzLl9ub3dzZWxlY3RWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAoMS8wLjMpKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93c2VsZWN0VmVjICYmICh0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5ydW4gfHwgdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmUgKSAmJiAhdGhpcy5faXNDb2xsaW5nIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IDw9IHRoaXMuX25vd3NlbGVjdFZlYy56IClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgPCBQcm9wTWFuYWdlci5kaWVQb3NZIC0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5EaWVEaXN0YW5jZSApLy/op5LoibLmrbvkuqFcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NjZW5lbmFtZSA9PSBcIlwiIHx8IHRoaXMuX25vd2J1aWxkbmFtZSA9PSBcIlwiIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZihHYW1lU3RhdGUuZnVodW9jaXNodT4wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZXZpdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKEdhbWVTdGF0ZS5mdWh1b2Npc2h1PjApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJldml2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnN0YW5kO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiA8IFByb3BNYW5hZ2VyLmdhbWV3aW5Qb3NaICkvL+WIsOi+vue7iOeCuVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLldpbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIucHJvX2ppbmR1LnZhbHVlID0gIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IC8gUHJvcE1hbmFnZXIuZ2FtZXdpblBvc1ogKiAxMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2lzQWN0aW9uTnVtcyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc25lZWRhY3Rpb25udW0gPiAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9hbmltYXRvci5nZXRDdXJyZW50QW5pbWF0b3JQbGF5U3RhdGUoKS5ub3JtYWxpemVkVGltZSA+PSB0aGlzLl9pc25lZWRhY3Rpb25udW0pXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX1N0YXRlTmFtZSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGVmdGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJpZ2h0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1cmRsZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuc2t5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmxhbmQxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUubGFuZDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1YWNoYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9uZWVkYWN0aW9udGltZSAhPSAwICYmIHRoaXMuX21vdmVUaW1lID4gdGhpcy5fbmVlZGFjdGlvbnRpbWUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggdGhpcy5fU3RhdGVOYW1lIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sZWZ0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaGlnaGp1bXAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnNreSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5odXJkbGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuaHVhY2hhbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuYnVmZl9zcGVlZHVwdGltZSA+IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgLT0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLlNwZWVkVXBFZmZlY3QoIFwiamlhc3VsaXppXCIsdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5kb3VibGVzcGVlZHVwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TcGVlZFVwRWZmZWN0MSggXCJqaWFzdWxpemlcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG91Ymxlc3BlZWR1cCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuQ2xvc2VTcGVlZFVwRWZmZWN0KCApO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuQ2xvc2VTcGVlZFVwRWZmZWN0MSggKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmNhbnNoYWtlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFrZXRpbWUrPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuc2hha2V0aW1lID49IDAuNSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFrZXRpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fZW5kaW5nIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpc3RpbWU6bnVtYmVyID0gZHQvMTAwMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lICs9IGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPj0gdGhpcy5fZW5kYW5tb3RpbWUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR2FtZU92ZXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnggPSB0aGlzLl9lbmRBbm1vU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS55ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnkgKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueiA9IHRoaXMuX2VuZEFubW9TcGVlZC56ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAoIFByb3BNYW5hZ2VyLmNhcm1hLmdldENvbXBvbmVudCggQ2FtZXJhTWFuYWdlciApIGFzIENhbWVyYU1hbmFnZXIgKS5HYW1lRW5kUm90YXRlKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sIHRoaXMuX2VuZEFubW9TcGVlZDEgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgIFxyXG4gICAgcHJpdmF0ZSBfZW5kaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2VuZEFubW9TcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICBwcml2YXRlIF9lbmRhbm1vdGltZTpudW1iZXIgPSAxO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkMTpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBXaW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJvdmVyXCIpO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5lbmQgKTtcclxuICAgICAgICB2YXIgY2FybWFUcmFuczpMYXlhLlRyYW5zZm9ybTNEID0gUHJvcE1hbmFnZXIuY2FybWEudHJhbnNmb3JtO1xyXG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC56ID0gKHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IC0gMiAtIGNhcm1hVHJhbnMucG9zaXRpb24ueikvdGhpcy5fZW5kYW5tb3RpbWU7XHJcbiAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkLnkgPSAodGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnkpL3RoaXMuX2VuZGFubW90aW1lO1xyXG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC54ID0gKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCArIDMgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnggKSAvIHRoaXMuX2VuZGFubW90aW1lO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9lbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5HYW1lT3ZlckVmZmVjZiggXCJ5YW5odWFcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9PSAwP3RydWU6ZmFsc2UgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKirlh7rnjrDlpI3mtLvnlYzpnaIgKi9cclxuICAgIHByaXZhdGUgUmV2aXZlKCk6dm9pZHtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcIm92ZXJcIik7XHJcbiAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gdHJ1ZTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUucmV2aXZlICk7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XHJcbiAgICAgICAgLy8gdGhpcy5fZW5kaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIExvc2UoKTp2b2lke1xyXG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwib3ZlclwiKTtcclxuICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSB0cnVlO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5sb3NlICk7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdhbWVPdmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jaGFuZ2VNb3ZlWDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgaXNmb3JjZUp1bXA6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgcXVhdGVybmlvbjpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uOyBcclxuICAgIFxyXG5cclxuICAgIHB1YmxpYyBUZXN0SnVtcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3Ryb3koKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgWE1vdmUoIHN0YXRlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IHN0YXRlICogMjA7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuTW92ZVg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFBvb2xNYW5hZ2VyLlJlY292ZXJTcHJpdGUzRCh0aGlzLkxlZnRUcmlhbClcclxuICAgICAgICBQb29sTWFuYWdlci5SZWNvdmVyU3ByaXRlM0QodGhpcy5SaWdodFRyaWFsKVxyXG5cclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgXHJcbn0iLCJcclxuZXhwb3J0IGNsYXNzIEdsb2JhbCB7XHJcbiAgICBzdGF0aWMgIHN0YWdlOiBMYXlhLlN0YWdlO1xyXG4gICAgc3RhdGljICBodHRwdXJsID0gXCJcIjtcclxuICAgIHN0YXRpYyAgcmVzb3VyY2VodHR0cDpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHN0YXRpYyAgY2RudXJsOnN0cmluZyA9IFwiaHR0cHM6Ly93eGdhbWUuNTF5b3lveW8uY29tL1wiO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOi1hOa6kOWQjue8gOeJiOacrOWPt1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIHZlcnNpb25zOnN0cmluZyA9IFwiXCI7Ly9cIj92PTEuMC43XCI7XHJcblxyXG4gICAgc3RhdGljICBpbml0V2lkdGg6bnVtYmVyID0gNzIwOyBcclxuXHJcbiAgICBzdGF0aWMgIGluaXRIZWlnaHQ6bnVtYmVyID0gMTI4MDsgXHJcbiAgICAvKipcclxuICAgICAqIOi1hOa6kOeJiOacrOWPt1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIHJlc2NvbmZpZ1ZlcnNpb246c3RyaW5nID0gXCJcIjtcclxuICAgIC8qKlxyXG4gICAgICog5b2T5YmN5bmz5Y+wXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgbm93cGxhdGZyb206c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOW9k+WJjea4uOaIj2FwcGlkXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgYXBwaWQ6c3RyaW5nID0gXCJ3eDQ2ZjQ2MjY5MzJlNWY0OGJcIjsgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuLjmiI/niYjmnKzlj7dcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBnYW1lVmVyc2lvbjpzdHJpbmcgPSBcIjEuMC4xXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKbosIPor5XniYjmnKxcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBpc2RlYnVnOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzdGF0aWMgIEFwcEtleUlEOm51bWJlciA9IDA7XHJcbiAgICBzdGF0aWMgIE1lbWJlcklEOm51bWJlciA9IDA7XHJcblxyXG5cclxuICAgIHN0YXRpYyAgY3VySGVpZ2h0KCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgY3VyV2lkdGgoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTGF5YS5zdGFnZS53aWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIHNldFZhcnMoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2xvYmFsLnN0YWdlID0gTGF5YS5zdGFnZTtcclxuICAgICAgICBHbG9iYWwuc2V0aHR0cHVybCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgZ2V0VXJsKCB1cmw6c3RyaW5nICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgaWYodXJsLmluZGV4T2YoXCJ3eGxvY2FsXCIpPT0tMSlcclxuICAgICAgICB7IFxyXG4gICAgICAgICAgICByZXR1cm4gR2xvYmFsLnJlc291cmNlaHR0dHAgKyB1cmwgKyBHbG9iYWwudmVyc2lvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBzZXRodHRwdXJsKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBHbG9iYWwuaXNkZWJ1ZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwuaHR0cHVybCA9IFwiaHR0cHM6Ly93eGdhbWVkZXYuNTF5b3lveW8uY29tL1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWwuaHR0cHVybCA9IFwiaHR0cHM6Ly9taW5wb3J0LjUxeW95b3lvLmNvbS9cIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJcclxuZXhwb3J0ICBjbGFzcyBHbG9iYWxXYWl0aW5nIGV4dGVuZHMgZmFpcnlndWkuR0NvbXBvbmVudFxyXG57XHJcbiAgICBpbWdfMDpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICBwcml2YXRlIF9pc2ZvcmNlaGlkZTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEZyb21YTUwoeG1sOmFueSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuc2V0U2l6ZShmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoLGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcclxuICAgICAgICBzdXBlci5jb25zdHJ1Y3RGcm9tWE1MKHhtbCk7XHJcbiAgICAgICAgdGhpcy5pbWdfMCA9IHRoaXMuZ2V0Q2hpbGQoXCJpbWdfMFwiKS5hc0ltYWdlO1xyXG4gICAgICAgIHRoaXMuaW1nXzAudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub24oTGF5YS5FdmVudC5ESVNQTEFZLHRoaXMsdGhpcy5vbkFkZGVkVG9TdGFnZSk7XHJcbiAgICAgICAgdGhpcy5vbiggTGF5YS5FdmVudC5VTkRJU1BMQVksdGhpcyx0aGlzLm9uUmVtb3ZlRnJvbVN0YWdlKTsgICAgICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sYXN0VGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBvbkFkZGVkVG9TdGFnZSgpOnZvaWQge1xyXG4gICAgICAgIHRoaXMuX2xhc3RUaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKDEsIHRoaXMsIHRoaXMub25UaW1lcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblRpbWVyKCk6dm9pZCB7XHJcbiAgICAgICAgaWYodGhpcy5pbWdfMClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBub3d0aW1lOm51bWJlciA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICAgICAgdmFyIGRpc3RpbWU6bnVtYmVyID0gbm93dGltZS10aGlzLl9sYXN0VGltZTtcclxuICAgICAgICAgICAgaWYoIGRpc3RpbWUgLzEwMDAgPj0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCAhdGhpcy5faXNmb3JjZWhpZGUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW1nXzAudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgaTpudW1iZXIgPSB0aGlzLmltZ18wLnJvdGF0aW9uO1xyXG4gICAgICAgICAgICAgICAgaSArPSAxMDtcclxuICAgICAgICAgICAgICAgIGlmKGkgPiAzNjApXHJcbiAgICAgICAgICAgICAgICAgICAgaSA9IGkgJSAzNjA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmltZ18wLnJvdGF0aW9uID0gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nXzAudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlaW1nKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzZm9yY2VoaWRlID0gdHJ1ZTtcclxuICAgICAgICBpZiggdGhpcy5pbWdfMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmltZ18wLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgb25SZW1vdmVGcm9tU3RhZ2UoKTp2b2lkIHtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsIHRoaXMub25UaW1lcik7XHJcbiAgICB9XHJcbn0iLCJcclxuZXhwb3J0IGNsYXNzIEpveXN0aWNrTW9kdWxlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXIge1xyXG4gICAgcHJpdmF0ZSBfSW5pdFg6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX0luaXRZOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9zdGFydFN0YWdlWDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfc3RhcnRTdGFnZVk6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2xhc3RTdGFnZVg6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2xhc3RTdGFnZVk6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2J1dHRvbjpMYXlhLlBvaW50O1xyXG4gICAgcHJpdmF0ZSB0b3VjaElkOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9jdXJQb3M6IExheWEuUG9pbnQ7XHJcbiAgICAvLyBwcml2YXRlIF9jZW50ZXI6ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgXHJcbiAgICBwdWJsaWMgc3RhdGljIEpveXN0aWNrTW92aW5nOiBzdHJpbmcgPSBcIkpveXN0aWNrTW92aW5nXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIEpveXN0aWNrVXA6IHN0cmluZyA9IFwiSm95c3RpY2tVcFwiO1xyXG5cclxuICAgIHB1YmxpYyByYWRpdXM6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX2NsaWNrcGFuZWw6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHB1YmxpYyBkaXM6bnVtYmVyID0gMDsgXHJcbiAgICBwdWJsaWMgZGVncmVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgYW5nbGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgb2ZmeDpudW1iZXIgPSAwO1xyXG5cclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoY2xpY2twYW5lbDpmYWlyeWd1aS5HTG9hZGVyKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsID0gY2xpY2twYW5lbDtcclxuICAgICAgICB0aGlzLl9idXR0b24gPSBuZXcgTGF5YS5Qb2ludCgpO1xyXG4gICAgICAgIHRoaXMudG91Y2hJZCA9IC0xO1xyXG4gICAgICAgIHRoaXMucmFkaXVzID0gNDAwO1xyXG4gICAgICAgIHRoaXMuX2N1clBvcyA9IG5ldyBMYXlhLlBvaW50KCk7XHJcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vbihMYXlhLkV2ZW50Lk1PVVNFX0RPV04sdGhpcywgdGhpcy5vblRvdWNoRG93bik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNjYW5DQmFjazpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIG9uVG91Y2hEb3duKGV2dDogTGF5YS5FdmVudCkge1xyXG4gICAgICAgIGlmKHRoaXMudG91Y2hJZCA9PSAtMSkgey8vRmlyc3QgdG91Y2hcclxuICAgICAgICAgICAgdGhpcy50b3VjaElkID0gZXZ0LnRvdWNoSWQ7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmeCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzY2FuQ0JhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5nbG9iYWxUb0xvY2FsKExheWEuc3RhZ2UubW91c2VYLCBMYXlhLnN0YWdlLm1vdXNlWSx0aGlzLl9jdXJQb3MpO1xyXG4gICAgICAgICAgICB2YXIgYng6IG51bWJlciA9IHRoaXMuX2N1clBvcy54O1xyXG4gICAgICAgICAgICB2YXIgYnk6IG51bWJlciA9IHRoaXMuX2N1clBvcy55O1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U3RhZ2VYID0gYng7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTdGFnZVkgPSBieTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRTdGFnZVggPSBieDtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRTdGFnZVkgPSBieTtcclxuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnggPSBieDtcclxuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnkgPSBieTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX2NhbGxvYmogJiYgdGhpcy5fZG93bkNhbGxiYWNrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZG93bkNhbGxiYWNrLmNhbGwoIHRoaXMuX2NhbGxvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKExheWEuRXZlbnQuTU9VU0VfTU9WRSx0aGlzLHRoaXMuT25Ub3VjaE1vdmUpO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9uKExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLk9uVG91Y2hVcCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrcGFuZWwub24oIExheWEuRXZlbnQuTU9VU0VfT1VULHRoaXMsdGhpcy5PblRvdWNoVXAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2NhbGxvYmo6YW55O1xyXG4gICAgcHJpdmF0ZSBfbW92ZWNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSBfdXBkYXRlY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwcml2YXRlIF9kb3duQ2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgc2V0RXZlbnRDYWxsYmFjayggY2FsbG9iajphbnksZG93bkNhbGxiYWNrLG1vdmVjYWxsYmFjazpGdW5jdGlvbix1cGNhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2NhbGxvYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIHRoaXMuX2Rvd25DYWxsYmFjayA9IGRvd25DYWxsYmFjaztcclxuICAgICAgICB0aGlzLl9tb3ZlY2FsbGJhY2sgPSBtb3ZlY2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5fdXBkYXRlY2FsbGJhY2sgPSB1cGNhbGxiYWNrO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBUcmlnZ2VyKGV2dDogTGF5YS5FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25Ub3VjaERvd24oZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSB0aWxlZE1hcDpMYXlhLlRpbGVkTWFwO1xyXG5cdFx0cHJpdmF0ZSBtTGFzdE1vdXNlWDogbnVtYmVyID0gMDtcclxuXHRcdHByaXZhdGUgbUxhc3RNb3VzZVk6IG51bWJlciA9IDA7XHJcblx0XHRwcml2YXRlIG1YOiBudW1iZXIgPSAwO1xyXG5cdFx0cHJpdmF0ZSBtWTogbnVtYmVyID0gMDtcclxuICAgIFx0Ly/liJvlu7rlnLDlm75cclxuXHRcdHByaXZhdGUgY3JlYXRlTWFwKCkge1xyXG5cdFx0XHQvL+WIm+W7uuWcsOWbvuWvueixoVxyXG5cdFx0XHR0aGlzLnRpbGVkTWFwID0gbmV3IExheWEuVGlsZWRNYXAoKTtcclxuXHJcblx0XHRcdHRoaXMubVggPSB0aGlzLm1ZID0gMDtcclxuXHRcdFx0Ly/liJvlu7rlnLDlm77vvIzpgILlvZPnmoTml7blgJnosIPnlKhkZXN0b3J56ZSA5q+B5Zyw5Zu+XHJcblx0XHRcdHRoaXMudGlsZWRNYXAuY3JlYXRlTWFwKFwicmVzL3RpbGVkTWFwL2Rlc2VydC5qc29uXCIsIG5ldyBMYXlhLlJlY3RhbmdsZSgwLCAwLCBMYXlhLkJyb3dzZXIud2lkdGgsIExheWEuQnJvd3Nlci5oZWlnaHQpLCBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIHRoaXMuY29tcGxldGVIYW5kbGVyKSk7XHJcblx0XHR9XHJcblx0XHQvKipcclxuXHRcdCAqIOWcsOWbvuWKoOi9veWujOaIkOeahOWbnuiwg1xyXG5cdFx0ICovXHJcblx0XHRwcml2YXRlIGNvbXBsZXRlSGFuZGxlcigpOiB2b2lkIHtcclxuXHRcdFx0Y29uc29sZS5sb2coXCLlnLDlm77liJvlu7rlrozmiJBcIik7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwiQ2xpZW50VzpcIiArIExheWEuQnJvd3Nlci5jbGllbnRXaWR0aCArIFwiIENsaWVudEg6XCIgKyBMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcblxyXG4gICBcclxuXHJcbiAgICBwcml2YXRlIE9uVG91Y2hVcChldnQ6TGF5YS5FdmVudD1udWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYodGhpcy50b3VjaElkICE9IC0xICYmIGV2dC50b3VjaElkID09IHRoaXMudG91Y2hJZCkge1xyXG4gICAgICAgICAgICB0aGlzLnRvdWNodXAoKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX2NhbGxvYmogJiYgdGhpcy5fdXBkYXRlY2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVjYWxsYmFjay5jYWxsKCB0aGlzLl9jYWxsb2JqICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaWFjYW5DYWxsYmFjazpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdG91Y2h1cCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b3VjaElkID0gLTE7XHJcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vZmYoTGF5YS5FdmVudC5NT1VTRV9NT1ZFLHRoaXMsdGhpcy5PblRvdWNoTW92ZSk7XHJcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vZmYoTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMuT25Ub3VjaFVwKTtcclxuICAgICAgICB0aGlzLl9jbGlja3BhbmVsLm9mZiggTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLk9uVG91Y2hVcCApO1xyXG4gICAgICAgIHRoaXMuX2lhY2FuQ2FsbGJhY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmRlZ3JlZSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBPblRvdWNoTW92ZShldnQ6IExheWEuRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBpZih0aGlzLnRvdWNoSWQgIT0gLTEgJiYgZXZ0LnRvdWNoSWQgPT0gdGhpcy50b3VjaElkKSB7XHJcbiAgICAgICAgICAgIHZhciBieDogbnVtYmVyID0gTGF5YS5zdGFnZS5tb3VzZVg7XHJcbiAgICAgICAgICAgIHZhciBieTogbnVtYmVyID0gTGF5YS5zdGFnZS5tb3VzZVk7XHJcbiAgICAgICAgICAgIHZhciBtb3ZlWDogbnVtYmVyID0gYnggLSB0aGlzLl9sYXN0U3RhZ2VYO1xyXG4gICAgICAgICAgICB2YXIgbW92ZVk6IG51bWJlciA9IGJ5IC0gdGhpcy5fbGFzdFN0YWdlWTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFN0YWdlWCA9IGJ4O1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0U3RhZ2VZID0gYnk7XHJcbiAgICAgICAgICAgIHZhciBidXR0b25YOiBudW1iZXIgPSB0aGlzLl9idXR0b24ueCArIG1vdmVYO1xyXG4gICAgICAgICAgICB2YXIgYnV0dG9uWTogbnVtYmVyID0gdGhpcy5fYnV0dG9uLnkgKyBtb3ZlWTtcclxuXHJcbiAgICAgICAgICAgIHZhciBvZmZzZXRYOiBudW1iZXIgPSBidXR0b25YIC0gdGhpcy5fc3RhcnRTdGFnZVg7XHJcbiAgICAgICAgICAgIHZhciBvZmZzZXRZOiBudW1iZXIgPSBidXR0b25ZIC0gdGhpcy5fc3RhcnRTdGFnZVk7XHJcbiAgICAgICAgICAgIHZhciBkaXNYOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgIGlmKCBtb3ZlWCA+PSAyIHx8IG1vdmVYIDw9IC0yIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNjYW5DQmFjayA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc2NhbkNCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vZmZ4ID0gbW92ZVg7XHJcbiAgICAgICAgICAgIGlmKCBvZmZzZXRYID09IDAgJiYgb2Zmc2V0WSA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBvZmZzZXRYID4gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBvZmZzZXRYID4gdGhpcy5yYWRpdXMgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc1ggPSB0aGlzLnJhZGl1cztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gOTA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzWCA9IHRoaXMucmFkaXVzIC0gb2Zmc2V0WDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gOTAgLSBkaXNYL3RoaXMucmFkaXVzICogOTA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggb2Zmc2V0WCA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbmdsZSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggLW9mZnNldFggPiB0aGlzLnJhZGl1cyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzWCA9IHRoaXMucmFkaXVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5nbGUgPSAtOTA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzWCA9IHRoaXMucmFkaXVzICsgb2Zmc2V0WDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuZ2xlID0gLSg5MC1kaXNYL3RoaXMucmFkaXVzICogOTApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciByYWQ6IG51bWJlciA9IE1hdGguYXRhbjIob2Zmc2V0WSxvZmZzZXRYKTtcclxuICAgICAgICAgICAgdGhpcy5kZWdyZWUgPSByYWQ7XHJcbiAgICAgICAgICAgIHZhciBtYXhYOiBudW1iZXIgPSB0aGlzLnJhZGl1cyAqIE1hdGguY29zKHJhZCk7XHJcbiAgICAgICAgICAgIHZhciBtYXhZOiBudW1iZXIgPSB0aGlzLnJhZGl1cyAqIE1hdGguc2luKHJhZCk7XHJcbiAgICAgICAgICAgIGlmKE1hdGguYWJzKG9mZnNldFgpID4gTWF0aC5hYnMobWF4WCkpXHJcbiAgICAgICAgICAgICAgICBvZmZzZXRYID0gbWF4WDtcclxuICAgICAgICAgICAgaWYoTWF0aC5hYnMob2Zmc2V0WSkgPiBNYXRoLmFicyhtYXhZKSlcclxuICAgICAgICAgICAgICAgIG9mZnNldFkgPSBtYXhZO1xyXG4gICAgICAgICAgICBidXR0b25YID0gdGhpcy5fc3RhcnRTdGFnZVggKyBvZmZzZXRYO1xyXG4gICAgICAgICAgICBidXR0b25ZID0gdGhpcy5fc3RhcnRTdGFnZVkgKyBvZmZzZXRZO1xyXG4gICAgICAgICAgICBpZihidXR0b25YIDwgMClcclxuICAgICAgICAgICAgICAgIGJ1dHRvblggPSAwO1xyXG4gICAgICAgICAgICBpZihidXR0b25ZID4gZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQpXHJcbiAgICAgICAgICAgICAgICBidXR0b25ZID0gZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi54ID0gYnV0dG9uWDtcclxuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnkgPSBidXR0b25ZO1xyXG4gICAgICAgICAgICB0aGlzLmRpcyA9IE1hdGguc3FydCggb2Zmc2V0WCpvZmZzZXRYICsgb2Zmc2V0WSpvZmZzZXRZICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lhY2FuQ2FsbGJhY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5faXNjYW5DQmFjayAmJiB0aGlzLl9jYWxsb2JqICYmIHRoaXMuX21vdmVjYWxsYmFjayAmJiB0aGlzLl9pYWNhbkNhbGxiYWNrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbW92ZWNhbGxiYWNrLmNhbGwoIHRoaXMuX2NhbGxvYmosdGhpcy5vZmZ4ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fY2xpY2twYW5lbC5vZmYoTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsIHRoaXMub25Ub3VjaERvd24pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuL0dsb2JhbFwiO1xyXG5pbXBvcnQgU3RhZ2UgPSBMYXlhLlN0YWdlO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7IEdhbWVDb250ZW50cyB9IGZyb20gXCIuL0dhbWVDb250ZW50c1wiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL1dYU0RLL1Nka1wiO1xyXG5jbGFzcyBNYWluIHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdC8v5qC55o2uSURF6K6+572u5Yid5aeL5YyW5byV5pOOXHRcdFxyXG4gICAgICAgIC8vIExheWEuaW5pdChHbG9iYWwuaW5pdFdpZHRoLCBHbG9iYWwuaW5pdEhlaWdodCwgTGF5YVtcIldlYkdMXCJdKTtcclxuICAgICAgICBMYXlhM0QuaW5pdChHbG9iYWwuaW5pdFdpZHRoLCBHbG9iYWwuaW5pdEhlaWdodCk7XHJcblx0XHRMYXlhLnN0YWdlLnNjYWxlTW9kZSA9IFN0YWdlLlNDQUxFX0ZJWEVEX1dJRFRIO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWxpZ25IID0gU3RhZ2UuQUxJR05fQ0VOVEVSO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWxpZ25WID0gU3RhZ2UuQUxJR05fVE9QO1xyXG4gICAgICAgIExheWEuc3RhZ2Uuc2NyZWVuTW9kZSA9IFN0YWdlLlNDUkVFTl9WRVJUSUNBTDtcclxuXHRcdExheWEuc3RhZ2UuYmdDb2xvciA9IFwiIzU0QjlGNlwiO1xyXG4gICAgICAgIC8vIExheWEuU3RhdC5zaG93KCk7XHJcbiAgICAgICAgTGF5YS5hbGVydEdsb2JhbEVycm9yID0gdHJ1ZTtcclxuICAgICAgICB3aW5kb3dbJ0NvbmZpZzNEJ10gJiYgKHdpbmRvd1snQ29uZmlnM0QnXVtcIl9kZWZhdWx0XCJdW1wiX2RlZmF1bHRQaHlzaWNzTWVtb3J5XCJdID0gMTI4KTtcclxuICAgICAgICBpZihMYXlhLkJyb3dzZXIud2luZG93LnR0KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gV3hBcGkuV3hJbml0KCk7XHJcbiAgICAgICAgICAgIFd4QXBpLkNoZWNrV1hVcGRhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5zdGFnZS5vbihcInJlc2l6ZVwiLCB0aGlzLCB0aGlzLm9uUmVzaXplKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgb25SZXNpemUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5vZmYoXCJyZXNpemVcIiwgdGhpcywgdGhpcy5vblJlc2l6ZSk7XHJcbiAgICAgICAgR2xvYmFsLnNldFZhcnMoKTsgXHJcbiAgICAgICAgQXNzZXRQYXRoLmluaXQoKTsgIFxyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLnBhY2thZ2VGaWxlRXh0ZW5zaW9uID0gXCJiaW5cIjtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy50ZXh0dXJlTGluZWFyU2FtcGxpbmcgPSB0cnVlO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmRlZmF1bHRGb250ID0gXCLpu5HkvZNcIjtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy52ZXJzaW9ucz1HbG9iYWwudmVyc2lvbnM7XHJcbiAgICAgICAgdmFyIGdhbWVDb250ZW50OkdhbWVDb250ZW50cyA9IG5ldyBHYW1lQ29udGVudHMoKTtcclxuICAgICAgICBnYW1lQ29udGVudC5pbml0R2FtZSgpO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcbi8v5r+A5rS75ZCv5Yqo57G7XHJcbm5ldyBNYWluKCk7XHJcbiIsImltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuL1Byb3BNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhcmFjdGVyUG9vbFxyXG57XHJcbiAgICBzdGF0aWMgcm9sZWRpY3Q6YW55ID0ge307XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBBZGRDaGFyYWN0ZXIoIHJlc291Y2VOYW1lOnN0cmluZyxjbGFzOmFueSxwYXJlbnQ6YW55ICk6TGF5YS5TcHJpdGUzRFxyXG4gICAge1xyXG4gICAgICAgIHZhciBza2lubmVkbWVzaDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8TGF5YS5TcHJpdGUzRD4gPSBDaGFyYWN0ZXJQb29sLnJvbGVkaWN0W3Jlc291Y2VOYW1lXTtcclxuICAgICAgICBpZiggYXJyICYmIGFyci5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNraW5uZWRtZXNoID0gYXJyLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIHNraW5uZWRtZXNoLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZCggc2tpbm5lZG1lc2ggKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKHJlc291Y2VOYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgc2tpbm5lZG1lc2ggPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKHNwLHBhcmVudCwgZmFsc2UsbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY2xhcylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjbGE6YW55ID0gc2tpbm5lZG1lc2guYWRkQ29tcG9uZW50KCBjbGFzICk7XHJcbiAgICAgICAgICAgIGNsYS5yZXNvdXNlTmFtZSA9IHJlc291Y2VOYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgX291dDpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uO1xyXG4gICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLDE4MCpNYXRoLlBJLzE4MCxfb3V0ICk7XHJcbiAgICAgICAgc2tpbm5lZG1lc2gudHJhbnNmb3JtLnJvdGF0aW9uID0gX291dDtcclxuICAgICAgICByZXR1cm4gc2tpbm5lZG1lc2g7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDbGVhckNoYXJhY3Rlciggc3A6TGF5YS5TcHJpdGUzRCxyZXNvdWNlTmFtZTpzdHJpbmcsY2xhOkxheWEuU2NyaXB0M0QgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoICFDaGFyYWN0ZXJQb29sLnJvbGVkaWN0W3Jlc291Y2VOYW1lXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBDaGFyYWN0ZXJQb29sLnJvbGVkaWN0W3Jlc291Y2VOYW1lXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihjbGEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjbGEuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICBzcC5yZW1vdmVTZWxmKCk7XHJcbiAgICAgICAgQ2hhcmFjdGVyUG9vbC5yb2xlZGljdFtyZXNvdWNlTmFtZV0ucHVzaCggc3AgKTtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBDaGFyYWN0ZXJTdGF0ZVxyXG57XHJcblxyXG4gICAgLyoq5L6n57+7ICBjZWZhbjEgKi9cclxuICAgIHN0YXRpYyByb2xsb3ZlcjE6c3RyaW5nID0gXCJyb2xsb3ZlcjFcIjtcclxuICAgIC8qKuS+p+e/uyAgY2VmYW4yICovXHJcbiAgICBzdGF0aWMgcm9sbG92ZXIyOnN0cmluZyA9IFwicm9sbG92ZXIyXCI7XHJcbiAgICAvKirot5Hlopnlt6YgIHBhb3FpYW5nbGVmdCAqL1xyXG4gICAgc3RhdGljIHJ1bndhbGxsZWZ0OnN0cmluZyA9IFwicnVud2FsbGxlZnRcIjtcclxuICAgIC8qKuWPs+i3syAgcmlnaHRqdW1wICovXHJcbiAgICBzdGF0aWMgcmlnaHRqdW1wOnN0cmluZyA9IFwicmlnaHRqdW1wXCI7XHJcbiAgICAvKirot5Hlopnlj7MgIHBhb3FpYW5ncmlnaHQgKi9cclxuICAgIHN0YXRpYyBydW53YWxscmlnaHQ6c3RyaW5nID0gXCJydW53YWxscmlnaHRcIjtcclxuICAgIC8qKuW3pui3syAgbGVmdGp1bXAqL1xyXG4gICAgc3RhdGljIGxlZnRqdW1wOnN0cmluZyA9IFwibGVmdGp1bXBcIjtcclxuICAgIC8qKueIrOWimSAgcGFxaWFuZyAqL1xyXG4gICAgc3RhdGljIGNsaW1id2FsbDpzdHJpbmcgPSBcImNsaW1id2FsbFwiO1xyXG4gICAgLyoqIO+8nyAgIGNsaW1iZW5kICovXHJcbiAgICBzdGF0aWMgY2xpbWJlbmQ6c3RyaW5nID0gXCJjbGltYmVuZFwiO1xyXG4gICAgLyoq56uZ56uLICBzdGFuZCovXHJcbiAgICBzdGF0aWMgc3RhbmQ6c3RyaW5nID0gXCJzdGFuZFwiO1xyXG4gICAgLyoq56m65LitICBrb25nemhvbmcgKi9cclxuICAgIHN0YXRpYyBza3k6c3RyaW5nID0gXCJza3lcIjtcclxuICAgIC8qKuiQveWcsCAgbHVvZGkxICovXHJcbiAgICBzdGF0aWMgbGFuZDE6c3RyaW5nID0gXCJsYW5kMVwiO1xyXG4gICAgLyoq6JC95ZywICBsdW9kaTIgKi9cclxuICAgIHN0YXRpYyBsYW5kMjpzdHJpbmcgPSBcImxhbmQyXCI7XHJcbiAgICAvKirlpKfot7MgIGRhdGlhbzEgKi9cclxuICAgIHN0YXRpYyBoaWdoanVtcDE6c3RyaW5nID0gXCJoaWdoanVtcDFcIjtcclxuICAgIC8qKuWkp+i3syAgZGF0aWFvMiAqL1xyXG4gICAgc3RhdGljIGhpZ2hqdW1wMjpzdHJpbmcgPSBcImhpZ2hqdW1wMlwiO1xyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKui3keWKqCBydW4gKi9cclxuICAgIHN0YXRpYyBydW46c3RyaW5nID0gXCJydW5cIjtcclxuICAgIC8qKui3s+i3gyBqdW1wKi9cclxuICAgIHN0YXRpYyBqdW1wOnN0cmluZyA9IFwianVtcFwiO1xyXG4gICAgLyoq54is5Y2HICBDbGltYiAqL1xyXG4gICAgc3RhdGljIGNsaW1idXA6c3RyaW5nID0gXCJjbGltYnVwXCI7XHJcbiAgICAvKiroh6rnlLHokL3kvZMgRnJlZWZhbGxpbmcgKi9cclxuICAgIHN0YXRpYyBmYWxsZG93bjpzdHJpbmcgPSBcImZhbGxkb3duXCI7XHJcbiAgICAvKirlt6bniKwgIGxlZnRfY2xpbWIgKi9cclxuICAgIHN0YXRpYyBjbGltYmxlZnQ6c3RyaW5nID0gXCJjbGltYmxlZnRcIjtcclxuICAgIC8qKuWPs+eIrCAgcmlnaHRfY2xpbWIqL1xyXG4gICAgc3RhdGljIGNsaW1icmlnaHQ6c3RyaW5nID0gXCJjbGltYnJpZ2h0XCI7XHJcbiAgICAvKirlj7Pot7MgcmlnaHRfanVtcCAqL1xyXG4gICAgc3RhdGljIGp1bXByaWdodDpzdHJpbmcgPSBcImp1bXByaWdodFwiO1xyXG4gICAgLyoq5bem6LezIGxlZnRfanVtcCAqL1xyXG4gICAgc3RhdGljIGp1bXBsZWZ0OnN0cmluZyA9IFwianVtcGxlZnRcIjtcclxuICAgIC8qKiBQbGF5UGFsb3VBY3Rpb24qL1xyXG4gICAgc3RhdGljIENsaW1iTW90aW9uOnN0cmluZyA9IFwiQ2xpbWJNb3Rpb25cIjtcclxuXHJcbiAgICAvKiog77yfICBodWFjaGFuICovXHJcbiAgICBzdGF0aWMgaHVhY2hhbjpzdHJpbmcgPSBcImh1YWNoYW5cIjtcclxuICAgIC8qKui3qOagjyAga3VhbGFuICovXHJcbiAgICBzdGF0aWMgaHVyZGxlOnN0cmluZyA9IFwiaHVyZGxlXCI7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6YCf5p2/6Lez6LeDIGppYXN1SnVtcFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc3BlZWR1cGp1bXA6c3RyaW5nID0gXCJzcGVlZHVwanVtcFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogeOaWueWQkeeerOenuyAgeHNodW55aVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgTW92ZVg6c3RyaW5nID0gXCJNb3ZlWFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LiL5ruR5L2N56e7IGRvd25TbGlkZVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZG93bm1vdmU6c3RyaW5nID0gXCJkb3dubW92ZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5L6n6Z2i5Yqg6YCfICBzbGlkZWppYXN1XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaWRlc3BlZWR1cDpzdHJpbmcgPSBcInNpZGVzcGVlZHVwXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnv7votoogIHN1cm1vdW50XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBjcm9zczpzdHJpbmcgPSBcImNyb3NzXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDplIHlrprniKzljYcgIGxvY2tjbGltYlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgY2xpbWJ1cGJsb2NrOnN0cmluZyA9IFwiY2xpbWJ1cGJsb2NrXCI7XHJcbn0iLCIvKlxyXG4qIOWvueixoeaxoOexu1xyXG4qL1xyXG5pbXBvcnQgQW5pbWF0aW9uID0gTGF5YS5BbmltYXRpb247XHJcblx0aW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcclxuXHRpbXBvcnQgUmVjdGFuZ2xlID0gTGF5YS5SZWN0YW5nbGU7XHJcblx0aW1wb3J0IExvYWRlciA9IExheWEuTG9hZGVyO1xyXG5cdGltcG9ydCBCcm93c2VyID0gTGF5YS5Ccm93c2VyO1xyXG4gICAgaW1wb3J0IFdlYkdMID0gTGF5YS5XZWJHTDtcclxuICAgIFxyXG5cclxuZXhwb3J0IGNsYXNzIEdhbWVQb29sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc3ByaXRlM0RBcnJheTphbnkgPSB7fTtcclxuICAgIHByaXZhdGUgc3RhdGljIGNvbnRhaW46YW55PXt9O1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgQW5pQ29uZlBhdGg6IHN0cmluZyA9IFwicmVzL2ZpZ2h0ZXIvZmlnaHRlci5qc29uXCI7XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBSZW1vdmVJdGVtKCBrZXk6c3RyaW5nLCBvYmo6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBHYW1lUG9vbC5jb250YWluW2tleV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IEdhbWVQb29sLmNvbnRhaW5ba2V5XS5pbmRleE9mKCBvYmogKTtcclxuICAgICAgICAgICAgaWYoaW5kZXggPT0gLTEpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEdhbWVQb29sLmNvbnRhaW5ba2V5XS5wdXNoKCBvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldEl0ZW0oIGtleTpzdHJpbmcsLi4uYXJnczphbnlbXSApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBHYW1lUG9vbC5jb250YWluW2tleV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gR2FtZVBvb2wuY29udGFpbltrZXldO1xyXG4gICAgICAgICAgICBpZiggYXJyLmxlbmd0aCA9PTAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2Fsc3NvYmo6YW55ID0gR2FtZVBvb2wuc3ByaXRlM0RBcnJheVtrZXldO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOmFueSA9IG5ldyBjYWxzc29iaigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBHYW1lUG9vbC5jb250YWluW2tleV0uc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coIFwi5q2ka2V55YC85a+55bqU55qE57G75pyq6KKr5rOo5YaMXCIgKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUFuaW1hdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB2YXIgYW5pOiBBbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgYW5pLmxvYWRBdGxhcyh0aGlzLkFuaUNvbmZQYXRoKTsgLy8g5Yqg6L295Zu+6ZuG5Yqo55S7XHJcbiAgICAgICAgYW5pLmludGVydmFsID0gMzA7IC8vIOiuvue9ruaSreaUvumXtOmalO+8iOWNleS9je+8muavq+enku+8iVxyXG4gICAgICAgIGFuaS5pbmRleCA9IDE7IC8vIOW9k+WJjeaSreaUvue0ouW8lVxyXG4gICAgICAgIGFuaS5wbGF5KCk7IC8vIOaSreaUvuWbvumbhuWKqOeUu1xyXG5cclxuICAgICAgICAvLyDojrflj5bliqjnlLvnmoTovrnnlYzkv6Hmga9cclxuICAgICAgICB2YXIgYm91bmRzOiBSZWN0YW5nbGUgPSBhbmkuZ2V0R3JhcGhpY0JvdW5kcygpO1xyXG4gICAgICAgIGFuaS5waXZvdChib3VuZHMud2lkdGggLyAyLCBib3VuZHMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIGFuaS5wb3MoTGF5YS5zdGFnZS53aWR0aCAvIDIsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoYW5pKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgR2V0SXRlbUZhaXJ5R1VJKCB1cmw6c3RyaW5nICk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgaWYoICFHYW1lUG9vbC5jb250YWluW3VybF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2FtZVBvb2wuY29udGFpblt1cmxdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IEdhbWVQb29sLmNvbnRhaW5bdXJsXTtcclxuICAgICAgICBpZiggYXJyLmxlbmd0aCA9PTAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOmFueSA9IGZhaXJ5Z3VpLlVJUGFja2FnZS5jcmVhdGVPYmplY3RGcm9tVVJMKCB1cmwgKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZvO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gR2FtZVBvb2wuY29udGFpblt1cmxdLnNoaWZ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBNYXJrKCBrZXk6c3RyaW5nLCBjbGFzc2FyZzphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZVBvb2wuc3ByaXRlM0RBcnJheVtrZXldID0gY2xhc3Nhcmc7XHJcbiAgICAgICAgR2FtZVBvb2wuY29udGFpbltrZXldID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQge1NpbmdsZXRvbn0gZnJvbSBcIi4uL3V0aWxzL1NpbmdsZXRvblwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgUGFuZWxSZXNEaWMgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UGFuZWxSZXNEaWM7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgX21hcHZpZXdEaWN0OmFueT17fTtcclxuXHJcblx0Y29uc3RydWN0b3IoKSBcclxuXHR7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBQYW5lbFJlc0RpYy5pbnMgPSB0aGlzO1xyXG5cdH1cclxuXHRcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFBhbmVsUmVzRGljXHJcblx0e1xyXG4gICAgICAgIGlmKFBhbmVsUmVzRGljLmlucyA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYW5lbFJlc0RpYygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUGFuZWxSZXNEaWMuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Vmlldyggdmlld2tleTpzdHJpbmcgKTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggIVBhbmVsUmVzRGljLl9tYXB2aWV3RGljdFt2aWV3a2V5XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBcImVycjAg5pyq57uR5a6a55qEdmlld2tleTpcIiArIHZpZXdrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQYW5lbFJlc0RpYy5fbWFwdmlld0RpY3Rbdmlld2tleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIFxyXG4gICAgcHVibGljIGdldFNpbmdsZVRvbihyZWY6YW55KTphbnlcclxuXHR7XHJcbiAgICAgICAgcmV0dXJuIFNpbmdsZXRvbi5JbnN0YW5jZShyZWYpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgbWFwVmlldyggdmlld2tleTpzdHJpbmcscmVmOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIVBhbmVsUmVzRGljLl9tYXB2aWV3RGljdFt2aWV3a2V5XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBQYW5lbFJlc0RpYy5fbWFwdmlld0RpY3Rbdmlld2tleV0gPSByZWY7XHJcbiAgICAgICAgICAgIHJlZi5rZXkgPSB2aWV3a2V5O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgQWdlbmN5QWRkKHJlZjphbnkpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgU2luZ2xldG9uLmNyZWF0ZShyZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBBZ2VuY3lDbGVhcihyZWY6YW55KTp2b2lkXHJcblx0e1xyXG4gICAgICAgIFNpbmdsZXRvbi5yZW1vdmUocmVmKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQcm9wTWFuYWdlclxyXG57XHJcbiAgICBzdGF0aWMgc2NlbmUzRDpMYXlhLlNjZW5lM0Q7XHJcbiAgICBzdGF0aWMgc3RhcnRQbGFuZTpMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgIHN0YXRpYyBjYXJtYTpMYXlhLkNhbWVyYTtcclxuICAgIHN0YXRpYyBtYWluUm9sZTpMYXlhLlNwcml0ZTNEO1xyXG4gICAgc3RhdGljIG5vd21hcERpY3Q6YW55ID0ge307XHJcbiAgICBzdGF0aWMgZGllUG9zWTpudW1iZXIgPSAwO1xyXG4gICAgc3RhdGljIGVuZFBsYW5lOkxheWEuTWVzaFNwcml0ZTNEO1xyXG5cclxuICAgIHN0YXRpYyBnYW1ld2luUG9zWjpudW1iZXIgPSAwO1xyXG5cclxuICAgIHN0YXRpYyBwYXR0ZXJuRGljdDphbnkgPSB7fTtcclxuXHJcbiAgICBzdGF0aWMgbnBjRGljdDphbnkgPSB7fTtcclxuICAgIHN0YXRpYyBucGNzY3JpcHREaWN0OmFueSA9IHt9O1xyXG4gICAgc3RhdGljIG5wY251bTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHN0YXRpYyBpc2Nhcm1hbnBjOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzdGF0aWMgcHJvX2ppbmR1OmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuXHJcbiAgICBzdGF0aWMgdHh0X21pbmdjaTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG5cclxuICAgIHN0YXRpYyBsaXppRGljdDphbnkgPSB7fTtcclxuXHJcbiAgICBzdGF0aWMgamlhbnRvdUFycjpBcnJheTxMYXlhLk1lc2hTcHJpdGUzRD49W107XHJcblxyXG4gICAgLy8gc3RhdGljIGJnc3ByaXRlM2Q6TGF5YS5NZXNoU3ByaXRlM0Q7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlByb3BNYW5hZ2VyO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBQcm9wTWFuYWdlci5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6UHJvcE1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wTWFuYWdlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvcE1hbmFnZXIuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRQb3NWZWNieVNjZW5lKCBzY2VuZU5hbWU6c3RyaW5nLGJ1aWxkbmFtZTpzdHJpbmcgKTpMYXlhLlZlY3RvcjNcclxuICAgIHtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIucGF0dGVybkRpY3RbIHNjZW5lTmFtZSBdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgc2NlbmVOYW1lIF1bYnVpbGRuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLyoqXHJcbiAgICAvLyAgKiDliKTmlq3mmK/lkKbniKzliLDpobbnq69cclxuICAgIC8vICAqL1xyXG4gICAgLy8gc3RhdGljIGNoZWNraXNDbGltYlRvcCggc2NlbmVOYW1lOnN0cmluZyxidWlsZG5hbWU6c3RyaW5nLCBwb3M6TGF5YS5WZWN0b3IzICk6Ym9vbGVhblxyXG4gICAgLy8ge1xyXG4gICAgLy8gICAgIHZhciB2ZWM6TGF5YS5WZWN0b3IzID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggc2NlbmVOYW1lLGJ1aWxkbmFtZSApO1xyXG4gICAgLy8gICAgIGlmKCB2ZWMgJiYgTWF0aC5hYnModmVjLnkgLSBwb3MueSkgPCAxLjUgKVxyXG4gICAgLy8gICAgIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgYWN0aW9ubnVtczpudW1iZXIgPSA1NzU7XHJcblxyXG4gICAgc3RhdGljIGFjdGlvbkRpY3Q6YW55ID0geyBcclxuICAgICAgICBcImNsaW1iZW5kXCI6eyBzOjU1MCxlOjU3NSxpc2xvb3Bpbmc6ZmFsc2UgfSxcclxuICAgICAgICBcInN0YW5kXCI6eyBzOjAsZTo4MCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicnVuXCI6eyBzOjkwLGU6MTA2LGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJqdW1wXCI6eyBzOjExMCxlOjEzMixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwia29uZ3pob25nXCI6eyBzOjEzMixlOjE0NSxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwibHVvZGkxXCI6eyBzOjE0NSxlOjE2MCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwibHVvZGkyXCI6eyBzOjE3MCxlOjIwMixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiZGF0aWFvMVwiOnsgczoyMTAsZToyMzUsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImRhdGlhbzJcIjp7IHM6MjQwLGU6MjczLGlzbG9vcGluZzp0cnVlIH0sXHJcbiAgICAgICAgXCJodWFjaGFuXCI6eyBzOjI4MCxlOjMxMCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwia3VhbGFuXCI6eyBzOjMxMCxlOjM0Nixpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiY2VmYW4xXCI6eyBzOjM1MCxlOjM5MSxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwiY2VmYW4yXCI6eyBzOjQwMCxlOjQzNCxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFvcWlhbmdsZWZ0XCI6eyBzOjQ0MCxpc2xvb3Bpbmc6dHJ1ZSxlOjQ1NiB9LFxyXG4gICAgICAgIFwicmlnaHRqdW1wXCI6eyBzOjQ2MCxlOjQ3Nyxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFvcWlhbmdyaWdodFwiOnsgczo0ODAsZTo0OTYsaXNsb29waW5nOnRydWUgfSxcclxuICAgICAgICBcImxlZnRqdW1wXCI6eyBzOjUwMCxlOjUxNyxpc2xvb3Bpbmc6dHJ1ZSB9LFxyXG4gICAgICAgIFwicGFxaWFuZ1wiOnsgczo1MjAsZTo1NDIsaXNsb29waW5nOnRydWUgfVxyXG4gICAgIH07XHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBhbmltYXRvciBcclxuICAgICAqIEBwYXJhbSBhbmltYXRvckRpY3QgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzZXRBbmltYXRvciggYW5pbWF0b3I6TGF5YS5BbmltYXRvciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgY2hpZGRpY3Q6YW55O1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gUHJvcE1hbmFnZXIuYWN0aW9uRGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggIWFuaW1hdG9yLmdldENvbnRyb2xsZXJMYXllciggKS5nZXRBbmltYXRvclN0YXRlKCBzICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjaGlkZGljdCA9IFByb3BNYW5hZ2VyLmFjdGlvbkRpY3Rbc107XHJcbiAgICAgICAgICAgICAgICAvL+WIm+W7uuS4gOS4quWKqOeUu+WKqOS9nOeKtuaAgVxyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlMSA9IG5ldyBMYXlhLkFuaW1hdG9yU3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIC8v6K6+572u5Yqo5L2c54q25oCB55qE5ZCN56ewXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTEubmFtZSA9IHM7XHJcbiAgICAgICAgICAgICAgICAvL+iuvue9ruWKqOS9nOeKtuaAgeaSreaUvueahOi1t+Wni+aXtumXtO+8iOi1t+Wni+aXtumXtOS4jue7k+adn+aXtumXtOeahOiuvue9ruS4ujAtMeeahOeZvuWIhuavlOaVsOWAvO+8iSAg6KaB5oiq5Y+W55qE5pe26Ze054K5IC8g5Yqo55S755qE5oC75pe26ZW/XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcFN0YXJ0ID0gY2hpZGRpY3Qucy9Qcm9wTWFuYWdlci5hY3Rpb25udW1zO1xyXG4gICAgICAgICAgICAgICAgLy/orr7nva7liqjkvZznirbmgIHmkq3mlL7nmoTnu5PmnZ/ml7bpl7RcclxuICAgICAgICAgICAgICAgIHN0YXRlMS5jbGlwRW5kID0gY2hpZGRpY3QuZS9Qcm9wTWFuYWdlci5hY3Rpb25udW1zO1xyXG4gICAgICAgICAgICAgICAgLy/lvpfliLDpu5jorqTliqjnlLvotYvlgLznu5lDbGlw77yIZ2V0RGVmYXVsdFN0YXRl6buY6K6k5Yqo55S75Li6VW5pdHnkuK1hbmltYXRpb27nmoTmlbDnu4Tpobrluo8w5LiL5qCH55qE5Yqo55S777yJXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTEuY2xpcCA9IGFuaW1hdG9yLmdldERlZmF1bHRTdGF0ZSgpLmNsaXA7XHJcbiAgICAgICAgICAgICAgICAvL+WKqOeUu+aSreaUvuaYr+WQpuW+queOr1xyXG4gICAgICAgICAgICAgICAgc3RhdGUxLmNsaXAuaXNsb29waW5nID0gY2hpZGRpY3QuaXNsb29waW5nO1xyXG4gICAgICAgICAgICAgICAgLy/mt7vliqDliqjnlLvnirbmgIHliLDliqjnlLvnu4Tku7bph4xcclxuICAgICAgICAgICAgICAgIGFuaW1hdG9yLmFkZFN0YXRlKHN0YXRlMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEluaXRFZmZlY3QoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcInNwZWVkdXBlZmZlY3RcIiApO1xyXG4gICAgICAgIGxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIGxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBcImNvbG9yX3doaXRlXCIgKTtcclxuICAgICAgICBsaXppLnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICBsaXppLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEID0gUHJvcE1hbmFnZXIuZ2V0bGl6aWJ5TmFtZSggXCJjb2xvcl95ZWxsb3dcIiApO1xyXG4gICAgICAgIGxpemkucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIGxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGFuc2VsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHVibGljIFNldEVmZmVjdENvbG9yKCBuYW1lOnN0cmluZyxwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBjbG9zZXRpbWU6bnVtYmVyID0gMDtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMuRWZmZWN0RW5kICk7XHJcbiAgICAgICAgdGhpcy5FZmZlY3RFbmRDb2xvcigpO1xyXG4gICAgICAgIGlmKCBuYW1lID09IFwiY29sb3Jfd2hpdGVcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgICAgICAgICBpZiggc29ydCA+IDUwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZSA9IFwiY29sb3JfeWVsbG93XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2xvc2V0aW1lID0gNTAwO1xyXG4gICAgICAgIHRoaXMuX3RhbnNlbGl6aSA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIG5hbWUgKTtcclxuICAgICAgICB0aGlzLl90YW5zZWxpemkudHJhbnNmb3JtLnBvc2l0aW9uID0gcG9zO1xyXG4gICAgICAgIHRoaXMuX3RhbnNlbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgaWYoIGNsb3NldGltZSAhPSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggY2xvc2V0aW1lLHRoaXMsdGhpcy5FZmZlY3RFbmRDb2xvciApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEVmZmVjdEVuZENvbG9yKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl90YW5zZWxpemkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFuc2VsaXppLnBhcnRpY2xlU3lzdGVtLnN0b3AoKTtcclxuICAgICAgICAgICAgdGhpcy5fdGFuc2VsaXppLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppNDpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHByaXZhdGUgX291dFFVYXRlcm5pb240OkxheWEuUXVhdGVybmlvbiA9IG5ldyBMYXlhLlF1YXRlcm5pb247XHJcbiAgICBwdWJsaWMgU3BlZWRVcEVmZmVjdDEobmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5fZW5nYW1lbGl6aTQgfHwgKHRoaXMuX2VuZ2FtZWxpemk0ICYmICF0aGlzLl9lbmdhbWVsaXppNC5hY3RpdmUgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNCA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwic3BlZWR1cGVmZmVjdFwiICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LnBhcnRpY2xlU3lzdGVtLmxvb3BpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppNC50cmFuc2Zvcm0uc2NhbGUgPSBuZXcgTGF5YS5WZWN0b3IzKCAyMCwyMCwyMCApO1xyXG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMSwwLDAgKSwtNTAsdGhpcy5fb3V0UVVhdGVybmlvbjQgKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQudHJhbnNmb3JtLnJvdGF0aW9uID0gdGhpcy5fb3V0UVVhdGVybmlvbjQ7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LnBhcnRpY2xlU3lzdGVtLnBsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGx6cG9zOkxheWEuVmVjdG9yMyA9IHBvcy5jbG9uZSgpO1xyXG4gICAgICAgIGx6cG9zLnkgKz0gNTtcclxuICAgICAgICBsenBvcy56IC09IDEwO1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemk0LnRyYW5zZm9ybS5wb3NpdGlvbiA9IGx6cG9zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBDbG9zZVNwZWVkVXBFZmZlY3QxKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9lbmdhbWVsaXppNCAmJiB0aGlzLl9lbmdhbWVsaXppNC5hY3RpdmUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTQuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VuZ2FtZWxpemkzOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHJpdmF0ZSBfb3V0UVVhdGVybmlvbjpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uO1xyXG4gICAgcHVibGljIFNwZWVkVXBFZmZlY3QobmFtZTpzdHJpbmcscG9zOkxheWEuVmVjdG9yMyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCAhdGhpcy5fZW5nYW1lbGl6aTMgfHwgKHRoaXMuX2VuZ2FtZWxpemkzICYmICF0aGlzLl9lbmdhbWVsaXppMy5hY3RpdmUgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMyA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwic3BlZWR1cGVmZmVjdFwiICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLnBhcnRpY2xlU3lzdGVtLmxvb3BpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy50cmFuc2Zvcm0uc2NhbGUgPSBuZXcgTGF5YS5WZWN0b3IzKCAyMCwyMCwyMCApO1xyXG4gICAgICAgICAgICBMYXlhLlF1YXRlcm5pb24uY3JlYXRlRnJvbUF4aXNBbmdsZSggbmV3IExheWEuVmVjdG9yMyggMSwwLDAgKSwtNTAsdGhpcy5fb3V0UVVhdGVybmlvbiApO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy50cmFuc2Zvcm0ucm90YXRpb24gPSB0aGlzLl9vdXRRVWF0ZXJuaW9uO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMy5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsenBvczpMYXlhLlZlY3RvcjMgPSBwb3MuY2xvbmUoKTtcclxuICAgICAgICBsenBvcy55ICs9IDU7XHJcbiAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTMudHJhbnNmb3JtLnBvc2l0aW9uID0gbHpwb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENsb3NlU3BlZWRVcEVmZmVjdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fZW5nYW1lbGl6aTMgJiYgdGhpcy5fZW5nYW1lbGl6aTMuYWN0aXZlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkzLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbmdhbWVsaXppMTpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgIHByaXZhdGUgX2VuZ2FtZWxpemkyOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEO1xyXG4gICAgcHVibGljIEdhbWVPdmVyRWZmZWNmKG5hbWU6c3RyaW5nLHBvczpMYXlhLlZlY3RvcjMsaXN3aW46Ym9vbGVhbik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxID0gUHJvcE1hbmFnZXIuZ2V0bGl6aWJ5TmFtZSggXCJmaXJld29ya3NcIiApO1xyXG4gICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvcztcclxuICAgICAgICB0aGlzLl9lbmdhbWVsaXppMS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAgICAgaWYoaXN3aW4pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMiA9IFByb3BNYW5hZ2VyLmdldGxpemlieU5hbWUoIFwid2lubGluZVwiICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkyLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvcztcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIucGFydGljbGVTeXN0ZW0ucGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQ2xvc2VHYW1lT3ZlckVmZmVjdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLl9lbmdhbWVsaXppMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VuZ2FtZWxpemkxLnBhcnRpY2xlU3lzdGVtLnN0b3AoKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTEuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuX2VuZ2FtZWxpemkyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZW5nYW1lbGl6aTIucGFydGljbGVTeXN0ZW0uc3RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbmdhbWVsaXppMi5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHVibGljIHNldGxpemlQbGF5KCBuYW1lOnN0cmluZyxwb3M6TGF5YS5WZWN0b3IzICk6dm9pZFxyXG4gICAgLy8ge1xyXG4gICAgLy8gICAgIHZhciBjbG9zZXRpbWU6bnVtYmVyID0gMDtcclxuICAgIC8vICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMubGl6aWVuZCApO1xyXG4gICAgLy8gICAgIHN3aXRjaCggbmFtZSApXHJcbiAgICAvLyAgICAge1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwidGFuc2VfYmFpXCI6XHJcbiAgICAvLyAgICAgICAgICAgICBpZiggbmFtZSA9PSBcInRhbnNlX2JhaVwiIClcclxuICAgIC8vICAgICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB2YXIgc29ydDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLDEwMCApO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmKCBzb3J0ID4gNTAgKVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IFwidGFuc2VfaHVhbmdcIjtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSA1MDA7XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwiamlhc3VsaXppXCI6XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwid2luX3hpYW5cIjpcclxuICAgIC8vICAgICAgICAgICAgIGNsb3NldGltZSA9IDA7XHJcbiAgICAvLyAgICAgICAgIGJyZWFrO1xyXG4gICAgLy8gICAgICAgICBjYXNlIFwieWFuaHVhXCI6XHJcbiAgICAvLyAgICAgICAgICAgICBjbG9zZXRpbWUgPSAwO1xyXG4gICAgLy8gICAgICAgICBicmVhaztcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgdmFyIGxpemk6TGF5YS5TaHVyaUtlblBhcnRpY2xlM0QgPSBQcm9wTWFuYWdlci5nZXRsaXppYnlOYW1lKCBuYW1lICk7XHJcbiAgICAvLyAgICAgbGl6aS50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3M7XHJcbiAgICAvLyAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5wbGF5KCk7XHJcbiAgICAvLyAgICAgaWYoIGNsb3NldGltZSAhPSAwIClcclxuICAgIC8vICAgICB7XHJcbiAgICAvLyAgICAgICAgIExheWEudGltZXIub25jZSggY2xvc2V0aW1lLHRoaXMsdGhpcy5saXppZW5kLFtsaXppXSApO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIEVmZmVjdEVuZChsaXppOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGxpemkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGl6aS5wYXJ0aWNsZVN5c3RlbS5zdG9wKCk7XHJcbiAgICAgICAgICAgIGxpemkuYWN0aXZlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRsaXppYnlOYW1lKCBuYW1lOnN0cmluZyApOkxheWEuU2h1cmlLZW5QYXJ0aWNsZTNEXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxpemlzcDpMYXlhLlNodXJpS2VuUGFydGljbGUzRDtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIubGl6aURpY3RbbmFtZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGl6aXNwID0gUHJvcE1hbmFnZXIubGl6aURpY3RbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxpemlzcCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRE1vZGVsKG5hbWUpKSkgYXMgTGF5YS5TaHVyaUtlblBhcnRpY2xlM0Q7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLmxpemlEaWN0W25hbWVdID0gbGl6aXNwO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKCBsaXppc3AgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGl6aXNwLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGxpemlzcDtcclxuICAgIH1cclxufSIsImltcG9ydCB7UGFuZWxDaGlsZENvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQ2hpbGRDb250cm9sXCI7XHJcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgUmVjb21tZW5kIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9DcGFJdGVtXCI7XHJcbmltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhb0t1YW5HYW1lVmlldyBleHRlbmRzIFBhbmVsQ2hpbGRDb250cm9sIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuICAgIGNfc3RhdGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcclxuICAgIGl0ZW1fMDpDcGFJdGVtO1xyXG4gICAgaXRlbV8xOkNwYUl0ZW07XHJcbiAgICBpdGVtXzI6Q3BhSXRlbTtcclxuICAgIGl0ZW1fMzpDcGFJdGVtO1xyXG4gICAgdDA6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pbml0VmlldygpO1xyXG4gICAgICAgIHRoaXMuaW5pdEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXIoIFwiY19zdGF0ZVwiICk7XHJcbiAgICAgICAgdGhpcy50MCA9IHRoaXMuZ2V0VHJhbnNpdGlvbiggXCJ0MFwiICk7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi55uR5ZCs5LqS5o6o5LqL5Lu2LS0tQmFva3VhbkdhbWUwXCIpO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnREYXRhKCBDcGFFdmVudC5ZUUhvbWVEYXRhLHRoaXMsdGhpcy55cWhvbWVkYXRhSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgeXFob21lZGF0YUhhbmRsZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLnm5HlkKzkupLmjqjkuovku7YtLS1CYW9rdWFuR2FtZTFcIik7XHJcbiAgICAgICAgdGhpcy5SZWZyZXNoQktZWCgpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzdGFydCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lICs9IGR0O1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fdGltZSA+PSA1MDAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlZnJlc2hCS1lYKCB0cnVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAga2V5ID0gMDtcclxuICAgIHByaXZhdGUgX2lzdGFydDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBSZWZyZXNoQktZWCggaXNhbm1vOmJvb2xlYW4gPSBmYWxzZSApICBcclxuICAgIHtcclxuICAgICAgICBpZiAoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEucmVjb21tZW5kKSByZXR1cm47XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLnm5HlkKzkupLmjqjkuovku7YtLS1CYW9rdWFuR2FtZTJcIik7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xyXG4gICAgICAgIHZhciBkYXRhcyA9IFJlY29tbWVuZC5jYWluaXhpaHVhbkRhdGE7XHJcbiAgICAgICAgdmFyIGl0ZW06Q3BhSXRlbTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykgIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMua2V5ICsgaSA+PSBkYXRhcy5sZW5ndGggLSAxKSAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXkgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBjdXJkYXRhID0gZGF0YXNbdGhpcy5rZXkgKyBpXTsgIFxyXG4gICAgICAgICAgICBpdGVtID0gdGhpc1tcIml0ZW1fXCIraV07XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIGN1cmRhdGEsdHJ1ZSApO1xyXG4gICAgICAgICAgICBpZiAoY3VyZGF0YSA9PSBudWxsKSBjb250aW51ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMua2V5ICs9IDQ7XHJcbiAgICAgICAgaWYgKHRoaXMua2V5ID49IGRhdGFzLmxlbmd0aCAtIDEpICB7XHJcbiAgICAgICAgICAgIHRoaXMua2V5ID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXN0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICBpZiggaXNhbm1vIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudDAucGxheSggbnVsbCwxICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuL0NwYUl0ZW1cIjtcclxuaW1wb3J0IHsgUmVjb21tZW5kSXRlbSwgUmVjb21tZW5kIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHsgR2FtZVN0YXRlIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgeyBDb21wbGV0ZVBhbmVsIH0gZnJvbSBcIi4uL1ZpZXcvQ29tcGxldGVQYW5lbFwiO1xyXG5pbXBvcnQgeyBSb2xlRGF0YSB9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaG91dGlQYW5WaWV3IGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQ2hvdXRpUGFuVmlld1wiO1xyXG4gICAgYnRuX3JldHVybjpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgbGlzdF8xOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgYnRuX2ppeHVnYW1lOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBwcml2YXRlIF9ub3dMaXN0MDpSZWNvbW1lbmRJdGVtW107XHJcbiAgICBwcml2YXRlIF9ub3dMaXN0MTpSZWNvbW1lbmRJdGVtW107XHJcbiAgICBwcml2YXRlIF9pc1N0YXJ0OmJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9pc2Nhbm1vdmU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNkb3duOmJvb2xlYW47XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIGlzZW5kOm51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZW5kPykgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcImNob3V0aXBhblZpZXdcIiApOyBcclxuICAgICAgICB0aGlzLmlzZW5kID0gZW5kO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxpc3RfMC5zZXRWaXJ0dWFsKCk7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1yZW5kZXJsaXN0LG51bGwsZmFsc2UgKTtcclxuICAgICAgICB0aGlzLmxpc3RfMS5zZXRWaXJ0dWFsKCk7XHJcbiAgICAgICAgdGhpcy5saXN0XzEuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcyx0aGlzLml0ZW1yZW5kZXJsaXN0MSxudWxsLGZhbHNlICk7XHJcblxyXG4gICAgICAgIHRoaXMuX25vd0xpc3QwID0gUmVjb21tZW5kLmdkeXhEYXRhO1xyXG4gICAgICAgIHRoaXMuX25vd0xpc3QxID0gUmVjb21tZW5kLmdkeXhEYXRhO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLm51bUl0ZW1zID0gdGhpcy5fbm93TGlzdDAubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMubGlzdF8xLm51bUl0ZW1zID0gdGhpcy5fbm93TGlzdDEubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuX2lzU3RhcnQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IHRydWU7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fcmV0dXJuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uY2xvc2VmdW4gKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl9qaXh1Z2FtZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzEsTGF5YS5FdmVudC5NT1VTRV9ET1dOLHRoaXMsdGhpcy5kb3duY2xpY2sgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMSxMYXlhLkV2ZW50Lk1PVVNFX1VQLHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzEsTGF5YS5FdmVudC5NT1VTRV9PVVQsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0KCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd0xpc3QwLmxlbmd0aCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLl9ub3dMaXN0MFtpbmRleF0gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdDEoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93TGlzdDEubGVuZ3RoIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuX25vd0xpc3QxW2luZGV4XSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRvd25jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Rvd24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IGZhbHNlO1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRpbWVvdXRDYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNkb3duIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzZG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IHRoaXMubGlzdF8xLnNjcm9sbFBhbmUucGVyY1k7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX21vdmV0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9mbHVzaHRpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgZGlyOmJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfbm93dmFsdWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNTdGFydCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5saXN0XzEuc2Nyb2xsUGFuZSAmJiB0aGlzLl9ub3dMaXN0MSAmJiB0aGlzLl9pc2Nhbm1vdmUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5kaXIgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlICs9IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA+PSAxIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgLT0gMC4wMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlIDw9IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0XzEuc2Nyb2xsUGFuZS5zZXRQZXJjWSggdGhpcy5fbm93dmFsdWUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uY2xvc2VmdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuaXNlbmQgPT0gMSl7XHJcbiAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5sb3NlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuaXNlbmQgPT0gMil7XHJcbiAgICAgICAgICAgbGV0IGdvbGQgPSAgUm9sZURhdGEuSW5zdGFuY2UubGV2ZWxjZmcud2luR29sZDtcclxuICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZShDaG91dGlQYW5WaWV3KTtcclxuICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoQ29tcGxldGVQYW5lbCxnb2xkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcclxuICAgIH1cclxuICAgIFxyXG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcclxuaW1wb3J0IENwYUV2ZW50IGZyb20gXCIuL0NwYUV2ZW50XCI7XHJcbmltcG9ydCB7IFJlY29tbWVuZCwgUmVjb21tZW5kSXRlbSB9IGZyb20gXCIuL1JlY29tbWVuZFZpZXdcIjtcclxuaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vQ3BhSXRlbVwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbi8vIGltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vdHRhZFwiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgU2NlbmVDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcGFEb3duc1ZpZXcgZXh0ZW5kcyBQYW5lbENoaWxkQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XHJcbiAgICBsaXN0XzA6ZmFpcnlndWkuR0xpc3Q7XHJcbiAgICBwcml2YXRlIF9ub3dMaXN0OlJlY29tbWVuZEl0ZW1bXTtcclxuICAgIHByaXZhdGUgX2lzU3RhcnQ6Ym9vbGVhbjtcclxuICAgIHByaXZhdGUgX2lzY2FubW92ZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc2Rvd246Ym9vbGVhbjtcclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuXHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5faXNTdGFydCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50RGF0YSggQ3BhRXZlbnQuWVFIb21lRGF0YSx0aGlzLHRoaXMueXFob21lZGF0YUhhbmRsZXIgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX0RPV04sdGhpcyx0aGlzLmRvd25jbGljayApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfVVAsdGhpcyx0aGlzLnVwY2xpY2sgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmxpc3RfMCxMYXlhLkV2ZW50Lk1PVVNFX09VVCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZG93bmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduKXJldHVybjtcclxuICAgICAgICB0aGlzLl9pc2Rvd24gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IGZhbHNlO1xyXG4gICAgICAgIExheWEudGltZXIuY2xlYXIoIHRoaXMsdGhpcy50aW1lb3V0Q2FsbGJhY2sgKTtcclxuXHJcbiAgICAgICAgLy8gdHRhZC5DcmVhdGVNb3JlR2FtZUJ0bigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdGltZW91dENhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduKXJldHVybjtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZihTY2VuZUNvbnRyb2wuSXNTaG93U2lnbilyZXR1cm47XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzZG93biApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9pc2Rvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSB0aGlzLmxpc3RfMC5zY3JvbGxQYW5lLnBlcmNYO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcyx0aGlzLnRpbWVvdXRDYWxsYmFjayApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZmx1c2h0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93TGlzdCAmJiB0aGlzLl9pc2Nhbm1vdmUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5kaXIgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlICs9IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA+PSAxIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgLT0gMC4wMDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3ZhbHVlIDw9IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm93dmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0XzAuc2Nyb2xsUGFuZS5zZXRQZXJjWCggdGhpcy5fbm93dmFsdWUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0KCBpbmRleDpudW1iZXIsaXRlbTpDcGFJdGVtICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpbmRleCA8IHRoaXMuX25vd0xpc3QubGVuZ3RoIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuX25vd0xpc3RbaW5kZXhdLHRydWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB5cWhvbWVkYXRhSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDE7XHJcbiAgICAgICAgdGhpcy5fbm93TGlzdCA9IFJlY29tbWVuZC5jYWluaXhpaHVhbkRhdGE7XHJcbiAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSB0aGlzLl9ub3dMaXN0Lmxlbmd0aDtcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCB0aGlzLl9ub3dMaXN0Lmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNTdGFydCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gdHJ1ZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCh0aGlzKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhRXZlbnRcclxue1xyXG4gICAgc3RhdGljIFlRSG9tZURhdGE6c3RyaW5nID0gXCJDcGFFdmVudF9ZUUhvbWVEYXRhXCI7XHJcbn0iLCJpbXBvcnQge1BhbmVsQ2hpbGRDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbENoaWxkQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBSZWNvbW1lbmRJdGVtLCBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgQ2hvdXRpUGFuVmlldyBmcm9tIFwiLi9DaG91dGlQYW5WaWV3XCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3BhSXRlbSBleHRlbmRzIFBhbmVsQ2hpbGRDb250cm9sIFxyXG57XHJcbiAgICBpbWdfdGlwOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgdHh0X3dvcmQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHR4dF93b3JkMTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgcHJpdmF0ZSBfdm86UmVjb21tZW5kSXRlbTtcclxuICAgIHByaXZhdGUgaXNwZW5jaG91dGlwYW46Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuICAgIFxyXG4gICAgcHVibGljIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcImNhcEl0ZW1cIjtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uYnRuY2xpY2sgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uYnRuY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX3ZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBkYXRhOlJlY29tbWVuZEl0ZW0gPSB0aGlzLl92bztcclxuICAgICAgICAgICAgRllIRF9TZGsuU2hvd0h1VHVpSnVtcChkYXRhLHRoaXMuaXNwZW5jaG91dGlwYW4pO1xyXG4gICAgICAgICAgICAvLyB2YXIgYXBwaWQgPSBkYXRhLnRvX2FwcGlkO1xyXG4gICAgICAgICAgICAvLyB2YXIgcGF0aCA9IGRhdGEuanVtcF9wYXRoO1xyXG4gICAgICAgICAgICAvLyBsZXQgcGFyYW0gPSB7XCJhcHBJZFwiOmFwcGlkLnRvU3RyaW5nKCksXCJwYXRoXCI6cGF0aC50b1N0cmluZygpfTtcclxuICAgICAgICAgICAgLy8gaWYoTGF5YS5Ccm93c2VyLm9uTW9iaWxlKVxyXG4gICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm5hdmlnYXRlVG9NaW5pUHJvZ3JhbShcclxuICAgICAgICAgICAgLy8gICAgIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICBhcHBJZDphcHBpZC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHBhdGg6cGF0aC50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHN1Y2Nlc3M6cmVzPT5cclxuICAgICAgICAgICAgLy8gICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi6Lez6L2s5Yiw5ri45oiP5aSx5oiQ5YqfXCIsXCIxXCIpO1xyXG4gICAgICAgICAgICAvLyAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgZmFpbDpyZXM9PlxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgaWYoIHRoaXMuaXNwZW5jaG91dGlwYW4gKVxyXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93RGF0YSggZGF0YTpSZWNvbW1lbmRJdGVtLGlzb3BlbmNob3V0aXBhbjpib29sZWFuID0gZmFsc2UgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pc3BlbmNob3V0aXBhbiA9IGlzb3BlbmNob3V0aXBhbjtcclxuICAgICAgICB0aGlzLl92byA9IGRhdGE7XHJcbiAgICAgICAgaWYoIGRhdGEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkX2ljb24udXJsID0gZGF0YS5pY29uO1xyXG4gICAgICAgICAgICBpZiggdGhpcy50eHRfd29yZCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHh0X3dvcmQudGV4dCA9IGRhdGEudG9nYW1lX25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuaW1nX3RpcCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW1nX3RpcC52aXNpYmxlID0gTWF0aC5yYW5kb20oKSA+IDAuNT90cnVlOmZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLnR4dF93b3JkMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHh0X3dvcmQxLnRleHQgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KDIzNTQ3MCwxNTYxNDMwKS50b1N0cmluZygpICsgXCLkurrnjqlcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgIH1cclxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCBDcGFFdmVudCBmcm9tIFwiLi9DcGFFdmVudFwiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIHJlY29tbWVuZFBhblxyXG57XHJcbiAgICBjb25zdHJ1Y3RvcihkYXRhOk9iamVjdClcclxuICAgIHtcclxuICAgICAgICB0aGlzLmdhbWVfZmxnID0gZGF0YVtcImdhbWVfZmxnXCJdO1xyXG4gICAgICAgIHRoaXMuZ2FtZV9pZCA9IGRhdGFbXCJnYW1lX2lkXCJdO1xyXG4gICAgICAgIHRoaXMuZ2FtZV9uYW1lID0gZGF0YVtcImdhbWVfbmFtZVwiXTtcclxuICAgICAgICB0aGlzLmlkID0gZGF0YVtcImlkXCJdO1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25fZmxnID0gZGF0YVtcImxvY2F0aW9uX2ZsZ1wiXTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uX2lkID0gZGF0YVtcImxvY2F0aW9uX2lkXCJdO1xyXG4gICAgICAgIHRoaXMubG9jYXRpb25fbmFtZSA9IGRhdGFbXCJsb2NhdGlvbl9uYW1lXCJdO1xyXG4gICAgICAgIHRoaXMubWF0dGVyX3R5cGUgPSBkYXRhW1wibWF0dGVyX3R5cGVcIl07XHJcbiAgICB9XHJcbiAgICBnYW1lX2ZsZzpzdHJpbmc7XHJcbiAgICBnYW1lX2lkOm51bWJlcjtcclxuICAgIGdhbWVfbmFtZTpzdHJpbmc7XHJcbiAgICBpZDpzdHJpbmc7XHJcbiAgICBsb2NhdGlvbl9mbGc6c3RyaW5nO1xyXG4gICAgbG9jYXRpb25faWQ6bnVtYmVyO1xyXG4gICAgbG9jYXRpb25fbmFtZTpzdHJpbmc7XHJcbiAgICBtYXR0ZXJfdHlwZTpzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNvbW1lbmRcclxue1xyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIFJlY29tbWVuZC5Jbml0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRkYXRhID0gZmFsc2U7XHJcbiAgICBzdGF0aWMgSW5pdERhdGEoKVxyXG4gICAge1xyXG4gICAgICAgIFJlY29tbWVuZC5jYWluaXhpaHVhbkRhdGEgPSBSZWNvbW1lbmQuR2V0Q2FpTmlYaWFIdWFuRGF0YXMoKTtcclxuICAgICAgICBSZWNvbW1lbmQuamllc3VhbkRhdGEgPSBSZWNvbW1lbmQuR2V0SkllU3VhbkRhdGFzKCk7XHJcbiAgICAgICAgUmVjb21tZW5kLmdkeXhEYXRhID0gUmVjb21tZW5kLkdldEdEWVhEYXRhcygpO1xyXG4gICAgICAgIFJlY29tbWVuZC5iYW9rdWFueW91eGlEYXRhID0gUmVjb21tZW5kLkdldEJhb0t1YW5Zb3VYaURhdGFzKCk7XHJcbiAgICAgICAgUmVjb21tZW5kLm1vcmVEYXRhID0gUmVjb21tZW5kLkdldE1vcmVEYXRhcygpO1xyXG4gICAgICAgIGZvcih2YXIga2V5IGluIEZZSERfU2RrLnB1c2hEYXRhKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgUmVjb21tZW5kLnJlY29tbWVuZERpY1tGWUhEX1Nkay5wdXNoRGF0YVtrZXldLmxvY2F0aW9uX2ZsZ10gID0gbmV3IHJlY29tbWVuZFBhbihGWUhEX1Nkay5wdXNoRGF0YVtrZXldKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUmVjb21tZW5kLmdldGRhdGEgPSB0cnVlO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIENwYUV2ZW50LllRSG9tZURhdGEgKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS6kuaOqOaVsOaNruWIneWni+WMlnJlY29tbWVuZC0tLS0tLS0tLS0tLS0tXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZWNvbW1lbmREaWMgPSB7fTtcclxuICAgIHN0YXRpYyBjYWluaXhpaHVhbkRhdGE6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICBzdGF0aWMgYmFva3VhbnlvdXhpRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgIHN0YXRpYyBnZHl4RGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgIHN0YXRpYyBqaWVzdWFuRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgIHN0YXRpYyBtb3JlRGF0YTpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuXHJcblxyXG4gICAgc3RhdGljIEdldFNTRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIEdldENhaU5pWGlhSHVhbkRhdGFzKCk6UmVjb21tZW5kSXRlbVtdXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGl0ZW1zOlJlY29tbWVuZEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIGlmKCFGWUhEX1Nkay5wdXNoRGF0YSlyZXR1cm4gaXRlbXM7XHJcbiAgICAgICAgZm9yKHZhciBpID0gMDtpIDwgRllIRF9TZGsucHVzaERhdGEubGVuZ3RoO2krKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJlY29tbWVuZEl0ZW0oRllIRF9TZGsucHVzaERhdGFbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG4gICAgc3RhdGljIEdldE1vcmVEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IEZZSERfU2RrLnB1c2hEYXRhLmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgR2V0QmFvS3VhbllvdVhpRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHsgXHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3IFJlY29tbWVuZEl0ZW0oRllIRF9TZGsucHVzaERhdGFbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBHZXRKSWVTdWFuRGF0YXMoKTpSZWNvbW1lbmRJdGVtW11cclxuICAgIHtcclxuICAgICAgICB2YXIgaXRlbXM6UmVjb21tZW5kSXRlbVtdID0gW107XHJcbiAgICAgICAgaWYoIUZZSERfU2RrLnB1c2hEYXRhKXJldHVybiBpdGVtcztcclxuICAgICAgICBmb3IodmFyIGkgPSAwO2kgPCBGWUhEX1Nkay5wdXNoRGF0YS5sZW5ndGg7aSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgUmVjb21tZW5kSXRlbShGWUhEX1Nkay5wdXNoRGF0YVtpXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIEdldEdEWVhEYXRhcygpOlJlY29tbWVuZEl0ZW1bXVxyXG4gICAge1xyXG4gICAgICAgIHZhciBpdGVtczpSZWNvbW1lbmRJdGVtW10gPSBbXTtcclxuICAgICAgICBpZighRllIRF9TZGsucHVzaERhdGEpcmV0dXJuIGl0ZW1zO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IEZZSERfU2RrLnB1c2hEYXRhLmxlbmd0aDtpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBSZWNvbW1lbmRJdGVtKEZZSERfU2RrLnB1c2hEYXRhW2ldKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29tbWVuZEl0ZW1cclxue1xyXG4gICAgY29uc3RydWN0b3IoRGF0YTpPYmplY3QpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pY29uID0gRGF0YVtcImljb25cIl07XHJcbiAgICAgICAgdGhpcy50b19hcHBpZCA9IERhdGFbXCJ0b19hcHBpZFwiXTtcclxuICAgICAgICB0aGlzLnRvZ2FtZV9uYW1lID0gRGF0YVtcInRvZ2FtZV9uYW1lXCJdO1xyXG4gICAgICAgIHRoaXMuanVtcF9wYXRoID0gRGF0YVtcImp1bXBfcGF0aFwiXTtcclxuICAgICAgICB0aGlzLmp1bXBfdHlwZSA9IERhdGFbXCJqdW1wX3R5cGVcIl07XHJcbiAgICAgICAgdGhpcy5wYW5lbCA9IERhdGFbXCJwYW5lbFwiXTtcclxuICAgICAgICB0aGlzLnFyY29kZSA9IERhdGFbXCJxcmNvZGVcIl07XHJcbiAgICB9XHJcbiAgICBpY29uOnN0cmluZztcclxuICAgIHRvX2FwcGlkOnN0cmluZztcclxuICAgIHRvZ2FtZV9uYW1lOnN0cmluZztcclxuICAgIGp1bXBfcGF0aDpzdHJpbmc7XHJcbiAgICBqdW1wX3R5cGU6bnVtYmVyO1xyXG4gICAgcGFuZWw6bnVtYmVyO1xyXG4gICAgcXJjb2RlOnN0cmluZztcclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY29tbWVuZFZpZXdcclxue1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgXHJcbiAgICAgICAgXHJcbiAgICAgfVxyXG59IiwiaW1wb3J0IHtQYW5lbENoaWxkQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2xcIjtcclxuaW1wb3J0IHsgUmVjb21tZW5kSXRlbSwgUmVjb21tZW5kIH0gZnJvbSBcIi4vUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgQ3BhSXRlbSBmcm9tIFwiLi9DcGFJdGVtXCI7XHJcbmltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuLy8gaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi90dGFkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGl3YW50dWlqaWFuVmlldyBleHRlbmRzIFBhbmVsQ2hpbGRDb250cm9sIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuICAgIFxyXG4gICAgbGlzdF8wOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgcHJpdmF0ZSBfbm93bGlzdDpSZWNvbW1lbmRJdGVtW107XHJcbiAgICBwcml2YXRlIF9pc1N0YXJ0OmJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9pc2Nhbm1vdmU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNkb3duOmJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcigpOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtcmVuZGVybGlzdCxudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5fbm93bGlzdCA9IFJlY29tbWVuZC5qaWVzdWFuRGF0YTtcclxuICAgICAgICBpZiggdGhpcy5fbm93bGlzdC5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdF8wLm51bUl0ZW1zID0gdGhpcy5fbm93bGlzdC5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7aSA8IHRoaXMuX25vd2xpc3QubGVuZ3RoO2krKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5faXNTdGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzY2FubW92ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfRE9XTix0aGlzLHRoaXMuZG93bmNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5saXN0XzAsTGF5YS5FdmVudC5NT1VTRV9VUCx0aGlzLHRoaXMudXBjbGljayApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubGlzdF8wLExheWEuRXZlbnQuTU9VU0VfT1VULHRoaXMsdGhpcy51cGNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkb3duY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkb3duID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLnRpbWVyLmNsZWFyKCB0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcblxyXG4gICAgICAgIC8vIHR0YWQuQ3JlYXRlTW9yZUdhbWVCdG4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRpbWVvdXRDYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9pc2Nhbm1vdmUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5faXNkb3duIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzZG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IHRoaXMubGlzdF8wLnNjcm9sbFBhbmUucGVyY1k7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSggMjAwMCx0aGlzLHRoaXMudGltZW91dENhbGxiYWNrICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXRlbXJlbmRlcmxpc3QoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93bGlzdC5sZW5ndGggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5zaG93RGF0YSggdGhpcy5fbm93bGlzdFtpbmRleF0sdHJ1ZSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfZmx1c2h0aW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGRpcjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd3ZhbHVlOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzU3RhcnQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUgJiYgdGhpcy5fbm93bGlzdCAmJiB0aGlzLl9ub3dsaXN0Lmxlbmd0aCA+IDAgJiYgdGhpcy5faXNjYW5tb3ZlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuZGlyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSArPSAwLjAwMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93dmFsdWUgPj0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3d2YWx1ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlIC09IDAuMDAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9ub3d2YWx1ZSA8PSAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vd3ZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdF8wLnNjcm9sbFBhbmUuc2V0UGVyY1koIHRoaXMuX25vd3ZhbHVlICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNjYW5tb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIFxyXG59IiwiaW1wb3J0IENwYUl0ZW0gZnJvbSBcIi4vQ3BhSXRlbVwiO1xyXG5pbXBvcnQgeyBSZWNvbW1lbmRJdGVtLCBSZWNvbW1lbmQgfSBmcm9tIFwiLi9SZWNvbW1lbmRWaWV3XCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGFuZWxCYXNlQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHVpamlhblZpZXcgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiVHVpamlhblZpZXdcIjtcclxuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgbGlzdF8xOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgbGlzdF8yOmZhaXJ5Z3VpLkdMaXN0O1xyXG4gICAgcHJpdmF0ZSBfbm93bGlzdDE6UmVjb21tZW5kSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBfbm93bGlzdDI6UmVjb21tZW5kSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBtb3JlOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwidHVpamlhblZpZXdcIiApOyBcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubGlzdF8xLnNldFZpcnR1YWwoKTtcclxuICAgICAgICB0aGlzLmxpc3RfMS5pdGVtUmVuZGVyZXIgPSBMYXlhLkhhbmRsZXIuY3JlYXRlKCB0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QxLG51bGwsZmFsc2UgKTtcclxuICAgICAgICB0aGlzLmxpc3RfMi5zZXRWaXJ0dWFsKCk7XHJcbiAgICAgICAgdGhpcy5saXN0XzIuaXRlbVJlbmRlcmVyID0gTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLHRoaXMuaXRlbXJlbmRlcmxpc3QyLG51bGwsZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLl9ub3dsaXN0MSA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLl9ub3dsaXN0MiA9IFJlY29tbWVuZC5nZHl4RGF0YTtcclxuICAgICAgICB0aGlzLmxpc3RfMS5udW1JdGVtcyA9IDc7XHJcbiAgICAgICAgdGhpcy5saXN0XzIubnVtSXRlbXMgPSB0aGlzLl9ub3dsaXN0Mi5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl9jbG9zZSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5tb3JlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLkp1bXBBcHAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGl0ZW1yZW5kZXJsaXN0MSggaW5kZXg6bnVtYmVyLGl0ZW06Q3BhSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaW5kZXggPCA3IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuX25vd2xpc3QxW2luZGV4XSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBpdGVtcmVuZGVybGlzdDIoIGluZGV4Om51bWJlcixpdGVtOkNwYUl0ZW0gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGluZGV4IDwgdGhpcy5fbm93bGlzdDIubGVuZ3RoIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2hvd0RhdGEoIHRoaXMuX25vd2xpc3QyW2luZGV4XSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uY2xvc2VmdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIFR1aWppYW5WaWV3ICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/pmo/mnLrot7PovazmuLjmiI9cclxuICAgIHByaXZhdGUgSnVtcEFwcCgpOnZvaWR7XHJcbiAgICAgICAgbGV0IHJhbiA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMCx0aGlzLl9ub3dsaXN0MS5sZW5ndGgtMSk7XHJcbiAgICAgICAgRllIRF9TZGsuU2hvd0h1VHVpSnVtcCh0aGlzLl9ub3dsaXN0MVtyYW5dLGZhbHNlKTtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBUaW1lVXRpbHMge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pyIL+aXpSDlsI/ml7Y65YiG6ZKfXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0RGF0YSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgKiAxMDAwKTtcclxuICAgICAgICBzdHIgPSB0aGlzLmdldFR3byhkYXRlLmdldE1vbnRoKCkgKyAxKSArIFwiL1wiICsgdGhpcy5nZXRUd28oZGF0ZS5nZXREYXRlKCkpICsgXCIgXCIgKyB0aGlzLmdldFR3byhkYXRlLmdldEhvdXJzKCkpICsgXCI6XCIgKyB0aGlzLmdldFR3byhkYXRlLmdldE1pbnV0ZXMoKSk7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaciC/ml6VcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBmb3JtYXREYXRhMSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgKiAxMDAwKTtcclxuICAgICAgICBzdHIgPSAoZGF0ZS5nZXRNb250aCgpICsgMSkgKyBcIuaciFwiICsgZGF0ZS5nZXREYXRlKCkgKyBcIuaXpVwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlubTmnIjml6VcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBmb3JtYXRZZWFyTW9udGhEYXRlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgdmFyIGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSAqIDEwMDApO1xyXG4gICAgICAgIHN0ciA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiLlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpICsgXCIuXCIgKyBkYXRlLmdldERhdGUoKTtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5bm0LeaciC3ml6VcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBmb3JtYXRZZWFyTW9udGhEYXRlMSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgKiAxMDAwKTtcclxuICAgICAgICB2YXIgbW9udGg6IHN0cmluZyA9IChkYXRlLmdldE1vbnRoKCkgKyAxKSA+PSAxMCA/IChkYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpIDogXCIwXCIgKyAoZGF0ZS5nZXRNb250aCgpICsgMSk7XHJcbiAgICAgICAgdmFyIGRhdGVzOiBzdHJpbmcgPSBkYXRlLmdldERhdGUoKSA+PSAxMCA/IGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkgOiBcIjBcIiArIGRhdGUuZ2V0RGF0ZSgpO1xyXG4gICAgICAgIHN0ciA9IGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRhdGVzO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyAgTFhhbmRKWFRpbWVUeXBlKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjDnp5JcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIDwgNjApIHtcclxuICAgICAgICAgICAgc3RyID0gTWF0aC5mbG9vcih2YWx1ZSkgKyBcIuenklwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPCA2MCAqIDYwKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCkgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBob3VyOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGhvdXIgPSBNYXRoLmZsb29yKHZhbHVlIC8gNjAgLyA2MCk7XHJcbiAgICAgICAgICAgIHN0ciA9IGhvdXIgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgICAgICBzdHIgKz0gTWF0aC5mbG9vcigodmFsdWUgLSBob3VyICogNjAgKiA2MCkgLyA2MCkgKyBcIuWIhumSn1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5qC85byP5YyW5pe26Ze0XHJcbiAgICAgKiBAcGFyYW0gdGltZSDnp5JcclxuICAgICAqIEByZXR1cm4g6L+U5ZueMjQ6NTk6NTlcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBmb3JtYXRUaW1lKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICAgIGlmKCBob3VycyA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3RyICs9IGhvdXJzID49IDEwID8gKGhvdXJzICsgXCI6XCIpIDogKFwiMFwiICsgaG91cnMgKyBcIjpcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgc3RyICs9IG1pbnV0ZXMgPj0gMTAgPyAobWludXRlcyArIFwiOlwiKSA6IChcIjBcIiArIG1pbnV0ZXMgKyBcIjpcIik7XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgPj0gMTAgPyAoc2Vjb25kICsgXCJcIikgOiAoXCIwXCIgKyBzZWNvbmQpO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54yNOWwj+aXtjU55YiGNTnnp5IgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0VGltZTEodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIbpkp9cIjtcclxuICAgICAgICB2YXIgc2Vjb25kOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA2MCk7XHJcbiAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOagvOW8j+WMluaXtumXtFxyXG4gICAgICogQHBhcmFtIHRpbWUg56eSXHJcbiAgICAgKiBAcmV0dXJuIOi/lOWbnjHlsI/ml7YyNOWIhjEw56eSXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0VGltZTUodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gMzYwMCk7XHJcbiAgICAgICAgaWYoIGhvdXJzID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgIGlmKG1pbnV0ZXM+MClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIZcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgNjApO1xyXG4gICAgICAgIHN0ciArPSBzZWNvbmQgKyBcIuenklwiO1xyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmoLzlvI/ljJbml7bpl7RcclxuICAgICAqIEBwYXJhbSB0aW1lIOenklxyXG4gICAgICogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhjU556eSXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0VGltZTIodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcclxuICAgICAgICBpZihkYXk+MCl7XHJcbiAgICAgICAgICAgIHN0ciArPSBkYXkgKyBcIuWkqVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xyXG4gICAgICAgIGlmKGhvdXJzPjApe1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgIGlmKG1pbnV0ZXM+MCl7XHJcbiAgICAgICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIbpkp9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHNlY29uZDogbnVtYmVyID0gTWF0aC5jZWlsKHRpbWUgJSA2MCk7XHJcbiAgICAgICAgc3RyICs9IHNlY29uZCArIFwi56eSXCI7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOagvOW8j+WMluaXtumXtFxyXG4gICAgICogQHBhcmFtIHRpbWUg56eSXHJcbiAgICAgKiBAcmV0dXJuIOi/lOWbnjHlpKkyNOWwj+aXtu+8iCDlj6rkv53nlZnkuKTkuKog77yJXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyAgZm9ybWF0VGltZTYodGltZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgc3RyOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcclxuICAgICAgICBpZiAoZGF5PjApe1xyXG4gICAgICAgICAgICBzdHIgKz0gZGF5ICsgXCLlpKlcIjtcclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDApIC8gMzYwMCk7XHJcbiAgICAgICAgaWYgKGhvdXJzPjApe1xyXG4gICAgICAgICAgICBzdHIgKz0gaG91cnMgKyBcIuWwj+aXtlwiO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW5kZXggPCAyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICAgICAgaWYobWludXRlcz4wKXtcclxuICAgICAgICAgICAgICAgIHN0ciArPSBtaW51dGVzICsgXCLliIZcIjtcclxuICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IE1hdGguY2VpbCh0aW1lICUgNjApO1xyXG4gICAgICAgICAgICBzdHIgKz0gc2Vjb25kICsgXCLnp5JcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICog5qC85byP5YyW5pe26Ze0XHJcbiAqIEBwYXJhbSB0aW1lIOenklxyXG4gKiBAcmV0dXJuIOi/lOWbnjHlpKkyNOWwj+aXtjU55YiGXHJcbiAqL1xyXG5zdGF0aWMgIGZvcm1hdFRpbWUzKHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICB2YXIgZGF5OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgLyA4NjQwMCk7XHJcbiAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XHJcbiAgICAgICAgdmFyIGhvdXJzOiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSA4NjQwMCAvIDM2MDApO1xyXG4gICAgICAgIHN0ciArPSBob3VycyArIFwi5bCP5pe2XCI7XHJcblxyXG4gICAgICAgIHZhciBtaW51dGVzOiBudW1iZXIgPSBNYXRoLmZsb29yKCh0aW1lICUgODY0MDAgJSAzNjAwKSAvIDYwKTtcclxuICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiGXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiog5qC85byP5YyW5pe26Ze0XHJcbiogQHBhcmFtIHRpbWUg56eSXHJcbiogQHJldHVybiDov5Tlm54x5aSpMjTlsI/ml7Y1OeWIhlxyXG4qL1xyXG5zdGF0aWMgIGZvcm1hdFRpbWU0KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0cjogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBpZiAodGltZSA+IDg2NDAwKSB7XHJcbiAgICAgICAgICAgIHZhciBkYXk6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAvIDg2NDAwKTtcclxuICAgICAgICAgICAgc3RyICs9IGRheSArIFwi5aSpXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aW1lID4gMzYwMCkge1xyXG4gICAgICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IE1hdGguZmxvb3IodGltZSAlIDg2NDAwIC8gMzYwMCk7XHJcbiAgICAgICAgICAgIHN0ciArPSBob3VycyArIFwi5bCP5pe2XCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aW1lID4gNjApIHtcclxuICAgICAgICAgICAgdmFyIG1pbnV0ZXM6IG51bWJlciA9IE1hdGguZmxvb3IoKHRpbWUgJSA4NjQwMCAlIDM2MDApIC8gNjApO1xyXG4gICAgICAgICAgICBzdHIgKz0gbWludXRlcyArIFwi5YiG6ZKfXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgICAgICAvKipcclxuKiDmoLzlvI/ljJbml7bpl7RcclxuKiBAcGFyYW0gdGltZSDnp5JcclxuKiBAcmV0dXJuIOi/lOWbnjHlpKkyNOWwj+aXtjU55YiGXHJcbiovXHJcbnN0YXRpYyAgZm9ybWF0VGltZTRBcnIodGltZTogbnVtYmVyKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgICAgdmFyIGFyclRpbWU6QXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgLy8gaWYgKHRpbWUgPj0gODY0MDApIHtcclxuICAgICAgICAvLyAgICAgdmFyIGRheTogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lIC8gODY0MDApO1xyXG4gICAgICAgIC8vICAgICBhcnJUaW1lLnVuc2hpZnQoU3RyaW5nKGRheSkpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBpZiAodGltZSA+PSAzNjAwKSB7XHJcbiAgICAgICAgICAgIHZhciBob3VyczogbnVtYmVyID0gTWF0aC5mbG9vcih0aW1lICUgODY0MDAgLyAzNjAwKTtcclxuICAgICAgICAgICAgYXJyVGltZS51bnNoaWZ0KFN0cmluZyhob3VycykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGltZSA+PSA2MCkge1xyXG4gICAgICAgICAgICB2YXIgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAlIDg2NDAwICUgMzYwMCkgLyA2MCk7XHJcbiAgICAgICAgICAgIGFyclRpbWUudW5zaGlmdChTdHJpbmcobWludXRlcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFyclRpbWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyAgZ2V0VHdvKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IFwiMFwiICsgc3RyO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pel5pyf6L2s5pe26Ze05oizXHJcbiAgICAgKiBAcGFyYW0gc3RyIDIwMTgtMS0xIFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIGRhdGV0b1RpbWUoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBEYXRlLnBhcnNlKHN0cikgLyAxMDAwO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgVGltZXJTZXJ2aWNlIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlRpbWVyU2VydmljZTtcclxuICAgIHByaXZhdGUgX3RpbWVTY2FsZTpudW1iZXIgPSAxO1xyXG5cclxuICAgIHByaXZhdGUgX3Vuc2NhbGFibGVMaXN0OkFycmF5PFRpbWVyQ29udHJvbD4gPSBbXTtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlRpbWVyU2VydmljZVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBUaW1lclNlcnZpY2UuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lclNlcnZpY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFRpbWVyU2VydmljZS5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoIDEsIHRoaXMsIHRoaXMub25UaW1lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0b3AoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcywgdGhpcy5vblRpbWVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlY292ZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5mcmFtZUxvb3AoIDEsIHRoaXMsIHRoaXMub25UaW1lciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25UaW1lcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvcihpPTA7IGk8dGhpcy5fdW5zY2FsYWJsZUxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91bnNjYWxhYmxlTGlzdFtpXS51cGRhdGUoTGF5YS50aW1lci5kZWx0YSAqIHRoaXMuX3RpbWVTY2FsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNVcGRhdGFUYXJnZXQoIHVwZGF0ZVRhcmdldDpUaW1lckNvbnRyb2wgKTpCb29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlcjtcclxuICAgICAgICBpbmRleCA9IHRoaXMuX3Vuc2NhbGFibGVMaXN0LmluZGV4T2YodXBkYXRlVGFyZ2V0KTtcclxuICAgICAgICBpZiggaW5kZXggIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkVXBkYXRlVGFyZ2V0KHVwZGF0ZVRhcmdldDpUaW1lckNvbnRyb2wpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyO1xyXG4gICAgICAgIGluZGV4ID0gdGhpcy5fdW5zY2FsYWJsZUxpc3QuaW5kZXhPZih1cGRhdGVUYXJnZXQpO1xyXG4gICAgICAgIGlmKGluZGV4PT0tMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Vuc2NhbGFibGVMaXN0LnB1c2godXBkYXRlVGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZVVwZGF0ZVRhcmdldCh1cGRhdGVUYXJnZXQ6VGltZXJDb250cm9sKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGluZGV4Om51bWJlciA9IHRoaXMuX3Vuc2NhbGFibGVMaXN0LmluZGV4T2YodXBkYXRlVGFyZ2V0KTtcclxuICAgICAgICBpZihpbmRleCE9LTEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91bnNjYWxhYmxlTGlzdC5zcGxpY2UoaW5kZXgsMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgdGltZVNjYWxlKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVTY2FsZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldCB0aW1lU2NhbGUodmFsdWU6bnVtYmVyKVxyXG4gICAge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgaXNOYU4odmFsdWUpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl90aW1lU2NhbGUgPSB2YWx1ZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcclxuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGltZXNUYW1wZXIgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcclxue1xyXG5cdHB1YmxpYyBsYXN0Z2FtZVRpbWU6bnVtYmVyID0gMDtcclxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSBcclxuXHR7XHJcblxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzdGF0aWMgaW5zOiBUaW1lc1RhbXBlcjtcclxuXHJcblx0cHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogVGltZXNUYW1wZXIge1xyXG4gICAgICAgIGlmIChUaW1lc1RhbXBlci5pbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVzVGFtcGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBUaW1lc1RhbXBlci5pbnM7XHJcbiAgICB9XHJcblxyXG5cdHB1YmxpYyBpbml0KCApOnZvaWRcclxuXHR7XHJcblx0XHR0aGlzLmxhc3RnYW1lVGltZSA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuZ2V0bnVtKCBVc2VyRGF0YUluZm8ubGFzdHRpbWUgKTtcclxuXHRcdExheWEudGltZXIuZnJhbWVMb29wKDEsIHRoaXMsIHRoaXMudXBkYXRlICk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiDlkIzmraXmnI3liqHlmajml7bpl7Qo56eSKVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3NlcnZlclRpbWU6IG51bWJlciA9IDA7XHJcblxyXG5cdHByaXZhdGUgaXNjYW46Ym9vbGVhbiA9IGZhbHNlO1xyXG5cdHByaXZhdGUgX29ubGluZWRpc3RpbWU6bnVtYmVyID0gMDtcclxuXHRcclxuXHRwdWJsaWMgdXBkYXRlU2VydmljZVRpbWUoc2VydmVyVGltZTogbnVtYmVyKTogdm9pZCB7XHJcblx0XHR0aGlzLl9zZXJ2ZXJUaW1lID0gTnVtYmVyKHNlcnZlclRpbWUpO1xyXG5cdFx0dGhpcy5pc2NhbiA9IHRydWU7XHJcblx0XHR0aGlzLl9vbmxpbmVkaXN0aW1lID0gdGhpcy5fc2VydmVyVGltZTtcclxuXHRcdExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ubGFzdHRpbWUsdGhpcy5fc2VydmVyVGltZS50b1N0cmluZygpICk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcblx0cHJpdmF0ZSBfb25saW5ldGltZTpudW1iZXIgPSAwO1xyXG5cdHB1YmxpYyB1cGRhdGUoKTogdm9pZCBcclxuXHR7XHJcblx0XHRpZiggdGhpcy5pc2NhbiApXHJcblx0XHR7XHJcblx0XHRcdHRoaXMuX3RpbWUgKz0gTGF5YS50aW1lci5kZWx0YTtcclxuXHRcdFx0dGhpcy5fb25saW5ldGltZSArPSBMYXlhLnRpbWVyLmRlbHRhO1xyXG5cdFx0XHR0aGlzLl9zZXJ2ZXJUaW1lICs9IExheWEudGltZXIuZGVsdGEgLyAxMDAwO1xyXG5cdFx0XHRpZiggdGhpcy5fdGltZSA+PSAzMDAwMCApXHJcblx0XHRcdHtcclxuXHRcdFx0XHR0aGlzLl90aW1lID0gMDtcclxuXHRcdFx0XHRMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmxhc3R0aW1lLHRoaXMuX3NlcnZlclRpbWUudG9TdHJpbmcoKSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCB0aGlzLl9vbmxpbmV0aW1lID49IDkwMDAwIClcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHRoaXMuX29ubGluZXRpbWUgPSAwO1xyXG5cdFx0XHRcdHRoaXMuc2VuZG9ubGluZVRvbmdqaSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc2VuZG9ubGluZVRvbmdqaSgpOnZvaWRcclxuXHR7XHJcblx0XHR2YXIgZGlzdGltZTpudW1iZXIgPSB0aGlzLnNlcnZlclRpbWUgLSB0aGlzLl9vbmxpbmVkaXN0aW1lO1xyXG5cdFx0aWYoIGRpc3RpbWUgPiAwIClcclxuXHRcdHtcclxuXHRcdFx0dGhpcy5fb25saW5lZGlzdGltZSA9IHRoaXMuc2VydmVyVGltZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIOacjeWKoeWZqOaXtumXtCAoIOenkiApIFxyXG5cdCAqIEByZXR1cm4gXHJcblx0ICogXHJcblx0ICovXHJcblx0cHVibGljIGdldCBzZXJ2ZXJUaW1lKCk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gdGhpcy5fc2VydmVyVGltZTtcclxuXHR9XHJcblxyXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7Vmlld0FjdGlvbn0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcclxuaW1wb3J0IHtHYW1lU3RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9HYW1lU3RhdGVDb250cm9sXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHtBZ2VuY3lVc2VyTWVzc2FnZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge0FnZW5jeUluR2FtZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lJbkdhbWVcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBQUk9UT0NPTFMsIE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL05ldHdvcmtNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcclxuaW1wb3J0IHtHdWFuZ0dhb30gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XHJcbmltcG9ydCB7IEdhbWVTdGF0ZSB9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSBcIi4uL0dhbWUvUGxheWVyXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XHJcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuLi9XWFNESy9TaGFyZVV0aWxcIjtcclxuaW1wb3J0IHsgUmVjb3JkTWFuYWdlciB9IGZyb20gXCIuLi9XWFNESy9SZWNvcmRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xyXG4vLyBpbXBvcnQgQ2hvdXRpUGFuVmlldyBmcm9tIFwiLi4vUHVzaC9DaG91dGlQYW5WaWV3XCI7XHJcbmV4cG9ydCBjbGFzcyBDb21wbGV0ZVBhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkNvbXBsZXRlUGFuZWxcIjtcclxuXHJcbiAgICBCdG5Cb3g6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgdHh0X2dvbGQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIGJ0bl8wOmZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICBidG5fMTpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgYnRuXzI6ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIHRpbWVudW06ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIFRpYW5KaWFBbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuICAgIEJhdHRsZUJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgIHRpYW5qaWE6ZmFpcnlndWkuR0xvYWRlcjtcclxuXHJcbiAgICAvL+WIhuS6q+eVjOmdolxyXG4gICAgU2hhcmVWaWRlbzpmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgU2hhcmVWaWRlb0J0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgamllc3VhbmJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgc2hhcmVfZ29sZG51bTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG5cclxuICAgIC8v5qGGXHJcbiAgICBrdWFuZzpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgLy/lr7nlj7dcclxuICAgIGR1aWhhbzpmYWlyeWd1aS5HSW1hZ2U7XHJcblxyXG5cclxuICAgIGdldGdvbGQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2dhbWVQcm94eTpBZ2VuY3lJbkdhbWU7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCBnb2xkOm51bWJlciApIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJnYW1lcmVzdWx0XCIsZmFsc2UsVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsMSApOyBcclxuICAgICAgICB0aGlzLmdldGdvbGQgPSBnb2xkO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGxvYWRTY2VuZSgpOnZvaWQge1xyXG5cdFx0TGF5YS5TY2VuZTNELmxvYWQoXCJyZXMvdGhyZWVEaW1lbi9zY2VuZS9QYXJ0aWNsZVNjZW5lL0V4YW1wbGVfMDEubHNcIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBmdW5jdGlvbihzY2VuZTpMYXlhLlNjZW5lM0QpIHtcclxuXHRcdFx0dGhpcy5zY2VuZSA9IExheWEuc3RhZ2UuYWRkQ2hpbGRBdChzY2VuZSwgMCk7XHJcblx0XHRcdHZhciBjYW1lcmE6TGF5YS5DYW1lcmEgPSB0aGlzLnNjZW5lLmFkZENoaWxkKG5ldyBMYXlhLkNhbWVyYSgwLCAwLjEsIDEwMCkpO1xyXG5cdFx0XHRjYW1lcmEudHJhbnNmb3JtLnRyYW5zbGF0ZShuZXcgTGF5YS5WZWN0b3IzKDAsIDEsIDApKTtcclxuXHRcdH0pKTtcclxuXHR9XHJcblx0cHJpdmF0ZSBnYXJiYWdlQ29sbGVjdGlvbigpOnZvaWQge1xyXG5cdFx0dGhpcy5zY2VuZS5kZXN0cm95KCk7Ly/plIDmr4HlnLrmma9cclxuXHRcdHRoaXMuc2NlbmUgPSBudWxsO1xyXG5cdFx0TGF5YS5SZXNvdXJjZS5kZXN0cm95VW51c2VkUmVzb3VyY2VzKCk7Ly/plIDmr4Hml6DnlKjotYTmupAo5rKh5pyJ6KKr5Zy65pmv5qCR5byV55SoLOW5tuS4lOayoeacieWKoOi1hOa6kOmUgeeahClcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwcml2YXRlIGJ0bjFjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZih0aGlzLmR1aWhhby52aXNpYmxlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucGxheXZpZGVvY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQgKTtcclxuICAgICAgICAgICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLkxldmVsVXAoICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID09IDEpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIHRoaXMuZ2V0Z29sZCApO1xyXG4gICAgICAgICAgICB0aGlzLl9nYW1lUHJveHkucmV0dXJubWFpbnZpZXcoICk7XHJcbiAgICAgICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID09IDIpe1xyXG4gICAgICAgICAgICAvLyBTaGFyZVV0aWwuc2hhcmVJbWFnZShcIuWIhuS6q+Wkjea0uy0tLS1cIix0aGlzLnNoYXJlcmV2aXZlLFwiMVwiKVxyXG4gICAgICAgICAgICB0aGlzLnNoYXJlcmV2aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbXBsZXRlKCk6IHZvaWQge1xyXG4gICAgICAgIExheWEuU3ByaXRlM0QubG9hZChcInJlcy90aHJlZURpbWVuL3NraW5Nb2RlbC9MYXlhTW9ua2V5L0xheWFNb25rZXkubGhcIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBmdW5jdGlvbihsYXlhTW9ua2V5M0Q6TGF5YS5TcHJpdGUzRCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5YU1vbmtleTNEID0gbGF5YU1vbmtleTNEO1xyXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmFkZENoaWxkKGxheWFNb25rZXkzRCk7XHJcbiAgICAgICAgICAgIHRoaXMubGF5YU1vbmtleTJEID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5JbWFnZShcInJlcy90aHJlZURpbWVuL21vbmtleS5wbmdcIikpIGFzIExheWEuSW1hZ2U7XHJcbiAgICAgICAgICAgIExheWEudGltZXIuZnJhbWVMb29wKDEsIHRoaXMsIHRoaXMuYW5pbWF0ZSk7XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHNjZW5lOkxheWEuU2NlbmUzRDtcclxuICAgIHByaXZhdGUgY2FtZXJhOkxheWEuQ2FtZXJhO1xyXG4gICAgcHJpdmF0ZSBsYXlhTW9ua2V5M0Q6TGF5YS5TcHJpdGUzRDtcclxuICAgIHByaXZhdGUgbGF5YU1vbmtleTJEOkxheWEuSW1hZ2U7XHJcbiAgICBwcml2YXRlIF9wb3NpdGlvbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICBwcml2YXRlIF9vdXRQb3M6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBzY2FsZURlbHRhOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHNjYWxlOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoMC4xLDAuMSwwLjEpO1xyXG4gICAgcHJpdmF0ZSBhbmltYXRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uLnggPSBNYXRoLnNpbih0aGlzLnNjYWxlRGVsdGEgKz0gMC4wMSk7XHJcbiAgICAgICAgdGhpcy5sYXlhTW9ua2V5M0QudHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fcG9zaXRpb247XHJcbiAgICAgICAgdGhpcy5sYXlhTW9ua2V5M0QudHJhbnNmb3JtLnNjYWxlID0gdGhpcy5zY2FsZTtcclxuICAgICAgICAvL+i9rOaNouWdkOagh1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnZpZXdwb3J0LnByb2plY3QodGhpcy5sYXlhTW9ua2V5M0QudHJhbnNmb3JtLnBvc2l0aW9uLCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uVmlld01hdHJpeCwgdGhpcy5fb3V0UG9zKTtcclxuICAgICAgICAvL+i1i+WAvOe7mTJEXHJcbiAgICAgICAgdGhpcy5sYXlhTW9ua2V5MkQucG9zKHRoaXMuX291dFBvcy54IC8gTGF5YS5zdGFnZS5jbGllbnRTY2FsZVgsIHRoaXMuX291dFBvcy55IC8gTGF5YS5zdGFnZS5jbGllbnRTY2FsZVkpO1xyXG4gICAgfVxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIFxyXG5cclxuICAgIHByaXZhdGUgYnRuMGNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucGxheXZpZGVvY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLnBsYXlWaWRlbyggXCJcIix0aGlzLHRoaXMucGxheXZpZGVvY2FsbGJhY2sgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAxKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQgKTtcclxuICAgICAgICAgICAgdGhpcy5fZ2FtZVByb3h5LnJldHVybm1haW52aWV3KCApO1xyXG4gICAgICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZih0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAyKXtcclxuICAgICAgICAgICAgdGhpcy5jb3VudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UucGxheVZpZGVvKFwiXCIsdGhpcyx0aGlzLnBsYXl2aWRlb3Jldml2ZSk7XHJcbiAgICAgICAgICAgIHRoaXMucGxheXZpZGVvcmV2aXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKueci+inhumikeWkjea0u+aIkOWKnyAqL1xyXG4gICAgcHJpdmF0ZSBwbGF5dmlkZW9yZXZpdmUoKTp2b2lke1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChDaG91dGlQYW5WaWV3KTtcclxuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1IC0tO1xyXG4gICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIENvbXBsZXRlUGFuZWwgKTtcclxuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5pc2RpZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9pc2Nhbk1vdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gUGxheWVyLkluc3RhbmNlLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XHJcbiAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2Uubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgaWYgKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lID09IFwiXCIgfHwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUgPT0gXCJcIikgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIueOqeWutuS9jee9ri0tLS1cIixQbGF5ZXIuSW5zdGFuY2UuX2luaXRQb3NWZWMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi546p5a626YCf5bqmX21vdmVWZWNcIixQbGF5ZXIuSW5zdGFuY2UuX21vdmVWZWMpO1xyXG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fdHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMygwLDEsMyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlvZPliY3lnLrmma/lkI3lrZctLS1cIixQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlvZPliY3lu7rnrZHlkI3lrZctLS1cIixQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlu7rnrZHniankvY3nva4tLS0tXCIsUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpKTtcclxuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkKjI7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxuICAgIC8qKuWIhuS6q+Wkjea0u+aIkOWKnyAqL1xyXG4gICAgcHJpdmF0ZSBzaGFyZXJldml2ZSgpe1xyXG4gICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuU2hhcmVWaWRlbygoaXNMb2FkKT0+e1xyXG4gICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuUmVjb3JkU3RhcnQoKTtcclxuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZS5mdWh1b2Npc2h1IC0tO1xyXG4gICAgICAgICAgICAgICAgLy8gR2FtZVN0YXRlLnJlY29yZHNjcmVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBDb21wbGV0ZVBhbmVsICk7XHJcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5faXNjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIC8vIFBsYXllci5JbnN0YW5jZS5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgIGlmIChQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSA9PSBcIlwiIHx8IFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lID09IFwiXCIpICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnjqnlrrbkvY3nva4tLS0tXCIsUGxheWVyLkluc3RhbmNlLl9pbml0UG9zVmVjKTtcclxuICAgICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoMCwxLDMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5Zy65pmv5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5b2T5YmN5bu6562R5ZCN5a2XLS0tXCIsUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bu6562R54mp5L2N572uLS0tLVwiLFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKFBsYXllci5JbnN0YW5jZS5fbm93c2NlbmVuYW1lLCBQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSkuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKFwi5aSN5rS75Yqg6YCf5oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIFBsYXllci5JbnN0YW5jZS5fc3BlZWRNb3ZlVjMueiA9IC1QbGF5ZXIuSW5zdGFuY2UuX1JvbGVEYXRhLm1vdmVzcGVlZCoyO1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEudGltZXIub25jZSgzMDAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSB0cnVlOyBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gaWYoX3N1Y2Nlc3Mpe1xyXG4gICAgICAgIC8vICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoQ2hvdXRpUGFuVmlldyk7XHJcbiAgICAgICAgLy8gICAgICAgICBHYW1lU3RhdGUuZnVodW9jaXNodSAtLTtcclxuICAgICAgICAvLyAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBDb21wbGV0ZVBhbmVsICk7XHJcbiAgICAgICAgLy8gICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSBmYWxzZTtcclxuICAgICAgICAvLyAgICAgICAgIFBsYXllci5JbnN0YW5jZS5faXNjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICAvLyAgICAgICAgIC8vIFBsYXllci5JbnN0YW5jZS5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgIC8vICAgICAgICAgUGxheWVyLkluc3RhbmNlLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSA9PSBcIlwiIHx8IFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lID09IFwiXCIpICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCLnjqnlrrbkvY3nva4tLS0tXCIsUGxheWVyLkluc3RhbmNlLl9pbml0UG9zVmVjKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFBsYXllci5JbnN0YW5jZS5faW5pdFBvc1ZlYy5jbG9uZSgpXHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICBlbHNlICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCLlvZPliY3lnLrmma/lkI3lrZctLS1cIixQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCLlvZPliY3lu7rnrZHlkI3lrZctLS1cIixQbGF5ZXIuSW5zdGFuY2UuX25vd2J1aWxkbmFtZSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc29sZS5sb2coXCLlu7rnrZHniankvY3nva4tLS0tXCIsUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZShQbGF5ZXIuSW5zdGFuY2UuX25vd3NjZW5lbmFtZSwgUGxheWVyLkluc3RhbmNlLl9ub3didWlsZG5hbWUpKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoUGxheWVyLkluc3RhbmNlLl9ub3dzY2VuZW5hbWUsIFBsYXllci5JbnN0YW5jZS5fbm93YnVpbGRuYW1lKS5jbG9uZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIC8vIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLlpI3mtLvliqDpgJ/miJDlip9cIik7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgUGxheWVyLkluc3RhbmNlLl9zcGVlZE1vdmVWMy56ID0gLVBsYXllci5JbnN0YW5jZS5fUm9sZURhdGEubW92ZXNwZWVkKjI7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDMwMDAsdGhpcywoKT0+e1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBQbGF5ZXIuSW5zdGFuY2UuX3NwZWVkTW92ZVYzLnogPSAtUGxheWVyLkluc3RhbmNlLl9Sb2xlRGF0YS5tb3Zlc3BlZWQ7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSlcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZXtcclxuICAgICAgICAvLyAgICAgdGhpcy5jb3VudCA9IHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGxheXZpZGVvY2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQqMyApO1xyXG4gICAgICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuTGV2ZWxVcCggICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9nYW1lUHJveHkucmV0dXJubWFpbnZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgICAgICAvLyB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XHJcbiAgICAgICAgLy8gICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgLy8gICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIHRoaXMuZ2V0Z29sZCozICk7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl9nYW1lUHJveHkucmV0dXJubWFpbnZpZXcodHJ1ZSk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KSlcclxuICAgIH1cclxuXHJcbiAgICAvL+WIhuS6q+inhumikVxyXG4gICAgcHJpdmF0ZSBTaGFyZVZpZGVvQ2FsbEJhY2soKXtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlNoYXJlVmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgICAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCB0aGlzLmdldGdvbGQqMyApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TaGFyZVZpZGVvLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG5cclxuICAgIC8v54K55Ye75Yu+6YCJ5qGGXHJcbiAgICBDbGlja0t1YW5nKCl7XHJcbiAgICAgICAgaWYodGhpcy5kdWloYW8udmlzaWJsZSl7XHJcbiAgICAgICAgICAgIHRoaXMuZHVpaGFvLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5idG5fMS52aXNpYmxlID0gdGhpcy5kdWloYW8udmlzaWJsZTtcclxuICAgICAgICAgICAgdGhpcy5idG5fMi52aXNpYmxlID0gIXRoaXMuZHVpaGFvLnZpc2libGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuZHVpaGFvLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmJ0bl8xLnZpc2libGUgPSB0aGlzLmR1aWhhby52aXNpYmxlO1xyXG4gICAgICAgICAgICB0aGlzLmJ0bl8yLnZpc2libGUgPSAhdGhpcy5kdWloYW8udmlzaWJsZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMuQ291bnRUaW1lKTtcclxuICAgICAgICAvLyBMYXlhLnRpbWVyLmNsZWFyKHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IpO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLkNsZWFyKCk7XHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy50aWFuamlhLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLlRpYW5KaWFBbmkgPSB0aGlzLmdldFRyYW5zaXRpb25CeU5hbWUoXCJ0aWFuamlhYW5pXCIpO1xyXG4gICAgICAgIHRoaXMuVGlhbkppYUFuaS5zdG9wKCk7XHJcbiAgICAgICAgLy8gTGF5YS50aW1lci5sb29wKDIwMDAsdGhpcyx0aGlzLnBsYXlhbmltYXRvcik7XHJcbiAgICAgICAgdGhpcy5jb3VudCA9IHRydWU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fZ2FtZVByb3h5ID0gdGhpcy5nZXRQcm94eSggQWdlbmN5SW5HYW1lICk7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyQnlCYW1lKCBcImNfc3RhdGVcIiApO1xyXG4gICAgICAgIHRoaXMudHh0X2dvbGQudGV4dCA9IHRoaXMuZ2V0Z29sZC50b1N0cmluZygpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuZHVpaGFvID0gdGhpcy5rdWFuZy5nZXRDaGlsZEF0KDEpIGFzIGZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgICAgICB0aGlzLmR1aWhhby52aXNpYmxlID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5DaG9vc2U7XHJcbiAgICAgICAgdGhpcy5zaGFyZV9nb2xkbnVtID0gdGhpcy5TaGFyZVZpZGVvLmdldENoaWxkQXQoNCkgYXMgZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgICAgICB0aGlzLlNoYXJlVmlkZW9CdG4gPSB0aGlzLlNoYXJlVmlkZW8uZ2V0Q2hpbGRBdCgxKSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgICAgIHRoaXMuamllc3VhbmJ0biA9IHRoaXMuU2hhcmVWaWRlby5nZXRDaGlsZEF0KDIpIGFzIGZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICAgICAgdGhpcy5zaGFyZV9nb2xkbnVtLnRleHQgPSB0aGlzLmdldGdvbGQudG9TdHJpbmcoKTtcclxuICAgICAgICB0aGlzLmJ0bl8xLnZpc2libGUgPSB0aGlzLmR1aWhhby52aXNpYmxlO1xyXG4gICAgICAgIHRoaXMuYnRuXzIudmlzaWJsZSA9ICF0aGlzLmR1aWhhby52aXNpYmxlO1xyXG5cclxuICAgICAgICBpZihHYW1lU3RhdGUucmVjb3Jkc2NyZWUgKXtcclxuICAgICAgICAgICAgdGhpcy5CYXR0bGVCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuU2hvd0JhdHRsZUJ0bil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gIUdhbWVTdGF0ZS5yZWNvcmRzY3JlZTtcclxuICAgICAgICBpZighR2FtZVN0YXRlLmlzZGllKXsvL+eOqeWutuacquatu+S6oeeahOeKtuaAgVxyXG4gICAgICAgICAgICBpZiggR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIGlmKEdhbWVTdGF0ZS5mdWh1b2Npc2h1PjApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAyO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5sb29wKDEwMDAsdGhpcyx0aGlzLkNvdW50VGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9PSAwKXtcclxuICAgICAgICAgICAgdGhpcy5TaGFyZVZpZGVvLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmppZXN1YW5idG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjAwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICB0aGlzLmppZXN1YW5idG4udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuU2hhcmVWaWRlby52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEd1YW5nR2FvLkNoZWF0QmFubmVyKHRoaXMuYnRuXzEpO1xyXG4gICAgfVxyXG4gICAgcGxheWFuaW1hdG9yKCl7XHJcbiAgICAgICAgdGhpcy5UaWFuSmlhQW5pLnBsYXkobnVsbCwxKTtcclxuICAgIH1cclxuXHJcbiAgICBDbGlja0ppZVN1YW4oKXtcclxuICAgICAgICB0aGlzLlNoYXJlVmlkZW8udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fMCxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG4wY2xpY2sgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl8xLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bjFjbGljayApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuQmF0dGxlQnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNoYXJlQmF0dGxlKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl8yLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bjFjbGljayk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5rdWFuZyxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5DbGlja0t1YW5nKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLlNoYXJlVmlkZW9CdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2hhcmVWaWRlb0NhbGxCYWNrKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmppZXN1YW5idG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuQ2xpY2tKaWVTdWFuKTtcclxuICAgIH1cclxuXHJcbiAgICAgdGltZSA9IDk7XHJcbiAgICAgY291bnQgPSBmYWxzZTtcclxuICAgICBmdWh1byA9IGZhbHNlO1xyXG4gICAgIC8v5YCS6K6h5pe2XHJcbiAgICAgQ291bnRUaW1lKClcclxuICAgICB7XHJcbiAgICAgICAgIGlmKHRoaXMuY291bnQgJiYgdGhpcy50aW1lID4gMClcclxuICAgICAgICAge1xyXG4gICAgICAgICAgICAgdGhpcy50aW1lIC09IDE7XHJcbiAgICAgICAgICAgICB0aGlzLnRpbWVudW0udGV4dCA9IHRoaXMudGltZS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgaWYodGhpcy50aW1lIDwgMSlcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIExheWEudGltZXIuY2xlYXIodGhpcyx0aGlzLkNvdW50VGltZSk7XHJcbiAgICAgICAgICAgICAgICBHYW1lU3RhdGUuZnVodW9jaXNodS0tO1xyXG4gICAgICAgICAgICAgICAgLy8gTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMucGxheWFuaW1hdG9yKTtcclxuICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKENvbXBsZXRlUGFuZWwpO1xyXG4gICAgICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLmxvc2UgKTtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgIH1cclxuXHJcbiAgICAgLy/lvZXlsY/liIbkuqtcclxuICAgICBTaGFyZUJhdHRsZSgpe1xyXG4gICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlNoYXJlVmlkZW8oKGlzTG9hZCk9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuQmF0dGxlQnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICB9KVxyXG4gICAgICAgIC8vICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlNoYXJlVmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgIC8vICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAvLyAgICAgICAgICB0aGlzLkJhdHRsZUJ0bi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgLy8gICAgICB9XHJcbiAgICAgICAgLy8gIH0pKVxyXG5cclxuICAgICB9XHJcbn0iLCJpbXBvcnQgeyBQYW5lbEJhc2VDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgeyBHdWFuZ0dhbyB9IGZyb20gXCIuLi9XWFNESy9HdWFuZ0dhb1wiO1xyXG5pbXBvcnQgeyBWaWV3QWN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL1ZpZXdBY3Rpb25cIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lJbkdhbWUgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUluR2FtZVwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lMb3R0ZXJ5IH0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XHJcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xyXG5pbXBvcnQgeyBTY2VuZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2FtZVN0YXRlQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZ2dQYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgaW1wbGVtZW50cyBUaW1lckNvbnRyb2xcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkVnZ1BhbmVsXCI7XHJcblxyXG4gICAgbG9hZF9jbGljazpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgcHJvXzA6ZmFpcnlndWkuR1Byb2dyZXNzQmFyO1xyXG4gICAgYnRuXzE6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgaGl0YW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcbiAgICBnZXRyZXdhcmRidG46ZmFpcnlndWkuR0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIF9pc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9pc1Nob3dCYW5uZXIgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2Jhbm5lclZhbCA9IDAuNTtcclxuICAgIHByaXZhdGUgX21heENsaWNrQ250ID0gMTg7XHJcbiAgICBwcml2YXRlIF9jbGlja0NudCA9IDA7XHJcbiAgICBwcml2YXRlIF9pbnRlcnZhbCA9IDEwMDtcclxuICAgIHByaXZhdGUgX2RlY3JlbWVudCA9IDE7XHJcblxyXG4gICAgbjY6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgQ2hlc3Q6ZmFpcnlndWkuR0dyb3VwO1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJlZ2d2aWV3XCIsZmFsc2UsVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsMSApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5oaXRhbmkgPSB0aGlzLmdldFRyYW5zaXRpb25CeU5hbWUoIFwiaGl0YW5pXCIgKTtcclxuICAgICAgICB0aGlzLnByb18wLnZhbHVlID0gMTtcclxuICAgICAgICB0aGlzLl9iYW5uZXJWYWwgPSBHYW1lVXRpbHMucmFuZFJhbmdlZmxvYXQoMC4yLCAwLjQpO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICAvLyBHdWFuZ0dhby5DaGVhdEJhbm5lcih0aGlzLmJ0bl8xKTtcclxuICAgICAgICAvLyBHdWFuZ0dhby5DbGVhcigpOy8vaFtcImRlZmF1bHRcIl0uQ2xlYXIoKXJbXCJkZWZhdWx0XCJdXHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgIHZhciBzY2VuZWhlaWdodCA9IExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIHRoaXMuYnRuXzEueT1zY2VuZWhlaWdodC10aGlzLmJ0bl8xLmhlaWdodC0xNTtcclxuICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi55ID0gdGhpcy5idG5fMS55O1xyXG4gICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYoU2NlbmVDb250cm9sLkVnZ0dHcm91cD09MClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubjYudmlzaWJsZT10cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiYW5uZXJjYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJ0bl8xLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnFpYW9EYSApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX2Nsb3NlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyxFZ2dQYW5lbC5vbmNsb3NlZnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5nZXRyZXdhcmRidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLEVnZ1BhbmVsLlZpZGVvR2V0UmV3YXJkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgKz0gZHQ7XHJcbiAgICAgICAgaWYoIHRoaXMuX3RpbWUgPj0gdGhpcy5faW50ZXJ2YWwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuRGFvamlzaGkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgRGFvamlzaGkoKSB7XHJcbiAgICAgICAgbGV0IHB2ID0gdGhpcy5wcm9fMC52YWx1ZTtcclxuICAgICAgICBwdiAtPSB0aGlzLl9kZWNyZW1lbnQ7XHJcbiAgICAgICAgaWYgKHB2IDw9IDApIHB2ID0gMTtcclxuICAgICAgICB0aGlzLnByb18wLnZhbHVlID0gcHY7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tDbnQgPSBNYXRoLmNlaWwocHYgKnRoaXMuX21heENsaWNrQ250IC8xMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcWlhb0RhKCkgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NvbXBsZXRlKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuaGl0YW5pIT1udWxsJiYgIXRoaXMuaGl0YW5pLnBsYXlpbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpdGFuaS5wbGF5KCBudWxsLDEgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0NudCsrO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fY2xpY2tDbnQgPiB0aGlzLl9tYXhDbGlja0NudCkgXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0NudCA9IHRoaXMuX21heENsaWNrQ250O1xyXG4gICAgICAgICAgICBsZXQgcHYgPSB0aGlzLl9jbGlja0NudCAvIHRoaXMuX21heENsaWNrQ250O1xyXG4gICAgICAgICAgICBpZiggcHYgPiAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcHYgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucHJvXzAudmFsdWUgPSBwdioxMDA7XHJcbiAgICAgICAgICAgIGlmIChwdiA+PSB0aGlzLl9iYW5uZXJWYWwgJiYgIXRoaXMuX2lzU2hvd0Jhbm5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNTaG93QmFubmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgLy8gR3VhbmdHYW8uT3BlbkJhbm5lcigpO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKCAyMDAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldHJld2FyZGJ0bi52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHB2ID49IDEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgRWdnUGFuZWwuZ2V0cmV3YXJkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldHJld2FyZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyB2YXIgenBwcm94eTpBZ2VuY3lMb3R0ZXJ5ID0gdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApIGFzIEFnZW5jeUxvdHRlcnk7XHJcbiAgICAgICAgLy8gdmFyIGluZGV4ID0gKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lMb3R0ZXJ5ICkgYXMgQWdlbmN5TG90dGVyeSApLkdldFJld2FyZCgpO1xyXG4gICAgICAgIC8vIHZhciBzZWxlY3RjZmc6TG90dGVyeUNGRyA9IExvdHRlcnlDRkcudmVjWyBpbmRleCBdO1xyXG4gICAgICAgIC8vIHpwcHJveHkuZ2V0cmV3YXJkKCBzZWxlY3RjZmcgKTtcclxuICAgICAgICAvLyBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLojrflvpflvIDlsYDliqDpgJ9cIiApO1xyXG4gICAgICAgIEVnZ1BhbmVsLm9uY2xvc2VmdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eci+inhumikeW+l+WlluWKsVxyXG4gIHN0YXRpYyBWaWRlb0dldFJld2FyZCgpe1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi6I635b6X5byA5bGA5Yqg6YCfXCIgKTtcclxuICAgICAgICAgICAgICAgIEVnZ1BhbmVsLm9uY2xvc2VmdW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgRWdnUGFuZWwub25jbG9zZWZ1bigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGhpZGViYW5uZXIoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gUGxhdGZvcm1Ub29sLmdldEluc3RhbmNlKCkuaGlkZUJhbm5lcihcIkVnZ1ZpZXdcIik7XHJcbiAgICAgICAgR3VhbmdHYW8uaGlkZWJhbm5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBFZ2dQYW5lbCApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkZXN0b3J5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIFBsYXRmb3JtVG9vbC5nZXRJbnN0YW5jZSgpLmhpZGVCYW5uZXIoXCJFZ2dWaWV3XCIpO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLmhpZGViYW5uZXIoKTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xyXG4gICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW50ZXJnYW1lKHRydWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBcclxufSIsImltcG9ydCB7IFBhbmVsQmFzZUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEd1YW5nR2FvIH0gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XHJcbmltcG9ydCB7IFZpZXdBY3Rpb24gfSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuL1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEFnZW5jeUluR2FtZSB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XHJcbmltcG9ydCB7IEFnZW5jeUxvdHRlcnkgfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcclxuaW1wb3J0IExvdHRlcnlDRkcgZnJvbSBcIi4uL0NGRy9Mb3R0ZXJ5Q0ZHXCI7XHJcbmltcG9ydCB7IFNjZW5lQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHYW1lU3RhdGVDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQgeyBBZ2VuY3lVc2VyTWVzc2FnZSB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IEdhbWVTdGF0ZSB9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgUHJvcE1hbmFnZXIgfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBDb21wbGV0ZVBhbmVsIH0gZnJvbSBcIi4vQ29tcGxldGVQYW5lbFwiO1xyXG5pbXBvcnQgeyBBZ2VuY3lUcmlhbCB9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VHJpYWxcIjtcclxuaW1wb3J0IHsgUm9sZURhdGEgfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdpZnRWaWV3IGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkdpZnRWaWV3XCI7XHJcblxyXG4gICAgcHJpdmF0ZSBjbGlja2FuaTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xyXG4gICAgcHJpdmF0ZSBqaW5kdTpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XHJcbiAgICBwcml2YXRlIGJ0bmJveDpmYWlyeWd1aS5HR3JvdXA7XHJcbiAgICBwcml2YXRlIGFubml1OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwcml2YXRlIHNob3U6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHByaXZhdGUga3VhaXN1ZGlhbmppOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwcml2YXRlIGRpOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRyZXdhcmRidG46ZmFpcnlndWkuR0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIGl0ZW06ZmFpcnlndWkuR0NvbXBvbmVudDtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfaXNDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNTaG93QmFubmVyID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9iYW5uZXJWYWwgPSAwLjU7XHJcbiAgICBwcml2YXRlIF9tYXhDbGlja0NudCA9IDE4O1xyXG4gICAgcHJpdmF0ZSBfY2xpY2tDbnQgPSAwO1xyXG4gICAgcHJpdmF0ZSBfaW50ZXJ2YWwgPSAxMDA7XHJcbiAgICBwcml2YXRlIF9kZWNyZW1lbnQgPSAxO1xyXG5cclxuICAgIG42OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIENoZXN0OmZhaXJ5Z3VpLkdHcm91cDtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoIFwibWFpblwiLFwiZ2lmdGNoZWF0dmlld1wiICk7IFxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0VmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFubml1ID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoMikgYXMgZmFpcnlndWkuR0xvYWRlcjtcclxuICAgICAgICB0aGlzLmt1YWlzdWRpYW5qaSA9IHRoaXMuaXRlbS5hc0NvbS5nZXRDaGlsZEF0KDApIGFzIGZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICAgICAgdGhpcy5zaG91ID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoMykgYXMgZmFpcnlndWkuR0xvYWRlcjtcclxuICAgICAgICB0aGlzLmRpID0gdGhpcy5pdGVtLmFzQ29tLmdldENoaWxkQXQoMSkgYXMgZmFpcnlndWkuR0xvYWRlcjtcclxuICAgICAgICB0aGlzLmdldHJld2FyZGJ0biA9IHRoaXMuaXRlbS5hc0NvbS5nZXRDaGlsZEF0KDQpIGFzIGZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmNsaWNrYW5pID0gdGhpcy5pdGVtLmdldFRyYW5zaXRpb24oIFwiY2xpY2tidG5hbmlcIiApO1xyXG4gICAgICAgIHRoaXMuamluZHUudmFsdWUgPSAxO1xyXG4gICAgICAgIHRoaXMuX2Jhbm5lclZhbCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VmbG9hdCgwLjIsIDAuNCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmFkZFVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIC8vIEd1YW5nR2FvLkNsZWFyKCk7XHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgIExheWEudGltZXIubG9vcCgyMDAwLHRoaXMsdGhpcy5wbGF5QW5pbWF0b3IpO1xyXG4gICAgICAgIC8vIHZhciBzY2VuZWhlaWdodCA9IExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgICAgIC8vIHRoaXMuYnRuYm94Lnk9c2NlbmVoZWlnaHQtdGhpcy5idG5ib3gueS0xNTtcclxuICAgIH1cclxuXHJcbiAgICBwbGF5QW5pbWF0b3IoKXtcclxuICAgICAgICB0aGlzLmNsaWNrYW5pLnBsYXkobnVsbCwxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYW5uaXUsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMucWlhb0RhICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5nZXRyZXdhcmRidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuVmlkZW9HZXRSZXdhcmQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgdXBkYXRlKCBkdDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdGltZSArPSBkdDtcclxuICAgICAgICBpZiggdGhpcy5fdGltZSA+PSB0aGlzLl9pbnRlcnZhbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lID0gMDtcclxuICAgICAgICAgICAgdGhpcy5EYW9qaXNoaSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBEYW9qaXNoaSgpIHtcclxuICAgICAgICBsZXQgcHYgPSB0aGlzLmppbmR1LnZhbHVlO1xyXG4gICAgICAgIHB2IC09IHRoaXMuX2RlY3JlbWVudDtcclxuICAgICAgICBpZiAocHYgPD0gMCkgcHYgPSAxO1xyXG4gICAgICAgIHRoaXMuamluZHUudmFsdWUgPSBwdjtcclxuICAgICAgICB0aGlzLl9jbGlja0NudCA9IE1hdGguY2VpbChwdiAqdGhpcy5fbWF4Q2xpY2tDbnQgLzEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxaWFvRGEoKSBcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLnNob3UudmlzaWJsZSl7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMua3VhaXN1ZGlhbmppLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgTGF5YS50aW1lci5jbGVhcih0aGlzLHRoaXMucGxheUFuaW1hdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NvbXBsZXRlKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsaWNrQ250Kys7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbGlja0NudCA+IHRoaXMuX21heENsaWNrQ250KSBcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQ250ID0gdGhpcy5fbWF4Q2xpY2tDbnQ7XHJcbiAgICAgICAgICAgIGxldCBwdiA9IHRoaXMuX2NsaWNrQ250IC8gdGhpcy5fbWF4Q2xpY2tDbnQ7XHJcbiAgICAgICAgICAgIGlmKCBwdiA+IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwdiA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5qaW5kdS52YWx1ZSA9IHB2KjEwMDtcclxuICAgICAgICAgICAgaWYgKHB2ID49IHRoaXMuX2Jhbm5lclZhbCAmJiAhdGhpcy5faXNTaG93QmFubmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3dCYW5uZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRyZXdhcmRidG4udmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDIwMDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0cmV3YXJkYnRuLnZpc2libGUgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwdiA+PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0NvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIEdpZnRWaWV3LmdldHJld2FyZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRyZXdhcmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgUm9sZURhdGEuSW5zdGFuY2UuTW9uZXkgKz0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5DaGVhdFJld2FyZDtcclxuICAgICAgICAvLyAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hlYXRSZXdhcmQgKTtcclxuICAgICAgICAvLyB2YXIgaW5kZXggPSAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeUxvdHRlcnkgKSBhcyBBZ2VuY3lMb3R0ZXJ5ICkuR2V0UmV3YXJkKCk7XHJcbiAgICAgICAgLy8gdmFyIHNlbGVjdGNmZzpMb3R0ZXJ5Q0ZHID0gTG90dGVyeUNGRy52ZWNbIGluZGV4IF07XHJcbiAgICAgICAgLy8genBwcm94eS5nZXRyZXdhcmQoIHNlbGVjdGNmZyApO1xyXG4gICAgICAgIC8vIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuiOt+W+l1wiK1BsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuQ2hlYXRSZXdhcmQrXCLph5HluIFcIiApO1xyXG4gICAgICAgIEdpZnRWaWV3Lm9uY2xvc2VmdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eci+inhumikeW+l+WlluWKsVxyXG4gICAgVmlkZW9HZXRSZXdhcmQoKXtcclxuICAgICAgICB0dGFkLlNob3dWaWRlbygoaXNMb2FkPT57XHJcbiAgICAgICAgICAgIGlmKGlzTG9hZCl7XHJcbiAgICAgICAgICAgICAgICBSb2xlRGF0YS5JbnN0YW5jZS5Nb25leSArPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkNoZWF0UmV3YXJkO1xyXG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyggXCLojrflvpdcIitQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLkNoZWF0UmV3YXJkK1wi6YeR5biBXCIgKTtcclxuICAgICAgICAgICAgICAgIEdpZnRWaWV3Lm9uY2xvc2VmdW4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgR2lmdFZpZXcub25jbG9zZWZ1bigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoaWRlYmFubmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEd1YW5nR2FvLmhpZGViYW5uZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgb25jbG9zZWZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggR2lmdFZpZXcgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBHdWFuZ0dhby5oaWRlYmFubmVyKCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3RvcnkoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIFdvcmRUaXBzUGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sXHJcbntcclxuICAgIHB1YmxpYyBzdGF0aWMga2V5OnN0cmluZyA9IFwiV29yZFRpcHNQYW5lbFwiO1xyXG4gICAgdGV4dF93b3JkOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICB0MTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xyXG4gICAgcHVibGljIG5vd3dvcmQ6c3RyaW5nID0gXCJcIjtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoIFwibG9hZGluZ1wiLFwid29yZFRpcHNcIiApO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIFxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgc2hvd1RleHQoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHRleHQ6TGF5YS4gVGV4dCA9IG5ldyBMYXlhLlRleHQoKTtcclxuXHJcbiAgICAgICAgdGV4dC50ZXh0ID0gXCJPcmllbnRhdGlvbi1Qb3J0cmFpdFwiO1xyXG4gICAgICAgIHRleHQuY29sb3IgPSBcImdyYXlcIjtcclxuICAgICAgICB0ZXh0LmZvbnQgPSBcIkltcGFjdFwiO1xyXG4gICAgICAgIHRleHQuZm9udFNpemUgPSA1MDtcclxuXHJcbiAgICAgICAgdGV4dC54ID0gTGF5YS5zdGFnZS53aWR0aCAtIHRleHQud2lkdGggPj4gMTtcclxuICAgICAgICB0ZXh0LnkgPSBMYXlhLnN0YWdlLmhlaWdodCAtIHRleHQuaGVpZ2h0ID4+IDE7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGV4dCk7XHJcbiAgICB9XHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHVibGljIHNob3dXb3JkKCB3b3JkOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd3dvcmQgPSB3b3JkO1xyXG4gICAgICAgIHRoaXMudGV4dF93b3JkLnRleHQgPSB3b3JkO1xyXG4gICAgICAgIHRoaXMudDEucGxheSggTGF5YS5IYW5kbGVyLmNyZWF0ZSggdGhpcywgdGhpcy5wbGF5RW5kQ2FsbGJhY2sgKSwxICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5vbkluaXQoKTtcclxuICAgICAgICB0aGlzLnQxID0gdGhpcy5nZXRwYW5lbFRyYW5zaXRpb24oXCJ0MVwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblx0cHJpdmF0ZSByZWN0OkxheWEuIFNwcml0ZTtcclxuICAgIHByaXZhdGUgY3JlYXRlQ2FudHJhbFJlY3QoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWN0ID0gbmV3IExheWEuU3ByaXRlKCk7XHJcbiAgICAgICAgdGhpcy5yZWN0LmdyYXBoaWNzLmRyYXdSZWN0KC0xMDAsIC0xMDAsIDIwMCwgMjAwLCBcImdyYXlcIik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnJlY3QpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVJlY3RQb3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVJlY3RQb3MoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWN0LnggPSBMYXlhLnN0YWdlLndpZHRoIC8gMjtcclxuICAgICAgICB0aGlzLnJlY3QueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC8gMjtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwcml2YXRlIHBsYXlFbmRDYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUucmVtb3Zlc2VsZWN0LHRoaXMgKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7UGFuZWxCYXNlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvUGFuZWxCYXNlQ29udHJvbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIExvYWRpbmdQYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2xcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkxvYWRpbmdQYW5lbFwiO1xyXG4gICAgcHJvOmZhaXJ5Z3VpLkdQcm9ncmVzc0JhcjtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKFwibG9hZGluZ1wiLFwibG9hZGluZ1wiKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzdXBlci5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBzaG93V29yZCggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucHJvLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkJveUNsaWNrKGU6TGF5YS5FdmVudCk6IHZvaWQge1xyXG4gICAgICAgIC8v54K55Ye75ZCO5bCP5Lq65Lya5pS+5aSn57yp5bCPXHJcbiAgICAgICAgdmFyIGJveTpMYXlhLiBTcHJpdGUgPSBlLnRhcmdldDtcclxuICAgICAgICBpZiAoYm95LnNjYWxlWCA9PT0gMSkge1xyXG4gICAgICAgICAgICBib3kuc2NhbGUoMS4yLCAxLjIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJveS5zY2FsZSgxLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblR4dENsaWNrKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgLy/ngrnlh7vlkI7liIfmjaLpgILphY3mqKHlvI9cclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgXHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKTtcclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtWaWV3QWN0aW9ufSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XHJcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vQ0ZHL1JvbGVDRkdcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQge0FnZW5jeUxvdHRlcnl9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5TG90dGVyeVwiO1xyXG5pbXBvcnQge0d1YW5nR2FvfSBmcm9tIFwiLi4vV1hTREsvR3VhbmdHYW9cIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBMb3R0ZXJ5UGFuZWwgZXh0ZW5kcyBQYW5lbEJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiTG90dGVyeVBhbmVsXCI7XHJcblxyXG4gICAgYmFja2J0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgbG90dGVyeWJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgaWNvbl8wOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfMDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgaWNvbl8xOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfMTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgaWNvbl8yOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfMjpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgaWNvbl8zOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfMzpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgaWNvbl80OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfNDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgaWNvbl81OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfNTpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgaWNvbl82OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfNjpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgaWNvbl83OmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICB0eHRfNzpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG5cclxuICAgIHByaXZhdGUgYWdlbmN5bG90dGVyeTpBZ2VuY3lMb3R0ZXJ5O1xyXG4gICAgXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlciggXCJtYWluXCIsXCJMb3R0ZXJ5Vmlld1wiLGZhbHNlLFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLDEgKTsgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgbG9nZ2VyOkxheWEuVGV4dDtcclxuICAgIHByaXZhdGUgc2hvd0xvZ2dlcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyBMYXlhLlRleHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZm9udFNpemUgPSAzMDtcclxuICAgICAgICB0aGlzLmxvZ2dlci5jb2xvciA9IFwiI0ZGRkZGRlwiO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmFsaWduID0gJ2NlbnRlcic7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIudmFsaWduID0gJ21pZGRsZSc7XHJcblxyXG4gICAgICAgIHRoaXMubG9nZ2VyLnNpemUoTGF5YS5zdGFnZS53aWR0aCwgTGF5YS5zdGFnZS5oZWlnaHQpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLnRleHQgPSBcIuetieW+heWTjeW6lC4uLlxcblwiO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5sb2dnZXIpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBvbkh0dHBSZXF1ZXN0RXJyb3IoZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmJhY2tidG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubG90dGVyeWJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5jaG91amlhbmdjbGljayApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIF90d2VlT2JqZWN0OmFueTtcclxuICAgIHByaXZhdGUgX25vd2dldEluZGV4Om51bWJlcjtcclxuICAgIHByaXZhdGUgX3ByZUluZGV4Om51bWJlcjtcclxuICAgIHByaXZhdGUgdHc6IGxheWEudXRpbHMuVHdlZW47XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIHBsYXlDb21wbHRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLnR3IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudHcuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy50dyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYmFja2J0bi5lbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxvdHRlcnlidG4uZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZ2VuY3lsb3R0ZXJ5LmdldHJld2FyZCggdGhpcy5fc2VsZWN0Y2ZnICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLnR3IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMudHcuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy50dyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEd1YW5nR2FvLkNsZWFyKCk7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIExvdHRlcnlQYW5lbCApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZ2VuY3lsb3R0ZXJ5ID0gdGhpcy5nZXRQcm94eSggQWdlbmN5TG90dGVyeSApO1xyXG4gICAgICAgIHZhciB2ZWM6QXJyYXk8TG90dGVyeUNGRz4gPSBMb3R0ZXJ5Q0ZHLnZlYztcclxuICAgICAgICBmb3IoIHZhciBpOm51bWJlciA9IDA7aSA8IHZlYy5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjZmc6TG90dGVyeUNGRyA9IHZlY1tpXTtcclxuICAgICAgICAgICAgaWYoIGNmZy50eXBlID09IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzW1wiaWNvbl9cIitpXS51cmwgPSBmYWlyeWd1aS5VSVBhY2thZ2UuZ2V0SXRlbVVSTCggXCJtYWluXCIsXCJpbWdfZ29sZFwiICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzW1widHh0X1wiK2ldLnRleHQgPSBcIlhcIiArIGNmZy52YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciByb2xlY2ZnOlJvbGVDRkcgPSBSb2xlQ0ZHLmRpY3RbY2ZnLnZhbHVlXTtcclxuICAgICAgICAgICAgICAgIHRoaXNbXCJpY29uX1wiK2ldLnVybCA9IEFzc2V0UGF0aC5nZXRyb2xlaWNvbiggcm9sZWNmZy5pY29uICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzW1widHh0X1wiK2ldLnRleHQgPSByb2xlY2ZnLnJvbGVuYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEd1YW5nR2FvLkNoZWF0QmFubmVyKHRoaXMubG90dGVyeWJ0bik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgb25Tb2NrZXRDbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlNvY2tldCBjbG9zZWRcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG9uTWVzc2FnZVJldmVpdmVkKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiTWVzc2FnZSBmcm9tIHNlcnZlcjpcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBjaG91amlhbmdjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnZpZGVvY2FsbGJhY2soKTtcclxuICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UucGxheVZpZGVvKCBcIlwiLHRoaXMsdGhpcy52aWRlb2NhbGxiYWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0Y2ZnOkxvdHRlcnlDRkc7XHJcbiAgICBwcml2YXRlIHZpZGVvY2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFBsYXkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhcnRQbGF5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuYWdlbmN5bG90dGVyeS5HZXRSZXdhcmQoKTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RjZmcgPSBMb3R0ZXJ5Q0ZHLnZlY1sgaW5kZXggXTtcclxuICAgICAgICB0aGlzLmJhY2tidG4uZW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG90dGVyeWJ0bi5lbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbm93Z2V0SW5kZXggPSBpbmRleDtcclxuICAgICAgICB2YXIgYW5nbGU6bnVtYmVyID0gMzYwICogNiArICh0aGlzLl9ub3dnZXRJbmRleCkqIDQ1IC0gMTU7XHJcbiAgICAgICAgaWYoIHRoaXMuaXRlbV9wYW5lbC5yb3RhdGlvbiA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3R3ZWVPYmplY3QgPSB7IHZhbHVlOjAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdHdlZU9iamVjdCA9IHsgdmFsdWU6dGhpcy5fcHJlSW5kZXggKiA0NSAtIDE1IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3ByZUluZGV4ID0gdGhpcy5fbm93Z2V0SW5kZXg7XHJcbiAgICAgICAgdGhpcy50dyA9IGxheWEudXRpbHMuVHdlZW4udG8odGhpcy5fdHdlZU9iamVjdCwgeyB2YWx1ZTphbmdsZSB9LCAzMDAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5wbGF5Q29tcGx0ZSApKTtcclxuICAgICAgICB0aGlzLnR3LnVwZGF0ZSA9IExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24gKCk6IHZvaWQge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlOm51bWJlciA9IHRoaXMuX3R3ZWVPYmplY3QudmFsdWUgJSAzNjA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1fcGFuZWwucm90YXRpb24gPSAgdmFsdWU7XHJcbiAgICAgICAgICAgIH0sIG51bGwsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIFxyXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7VXNlckluZm9FdmVudH0gZnJvbSBcIi4uL0RhdGEvVXNlckluZm9FdmVudFwiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5U2tpblwiO1xyXG5pbXBvcnQge0FnZW5jeUluR2FtZX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lJbkdhbWVcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7QWdlbmN5TG90dGVyeX0gZnJvbSBcIi4uL0FnZW5jeS9BZ2VuY3lMb3R0ZXJ5XCI7XHJcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi9QdXNoL0Nob3V0aVBhblZpZXdcIjtcclxuaW1wb3J0IFR1aWppYW5WaWV3IGZyb20gXCIuLi9QdXNoL1R1aWppYW5WaWV3XCI7XHJcbmltcG9ydCB7IEZZSERfU2RrIH0gZnJvbSBcIi4uL1dYU0RLL0ZZSERfU2RrXCI7XHJcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7IExvY2FsRGF0YUNvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7IFVzZXJEYXRhSW5mbyB9IGZyb20gXCIuLi9EYXRhL1VzZXJEYXRhSW5mb1wiO1xyXG5pbXBvcnQgeyBTa2luRGF0YSB9IGZyb20gXCIuLi9EYXRhL1NraW5EYXRhXCI7XHJcbmltcG9ydCB7IFNjZW5lQ29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5QYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2xcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIk1haW5QYW5lbFwiO1xyXG4gICAgc3RhdGljIGluc3RhbmNlOk1haW5QYW5lbDtcclxuXHJcbiAgICBjX3N0YXRlOmZhaXJ5Z3VpLkNvbnRyb2xsZXI7XHJcbiAgICBsb2FkX2NsaWNrcGFuZWw6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIGxvYWRfc3RhcnQ6ZmFpcnlndWkuR0xvYWRlcjtcclxuICAgIHR4dF9sdjpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgcHJvX2RpczpmYWlyeWd1aS5HUHJvZ3Jlc3NCYXI7XHJcbiAgICB0eHRfbWluZ2NpOmZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICB0eHRfZ29sZDpmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgU2tpbkJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgTW9yZUdhbWVCdG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIEV4aXRCdG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIExvdHRlcnlCdG46ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIFNldEJ0bjpmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgIE1vcmVGdW5CdG5TY2FsZTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xyXG5cclxuICAgIC8v5pu05aSa5aW9546p5oyJ6ZKuXHJcbiAgICBNb3JlRnVuQnRuOmZhaXJ5Z3VpLkdCdXR0b247XHJcblxyXG4gICAgLy/nmq7ogqTmjInpkq7liqjmlYhcclxuICAgIFNraW5Bbmk6ZmFpcnlndWkuVHJhbnNpdGlvbjtcclxuICAgIC8v5pu05aSa5aW9546p5oyJ6ZKu5Yqo5pWIXHJcbiAgICBNb3JlQW5pOmZhaXJ5Z3VpLlRyYW5zaXRpb247XHJcbiAgICAvL+aKveWlluaMiemSruWKqOaViFxyXG4gICAgTG90dGVyeUFuaTpmYWlyeWd1aS5UcmFuc2l0aW9uO1xyXG5cclxuICAgIHByaXZhdGUgYWdlbmN5dXNlcm1lc3NhZ2U6QWdlbmN5VXNlck1lc3NhZ2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoXCJtYWluXCIsXCJtYWludmlld1wiKTsgXHJcbiAgICAgICAgTWFpblBhbmVsLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVVzZXJEYXRhSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnR4dF9nb2xkLnRleHQgPSB0aGlzLmFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhLk1vbmV5LnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXR1cm5tYWluSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSB0aGlzLmFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhO1xyXG4gICAgICAgIC8vIGlmKCBSb2xlRGF0YS5ub3dsZXZlbCA8PSAyIClcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN1cGVyLm9uSW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgICAvLyDkuIDlj6rlh6Tlh7DnmoTliIbovqjnjofmmK81NTAgKiA0MDBcclxuICAgICBwcml2YXRlIHBob2VuaXhXaWR0aDogbnVtYmVyID0gNTUwO1xyXG4gICAgIHByaXZhdGUgcGhvZW5peEhlaWdodDogbnVtYmVyID0gNDAwO1xyXG5cclxuICAgICBwcml2YXRlIGJnQ29sb3JUd2VlbmVyOkxheWEuVHdlZW4gPSBuZXcgTGF5YS5Ud2VlbigpO1xyXG4gICAgIHByaXZhdGUgZ3JhZGllbnRJbnRlcnZhbDogbnVtYmVyID0gMjAwMDtcclxuICAgICBwcml2YXRlIGJnQ29sb3JDaGFubmVsczogYW55ID0geyByOiA5OSwgZzogMCwgYjogMHhGRiB9O1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQaG9lbml4ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHNjYWxlRmFjdG9yOiBudW1iZXIgPSBNYXRoLm1pbihcclxuICAgICAgICAgICAgTGF5YS5zdGFnZS53aWR0aCAvICh0aGlzLnBob2VuaXhXaWR0aCAqIDIpLFxyXG4gICAgICAgICAgICBMYXlhLnN0YWdlLmhlaWdodCAvIHRoaXMucGhvZW5peEhlaWdodCk7XHJcblxyXG4gICAgICAgIC8vIOWKoOS6hua3t+WQiOaooeW8j+eahOWHpOWHsFxyXG4gICAgICAgIHZhciBibGVuZGVkUGhvZW5peDpMYXlhLkFuaW1hdGlvbiBcclxuICAgICAgICBibGVuZGVkUGhvZW5peC5ibGVuZE1vZGUgPSBcImxpZ2h0ZXJcIjtcclxuICAgICAgICBibGVuZGVkUGhvZW5peC5zY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IpO1xyXG4gICAgICAgIGJsZW5kZWRQaG9lbml4LnkgPSAoTGF5YS5zdGFnZS5oZWlnaHQgLSB0aGlzLnBob2VuaXhIZWlnaHQgKiBzY2FsZUZhY3RvcikgLyAyO1xyXG5cclxuICAgICAgICAvLyDmraPluLjmqKHlvI/nmoTlh6Tlh7BcclxuICAgICAgICB2YXIgbm9ybWFsUGhvZW5peDpMYXlhLkFuaW1hdGlvbjtcclxuICAgICAgICBub3JtYWxQaG9lbml4LnNjYWxlKHNjYWxlRmFjdG9yLCBzY2FsZUZhY3Rvcik7XHJcbiAgICAgICAgbm9ybWFsUGhvZW5peC54ID0gdGhpcy5waG9lbml4V2lkdGggKiBzY2FsZUZhY3RvcjtcclxuICAgICAgICBub3JtYWxQaG9lbml4LnkgPSAoTGF5YS5zdGFnZS5oZWlnaHQgLSB0aGlzLnBob2VuaXhIZWlnaHQgKiBzY2FsZUZhY3RvcikgLyAyO1xyXG4gICAgfVxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBcclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5FeGl0QnRuLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLk1vcmVGdW5CdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuTW9yZUdhbWVCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHR0YWQuU2hvd2Jhbm5lcigpO1xyXG4gICAgICAgIC8vIExheWEudGltZXIub25jZSg1MDAsdGhpcywoKT0+e1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcIm1haW7nlYzpnaLnmb3lkI3ljZUtLS0tXCIsRllIRF9TZGsuaXN3aGl0ZSk7XHJcbiAgICAgICAgLy8gICAgIGlmKEZZSERfU2RrLmlzd2hpdGUpe1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5FeGl0QnRuLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGVsc2V7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLkV4aXRCdG4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSlcclxuICAgICAgICB0aGlzLk1vcmVGdW5CdG5TY2FsZSA9IHRoaXMuZ2V0VHJhbnNpdGlvbkJ5TmFtZShcIm1vcmVmdW5idG5zY2FsZVwiKTtcclxuICAgICAgICBcclxuICAgICAgICBMYXlhLnRpbWVyLmxvb3AoMTAwMCx0aGlzLHRoaXMucGxheWFuaW1hdG9yMik7XHJcbiAgICAgICAgdGhpcy5Ta2luQW5pID0gdGhpcy5Ta2luQnRuLmdldFRyYW5zaXRpb24oXCJza2luYW5pXCIpO1xyXG4gICAgICAgIHRoaXMuTG90dGVyeUFuaSA9IHRoaXMuTG90dGVyeUJ0bi5nZXRUcmFuc2l0aW9uKFwibG90dGVyeWFuaVwiKTtcclxuICAgICAgICB0aGlzLk1vcmVBbmkgPSB0aGlzLk1vcmVHYW1lQnRuLmdldFRyYW5zaXRpb24oXCJtb3JlYW5pXCIpO1xyXG4gICAgICAgIExheWEudGltZXIubG9vcCgzMDAwLHRoaXMsdGhpcy5wbGF5YW5pbWF0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLmFnZW5jeXVzZXJtZXNzYWdlID0gdGhpcy5nZXRQcm94eSggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5wcm9famluZHUgPSB0aGlzLnByb19kaXM7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIudHh0X21pbmdjaSA9IHRoaXMudHh0X21pbmdjaTtcclxuICAgICAgICB0aGlzLmNfc3RhdGUgPSB0aGlzLmdldENvbnRyb2xsZXJCeUJhbWUoIFwiY19zdGF0ZVwiICk7XHJcbiAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5zZXRDbGlja1BhbmVsKCB0aGlzLmxvYWRfY2xpY2twYW5lbCApO1xyXG4gICAgICAgIHRoaXMucmV0dXJubWFpbkhhbmRsZXIoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVVzZXJEYXRhSGFuZGxlcigpO1xyXG4gICAgICAgIHRoaXMuSW5pdFNpZ25JdGVtKCk7XHJcbiAgICB9XHJcbiAgICBwbGF5YW5pbWF0b3IoKXtcclxuICAgICAgICB0aGlzLlNraW5BbmkucGxheShudWxsLDEpO1xyXG4gICAgICAgIHRoaXMuTG90dGVyeUFuaS5wbGF5KG51bGwsMSk7XHJcbiAgICAgICAgdGhpcy5Nb3JlQW5pLnBsYXkobnVsbCwxKTtcclxuICAgIH1cclxuICAgIHBsYXlhbmltYXRvcjIoKXtcclxuICAgICAgICB0aGlzLk1vcmVGdW5CdG5TY2FsZS5wbGF5KG51bGwsMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaG91amlhbmdjbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZihTY2VuZUNvbnRyb2wuSXNTaG93U2lnbilyZXR1cm5cclxuICAgICAgICB0dGFkLkNsZWFyKCk7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lMb3R0ZXJ5ICkgYXMgQWdlbmN5TG90dGVyeSApLm9wZW5WaWV3KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0dWlqaWFuY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoU2NlbmVDb250cm9sLklzU2hvd1NpZ24pcmV0dXJuXHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBUdWlqaWFuVmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBza2luY2xpY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoU2NlbmVDb250cm9sLklzU2hvd1NpZ24pcmV0dXJuXHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgICggdGhpcy5nZXRQcm94eSggQWdlbmN5U2tpbiApIGFzIEFnZW5jeVNraW4gKS5vcGVudmlldygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbW9yZWNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduKXJldHVyblxyXG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgICAgIHR0YWQuQ3JlYXRlTW9yZUdhbWVCdG4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ0bmNsaWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduKXJldHVyblxyXG4gICAgICAgIEdhbWVTdGF0ZS5HYW1lTnVtKys7XHJcbiAgICAgICAgdHRhZC5DbGVhcigpO1xyXG4gICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMjtcclxuICAgICAgICB0aGlzLnR4dF9sdi50ZXh0ID0gdGhpcy5hZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YS5nZXROb3dTZXJ2ZXJMZXZlbCgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgKCB0aGlzLmdldFByb3h5KCBBZ2VuY3lJbkdhbWUgKSBhcyBBZ2VuY3lJbkdhbWUgKS5zdGFydEdhbWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldGNsaWNrKCk6dm9pZHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHRpbGVkTWFwOkxheWEuVGlsZWRNYXA7XHJcbiAgICBwcml2YXRlIGxheWVyOkxheWEuTWFwTGF5ZXI7XHJcbiAgICBwcml2YXRlIHNwcml0ZTpMYXlhLlNwcml0ZTtcclxuICAgIHByaXZhdGUgbWFwTG9hZGVkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5ZXIgPSB0aGlzLnRpbGVkTWFwLmdldExheWVyQnlJbmRleCgwKTtcclxuXHJcbiAgICAgICAgdmFyIHJhZGl1c1g6IG51bWJlciA9IDMyO1xyXG4gICAgICAgIHZhciByYWRpdXNZOiBudW1iZXIgPSBNYXRoLnRhbigxODAgLyBNYXRoLlBJICogMzApICogcmFkaXVzWDtcclxuICAgICAgICB2YXIgY29sb3I6IHN0cmluZyA9IFwiI0ZGN0Y1MFwiO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlID0gbmV3IExheWEuU3ByaXRlKCk7XHJcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUoMCwgMCwgLXJhZGl1c1gsIHJhZGl1c1ksIGNvbG9yKTtcclxuICAgICAgICB0aGlzLnNwcml0ZS5ncmFwaGljcy5kcmF3TGluZSgwLCAwLCByYWRpdXNYLCByYWRpdXNZLCBjb2xvcik7XHJcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUoLXJhZGl1c1gsIHJhZGl1c1ksIDAsIHJhZGl1c1kgKiAyLCBjb2xvcik7XHJcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUocmFkaXVzWCwgcmFkaXVzWSwgMCwgcmFkaXVzWSAqIDIsIGNvbG9yKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ByaXRlKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMubG9hZF9zdGFydCxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5idG5jbGljayApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuU2tpbkJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5za2luY2xpY2sgKTtcclxuICAgICAgICAvLyB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLk1vcmVHYW1lQnRuLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm1vcmVjbGljayApO1xyXG4gICAgICAgIC8vIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuTW9yZUZ1bkJ0bixMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5tb3JlY2xpY2sgKTtcclxuICAgICAgICAvLyB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLkV4aXRCdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMudHVpamlhbmNsaWNrICk7XHJcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIEdhbWVTdGF0ZS5yZXR1cm5NYWluVmlldyx0aGlzLHRoaXMucmV0dXJubWFpbkhhbmRsZXIgKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLkxvdHRlcnlCdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuY2hvdWppYW5nY2xpY2sgKTtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggVXNlckluZm9FdmVudC5Vc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhLHRoaXMsdGhpcy51cGRhdGVVc2VyRGF0YUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICAgLy8jcmVnaW9uIOetvuWIsFxyXG4gICAgIGJ0bl9TaWduOmZhaXJ5Z3VpLkdCdXR0b247XHJcblxyXG4gICAgIFNpZ25QYW5lbDpmYWlyeWd1aS5HR3JvdXA7XHJcbiAgICAgU2lnbkl0ZW0xOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgICBTaWduSXRlbTI6ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgIFNpZ25JdGVtMzpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgU2lnbkl0ZW00OmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgICBTaWduSXRlbTU6ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgIFNpZ25JdGVtNjpmYWlyeWd1aS5HSW1hZ2U7XHJcbiAgICAgU2lnbkl0ZW03OmZhaXJ5Z3VpLkdJbWFnZTtcclxuIFxyXG4gICAgIFNpZ25BZDpmYWlyeWd1aS5HSW1hZ2U7XHJcbiBcclxuICAgICBTaWduSXRlbTpmYWlyeWd1aS5HSW1hZ2VbXTtcclxuICAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBcclxuICAgIC8vI3JlZ2lvbiDliJ3lp4vljJbnrb7liLBcclxuXHJcbiAgICBwcml2YXRlIGlzU2hvd1NpZ246Ym9vbGVhbj1mYWxzZTtcclxuXHJcbiAgICAvKuWLvumAieWbviovXHJcbiAgICBwcml2YXRlIFNpZ25UaWNrSW1hZ2U6ZmFpcnlndWkuR0ltYWdlO1xyXG4gICAgcHJpdmF0ZSBzaWduTm9yYW1CdXR0b246ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIHByaXZhdGUgc2lnbkFkQnV0dG9uOmZhaXJ5Z3VpLkdCdXR0b247XHJcblxyXG4gICAgcHJpdmF0ZSBTaWduRGFuYmVpQnRuOmZhaXJ5Z3VpLkdCdXR0b247XHJcblxyXG4gICAgcHJpdmF0ZSBJbml0U2lnbkl0ZW0oKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuTG9hZFNpZ25EYXRhKCk7XHJcbiAgICAgICAgdmFyIF9ibz10cnVlO1xyXG4gICAgICAgIGlmKHRoaXMuZ2V0U3lzdGVtVGltZSgpPT10aGlzLlNpZ25JbmZvW1widGltZVwiXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIF9ibz1mYWxzZTtcclxuICAgICAgICB9ZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5TaWduSW5mb1tcIkZpc3N0TG9hZFwiXT0wO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLlNpZ25JbmZvW1wiRmlzc3RMb2FkXCJdPT0xKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgX2JvPWZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLlNpZ25EZWJ1ZylcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIF9ibz10cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBTY2VuZUNvbnRyb2wuSXNTaG93U2lnbj1fYm87XHJcbiAgICAgICAgdGhpcy5TaWduUGFuZWwudmlzaWJsZT1fYm87XHJcbiAgICAgICAgaWYoIV9ibylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuU2lnbkZ1bigpO1xyXG4gICAgfVxyXG5cclxuICAgIGJ0bl9TaWduRnVuKClcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLmdldFN5c3RlbVRpbWUoKT09dGhpcy5TaWduSW5mb1tcInRpbWVcIl0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2hvd1NpZ249dHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuU2lnbkZ1bigpO1xyXG5cclxuICAgICAgICBpZih0aGlzLmlzU2hvd1NpZ24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBXeEFwaS5TaG93VHh0KFwi5bey562+5YiwXCIpOy8veS5XeEFwaS5TaG93VHh0KFwi5bey562+5YiwXCIpXHJcbiAgICAgICAgICAgIHRoaXMuU2lnblNlbGVjdGVkTW9uZXk9MCtcIlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBTaWduRnVuKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLlNpZ25JdGVtPW5ldyBBcnJheSgpO1xyXG4gICAgICAgIHRoaXMuU2lnbkl0ZW0ucHVzaCh0aGlzLlNpZ25JdGVtMSk7XHJcbiAgICAgICAgdGhpcy5TaWduSXRlbS5wdXNoKHRoaXMuU2lnbkl0ZW0yKTtcclxuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTMpO1xyXG4gICAgICAgIHRoaXMuU2lnbkl0ZW0ucHVzaCh0aGlzLlNpZ25JdGVtNCk7XHJcbiAgICAgICAgdGhpcy5TaWduSXRlbS5wdXNoKHRoaXMuU2lnbkl0ZW01KTtcclxuICAgICAgICB0aGlzLlNpZ25JdGVtLnB1c2godGhpcy5TaWduSXRlbTYpO1xyXG4gICAgICAgIHRoaXMuU2lnbkl0ZW0ucHVzaCh0aGlzLlNpZ25JdGVtNyk7XHJcblxyXG4gICAgICAgIHRoaXMuU2lnblRpY2tJbWFnZT10aGlzLlNpZ25BZC5hc0NvbS5nZXRDaGlsZEF0KDIpIGFzIGZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgICAgICB2YXIgc2lnblRpY2tCdXR0b249dGhpcy5TaWduQWQuYXNDb20uZ2V0Q2hpbGRBdCgxKSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgICAgIHRoaXMuc2lnbkFkQnV0dG9uPXRoaXMuU2lnbkFkLmFzQ29tLmdldENoaWxkQXQoMykgYXMgZmFpcnlndWkuR0J1dHRvbjtcclxuICAgICAgICB0aGlzLnNpZ25Ob3JhbUJ1dHRvbj10aGlzLlNpZ25BZC5hc0NvbS5nZXRDaGlsZEF0KDQpIGFzIGZhaXJ5Z3VpLkdCdXR0b247XHJcbiAgICAgICAgdGhpcy5TaWduRGFuYmVpQnRuID0gdGhpcy5TaWduQWQuYXNDb20uZ2V0Q2hpbGRBdCg1KSBhcyBmYWlyeWd1aS5HQnV0dG9uO1xyXG5cclxuICAgICAgICB0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZT0oUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5TaG93U2lnbik7XHJcbiAgICAgICAgdGhpcy5zaWduTm9yYW1CdXR0b24udmlzaWJsZSA9IHRoaXMuU2lnblRpY2tJbWFnZS52aXNpYmxlO1xyXG4gICAgICAgIHRoaXMuU2lnbkRhbmJlaUJ0bi52aXNpYmxlID0gIXRoaXMuc2lnbk5vcmFtQnV0dG9uLnZpc2libGU7XHJcblxyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHNpZ25UaWNrQnV0dG9uLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNpZ25UaWNrQnV0dG9uRnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5zaWduQWRCdXR0b24sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2lnbkFkQnV0dG9uRnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5zaWduTm9yYW1CdXR0b24sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2lnbkFkQnV0dG9uRnVuICk7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSh0aGlzLlNpZ25EYW5iZWlCdG4sTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuU2lnbk5vcm1hbEJ1dHRvbkZ1bik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIG51bT10aGlzLlNpZ25JbmZvW1wiZGF5XCJdO1xyXG4gICAgICAgIHZhciBudW1JbmRleD0xMDA7XHJcbiAgICAgICAgaWYobnVtPDcpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBudW1JbmRleD0xMDA7XHJcbiAgICAgICAgfWVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG51bUluZGV4PTEwNztcclxuICAgICAgICAgICAgbnVtPW51bSU3O1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLlNpZ25QaUZ1PW51bGw7XHJcbiAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRNb25leT0wK1wiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuU2lnbkl0ZW0ubGVuZ3RoOyBpbmRleCsrKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgZGF0YT0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5HZXRSZXdhcmRDb25maWcoKG51bUluZGV4KzEraW5kZXgpKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBwaWZ1PW51bGw7XHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJyZXdhcmRfaXRlbVwiXSE9MTAwMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoTnVtYmVyKGRhdGFbXCJyZXdhcmRfaXRlbVwiXSk+NjAwMClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGlmdUluZGVkeD1OdW1iZXIoZGF0YVtcInJld2FyZF9pdGVtXCJdKSU2MDAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHBpZnU9UGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5HZXRTa2luQXR0cihwaWZ1SW5kZWR4KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhwaWZ1ICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICBcclxuICAgICAgICAgICAgdmFyIGlzT2s9dHJ1ZTtcclxuICAgICAgICAgICAgdmFyIGlzQ25hU2lnbj10cnVlO1xyXG4gICAgICAgICAgICBpZihpbmRleDxudW0pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlzT2s9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlzQ25hU2lnbj1mYWxzZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoaW5kZXg9PW51bSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaXNPaz1mYWxzZTtcclxuICAgICAgICAgICAgICAgIGlzQ25hU2lnbj10cnVlO1xyXG4gICAgICAgXHJcbiAgICAgICAgICAgIH1lbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlzT2s9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpc0NuYVNpZ249ZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHRleHQ7XHJcbiAgICAgICAgICAgIGlmKGluZGV4PDYpe1xyXG4gICAgICAgICAgICAgICAgdGV4dD1cIuesrCBcIisoaW5kZXgrMSkrXCIg5aSpXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIHRleHQ9XCLosarljY7nmq7ogqRcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLlNldFNpZ25JdGVtSW5mbyh0aGlzLlNpZ25JdGVtW2luZGV4XSx0ZXh0LGRhdGEsaXNPayxpc0NuYVNpZ24scGlmdSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0dGFkLlNob3diYW5uZXIoKTsvL1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKuetvuWIsCovXHJcbiAgICBwcml2YXRlIFNldFNpZ25JdGVtSW5mbyhfc2lnbkl0ZW06ZmFpcnlndWkuR0ltYWdlLHRleHQ6c3RyaW5nLGRhdGE6YW55LF9pc09rOmJvb2xlYW4sX2lzQ2FuU2lnbjpib29sZWFuLHBpZnU6YW55KVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xyXG4gICAgICAgIGlmKHBpZnU9PW51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygxMTExMTExMTExMTEpO1xyXG4gICAgICAgICAgICB2YXIgbXl0ZXh0PV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDIpIGFzIGZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICAgICAgICAgIG15dGV4dC50ZXh0PXRleHQ7XHJcbiAgICAgICAgICAgIHZhciBteW1vbmV5PV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDMpIGFzIGZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICAgICAgICAgIG15bW9uZXkudGV4dD1kYXRhW1wicmV3YXJkX251bVwiXTtcclxuICAgIFxyXG4gICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg1KS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoX2lzT2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDEpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg3KS52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKF9pc0NhblNpZ24pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDEpLnZpc2libGU9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDcpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRJdGVtPV9zaWduSXRlbTtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2lnblNlbGVjdGVkVGV4dD10ZXh0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRNb25leT1kYXRhW1wicmV3YXJkX251bVwiXTtcclxuICAgICAgICAgICAgICAgIC8vIHZhciBjaGlsZDE9X3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykgYXMgZmFpcnlndWkuR0J1dHRvbjtcclxuICAgICAgICAgICAgICAgIC8vIGNoaWxkMS52aXNpYmxlPXRydWU7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmFkZExpc3RlbmVyKGNoaWxkMSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMuU2lnbkJ1dHRvbkZ1bixudWxsKTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYWRkTGlzdGVuZXIoIGNoaWxkMSxMYXlhLkV2ZW50LkNMSUNLLHRoaXMsdGhpcy5TaWduQnV0dG9uRnVuICk7XHJcbiAgICAgICAgICAgIH1lbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDEpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygyMjIyMjIyMjIyKTtcclxuICAgICAgICAgICAgdmFyIG15dGV4dD1fc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgyKSBhcyBmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgICAgICAgICB2YXIgbXltb25leT1fc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgzKSBhcyBmYWlyeWd1aS5HVGV4dEZpZWxkO1xyXG4gICAgICAgICAgICBteW1vbmV5LnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgIHZhciBteWltYWdlPV9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDQpIGFzIGZhaXJ5Z3VpLkdUZXh0RmllbGQ7XHJcbiAgICAgICAgICAgIG15aW1hZ2UudmlzaWJsZT1mYWxzZTtcclxuICAgIFxyXG4gICAgICAgICAgICB2YXIgR0xvYWRlcj1fc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg1KSBhcyBmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoX2lzT2spXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEdMb2FkZXIuaWNvbiA9IEFzc2V0UGF0aC5nZXRyb2xlaWNvbiggcGlmdS5pY29uICk7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCgxKS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNikudmlzaWJsZT10cnVlO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT10cnVlO1xyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfWVsc2UgaWYoX2lzQ2FuU2lnbilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoMSkudmlzaWJsZT10cnVlO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDYpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNpZ25TZWxlY3RlZEl0ZW09X3NpZ25JdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TaWduU2VsZWN0ZWRUZXh0PXRleHQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNpZ25TZWxlY3RlZE1vbmV5PTArXCJcIjtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2lnblBpRnU9cGlmdTtcclxuICAgICAgICAgICAgICAgIEdMb2FkZXIudmlzaWJsZT10cnVlO1xyXG4gICAgICAgICAgICAgICAgR0xvYWRlci5pY29uID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCB0aGlzLlNpZ25QaUZ1Lmljb24gKTtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYWRkTGlzdGVuZXIoY2hpbGQxLExheWEuRXZlbnQuQ0xJQ0ssdGhpcy5TaWduQnV0dG9uRnVuLG51bGwpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hZGRMaXN0ZW5lciggY2hpbGQxLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLlNpZ25CdXR0b25GdW4gKTtcclxuICAgICAgICAgICAgfWVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgR0xvYWRlci5pY29uID0gQXNzZXRQYXRoLmdldHJvbGVpY29uKCBwaWZ1Lmljb24gKTtcclxuICAgICAgICAgICAgICAgIF9zaWduSXRlbS5hc0NvbS5nZXRDaGlsZEF0KDEpLnZpc2libGU9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBfc2lnbkl0ZW0uYXNDb20uZ2V0Q2hpbGRBdCg2KS52aXNpYmxlPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgX3NpZ25JdGVtLmFzQ29tLmdldENoaWxkQXQoNykudmlzaWJsZT1mYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBTaWduU2VsZWN0ZWRJdGVtOmZhaXJ5Z3VpLkdJbWFnZTtcclxuICAgIHByaXZhdGUgU2lnblNlbGVjdGVkVGV4dDpzdHJpbmc7XHJcbiAgICBwcml2YXRlIFNpZ25TZWxlY3RlZE1vbmV5OnN0cmluZztcclxuXHJcbiAgICBwcml2YXRlIFNpZ25QaUZ1OmFueTtcclxuXHJcbiAgICBwdWJsaWMgU2lnbkJ1dHRvbkZ1bigpXHJcbiAgICB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5pS25Y+W5LqGXCIpO1xyXG4gICAgICAgIGlmKHRoaXMuZ2V0U3lzdGVtVGltZT09dGhpcy5TaWduSW5mb1tcInRpbWVcIl0pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuU2lnbkFkLnZpc2libGU9dHJ1ZTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCx0aGlzLCgpPT57dGhpcy5zaWduTm9yYW1CdXR0b24udmlzaWJsZT10cnVlfSk7XHJcblxyXG4gICAgICAgIHRoaXMuU2V0U2lnbkl0ZW1JbmZvKHRoaXMuU2lnblNlbGVjdGVkSXRlbSx0aGlzLlNpZ25TZWxlY3RlZFRleHQsdGhpcy5TaWduU2VsZWN0ZWRNb25leSx0cnVlLGZhbHNlLHRoaXMuU2lnblBpRnUpO1xyXG4gICAgICAgIHRoaXMuU2F2ZVNpZ25EYXRhKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8q5Yu+6YCJ5pa55rOVKi9cclxuICAgIHByaXZhdGUgU2lnblRpY2tCdXR0b25GdW4oKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuU2lnblRpY2tJbWFnZS52aXNpYmxlPSF0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZTtcclxuICAgICAgICB0aGlzLlNpZ25EYW5iZWlCdG4udmlzaWJsZSA9ICF0aGlzLlNpZ25UaWNrSW1hZ2UudmlzaWJsZTtcclxuICAgICAgICB0aGlzLnNpZ25Ob3JhbUJ1dHRvbi52aXNpYmxlID0gdGhpcy5TaWduVGlja0ltYWdlLnZpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyrngrnlh7vop4bpopHlj4zlgI3pooblj5YqL1xyXG4gICAgcHJpdmF0ZSBTaWduQWRCdXR0b25GdW4oKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuV2luQWRCdXR0b25GdW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKuaZrumAmumihuWPliovXHJcbiAgICBwcml2YXRlIFNpZ25Ob3JtYWxCdXR0b25GdW4oKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuU2F2ZVNpZ25EYXRhKCk7XHJcbiAgICAgICAgaWYodGhpcy5TaWduVGlja0ltYWdlLnZpc2libGU9PXRydWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLldpbkFkQnV0dG9uRnVuKCk7XHJcbiAgICAgICAgfWVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICh0aGlzLmdldFByb3h5KCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuR29sZFVwKCBOdW1iZXIodGhpcy5TaWduU2VsZWN0ZWRNb25leSkgKiAxICk7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuU2lnblBpRnUhPW51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU2lnbkFkZFBpZnUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICBcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVVc2VyRGF0YUhhbmRsZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFNjZW5lQ29udHJvbC5Jc1Nob3dTaWduPWZhbHNlO1xyXG4gICAgICAgIHRoaXMuU2lnblBhbmVsLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0dGFkLkNsZWFyKCk7Ly87eS5XeEFwaS5TaG93VHh0KFwi562+5Yiw5oiQ5YqfXCIpXHJcbiAgICB9XHJcblxyXG4gICAgICAgICAgICAvKirog5zliKnnlYzpnaLlub/lkYrmjInpkq4qL1xyXG4gICAgICAgIHByaXZhdGUgV2luQWRCdXR0b25GdW4oKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLnrb7liLAuLi5cIik7XHJcbiAgICAgICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0dGFkLlNob3dWaWRlbygoZmxhZyk9PlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pKt5pS+6KeG6aKR6L+U5Zue5oiQ5YqfXCIrZmxhZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZmxhZylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pKt5pS+6KeG6aKR6L+U5ZueXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoIHRoaXMuZ2V0UHJveHkoIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UgKS5Hb2xkVXAoIE51bWJlcih0aGlzLlNpZ25TZWxlY3RlZE1vbmV5KSAqIDIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5TaWduUGlGdSE9bnVsbClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TaWduQWRkUGlmdSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2F2ZVNpZ25EYXRhKCk7Ly90aGlzLlNhdmVTaWduRGF0YSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2lnblBhbmVsLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLklzU2hvd1NpZ249ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlckRhdGFIYW5kbGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBwcml2YXRlIFBhb0t1U2lnbjpzdHJpbmc9XCJQYW9LdVNpZ25JbmZvXCI7XHJcbiAgICAgICAgU2lnbkluZm86YW55PW51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSBMb2FkU2lnbkRhdGEoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5TaWduSW5mbz17XCJkYXlcIjowLFwidGltZVwiOjAsXCJGaXNzdExvYWRcIjowfTtcclxuICAgICAgICAgICAgLy8gICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oXCJQYW9LdVNpZ25cIix0aGlzLlNpZ25JbmZvKTtcclxuICAgICAgICAgICAgdGhpcy5TaWduSW5mbz1MYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKHRoaXMuUGFvS3VTaWduKTtcclxuICAgICAgICAgICAgaWYodGhpcy5TaWduSW5mbz09MHx8dGhpcy5TaWduSW5mbz09bnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpbWU9dGhpcy5nZXRTeXN0ZW1UaW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNpZ25JbmZvPXtcImRheVwiOjAsXCJ0aW1lXCI6MCxcIkZpc3N0TG9hZFwiOjB9O1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SlNPTih0aGlzLlBhb0t1U2lnbix0aGlzLlNpZ25JbmZvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImFzZGFzZFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgU2F2ZVNpZ25EYXRhKClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuU2lnbkluZm9bXCJGaXNzdExvYWRcIl09MTtcclxuICAgICAgICAgICAgdGhpcy5TaWduSW5mb1tcImRheVwiXSsrO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5TaWduSW5mb1tcInRpbWVcIl09dGhpcy5nZXRTeXN0ZW1UaW1lKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKHRoaXMuUGFvS3VTaWduLHRoaXMuU2lnbkluZm8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBnZXRTeXN0ZW1UaW1lKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHZhciBjdXJEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgdmFyIG1vbnRoOiBudW1iZXIgPSBjdXJEYXRlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaciDpcIiArIG1vbnRoLnRvU3RyaW5nKCkpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHZhciBkYXRlOiBudW1iZXIgPSBjdXJEYXRlLmdldERhdGUoKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLml6U6XCIgKyBkYXRlLnRvU3RyaW5nKCkpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIoIChtb250aCArIFwiXCIgKyBkYXRlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgIHByaXZhdGUgU2lnbkFkZFBpZnUoKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNhY2hlZGF0YSA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuR2V0TG9jYWxDYUNoZURhdGEoIFVzZXJEYXRhSW5mby5za2luICk7XHJcbiAgICAgICAgICAgIC8vIHZhciBjYWNoZWRhdGEgPSBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRDYWNoZU9iaiggVXNlckNhY2hlVHlwZS5za2luICk7XHJcbiAgICAgICAgICAgIHZhciBpZD10aGlzLlNpZ25QaUZ1W1wiaWRcIl07XHJcbiAgICAgICAgICAgIHZhciBfc2tpblByb3h5OkFnZW5jeVNraW4gPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lTa2luICk7XHJcblxyXG4gICAgICAgICAgICB2YXIgcGlGdVZPOlNraW5EYXRhPW51bGxcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IF9za2luUHJveHkucGlmdUFyci5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcGlGdVZPPV9za2luUHJveHkucGlmdUFycltpbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZihwaUZ1Vk8ucm9sZUNGRy5pZD09aWQpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGlGdVZPLnN0YXRlID0gMTtcclxuICAgICAgICAgICAgQWdlbmN5U2tpbi5pbnN0YW5jZS5BZGRMb2NhbFNraW5EYXRhKHBpRnVWTy5yb2xlQ0ZHLmlkLHBpRnVWTy5zdGF0ZSxwaUZ1Vk8uaGFzbnVtKTtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3KTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bnmq7ogqRcIik7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNhY2hlZGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBcclxuXHJcbn0iLCJpbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtWaWV3QWN0aW9ufSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5U2tpblwiO1xyXG5pbXBvcnQge1NraW5JdGVtfSBmcm9tIFwiLi4vdXRpbHMvU2tpbkl0ZW1cIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHtVc2VySW5mb0V2ZW50fSBmcm9tIFwiLi4vRGF0YS9Vc2VySW5mb0V2ZW50XCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7UmVzb3VyY2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHtDaGFyYWN0ZXJTdGF0ZX0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyU3RhdGVcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge0NoYXJhY3RlclBvb2x9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclBvb2xcIjtcclxuaW1wb3J0IHtQbGF5ZXJ9IGZyb20gXCIuLi9HYW1lL1BsYXllclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNraW5QYW5lbCBleHRlbmRzIFBhbmVsQmFzZUNvbnRyb2wgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJTa2luUGFuZWxcIjtcclxuICAgIGNfdGl0bGU6ZmFpcnlndWkuQ29udHJvbGxlcjtcclxuICAgIGxpc3RfMDpmYWlyeWd1aS5HTGlzdDtcclxuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HQnV0dG9uO1xyXG4gICAgcHJpdmF0ZSBfdWkzRFNjZW5lOkxheWEuU2NlbmUzRDtcclxuICAgIHByaXZhdGUgX3VpY2FybWEzRDpMYXlhLkNhbWVyYTtcclxuICAgIC8vIHByaXZhdGUgX3VpbGlnaHQ6TGF5YS5EaXJlY3Rpb25MaWdodDtcclxuICAgIHByaXZhdGUgYWdlbmN5c2tpbjpBZ2VuY3lTa2luO1xyXG4gICAgcHJpdmF0ZSBfcm9sZW1vOkxheWEuU3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIF9pc2Rlc3RvcnlzOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCBcIm1haW5cIixcInNraW52aWV3XCIsZmFsc2UsVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsMCApOyBcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkZXN0b3J5cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY190aXRsZSA9IHRoaXMuZ2V0Q29udHJvbGxlckJ5QmFtZSggXCJjX3RpdGxlXCIgKTtcclxuICAgICAgICB0aGlzLmFnZW5jeXNraW4gPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lTa2luICk7XHJcbiAgICAgICAgdGhpcy5saXN0XzAuc2V0VmlydHVhbCgpO1xyXG4gICAgICAgIHRoaXMubGlzdF8wLml0ZW1SZW5kZXJlciA9IExheWEuSGFuZGxlci5jcmVhdGUoIHRoaXMsdGhpcy5pdGVtbGlzdHJlbmRlcixudWxsLGZhbHNlICk7XHJcbiAgICAgICAgdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMub25jaGFuZ2UoKTtcclxuICAgICAgICAvL+a3u+WKoDNE5Zy65pmvXHJcbiAgICAgICAgdGhpcy5fdWkzRFNjZW5lID0gdGhpcy5kaXNwbGF5T2JqZWN0LmFkZENoaWxkQXQobmV3IExheWEuU2NlbmUzRCgpLDApIGFzIExheWEuU2NlbmUzRDtcclxuICAgICAgICAvL+a3u+WKoOeFp+ebuOaculxyXG4gICAgICAgIHRoaXMuX3VpY2FybWEzRCA9ICh0aGlzLl91aTNEU2NlbmUuYWRkQ2hpbGQobmV3IExheWEuQ2FtZXJhKDAsIDAuMSwgODApKSkgYXMgTGF5YS5DYW1lcmE7XHJcbiAgICAgICAgLy8gdGhpcy5fdWljYXJtYTNELmNsZWFyQ29sb3IgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3VpY2FybWEzRC52aWV3cG9ydCA9IG5ldyBMYXlhLlZpZXdwb3J0KHRoaXMueCx0aGlzLnksdGhpcy53aWR0aCx0aGlzLmhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fdWljYXJtYTNELnRyYW5zZm9ybS50cmFuc2xhdGUobmV3IExheWEuVmVjdG9yMygwLDEuMiw1KSxmYWxzZSk7XHJcblxyXG4gICAgICAgIC8vIC8v5re75Yqg5pa55ZCR5YWJXHJcbiAgICAgICAgLy8gdGhpcy5fdWlsaWdodCA9IFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQobmV3IExheWEuRGlyZWN0aW9uTGlnaHQoKSkgYXMgTGF5YS5EaXJlY3Rpb25MaWdodDtcclxuICAgICAgICAvLyB0aGlzLl91aWxpZ2h0LmNvbG9yID0gbmV3IExheWEuVmVjdG9yMygwLjYsMC42LDAuNik7XHJcbiAgICAgICAgLy8gdGhpcy5fdWlsaWdodC50cmFuc2Zvcm0ud29ybGRNYXRyaXguc2V0Rm9yd2FyZChuZXcgTGF5YS5WZWN0b3IzKDEsIC0xLCAwKSk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlcm9sZUhhbmRsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX2Nsb3NlLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLm9uY2xvc2VmdW4gKTtcclxuICAgICAgICB0aGlzLkFkZEV2ZW50QnlUeXBlKCB0aGlzLmNfdGl0bGUsZmFpcnlndWkuRXZlbnRzLlNUQVRFX0NIQU5HRUQsdGhpcyx0aGlzLm9uY2hhbmdlICk7XHJcbiAgICAgICAgdGhpcy5hZGREYXRhRXZlbnQoIEdhbWVTdGF0ZS51cGRhdGVTS2luVmlldyx0aGlzLHRoaXMub25jaGFuZ2UgKTtcclxuICAgICAgICB0aGlzLmFkZERhdGFFdmVudCggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X3VwZGF0ZXJvbGVpZCx0aGlzLHRoaXMudXBkYXRlcm9sZUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIENsZWFyQ2hhcmFjdGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9yb2xlbW8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHNjcmlwdDpQbGF5ZXIgPSB0aGlzLl9yb2xlbW8uZ2V0Q29tcG9uZW50KCBQbGF5ZXIgKSBhcyBQbGF5ZXI7XHJcbiAgICAgICAgICAgIENoYXJhY3RlclBvb2wuQ2xlYXJDaGFyYWN0ZXIoIHRoaXMuX3JvbGVtbyxzY3JpcHQucmVzb3VzZU5hbWUsc2NyaXB0ICk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JvbGVtbyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25jbG9zZWZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggU2tpblBhbmVsICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNkZXN0b3J5cyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5DbGVhckNoYXJhY3RlcigpO1xyXG4gICAgICAgIGlmKCB0aGlzLl91aWNhcm1hM0QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fdWljYXJtYTNELmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5fdWljYXJtYTNEID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX3VpM0RTY2VuZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91aTNEU2NlbmUuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl91aTNEU2NlbmUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5kZXN0b3J5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNoYW5nZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RfMC5udW1JdGVtcyA9IHRoaXMuYWdlbmN5c2tpbi5waWZ1QXJyLmxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0XzAubnVtSXRlbXMgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGl0ZW1saXN0cmVuZGVyKCBpbmRleDpudW1iZXIsaXRlbTpTa2luSXRlbSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5jX3RpdGxlLnNlbGVjdGVkSW5kZXggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggaW5kZXggPCB0aGlzLmFnZW5jeXNraW4ucGlmdUFyci5sZW5ndGggKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnNob3dEYXRhKCB0aGlzLmFnZW5jeXNraW4ucGlmdUFycltpbmRleF0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZXJvbGVIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IHRoaXMuYWdlbmN5c2tpbi5Sb2xlRGF0YTtcclxuICAgICAgICB0aGlzLkNsZWFyQ2hhcmFjdGVyKCk7XHJcbiAgICAgICAgdmFyIHBhdGhBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6QXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKX0gKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLmxvYWRjb21wbGV0ZSxudWxsLHRydWUsUm9sZURhdGEucm9sZUNmZy5uYW1lICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfb3V0OkxheWEuUXVhdGVybmlvbiA9IG5ldyBMYXlhLlF1YXRlcm5pb247XHJcbiAgICBwcml2YXRlIGxvYWRjb21wbGV0ZSggcmVzb3VzZW5hbWU6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IHRoaXMuYWdlbmN5c2tpbi5Sb2xlRGF0YTtcclxuICAgICAgICBpZiggIXRoaXMuX2lzZGVzdG9yeXMgJiYgdGhpcy5fdWkzRFNjZW5lICYmIHJlc291c2VuYW1lID09IFJvbGVEYXRhLnJvbGVDZmcubmFtZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8gPSBDaGFyYWN0ZXJQb29sLkFkZENoYXJhY3RlciggcmVzb3VzZW5hbWUsUGxheWVyLHRoaXMuX3VpM0RTY2VuZSApO1xyXG4gICAgICAgICAgICB0aGlzLl9yb2xlbW8udHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggMCwyLDAgKTtcclxuICAgICAgICAgICAgTGF5YS5RdWF0ZXJuaW9uLmNyZWF0ZUZyb21BeGlzQW5nbGUoIG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICksLTEzNSoxODAvTWF0aC5QSSx0aGlzLl9vdXQgKTtcclxuICAgICAgICAgICAgdGhpcy5fcm9sZW1vLnRyYW5zZm9ybS5yb3RhdGlvbiA9IHRoaXMuX291dDtcclxuICAgICAgICAgICAgKCB0aGlzLl9yb2xlbW8uZ2V0Q29tcG9uZW50KCBQbGF5ZXIgKSBhcyBQbGF5ZXIgKS5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgXHJcblxyXG59IiwiaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbEJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcclxuaW1wb3J0IHtWaWV3QWN0aW9ufSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xyXG5pbXBvcnQge1NraW5EYXRhfSBmcm9tIFwiLi4vRGF0YS9Ta2luRGF0YVwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7QWdlbmN5VHJpYWx9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VHJpYWxcIjtcclxuaW1wb3J0IHtHdWFuZ0dhb30gZnJvbSBcIi4uL1dYU0RLL0d1YW5nR2FvXCI7XHJcbmltcG9ydCB7IHR0YWQgfSBmcm9tIFwiLi4vV1hTREsvdHRhZFwiO1xyXG5pbXBvcnQgeyBUaW1lclNlcnZpY2UgfSBmcm9tIFwiLi4vVGltZS9UaW1lclNlcnZpY2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmlhbFBhbmVsIGV4dGVuZHMgUGFuZWxCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIlRyaWFsUGFuZWxcIjtcclxuXHJcblxyXG4gICAgbG9hZF9pY29uOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBidG5fdmlkZW86ZmFpcnlndWkuR0J1dHRvbjtcclxuICAgIGJ0bl9jbG9zZTpmYWlyeWd1aS5HTG9hZGVyO1xyXG5cclxuICAgIHNraW5hcnI6QXJyYXk8U2tpbkRhdGE+O1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0dm86U2tpbkRhdGE7XHJcbiAgICBwcml2YXRlIGFnZW5jeXRyaWFsOkFnZW5jeVRyaWFsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCBhcnI6QXJyYXk8U2tpbkRhdGE+ICkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKFwibWFpblwiLFwic2hpeW9uZ1ZpZXdcIixmYWxzZSxWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZSwxKTsgXHJcbiAgICAgICAgdGhpcy5za2luYXJyID0gYXJyO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIub25Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWdlbmN5dHJpYWwgPSB0aGlzLmdldFByb3h5KCBBZ2VuY3lUcmlhbCApO1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSBHYW1lVXRpbHMucmFuZFJhbmdlaW50KCAwLHRoaXMuc2tpbmFyci5sZW5ndGgtMSApO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdHZvID0gdGhpcy5za2luYXJyWyBpbmRleCBdO1xyXG4gICAgICAgIHRoaXMubG9hZF9pY29uLnVybCA9IEFzc2V0UGF0aC5nZXRyb2xlaWNvbiggdGhpcy5fc2VsZWN0dm8ucm9sZUNGRy5pY29uICk7XHJcbiAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLmNyZWF0ZUJhbm5lciggXCJTaGlZb25nVmlld1wiICk7XHJcbiAgICAgICAgR3VhbmdHYW8uQ2hlYXRCYW5uZXIodGhpcy5idG5fY2xvc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5BZGRFdmVudEJ5VHlwZSggdGhpcy5idG5fY2xvc2UsTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMub25jbG9zZWZ1biApO1xyXG4gICAgICAgIHRoaXMuQWRkRXZlbnRCeVR5cGUoIHRoaXMuYnRuX3ZpZGVvLExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLnZpZGVvZnVuICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB2aWRlb2Z1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyBwaW5ndGFpdXRpbHMuSW5zdGFuY2UucGxheVZpZGVvKCBcIlwiLHRoaXMsdGhpcy52aWRlb2NhbGxiYWNrICk7XHJcbiAgICAgICAgdGhpcy52aWRlb2NhbGxiYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB2aWRlb2NhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHR0YWQuU2hvd1ZpZGVvKChpc0xvYWQ9PntcclxuICAgICAgICAgICAgaWYoaXNMb2FkKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWdlbmN5dHJpYWwuRXhpdFBhbmVsKCB0aGlzLl9zZWxlY3R2byApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbmNsb3NlZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYWdlbmN5dHJpYWwuRXhpdFBhbmVsKCBudWxsICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gR3VhbmdHYW8uQ2xlYXIoKTtcclxuICAgICAgICB0dGFkLkNsZWFyKCk7XHJcbiAgICAgICAgc3VwZXIuZGVzdG9yeSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgTGF5T1VUIH0gZnJvbSBcIi4uL3V0aWxzL0xheU9VVFwiO1xyXG5pbXBvcnQgeyBMYXlvdXRDb250cm9sIH0gZnJvbSBcIi4uL0NvbnRyb2wvTGF5b3V0Q29udHJvbFwiO1xyXG5pbXBvcnQge1BhbmVsQmFzZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuXHJcblxyXG4vKipcclxuICpcclxuICogQGF1dGhvciBcclxuICpcclxuICovXHJcbmV4cG9ydCBjbGFzcyBWaWV3TWFuYWdlciBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOiBWaWV3TWFuYWdlcjtcclxuICAgIC8qKlxyXG4gICAgICog5bey5rOo5YaM55qEVUlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfdmlld3M6IGFueTtcclxuXHJcblx0cHVibGljIGNvbnN0cnVjdG9yKCkgXHJcblx0e1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgVmlld01hbmFnZXIuaW5zID0gdGhpcztcclxuXHR9XHJcblx0XHJcblx0cHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpWaWV3TWFuYWdlclxyXG5cdHtcclxuXHQgICAgaWYoIFZpZXdNYW5hZ2VyLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmlld01hbmFnZXIoKTsgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBWaWV3TWFuYWdlci5pbnM7XHJcblx0fVxyXG5cclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3ZpZXdzID0ge307XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgfVxyXG5cdFxyXG4gICAgLyoqXHJcbiAgICAgKiAgdmlldyDop4blm77lr7nosaHnsbtcclxuICAgICAqICBkYXRhIOe7keWumuaVsOaNriDvvIggZGF0YSDlpoLmnpzkuI3kuLrnqbrvvIzku6PooajmnoTpgKDlh73mlbDkvKDlj4Ig77yJXHJcbiAgICAgKiAgbGF5ZXIg5bGC57qnXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGQoIHZpZXc6YW55LGRhdGE6YW55ID0gbnVsbCxsYXllcjogc3RyaW5nID0gTGF5T1VULlVJICk6YW55XHJcblx0e1xyXG4gICAgICAgIGlmKCB2aWV3LmtleSA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZpZXcgaGF2ZSBubyBrZXlcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0eXBlOiBzdHJpbmcgPSB2aWV3LmtleTtcclxuICAgICAgICBpZih0aGlzLl92aWV3c1t0eXBlXSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtdmlldzpmYWlyeWd1aS5HQ29tcG9uZW50ID0gdGhpcy5fdmlld3NbdHlwZV07XHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtdmlldztcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGQ6IGFueTtcclxuICAgICAgICBpZihkYXRhICE9IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZCA9IG5ldyB2aWV3KGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkID0gbmV3IHZpZXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZC52aWV3S2V5ID0gdmlldztcclxuICAgICAgICBkLmdhbWVMYXllciA9IGxheWVyO1xyXG4gICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuQWRkTGF5ZXJCeU5hbWUoIGQsbGF5ZXIgKTtcclxuICAgICAgICB0aGlzLl92aWV3c1t0eXBlXSA9IGQ7XHJcbiAgICAgICAgcmV0dXJuIGQ7XHJcblx0fVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreeVjOmdolxyXG4gICAgICogQHBhcmFtIHZpZXcg55WM6Z2iIFxyXG4gICAgICogQHBhcmFtIGlzYmdjbG9zZSDmmK/lkKbmmK/ngrnlh7vog4zmma/lhbPpl63nmoTnirbmgIEgXHJcbiAgICAgKiBAcGFyYW0gaXNwbGF5QW5tbyDmmK/lkKbmkq3mlL7lhbPpl63liqjnlLvvvIgg5Li76KaB55So5LqO5by65Yi25YWz6ZetIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2UoIHZpZXc6IGFueSxpc2JnY2xvc2U6Ym9vbGVhbj1mYWxzZSxpc3BsYXlBbm1vOmJvb2xlYW49dHJ1ZSApOnZvaWRcclxuXHR7XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIHZhciBpdGVtOiBQYW5lbEJhc2VDb250cm9sID0gdGhpcy5fdmlld3NbdHlwZV07XHJcbiAgICAgICAgaWYoIWl0ZW0pIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLkNsZWFyTGF5ZXJCeU5hbWUoIGl0ZW0uZ2FtZUxheWVyICk7XHJcbiAgICAgICAgaWYoaXNwbGF5QW5tbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGl0ZW0uRXhpdFZpZXcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5kZXN0b3J5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl92aWV3c1t0eXBlXTtcclxuXHR9XHJcblxyXG4gICAgcHVibGljIG9ucmVzaXplKCB3Om51bWJlcixoOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fdmlld3MgIT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbXZpZXc6UGFuZWxCYXNlQ29udHJvbDtcclxuICAgICAgICAgICAgZm9yKCB2YXIgaXRlbSBpbiB0aGlzLl92aWV3cyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGl0ZW12aWV3ID0gdGhpcy5fdmlld3NbaXRlbV07XHJcbiAgICAgICAgICAgICAgICBpdGVtdmlldy5zZXRTaXplKCB3LGggKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHRcclxuICAgIHB1YmxpYyBnZXRWaWV3KCB2aWV3OiBhbnkgKTphbnlcclxuXHR7XHJcbiAgICAgICAgdmFyIHR5cGU6IHN0cmluZyA9IHZpZXcua2V5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3c1t0eXBlXTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVjb21tZW5kIH0gZnJvbSBcIi4uL1B1c2gvUmVjb21tZW5kVmlld1wiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCBDaG91dGlQYW5WaWV3IGZyb20gXCIuLi9QdXNoL0Nob3V0aVBhblZpZXdcIjtcclxuXHJcbi8vIGltcG9ydCB7IE1haW4gfSBmcm9tIFwiLi4vTWFpblwiO1xyXG4vLyBpbXBvcnQgTGlzdEl0ZW0gZnJvbSBcIi4uL0dhbWVUb29scy9MaXN0SXRlbVwiO1xyXG4vLyBpbXBvcnQgeyBQYW5lbE1hbmFnZXIsIFBhbmVsVHlwZSB9IGZyb20gXCIuLi9WaWV3L1BhbmVsTWFuYWdlclwiO1xyXG4vLyBpbXBvcnQgR3VhbmdHYW8gZnJvbSBcIi4vR3VhbmdHYW9cIjtcclxuLy8gaW1wb3J0IHsgV1hTREsgfSBmcm9tIFwiLi9XWFNES1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZZSERfU2RrIHtcclxuICAgIHB1YmxpYyBzdGF0aWMgQWRfQ2xpY2tUeXBlID0ge1xyXG4gICAgICAgIFZpZGVvOiBcInZpZGVvX2NsaWNrXCIsXHJcbiAgICAgICAgV2F0Y2g6IFwid2F0Y2hcIixcclxuICAgICAgICBTaGFyZTogXCJzaGFyZVwiLFxyXG4gICAgICAgIEJhbm5lcjogXCJiYW5uZXJcIixcclxuICAgICAgICBQdXNoOiBcInB1c2hcIixcclxuICAgICAgICBQdXNoQ2xpY2s6XCJpY29uX2NsaWNrXCJcclxuICAgIH1cclxuXHJcbiAgICAvL+aYr+WQpuS4uueZveWQjeWNleeUqOaIt1xyXG4gICAgcHVibGljIHN0YXRpYyBpc3doaXRlOmJvb2xlYW47XHJcbiAgICAvL+aYr+WQpuS4uuaWsOeUqOaIt1xyXG4gICAgcHVibGljIHN0YXRpYyBpc25ld3VzZXI6Ym9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIHB1c2hEYXRhID0gW107XHJcbiAgICBwcml2YXRlIHN0YXRpYyBvcGVuaWQ6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzSGF2ZURhdGUgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dBZCA9IFwiU2hvd0FkXCI7XHJcbiAgICAvL+WIneWni+WMlnNka1xyXG4gICAgcHVibGljIHN0YXRpYyBJbml0U2RrKCkge1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5zdGFydFNkaygpO1xyXG4gICAgICAgIEZZSERfU2RrLlVzZXJJbmZvQXV0aCgpO1xyXG4gICAgICAgIC8vIGxldCB3aGl0ZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpc193aGl0ZVwiKTtcclxuICAgICAgICAvLyBpZih3aGl0ZSl7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmlzd2hpdGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNle1xyXG4gICAgICAgIC8vICAgICBGWUhEX1Nkay5nZXRXaGl0ZUNvbmZpZygpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gbGV0IG5ld3VzZXIgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaXNfbmV3dXNlclwiKTtcclxuICAgICAgICAvLyBpZighbmV3dXNlcil7XHJcbiAgICAgICAgLy8gICAgIEZZSERfU2RrLmlzbmV3dXNlciA9IHRydWU7XHJcbiAgICAgICAgLy8gICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJpc19uZXd1c2VyXCIsXCIxXCIpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBlbHNle1xyXG4gICAgICAgIC8vICAgICBGWUhEX1Nkay5pc25ld3VzZXIgPSBmYWxzZTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gRllIRF9TZGsuUHVzaERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+eUqOaIt+aOiOadg1xyXG4gICAgcHVibGljIHN0YXRpYyBVc2VySW5mb0F1dGgoKSB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuZ2V0RnloZFVzZXJJbmZvKG51bGwsIGZhbHNlLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuaXoOaOiOadg+WbnuiwgzpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0LnVzZXIpIHtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLm9wZW5pZCA9IGRhdGEucmVzdWx0LnVzZXIub3BlbmlkO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsuQXV0aEluZm8oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQXV0aEluZm8oKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSB7XHJcbiAgICAgICAgICAgIG9wZW5pZDogRllIRF9TZGsub3BlbmlkLFxyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkubG9naW5EYXRhKGFyZ3MsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5o6I5p2D5LiK5oql5Zue6LCDOlwiICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgICAgICBGWUhEX1Nkay5WYWx1ZVVzZXIoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIFZhbHVlVXNlcigpIHtcclxuICAgICAgICB2YXIgYXJncyA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS52YWx1ZXVzZXIoYXJncywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmnInmlYjnlKjmiLfkuIrmiqU6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgICBcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIGdldFdoaXRlQ29uZmlnKCl7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLndoaXRlQ29uZmlnKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIEZZSERfU2RrLmlzd2hpdGUgPSBlLmRhdGEuaXNfd2hpdGU7XHJcbiAgICAgICAgICAgIGlmKEZZSERfU2RrLmlzd2hpdGUpe1xyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImlzX3doaXRlXCIsXCIxXCIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnmb3lkI3ljZUtLS1cIixlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNldEh1VHVpTGlzdChsaXN0OiBMYXlhLkxpc3QsIHNjcm9sOiBudW1iZXIgPSAxLCB0eXBlOiBzdHJpbmcgPSBcIlwiKSB7IC8vc2Nyb2wgMTrnq5bnmoQgIDLmqKrnmoRcclxuICAgICAgICBsZXQgYXJyID0gdGhpcy5wdXNoRGF0YTtcclxuICAgICAgICBpZiAoIWFyciB8fCBhcnIubGVuZ3RoID09IDApIHJldHVybjtcclxuICAgICAgICBsaXN0LnNlbGVjdEVuYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIHNjcm9sID09IDEgPyBsaXN0LnZTY3JvbGxCYXJTa2luID0gXCJcIiA6IGxpc3QuaFNjcm9sbEJhclNraW4gPSBcIlwiO1xyXG4gICAgICAgIGxpc3QucmVuZGVySGFuZGxlciA9IExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy51cGRhdGVJdGVtLCBbdHlwZV0sIGZhbHNlKTtcclxuICAgICAgICBsaXN0LmFycmF5ID0gYXJyO1xyXG4gICAgICAgIGxpc3QucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdXBkYXRlSXRlbSh0eXBlOiBzdHJpbmcsIGNlbGw6IExheWEuQm94LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gdmFyIGFkaXRlbSA9IGNlbGwuZ2V0Q29tcG9uZW50KExpc3RJdGVtKSBhcyBMaXN0SXRlbTtcclxuICAgICAgICAvLyBhZGl0ZW0uUmVmcmVzaCh0eXBlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy/ngrnlh7vkuovku7bkuIrmiqVcclxuICAgIHB1YmxpYyBzdGF0aWMgQ2xpY2tBZChhZF90eXBlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeexu+Weiy0tLVwiLGFkX3R5cGUpO1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHBhcmFtID0ge1xyXG4gICAgICAgICAgICBhZF90eXBlOiBhZF90eXBlLFxyXG4gICAgICAgICAgICAvL+atpOWkhOa3u+WKoG9wZW5pZFxyXG4gICAgICAgICAgICBvcGVuaWQ6RllIRF9TZGsub3BlbmlkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi54K55Ye75Y+C5pWwOlwiICsgcGFyYW0pO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cuc2RrLmdldEZ5aGQoKS5hZHZlcnRpc2VtZW50KHBhcmFtLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueCueWHu+e7k+aenDpcIiArIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgIC8v5LqS5o6o5L+h5oGvXHJcbiAgICBwdWJsaWMgc3RhdGljIFB1c2hEYXRhKCkge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJwdXNoZGF0YS0tXCIsTWFpbi5XWCk7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICB2YXIgcGFyYW0gPSB7fTtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnNkay5nZXRGeWhkKCkuc2hhcmVSZWNvbW1lbmQocGFyYW0sIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi54Ot6Zeo5ri45oiP5pWw5o2uLS1cIixkYXRhKVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBGWUhEX1Nkay5wdXNoRGF0YSA9IGRhdGEuZGF0YTtcclxuICAgICAgICAgICAgICAgIEZZSERfU2RrLnB1c2hEYXRhLnNvcnQoRllIRF9TZGsuTGlzdFNvcnQpO1xyXG4gICAgICAgICAgICAgICAgRllIRF9TZGsuaXNIYXZlRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAvL+atpOWkhOa0vuWPkeS6i+S7tu+8jOWxleekuuS6kuaOqFxyXG4gICAgICAgICAgICAgICAgLy9FdmVudE1hbmFnZXIuZXZlbnQoRllIRF9TZGsuU2hvd0FkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluS6kuaOqOS/oeaBrzpcIiArIEpTT04uc3RyaW5naWZ5KEZZSERfU2RrLnB1c2hEYXRhKSk7XHJcbiAgICAgICAgICAgIG5ldyBSZWNvbW1lbmQoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd0h1VHVpSnVtcChkYXRhLG9wZW4pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIGlmIChkYXRhLmp1bXBfdHlwZSA9PSAyKSAvL+S6jOe7tOeggei3s+i9rOaWueazlVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5wcmV2aWV3SW1hZ2UoeyBjdXJyZW50OiBkYXRhLnFyY29kZSwgdXJsczogW2RhdGEucXJjb2RlXSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZGF0YS5qdW1wX3R5cGUgPT0gMSkgLy/nm7Tot7Pmlrnms5VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubmF2aWdhdGVUb01pbmlQcm9ncmFtKHtcclxuICAgICAgICAgICAgICAgIGFwcElkOiBkYXRhLnRvX2FwcGlkLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogZGF0YS5qdW1wX3BhdGgsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOaJk+W8gOaIkOWKn1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql5oiQ5YqfOlwiICsgSlNPTi5zdHJpbmdpZnkocmVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgRllIRF9TZGsuUHVzaENsaWNrKGRhdGEudG9fYXBwaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGZhaWwocmVzKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihvcGVuKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDaG91dGlQYW5WaWV3ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhLmp1bXBfdHlwZSA9PSAwKS8v5bmz5Y+w6Lez6L2s5pa55rOVXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm5hdmlnYXRlVG9NaW5pUHJvZ3JhbSh7XHJcbiAgICAgICAgICAgICAgICBhcHBJZDogZGF0YS5wbGF0Zm9ybV9hcHBpZCxcclxuICAgICAgICAgICAgICAgIHBhdGg6IGRhdGEuanVtcF9wYXRoLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyDmiZPlvIDmiJDlip9cclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuaKpeaIkOWKnzpcIiArIEpTT04uc3RyaW5naWZ5KHJlcykpO1xyXG4gICAgICAgICAgICAgICAgICAgIEZZSERfU2RrLlB1c2hDbGljayhkYXRhLnRvX2FwcGlkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmYWlsKHJlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYob3Blbil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ2hvdXRpUGFuVmlldyApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvL+S6kuaOqOeCueWHu1xyXG4gICAgcHVibGljIHN0YXRpYyBQdXNoQ2xpY2sodG9fYXBwaWQpIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIHZhciBwYXJhbSA9IHtcclxuICAgICAgICAgICAgb3BlbmlkOiBGWUhEX1Nkay5vcGVuaWQsXHJcbiAgICAgICAgICAgIHRvX2FwcGlkOiB0b19hcHBpZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy5zZGsuZ2V0RnloZCgpLnNoYXJlUGxheShwYXJhbSwgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLngrnlh7vkuIrmiqXnu5Pmnpw6XCIgKyBKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdFNvcnQoYSwgYik6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKE51bWJlcihhW1wicGFuZWxcIl0pIDwgTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoTnVtYmVyKGFbXCJwYW5lbFwiXSkgPT0gTnVtYmVyKGJbXCJwYW5lbFwiXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChOdW1iZXIoYVtcInBhbmVsXCJdKSA+IE51bWJlcihiW1wicGFuZWxcIl0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsIlxyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL1Nka1wiO1xyXG5pbXBvcnQgeyBTaGFyZVV0aWwgfSBmcm9tIFwiLi9TaGFyZVV0aWxcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi9GWUhEX1Nka1wiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4vdHRhZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFd4R2FtZUl0ZW1cclxue1xyXG4gICAgYXBwTmFtZUhpZGRlbjpib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb2xvcjpzdHJpbmcgPSBcIkM5M0IzQkZGXCI7XHJcbiAgICBzaXplOm51bWJlciA9IDEwMDtcclxuICAgIGJvcmRlcldpZHRoOm51bWJlciA9IDUwO1xyXG4gICAgYm9yZGVyQ29sb3I6c3RyaW5nID0gXCJBMUEwQTBGRlwiO1xyXG4gICAgbGVmdDpudW1iZXI7XHJcbiAgICB0b3A6bnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR3VhbmdHYW8gXHJcbntcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmc2Fhc2ZhZnNzZmE7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3VyYmFubmVyO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHZpZGVsQWRVbml0SWQgPSBcImFkdW5pdC0wYzY4NzA4NGM5MDhlZTg5XCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBiYW5uZXJBZFVuaXRJZCA9IFwiYWR1bml0LThjMmQ1ODYxMzVmYTZkNGZcIjtcclxuICAgIHByaXZhdGUgc3RhdGljIGFmc2ZzYWFmc2ZzYTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy/op4blsY/lub/lkYrmmK/lkKbliqDovb3miJDlip9cclxuICAgIHByaXZhdGUgc3RhdGljIGFzZmFzZnNhZmZzYTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHN0YXRpYyBnZXQgaGFzYmFubmVyKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuYmFubmVyKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBoYXN2aWRlbygpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICBpZihMYXlhLkJyb3dzZXIub25XZWlYaW4gJiYgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS52aWRlbylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2aWRlb251bSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuR2V0R2xvYmVcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy/pooTlhYjliqDovb3op4blsY/lub/lkYpcclxuICAgIHB1YmxpYyBzdGF0aWMgSW5pdFZpZGVvKClcclxuICAgIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbiB8fCAhUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS52aWRlbykgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmJhbm5lckFkVW5pdElkKTtcclxuXHJcbiAgICAgICAgLy92ZWRpb1xyXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogdGhpcy52aWRlbEFkVW5pdElkIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vbkxvYWQoKCkgPT4gXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygn5r+A5Yqx6KeG6aKRIOW5v+WRiuWKoOi9veaIkOWKnycpO1xyXG4gICAgICAgICAgICB0aGlzLmFzZmFzZnNhZmZzYSA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLm9uRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmv4DlirHop4blsY/liqDovb3lpLHotKU6XCIgKyBlcnIpO1xyXG4gICAgICAgICAgICB0aGlzLmFzZmFzZnNhZmZzYSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmFmc2ZzYWFmc2ZzYSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy/nnIvop4bpopFcclxuICAgIHB1YmxpYyBzdGF0aWMgU2hvd1ZpZGVvKGNhbGxiYWNrOiBGdW5jdGlvbikgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzdmlkZW8pIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYodGhpcy5hc2Zhc2ZzYWZmc2EpXHJcbiAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2hvd1ZpZGVvQWQ6XCIgKyB0aGlzLmFzZmFzZnNhZmZzYSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLlNldFZpZGVvQ2FsbEJhY2soY2FsbGJhY2spO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEuc2hvdygpLmNhdGNoKGVyciA9PiBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5sb2FkKCkudGhlbigoKSA9PiBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2V0VmlkZW9DYWxsQmFjayhjYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnNhYXNmYWZzc2ZhLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTaGFyZVV0aWwuc2hhcmVJbWFnZShcIuinhumikeayoeacieWIhuS6q1wiLCBjYWxsYmFja1xyXG4gICAgICAgICAgICAgICAgLy8gICAgICwgXCIxXCIpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfSBcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIFNoYXJlVXRpbC5zaGFyZUltYWdlKFwi6KeG6aKR5rKh5pyJ5YiG5LqrXCIsIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLCBcIjFcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIFNldFZpZGVvQ2FsbEJhY2soY2FsbGJhY2s6RnVuY3Rpb24pXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub2ZmQ2xvc2UoKTtcclxuICAgICAgICB0aGlzLmZzYWFzZmFmc3NmYS5vbkNsb3NlKHJlcyA9PiBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5r+A5Yqx6KeG6aKR5YWz6ZetOlwiK3Jlcy5pc0VuZGVkKTtcclxuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMuaXNFbmRlZCB8fCByZXMgPT09IHVuZGVmaW5lZCkge2NhbGxiYWNrICYmIGNhbGxiYWNrKHRydWUpfVxyXG4gICAgICAgICAgICBlbHNlIHsgY2FsbGJhY2sgJiYgY2FsbGJhY2soZmFsc2UpIH1cclxuICAgICAgICAgICAgdGhpcy5mc2Fhc2ZhZnNzZmEub2ZmQ2xvc2UoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY2Fuc2hvd2Jhbm5lciA9IHRydWU7XHJcbiAgICAvL+aJk+W8gGJhbm5lclxyXG4gICAgcHVibGljIHN0YXRpYyBPcGVuQmFubmVyKGdhcDogbnVtYmVyID0gMCxjYWxsVmFjazogRnVuY3Rpb24gPSBudWxsLCBpc3dhaXQ6IGJvb2xlYW4gPSBmYWxzZSkgXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYgKCF0aGlzLmhhc2Jhbm5lcilcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNhbGxWYWNrKG51bGwpO1xyXG4gICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gfSBcclxuXHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbldlaVhpbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhbGxWYWNrKG51bGwpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbnNob3diYW5uZXIgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhciBpZGQgPSB0aGlzLmJhbm5lckFkVW5pdElkO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRVbml0SWQ6XCIraWRkKTtcclxuICAgICAgICBsZXQgbmV3QmFubmVyID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVCYW5uZXJBZCh7XHJcbiAgICAgICAgICAgIGFkVW5pdElkOiBpZGQsXHJcbiAgICAgICAgICAgIHN0eWxlOiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiA0NjBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5ld0Jhbm5lci5vbkVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgIGNhbGxWYWNrKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5ld0Jhbm5lci5vbkxvYWQoKCkgPT4gXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJiYW5uZXIpIHRoaXMuY3VyYmFubmVyLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIgPSBuZXdCYW5uZXI7XHJcbiAgICAgICAgICAgIHZhciBoaWdodDogbnVtYmVyID0gdGhpcy5HZXRSZWFsSGlnaHQoZ2FwKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjYWxsVmFjayAhPSBudWxsKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FsbFZhY2soaGlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY2Fuc2hvd2Jhbm5lciAmJiAhaXN3YWl0KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEdldFJlYWxIaWdodChnYXApXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS53aWR0aCA9IGluZm8ud2luZG93V2lkdGg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS50b3AgPSBpbmZvLndpbmRvd0hlaWdodCAtIHRoaXMuY3VyYmFubmVyLnN0eWxlLnJlYWxIZWlnaHQgLSBnYXA7XHJcbiAgICAgICAgICAgIHJldHVybiBMYXlhLnN0YWdlLmhlaWdodCAvIGluZm8ud2luZG93SGVpZ2h0ICogdGhpcy5jdXJiYW5uZXIuc3R5bGUucmVhbEhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9jbGVhclxyXG4gICAgc3RhdGljIENsZWFyKClcclxuICAgIHtcclxuICAgICAgICBHdWFuZ0dhby5jbGVhclR3ZWVuKCk7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhckFsbCh0aGlzKTtcclxuICAgICAgICBMYXlhLlR3ZWVuLmNsZWFyQWxsKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY2Fuc2hvd2Jhbm5lciA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xyXG5cclxuICAgICAgICAvLyBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIC8vIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgaGlkZWJhbm5lcigpIFxyXG4gICAge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uV2VpWGluKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5oaWRlKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIHNob3diYW5uZXIoKSBcclxuICAgIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cmJhbm5lcikgdGhpcy5jdXJiYW5uZXIuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGNhbmNoZWF0KCk6Ym9vbGVhblxyXG5cdHtcclxuICAgICAgICBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmNoZWF0KXtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYoIVBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlYXQpXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImNoZWF0OmZhbHNlLT4gQ3VyQWNjb3VudERhdGEuY2hlYXQgIT0gMVwiKTtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIC8vIH1cclxuXHRcdC8vIHZhciBjaGVja3NjZW5jZSA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuY2hlY2tzY2VuY2U7XHJcbiAgICAgICAgLy8gaWYgKGNoZWNrc2NlbmNlID09IGZhbHNlKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJjaGVhdDp0cnVlLT4gXCIgKyBXeEFwaS5zY2VuZVZhbHVlKTtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGlmIChXeEFwaS5zY2VuZVZhbHVlID09IFwiMTAzN1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDU4XCJ8fCBXeEFwaS5zY2VuZVZhbHVlID09IFwiMTA2N1wiIHx8IFd4QXBpLnNjZW5lVmFsdWUgPT0gXCIxMDk1XCIpIFxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJjaGVhdDp0cnVlLT4gXCIgKyBXeEFwaS5zY2VuZVZhbHVlKTtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hlYXQ6ZmFsc2UtPiBcIiArIFd4QXBpLnNjZW5lVmFsdWUpO1xyXG4gICAgICAgIC8vIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGJhbm5lcmhpZ3QgPSAwO1xyXG4gICAgcHVibGljIHN0YXRpYyBTZXRQb3NCYW5uZXIoYnRuOkxheWEuVUlDb21wb25lbnQsY29tcGxldGU6RnVuY3Rpb24pXHJcbiAgICB7XHJcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLm9uUEMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wbGV0ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpbmZvID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coaW5mbyk7XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhidG4pO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coYnRuLnksTGF5YS5zdGFnZS5oZWlnaHQsaW5mby53aW5kb3dIZWlnaHQpO1xyXG4gICAgICAgIHZhciByZXNoaWdodCA9IGJ0bi55ICogaW5mby53aW5kb3dIZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcInJlc2hpZ2h0XCIscmVzaGlnaHQpO1xyXG5cclxuICAgICAgICB2YXIgaWRkID0gdGhpcy5iYW5uZXJBZFVuaXRJZDtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImFkVW5pdElkOlwiK2lkZCk7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VyYmFubmVyKSB0aGlzLmN1cmJhbm5lci5kZXN0cm95KCk7XHJcbiAgICAgICAgbGV0IG5ld0Jhbm5lciA9IExheWEuQnJvd3Nlci53aW5kb3cud3guY3JlYXRlQmFubmVyQWQoe1xyXG4gICAgICAgICAgICBhZFVuaXRJZDogaWRkLFxyXG4gICAgICAgICAgICBzdHlsZTogXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogNzIwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBuZXdCYW5uZXIub25FcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICBjb21wbGV0ZShmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbmV3QmFubmVyLm9uTG9hZCgoKSA9PiBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VyYmFubmVyID0gbmV3QmFubmVyO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gcmVzaGlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwidG9wXCIsdGhpcy5hc2dhZ2Fzc2dhLnN0eWxlLnRvcCk7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuY3VyYmFubmVyKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImJhbm5lciBzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDIzMDAsdGhpcywoKT0+XHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUudG9wID0gaW5mby53aW5kb3dIZWlnaHQgLSBHdWFuZ0dhby5iYW5uZXJoaWd0O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5ld0Jhbm5lci5vblJlc2l6ZSgocmVzKT0+XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHdWFuZ0dhby5iYW5uZXJoaWd0ID0gcmVzLmhlaWdodDtcclxuICAgICAgICAgICAgdGhpcy5jdXJiYW5uZXIuc3R5bGUud2lkdGggPSBpbmZvLndpbmRvd1dpZHRoO1xyXG4gICAgICAgICAgICB0aGlzLmN1cmJhbm5lci5zdHlsZS50b3AgPSByZXNoaWdodDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdHdlZW46TGF5YS5Ud2VlbjtcclxuICAgIC8v5oyJ6ZKu6K+v5a+8XHJcbiAgICBzdGF0aWMgQ2hlYXRCYW5uZXIoYnRuOmZhaXJ5Z3VpLkdPYmplY3QsY29tcGxldGU6RnVuY3Rpb24gPSBudWxsLGdhcCA9IDApXHJcbiAgICB7XHJcbiAgICAgICAgdHRhZC5TaG93YmFubmVyKCk7XHJcbiAgICAgICAgLy8gaWYoIUd1YW5nR2FvLmNhbmNoZWF0KVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJpZ25vcmVjaGVhdFwiKTtcclxuICAgICAgICAvLyAgICAgR3VhbmdHYW8uT3BlbkJhbm5lcigwLChoZWlnaHQpID0+XHJcbiAgICAgICAgLy8gICAgIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmKGhlaWdodCA9PSBudWxsKVxyXG4gICAgICAgIC8vICAgICAgICAge1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9KTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgYnRuLnkgPSBMYXlhLnN0YWdlLmhlaWdodC1idG4uaGVpZ2h0IC0gMTAwO1xyXG4gICAgICAgIC8vICAgICBHdWFuZ0dhby5PcGVuQmFubmVyKGdhcCwoaGVpZ2h0KSA9PiBcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYoaGVpZ2h0ID09IG51bGwpXHJcbiAgICAgICAgLy8gICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgIGVsc2VcclxuICAgICAgICAvLyAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNoZWF0c3RhcnRcIixcImJvdHRvbToxMDBcIik7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgLy8gYnRuLm1vdXNlRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHZhciBlbmQ9TGF5YS5zdGFnZS5oZWlnaHQtaGVpZ2h0LWJ0bi5oZWlnaHQgLSA4MDtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInk6XCIgKyBlbmQpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIExheWEudGltZXIub25jZShQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmNoZWF0dGltZSoxMDAwLHRoaXMsKCk9PlxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gYnRuLm1vdXNlRW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuc2hvd2Jhbm5lcigpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBHdWFuZ0dhby5jbGVhclR3ZWVuKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICBHdWFuZ0dhby50d2VlbiA9IExheWEuVHdlZW4udG8oYnRuLHt5OmVuZH0sMjAwLG51bGwsTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCgpPT5cclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgaWYoY29tcGxldGUgIT0gbnVsbClcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAvLyAgICAgICAgICAgICB9KVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9LHRydWUpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyVHdlZW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIEd1YW5nR2FvLnR3ZWVuIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEd1YW5nR2FvLnR3ZWVuLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIEd1YW5nR2FvLnR3ZWVuID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmV3YXJkZWRWaWRlb0FkO1xyXG4gICAgcHJpdmF0ZSBfZ2FtZUJhbm5lcjtcclxuICAgIHByaXZhdGUgX29uVmlkZW9DbG9zZTogRnVuY3Rpb247XHJcbiAgICBwcml2YXRlIF9vbkxvYWRWaWRlbzogRnVuY3Rpb247XHJcblxyXG4gICAgcHJpdmF0ZSBpc1ZpZGVvTG9hZENvbSA9IGZhbHNlO1xyXG4gICBwdWJsaWMgIGxvYWRWaWRlbyhjYj86IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHsgaWYgKGNiKSBjYih0cnVlKTsgcmV0dXJuIH07XHJcblxyXG4gICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gY2I7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9yZXdhcmRlZFZpZGVvQWQpIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gR3VhbmdHYW8udmlkZWxBZFVuaXRJZDtcclxuICAgICAgICAgICAgdGhpcy5fcmV3YXJkZWRWaWRlb0FkID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQoeyBhZFVuaXRJZDogaW5kZXggfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgaXNjID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5vbkxvYWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJbTE9HXSDmv4DlirHop4bpopHlub/lkYrliqDovb3miJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmlkZW9Mb2FkQ29tID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChpc2MpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlzYyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyAmJiB0aGlzLl9vbkxvYWRWaWRlbyh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gbnVsbDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5vbkVycm9yKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIltMT0ddIOa/gOWKseinhumikeW5v+WRiuWKoOi9veWksei0pVwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVmlkZW9Mb2FkQ29tID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyAmJiB0aGlzLl9vbkxvYWRWaWRlbyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyA9IG51bGw7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQub25DbG9zZShyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXMgfHwgcmVzLmlzRW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblZpZGVvQ2xvc2UgJiYgdGhpcy5fb25WaWRlb0Nsb3NlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVmlkZW9DbG9zZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblZpZGVvQ2xvc2UgJiYgdGhpcy5fb25WaWRlb0Nsb3NlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblZpZGVvQ2xvc2UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlkZW9Mb2FkQ29tKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyAmJiB0aGlzLl9vbkxvYWRWaWRlbyh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX29uTG9hZFZpZGVvID0gbnVsbDtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyAmJiB0aGlzLl9vbkxvYWRWaWRlbyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRWaWRlbyA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd1ZpZGVvKGNiPzogRnVuY3Rpb24pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgeyBpZiAoY2IpIGNiKHRydWUpOyByZXR1cm4gfTtcclxuICAgICAgICB0aGlzLl9vblZpZGVvQ2xvc2UgPSBjYjtcclxuICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQuc2hvdygpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jld2FyZGVkVmlkZW9BZC5sb2FkKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXdhcmRlZFZpZGVvQWQuc2hvdygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBTdGFnZSA9IExheWEuU3RhZ2U7XHJcbmltcG9ydCBXZWJHTCA9IExheWEuV2ViR0w7XHJcbmltcG9ydCBFdmVudCA9IExheWEuRXZlbnQ7XHJcbmltcG9ydCBIdHRwUmVxdWVzdCA9IExheWEuSHR0cFJlcXVlc3Q7XHJcbmltcG9ydCBUZXh0ID0gTGF5YS5UZXh0O1xyXG5pbXBvcnQgQnJvd3NlciA9IExheWEuQnJvd3NlcjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgTWFpbkNvbmZpZyB9IGZyb20gXCIuLi9NYWluQ29uZmlnXCI7XHJcbmltcG9ydCB7IFNoYXJlVXRpbCB9IGZyb20gXCIuL1NoYXJlVXRpbFwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuL1Nka1wiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi9UaW1lL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuXHJcbi8vIGNvbnN0IFBST1RPQ09MX1VSTDpzdHJpbmcgPSBcImh0dHBzOi8vcGlwZWxpbmVhcGkueHd4Z2FtZS5jb20vXCI7XHJcbmNvbnN0IFBST1RPQ09MX1VSTDpzdHJpbmcgPSBcImh0dHBzOi8vcGFya291cnJhY2V0b3V0aWFvMmFwaS54d3hnYW1lLmNvbS9cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQUk9UT0NPTFMge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgTG9naW5cdFx0XHRcdD0gXCJ1c2VyL2xvZ2luXCI7XHRcdFx0XHQvLyBub3QgdG9rZW5cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdhbWUgICAgICAgICAgICAgICAgID0gXCJnYW1lL3N0YXJ0XCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGVuZCAgICAgICAgICAgICAgICAgID0gXCJnYW1lL3BsYXlcIjtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNpZ24gICAgICAgICAgICAgID0gXCJzaWduL3NpZ25cIjtcclxuXHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwSGVybyAgICAgICAgICAgPSBcInRoZW1lL2VxdWlwSGVyb1wiO1xyXG4gICAgLy8gcHVibGljIHN0YXRpYyBCdXlIZXJvICAgICAgICAgICAgID0gXCJ0aGVtZS9idXlIZXJvXCI7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwSGF0ICAgICAgICAgICA9IFwidGhlbWUvZXF1aXBIYXRcIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQnV5SGF0ICAgICAgICAgICAgID0gXCJ0aGVtZS9idXlIYXRcIjtcclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQnV5RGFuY2UgICAgICAgICAgICAgPSBcInRoZW1lL2J1eURhbmNlXCI7XHJcbiAgICAvLyBwdWJsaWMgc3RhdGljIEVxdWlwRGFuY2UgICAgICAgICAgID0gXCJ0aGVtZS9lcXVpcERhbmNlXCI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBCdXk9XCJ0aGVtZS9idXlcIjtcclxuICAgIHB1YmxpYyBzdGF0aWMgRXF1aXA9XCJ0aGVtZS9lcXVpcFwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBzaGFyZSAgICAgICAgICAgICAgICA9IFwiZmlzc2lvbi9zaGFyZVwiO1xyXG4gICAgcHVibGljIHN0YXRpYyB2ZCAgICAgICAgICAgICAgICAgICA9IFwiZmlzc2lvbi92ZFwiO1xyXG4gICAgcHVibGljIHN0YXRpYyByZXZpdmFsICAgICAgICAgICAgICA9IFwiZ2FtZS9yZXZpdmFsXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGZpc3Npb24gICAgICAgICAgID0gXCJ0aGVtZS9maXNzaW9uXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRoZW1lZmlzc2lvbiAgICAgICAgICA9XCJ0aGVtZS9maXNzaW9uXCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIHRyZWFzdXJlICAgICAgID0gXCJ0cmVhc3VyZS9jbGlja1wiO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlnICAgICAgICAgICAgPSBcImNvbmZpZy90YWJsZVwiO1xyXG4gICAgcHVibGljIHN0YXRpYyBMb3R0ZXJ5PVwibG90dGVyeS9sb3R0ZXJ5XCI7XHJcbiAgICBwdWJsaWMgc3RhdGljIEdldEFjaGlldmU9XCJhY2hpZXZlbWVudC9nZXRSZXdhcmRzXCI7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyB1c2Vyc3luYyA9IFwidXNlci9zeW5jXCI7XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6TmV0d29ya01hbmFnZXI7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoTmV0d29ya01hbmFnZXIuaW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTmV0d29ya01hbmFnZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya01hbmFnZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoKVxyXG4gICAge1xyXG4gICAgICAgIE5ldHdvcmtNYW5hZ2VyLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24g55m75YWlXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBsb2dpbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIHB1YmxpYyBsb2dpbihwcm9ncmVzc2NiOkxheWEuSGFuZGxlciwgY29tcGxldGVjYjpMYXlhLkhhbmRsZXIsIGVycm9yY2I6TGF5YS5IYW5kbGVyKTogdm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB1c2VySW5mb3IgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50O1xyXG4gICAgICAgIHZhciB2ZXIgPSBHbG9iYWwuZ2FtZVZlcnNpb247XHJcblxyXG4gICAgICAgIGxldCBhcmdzOnN0cmluZyA9IGBjb2RlPSR7dXNlckluZm9yLkNvZGV9Jm5pY2tuYW1lPSR7dXNlckluZm9yLk5pY2tOYW1lfSZhdmF0YXI9JHt1c2VySW5mb3IuQXZhdGFyfSZnZW5kZXI9JHt1c2VySW5mb3IuR2VuZGVyfSZjb3VudHJ5PSR7dXNlckluZm9yLkNvdW50cnl9JnByb3ZpbmNlPSR7dXNlckluZm9yLlByb3ZpbmNlfSZjaXR5PSR7dXNlckluZm9yLkNpdHl9JiBkZXZpY2U9JHt1c2VySW5mb3IuRGV2aWNlfSQmc2hhcmVfaWQ9JHt1c2VySW5mb3IuU2hhcmVJZH0mc2NlbmU9JHt1c2VySW5mb3IuU2NlbmV9JnY9JHt2ZXJ9YDtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LlBST0dSRVNTLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RQcm9ncmVzcywgW3Byb2dyZXNzY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Qub25jZShFdmVudC5DT01QTEVURSwgdGhpcywgdGhpcy5vbkxvZ2luUmVxdWVzdENvbXBsZXRlLCBbY29tcGxldGVjYiwgaHR0cFJlcXVlc3RdKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RFcnJvciwgW2Vycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Quc2VuZChQUk9UT0NPTF9VUkwrUFJPVE9DT0xTLkxvZ2luICwgYXJncywgXCJwb3N0XCIsIFwidGV4dFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uSHR0cFJlcXVlc3RQcm9ncmVzcyhwcm9ncmVzc2NiOkxheWEuSGFuZGxlcixodHRwUmVxdWVzdDpIdHRwUmVxdWVzdClcclxuICAgIHtcclxuICAgICAgICBpZihwcm9ncmVzc2NiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJIdHRwUmVxdWVzdFByb2dyZXNzOi4uLlwiKTtcclxuICAgICAgICAgICAgcHJvZ3Jlc3NjYi5ydW4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkxvZ2luUmVxdWVzdENvbXBsZXRlKGNvbXBsZXRlY2I6TGF5YS5IYW5kbGVyLGh0dHBSZXF1ZXN0Okh0dHBSZXF1ZXN0KVxyXG4gICAge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCLnmbvlvZXmlbDmja7vvJpcIiwgaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICAgICAgbGV0IGRhdGE6IEpTT04gPSBKU09OLnBhcnNlKGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG5cdFx0XHRpZiAoZGF0YVtcImNvZGVcIl0gIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi55m75b2V5byC5bi46ZSZ6K+v77yB6ZSZ6K+v5L+h5oGv77yaXCIsIGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLnmbvlvZXlvILluLjplJnor6/vvIHplJnor6/kv6Hmga/vvJo9IFwiICsgZGF0YVtcImNvZGVcIl0sXCJodHRwUmVxdWVzdC5kYXRcIik7XHJcblx0XHRcdFx0Ly9jb21wbGV0ZWNiLnJ1bldpdGgoZGF0YSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFBsYXllckFjY291bnQuU2VydmVyVGltZSA9IGRhdGFbXCJ0XCJdO1xyXG4gICAgICAgICAgICBUaW1lc1RhbXBlci5JbnN0YW5jZS51cGRhdGVTZXJ2aWNlVGltZSggTnVtYmVyKGRhdGFbXCJ0XCJdKSApO1xyXG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIueZu+W9leato+W8j+aIkOWKn1wiKTtcclxuICAgICAgICAgICAgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5TZXRBY2NvdW50RGF0YShkYXRhLGNvbXBsZXRlY2IpO1xyXG4gICAgICAgICAgICAvLyBTaGFyZVV0aWwuU2hhcmVNZXNzYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkh0dHBSZXF1ZXN0RXJyb3IoZXJyb3JjYjpMYXlhLkhhbmRsZXIsaHR0cFJlcXVlc3Q6SHR0cFJlcXVlc3QpXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKGVycm9yY2IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBlcnJvcmNiLnJ1bldpdGgoaHR0cFJlcXVlc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIkVycm9yISBIdHRwIHJlcXVlc3QgZXJyb3IuLiBcIiAsXCJodHRwUmVxdWVzdC5kYXRcIik7XHJcbiAgICAgICAgV3hBcGkuU2hvd0xvYWRpbmcoXCLov57mjqXnvZHnu5zlpLHotKUuLi5cIik7XHJcbiAgICAgICAgTGF5YS50aW1lci5vbmNlKDgwMDAsdGhpcywoKT0+e1d4QXBpLkhpZGVMb2FkaW5nKCk7fSlcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yISBIdHRwIHJlcXVlc3QgZXJyb3IuLi5cIiArIGh0dHBSZXF1ZXN0LmRhdGEpO1xyXG4gICAgfVxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgICBcclxuXHJcbiAgICAvKlxyXG4gICAgKiDpgJrnlKhIdHRwIFBvc3TljY/orq7lj5HpgIFcclxuICAgICogcHJvdG9jb2wgXHRcdOWvueW6lOKAnFBST1RPQ09MU+KAneWtl+WFuOS4reWNj+iuruWQjeensFxyXG4gICAgKiBoYXNUb2tlblx0XHTmmK/lkKbkvb/nlKh0b2tlbu+8jOebruWJjeWPquaciWxvZ2lu5Y2P6K6u5LiN6ZyA6KaBdG9rZW7vvIzlhbbku5bpg73pnIDopoF0b2tlbu+8jOaJgOS7peatpOWkhOiHquWKqOe7hOWQiFxyXG4gICAgKiBwYXJhbVx0XHRcdOWPguaVsOWIl+ihqO+8jGtleeaYr+Wtl+auteWQje+8jHZhbOaYr+WAvO+8jOWAvOmcgOimgeWFiOi9rHN0cmluZ1xyXG4gICAgKiBjb21wbGV0ZWNiXHTljY/orq7lj5HpgIHmiJDlip/lm57osIPlh73mlbBcclxuICAgICogZXJyb3JjYlx0XHTljY/orq7lj5HpgIHlpLHotKXlm57osIPlh73mlbBcclxuICAgICogcmV0dXJuXHRcdOi/lOWbnuWAvOS4unZvaWRcclxuICAgICovXHJcbiAgICBwdWJsaWMgSHR0cFBvc3RSZXF1ZXN0KHByb3RvY29sOnN0cmluZywgcGFyYW06QXJyYXk8e1trZXk6c3RyaW5nXTpzdHJpbmd9PiwgY29tcGxldGVjYjpMYXlhLkhhbmRsZXIsIGVycm9yY2I6TGF5YS5IYW5kbGVyLCBoYXNUb2tlbjpib29sZWFuID0gdHJ1ZSk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBsZXQgYXJnczpzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGxldCB1cmw6c3RyaW5nID0gUFJPVE9DT0xfVVJMICsgcHJvdG9jb2w7XHJcbiAgICAgICAgLy8gY2hlY2hrIGFkZCB0b2tlblxyXG4gICAgICAgIHZhciBhY2NvdW50ID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudDtcclxuICAgICAgICB2YXIgYWNjb3VudGRhdGEgPSBhY2NvdW50LkN1ckFjY291bnREYXRhO1xyXG4gICAgICAgIGlmIChoYXNUb2tlbiA9PSB0cnVlKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGFyZ3MgPSBgdG9rZW49JHthY2NvdW50ZGF0YS5tX3Rva2VufSZgO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgV3hBcGkuU2hvd0xvYWRpbmcoXCLov57mjqXnvZHnu5zkuK0uLi5cIik7XHJcbiAgICAgICAgaWYgKHByb3RvY29sID09IFBST1RPQ09MUy5nYW1lIHx8IHByb3RvY29sID09IFBST1RPQ09MUy5lbmQgfHwgcHJvdG9jb2wgPT0gUFJPVE9DT0xTLmZpc3Npb24gfHwgcHJvdG9jb2wgPT0gUFJPVE9DT0xTLnZkfHxcclxuICAgICAgICAgICAgcHJvdG9jb2w9PVBST1RPQ09MUy50aGVtZWZpc3Npb258fHByb3RvY29sPT1QUk9UT0NPTFMuTG90dGVyeSB8fCBwcm90b2NvbCA9PSBQUk9UT0NPTFMudXNlcnN5bmMpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsZXQgc3RyICA9IFwiYWJjZGVmZ2hpamtpbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCI7XHJcbiAgICAgICAgICAgIGxldCBjb2RlID0gXCJ7XCI7XHJcbiAgICAgICAgICAgIGxldCBtYXNrID0gXCJcIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBtYXNrICs9IHN0cltNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogMTAwKSAlIHN0ci5sZW5ndGhdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbVtpXSkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kZSArPSBgXFxcIiR7a2V5fVxcXCI6XFxcIiR7cGFyYW1baV1ba2V5XX1cXFwiYDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChpIDwgcGFyYW0ubGVuZ3RoIC0gMSkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kZSArPSBcIixcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2RlICs9IFwifVwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFyZ3MgKz0gXCJfcj1cIiArIG1hc2sgKyB0aGlzLmJhc2U2NEVuY29kZShjb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtLmxlbmd0aDsgaSsrKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gcGFyYW1baV0pIFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbDpzdHJpbmcgPSBwYXJhbVtpXVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IGAke2tleX09JHt2YWx9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJhbS5sZW5ndGggLSAxKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSBcIiZcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaHR0cFJlcXVlc3QgPSBuZXcgSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICBodHRwUmVxdWVzdC5vbmNlKEV2ZW50LkNPTVBMRVRFLCB0aGlzLCB0aGlzLm9uSHR0cFJlcXVlc3RDb21wbGV0ZSwgW2NvbXBsZXRlY2IsIGVycm9yY2IsIGh0dHBSZXF1ZXN0XSk7XHJcbiAgICAgICAgaHR0cFJlcXVlc3Qub25jZShFdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkh0dHBSZXF1ZXN0RXJyb3IsIFtlcnJvcmNiLCBodHRwUmVxdWVzdF0pO1xyXG4gICAgICAgIGh0dHBSZXF1ZXN0LnNlbmQodXJsLCBhcmdzLCBcInBvc3RcIiwgXCJ0ZXh0XCIpO1xyXG4gICAgfVxyXG4gICAgICAgIFxyXG4gICAgcHJpdmF0ZSBvbkh0dHBSZXF1ZXN0Q29tcGxldGUoc3VjY2VlZGNiOkxheWEuSGFuZGxlciwgZmFpbHVyZWNiOkxheWEuSGFuZGxlciwgaHR0cFJlcXVlc3Q6SHR0cFJlcXVlc3QpOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgV3hBcGkuSGlkZUxvYWRpbmcoKTtcclxuICAgICAgICBsZXQgZGF0YTogSlNPTiA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QuZGF0YSk7XHJcbiAgICAgICAgaWYgKGRhdGFbXCJjb2RlXCJdID09IDApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LlNldEFjY291bnREYXRhKGRhdGEsbnVsbCk7XHJcbiAgICAgICAgICAgIGlmIChzdWNjZWVkY2IgIT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3VjY2VlZGNiLnJ1bldpdGgoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKGZhaWx1cmVjYiAhPSBudWxsKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmFpbHVyZWNiLnJ1bldpdGgoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3IhIEh0dHAgcmVxdWVzdCBjb21wbGV0ZSBlcnJvciwgY29kZTogXCIgKyBkYXRhW1wiY29kZVwiXSArIFwiIG1lc3NhZ2U6IFwiICsgZGF0YVtcIm1lc3NhZ2VcIl0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJhc2U2NEVuY29kZSAoc3RyKTpzdHJpbmcge1xyXG4gICAgICAgIHZhciBjMSwgYzIsIGMzO1xyXG4gICAgICAgIHZhciBiYXNlNjRFbmNvZGVDaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiO1xyXG4gICAgICAgIHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aCwgc3RyaW5nID0gJyc7XHJcbiAgICAgICAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgICAgICAgIGMxID0gc3RyLmNoYXJDb2RlQXQoaSsrKSAmIDB4ZmY7XHJcbiAgICAgICAgICBpZiAoaSA9PSBsZW4pIHtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzEgJiAweDMpIDw8IDQpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9PVwiO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQoaSsrKTtcclxuICAgICAgICAgIGlmIChpID09IGxlbikge1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMxID4+IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KCgoYzEgJiAweDMpIDw8IDQpIHwgKChjMiAmIDB4RjApID4+IDQpKTtcclxuICAgICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoYzIgJiAweEYpIDw8IDIpO1xyXG4gICAgICAgICAgICBzdHJpbmcgKz0gXCI9XCI7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYzMgPSBzdHIuY2hhckNvZGVBdChpKyspO1xyXG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdChjMSA+PiAyKTtcclxuICAgICAgICAgIHN0cmluZyArPSBiYXNlNjRFbmNvZGVDaGFycy5jaGFyQXQoKChjMSAmIDB4MykgPDwgNCkgfCAoKGMyICYgMHhGMCkgPj4gNCkpO1xyXG4gICAgICAgICAgc3RyaW5nICs9IGJhc2U2NEVuY29kZUNoYXJzLmNoYXJBdCgoKGMyICYgMHhGKSA8PCAyKSB8ICgoYzMgJiAweEMwKSA+PiA2KSk7XHJcbiAgICAgICAgICBzdHJpbmcgKz0gYmFzZTY0RW5jb2RlQ2hhcnMuY2hhckF0KGMzICYgMHgzRilcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cmluZztcclxuICAgICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFBsYXRmcm9tVHlwZVxyXG4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiDnlLXohJFcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBjOnN0cmluZyA9IFwicGNcIjtcclxuICAgIC8qKlxyXG4gICAgICog5b6u5L+h5bCP5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB3eDpzdHJpbmcgPSBcInd4XCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBxceWwj+a4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXE6c3RyaW5nID0gXCJxcVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5oqW6Z+zXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0dDpzdHJpbmcgPSBcInR0XCI7XHJcbn0iLCJpbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5fSBmcm9tIFwiLi4vdXRpbHMvRGljdGlvbmFyeVwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyLCBQUk9UT0NPTFMgfSBmcm9tIFwiLi9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuXHJcblxyXG5leHBvcnQgZW51bSByZXF1aXJldHlwZSB7XHJcbiAgICDns7vnu5/otaDpgIEgPSAxLCDph5HluIHotK3kubAgPSAyLCDop4LnnIvop4bpopEgPSAzLCDliIbkuqsgPSA0LCDnrb7liLAgPSA1LCDmtLvliqggPSA2LCDpgJrov4flhbPljaEgPSA3LCDntK/orqHnmbvpmYYgPSA4LCDpgoDor7fkurrmlbDovr7liLAgPSA5LCDnoJbnn7PotK3kubAgPSAxMFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBBY2NvdW50Q29uZmlnIHtcclxuICAgIGNyb3AsdGhpbmdzLCBsYW5kLCBnbG9iYWwsIGVudGl0eSwgc2lnbiwgcmV3YXJkcywgYWNoaWV2ZW1lbnQsIGludml0ZSwgbWlzc2lvbiwgdHJlYXN1cmVfY2xpY2ssIHRoZW1lLCBsb3R0ZXJ5XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEFjY291bnRVc2VyIHtcclxuICAgIG1vbmV5LCBkaWFtb25kLCB1c2VyX2lkLCBnYW1lX3RpbWVzLCBnZXRfdGhlbWVzLCB2aWRlb190aW1lcywgZXF1aXBfdGhlbWVzLCBsYXN0X2FjdGlvbl90aW1lLCBsYXN0X2Zhdm9yaXRlX3RpbWUsIHByb2dyZXNzX3RoZW1lcywgcmV2aXZhbCwgc3RhZ2Usdm1vbmV5XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIGhlcm9BdHRyIHtcclxuICAgIGlkLCBuYW1lLCBxdWFsaXR5LCBpY29uLCBwcmVmYWIsIHJlcXVpcmVfbnVtLCByZXF1aXJlX3R5cGVcclxufVxyXG5cclxuZXhwb3J0IGVudW0gc2lnbmRhdGEge1xyXG4gICAgc2lnbl9kYXlzLCBzaWduX3RpbWVcclxufVxyXG5cclxuZXhwb3J0IGVudW0gZW50aXR5IHtcclxuICAgIGlkLCBuYW1lLCBlbnRpdHlfaWQsIGljb25cclxufVxyXG5cclxuZXhwb3J0IGVudW0gc2tpbmF0dHIge1xyXG4gICAgZWZmZWN0VmFsdWVfMSxcclxuICAgIGVmZmVjdFZhbHVlXzIsXHJcbiAgICBlZmZlY3RWYWx1ZV8zLFxyXG4gICAgZWZmZWN0VmFsdWVfNFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWNjb3VudERhdGEge1xyXG4gICAgY29uc3RydWN0b3IoX3Rva2VuOiBzdHJpbmcsIF9jb25maWc6IE9iamVjdCwgX2FwcFNldHRpbmc6IE9iamVjdCwgX3VzZXI6IE9iamVjdCwgX3VzZXJiYXNlOiBPYmplY3QsIF91c2VJbnZpdGU6IE9iamVjdCA9IG51bGwsIF91c2VyX3N0YWdlOiBPYmplY3QgPSBudWxsLCBfdXNlcl9zaWduLCBfdXNlcl9hY2hpZXZlbWVudCwgX2xvdHRlcnksX3VzZV9sYW5kX3Rhc2ssX3VzZXJfdmlkZW8pIHtcclxuICAgICAgICB0aGlzLm1fdG9rZW4gPSBfdG9rZW47XHJcbiAgICAgICAgdGhpcy5tX2FwcF9zZXR0aW5nID0gX2FwcFNldHRpbmc7XHJcbiAgICAgICAgdGhpcy5tX3VzZXIgPSBfdXNlcjtcclxuICAgICAgICB0aGlzLm1fdXNlcl9iYXNlID0gX3VzZXJiYXNlO1xyXG4gICAgICAgIHRoaXMubV9zaWduID0gX3VzZXJfc2lnbjtcclxuICAgICAgICB0aGlzLm1fdGFzayA9IF91c2VyX2FjaGlldmVtZW50O1xyXG4gICAgICAgIHRoaXMubG90dGVyeSA9IF9sb3R0ZXJ5O1xyXG4gICAgICAgIHRoaXMubV91c2VfbGFuZF90YXNrID0gX3VzZV9sYW5kX3Rhc2s7XHJcbiAgICAgICAgdGhpcy5tX3VzZXJfdmlkZW8gPSBfdXNlcl92aWRlbztcclxuICAgICAgICB0aGlzLnVzZXJJZCA9IHRoaXMubV91c2VyW1widXNlcl9pZFwiXTtcclxuICAgICAgICB0aGlzLm9wZW5pZCA9IHRoaXMubV91c2VyX2Jhc2VbXCJvcGVuaWRcIl07XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ1c2VyX2lkOlwiICsgdGhpcy51c2VySWQpO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coXCJvcGVuX2lkOlwiK3RoaXMub3BlbmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbV90b2tlbjogc3RyaW5nO1xyXG4gICAgcHVibGljIG1fY29uZmlnczogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fYXBwX3NldHRpbmc6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZXI6IE9iamVjdDtcclxuICAgIHB1YmxpYyBtX3VzZXJfYmFzZTogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fc2lnbjogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fdGFzazogT2JqZWN0O1xyXG4gICAgcHVibGljIG1fdXNlX2xhbmRfdGFzazphbnk7XHJcbiAgICBwdWJsaWMgbV91c2VyX3ZpZGVvOk9iamVjdDtcclxuICAgIHB1YmxpYyBvcGVuaWQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIHVzZXJJZDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBsb3R0ZXJ5OiBhbnk7XHJcbiAgICBwdWJsaWMgcm9hZGNvbmZpZzogeyBba2V5OiBudW1iZXJdOiBhbnkgfSA9IHt9O1xyXG4gICAgcHVibGljIG1fUmV3YXJkRGljOiBPYmplY3QgPSB7fTtcclxuICAgIHB1YmxpYyBtX0VudGl0eURpYzogeyBba2V5OiBudW1iZXJdOiBhbnkgfSA9IHt9O1xyXG4gICAgcHVibGljIG1fQWNoaWV2ZW1lbnREaWM6IE9iamVjdCA9IHt9O1xyXG4gICAgLy8gcHVibGljIG1fc2tpbkRpYzpEaWN0aW9uYXJ5PG51bWJlcixTa2luRGF0YT4gPSBuZXcgRGljdGlvbmFyeSgpO1xyXG5cclxuICAgIC8v6I635Y+W546p5a626JC95YWl56m65Lit5q275Lqh6Led56a7XHJcbiAgICBwdWJsaWMgZ2V0IERpZURpc3RhbmNlKCk6bnVtYmVye1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiRGllRGlzdGFuY2VcIl0pO1xyXG4gICAgfVxyXG4gICAgLy/ojrflj5blvIDlsYDnoLjom4vlh6DnjodcclxuICAgIHB1YmxpYyBnZXQgSGl0RWdnKCk6bnVtYmVye1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiSGl0RWdnXCJdKTtcclxuICAgIH1cclxuICAgIC8v6I635Y+W57uT566X5ZCO56C46JuL5Ye6546w5Yeg546HXHJcbiAgICBwdWJsaWMgZ2V0IEVuZENoZWF0KCk6bnVtYmVye1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiRW5kQ2hlYXRcIl0pO1xyXG4gICAgfVxyXG4gICAgLy/ojrflj5bor6/op6blpZblirHph5HluIHmlbBcclxuICAgIHB1YmxpYyBnZXQgQ2hlYXRSZXdhcmQoKTpudW1iZXJ7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJDaGVhdFJld2FyZFwiXSk7XHJcbiAgICB9XHJcbiAgICAvL+eZveWQjeWNleeUqOaIt1xyXG4gICAgcHVibGljIGdldCBXaGl0ZVVzZXIoKTpib29sZWFue1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJXaGl0ZVVzZXJcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy/nrb7liLDlip/og73mmK/lkKblvIDlkK9cclxuICAgIHB1YmxpYyBnZXQgU3RyYXRlZ3lTd2l0Y2goKTpib29sZWFue1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJTdHJhdGVneVN3aXRjaFwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuXHJcbiAgICAvL+etvuWIsOWKn+iDveaYr+WQpuW8gOWQr1xyXG4gICAgcHVibGljIGdldCBTaG93U2lnbigpOmJvb2xlYW57XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIlNob3dTaWduXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgLy/oh6rliqjli77pgIlcclxuICAgIHB1YmxpYyBnZXQgQ2hvb3NlKCk6Ym9vbGVhbntcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hvb3NlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgLy/lj5HotbfmjJHmiJjmjInpkq7lvIDlhbNcclxuICAgIHB1YmxpYyBnZXQgU2hvd0JhdHRsZUJ0bigpOmJvb2xlYW57XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIlNob3dCYXR0bGVCdG5cIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBsb3R0ZXJ5dGltZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5sb3R0ZXJ5W1wiZGF5X3ZpZGVvX3RpbWVzXCJdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNoYXJlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHNoYXJlY29udGVudCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFyZWNvbnRlbnRcIl07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IFNoYXJlSW1hZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiU2hhcmVJbWFnZVwiXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY2hlYXR0aW1lKCkge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY2hlYXR0aW1lXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgYmFubmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJiYW5uZXJcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHZpZGVvKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJ2aWRlb1wiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgQnRuQ2FuTW92ZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiQnRuQ2FuTW92ZVwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY2hlY2tzY2VuY2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImNoZWNrc2NlbmNlXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJfZGlzKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJiYW5uZXJfZGlzXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgYmFubmVyTW92ZVRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lck1vdmVUaW1lXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY3JlYXRlQmFubmVyVGltZXMoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImNyZWF0ZUJhbm5lclRpbWVzXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgYmFubmVyTW92ZVByb3AoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcImJhbm5lck1vdmVQcm9wXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXNTaGFyZVRoZW5WaWRlbygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiaXNTaGFyZVRoZW5WaWRlb1wiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXNTaG93SHVpVHVpKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJpc1Nob3dIdWlUdWlcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHN0YXJ0X3NwcmludCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wic3RhcnRfc3ByaW50XCJdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IElzVmlkZW9Nb2RlbCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wiSXNWaWRlb01vZGVsXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB2aWRlb01vZGVsTnVtKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJ2aWRlb01vZGVsTnVtXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgVmlkZW9Nb2RlbFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcIlZpZGVvTW9kZWxUaXRsZVwiXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgZmFpbGNvdW50KCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJmYWlsY291bnRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBzcG1pbnNwZWVkKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fYXBwX3NldHRpbmdbXCJzcG1pbnNwZWVkXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgYmdtKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJiZ21cIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjYW1lcmFoaWdodCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiY2FtZXJhaGlnaHRcIl0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjdG5maWxlbmFtZSgpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJjdG5maWxlbmFtZVwiXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY2hlYXQoKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImNoZWF0XCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBzaGFrZXN0YWdlKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzaGFrZXN0YWdlXCJdICYmIHRoaXMubV9hcHBfc2V0dGluZ1tcInNoYWtlc3RhZ2VcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHN0YWdlY29uZmlnY2RuKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJzdGFnZWNvbmZpZ2NkblwiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcGxheWVyc3BlZWQoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMubV9hcHBfc2V0dGluZ1tcInBsYXllcnNwZWVkXCJdKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdmlkZWxBZFVuaXRJZCgpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJ2aWRlbEFkVW5pdElkXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBiYW5uZXJBZFVuaXRJZCgpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJiYW5uZXJBZFVuaXRJZFwiXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdHJpKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fYXBwX3NldHRpbmdbXCJ0cmlcIl0gPT0gXCIxXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHJlY29tbWVuZCgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wicmVjb21tZW5kXCJdID09IFwiMVwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCByZWNvbW1lbmRmbGcoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX2FwcF9zZXR0aW5nW1wicmVjb21tZW5kZmxnXCJdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBlZ2coKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9hcHBfc2V0dGluZ1tcImVnZ1wiXSA9PSBcIjFcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgZWdncmF0ZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5tX2FwcF9zZXR0aW5nW1wiZWdncmF0ZVwiXSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IFVzZUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlcklkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRDb25maWcoX3R5cGU6IEFjY291bnRDb25maWcpOiBhbnkge1xyXG4gICAgICAgIHZhciB0eXBlID0gQWNjb3VudENvbmZpZ1tfdHlwZV07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubV9jb25maWdzW3R5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRVc2VyKF90eXBlOiBBY2NvdW50VXNlcikge1xyXG4gICAgICAgIHZhciB0eXBlID0gQWNjb3VudFVzZXJbX3R5cGVdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fdXNlclt0eXBlXTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgR2V0VmlkZW9Ub3RhbCgpXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLm1fdXNlcl92aWRlb1tcInRvdGFsXCJdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0U2lnbihfZGF0YXR5cGU6IHNpZ25kYXRhKSB7XHJcbiAgICAgICAgdmFyIHR5cGUgPSBzaWduZGF0YVtfZGF0YXR5cGVdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1fc2lnblt0eXBlXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0UmV3YXJkQ29uZmlnKF9yZXdhcmRpZDogbnVtYmVyKTogYW55IHtcclxuICAgICAgICB2YXIgcmV3YXJkID0gdGhpcy5tX1Jld2FyZERpY1tfcmV3YXJkaWRdO1xyXG4gICAgICAgIHJldHVybiByZXdhcmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEVudGl0eShfaWQ6IHN0cmluZywgYXR0cjogZW50aXR5KSB7XHJcbiAgICAgICAgaWYoIXRoaXMubV9FbnRpdHlEaWNbX2lkXSlyZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gdGhpcy5tX0VudGl0eURpY1tfaWRdW2VudGl0eVthdHRyXV07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBHZXRSZXdhcmREaWMoKSB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcucmV3YXJkcyk7XHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNvbmZpZykge1xyXG4gICAgICAgICAgICB0aGlzLm1fUmV3YXJkRGljW2NvbmZpZ1trZXldLmlkXSA9IGNvbmZpZ1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0RW50aXR5RGljKCkge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLmVudGl0eSk7XHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGNvbmZpZykge1xyXG4gICAgICAgICAgICB0aGlzLm1fRW50aXR5RGljW2NvbmZpZ1trZXldLmVudGl0eV9pZF0gPSBjb25maWdba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgR2V0VGhlbWVCeUlkKF9pZDogbnVtYmVyKTogYW55IHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2V0Q29uZmlnKEFjY291bnRDb25maWcudGhlbWUpO1xyXG4gICAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRhdGFbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaWQgPT0gX2lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldFNraW5BdHRyKF9pZDogbnVtYmVyKSAge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLnRoZW1lKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKykgIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZ1tpXS5pZCA9PSBfaWQpICB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRBY2hpZXZlbWVudERhdGEoKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLkdldENvbmZpZyhBY2NvdW50Q29uZmlnLmFjaGlldmVtZW50KTtcclxuICAgICAgICB2YXIgZGljID0ge307XHJcblxyXG4gICAgICAgIGZvciAodmFyIGtleTEgaW4gZGF0YSkge1xyXG4gICAgICAgICAgICB2YXIgdHlwZTEgPSBkYXRhW2tleTFdLnR5cGU7XHJcbiAgICAgICAgICAgIC8vdmFyIG9iaiA9IHt9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGRpY1t0eXBlMV0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgYXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIga2V5MiBpbiBkYXRhKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdHlwZTIgPSBkYXRhW2tleTJdLnR5cGU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUxID09IHR5cGUyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChkYXRhW2tleTJdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZGljW3R5cGUxXSA9IGFycmF5O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1fQWNoaWV2ZW1lbnREaWMgPSBkaWM7XHJcbiAgICB9XHJcblxyXG4gICAgSGFzVGhlbWUoX2lkOm51bWJlcik6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBoYXMgPSBmYWxzZTtcclxuICAgICAgICB2YXIgZ2V0dGhlbWVzID0gdGhpcy5HZXRVc2VyKEFjY291bnRVc2VyLmdldF90aGVtZXMpO1xyXG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBnZXR0aGVtZXMubGVuZ3RoO2krKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKGdldHRoZW1lc1tpXSA9PSBfaWQpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGhhcyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhcztcclxuICAgIH1cclxuXHJcbiAgICBHZXRTa2luRGljKF9jb25maWc6YW55KVxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRIZXJvUHJvZ3Jlc3MoX2lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHZhciBjb25maWcgPSB0aGlzLm1fdXNlcltcInByb2dyZXNzX2hlcm9lc1wiXTtcclxuICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBjb25maWdbX2lkXSA/IGNvbmZpZ1tfaWRdIDogMDtcclxuICAgICAgICByZXR1cm4gcHJvZ3Jlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEdldEhhdFByb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc19oYXRzXCJdO1xyXG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xyXG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0Q2JQcm9ncmVzcyhfaWQ6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMubV91c2VyW1wicHJvZ3Jlc3NfZGFuY2VzXCJdO1xyXG4gICAgICAgIHZhciBwcm9ncmVzcyA9IGNvbmZpZ1tfaWRdID8gY29uZmlnW19pZF0gOiAwO1xyXG4gICAgICAgIHJldHVybiBwcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgSGFzTW90b3IoX2lkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuR2V0VXNlcihBY2NvdW50VXNlci5nZXRfdGhlbWVzKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGhkID0gZGF0YVtpXTtcclxuICAgICAgICAgICAgaWYgKF9pZCA9PSBoZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy/ojrflj5bnmq7ogqTnmoTov5vluqZcclxuICAgIHB1YmxpYyBHZXRNb3RvclByb2dyZXNzKF9pZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5tX3VzZXJbXCJwcm9ncmVzc190aGVtZXNcIl07XHJcbiAgICAgICAgdmFyIHByb2dyZXNzID0gY29uZmlnW19pZF0gPyBjb25maWdbX2lkXSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHZXRTZXZlckNvbmZpZyhfY29uZmlnOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm1fY29uZmlncyA9IF9jb25maWc7XHJcbiAgICAgICAgdGhpcy5HZXRTa2luRGljKHRoaXMubV9jb25maWdzKTtcclxuICAgICAgICB0aGlzLkdldFJld2FyZERpYygpO1xyXG4gICAgICAgIHRoaXMuR2V0RW50aXR5RGljKCk7XHJcbiAgICAgICAgLy8gdGhpcy5HZXRBY2hpZXZlbWVudERhdGEoKTtcclxuICAgICAgICBsZXQgX2dsb2JlPV9jb25maWdbXCJnbG9iYWxcIl07XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IF9nbG9iZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IF9nbG9iZVtpbmRleF07XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmtleSA9PSBcInRpbGlyZWNcIikge1xyXG4gICAgICAgICAgICAgICAgUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC50aWxpcmVjPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgVXBkYXRlU2tpbkRpYygpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5HZXRTa2luRGljKHRoaXMubV9jb25maWdzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0R2xvYmUoX2tleTpzdHJpbmcpXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGdsb2JlID0gdGhpcy5HZXRDb25maWcoQWNjb3VudENvbmZpZy5nbG9iYWwpO1xyXG4gICAgICAgIGZvcih2YXIga2V5IGluIGdsb2JlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG9iaiA9IGdsb2JlW2tleV07XHJcbiAgICAgICAgICAgIHZhciBra2sgPSBvYmpbXCJrZXlcIl07XHJcbiAgICAgICAgICAgIGlmKGtrayA9PSBfa2V5KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvYmpbXCJ2YWx1ZVwiXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFBsYXllckFjY291bnQge1xyXG4gICAgY29uc3RydWN0b3IoX2NvZGU6IHN0cmluZywgX25pY2tuYW1lOiBzdHJpbmcsIF9hdmF0YXI6IHN0cmluZywgX2dlbmRlcjogbnVtYmVyLCBfY291bnRyeTogc3RyaW5nLCBfcHJvdmluY2U6IHN0cmluZywgX2NpdHk6IHN0cmluZywgX2RldmljZTogc3RyaW5nLCBfc2hhcmVpZDogc3RyaW5nLCBfc2NlbmNlOiBzdHJpbmcsIF92ZXI6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubG9jYWxUaW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XHJcblxyXG4gICAgICAgIHRoaXMuQ29kZSA9IF9jb2RlO1xyXG4gICAgICAgIHRoaXMuTmlja05hbWUgPSBfbmlja25hbWU7XHJcbiAgICAgICAgdGhpcy5BdmF0YXIgPSBfYXZhdGFyO1xyXG4gICAgICAgIHRoaXMuR2VuZGVyID0gX2dlbmRlcjtcclxuICAgICAgICB0aGlzLkNvdW50cnkgPSBfY291bnRyeTtcclxuICAgICAgICB0aGlzLlByb3ZpbmNlID0gX3Byb3ZpbmNlO1xyXG4gICAgICAgIHRoaXMuQ2l0eSA9IF9jaXR5O1xyXG4gICAgICAgIHRoaXMuRGV2aWNlID0gX2RldmljZTtcclxuICAgICAgICB0aGlzLlNoYXJlSWQgPSBfc2hhcmVpZDtcclxuICAgICAgICB0aGlzLlNjZW5lID0gX3NjZW5jZTtcclxuICAgICAgICB0aGlzLnZlciA9IF92ZXI7XHJcbiAgICAgICAgdGhpcy5Jc1Rlc3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgUGxheWVyQWNjb3VudC5pbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFBsYXllckFjY291bnQ7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgQ3VycmVudEFjY291bnQoKSB7XHJcbiAgICAgICAgaWYgKFBsYXllckFjY291bnQuaW5zdGFuY2UgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueUn+aIkOacrOWcsOa1i+ivlei0puWPty4uLlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIFBsYXllckFjY291bnQuVGVzdEFjY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQbGF5ZXJBY2NvdW50Lmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgVGVzdEFjY291bnQoKSB7XHJcbiAgICAgICAgdmFyIGNvZGUgPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKFwibG9jYWxjb2RlXCIpO1xyXG4gICAgICAgIGlmKCFjb2RlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB2YXIgcmFuZG9tID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCgxMDAwMCw5OTk5OSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgY29kZSA9IFwieGpfXCIgKyB0aW1lICsgcmFuZG9tO1xyXG4gICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwibG9jYWxjb2RlXCIsY29kZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRpbWUscmFuZG9tKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLmlrDnlKjmiLdcIixjb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLogIHnlKjmiLdcIixjb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGN1cmFjY291bnQgPSBuZXcgUGxheWVyQWNjb3VudChjb2RlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgICAgICBjdXJhY2NvdW50LklzVGVzdCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGN1cmFjY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENvZGU6IHN0cmluZztcclxuICAgIHB1YmxpYyBOaWNrTmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIEF2YXRhcjogc3RyaW5nO1xyXG4gICAgcHVibGljIEdlbmRlcjogbnVtYmVyO1xyXG4gICAgcHVibGljIENvdW50cnk6IHN0cmluZztcclxuICAgIHB1YmxpYyBQcm92aW5jZTogc3RyaW5nO1xyXG4gICAgcHVibGljIENpdHk6IHN0cmluZztcclxuICAgIHB1YmxpYyBEZXZpY2U6IHN0cmluZztcclxuICAgIHB1YmxpYyBTaGFyZUlkOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgU2NlbmU6IHN0cmluZztcclxuICAgIHB1YmxpYyB2ZXI6IHN0cmluZztcclxuICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyVGltZTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBsb2NhbFRpbWU7XHJcbiAgICBzdGF0aWMgbG9jYWxjb2ZpZ2tleSA9IFwibWNvbmZpZ1wiO1xyXG5cclxuICAgIHB1YmxpYyBJc1Rlc3QgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgQ3VyQWNjb3VudERhdGE6IEFjY291bnREYXRhO1xyXG5cclxuICAgIHB1YmxpYyB0aWxpcmVjOm51bWJlcjtcclxuXHJcbiAgICBwdWJsaWMgbm93Q29uZmlnOmFueTtcclxuXHJcbiAgICBwdWJsaWMgU2V0QWNjb3VudERhdGEoZGF0YSxjb21wbGV0ZWNiOkxheWEuSGFuZGxlcikge1xyXG4gICAgICAgIHZhciB0b2tlbiA9IGRhdGFbXCJ0b2tlblwiXTtcclxuICAgICAgICB2YXIgY29uZmlncyA9IGRhdGFbXCJjb25maWdzXCJdO1xyXG4gICAgICAgIHZhciBhcHBfc2V0dGluZyA9IGRhdGFbXCJhcHBfc2V0dGluZ1wiXTtcclxuICAgICAgICB2YXIgdXNlciA9IGRhdGFbXCJ1c2VyXCJdO1xyXG4gICAgICAgIHZhciB1c2VyX2Jhc2UgPSBkYXRhW1widXNlcl9iYXNlXCJdO1xyXG4gICAgICAgIHZhciB1c2VyX3NpZ24gPSBkYXRhW1widXNlcl9zaWduXCJdO1xyXG4gICAgICAgIHZhciB1c2VyX2FjaGlldmVtZW50ID0gZGF0YVtcInVzZXJfYWNoaWV2ZW1lbnRcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfbG90dGVyeSA9IGRhdGFbXCJ1c2VyX2xvdHRlcnlcIl07XHJcbiAgICAgICAgdmFyIHVzZXJfbGFuZF90YXNrID0gZGF0YVtcInVzZXJfbGFuZF90YXNrXCJdO1xyXG4gICAgICAgIHZhciB1c2VyX3ZpZGVvID0gZGF0YVtcInVzZXJfdmlkZW9cIl07XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VyQWNjb3VudERhdGEgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW8gOWni+iOt+WPlmNvbmZpZ+aVsOaNrlwiKTtcclxuICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YSA9IG5ldyBBY2NvdW50RGF0YSh0b2tlbiwgY29uZmlncywgYXBwX3NldHRpbmcsIHVzZXIsIHVzZXJfYmFzZSwgbnVsbCwgbnVsbCwgdXNlcl9zaWduLCB1c2VyX2FjaGlldmVtZW50LCB1c2VyX2xvdHRlcnksdXNlcl9sYW5kX3Rhc2ssdXNlcl92aWRlbyk7XHJcbiAgICAgICAgICAgIHRoaXMuQ2hlY2tMb2NhbENvbmZpZyhkYXRhLnRhYmxlX3ZlcnNpb24sIChfY29uZmlnKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLkdldFNldmVyQ29uZmlnKF9jb25maWcpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dDb25maWcgPSBfY29uZmlnO1xyXG4gICAgICAgICAgICAgICAgaWYoY29tcGxldGVjYiAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlY2IucnVuV2l0aChkYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlncykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX2NvbmZpZ3MgPSBjb25maWdzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhcHBfc2V0dGluZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5tX2FwcF9zZXR0aW5nID0gYXBwX3NldHRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VyID0gdXNlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlcl9iYXNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fdXNlcl9iYXNlID0gdXNlcl9iYXNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1c2VyX3NpZ24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV9zaWduID0gdXNlcl9zaWduO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh1c2VyX2FjaGlldmVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fdGFzayA9IHVzZXJfYWNoaWV2ZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHVzZXJfbG90dGVyeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5DdXJBY2NvdW50RGF0YS5sb3R0ZXJ5ID0gdXNlcl9sb3R0ZXJ5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHVzZXJfbGFuZF90YXNrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkN1ckFjY291bnREYXRhLm1fdXNlX2xhbmRfdGFzayA9IHVzZXJfbGFuZF90YXNrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHVzZXJfdmlkZW8pXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQ3VyQWNjb3VudERhdGEubV91c2VyX3ZpZGVvID0gdXNlcl92aWRlbztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVwZGF0ZVBsYXllckluZm8gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIENoZWNrTG9jYWxDb25maWcoX3Zlcjogc3RyaW5nLCBjYjogRnVuY3Rpb24pIHtcclxuICAgICAgICB2YXIgY3VyY29uZmlnID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SlNPTihQbGF5ZXJBY2NvdW50LmxvY2FsY29maWdrZXkpO1xyXG4gICAgICAgIGlmIChjdXJjb25maWcpIHtcclxuICAgICAgICAgICAgLy9MYXlhLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFBsYXllckFjY291bnQubG9jYWxjb2ZpZ2tleSk7XHJcbiAgICAgICAgICAgIGlmIChjdXJjb25maWcudmVyID09IF92ZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2V2ZXLphY3nva7mmK/mnIDmlrDnmoQuLi5cIiwgX3Zlcik7XHJcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgIGNiKGN1cmNvbmZpZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5IdHRwUG9zdFJlcXVlc3QoUFJPVE9DT0xTLkNvbmZpZywgbnVsbCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29uZmlncy52ZXIgPSBfdmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oUGxheWVyQWNjb3VudC5sb2NhbGNvZmlna2V5LCBkYXRhLmNvbmZpZ3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2V2ZXLphY3nva7mm7TmlrDlrozmiJAuLi5cIiwgX3Zlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCJjb25maWfmjqXlj6Pojrflj5bmiJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY2IoZGF0YS5jb25maWdzKTtcclxuICAgICAgICAgICAgICAgIH0pLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLphY3nva7ojrflj5blpLHotKVcIiArIGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwiY29uZmln5o6l5Y+j6I635Y+W5aSx6LSlXCIpO1xyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5IdHRwUG9zdFJlcXVlc3QoUFJPVE9DT0xTLkNvbmZpZywgbnVsbCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5jb25maWdzLnZlciA9IF92ZXI7XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRKU09OKFBsYXllckFjY291bnQubG9jYWxjb2ZpZ2tleSwgZGF0YS5jb25maWdzKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2V2ZXLkv53lrZjphY3nva7lrozmiJAuLi5cIiwgX3Zlcik7XHJcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY2IoZGF0YS5jb25maWdzKTtcclxuXHJcbiAgICAgICAgICAgIH0pLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIumFjee9ruiOt+WPluWksei0pVwiICsgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcImNvbmZpZ+aOpeWPo+iOt+WPluWksei0pVwiKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IFNlcnZlclRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xyXG4gICAgICAgIGxldCBzdGltZSA9IFBsYXllckFjY291bnQuU2VydmVyVGltZSArIE1hdGguY2VpbCgodGltZSAtIHRoaXMubG9jYWxUaW1lKSAvIDEwMDApO1xyXG4gICAgICAgIHJldHVybiBzdGltZTtcclxuICAgIH1cclxufSIsIlxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29yZE1hbmFnZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6UmVjb3JkTWFuYWdlcjtcclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLmluc3RhbmNlID0gdGhpcztcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm5ldyByZWNvcmRcIik7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlJlY29yZE1hbmFnZXJcclxuICAgIHtcclxuICAgICAgICBpZihSZWNvcmRNYW5hZ2VyLmluc3RhbmNlKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29yZE1hbmFnZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjdXJtYW5hZ2VyID0gbmV3IFJlY29yZE1hbmFnZXIoKTtcclxuICAgICAgICAgICAgY3VybWFuYWdlci5Pbk5ldygpO1xyXG4gICAgICAgICAgICByZXR1cm4gY3VybWFuYWdlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgUmVjb3JkU3RhcnQoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVjb3JkU3RhcnRcIik7XHJcbiAgICAgICAgdGhpcy5yZWNvcmQuc3RhcnQoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogNjAsXHJcbiAgICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgUmVjb3JkU3RvcCgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJSZWNvcmRTdG9wXCIpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wbGV0ZXBhdGg6c3RyaW5nO1xyXG5cclxuICAgIFNoYXJlVmlkZW8oX2NiOkZ1bmN0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgY2hhbm5lbDogXCJ2aWRlb1wiLFxyXG4gICAgICAgICAgICBxdWVyeTogXCJcIixcclxuICAgICAgICAgICAgdGVtcGxhdGVJZDogXCIyNjZxNGZnYjhhbDdpM2U3aWVcIiwgLy8g5pu/5o2i5oiQ6YCa6L+H5a6h5qC455qE5YiG5LqrSURcclxuICAgICAgICAgICAgdGl0bGU6IFwi6LWi5b6X5LqG5oiR77yM6K6k5L2g5YGa5aSn5ZOl5Y+I5aaC5L2VXCIsXHJcbiAgICAgICAgICAgIGRlc2M6IFwi6LWi5b6X5LqG5oiR77yM6K6k5L2g5YGa5aSn5ZOl5Y+I5aaC5L2VXCIsXHJcbiAgICAgICAgICAgIGV4dHJhOiB7XHJcbiAgICAgICAgICAgICAgdmlkZW9QYXRoOiB0aGlzLmNvbXBsZXRlcGF0aCwgLy8g5Y+v55So5b2V5bGP5b6X5Yiw55qE5pys5Zyw5paH5Lu26Lev5b6EXHJcbiAgICAgICAgICAgICAgdmlkZW9Ub3BpY3M6IFtcIui1ouW+l+S6huaIke+8jOiupOS9oOWBmuWkp+WTpeWPiOWmguS9lVwiXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdWNjZXNzKCkge1xyXG4gICAgICAgICAgICAgICAgX2NiICYmIF9jYih0cnVlKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWIhuS6q+inhumikeaIkOWKn1wiKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbChlKSB7XHJcbiAgICAgICAgICAgICAgICBfY2IgJiYgX2NiKGZhbHNlKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuWIhuS6q+inhumikeWksei0pVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVjb3JkOmFueTtcclxuICAgIE9uTmV3KClcclxuICAgIHtcclxuICAgICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICB0aGlzLnJlY29yZCA9IExheWEuQnJvd3Nlci53aW5kb3cudHQuZ2V0R2FtZVJlY29yZGVyTWFuYWdlcigpO1xyXG4gICAgICAgIHRoaXMucmVjb3JkLm9uU3RhcnQocmVzID0+IHtcclxuICAgICAgICAgICAgLy8g5b2V5bGP5byA5aeLXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMucmVjb3JkLm9uU3RvcChyZXMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlcGF0aCA9IHJlcy52aWRlb1BhdGg7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcy52aWRlb1BhdGgpO1xyXG4gICAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG59IiwiXHJcblxyXG5cclxuXHJcbmV4cG9ydCBlbnVtIHN5c3RlbXR5cGUge1xyXG4gICAgaW9zLCBhbmRyb2lkLCBvdGhlclxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgV3hBcGlcclxue1xyXG4gICAgcHVibGljIHN0YXRpYyByZWNvcmRBbGRFdmVudChrZXk6c3RyaW5nLHZhbHVlOnN0cmluZz1cIlwiKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTZW5kRXZlbnQoa2V5LHtrZXk6dmFsdWV9KTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLkuovku7Y6IFwiLGtleSk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMgbmV3YWNjb3VudCA9IGZhbHNlO1xyXG4gICAgc3RhdGljIHNjZW5lVmFsdWUgPSBcIlwiO1xyXG4gICAgc3RhdGljIHNoYXJlT3BlbklkID0gXCJcIjtcclxuICAgIHN0YXRpYyBxdWVyeWNoYW5uZWwgPSBcIlwiO1xyXG4gICAgc3RhdGljIHJlZmVycmVySW5mb2FwcElkID0gXCJcIjtcclxuICAgIHN0YXRpYyBXWExvZ2luKGNiOiBGdW5jdGlvbikgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubG9naW4oe1xyXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzLmNvZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNvZGU6XCIscmVzLmNvZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNiKHJlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6I635Y+W55So5oi355m75b2V5oCB5aSx6LSl77yBJyArIHJlcy5lcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKSB7IGNvbnNvbGUubG9nKFwid3gubG9naW46IGZhaWxlZCwgcmVzPVwiICsgcmVzKTsgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBXeEluaXQoKSBcclxuICAgIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbldlaVhpbikgcmV0dXJuO1xyXG5cclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHdpdGhTaGFyZVRpY2tldDogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hvdygob3B0aW9uKSA9PiBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVPcGVuSWQgPSBvcHRpb24ucXVlcnkudXNlcklkO1xyXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5Y2hhbm5lbCA9IG9wdGlvbi5xdWVyeS5jaGFubmVsO1xyXG4gICAgICAgICAgICBpZihvcHRpb24ucmVmZXJyZXJJbmZvKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVycmVySW5mb2FwcElkID0gb3B0aW9uLnJlZmVycmVySW5mby5hcHBJZDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25TaG93IGFwcElkIGlzOlwiLCBvcHRpb24ucmVmZXJyZXJJbmZvLmFwcElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNjZW5lVmFsdWUgPSBvcHRpb24uc2NlbmU7XHJcbiAgICAgICAgICAgIHZhciBzY2VuZSA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJzY2VuZVwiKTtcclxuICAgICAgICAgICAgaWYgKHNjZW5lKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZVZhbHVlID0gc2NlbmU7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuivu+WPlumFjee9ruWcuuaZr+WAvDpcIiArIHNjZW5lKTtcclxuICAgICAgICAgICAgfSAgXHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLnrKzkuIDmrKHmi4nlj5blnLrmma/lgLw6XCIgKyB0aGlzLnNjZW5lVmFsdWUpO1xyXG4gICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5zZXRJdGVtKFwic2NlbmVcIiwgdGhpcy5zY2VuZVZhbHVlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/mmL7npLrliqDovb3kv6Hmga9cclxuICAgIHByaXZhdGUgc3RhdGljIGlzU2hvd2luZyA9IGZhbHNlO1xyXG4gICAgcHVibGljIHN0YXRpYyBTaG93TG9hZGluZyh0aXRsZTogc3RyaW5nID0gXCLliqDovb3kuK0uLi5cIikgXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuaXNTaG93aW5nKSByZXR1cm47XHJcbiAgICAgICAgLy8gdGhpcy5pc1Nob3dpbmcgPSB0cnVlO1xyXG4gICAgICAgIC8vIChMYXlhLkJyb3dzZXIub25NaW5pR2FtZSkgJiYgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93TG9hZGluZyh7IHRpdGxlOiB0aXRsZSwgbWFzazogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIEhpZGVMb2FkaW5nKCkgXHJcbiAgICB7XHJcbiAgICAgICAgLy8gdGhpcy5pc1Nob3dpbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyAoTGF5YS5Ccm93c2VyLm9uTWluaUdhbWUpICYmIExheWEuQnJvd3Nlci53aW5kb3cud3guaGlkZUxvYWRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWxkU2VuZE9wZW5pZChfb3BlbmlkOnN0cmluZylcclxuICAgIHtcclxuICAgICAgICAvLyBpZihMYXlhLkJyb3dzZXIub25NaW5pR2FtZSlcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiYWxkU2VuZE9wZW5pZFwiLF9vcGVuaWQpO1xyXG4gICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFNlbmRPcGVuaWQoX29wZW5pZCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvL+ajgOa1i+abtOaWsFxyXG4gICAgc3RhdGljIENoZWNrV1hVcGRhdGUoKSBcclxuICAgIHtcclxuICAgICAgICBjb25zdCB1cGRhdGVNYW5hZ2VyID0gTGF5YS5Ccm93c2VyLndpbmRvdy50dC5nZXRVcGRhdGVNYW5hZ2VyKCk7XHJcblxyXG4gICAgICAgIHVwZGF0ZU1hbmFnZXIub25DaGVja0ZvclVwZGF0ZSgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5pyA5paw54mI5pysOlwiICsgcmVzLmhhc1VwZGF0ZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeSgoKSA9PiB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hvd01vZGFsKHtcclxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDmj5DnpLonLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogJ+aWsOeJiOacrOW3sue7j+WHhuWkh+Wlve+8jOaYr+WQpumHjeWQr+W6lOeUqO+8nycsXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIuYXBwbHlVcGRhdGUoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmYWlsKHJlcz8pIHtcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLmFwcGx5VXBkYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsZXZlbFN0YXJ0KHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIuW8gOWni+iusOW9leWFs+WNoTpcIiArIHN0YWdlSWQpO1xyXG4gICAgICAgIC8vIGlmIChMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpIHtcclxuICAgICAgICAvLyAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxyXG4gICAgICAgIC8vICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlSWQ6IHN0YWdlSWQsICAgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdXNlcklkOiB1c2VySWQgLy/nlKjmiLdJRCDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgKTtcclxuICAgICAgICAvLyAgICAgaWYoV3hBcGkubmV3YWNjb3VudClcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblN0YXJ0KFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhZ2VJZDogXCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQgLy/nlKjmiLdJRCDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICApOyBcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbGV2ZWxSdW5uaW5nKHN0YWdlSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLHVzZXJldml2ZTpzdHJpbmcpXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLorrDlvZXlhbPljaHkuK06XCIgKyBzdGFnZUlkKTtcclxuICAgICAgICAvLyBpZihMYXlhLkJyb3dzZXIud2luZG93ICYmIExheWEuQnJvd3Nlci53aW5kb3cud3gpXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LmFsZFN0YWdlLm9uUnVubmluZyh7XHJcbiAgICAgICAgLy8gICAgICAgICBzdGFnZUlkICAgOiBzdGFnZUlkLCAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICBzdGFnZU5hbWUgOiBzdGFnZU5hbWUsICAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICB1c2VySWQgICAgOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXHJcbiAgICAgICAgLy8gICAgICAgICBldmVudCAgICAgOiBcInJldml2ZVwiLCAgLy/kvb/nlKjpgZPlhbcgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgIHBhcmFtcyAgICA6IHtcclxuICAgICAgICAvLyAgICAgICAgICAgaXRlbU5hbWUgIDogXCLkvb/nlKjlpI3mtLtcIiwvL+S9v+eUqOmBk+WFt+WQjeensCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgaXRlbUNvdW50IDogMSwgICAvL+S9v+eUqOmBk+WFt+aVsOmHjyAg5Y+v6YCJXHJcbiAgICAgICAgLy8gICAgICAgICAgIGRlc2MgICAgICA6IHVzZXJldml2ZSAvL+S9v+eUqOmBk+WFt+aPj+i/sFxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXHJcbiAgICAgICAgLy8gICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vblJ1bm5pbmcoe1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlSWQgICA6XCLmlrDnlKjmiLc6XCIgKyAgc3RhZ2VJZCwgICAvL+WFs+WNoUlEIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIHN0YWdlTmFtZSA6IHN0YWdlTmFtZSwgIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICB1c2VySWQgICAgOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZXZlbnQgICAgIDogXCJyZXZpdmVcIiwgIC8v5L2/55So6YGT5YW3ICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyYW1zICAgIDoge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgaXRlbU5hbWUgIDogXCLkvb/nlKjlpI3mtLtcIiwvL+S9v+eUqOmBk+WFt+WQjeensCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgIGl0ZW1Db3VudCA6IDEsICAgLy/kvb/nlKjpgZPlhbfmlbDph48gIOWPr+mAiVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgZGVzYyAgICAgIDogdXNlcmV2aXZlIC8v5L2/55So6YGT5YW35o+P6L+wXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICB9KVxyXG4gICAgICAgIC8vICAgICAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxldmVsU3VjY2VzcyhzdGFnZUlkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLorrDlvZXlhbPljaE65a6M5oiQXCIgKyBzdGFnZUlkKTtcclxuICAgICAgICAvLyBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KSB7XHJcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXHJcbiAgICAgICAgLy8gICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgICAgICBldmVudDogXCJjb21wbGV0ZVwiLCAgIC8v5YWz5Y2h5a6M5oiQICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyYW1zOlxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBkZXNjOiBcIuWFs+WNoeWujOaIkFwiICAgLy/mj4/ov7BcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgLy8gICAgICk7XHJcbiAgICAgICAgLy8gICAgIGlmKFd4QXBpLm5ld2FjY291bnQpXHJcbiAgICAgICAgLy8gICAgIHtcclxuICAgICAgICAvLyAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXHJcbiAgICAgICAgLy8gICAgICAgICAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBzdGFnZUlkOlwi5paw55So5oi3OlwiICsgc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlTmFtZTogc3RhZ2VOYW1lLCAvL+WFs+WNoeWQjeensCAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHVzZXJJZDogdXNlcklkLCAvL+eUqOaIt0lEIOWPr+mAiVxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBldmVudDogXCJjb21wbGV0ZVwiLCAgIC8v5YWz5Y2h5a6M5oiQICDlhbPljaHov5vooYzkuK3vvIznlKjmiLfop6blj5HnmoTmk43kvZwgICAg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHBhcmFtczpcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBcIuWFs+WNoeWujOaIkFwiICAgLy/mj4/ov7BcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgLy8gICAgICAgICApO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsZXZlbEZhaWwoc3RhZ2VJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIHNjb3JlOiBzdHJpbmcsIGNhcm5hbWU6IHN0cmluZyk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLorrDlvZXlhbPljaE65aSx6LSlXCIgKyBzdGFnZUlkKTtcclxuICAgICAgICAvLyBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdyAmJiBMYXlhLkJyb3dzZXIud2luZG93Lnd4KSB7XHJcbiAgICAgICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guYWxkU3RhZ2Uub25FbmQoXHJcbiAgICAgICAgLy8gICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VJZDogc3RhZ2VJZCwgICAgIC8v5YWz5Y2hSUQg6K+l5a2X5q615b+F5LygXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICB1c2VySWQ6IHVzZXJJZCwgLy/nlKjmiLdJRCDlj6/pgIlcclxuICAgICAgICAvLyAgICAgICAgICAgICBldmVudDogXCJmYWlsXCIsICAgLy/lhbPljaHlrozmiJAgIOWFs+WNoei/m+ihjOS4re+8jOeUqOaIt+inpuWPkeeahOaTjeS9nCAgICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICBwYXJhbXM6XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGRlc2M6IFwi5aSx6LSlXCIsXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzY29yZTogc2NvcmUsLy/mj4/ov7BcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNhcjogY2FybmFtZS8v5o+P6L+wXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgKTtcclxuICAgICAgICAvLyAgICAgaWYoV3hBcGkubmV3YWNjb3VudClcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5hbGRTdGFnZS5vbkVuZChcclxuICAgICAgICAvLyAgICAgICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHN0YWdlSWQ6XCLmlrDnlKjmiLc6XCIgKyBzdGFnZUlkLCAgICAgLy/lhbPljaFJRCDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgc3RhZ2VOYW1lOiBzdGFnZU5hbWUsIC8v5YWz5Y2h5ZCN56ewICDor6XlrZfmrrXlv4XkvKBcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdXNlcklkOiB1c2VySWQsIC8v55So5oi3SUQg5Y+v6YCJXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGV2ZW50OiBcImZhaWxcIiwgICAvL+WFs+WNoeWujOaIkCAg5YWz5Y2h6L+b6KGM5Lit77yM55So5oi36Kem5Y+R55qE5pON5L2cICAgIOivpeWtl+auteW/heS8oFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBwYXJhbXM6XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogXCLlpLHotKVcIixcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZTogc2NvcmUsLy/mj4/ov7BcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjYXI6IGNhcm5hbWUvL+aPj+i/sFxyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgICk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIE9uU2hvdyhjYjogRnVuY3Rpb24pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci53aW5kb3cudHQpIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0Lm9uU2hvdyhjYik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIE9mZlNob3coY2I6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybjtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0Lm9mZlNob3coY2IpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBDYW5TaGFrZSA9IHRydWU7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2hha2UoKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnZpYnJhdGVTaG9ydCh7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2hha2VMb25nKCk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC52aWJyYXRlTG9uZyh7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTaGFrZShfc2hvcnQgPSB0cnVlKSBcclxuICAgIHtcclxuICAgICAgICBpZihMYXlhLkJyb3dzZXIud2luZG93LnR0ICYmIFd4QXBpLkNhblNoYWtlKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKF9zaG9ydCkgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hha2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWtlTG9uZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCFfc2hvcnQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWdlU2hha2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIOaYr+WQpumch+WKqOS4rSAqL1xyXG4gICAgc3RhdGljIGlzU2hha2U6Ym9vbGVhbjtcclxuICAgIHN0YXRpYyB0aW1lcyA9IDEuMztcclxuICAgIHN0YXRpYyBudW06bnVtYmVyID0gMDtcclxuICAgIHN0YXRpYyBvZmZzZXRBcnIgPSBbMCwgMF07XHJcbiAgICBzdGF0aWMgb2Zmc2V0ID0gMTQ7XHJcbiAgICBzdGF0aWMgY2Fuc2hha2VzdGFnZSA9IGZhbHNlO1xyXG5cclxuICAgIHN0YXRpYyBzdGFnZVNoYWtlKGNhbGxCYWNrOkZ1bmN0aW9uID0gbnVsbCxzcGVlZDpudW1iZXIgPSAzMik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuaXNTaGFrZSB8fCAhdGhpcy5jYW5zaGFrZXN0YWdlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5pc1NoYWtlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdmFyIHBvaW50OkxheWEuVmVjdG9yMiA9IG5ldyBMYXlhLlZlY3RvcjIoTGF5YS5zdGFnZS54LCBMYXlhLnN0YWdlLnkpO1xyXG4gICAgICAgIExheWEuc3RhZ2UudGltZXJMb29wKHNwZWVkLCB0aGlzLCB0aGlzLnNoYWtlT2JqZWN0LFtwb2ludCxjYWxsQmFja10pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzaGFrZU9iamVjdChfcG9pbnQ6TGF5YS5WZWN0b3IyLF9jYWxsQmFjayk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBjb3VudDpudW1iZXIgPSAodGhpcy5udW0rKykgJSA0O1xyXG4gICAgICAgIHRoaXMub2Zmc2V0QXJyW3RoaXMubnVtICUgMl0gPSBjb3VudCA8IDIgPyAwIDogdGhpcy5vZmZzZXQ7XHJcbiAgICAgICAgTGF5YS5zdGFnZS54ID0gdGhpcy5vZmZzZXRBcnJbMF0gKyBfcG9pbnQueDtcclxuICAgICAgICBMYXlhLnN0YWdlLnkgPSB0aGlzLm9mZnNldEFyclsxXSArIF9wb2ludC55O1xyXG5cclxuICAgICAgICBpZih0aGlzLm51bSA+ICh0aGlzLnRpbWVzICogNCArIDEpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5zdGFnZS5jbGVhclRpbWVyKHRoaXMsIHRoaXMuc2hha2VPYmplY3QpO1xyXG4gICAgICAgICAgICBMYXlhLnN0YWdlLnBvcygwLDApO1xyXG4gICAgICAgICAgICB0aGlzLm51bSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTaGFrZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZihfY2FsbEJhY2sgIT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgX2NhbGxCYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBTaG93VHh0KHRleHQ6IHN0cmluZykgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKExheWEuQnJvd3Nlci53aW5kb3cudHQpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy50dC5zaG93VG9hc3QoeyB0aXRsZTogdGV4dCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRleHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBTeXN0ZW1Gcm9tKCk6IHN5c3RlbXR5cGUgXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybiBzeXN0ZW10eXBlLm90aGVyO1xyXG5cclxuICAgICAgICBsZXQgaW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICB2YXIgc3lzdGVtOiBzdHJpbmcgPSBpbmZvLnN5c3RlbTtcclxuICAgICAgICB2YXIgSU9TID0gc3lzdGVtLmluZGV4T2YoXCJpT1NcIikgIT0gLTE7XHJcbiAgICAgICAgdmFyIEFuZHJvaWQgPSBzeXN0ZW0uaW5kZXhPZihcIkFuZHJvaWRcIikgIT0gLTE7XHJcblxyXG4gICAgICAgIGlmIChJT1MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHN5c3RlbXR5cGUuaW9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChBbmRyb2lkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzeXN0ZW10eXBlLmFuZHJvaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc3lzdGVtdHlwZS5vdGhlcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJc0xvbmdTY3JlZW5TeXN0ZW0oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25XZWlYaW4pIHJldHVybiBmYWxzZTtcclxuICAgICAgICBsZXQgc3lzdGVtSW5mbyA9IExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICBsZXQgcGxhdGZvcm1Nb2RlbCA9IFwiaXB4XCI7XHJcbiAgICAgICAgaWYgKHN5c3RlbUluZm8gIT0gbnVsbCkge1xyXG4gICAgICAgIHZhciBtb2RlbCA9IHN5c3RlbUluZm8ubW9kZWw7XHJcbiAgICAgICAgcGxhdGZvcm1Nb2RlbCA9IGAke3N5c3RlbUluZm8uYnJhbmR9XyR7bW9kZWx9XyR7c3lzdGVtSW5mby5zeXN0ZW19X3d4JHtzeXN0ZW1JbmZvLnZlcnNpb259X1NES1ZlciR7c3lzdGVtSW5mby5TREtWZXJzaW9ufWA7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJwbGF0Zm9ybU1vZGVsOlwiICsgcGxhdGZvcm1Nb2RlbCk7XHJcbiAgICAgICAgcmV0dXJuICAhKG1vZGVsLmluZGV4T2YoXCJYXCIpIDwgMCkgfHxcclxuICAgICAgICAoKG1vZGVsLmluZGV4T2YoXCJvcHBvXCIpID49IDAgfHwgbW9kZWwuaW5kZXhPZihcIk9QUE9cIikgPj0gMCkgJiYgKG1vZGVsLmluZGV4T2YoXCJSMTVcIikgPj0gMCB8fCBtb2RlbC5pbmRleE9mKFwicjE1XCIpID49IDApKSB8fFxyXG4gICAgICAgIHN5c3RlbUluZm8uc3RhdHVzQmFySGVpZ2h0ID4gMjAgfHxcclxuICAgICAgICAobW9kZWwuaW5kZXhPZihcIk5vdGVcIikgPj0gMCAmJiAobW9kZWwuaW5kZXhPZihcIjdcIikgPj0gMCB8fCBtb2RlbC5pbmRleE9mKFwiOFwiKSA+PSAwKSkgfHxcclxuICAgICAgICAoKG1vZGVsLmluZGV4T2YoXCJpUGhvbmVcIikgPj0gMCkgJiYgKG1vZGVsLmluZGV4T2YoXCIxMVwiKSA+PSAwKSlcclxufVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgd3JpdGVTdGFnZShzdGFnZTogbnVtYmVyKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBrdkRhdGFMaXN0ID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICB2YXIgbXlWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgXCJ3eGdhbWVcIjogXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFwic3RhZ2VcIjogc3RhZ2UsXHJcbiAgICAgICAgICAgICAgICBcInVwZGF0ZV90aW1lXCI6IGRhdGUudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBrdkRhdGFMaXN0LnB1c2goe2tleTpcInN0YWdlXCIsIHZhbHVlOiBteVZhbHVlfSk7XHJcbiAgICAgIFxyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4KVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zZXRVc2VyQ2xvdWRTdG9yYWdlKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIEtWRGF0YUxpc3Q6IGt2RGF0YUxpc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzczogcj0+XHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuS8oOWIhuaVsOaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3BWZXJzaW9uR3JlYXRlck9yRXF1YWwodjE6IHN0cmluZywgdjI6IHN0cmluZykgXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFtMT0dd5Z+656GA5bqT54mI5pys5Y+3IGN1clZlcjoke3YxfSB0YXJnVmVyOiR7djJ9YCk7XHJcbiAgICAgICAgbGV0IHYxQXJyID0gdjEuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGxldCB2MkFyciA9IHYyLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgbGVuID0gdjFBcnIubGVuZ3RoO1xyXG4gICAgICAgIGlmICh2MkFyci5sZW5ndGggPCBsZW4pIHtcclxuICAgICAgICAgICAgbGVuID0gdjJBcnIubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB2ZXIxID0gTnVtYmVyKHYxQXJyW2ldKTtcclxuICAgICAgICAgICAgbGV0IHZlcjIgPSBOdW1iZXIodjJBcnJbaV0pO1xyXG4gICAgICAgICAgICBpZiAodmVyMSA+IHZlcjIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHZlcjEgPCB2ZXIyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHYxQXJyLmxlbmd0aCA+PSB2MkFyci5sZW5ndGg7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge1NvY2tldE5vZmlmeX0gZnJvbSBcIi4uL1dYU0RLL1NvY2tldE5vZmlmeVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZlclNvY2tldFxyXG57XHJcbiAgICBwcml2YXRlIHNvY2s6IExheWEuU29ja2V0O1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluczogU2VydmVyU29ja2V0O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogMTroh6rliqjmlq3nur/vvIwy77ya5Li75Yqo5pat57q/XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX29mZmxpbmVzdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pat57q/6YeN6L+e5qyh5pWwXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2Nvbm5ldE51bXM6bnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHNvY2tldOi/nuaOpeS4rVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIFNlcnZlclNvY2tldC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfc29ja2V0Y29ubmV0aW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBTZXJ2ZXJTb2NrZXQge1xyXG4gICAgICAgIGlmIChTZXJ2ZXJTb2NrZXQuaW5zID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJTb2NrZXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFNlcnZlclNvY2tldC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy/ov57mjqXmnI3liqHlmahcclxuICAgIHB1YmxpYyBjb25uZWN0U2VydmVyKGdhbWVIb3N0OnN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NvY2tldGNvbm5ldGluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVTb2NrZXQoKTtcclxuICAgICAgICBpZiAoIXRoaXMuc29jayB8fCAhdGhpcy5zb2NrLmNvbm5lY3RlZCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW53YWl0cGFuZWwoKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNvY2spIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc29jayA9IG5ldyBMYXlhLlNvY2tldCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuT1BFTiwgdGhpcywgdGhpcy5vblNvY2tldE9wZW4pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuTUVTU0FHRSwgdGhpcywgdGhpcy5vblJlY2VpdmVNZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc29jay5vbihMYXlhLkV2ZW50LkNMT1NFLCB0aGlzLCB0aGlzLm9uU29ja2V0Q2xvc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrLm9uKExheWEuRXZlbnQuRVJST1IsIHRoaXMsIHRoaXMuaW9FcnJvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNvY2suY29ubmVjdEJ5VXJsKGdhbWVIb3N0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzQ29ubmVjdCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5zb2NrICYmIHRoaXMuc29jay5jb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlvRXJybyhlOiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc29ja2V0Y29ubmV0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fY29ubmV0TnVtcysrO1xyXG4gICAgICAgIHRoaXMuY2xvc2V3YWl0cGFuZWwoKTtcclxuICAgICAgICB0aGlzLnJlbW92ZVNvY2tldCgpO1xyXG4gICAgICAgIHRoaXMuX29mZmxpbmVzdGF0ZT0xO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlU29ja2V0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3NvY2tldGNvbm5ldGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmKHRoaXMuc29jaylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5PUEVOLCB0aGlzLCB0aGlzLm9uU29ja2V0T3Blbik7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5NRVNTQUdFLCB0aGlzLCB0aGlzLm9uUmVjZWl2ZU1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2sub2ZmKExheWEuRXZlbnQuQ0xPU0UsIHRoaXMsIHRoaXMub25Tb2NrZXRDbG9zZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jay5vZmYoTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5pb0Vycm8pO1xyXG4gICAgICAgICAgICB0aGlzLnNvY2suY2xlYW5Tb2NrZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc29jayA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5omL5Yqo5YWz6Zet5ri45oiPc29ja2V0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2xzZVNvY2tldCggb2ZmbGluZXN0YXRlOm51bWJlciA9IDEgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuaXNDb25uZWN0KCkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZXdhaXRwYW5lbCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNvY2tldCgpO1xyXG4gICAgICAgICAgICBpZiggb2ZmbGluZXN0YXRlICE9IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb2ZmbGluZXN0YXRlPSBvZmZsaW5lc3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggU29ja2V0Tm9maWZ5LlNPQ0tFVF9DTE9TRSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU29ja2V0Q2xvc2UoZTogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3NvY2tldGNvbm5ldGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2xvc2V3YWl0cGFuZWwoKTtcclxuICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGU9MTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBTb2NrZXROb2ZpZnkuU09DS0VUX0NMT1NFICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgY2xvc2V3YWl0cGFuZWwoKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcGVud2FpdHBhbmVsKCk6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8v6L+e5o6l5oiQ5Yqf6L+U5ZueXHJcbiAgICBwcml2YXRlIG9uU29ja2V0T3BlbihldmVudDogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Nvbm5ldE51bXMgPSAwO1xyXG4gICAgICAgIHRoaXMuY2xvc2V3YWl0cGFuZWwoKTtcclxuICAgICAgICB0aGlzLl9vZmZsaW5lc3RhdGUgPSAwO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoU29ja2V0Tm9maWZ5LlNPQ0tFVF9DT05ORUNUX1NVQ0NFRUQsIG51bGwsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvL+WQkeacjeWKoeerr+WPkemAgea2iOaBr1xyXG4gICAgcHVibGljIHNlbmRNZXNzYWdlKGFjdDogc3RyaW5nLCBkYXRhOiBhbnksIGlzU2hvd1dhaXQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgaWYoIHRoaXMuc29jayAmJiB0aGlzLnNvY2suY29ubmVjdGVkIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBpc1Nob3dXYWl0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVud2FpdHBhbmVsKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoICFkYXRhIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZGF0YT17fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhLkFDVElPTiA9IGFjdDtcclxuICAgICAgICAgICAgdGhpcy5zb2NrLnNlbmQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy/mtojmga/ov5Tlm57lkI7vvIzkvJrlub/mkq3lh7rljrtcclxuICAgIC8vR2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCLkvaDlj5HpgIHnmoRjbWTlkI3np7BcIiznm5HlkKzmlrnms5UsdGhpcylcclxuICAgIHByaXZhdGUgb25SZWNlaXZlTWVzc2FnZShtc2c6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICB2YXIgc29ja2V0ZGF0YTogYW55ID0gSlNPTi5wYXJzZShtc2cpO1xyXG5cclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBTb2NrZXROb2ZpZnlcclxueyAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBzb2NrZXTov57mjqXmiJDlip9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIFNPQ0tFVF9DT05ORUNUX1NVQ0NFRUQ6c3RyaW5nID0gXCJTT0NLRVRfQ09OTkVDVF9TVUNDRUVEXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBzb2NrZXTlhbPpl61cclxuICAgICAqL1xyXG4gICAgc3RhdGljIFNPQ0tFVF9DTE9TRTpzdHJpbmcgPSBcIlNPQ0tFVF9DTE9TRVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ri45oiP6YeN5paw6L+e5o6lXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBHYW1lX2FnYWluQ29ubmV0U29ja2V0OnN0cmluZyA9IFwiR2FtZV9hZ2FpbkNvbm5ldFNvY2tldFwiO1xyXG59IiwiZXhwb3J0IGNsYXNzIFdFQ0hBVEVWRU5UIFxyXG57XHJcbiAgICBcclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiDmuLjmiI/ov5vlhaXlkI7lj7Dkuovku7ZcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX29uaGlkZTpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX29uaGlkZVwiO1xyXG5cclxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9vbkF1ZGlvSW50ZXJydXB0aW9uRW5kOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfb25BdWRpb0ludGVycnVwdGlvbkVuZFwiO1xyXG5cclxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9sb3NlZm9jdXM6c3RyaW5nID0gXCJXRUNIQVRFVkVOVF9sb3NlZm9jdXNcIjtcclxuICAgIHN0YXRpYyBXRUNIQVRFVkVOVF9nZXRmb2N1czpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX2dldGZvY3VzXCI7XHJcblxyXG4gICAgc3RhdGljIFdFQ0hBVEVWRU5UX3VwZGF0ZVZpZGVvTnVtczpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX3VwZGF0ZVZpZGVvTnVtc1wiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55So5oi35omT54K5XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTEwMDI6c3RyaW5nID0gXCI5ODkxMDAyXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5blkI7lj7DmlbDmja5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTEwMTpzdHJpbmcgPSBcIjk4OTExMDFcIjtcclxuXHJcbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfbG9naW5TdWNjZWVkOnN0cmluZyA9IFwiV0VDSEFURVZFTlRfbG9naW5TdWNjZWVkXCI7XHJcbiAgICAvKipcclxuICAgICAqIOa4uOaIj+S7juWQjuWPsOaBouWkjeaYvuekuuS6i+S7tlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfb25zaG93OnN0cmluZyA9IFwiV0VDSEFURVZFTlRfb25zaG93XCI7XHJcblxyXG4gICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7juaUtuiXj+aIluiAhea1rueql+i/m+WFpea4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgV0VDSEFURVZFTlRfZnJvbXNjb3JmazpzdHJpbmcgPSBcIldFQ0hBVEVWRU5UX2Zyb21zY29yZmtcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOeZu+W9lVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbWVzc2FnZV85ODkxMDAxOnN0cmluZyA9IFwiOTg5MTAwMVwiO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlub/lkYrngrnlh7tcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG1lc3NhZ2VfOTg5MTEwMjpzdHJpbmcgPSBcIjk4OTExMDJcIjtcclxuICAgIC8qKlxyXG4gICAgICog54K55Ye756Gu5a6a6Lez6L2s5Yiw5aSW6YOo5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBtZXNzYWdlXzk4OTExMDM6c3RyaW5nID0gXCI5ODkxMTAzXCI7XHJcbn0iLCJpbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7U2VydmVySHR0cHN9IGZyb20gXCIuLi9XWFNESy9TZXJ2ZXJIdHRwc1wiO1xyXG5pbXBvcnQge1dFQ0hBVEVWRU5UfSBmcm9tIFwiLi4vV1hTREsvV0VDSEFURVZFTlRcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQge0RhdGVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9EYXRlQ29udHJvbFwiO1xyXG5pbXBvcnQge0xvY2FsRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2xcIjtcclxuaW1wb3J0IHtVc2VyRGF0YUluZm99IGZyb20gXCIuLi9EYXRhL1VzZXJEYXRhSW5mb1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7QXVkaW9Db250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9BdWRpb0NvbnRyb2xcIjtcclxuaW1wb3J0IHsgTGF5b3V0Q29udHJvbCB9IGZyb20gXCIuLi9Db250cm9sL0xheW91dENvbnRyb2xcIjtcclxuaW1wb3J0IHtwaW5ndGFpdXRpbHN9IGZyb20gXCIuLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0ICBjbGFzcyBXWEdhbWVQbGF0Zm9ybVxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6V1hHYW1lUGxhdGZvcm07XHJcblxyXG4gICAgc3RhdGljIGNvZGU6c3RyaW5nO1xyXG4gICAgc3RhdGljIG5pY2tOYW1lOnN0cmluZztcclxuICAgIHN0YXRpYyBRdURhb0lEOnN0cmluZyA9IFwiXCI7Ly/lvq7kv6Hlub/lkYpJRFxyXG5cclxuICAgIHN0YXRpYyBpc1Nob3dpbmc6Ym9vbGVhbj10cnVlO1xyXG4gICAgLyoqXHJcbiAgICAgKiDmjojmnYPnirbmgIEgMDrmnKrliKTmlq3vvIwx77ya5bey5o6I5p2DXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhY2NyZWRpdHN0YXRlOm51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvZPlpKnliIbkuqvmrKHmlbBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGRheVNoYXJlTnVtOm51bWJlciA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIOW9k+Wkqeeci+inhumikeasoeaVsFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZGF5VmlkZW9OdW06bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5YiG5Lqr5piv5ZCm5oiQ5Yqf5pe26Ze06Ze06ZqUXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBTaGFyZVRpbWU6bnVtYmVyID0gMDtcclxuICAgIC8qKlxyXG4gICAgICog5q+P5pel5pyA5aSn55yL6KeG6aKR5qyh5pWw77yI5oiQ5Yqf57Sv5Yqg5LiA5qyh77yJXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBWaWRlb051bTpudW1iZXIgPSAwO1xyXG4gICAgLyoqXHJcbiAgICAgKiDnnIvop4bpopHlhrfljbTml7bpl7RcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFZpZGVvVGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogOOWlveS9jWNwYeWPr+W8ueWHuuaXtumXtOmXtOmalCjnp5IpXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBqaWxpd2VpdGltZTpudW1iZXIgPSAxMDA7XHJcbiAgICAvKipcclxuICAgICAqIOWIhuS6q+WHoOasoeWIh+aNouWIsOinhumikVxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgU2hhcmV0b1ZpZGVvOm51bWJlciA9IDE7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDop4bpopHlh6DmrKHliIfmjaLliLDliIbkuqtcclxuICAgICAqL1xyXG4gICAgc3RhdGljIFZpZGVvdG9TaGFyZTpudW1iZXIgPSAxO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5YiG5Lqr5pWw5o2u5a655ZmoXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBTaGFyZURpY3Q6YW55ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlKjmiLfmnaXmupBpZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZnJvbXNjZW5lOm51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5pbnMgPSB0aGlzO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOldYR2FtZVBsYXRmb3JtXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgV1hHYW1lUGxhdGZvcm0oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFdYR2FtZVBsYXRmb3JtLmlucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnNob3dTaGFyZU1lbnUoe3dpdGhTaGFyZVRpY2tldDp0cnVlfSk7XHJcbiAgICAgICAgdGhpcy5vbkF1ZGlvSW50ZXJydXB0aW9uQmVnaW4oKTtcclxuICAgICAgICB0aGlzLm9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdFNoYXJlRGlhbiggZGF0YTpBcnJheTxhbnk+ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbWQ6YW55O1xyXG4gICAgICAgICAgICBmb3IoIHZhciBzIGluIGRhdGEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpdGVtZCA9IGRhdGFbc107XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5TaGFyZURpY3RbaXRlbWQua2V5XSA9IGl0ZW1kO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBmaXJzdGQ6YW55ID0gZGF0YVswXTtcclxuICAgICAgICAgICAgdGhpcy5vblNoYXJlQXBwTWVzc2FnZShmaXJzdGQudGlsZSxHbG9iYWwuY2RudXJsICsgZmlyc3RkLmltZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpbml0RGF0YSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggRGF0ZUNvbnRyb2wuRnJlc2ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW09MDtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW09MDtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlTaGFyZUluZm8oKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlWaWRlb0luZm8oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW09TG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRudW0oVXNlckRhdGFJbmZvLm5vd2RheVNoYXJlKTtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW09TG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5nZXRudW0oVXNlckRhdGFJbmZvLm5vd2RheVZpZGVvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5a2Y5YKo5b2T5aSp5YiG5Lqr55qE5L+h5oGvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEYXlTaGFyZUluZm8oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5hZGRzdHIoIFVzZXJEYXRhSW5mby5ub3dkYXlTaGFyZSxXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bS50b1N0cmluZygpICk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVEYXlWaWRlb0luZm8oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTG9jYWxEYXRhQ29udHJvbC5JbnN0YW5jZS5hZGRzdHIoIFVzZXJEYXRhSW5mby5ub3dkYXlWaWRlbyxXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bS50b1N0cmluZygpICk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1c2VyaW5mb2J1dHRvbjtcclxuICAgIHN0YXRpYyBsb2dpbkNhbGxvYmo6YW55O1xyXG4gICAgc3RhdGljIGxvZ2luc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgc3RhdGljIGxvZ2lucHJvZ3Jlc3NDYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBjcmVhdGVVc2VyQW5kTG9naW4oIGNhbGxvYmo6YW55LHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbixwcm9ncmVzc0NhbGxiYWNrOkZ1bmN0aW9uID1udWxsLCBmYWlsY2FsbGJhY2s6RnVuY3Rpb249bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbkNhbGxvYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2luc3VjY2VlZGNhbGxiYWNrID0gc3VjY2VlZGNhbGxiYWNrO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayA9IHByb2dyZXNzQ2FsbGJhY2s7XHJcbiAgICAgICAgdmFyIHd4OmFueSA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBsb2dpbl9pbmZvOmFueSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmdldExhdW5jaE9wdGlvbnNTeW5jKCk7XHJcbiAgICAgICAgICAgIGlmKGxvZ2luX2luZm8pXHJcbiAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPWxvZ2luX2luZm8ucXVlcnk7XHJcbiAgICAgICAgICAgICAgICBpZihxdWVyeSAmJiBxdWVyeS5DaGFuSUQpe1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQgPSBxdWVyeS5DaGFuSUQ7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHJlZmVycmVySW5mbyA9IGxvZ2luX2luZm8ucmVmZXJyZXJJbmZvO1xyXG4gICAgICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQgPT0gXCJcIiAmJiByZWZlcnJlckluZm8gJiYgcmVmZXJyZXJJbmZvLmFwcElkIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5RdURhb0lEID0gcmVmZXJyZXJJbmZvLmFwcElkO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCBsb2dpbl9pbmZvLnNjZW5lIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5mcm9tc2NlbmUgPSBOdW1iZXIoIGxvZ2luX2luZm8uc2NlbmUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgc3lzdGVtcmVzID0gd3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBzeXN0ZW1yZXMuU0RLVmVyc2lvbjtcclxuICAgICAgICAgICAgaWYgKHd4LmdldFVwZGF0ZU1hbmFnZXIpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdXBkYXRlTWFuYWdlciA9IHd4LmdldFVwZGF0ZU1hbmFnZXIoKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25DaGVja0ZvclVwZGF0ZShmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+35rGC5a6M5paw54mI5pys5L+h5oGv55qE5Zue6LCDXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCByZXMuaGFzVXBkYXRlPT10cnVlIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25VcGRhdGVSZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dNb2RhbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDmj5DnpLonLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICfmlrDniYjmnKzlt7Lnu4/lh4blpIflpb3vvIzmmK/lkKbph43lkK/lupTnlKjvvJ8nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5jb25maXJtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmlrDnmoTniYjmnKzlt7Lnu4/kuIvovb3lpb3vvIzosIPnlKggYXBwbHlVcGRhdGUg5bqU55So5paw54mI5pys5bm26YeN5ZCvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYW5hZ2VyLmFwcGx5VXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5leGl0R2FtZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hbmFnZXIub25VcGRhdGVGYWlsZWQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5paw54mI5pys5LiL6L295aSx6LSlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5leGl0R2FtZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiAmJiBXWEdhbWVQbGF0Zm9ybS5sb2dpbnByb2dyZXNzQ2FsbGJhY2sgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBXWEdhbWVQbGF0Zm9ybS5sb2dpbnByb2dyZXNzQ2FsbGJhY2suY2FsbCggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqLDEwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5sb2dpbihjYWxsb2JqLHN1Y2NlZWRjYWxsYmFjayxmYWlsY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZiggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqICYmIFdYR2FtZVBsYXRmb3JtLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgV1hHYW1lUGxhdGZvcm0ubG9naW5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaiwxMCApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0ubG9naW4oY2FsbG9iaixzdWNjZWVkY2FsbGJhY2ssZmFpbGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1c2VyaW5mb2NhbGxvYmo6YW55O1xyXG4gICAgdXNlcmluZm9zdWNjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHVzZXJpbmZvZmFpbGNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIGNyZWF0ZVVzZXJJbmZvQnV0dG9uKCAgY2FsbG9iajphbnksY2FsbGJhY2s6RnVuY3Rpb24sZmFpbGNhbGxiYWNrOkZ1bmN0aW9uKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy51c2VyaW5mb2NhbGxvYmogPSBjYWxsb2JqO1xyXG4gICAgICAgIHRoaXMudXNlcmluZm9zdWNjYWxsYmFjayA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMudXNlcmluZm9mYWlsY2FsbGJhY2sgPSBmYWlsY2FsbGJhY2s7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBsZXQgcmVzID0gd3guZ2V0U3lzdGVtSW5mb1N5bmMoKTtcclxuICAgICAgICBpZiggcmVzIClcclxuICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICB2YXIgcG9zeDpudW1iZXIgPSAocmVzLndpbmRvd1dpZHRoLTE1MSkvMjtcclxuICAgICAgICAgICAgdmFyIHBvc3k6bnVtYmVyID0gcmVzLndpbmRvd0hlaWdodC0xNzIgLSA0MDtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UudXNlcmluZm9idXR0b24gPSB3eC5jcmVhdGVVc2VySW5mb0J1dHRvbihcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlJyxcclxuICAgICAgICAgICAgICAgIGltYWdlOid3eGxvY2FsL2xvZ2luLnBuZycsXHJcbiAgICAgICAgICAgICAgICBzdHlsZTpcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBwb3N4LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogcG9zeSxcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUxLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNzJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnVzZXJpbmZvYnV0dG9uLm9uVGFwKCBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS51c2VyaW5mb0J1dHRvbkNsaWNrICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5piv5ZCm5bey57uP5o6I5p2DXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRhY2NyZWRpdCggY2FsbG9iajphbnksYWNjcmVkaXRDYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uYWNjcmVkaXRzdGF0ZSA9PSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAgICAgIHsgICBcclxuICAgICAgICAgICAgICAgIHd4LmdldFNldHRpbmcoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyAocmVzKSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtZCA9IHJlcy5hdXRoU2V0dGluZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGl0ZW1kLmhhc093blByb3BlcnR5KCBcInNjb3BlLnVzZXJJbmZvXCIgKSAmJiBpdGVtZFtcInNjb3BlLnVzZXJJbmZvXCJdID09IHRydWUgKSAvL+W3sue7j+aOiOadg+i/h1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhY2NyZWRpdENhbGxiYWNrJiZjYWxsb2JqKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaix0cnVlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhY2NyZWRpdENhbGxiYWNrJiZjYWxsb2JqKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaixmYWxzZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZihhY2NyZWRpdENhbGxiYWNrJiZjYWxsb2JqKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjY3JlZGl0Q2FsbGJhY2suY2FsbCggY2FsbG9iaix0cnVlICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYWNjcmVkaXRDYWxsYmFjay5jYWxsKCBjYWxsb2JqLHRydWUgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXNlcmluZm9CdXR0b25DbGljayggcmVzOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG5cclxuICAgICAgICBpZiggcmVzIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBlcnJNc2c6c3RyaW5nID0gcmVzLmVyck1zZztcclxuICAgICAgICAgICAgaWYoIGVyck1zZyA9PSBcImdldFVzZXJJbmZvOm9rXCIgKVxyXG4gICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uYWNjcmVkaXRzdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmNsb3NldXNlcmluZm9iVXR0b24oKTtcclxuICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0uZ2V0VXNlckluZm8oIGZhbHNlLHd4cGxhdGZvcm0udXNlcmluZm9jYWxsb2JqLHd4cGxhdGZvcm0udXNlcmluZm9zdWNjYWxsYmFjayx3eHBsYXRmb3JtLnVzZXJpbmZvZmFpbGNhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoIHd4cGxhdGZvcm0udXNlcmluZm9jYWxsb2JqICYmIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2sgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHd4cGxhdGZvcm0udXNlcmluZm9mYWlsY2FsbGJhY2suY2FsbCggd3hwbGF0Zm9ybS51c2VyaW5mb2NhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb2JVdHRvbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgIGlmKHd4cGxhdGZvcm0udXNlcmluZm9idXR0b24pXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eHBsYXRmb3JtLnVzZXJpbmZvYnV0dG9uLm9mZlRhcCh3eHBsYXRmb3JtLnVzZXJpbmZvQnV0dG9uQ2xpY2spO1xyXG4gICAgICAgICAgICB3eHBsYXRmb3JtLnVzZXJpbmZvYnV0dG9uLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgd3hwbGF0Zm9ybS51c2VyaW5mb2J1dHRvbj1udWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VXNlckluZm8oIGlzbG9naW46Ym9vbGVhbixjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdmFyIHd4cGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5nZXRVc2VySW5mbyhcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdXNlckluZm8gPSByZXMudXNlckluZm87XHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0ubmlja05hbWUgPSB1c2VySW5mby5uaWNrTmFtZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggaXNsb2dpbiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmxvZ2luKGNhbGxvYmosY2FsbGJhY2ssZmFpbGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGxvYmogJiYgY2FsbGJhY2sgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCBjYWxsb2JqLFdYR2FtZVBsYXRmb3JtLm5pY2tOYW1lICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55m75b2VXHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXHJcbiAgICAgKiBAcGFyYW0gZmFpbENhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9naW4oIGNhbGxvYmo6YW55LGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gubG9naW4oe1xyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKCByZXMgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uY29kZSA9IHJlcy5jb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtZDphbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uUXVEYW9JRCAhPSBcIlwiIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1kLkNoYW5JRCA9IFdYR2FtZVBsYXRmb3JtLlF1RGFvSUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLkNvZGUgPSBXWEdhbWVQbGF0Zm9ybS5jb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLkFwcElEID0gR2xvYmFsLmFwcGlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1kLlZlcnNpb24gPSBHbG9iYWwuZ2FtZVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZmFpbDpmdW5jdGlvbihyZXMpe1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLmxvZ2luKCBjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvZ2luU3VjY2VlZENhbGxiYWNrKCBkYXRhOmFueSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0ubG9naW5DYWxsb2JqICYmIFdYR2FtZVBsYXRmb3JtLmxvZ2luc3VjY2VlZGNhbGxiYWNrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmxvZ2luc3VjY2VlZGNhbGxiYWNrLmNhbGwoIFdYR2FtZVBsYXRmb3JtLmxvZ2luQ2FsbG9iaixkYXRhICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgX3N1YmNhbGxvYmo6YW55O1xyXG4gICAgcHVibGljIF9zdWJjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBfdXBkYXRlY2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgX3N1YmZhaWxjYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHB1YmxpYyBsb2FkU3VicGFja2FnZSggbmFtZTpzdHJpbmcsc3ViY2FsbG9iajphbnksc3ViY2FsbGJhY2s6RnVuY3Rpb24sdXBkYXRlY2FsbGJhY2s6RnVuY3Rpb24sc3ViZmFpbGNhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1YmNhbGxvYmogPSBzdWJjYWxsb2JqO1xyXG4gICAgICAgICAgICB0aGlzLl9zdWJjYWxsYmFjayA9IHN1YmNhbGxiYWNrO1xyXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVjYWxsYmFjayA9IHVwZGF0ZWNhbGxiYWNrO1xyXG4gICAgICAgICAgICB0aGlzLl9zdWJmYWlsY2FsbGJhY2sgPSBzdWJmYWlsY2FsbGJhY2s7XHJcbiAgICAgICAgICAgIHZhciB3eDphbnkgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgICAgICBpZiggd3gubG9hZFN1YnBhY2thZ2UgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFzayA9IHd4LmxvYWRTdWJwYWNrYWdlKHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIhuWMheWKoOi9veaIkOWKn+WQjumAmui/hyBzdWNjZXNzIOWbnuiwg1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHd4Z2FtZVBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24ocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIhuWMheWKoOi9veWksei0pemAmui/hyBmYWlsIOWbnuiwg1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLl9zdWJmYWlsY2FsbGJhY2sgJiYgd3hnYW1lUGxhdGZvcm0uX3N1YmNhbGxvYmogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS5fc3ViZmFpbGNhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLl9zdWJjYWxsb2JqICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTsgIFxyXG4gICAgICAgICAgICAgICAgaWYobG9hZFRhc2sub25Qcm9ncmVzc1VwZGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2sub25Qcm9ncmVzc1VwZGF0ZShyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHd4Z2FtZVBsYXRmb3JtLl91cGRhdGVjYWxsYmFjayAmJiB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLl91cGRhdGVjYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS5fc3ViY2FsbG9iaixyZXMucHJvZ3Jlc3MgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggc3ViY2FsbG9iaiAmJiBzdWJjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ViY2FsbGJhY2suY2FsbCggc3ViY2FsbG9iaiApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBzdWJjYWxsb2JqICYmIHN1YmNhbGxiYWNrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3ViY2FsbGJhY2suY2FsbCggc3ViY2FsbG9iaiApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W6L2s5Y+R6K+m57uG5L+h5oGvXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICogQHBhcmFtIGZhaWxDYWxsYmFjayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNoYXJlSW5mbyggb2JqOmFueSxjYWxsb2JqOmFueSwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uLGZhaWxDYWxsYmFjazpGdW5jdGlvbiA9IG51bGwgKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guZ2V0U2hhcmVJbmZvKHtcclxuICAgICAgICAgICAgICAgIHNoYXJlVGlja2V0Om9iai5zaGFyZVRpY2tldCxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmoscmVzICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55uR5ZCs55So5oi354K55Ye75Y+z5LiK6KeS6I+c5Y2V55qE4oCc6L2s5Y+R4oCd5oyJ6ZKu5pe26Kem5Y+R55qE5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgXHJcbiAgICAgKiBAcGFyYW0gaW1hZ2VVcmwgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNoYXJlQXBwTWVzc2FnZSggdGl0bGU6c3RyaW5nLGltYWdlVXJsOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uU2hhcmVBcHBNZXNzYWdlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6dGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmw6aW1hZ2VVcmxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDkuLvliqjmi4notbfovazlj5HvvIzov5vlhaXpgInmi6npgJrorq/lvZXnlYzpnaLjgIJcclxuICAgICAqIEBwYXJhbSB0aXRsZSBcclxuICAgICAqIEBwYXJhbSBpbWFnZVVybCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNoYXJlQXBwTWVzc2FnZSggZDphbnkgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaGFyZUFwcE1lc3NhZ2UoZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65b2T5YmN6aG16Z2i55qE6L2s5Y+R5oyJ6ZKuXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd1NoYXJlTWVudSggb2JqOmFueSA9IG51bGwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5zaG93U2hhcmVNZW51KG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pu05paw6L2s5Y+R5bGe5oCnXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhcmVNZW51KCBvYmo6YW55ID0gbnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnVwZGF0ZVNoYXJlTWVudShvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuuW9k+WJjemhtemdoueahOi9rOWPkeaMiemSrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd01lbnUoKSBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dTaGFyZU1lbnUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldFN0b3JhZ2VTeW5jKGtleTpzdHJpbmcsIGRhdGE6YW55KSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdG9yYWdlU3luYyhrZXk6c3RyaW5nKTphbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiggd3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIHd4LmdldFN0b3JhZ2VTeW5jKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRVc2VyQ2xvdWRTdG9yYWdlKG9iaixjYWxsb2JqOmFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsQ2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsKSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5zZXRVc2VyQ2xvdWRTdG9yYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4LnNldFVzZXJDbG91ZFN0b3JhZ2Uoe1xyXG4gICAgICAgICAgICAgICAgS1ZEYXRhTGlzdDogb2JqLFxyXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHN1Y2NlZWRjYWxsYmFjaylcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRjYWxsYmFjay5jYWxsKCBjYWxsb2JqLHJlcyApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZmFpbENhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbENhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaYvuekuua2iOaBr+aPkOekuuahhlxyXG4gICAgICogQHBhcmFtIHdvcmQgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2FzdCh3b3JkOnN0cmluZyk6dm9pZCBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnNob3dUb2FzdCh7IHRpdGxlOiB3b3JkIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWQkeW8gOaUvuaVsOaNruWfn+WPkemAgea2iOaBr1xyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvc3RNZXNzYWdlKHN0cjpzdHJpbmcsZGF0YTphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gd3guZ2V0T3BlbkRhdGFDb250ZXh0KCk7XHJcbiAgICAgICAgICAgIGNvbnRleHQucG9zdE1lc3NhZ2UoeyBhY3Rpb246IHN0cixkYXRhOmRhdGEgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yib5bu65LiA5LiqIElubmVyQXVkaW9Db250ZXh0IOWunuS+i1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQoKTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jcmVhdGVJbm5lckF1ZGlvQ29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluezu+e7n+S/oeaBr1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3lzdGVtSW5mb1N5bmMoKTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmihOiniOWbvueJh++8jOiwg+eUqOS5i+WQjuS8muWcqOaWsOaJk+W8gOeahOmhtemdouS4reWFqOWxj+mihOiniOS8oOWFpeeahOWbvueJh++8jOmihOiniOeahOi/h+eoi+S4reeUqOaIt+WPr+S7pei/m+ihjOS/neWtmOWbvueJh+OAgeWPkemAgee7meaci+WPi+etieaTjeS9nFxyXG4gICAgICogQHBhcmFtIG9iaiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByZXZpZXdJbWFnZShvYmopIFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gucHJldmlld0ltYWdlKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55uR5ZCs5bCP5ri45oiP6ZqQ6JeP5Yiw5ZCO5Y+w5LqL5Lu244CC6ZSB5bGP44CB5oyJIEhPTUUg6ZSu6YCA5Yiw5qGM6Z2i44CB5pi+56S65Zyo6IGK5aSp6aG26YOo562J5pON5L2c5Lya6Kem5Y+R5q2k5LqL5Lu244CCXHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkhpZGUoY2FsbG9iajphbnksIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3gub25IaWRlKGZ1bmN0aW9uIChyZXMpIHtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmlzU2hvd2luZz1mYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmKHN1Y2NlZWRjYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZWVkY2FsbGJhY2suY2FsbChjYWxsb2JqLCByZXMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOi/lOWbnuWwj+eoi+W6j+WQr+WKqOWPguaVsFxyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gc3VjY2VlZGNhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TGF1bmNoT3B0aW9uc1N5bmMoKTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gTGF5YS5Ccm93c2VyLndpbmRvdy53eC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog6ZqQ6JeP5raI5oGv5o+Q56S65qGGXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGlkZVRvYXN0KG9iaik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guaGlkZVRvYXN0KG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pi+56S65qih5oCB5a+56K+d5qGGXHJcbiAgICAgKiBAcGFyYW0gb2JqIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd01vZGFsKG9iaik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guc2hvd01vZGFsKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riF55CG5a2Y5YKo5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhclN0b3JhZ2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5jbGVhclN0b3JhZ2VTeW5jKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5L2/5omL5py65Y+R55Sf6L6D55+t5pe26Ze055qE5oyv5Yqo77yIMTUgbXPvvIlcclxuICAgICAqIEBwYXJhbSBvYmogXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2aWJyYXRlU2hvcnQoKSBcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7juacrOWcsOe8k+WtmOS4reenu+mZpOaMh+WumiBrZXlcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVTdG9yYWdlKGtleTpzdHJpbmcpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnJlbW92ZVN0b3JhZ2Uoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQXVkaW9JbnRlcnJ1cHRpb25CZWdpbigpOnZvaWR7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cud3ggKXtcclxuICAgICAgICAgICAgTGF5YS5Ccm93c2VyLndpbmRvdy53eC5vbkF1ZGlvSW50ZXJydXB0aW9uQmVnaW4oZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIC8vIFNvdW5kc3NNYW5hZ2VyLkluc3RhbmNlLnBsYXliZ1NvdW5kKFwiYmdtXCIpO1xyXG4gICAgICAgICAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLkNsZWFyQWxsU09VTkQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF1ZGlvSW50ZXJydXB0aW9uRW5kKCk6dm9pZHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApe1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4Lm9uQXVkaW9JbnRlcnJ1cHRpb25FbmQoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIHZhciB3eGdhbWVwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5jbGVhciggd3hnYW1lcGxhdGZvcm0sd3hnYW1lcGxhdGZvcm0ub25BdWRpb0VuZENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDUwMCx3eGdhbWVwbGF0Zm9ybSx3eGdhbWVwbGF0Zm9ybS5vbkF1ZGlvRW5kQ2FsbGJhY2sgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF1ZGlvRW5kQ2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggV0VDSEFURVZFTlQuV0VDSEFURVZFTlRfb25BdWRpb0ludGVycnVwdGlvbkVuZCApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCA5Ye65ri45oiPXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleGl0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5leGl0TWluaVByb2dyYW0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmiZPlvIDlrqLmnI3lr7nor53moYZcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9wZW5DdXN0b21lclNlcnZpY2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4ID0gTGF5YS5Ccm93c2VyLndpbmRvdy53eDtcclxuICAgICAgICBpZiAod3gpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdmVyc2lvbiA9IHd4LmdldFN5c3RlbUluZm9TeW5jKCkuU0RLVmVyc2lvbjtcclxuICAgICAgICAgICAgaWYoIEdhbWVVdGlscy5jb21wYXJlVmVyc2lvbih2ZXJzaW9uLCAnMi4wLjMnKSA+PSAwICYmIHd4Lm9wZW5DdXN0b21lclNlcnZpY2VDb252ZXJzYXRpb24gKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3eC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ29udmVyc2F0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93TWVzc2FnZUNhcmQ6dHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZUltZzpcImh0dHBzOi8vcmVzb3VyY2UuNTF5b3lveW8uY29tL3Jlcy93eHNlbmRtZXNzYWdlaW1nL3NtaS5qcGdcIlxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAvLyBBbGVydFV0aWxzLnNob3dXb3JkVGlwcyhcIuW9k+WJjeW+ruS/oeeJiOacrOS4jeaUr+aMgVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOebkeWQrOWGheWtmOS4jei2s+WRiuitplxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25NZW1vcnlXYXJuaW5nKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eCA9IExheWEuQnJvd3Nlci53aW5kb3cud3g7XHJcbiAgICAgICAgaWYoIHd4ICYmIHd4Lm9uTWVtb3J5V2FybmluZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5vbk1lbW9yeVdhcm5pbmcoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5vbkVycm9yIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4Lm9uRXJyb3IoZnVuY3Rpb24oIHJlcyApe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCIqKioqKm9uRXJyb3JcIixyZXMpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm93U2hhcmVpbmRleDpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIG5vd3NoYXJlT2JqOmFueTtcclxuICAgIHB1YmxpYyBub3dzaGFyZXN1Y2NlZWRmdW46RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgbm93c2hhcmVmYWlsZnVuOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIG5vd3NoYXJlaW5mbzphbnk7XHJcbiAgICBwdWJsaWMgc3RhcnRTaGFyZVRpbWU6bnVtYmVyO1xyXG4gICAgcHVibGljIGlzU2hhcmVpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgc3RhdGljIGNhbGxiYWNrZmFpbHN0YXRlOm51bWJlciA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+WIhuS6q1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhcnRTaGFyZUFwcChrZXk6c3RyaW5nLGNhbGxvYmo6YW55PW51bGwsc3VjY2VlZENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLm5vd1NoYXJlaW5kZXg9MDtcclxuICAgICAgICBpZiggV1hHYW1lUGxhdGZvcm0uU2hhcmVEaWN0W2tleV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zaGFyZUFwcCggV1hHYW1lUGxhdGZvcm0uU2hhcmVEaWN0W2tleV0sY2FsbG9iaixzdWNjZWVkQ2FsbGJhY2ssZmFpbENhbGxiYWNrICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2hhcmVBcHAoaW5mbzphbnksY2FsbG9iajphbnksIHN1Y2Nlc3M6IEZ1bmN0aW9uLGZhaWxDYWxsYmFjazpGdW5jdGlvbikgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dzaGFyZU9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy5ub3dzaGFyZWluZm8gPSBpbmZvO1xyXG4gICAgICAgIHRoaXMubm93c2hhcmVzdWNjZWVkZnVuID0gc3VjY2VzcztcclxuICAgICAgICB0aGlzLm5vd3NoYXJlZmFpbGZ1biA9IGZhaWxDYWxsYmFjaztcclxuICAgICAgICB0aGlzLnN0YXJ0U2hhcmVUaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgIHRoaXMuaXNTaGFyZWluZyA9IHRydWU7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0uY2FsbGJhY2tmYWlsc3RhdGUgPSAwO1xyXG4gICAgICAgIHRoaXMuc2hhcmVBcHBNZXNzYWdlKHtcclxuICAgICAgICAgICAgdGl0bGU6aW5mby50aWxlLGltYWdlVXJsOkdsb2JhbC5jZG51cmwgKyBpbmZvLmltZyxxdWVyeTpcIlwiLFxyXG4gICAgICAgICAgICBzdWNjZXNzOmZ1bmN0aW9uIChyZXMpXHJcbiAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgIH0sIFxyXG4gICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAocmVzKXtcclxuICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoXCLmgqjlj5bmtojkuobliIbkuqtcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFpbENhbGxiYWNrICYmIGNhbGxvYmogKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBmYWlsQ2FsbGJhY2suY2FsbChjYWxsb2JqKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uY2FsbGJhY2tmYWlsc3RhdGUgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgICAgICBcclxuXHJcbiAgICBwdWJsaWMgc2hvd29iajphbnk7XHJcbiAgICBwdWJsaWMgc2hvd0NhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgLyoqXHJcbiAgICAgKiDnm5HlkKzlsI/muLjmiI/lm57liLDliY3lj7DnmoTkuovku7ZcclxuICAgICAqIEBwYXJhbSBjYWxsb2JqIFxyXG4gICAgICogQHBhcmFtIHN1Y2NlZWRjYWxsYmFjayBcclxuICAgICAqIEBwYXJhbSBmYWlsQ2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNob3coY2FsbG9iajphbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCkgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5zaG93b2JqID0gY2FsbG9iajtcclxuICAgICAgICB0aGlzLnNob3dDYWxsYmFjayA9IHN1Y2NlZWRjYWxsYmFjaztcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5vblNob3coZnVuY3Rpb24gKHJlcykgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmlzU2hvd2luZz10cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCByZXMgJiYgcmVzLnNjZW5lIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5mcm9tc2NlbmUgPSBOdW1iZXIoIHJlcy5zY2VuZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5mcmFtZU9uY2UoIDEsV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UsV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub25TaG93U3VjY2VlZCApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2hvd1N1Y2NlZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHd4Z2FtZXBsYXRmb3JtOldYR2FtZVBsYXRmb3JtID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2U7XHJcbiAgICAgICAgaWYoIHd4Z2FtZXBsYXRmb3JtLnNob3dvYmogJiYgd3hnYW1lcGxhdGZvcm0uc2hvd0NhbGxiYWNrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLnNob3dDYWxsYmFjay5jYWxsKCB3eGdhbWVwbGF0Zm9ybS5zaG93b2JqICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB3eGdhbWVwbGF0Zm9ybS5pc1NoYXJlaW5nICkgLy/lpoLmnpzmmK/liIbkuqvnirbmgIFcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLmlzU2hhcmVpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdmFyIGlzU2hhcmVTdWNjZWVkOmJvb2xlYW49ZmFsc2U7XHJcbiAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5jYWxsYmFja2ZhaWxzdGF0ZT09MCApIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbm93VGltZTpudW1iZXIgPUxheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICAgICAgICAgIHZhciBkaXNUaW1lOm51bWJlciA9KG5vd1RpbWUgLSB3eGdhbWVwbGF0Zm9ybS5zdGFydFNoYXJlVGltZSkvMTAwMDtcclxuICAgICAgICAgICAgICAgIGlmKCBkaXNUaW1lPj1XWEdhbWVQbGF0Zm9ybS5TaGFyZVRpbWUgfHwgV1hHYW1lUGxhdGZvcm0ubm93U2hhcmVpbmRleCA+PSAzIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpc1NoYXJlU3VjY2VlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uY2FsbGJhY2tmYWlsc3RhdGU9MDtcclxuICAgICAgICAgICAgaWYoIGlzU2hhcmVTdWNjZWVkIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZGF5U2hhcmVOdW0rKztcclxuICAgICAgICAgICAgICAgIHd4Z2FtZXBsYXRmb3JtLnVwZGF0ZURheVNoYXJlSW5mbygpO1xyXG4gICAgICAgICAgICAgICAgaWYoIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlT2JqICYmIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlc3VjY2VlZGZ1biApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgd3hnYW1lcGxhdGZvcm0ubm93c2hhcmVzdWNjZWVkZnVuLmNhbGwoIHd4Z2FtZXBsYXRmb3JtLm5vd3NoYXJlT2JqICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5ub3dTaGFyZWluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVwbGF0Zm9ybS5zaG93TW9kYWwoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwi5o+Q56S6XCIsIGNvbnRlbnQ6IFwi6K+35q+P5qyh5YiG5Lqr5Yiw5LiN5ZCM576kLOaYr+WQpumHjeaWsOWIhuS6q++8n1wiLCBzaG93Q2FuY2VsOiB0cnVlLCBjYW5jZWxUZXh0OiAn5Y+W5raIJywgY29uZmlybVRleHQ6ICfnoa7lrponLFxyXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXMpXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3hwbGF0Zm9ybTpXWEdhbWVQbGF0Zm9ybSA9IFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmNvbmZpcm0pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5zaGFyZUFwcCggd3hwbGF0Zm9ybS5ub3dzaGFyZWluZm8sd3hwbGF0Zm9ybS5ub3dzaGFyZU9iaix3eHBsYXRmb3JtLm5vd3NoYXJlc3VjY2VlZGZ1bixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eHBsYXRmb3JtLm5vd3NoYXJlZmFpbGZ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggd3hwbGF0Zm9ybS5ub3dzaGFyZWZhaWxmdW4gJiYgd3hwbGF0Zm9ybS5ub3dzaGFyZU9iaiApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3hwbGF0Zm9ybS5ub3dzaGFyZWZhaWxmdW4uY2FsbCggd3hwbGF0Zm9ybS5ub3dzaGFyZU9iaiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKCkgXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOmZ1bmN0aW9uKClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsYXN0VmlkZW9UaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHZpZGVvQWQ7XHJcbiAgICBwdWJsaWMgdmlkZW9jYWxsb2JqOmFueTtcclxuICAgIHB1YmxpYyB2aWRlb3N1Y2NlZWRDYWxsYmFjazpGdW5jdGlvbjtcclxuICAgIHByaXZhdGUgdmlkZW9mYWlsQ2FsbGJhY2s6RnVuY3Rpb247XHJcbiAgICBwdWJsaWMgbm93dmlkZW9rZXk6c3RyaW5nO1xyXG4gICAgIC8qKlxyXG4gICAgICog6KeG6aKR5piv5ZCm5Zyo5pKt5pS+5LitXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB2aWRlb3BsYXlpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHN0YXRpYyBpc3RvbmdqaVZpZGVvTnVtOmJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog55yL6KeG6aKR6aKG5aWW5YqxXHJcbiAgICAgKiBAcGFyYW0gY2FsbG9iaiBcclxuICAgICAqIEBwYXJhbSBzdWNjZWVkY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwbGF5VmlkZW8oIGtleTpzdHJpbmcsIGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbj1udWxsLGlzdG9uZ2ppTnVtOmJvb2xlYW4gPSB0cnVlIClcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5jcmVhdGVSZXdhcmRlZFZpZGVvQWQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoICFXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmcgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGltZTpudW1iZXIgPSB0aGlzLmxvY2tWaWRlb0xlZnRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICBpZiggdGltZSA+IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi5bm/5ZGK5bCa5pyq5YeG5aSH5aW977yM6K+3XCIrIHRpbWUgK1wi56eS5ZCO5YaN6K+VXCIgKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9sb3NlZm9jdXMgKTtcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLmlzdG9uZ2ppVmlkZW9OdW0gPSBpc3RvbmdqaU51bTtcclxuICAgICAgICAgICAgICAgIHRoaXMubm93dmlkZW9rZXkgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmc9dHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9jYWxsb2JqID0gY2FsbG9iajtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9zdWNjZWVkQ2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvZmFpbENhbGxiYWNrID0gZmFpbENhbGxiYWNrO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkID0gd3guY3JlYXRlUmV3YXJkZWRWaWRlb0FkKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkVW5pdElkOidhZHVuaXQtMGM2ODcwODRjOTA4ZWU4OSdcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLm9uQ2xvc2UodGhpcy5jbG9zZUFEKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9BZC5vbkVycm9yKCB0aGlzLm9uZXJybyApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IHRoaXMudmlkZW9BZC5zaG93KCkpLmNhdGNoKGVyciA9PiB7IGNvbnNvbGUubG9nKGVyci5lcnJNc2cpLFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmZhaWxWaWRlbygpIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGxvY2tWaWRlb0xlZnRUaW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHRpbWU6bnVtYmVyID0gKExheWEuQnJvd3Nlci5ub3coKS1XWEdhbWVQbGF0Zm9ybS5sYXN0VmlkZW9UaW1lKS8xMDAwOyBcclxuICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uVmlkZW9UaW1lIC0gdGltZTtcclxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRpbWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIG9uZXJybyhyZXMpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmc9ZmFsc2U7XHJcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZFcnJvcih3eGdhbWVQbGF0Zm9ybS5vbmVycm8pOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkNsb3NlKHd4Z2FtZVBsYXRmb3JtLmNsb3NlQUQpOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9nZXRmb2N1cyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWFs+mXreW5v+WRilxyXG4gICAgcHVibGljIGNsb3NlQUQoc3RhdHVzKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0ubGFzdFZpZGVvVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm06V1hHYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICBpZiAoc3RhdHVzICYmIHN0YXR1cy5pc0VuZGVkIHx8IHN0YXR1cyA9PSB1bmRlZmluZWQpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIFdYR2FtZVBsYXRmb3JtLmlzdG9uZ2ppVmlkZW9OdW0gKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSsrO1xyXG4gICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udXBkYXRlRGF5VmlkZW9JbmZvKCk7XHJcbiAgICAgICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF91cGRhdGVWaWRlb051bXMgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICYmIHd4Z2FtZVBsYXRmb3JtLnZpZGVvc3VjY2VlZENhbGxiYWNrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9zdWNjZWVkQ2FsbGJhY2suY2FsbCggd3hnYW1lUGxhdGZvcm0udmlkZW9jYWxsb2JqICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IFxyXG4gICAgICAgIGVsc2UgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuacquingueci+WujOaVtOinhumike+8jOaXoOazleiOt+W+l+WlluWKsVwiICk7XHJcbiAgICAgICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogJiYgd3hnYW1lUGxhdGZvcm0udmlkZW9mYWlsQ2FsbGJhY2sgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb2ZhaWxDYWxsYmFjay5jYWxsKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS52aWRlb3BsYXlpbmc9ZmFsc2U7XHJcbiAgICAgICAgd3hnYW1lUGxhdGZvcm0udmlkZW9BZC5vZmZFcnJvcih3eGdhbWVQbGF0Zm9ybS5vbmVycm8pOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkNsb3NlKHd4Z2FtZVBsYXRmb3JtLmNsb3NlQUQpOyAvL+enu+mZpCDkuI3nhLbooqvlpJrmrKHosIPnlKhcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9nZXRmb2N1cyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOW5v+WRiuWksei0pVxyXG4gICAgcHVibGljIGZhaWxWaWRlbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBXWEdhbWVQbGF0Zm9ybS5sYXN0VmlkZW9UaW1lID0gTGF5YS5Ccm93c2VyLm5vdygpO1xyXG4gICAgICAgIFdYR2FtZVBsYXRmb3JtLnZpZGVvcGxheWluZz1mYWxzZTtcclxuICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuW5v+WRiuWKoOi9veWksei0pSzor5Xor5XliKvnmoTmlrnlvI/lkKd+XCIgKTtcclxuICAgICAgICB2YXIgd3hnYW1lUGxhdGZvcm0gPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICB3eGdhbWVQbGF0Zm9ybS52aWRlb0FkLm9mZkVycm9yKHd4Z2FtZVBsYXRmb3JtLm9uZXJybyk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvQWQub2ZmQ2xvc2Uod3hnYW1lUGxhdGZvcm0uY2xvc2VBRCk7IC8v56e76ZmkIOS4jeeEtuiiq+Wkmuasoeiwg+eUqFxyXG4gICAgICAgIGlmKCB3eGdhbWVQbGF0Zm9ybS52aWRlb2NhbGxvYmogJiYgd3hnYW1lUGxhdGZvcm0udmlkZW9mYWlsQ2FsbGJhY2sgKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHd4Z2FtZVBsYXRmb3JtLnZpZGVvZmFpbENhbGxiYWNrLmNhbGwoIHd4Z2FtZVBsYXRmb3JtLnZpZGVvY2FsbG9iaiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9nZXRmb2N1cyApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0NhblZpZGVvKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSA8IFdYR2FtZVBsYXRmb3JtLlZpZGVvTnVtIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bSA9PSAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHZpZGVvYnM6bnVtYmVyID0gTWF0aC5mbG9vcihXWEdhbWVQbGF0Zm9ybS5kYXlWaWRlb051bS9XWEdhbWVQbGF0Zm9ybS5WaWRlb3RvU2hhcmUpO1xyXG4gICAgICAgICAgICB2YXIgc2hhcmViczpudW1iZXIgPSBNYXRoLmZsb29yKFdYR2FtZVBsYXRmb3JtLmRheVNoYXJlTnVtL1dYR2FtZVBsYXRmb3JtLlNoYXJldG9WaWRlbyk7XHJcbiAgICAgICAgICAgIGlmKCB2aWRlb2JzID4gc2hhcmVicyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCB2aWRlb2JzIDwgc2hhcmVicyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZpZGVveXVzaHU6bnVtYmVyID0gV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW0lV1hHYW1lUGxhdGZvcm0uVmlkZW90b1NoYXJlO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZpZGVveXVzaHUgIT0gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2YXIgc2hhcmV5dXNodTpudW1iZXIgPSBXWEdhbWVQbGF0Zm9ybS5kYXlTaGFyZU51bSVXWEdhbWVQbGF0Zm9ybS5TaGFyZXRvVmlkZW87XHJcbiAgICAgICAgICAgICAgICBpZiggc2hhcmV5dXNodSAhPSAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBiYW5uZXJSdW5UaW1lOm51bWJlcj0wO1xyXG4gICAgcHJpdmF0ZSBiYW5uZXJBZDtcclxuICAgIHB1YmxpYyBub3dTdHlwZTphbnk7XHJcbiAgICBwcml2YXRlIF9iYW5uZXJUeXBlTGlzdDpBcnJheTxhbnk+ID0gW107XHJcbiAgICBwdWJsaWMgY3JlYXRlQmFubmVyKCBiYW5uZXJ0eXBlOnN0cmluZz1cIlwiLHN0eWxlOmFueSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBiYW5uZXJ0eXBlICE9IFwiXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgYm86Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yKCB2YXIgaTpudW1iZXIgPSAwO2kgPCB0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGg7aSsrIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggYmFubmVydHlwZSA9PSB0aGlzLl9iYW5uZXJUeXBlTGlzdFtpXS50eXBlIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0W2ldLnN0eWxlID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IHRoaXMuX2Jhbm5lclR5cGVMaXN0LnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0LnB1c2goIGFyclswXSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBibyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCAhYm8gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhbm5lclR5cGVMaXN0LnB1c2goIHsgdHlwZTpiYW5uZXJ0eXBlLHN0eWxlOnN0eWxlIH0gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGg9PTAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbTphbnkgPSB0aGlzLl9iYW5uZXJUeXBlTGlzdFt0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGgtMV07XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBpdGVtLnN0eWxlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5vdyA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICAgICAgICAgIC8v6LaF6L+HM+WIhumSn+WIt+aWsFxyXG4gICAgICAgICAgICAgICAgaWYgKG5vdyAtIHRoaXMuYmFubmVyUnVuVGltZSA+IDYwMDAwICogMykgXHJcbiAgICAgICAgICAgICAgICB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQub2ZmRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5vZmZSZXNpemUodGhpcy5iYW5uZXJSZXNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlTmV3QmFubmVyKHN0eWxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dCYW5uZXIoc3R5bGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU5ld0Jhbm5lcihzdHlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2NyZWVud2lkdGg6bnVtYmVyID0gMDtcclxuICAgIGJhbm5lcmhlaWdodDpudW1iZXIgPSAwO1xyXG4gICAgYmFubmVyd2lkdGg6bnVtYmVyID0gMDtcclxuICAgIGlzb25SZXNpemU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlTmV3QmFubmVyKHN0eWxlOiBhbnkpIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiB3eC5jcmVhdGVCYW5uZXJBZCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XHJcbiAgICAgICAgICAgIHRoaXMuYmFubmVyUnVuVGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICAgICAgdmFyIGluZm8gPSB0aGlzLmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NjcmVlbndpZHRoID0gaW5mby5zY3JlZW5XaWR0aDtcclxuICAgICAgICAgICAgdmFyIHNjYWxlOm51bWJlciA9IDE7XHJcbiAgICAgICAgICAgIGlmKCBzdHlsZS5oYXNPd25Qcm9wZXJ0eShcInNjYWxlXCIpIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2NhbGUgPSBzdHlsZS5zY2FsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmJhbm5lckFkID0gd3guY3JlYXRlQmFubmVyQWQoe1xyXG4gICAgICAgICAgICAgICAgYWRVbml0SWQ6ICdhZHVuaXQtOGMyZDU4NjEzNWZhNmQ0ZicsXHJcbiAgICAgICAgICAgICAgICBhZEludGVydmFsczozMCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGluZm8uc2NyZWVuSGVpZ2h0IC0gMTA1LFxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpbmZvLnNjcmVlbldpZHRoICogc2NhbGVcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhbm5lckFkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLm9uRXJyb3IodGhpcy5iYW5uZXJFcnJvcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dCYW5uZXIoc3R5bGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmFubmVyUmVzaXplKCByZXMgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZTtcclxuICAgICAgICBzZWxmLmJhbm5lckFkLm9mZlJlc2l6ZShzZWxmLmJhbm5lclJlc2l6ZSk7XHJcbiAgICAgICAgc2VsZi5pc29uUmVzaXplID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIG5vd3N0eXBlOmFueSA9IHNlbGYubm93U3R5cGU7XHJcbiAgICAgICAgaWYoICFub3dzdHlwZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpbmZvID0gc2VsZi5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG4gICAgICAgIHZhciBwZXJjZW50YWdlSDpudW1iZXIgPSBMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0L0xheWEuc3RhZ2UuZGlzcGxheUhlaWdodDtcclxuICAgICAgICB2YXIgcGVyY2VudGFnZVc6bnVtYmVyID0gTGF5YS5Ccm93c2VyLmNsaWVudFdpZHRoL0xheWEuc3RhZ2UuZGlzcGxheVdpZHRoO1xyXG4gICAgICAgIHNlbGYuYmFubmVyd2lkdGggPSByZXMud2lkdGg7XHJcbiAgICAgICAgc2VsZi5iYW5uZXJoZWlnaHQgPSByZXMuaGVpZ2h0O1xyXG4gICAgICAgIGlmKCBub3dzdHlwZS5oYXNPd25Qcm9wZXJ0eShcInhcIikgJiYgbm93c3R5cGUueCAhPSAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlbGYuYmFubmVyQWQuc3R5bGUubGVmdCA9IG5vd3N0eXBlLnggKiBwZXJjZW50YWdlVztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS5sZWZ0ID0gKGluZm8ud2luZG93V2lkdGggLSByZXMud2lkdGgpICogMC41O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggbm93c3R5cGUuaGFzT3duUHJvcGVydHkoXCJ5XCIpICYmIG5vd3N0eXBlLnkgIT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzZWxmLmJhbm5lckFkLnN0eWxlLnRvcCA9IG5vd3N0eXBlLnkgKiBwZXJjZW50YWdlSDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2VsZi5iYW5uZXJBZC5zdHlsZS50b3AgPSAoaW5mby53aW5kb3dIZWlnaHQgLSByZXMuaGVpZ2h0KSAtIDE1O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJhbm5lckVycm9yKGVycjphbnkpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93QmFubmVyKCBzdHlsZSApIHtcclxuICAgICAgICBpZiAodGhpcy5iYW5uZXJBZCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd1N0eXBlID0gc3R5bGU7XHJcbiAgICAgICAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRTeXN0ZW1JbmZvU3luYygpO1xyXG5cclxuICAgICAgICAgICAgdmFyIG5vd3N0eXBlOmFueSA9IHRoaXMubm93U3R5cGU7XHJcbiAgICAgICAgICAgIHZhciBzY2FsZTpudW1iZXIgPSAxO1xyXG4gICAgICAgICAgICBpZiggbm93c3R5cGUuaGFzT3duUHJvcGVydHkoXCJzY2FsZVwiKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHNjYWxlID0gbm93c3R5cGUuc2NhbGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHBlcmNlbnRhZ2VIOm51bWJlciA9IExheWEuQnJvd3Nlci5jbGllbnRIZWlnaHQvTGF5YS5zdGFnZS5kaXNwbGF5SGVpZ2h0O1xyXG4gICAgICAgICAgICB2YXIgcGVyY2VudGFnZVc6bnVtYmVyID0gTGF5YS5Ccm93c2VyLmNsaWVudFdpZHRoL0xheWEuc3RhZ2UuZGlzcGxheVdpZHRoO1xyXG4gICAgICAgICAgICBpZiggbm93c3R5cGUuaGFzT3duUHJvcGVydHkoXCJ4XCIpICYmIG5vd3N0eXBlLnggIT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUubGVmdCA9IG5vd3N0eXBlLnggKiBwZXJjZW50YWdlVztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUubGVmdCA9IChpbmZvLndpbmRvd1dpZHRoIC0gdGhpcy5iYW5uZXJ3aWR0aCkgKiAwLjU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIG5vd3N0eXBlLmhhc093blByb3BlcnR5KFwieVwiKSAmJiBub3dzdHlwZS55ICE9IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhbm5lckFkLnN0eWxlLnRvcCA9IG5vd3N0eXBlLnkgKiBwZXJjZW50YWdlSDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFubmVyQWQuc3R5bGUudG9wID0gKGluZm8ud2luZG93SGVpZ2h0IC0gdGhpcy5iYW5uZXJoZWlnaHQpIC0gMTU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zdHlsZS53aWR0aCA9IGluZm8uc2NyZWVuV2lkdGggKiBzY2FsZTtcclxuICAgICAgICAgICAgaWYoICF0aGlzLmlzb25SZXNpemUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzb25SZXNpemUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5vblJlc2l6ZSh0aGlzLmJhbm5lclJlc2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlQmFubmVyKCB0eXBlOnN0cmluZyA9IFwiXCIgKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmFubmVyQWQpIHtcclxuICAgICAgICAgICAgdGhpcy5iYW5uZXJBZC5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0eXBlICE9IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZm9yKCB2YXIgaTpudW1iZXIgPSAwO2kgPCB0aGlzLl9iYW5uZXJUeXBlTGlzdC5sZW5ndGg7aSsrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gdGhpcy5fYmFubmVyVHlwZUxpc3RbaV0udHlwZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFubmVyVHlwZUxpc3Quc3BsaWNlKCBpLDEgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fYmFubmVyVHlwZUxpc3QubGVuZ3RoID4gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtOmFueSA9IHRoaXMuX2Jhbm5lclR5cGVMaXN0W3RoaXMuX2Jhbm5lclR5cGVMaXN0Lmxlbmd0aC0xXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQmFubmVyKCBpdGVtLnR5cGUsaXRlbS5zdHlsZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5omT5byA57G75Z6L5a2Y5YKoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX29wZW5yYW5rRGljdDphbnk9e307XHJcbiAgICAvLyBwcml2YXRlIF93eE9wZW5EYXRhVmlld2VyOldYT3BlbkRhdGFWaWV3ZXI7XHJcbiAgICAvKipcclxuICAgICAqIOaJk+W8gOWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nLHZpZXdUeXBlOnN0cmluZyxyZWN0OkxheWEuUmVjdGFuZ2xlLHBhcmVudDpMYXlhLlNwcml0ZSA9IG51bGwsZGF0YTphbnkgPSBudWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2xvc2V6aXl1U3RhZ2UoKTtcclxuICAgICAgICB0aGlzLl9vcGVucmFua0RpY3Rbdmlld1R5cGVdID0ge3R5cGU6dHlwZSx2aWV3VHlwZTp2aWV3VHlwZSxyZWN0OnJlY3QscGFyZW50OnBhcmVudCxkYXRhOmRhdGF9O1xyXG4gICAgICAgIHRoaXMuaW5pdHppeXVTdGFnZShyZWN0LHBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggdHlwZSxkYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzmiZPlvIDnirbmgIHml7blgJnvvIzliIfmjaLmmL7npLrnsbvlnotcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hhbmdlRnJpZW5kUmFuayggdHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSggdHlwZSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5LiK5LiA6aG1XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcmVQYWdlUmFuaygpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmjpLooYzmppzkuIvkuIDpobVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5leHRQYWdlUmFuaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2VGcmllbmRSYW5rKCB2aWV3VHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgICAgIHRoaXMuY2xvc2V6aXl1U3RhZ2UoKTtcclxuICAgICAgICBpZiggdGhpcy5fb3BlbnJhbmtEaWN0W3ZpZXdUeXBlXSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb3BlbnJhbmtEaWN0W3ZpZXdUeXBlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiB0aGlzLl9vcGVucmFua0RpY3QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1kOmFueSA9IHRoaXMuX29wZW5yYW5rRGljdFtzXTtcclxuICAgICAgICAgICAgdGhpcy5vcGVuRnJpZW5kUmFuayggaXRlbWQudHlwZSxpdGVtZC52aWV3VHlwZSxpdGVtZC5yZWN0LGl0ZW1kLnBhcmVudCxpdGVtZC5kYXRhICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIneWni+WMluWtkOWfn1xyXG4gICAgICogQHBhcmFtIHJlY3QgXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50IFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXR6aXl1U3RhZ2UoIHJlY3Q6TGF5YS5SZWN0YW5nbGUscGFyZW50OkxheWEuU3ByaXRlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIC8vIGlmKCAhdGhpcy5fd3hPcGVuRGF0YVZpZXdlciApXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLl93eE9wZW5EYXRhVmlld2VyID0gbmV3IFdYT3BlbkRhdGFWaWV3ZXIoKTtcclxuICAgICAgICAvLyAgICAgaWYoIHBhcmVudCApXHJcbiAgICAgICAgLy8gICAgIHtcclxuICAgICAgICAvLyAgICAgICAgIHBhcmVudC5hZGRDaGlsZCggdGhpcy5fd3hPcGVuRGF0YVZpZXdlciApO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGVsc2VcclxuICAgICAgICAvLyAgICAge1xyXG4gICAgICAgIC8vICAgICAgICAgR2FtZUxheWVyTWFuYWdlci5JbnN0YW5jZS50b3BMYXllci5kaXNwbGF5T2JqZWN0LmFkZENoaWxkKCB0aGlzLl93eE9wZW5EYXRhVmlld2VyICk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5fd3hPcGVuRGF0YVZpZXdlci54ID0gcmVjdC54O1xyXG4gICAgICAgIC8vIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIueSA9IHJlY3QueTtcclxuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLndpZHRoID0gcmVjdC53aWR0aDtcclxuICAgICAgICAvLyB0aGlzLl93eE9wZW5EYXRhVmlld2VyLmhlaWdodCA9IHJlY3QuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZSA5q+B5a2Q5Z+fXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2xvc2V6aXl1U3RhZ2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgLy8gaWYoIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIgKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5fd3hPcGVuRGF0YVZpZXdlci5kZXN0cm95KCk7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3d4T3BlbkRhdGFWaWV3ZXIucmVtb3ZlU2VsZigpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLl93eE9wZW5EYXRhVmlld2VyID0gbnVsbDtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlbDmja7kuIrkvKDvvIjnlKjkuo7mjpLooYzmppzmlbDmja7mmL7npLrvvIlcclxuICAgICAqIEBwYXJhbSBwYXJhbTEg5LiK5oql5pWw5o2uXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0yIOS4iuaKpeaVsOaNrlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RvcmVUb0Nsb3VkKHBhcmFtMTpudW1iZXIscGFyYW0yOm51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBjYWNoZU1hZ2VyOkxvY2FsRGF0YUNvbnRyb2wgPSBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlO1xyXG4gICAgICAgIHZhciBzY29yZTE6bnVtYmVyID0gY2FjaGVNYWdlci5nZXRudW0oIFwicGFyYW0xXCIgKTtcclxuICAgICAgICAvLyB2YXIgc2NvcmUyOm51bWJlciA9IGNhY2hlTWFnZXIuZ2V0bnVtKCBcInBhcmFtMlwiICk7XHJcbiAgICAgICAgcGFyYW0xID0gTWF0aC5mbG9vcihwYXJhbTEpO1xyXG4gICAgICAgIHBhcmFtMiA9IE1hdGguZmxvb3IocGFyYW0yKTtcclxuICAgICAgICB2YXIgcmVzdWx0MTpudW1iZXIgPSBwYXJhbTE7XHJcbiAgICAgICAgdmFyIHJlc3VsdDI6bnVtYmVyID0gcGFyYW0yO1xyXG5cclxuICAgICAgICBpZiggcmVzdWx0MSA8IHNjb3JlMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXN1bHQxID0gc2NvcmUxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYWNoZU1hZ2VyLmFkZHN0ciggXCJwYXJhbTFcIixyZXN1bHQxLnRvU3RyaW5nKCkgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgYXJyLnB1c2goIHsga2V5OlwicGFyYW0xXCIsdmFsdWU6cmVzdWx0MS50b1N0cmluZygpIH0gKTtcclxuICAgICAgICBhcnIucHVzaCggeyBrZXk6XCJwYXJhbTJcIix2YWx1ZTpyZXN1bHQyICsgXCJcIiB9ICk7XHJcbiAgICAgICAgdGhpcy5zZXRVc2VyQ2xvdWRTdG9yYWdlKGFycik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdhbWVjbHViQnV0dG9uOmFueTtcclxuICAgIHB1YmxpYyBjcmVhdGVHYW1lQ2x1YkJ1dHRvbiggc3R5bGU6YW55LGljb246c3RyaW5nID0gXCJncmVlblwiICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciB3eDphbnkgPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCAmJiBzdHlsZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHlsZS53aWR0aCA9IDQwO1xyXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSA0MDtcclxuICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uZ2FtZWNsdWJCdXR0b24gPSB3eC5jcmVhdGVHYW1lQ2x1YkJ1dHRvbihcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpY29uOiBpY29uLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBzdHlsZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIGlmKFdYR2FtZVBsYXRmb3JtLmdhbWVjbHViQnV0dG9uKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5nYW1lY2x1YkJ1dHRvbi5zaG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCB7V1hHYW1lUGxhdGZvcm19IGZyb20gXCIuLi9XWFNESy9XWEdhbWVQbGF0Zm9ybVwiO1xyXG5pbXBvcnQge1BsYXRmcm9tVHlwZX0gZnJvbSBcIi4vUGxhdGZyb21UeXBlXCI7XHJcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4uL1RpbWUvVGltZXNUYW1wZXJcIjtcclxuaW1wb3J0IHtEYXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvRGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovIFxyXG5leHBvcnQgY2xhc3MgcGluZ3RhaXV0aWxzXHJcbntcclxuICAgIHByaXZhdGUgX2lzZW5hYmxlOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIC8qKlxyXG4gICAgICog5piv5ZCm5ZCI6KeEXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIGlzbGVnYWw6bnVtYmVyID0gMDtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgcGluZ3RhaXV0aWxzLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOiBwaW5ndGFpdXRpbHM7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogcGluZ3RhaXV0aWxzIHtcclxuICAgICAgICBpZiAocGluZ3RhaXV0aWxzLmlucyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgcGluZ3RhaXV0aWxzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwaW5ndGFpdXRpbHMuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5bmz5Y+wXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0UGxhdGZyb20oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheWEuQnJvd3Nlci53aW5kb3cudHQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnR0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChMYXlhLkJyb3dzZXIud2luZG93Lnd4KSAvL+W+ruS/oeWwj+a4uOaIj1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnd4O1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLm5vd3BsYXRmcm9tID0gUGxhdGZyb21UeXBlLnBjO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5pbml0UGxhdGZyb20oKTtcclxuICAgICAgICAvLyBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAvLyAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gICAgIGNhc2UgUGxhdGZyb21UeXBlLnFxOlxyXG4gICAgICAgIC8vICAgICBicmVhaztcclxuICAgICAgICAvLyAgICAgZGVmYXVsdDpcclxuICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMub25TaG93KCB0aGlzLHRoaXMuc2hvd2NhbGxiYWNrICk7XHJcbiAgICAgICAgLy8gdGhpcy5vbkhpZGUodGhpcyx0aGlzLmhpZGVjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RGF0YSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEYXRlQ29udHJvbC5JbnN0YW5jZS5TZXRTZWxmKCk7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5pbml0RGF0YSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5ZCI6L+d6KeE5Yik5patIHRydWXvvJrlkIjop4TvvIxmYWxzZTrov53op4RcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGVja0VuYWJsZSgpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICBpZiAocGluZ3RhaXV0aWxzLmlzbGVnYWwgPT0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9naW5jYWxsb2JqOmFueTtcclxuICAgIHByaXZhdGUgX2xvZ2luc3VjY2VlZGNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIGxvZ2luKCBjYWxsb2JqOmFueT1udWxsLHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLHByb2dyZXNzQ2FsbGJhY2s6RnVuY3Rpb249bnVsbCxmYWlsY2FsbGJhY2s6RnVuY3Rpb24gPSBudWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZhaXJ5Z3VpLkdSb290Lmluc3Quc2hvd01vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuX2xvZ2luY2FsbG9iaiA9IGNhbGxvYmo7XHJcbiAgICAgICAgdGhpcy5fbG9naW5zdWNjZWVkY2FsbGJhY2sgPSBzdWNjZWVkY2FsbGJhY2s7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jcmVhdGVVc2VyQW5kTG9naW4odGhpcyx0aGlzLmxvZ2luU3VjY2VlZCx0aGlzLmxvZ2lucHJvZ3Jlc3NDYWxsYmFjayx0aGlzLmxvZ2luZmFpbGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luU3VjY2VlZChudWxsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9naW5wcm9ncmVzc0NhbGxiYWNrKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpblN1Y2NlZWQoIGRhdGE6YW55ICk6dm9pZFxyXG4gICAgeyBcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpbmZhaWxjYWxsYmFjaygpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2hvdyhjYWxsb2JqOiBhbnk9bnVsbCwgc3VjY2VlZGNhbGxiYWNrOiBGdW5jdGlvbj1udWxsLCBmYWlsQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub25TaG93KGNhbGxvYmosIHN1Y2NlZWRjYWxsYmFjaywgZmFpbENhbGxiYWNrKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnFxOlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93Y2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS50aW1lci5jbGVhciggdGhpcyx0aGlzLmFnYWlucGxheWJnU291bmQgKTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDUwMCx0aGlzLHRoaXMuYWdhaW5wbGF5YmdTb3VuZCApO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX29uc2hvdyApO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2dldGZvY3VzICk7XHJcbiAgICAgICAgdmFyIGZyb21zY2VuZTpudW1iZXIgPSBwaW5ndGFpdXRpbHMuZnJvbXNjZW5lKCk7XHJcbiAgICAgICAgaWYoIGZyb21zY2VuZSA9PSAxMDg5IHx8IGZyb21zY2VuZSA9PSAxMTMxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2Zyb21zY29yZmsgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZ2FpbnBsYXliZ1NvdW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX29uQXVkaW9JbnRlcnJ1cHRpb25FbmQgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25IaWRlKGNhbGxvYmo6IGFueT1udWxsLCBzdWNjZWVkY2FsbGJhY2s6IEZ1bmN0aW9uPW51bGwpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLm9uSGlkZShjYWxsb2JqLCBzdWNjZWVkY2FsbGJhY2spO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgaGlkZWNhbGxiYWNrKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVzVGFtcGVyLkluc3RhbmNlLnNlbmRvbmxpbmVUb25namkoKTtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UuQ2xlYXJBbGxTT1VORCgpO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX29uaGlkZSApO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFdFQ0hBVEVWRU5ULldFQ0hBVEVWRU5UX2xvc2Vmb2N1cyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5b2T5YmN5ri45oiP5piv5ZCm5Zyo5pi+56S65LitXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaXNzaG93KCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBibzpib29sZWFuID0gdHJ1ZTtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIGlmKCBXWEdhbWVQbGF0Zm9ybS5pc1Nob3dpbmcgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJvID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYm87XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIbljIXliqDovb1cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxvYWRTdWJwYWNrYWdlKCB0eXBlbmFtZTpzdHJpbmcsY2FsbG9iajphbnksY2FsbGJhY2s6RnVuY3Rpb24sY2FsbHByb2dyZXNzOkZ1bmN0aW9uLGZhaWxjYWxsYmFjazpGdW5jdGlvbj1udWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UubG9hZFN1YnBhY2thZ2UoIHR5cGVuYW1lLGNhbGxvYmosY2FsbGJhY2ssY2FsbHByb2dyZXNzLGZhaWxjYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIGNhbGxiYWNrIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCBjYWxsb2JqICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluaYr+WQpuW3sue7j+aOiOadg1xyXG4gICAgICogQHBhcmFtIGNhbGxvYmogXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc2FjY3JlZGl0KCBjYWxsb2JqOmFueSxhY2NyZWRpdENhbGxiYWNrOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuZ2V0YWNjcmVkaXQoIGNhbGxvYmosYWNjcmVkaXRDYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUucXE6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5nZXRhY2NyZWRpdCggY2FsbG9iaixhY2NyZWRpdENhbGxiYWNrICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgaWYoYWNjcmVkaXRDYWxsYmFjayYmY2FsbG9iailcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2NyZWRpdENhbGxiYWNrLmNhbGwoIGNhbGxvYmosdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmi7/op5LoibLkv6Hmga/mjojmnYNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNyZWF0ZWFjY3JlZGl0KCBjYWxsb2JqOmFueSxjYWxsYmFjazpGdW5jdGlvbixmYWlsY2FsbGJhY2s6RnVuY3Rpb24gKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jcmVhdGVVc2VySW5mb0J1dHRvbihjYWxsb2JqLGNhbGxiYWNrLGZhaWxjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xvc2V1c2VyaW5mb0J1dHRvbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmNsb3NldXNlcmluZm9iVXR0b24oKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YCA5Ye65ri45oiPXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleGl0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLmV4aXRHYW1lKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJk+W8gOWuouacjeWvueivneahhlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkN1c3RvbWVyU2VydmljZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLm9wZW5DdXN0b21lclNlcnZpY2UoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog55+t6ZyH5YqoXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2aWJyYXRlU2hvcnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS52aWJyYXRlU2hvcnQoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGlzQ2FuVmlkZW8oKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBpZiggcGluZ3RhaXV0aWxzLmNoZWNrRW5hYmxlKCkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYm8gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgICAgIGJvID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuaXNDYW5WaWRlbygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGJvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBibztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRTaGFyZUFwcChrZXk6c3RyaW5nLGNhbGxvYmo6YW55PW51bGwsc3VjY2VlZENhbGxiYWNrOkZ1bmN0aW9uPW51bGwsZmFpbENhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uuc3RhcnRTaGFyZUFwcCgga2V5LGNhbGxvYmosc3VjY2VlZENhbGxiYWNrLGZhaWxDYWxsYmFjayApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIHN1Y2NlZWRDYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZENhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwbGF5VmlkZW8oIGtleTpzdHJpbmcsIGNhbGxvYmo6YW55PW51bGwsIHN1Y2NlZWRjYWxsYmFjazpGdW5jdGlvbj1udWxsLGZhaWxDYWxsYmFjazpGdW5jdGlvbj1udWxsLGlzdG9uZ2ppTnVtOmJvb2xlYW4gPSB0cnVlIClcclxuICAgIHtcclxuICAgICAgICBzd2l0Y2goIEdsb2JhbC5ub3dwbGF0ZnJvbSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIFBsYXRmcm9tVHlwZS53eDpcclxuICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnBsYXlWaWRlbygga2V5LGNhbGxvYmosc3VjY2VlZGNhbGxiYWNrLGZhaWxDYWxsYmFjayxpc3RvbmdqaU51bSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmKCBjYWxsb2JqICYmIHN1Y2NlZWRjYWxsYmFjayApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGNhbGxiYWNrLmNhbGwoIGNhbGxvYmogKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjcmVhdGVCYW5uZXIoYmFubmVydHlwZTpzdHJpbmcsc3R5bGU6YW55PXt4OjAseTowLHNjYWxlOjF9KTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jcmVhdGVCYW5uZXIoIGJhbm5lcnR5cGUsc3R5bGUgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZUJhbm5lciggYmFubmVydHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5oaWRlQmFubmVyKCBiYW5uZXJ0eXBlICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlbDmja7kuIrkvKDvvIjnlKjkuo7mjpLooYzmppzmlbDmja7mmL7npLrvvIlcclxuICAgICAqIEBwYXJhbSBwYXJhbTEg5LiK5oql5pWw5o2uMVxyXG4gICAgICogQHBhcmFtIHBhcmFtMiDkuIrmiqXmlbDmja4yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdG9yZVRvQ2xvdWQocGFyYW0xOm51bWJlcixwYXJhbTI6bnVtYmVyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5zdG9yZVRvQ2xvdWQoIHBhcmFtMSxwYXJhbTIgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJk+W8gOWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nLHZpZXdUeXBlOnN0cmluZyxyZWN0OkxheWEuUmVjdGFuZ2xlLHBhcmVudDpMYXlhLlNwcml0ZSA9IG51bGwsZGF0YTphbnkgPSBudWxsICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2Uub3BlbkZyaWVuZFJhbmsoIHR5cGUsdmlld1R5cGUscmVjdCxwYXJlbnQsZGF0YSApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5omT5byA54q25oCB5pe25YCZ77yM5YiH5o2i5pi+56S657G75Z6LXHJcbiAgICAgKiBAcGFyYW0gdHlwZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoYW5nZUZyaWVuZFJhbmsoIHR5cGU6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UuY2hhbmdlRnJpZW5kUmFuayh0eXBlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaOkuihjOamnOS4iuS4gOmhtVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJlUGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5wcmVQYWdlUmFuaygpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o6S6KGM5qac5LiL5LiA6aG1XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZXh0UGFnZVJhbmsoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5uZXh0UGFnZVJhbmsoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWFs+mXreWlveWPi+aOkuihjOamnFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xvc2VGcmllbmRSYW5rKCB2aWV3VHlwZTpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jbG9zZUZyaWVuZFJhbmsodmlld1R5cGUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsb2NrVmlkZW9MZWZ0VGltZSgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aW1lOm51bWJlciA9IDA7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UubG9ja1ZpZGVvTGVmdFRpbWUoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRheVZpZGVvTnVtcygpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHZhciB0aW1lOm51bWJlciA9IDA7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICB0aW1lID0gV1hHYW1lUGxhdGZvcm0uZGF5VmlkZW9OdW07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAxMDg5Oua3u+WKoOWIsOaIkeeahOWwj+eoi+W6j++8jDExMzE65re75Yqg5Yiw5rWu56qXXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbXNjZW5lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIHNjZW5lOm51bWJlciA9IDA7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgIHNjZW5lID0gV1hHYW1lUGxhdGZvcm0uZnJvbXNjZW5lO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzY2VuZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUdhbWVDbHViQnV0dG9uKCBzdHlsZTphbnksaWNvbjpzdHJpbmcgPSBcImdyZWVuXCIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBXWEdhbWVQbGF0Zm9ybS5JbnN0YW5jZS5jcmVhdGVHYW1lQ2x1YkJ1dHRvbiggc3R5bGUsaWNvbiApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuL1BsYXllckFjY291bnRcIjtcclxuXHJcbi8vIGltcG9ydCB7IEFjY291bnQgfSBmcm9tIFwiLi4vQWNjb3VudC9BY2NvdW50XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIHR0c2hhcmVcclxue1xyXG4gICAgc3RhdGljIHNoYXJlKClcclxuICAgIHtcclxuICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNoYXJlQXBwTWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWw6IFwiYXJ0aWNsZVwiLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZUlkOiBcIm9jZ2Y5YjQ2NDY0YjlhbmxmZlwiLCAvLyDmm7/mjaLmiJDpgJrov4flrqHmoLjnmoTliIbkuqtJRFxyXG4gICAgICAgICAgICB0aXRsZTogXCLlhrLllYrlhrJcIixcclxuICAgICAgICAgICAgaW1hZ2VVcmw6IFwiamlhemFpLzEyMy5wbmdcIixcclxuICAgICAgICAgICAgcXVlcnk6IFwicmVzLnF1ZXJ5XCIsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6ICgpID0+e30sXHJcbiAgICAgICAgICAgIGZhaWw6ICgpID0+e30sXHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIHR0YWRcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6dHRhZDtcclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICB0dGFkLmluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6dHRhZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHR0YWQuaW5zdGFuY2UpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gdHRhZC5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyB0dGFkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHZpZGVsQWRVbml0SWQgPSBcIjE1Z2ZncDU4cG9jcDgwaGJrYlwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgYmFubmVyQWRVbml0SWQgPSBcImRzazdjb2hibDJmNGpwanRxNVwiO1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIHZpZGVvQWQ7XHJcbiAgICBcclxuICAgIHN0YXRpYyBjbG9zZWNhbGxiYWNrOkZ1bmN0aW9uO1xyXG4gICAgcHVibGljIHN0YXRpYyBJbml0QUQoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVvIHx8ICFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG5cclxuICAgICAgICB0dGFkLmJhbm5lckFkVW5pdElkID0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5iYW5uZXJBZFVuaXRJZD9QbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLmJhbm5lckFkVW5pdElkOnR0YWQuYmFubmVyQWRVbml0SWQ7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJiYW5uZXJBZFVuaXRJZFwiLHR0YWQuYmFubmVyQWRVbml0SWQpO1xyXG4gICAgICAgIHR0YWQudmlkZWxBZFVuaXRJZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEudmlkZWxBZFVuaXRJZD9QbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLnZpZGVsQWRVbml0SWQ6dHRhZC52aWRlbEFkVW5pdElkO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidmlkZWxBZFVuaXRJZFwiLHR0YWQudmlkZWxBZFVuaXRJZCk7XHJcblxyXG4gICAgICAgIHR0YWQudmlkZW9BZCA9IExheWEuQnJvd3Nlci53aW5kb3cudHQuY3JlYXRlUmV3YXJkZWRWaWRlb0FkKHsgYWRVbml0SWQ6IHRoaXMudmlkZWxBZFVuaXRJZCB9KTtcclxuICAgICAgICB0dGFkLnZpZGVvQWQub25DbG9zZShyZXMgPT4gXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuaXNFbmRlZCkgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodHRhZC5jbG9zZWNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHRhZC5jbG9zZWNhbGxiYWNrKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0dGFkLmNsb3NlY2FsbGJhY2spXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0dGFkLmNsb3NlY2FsbGJhY2soZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgU2hvd1ZpZGVvKF9jYjpGdW5jdGlvbilcclxuICAgIHtcclxuICAgICAgICBpZighUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS52aWRlbyB8fCAhTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgICAgICBjb25zb2xlLmxvZyhcInNob3cgdmlkZW9cIik7XHJcbiAgICAgICAgdHRhZC5jbG9zZWNhbGxiYWNrID0gX2NiO1xyXG4gICAgICAgIHR0YWQudmlkZW9BZC5zaG93KCkudGhlbigoKSA9PiBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bm/5ZGK5pi+56S65oiQ5YqfXCIpO1xyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgLy8gdHRhZC5TaG93VHh0KFwi6KeG6aKR5q2j5Zyo5Yqg6L295LitXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrnu4Tku7blh7rnjrDpl67pophcIiwgZXJyKTtcclxuICAgICAgICAgICAgICAgIC8vIOWPr+S7peaJi+WKqOWKoOi9veS4gOasoVxyXG4gICAgICAgICAgICAgICAgTGF5YS50aW1lci5vbmNlKDIwMCx0aGlzLCgpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgdHRhZC52aWRlb0FkLmxvYWQoKS50aGVuKCgpID0+IFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLmiYvliqjliqDovb3miJDlip9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWKoOi9veaIkOWKn+WQjumcgOimgeWGjeaYvuekuuW5v+WRilxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHRhZC52aWRlb0FkLnNob3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjYW5zaG93ID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgc3RhdGljIGJhbm5lckFkO1xyXG4gICAgc3RhdGljIFNob3diYW5uZXIoKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFMYXlhLkJyb3dzZXIub25Nb2JpbGUpcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwic2hvdyBiYW5uZXJcIik7XHJcbiAgICAgICAgdHRhZC5jYW5zaG93ID0gdHJ1ZTtcclxuICAgICAgICB2YXIgaW5mb3IgPSBMYXlhLkJyb3dzZXIud2luZG93LnR0LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcbiAgICAgICAgdmFyIHRhcmdldEJhbm5lckFkV2lkdGggPSAyMDA7XHJcbiAgICAgICAgaWYodHRhZC5iYW5uZXJBZCl0dGFkLmJhbm5lckFkLmRlc3Ryb3koKTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMjAwLHRoaXMsKCk9PntcclxuICAgICAgICAgICAgdHRhZC5iYW5uZXJBZCA9IExheWEuQnJvd3Nlci53aW5kb3cudHQuY3JlYXRlQmFubmVyQWQoe1xyXG4gICAgICAgICAgICAgICAgYWRVbml0SWQ6IHR0YWQuYmFubmVyQWRVbml0SWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0YXJnZXRCYW5uZXJBZFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5mb3Iud2luZG93SGVpZ2h0IC0gKHRhcmdldEJhbm5lckFkV2lkdGggLyAxNikgKiA5IC8vIOagueaNruezu+e7n+e6puWumuWwuuWvuOiuoeeul+WHuuW5v+WRiumrmOW6plxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHR0YWQuYmFubmVyQWQub25Mb2FkKCgpPT5cclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYodHRhZC5jYW5zaG93KVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR0YWQuYmFubmVyQWQuc2hvdygpLnRoZW4oKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5bm/5ZGK5pi+56S65oiQ5YqfXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiBcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLlub/lkYrnu4Tku7blh7rnjrDpl67pophcIiwgZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgXHJcbiAgICAgICAgICAgIHR0YWQuYmFubmVyQWQub25SZXNpemUoc2l6ZSA9PiBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhzaXplLndpZHRoLCBzaXplLmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHRhZC5iYW5uZXJBZC5zdHlsZS50b3AgPSBpbmZvci53aW5kb3dIZWlnaHQgLSBzaXplLmhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0dGFkLmJhbm5lckFkLnN0eWxlLmxlZnQgPSAoaW5mb3Iud2luZG93V2lkdGggLSBzaXplLndpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBDbGVhcigpXHJcbiAgICB7XHJcbiAgICAgICAgdHRhZC5jYW5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgdHRhZC5jbG9zZWNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICBpZih0dGFkLmJhbm5lckFkKXR0YWQuYmFubmVyQWQuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuaKlumfs+abtOWkmua4uOaIj+aWueazlSovXHJcbiAgICBzdGF0aWMgQ3JlYXRlTW9yZUdhbWVCdG4oZnVuOkZ1bmN0aW9uPW51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIUxheWEuQnJvd3Nlci5vbk1vYmlsZSlyZXR1cm47XHJcbiAgICAgICAgaWYoTGF5YS5Ccm93c2VyLm9uSU9TKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdHRhZC5TaG93VHh0KFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQuc2hvd01vcmVHYW1lc01vZGFsKHtcclxuICAgICAgICAgICAgYXBwTGF1bmNoT3B0aW9uczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFwcElkOiBcInR0NjZkMDEwNmRmOWVhYTA4M1wiLFxyXG4gICAgICAgICAgICAgICAgcXVlcnk6IFwiZm9vPWJhciZiYXo9cXV4XCIsXHJcbiAgICAgICAgICAgICAgICBleHRyYURhdGE6IHt9XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1Y2Nlc3NcIiwgcmVzLmVyck1zZyk7XHJcbiAgICAgICAgICAgICAgaWYoZnVuKVxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGZ1bigpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmFpbChyZXMpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImZhaWxcIiwgcmVzLmVyck1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLy8g55uR5ZCs5by556qX5YWz6ZetXHJcbiAgICAgICAgLy8gICB0aGlzLm9uTW9yZUdhbWVzTW9kYWxDbG9zZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKuebkeWQrOW8ueeql+WFs+mXrSovXHJcbiAgICAvLyBzdGF0aWMgb25Nb3JlR2FtZXNNb2RhbENsb3NlKClcclxuICAgIC8vIHtcclxuICAgIC8vICAgICBpZighTGF5YS5Ccm93c2VyLm9uTW9iaWxlKXJldHVybjtcclxuICAgIC8vICAgICBpZiggTGF5YS5Ccm93c2VyLm9uSU9TKVxyXG4gICAgLy8gICAgIHtcclxuICAgIC8vICAgICAgICAgdHRhZC5TaG93VHh0KFwi5pqC5pyq5byA5pS+XCIpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIExheWEuQnJvd3Nlci53aW5kb3cudHQub25Nb3JlR2FtZXNNb2RhbENsb3NlKGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcIm1vZGFsIGNsb3NlZFwiKTtcclxuICAgIC8vICAgICAgICAgaWYoU2NlbmUzRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5Jc0dhbWVQYXN1ZSlcclxuICAgIC8vICAgICAgICAge1xyXG4gICAgLy8gICAgICAgICAgICAgRXZlbnRVdGlscy5kaXNwYXRjaEV2ZW50KCBHYW1lRXZlbnQuY29udGludWVHYW1lICk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFNob3dUeHQodGV4dDogc3RyaW5nKSBcclxuICAgIHtcclxuICAgICAgICBpZiAoTGF5YS5Ccm93c2VyLndpbmRvdy50dCkgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93LnR0LnNob3dUb2FzdCh7IHRpdGxlOiB0ZXh0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIOWFqOWxgOS+puWQrOexu+WPiua2iOaBr+WkhOeQhlxyXG4gKi9cclxuZXhwb3J0ICBjbGFzcyBEaXNQYXRjaGVyT24gZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwdWJsaWMgc3RhdGljIGluczpEaXNQYXRjaGVyT247XHJcbiAgICBwcml2YXRlIF9kaXNwYXRjaGVyOkxheWEuRXZlbnREaXNwYXRjaGVyO1xyXG4gICAgcHJpdmF0ZSBpc0luaXQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBEaXNQYXRjaGVyT24uaW5zID0gdGhpcztcclxuICAgICAgICBpZih0aGlzLmlzSW5pdCl7ICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLl9kaXNwYXRjaGVyID09IG51bGwpe1xyXG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaGVyID0gbmV3IExheWEuRXZlbnREaXNwYXRjaGVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbml0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpEaXNQYXRjaGVyT257XHJcbiAgICAgICAgaWYoRGlzUGF0Y2hlck9uLmlucz09bnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXNQYXRjaGVyT24oKTtcclxuICAgICAgICByZXR1cm4gRGlzUGF0Y2hlck9uLmlucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZyxsaXN0ZW5lcjpGdW5jdGlvbix0aGlzT2JqZWN0OmFueSx1c2VDYXB0dXJlOmJvb2xlYW49ZmFsc2UscHJpb3JpdHk6bnVtYmVyPTApOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hlci5vbiggdHlwZSx0aGlzT2JqZWN0LCBsaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsbGlzdGVuZXI6RnVuY3Rpb24sdGhpc09iamVjdDphbnksdXNlQ2FwdHVyZTpib29sZWFuPWZhbHNlKTp2b2lke1xyXG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIub2ZmKCB0eXBlLHRoaXNPYmplY3QsIGxpc3RlbmVyICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc0V2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hlci5oYXNMaXN0ZW5lcih0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudCh0eXBlOnN0cmluZyxkYXRhPzogYW55KTpib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hlci5ldmVudCh0eXBlLGRhdGEpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtMRXZlbnR9IGZyb20gXCIuL0xFdmVudFwiO1xyXG5pbXBvcnQge0Rpc1BhdGNoZXJPbn0gZnJvbSBcIi4vRGlzUGF0Y2hlck9uXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBEaXNwYXRjaGVyTWFuYWdlclxyXG57XHJcbiAgICBzdGF0aWMgIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzUGF0Y2hlck9uLkluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8v5paw5bu65LqL5Lu2XHJcbiAgICBzdGF0aWMgIEV2ZW50KHR5cGU6IHN0cmluZywgb2JqOiBPYmplY3QgPSBudWxsLCBidWJibGVzOiBib29sZWFuID0gZmFsc2UsIGNhbmNlbGFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IExheWEuRXZlbnQge1xyXG4gICAgICAgIHJldHVybiBuZXcgTEV2ZW50KHR5cGUsIG9iaiwgYnViYmxlcywgY2FuY2VsYWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy/mtL7lj5Hkuovku7ZcclxuICAgIHN0YXRpYyAgZGlzcGF0Y2hFdmVudCh0eXBlOiBzdHJpbmcsIG9iajogT2JqZWN0ID0gbnVsbCwgYnViYmxlczogYm9vbGVhbiA9IGZhbHNlLCBjYW5jZWxhYmxlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBEaXNQYXRjaGVyT24uSW5zdGFuY2UuZGlzcGF0Y2hFdmVudCh0eXBlLCBvYmopO1xyXG4gICAgfVxyXG5cclxuICAgIC8v55uR5ZCs5LqL5Lu2XHJcbiAgICBzdGF0aWMgIGFkZEV2ZW50TGlzdGVuZXIodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiwgdXNlQ2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlLCBwcmlvcml0eTogbnVtYmVyID0gMCk6IHZvaWQge1xyXG4gICAgICAgIERpc1BhdGNoZXJPbi5JbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzT2JqZWN0LCB1c2VDYXB0dXJlLCBwcmlvcml0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBoYXNFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBEaXNQYXRjaGVyT24uSW5zdGFuY2UuaGFzRXZlbnRMaXN0ZW5lcih0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiwgdXNlQ2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlLCBwcmlvcml0eTogbnVtYmVyID0gMCk6IHZvaWQge1xyXG4gICAgICAgIERpc1BhdGNoZXJPbi5JbnN0YW5jZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzT2JqZWN0KTtcclxuICAgIH1cclxufSIsImltcG9ydCBTcHJpdGUgPSBMYXlhLlNwcml0ZTtcclxuZXhwb3J0ICBjbGFzcyBHYW1lU3RhdGVcclxue1xyXG4gICAgc3RhdGljIHJlbW92ZXNlbGVjdDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9yZW1vdmVzZWxlY3RcIjtcclxuXHJcbiAgICBcclxuXHJcbiAgICBzdGF0aWMgbnBjZW5kOnN0cmluZyA9IFwiR2FtZVN0YXRlX25wY2VuZEdhbWVcIjtcclxuXHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIOmAmuWFs+aIkOWKn1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgd2luOnN0cmluZyA9IFwiR2FtZVN0YXRlX3dpbkdhbWVcIjtcclxuXHJcbiAgICBwcml2YXRlIHNwOiBTcHJpdGU7XHJcbiAgICBwcml2YXRlIGRyYXdTb21ldGhpbmcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zcCA9IG5ldyBTcHJpdGUoKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ApO1xyXG4gICAgICAgIC8v55S757q/XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3TGluZSgxMCwgNTgsIDE0NiwgNTgsIFwiI2ZmMDAwMFwiLCAzKTtcclxuICAgICAgICAvL+eUu+i/nue7reebtOe6v1xyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd0xpbmVzKDE3NiwgNTgsIFswLCAwLCAzOSwgLTUwLCA3OCwgMCwgMTE3LCA1MCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xyXG4gICAgICAgIC8v55S75puy57q/XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q3VydmVzKDM1MiwgNTgsIFswLCAwLCAxOSwgLTEwMCwgMzksIDAsIDU4LCAxMDAsIDc4LCAwLCA5NywgLTEwMCwgMTE3LCAwLCAxMzYsIDEwMCwgMTU2LCAwXSwgXCIjZmYwMDAwXCIsIDUpO1xyXG4gICAgICAgIC8v55S755+p5b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UmVjdCgxMCwgMTY2LCAxNjYsIDkwLCBcIiNmZmZmMDBcIik7XHJcbiAgICAgICAgLy/nlLvlpJrovrnlvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDI2NCwgMTY2LCBbMCwgMCwgNjAsIDAsIDc4LjQ4LCA1NywgMzAsIDkzLjQ4LCAtMTguNDgsIDU3XSwgXCIjZmZmZjAwXCIpO1xyXG4gICAgICAgIC8v55S75LiJ6KeS5b2iXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UG9seSg0MDAsIDE2NiwgWzAsIDEwMCwgNTAsIDAsIDEwMCwgMTAwXSwgXCIjZmZmZjAwXCIpO1xyXG4gICAgICAgIC8v55S75ZyGXHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3Q2lyY2xlKDk4LCAzMzIsIDUwLCBcIiMwMGZmZmZcIik7XHJcbiAgICAgICAgLy/nlLvmiYflvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQaWUoMjQwLCAyOTAsIDEwMCwgMTAsIDYwLCBcIiMwMGZmZmZcIik7XHJcbiAgICAgICAgLy/nu5jliLblnIbop5Lnn6nlvaLvvIzoh6rlrprkuYnot6/lvoRcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQYXRoKDQwMCwgMzEwLCBbW1wibW92ZVRvXCIsIDUsIDBdLCBbXCJsaW5lVG9cIiwgMTA1LCAwXSwgW1wiYXJjVG9cIiwgMTEwLCAwLCAxMTAsIDUsIDVdLCBbXCJsaW5lVG9cIiwgMTEwLCA1NV0sIFtcImFyY1RvXCIsIDExMCwgNjAsIDEwNSwgNjAsIDVdLCBbXCJsaW5lVG9cIiwgNSwgNjBdLCBbXCJhcmNUb1wiLCAwLCA2MCwgMCwgNTUsIDVdLCBbXCJsaW5lVG9cIiwgMCwgNV0sIFtcImFyY1RvXCIsIDAsIDAsIDUsIDAsIDVdLCBbXCJjbG9zZVBhdGhcIl1dLCB7ZmlsbFN0eWxlOiBcIiMwMGZmZmZcIn0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDpgJrlhbPlpLHotKVcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZhaWw6c3RyaW5nID0gXCJHYW1lU3RhdGVfZmFpbEdhbWVcIjtcclxuXHJcbiAgICBzdGF0aWMganVtcDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9qdW1wZ2FtZVwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pqC5YGc5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzdG9wOnN0cmluZyA9IFwiR2FtZVN0YXRlX3N0b3BHYW1lXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlm57liLDkuLvnlYzpnaJcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJldHVybk1haW5WaWV3OnN0cmluZyA9IFwicmV0dXJuTWFpblZpZXdcIjtcclxuXHJcbiAgICBzdGF0aWMgdXBkYXRlU0tpblZpZXc6c3RyaW5nID0gXCJHYW1lU3RhdGVfdXBkYXRlU0tpblZpZXdcIjtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgYnRuQXJyOkFycmF5PHN0cmluZz4gPSBbXCJyZXMvYnV0dG9uLnBuZ1wiLCBcInJlcy9idXR0b24ucG5nXCIsIFwicmVzL2J1dHRvbi5wbmdcIl07XHJcbiAgICBwcml2YXRlIG5hbWVBcnI6QXJyYXk8c3RyaW5nPiA9IFtcImNhbnZhc+aIquWbvlwiLFwic3ByaXRl5oiq5Zu+XCIsXCLmuIXnkIZcIl07XHJcbiAgICBwcml2YXRlIF9jYW52YXM6SFRNTENhbnZhc0VsZW1lbnQ7XHJcbiAgICBwcml2YXRlIGFpbVNwOlNwcml0ZTtcclxuICAgIHByaXZhdGUgZHJhd0ltYWdlOkxheWEuSW1hZ2U7XHJcbiAgICBwcml2YXRlIGRyYXdTcDpTcHJpdGU7XHJcblx0cHJpdmF0ZSBtb25rZXlUZXh0dXJlOkxheWEuVGV4dHVyZTtcclxuXHJcbiAgICBwcml2YXRlIF9vbmNsaWNrKGU6TGF5YS5FdmVudCl7XHJcbiAgICAgICAgc3dpdGNoIChlLnRhcmdldC5uYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5uYW1lQXJyWzBdOlxyXG4gICAgICAgICAgICAgICAgdmFyIGJhc2U2NFVybDpzdHJpbmcgPSB0aGlzLl9jYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIsMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYXdJbWFnZS5za2luID0gYmFzZTY0VXJsO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgdGhpcy5uYW1lQXJyWzFdOlxyXG4gICAgICAgICAgICAgICAgdmFyIHRleHQ6TGF5YS5UZXh0dXJlID0gTGF5YS5zdGFnZS5kcmF3VG9UZXh0dXJlKExheWEuQnJvd3Nlci5jbGllbnRXaWR0aCxMYXlhLkJyb3dzZXIuY2xpZW50SGVpZ2h0LDAsMCkgYXMgTGF5YS5UZXh0dXJlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3U3AuZ3JhcGhpY3MuZHJhd1RleHR1cmUodGV4dCwwLDAsdGhpcy5kcmF3U3Aud2lkdGgsdGhpcy5kcmF3U3AuaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIHRoaXMubmFtZUFyclsyXTpcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhd0ltYWdlLnNraW4gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3U3AuZ3JhcGhpY3MuY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJhd1NwLmdyYXBoaWNzLmRyYXdSZWN0KDAsMCx0aGlzLmRyYXdTcC53aWR0aCx0aGlzLmRyYXdTcC5oZWlnaHQsXCIjZmYwMDAwXCIpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICAvKipcclxuICAgICAqIOW8gOWni+a4uOaIj1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc3RhcnQ6c3RyaW5nID0gXCJHYW1lU3RhdGVfc3RhcnRHYW1lXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnu5PmnZ/muLjmiI9cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGVuZDpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9lbmRHYW1lXCI7XHJcbiAgICBcclxuICAgIC8qKuWksei0pSAqL1xyXG4gICAgc3RhdGljIGxvc2U6c3RyaW5nID0gXCJHYW1lU3RhdGVfbG9zZUdhbWVcIlxyXG4gICAgLyoqXHJcbiAgICAgKiDlpI3mtLtcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJldml2ZTpzdHJpbmcgPSBcIkdhbWVTdGF0ZV9yZXZpdmVHYW1lXCI7XHJcblxyXG4gICAgLyoq5piv5ZCm5aSN5rS7ICovXHJcbiAgICBzdGF0aWMgaXNkaWU6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKuWFgeiuuOWkjea0u+asoeaVsCAqL1xyXG4gICAgc3RhdGljIGZ1aHVvY2lzaHU6bnVtYmVyID0gMTtcclxuXHJcbiAgICAvKirmmK/lkKblt7Lnu4/lj5HluIPov4flvZXlsY8gKi9cclxuICAgIHN0YXRpYyByZWNvcmRzY3JlZTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoq5ri45oiP5qyh5pWwKi9cclxuICAgIHN0YXRpYyBHYW1lTnVtOm51bWJlciA9IDA7XHJcblxyXG5cclxuXHJcbn0iLCJcclxuLypcclxuKiDlhazlhbHmjqXlj6NcclxuKi9cclxuZXhwb3J0IG1vZHVsZSBHYW1lVXRpbHMge1xyXG4gICAgLyoqXHJcbiAgICAgKiDpmo/mnLrlh73mlbAo6L+U5Zue5pW05Z6LKVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmFuZFJhbmdlaW50KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciAge1xyXG4gICAgICAgIHZhciB2YWx1ZTpudW1iZXI9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcclxuICAgICAgICBpZih2YWx1ZT5tYXgpe1xyXG4gICAgICAgICAgICB2YWx1ZSA9IG1heDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6ZqP5py65Ye95pWwKCDkuI3lj5bmlbQgKVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmFuZFJhbmdlZmxvYXQobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyICB7XHJcbiAgICAgICAgdmFyIHZhbHVlOm51bWJlciA9IE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW47XHJcbiAgICAgICAgaWYodmFsdWU+bWF4KXtcclxuICAgICAgICAgICAgdmFsdWUgPSBtYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0VGV4YnlQa2dBbmROYW1lKCBwa2duYW1lOnN0cmluZyx0ZXhuYW1lOnN0cmluZyApOkxheWEuVGV4dHVyZVxyXG4gICAge1xyXG4gICAgICAgIHZhciB1aXBhY2thZ2U6ZmFpcnlndWkuVUlQYWNrYWdlID0gZmFpcnlndWkuVUlQYWNrYWdlLmdldEJ5TmFtZShwa2duYW1lKTtcclxuICAgICAgICBpZiggdWlwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiB1aXBhY2thZ2UuZ2V0SXRlbUFzc2V0QnlOYW1lKHRleG5hbWUpIGFzIExheWEuVGV4dHVyZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIflibLliIblj7flj5jmiJBQb2ludOWvueixoVxyXG4gICAgICogQHBhcmFtIHN0ciBcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dGZlbmhhb1BvaW50KCBzdHI6c3RyaW5nICk6TGF5YS5Qb2ludFxyXG4gICAge1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIjtcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMYXlhLlBvaW50KCBOdW1iZXIoIGFyclswXSApLE51bWJlciggYXJyWzFdICkgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWIh+WJsuWIhuWPt+WPmOaIkOaVsOaNrihudW1iZXIpXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjdXRmZW5oYW90b0Fycm51bSggc3RyOnN0cmluZyApOkFycmF5PG51bWJlcj5cclxuICAgIHtcclxuICAgICAgICB2YXIgbnVtQXJyOkFycmF5PG51bWJlcj49W107XHJcbiAgICAgICAgaWYgKHN0ciA9PSBcIlwiKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bUFycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaTtpPGFyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG51bUFyci5wdXNoKCBOdW1iZXIoIGFycltpXSApICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudW1BcnI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIflibLliIblj7flj5jmiJDmlbDmja4oc3RyaW5nKVxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0ZmVuaGFvdG9BcnJzdHIoIHN0cjpzdHJpbmcgKTpBcnJheTxzdHJpbmc+XHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHN0ci5zcGxpdChcIjtcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliIflibLliIblj7flj5jmiJDmlbDmja4oIHsga2V5OjEsdmFsdWU6MSB9IClcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dGZlbmhhb3RvT2JqKCBzdHI6c3RyaW5nICk6YW55XHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG9iajphbnkgPSB7fTtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoIFwiO1wiICk7XHJcbiAgICAgICAgb2JqLmtleSA9IGFyclswXTtcclxuICAgICAgICBvYmoudmFsdWUgPSBhcnJbMV07XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICAvKirliIflibJzdHIqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dHN0cnRvQXJyKCBzdHI6c3RyaW5nICk6QXJyYXk8c3RyaW5nPlxyXG4gICAge1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdCggXCJ8XCIgKTtcclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuWIh+WJsnN0ciggMToxfDE6MSApIHRvIEFycmF5PHsga2V5OjEsdmFsdWU6MSB9PiAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGN1dHN0cnRvQXJyMSggc3RyOnN0cmluZyApOkFycmF5PGFueT5cclxuICAgIHtcclxuICAgICAgICB2YXIgcmVzbHV0QXJyOkFycmF5PGFueT49W107XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KCBcInxcIiApO1xyXG4gICAgICAgIHZhciBpOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpPTA7aTxhcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaXRlbWFycjpBcnJheTxzdHJpbmc+ID0gYXJyW2ldLnNwbGl0KCBcIjtcIiApO1xyXG4gICAgICAgICAgICByZXNsdXRBcnIucHVzaCggeyBrZXk6aXRlbWFyclswXSx2YWx1ZTppdGVtYXJyWzFdIH0gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc2x1dEFycjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3V0c3RydG9PYmooIHN0cjpzdHJpbmcgKTphbnlcclxuICAgIHtcclxuICAgICAgICB2YXIgcmVzdWx0b2JqOmFueSA9IHt9O1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdCggXCJ8XCIgKTtcclxuICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgIGZvciggaT0wO2k8YXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdCggXCI7XCIgKTtcclxuICAgICAgICAgICAgcmVzdWx0b2JqW2l0ZW1hcnJbMF1dID0gaXRlbWFyclsxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdG9iajtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29tcGFyZVZlcnNpb24odjEsIHYyKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICB2MSA9IHYxLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgdjIgPSB2Mi5zcGxpdCgnLicpO1xyXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWF4KHYxLmxlbmd0aCwgdjIubGVuZ3RoKTtcclxuICAgICAgICB3aGlsZSAodjEubGVuZ3RoIDwgbGVuKSB7XHJcbiAgICAgICAgICAgIHYxLnB1c2goJzAnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKHYyLmxlbmd0aCA8IGxlbikge1xyXG4gICAgICAgICAgICB2Mi5wdXNoKCcwJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbnVtMSA9IHBhcnNlSW50KHYxW2ldKTtcclxuICAgICAgICAgICAgY29uc3QgbnVtMiA9IHBhcnNlSW50KHYyW2ldKTtcclxuICAgICAgICAgICAgaWYgKG51bTEgPiBudW0yKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChudW0xIDwgbnVtMikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgV29yZFRpcHNQYW5lbCB9IGZyb20gXCIuLi9WaWV3L0dsb2JhbFRpcFBhbmVsXCI7XHJcbmltcG9ydCB7IExheW91dENvbnRyb2wgfSBmcm9tIFwiLi4vQ29udHJvbC9MYXlvdXRDb250cm9sXCI7XHJcbmltcG9ydCB7IExheU9VVCB9IGZyb20gXCIuLi91dGlscy9MYXlPVVRcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEdsb2JhbFRpcFxyXG57XHJcbiAgICBzdGF0aWMgd29yZExpc3Q6QXJyYXk8V29yZFRpcHNQYW5lbD4gPSBbXTtcclxuICAgIHN0YXRpYyBzaG93V29yZExpc3Q6QXJyYXk8V29yZFRpcHNQYW5lbD4gPSBbXTtcclxuICAgIHN0YXRpYyBtYXhOdW06bnVtYmVyID0gMTA7XHJcbiAgICBzdGF0aWMgaXNFdmVudDpib29sZWFuID0gZmFsc2U7XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6R2xvYmFsVGlwO1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBHbG9iYWxUaXAuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOkdsb2JhbFRpcFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBHbG9iYWxUaXAuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHbG9iYWxUaXAoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbFRpcC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRFdmVudCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBHbG9iYWxUaXAuaXNFdmVudCA9IHRydWU7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLnJlbW92ZXNlbGVjdCx0aGlzLHRoaXMuYWRkd29yZExpc3QgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1dvcmRUaXBzKCB3b3JkOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIUdsb2JhbFRpcC5pc0V2ZW50IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5pbml0RXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIEdsb2JhbFRpcC5zaG93V29yZExpc3QubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgbGFzdHdvcmQ6c3RyaW5nID0gR2xvYmFsVGlwLnNob3dXb3JkTGlzdFtHbG9iYWxUaXAuc2hvd1dvcmRMaXN0Lmxlbmd0aC0xXS5ub3d3b3JkO1xyXG4gICAgICAgICAgICAvLyBpZiggbGFzdHdvcmQgPT0gd29yZCApXHJcbiAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggR2xvYmFsVGlwLndvcmRMaXN0Lmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW06V29yZFRpcHNQYW5lbCA9IEdsb2JhbFRpcC53b3JkTGlzdC5zaGlmdCgpO1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLkFkZExheWVyQnlOYW1lKCBpdGVtLExheU9VVC5USVAgKTtcclxuICAgICAgICAgICAgR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICBpdGVtLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0Lmxlbmd0aCA8IDEwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0xOldvcmRUaXBzUGFuZWwgPSBuZXcgV29yZFRpcHNQYW5lbCgpO1xyXG4gICAgICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5BZGRMYXllckJ5TmFtZSggaXRlbTEsTGF5T1VULlRJUCApO1xyXG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5wdXNoKGl0ZW0xKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0xLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbTE6V29yZFRpcHNQYW5lbCA9IEdsb2JhbFRpcC5zaG93V29yZExpc3Quc2hpZnQoKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0xLnNob3dXb3JkKCB3b3JkICk7XHJcbiAgICAgICAgICAgICAgICBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LnB1c2goaXRlbTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZHdvcmRMaXN0KCBpdGVtOldvcmRUaXBzUGFuZWwgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGl0ZW0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXRlbS5yZW1vdmVGcm9tUGFyZW50KCk7XHJcbiAgICAgICAgICAgIHZhciBpbmRleDpudW1iZXIgPSBHbG9iYWxUaXAuc2hvd1dvcmRMaXN0LmluZGV4T2YoIGl0ZW0gKTtcclxuICAgICAgICAgICAgaWYoIGluZGV4ICE9IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgR2xvYmFsVGlwLnNob3dXb3JkTGlzdC5zcGxpY2UoIGluZGV4LDEgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLkNsZWFyTGF5ZXJCeU5hbWUoTGF5T1VULlRJUCApO1xyXG4gICAgICAgICAgICBHbG9iYWxUaXAud29yZExpc3QucHVzaCggaXRlbSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIiwiZXhwb3J0ICBjbGFzcyBMRXZlbnQgZXh0ZW5kcyBMYXlhLkV2ZW50XHJcbntcclxuICAgIHB1YmxpYyBDTEFTU19OQU1FOnN0cmluZyA9IFwiTEV2ZW50XCI7XHJcbiAgICBwcml2YXRlIF9vYmo6YW55O1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nLCBvYmo6YW55ID0gbnVsbCwgYnViYmxlczpib29sZWFuID0gZmFsc2UsIGNhbmNlbGFibGU6Ym9vbGVhbiA9IGZhbHNlKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGlmKG9iail7XHJcbiAgICAgICAgICAgIHRoaXMuX29iaiA9IG9iajtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsb25lKG9iaj86T2JqZWN0KTpMRXZlbnR7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMRXZlbnQodGhpcy50eXBlLCBvYmo/b2JqOnRoaXMuX29iaik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvU3RyaW5nKCk6dm9pZHtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLkNMQVNTX05BTUUsIFwidHlwZVwiLCBcImJ1YmJsZXNcIiwgXCJjYW5jZWxhYmxlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Lyg5Y+C6I635Y+WXHJcbiAgICAgKiBAcmV0dXJucyB7YW55fVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IHBhcmFtKCk6YW55e1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmo7XHJcbiAgICB9XHJcblxyXG59IiwiXHJcbmV4cG9ydCBjbGFzcyBMYXlPVVQge1xyXG4gICAgLyoqXHJcbiAgICAgKiDog4zmma/lsYJcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBCRzogc3RyaW5nID0gXCJCR1wiO1xyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxglxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIFVJOiBzdHJpbmcgPSBcIlVJXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB1aeWxguS4iuWxglxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIFVJVG9wOiBzdHJpbmcgPSBcIlVJVG9wXCI7XHJcbiAgICAvKipcclxuICAgICAqIHRpcHPlsYJcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBUSVA6IHN0cmluZyA9IFwiVElQXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmlrDmiYvlvJXlr7zlsYJcclxuICAgICAqL1xyXG4gICAgc3RhdGljICBHVUlERTpzdHJpbmcgPSBcIkdVSURFXCI7XHJcblxyXG59XHJcbiIsIi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0ICBjbGFzcyBTaW5nbGV0b24gZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBfZGljdDphbnkgPSB7fTtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiDojrflj5bljZXkvovnsbvvvIzoi6XkuI3lrZjlnKjliJnov5Tlm57nqbpcclxuICAgICAqIEBwYXJhbVx0cmVmIOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xyXG4gICAgICogQHJldHVyblx0KlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIEluc3RhbmNlKHJlZjphbnkpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0aW5zdGFuY2UgZXJyb1wiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5Y2V5L6L57G777yM6Iul5LiN5a2Y5Zyo5YiZ5Yib5bu6XHJcbiAgICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgICAqIEByZXR1cm5cdCpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZU9yQ3JlYXRlKHJlZjphbnkpOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCByZWYua2V5ID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0SW5zdGFuY2VPckNyZWF0ZSBlcnJvXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0ZShyZWYpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaWN0W3JlZi5rZXldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgKiDliJvlu7rljZXkvovnsbtcclxuICAgKiBAcGFyYW1cdHJlZlx0XHTnu6fmib/oh6pTaW5nbGV0b27nmoTnsbtcclxuICAgKiBAcmV0dXJuXHR2b2lkXHJcbiAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShyZWY6YW55KTphbnlcclxuICAgIHtcclxuICAgICAgICBpZiggcmVmLmtleSA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNyZWF0ZSBlcnJvXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLl9kaWN0W3JlZi5rZXldID09IG51bGwpIFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fZGljdFtyZWYua2V5XSA9IG5ldyByZWYoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3RbcmVmLmtleV07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICAgICAqIOWIoOmZpOWNleS+i+exu1xyXG4gICAgICAgICAqIEBwYXJhbVx0cmVmXHRcdOe7p+aJv+iHqlNpbmdsZXRvbueahOexu1xyXG4gICAgICAgICAqIEByZXR1cm5cdHZvaWRcclxuICAgICAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHJlZjphbnkpOnZvaWRcclxuXHR7XHJcbiAgICAgICAgdmFyIGtleTpzdHJpbmcgPSByZWYua2V5O1xyXG4gICAgICAgIGlmKHRoaXMuX2RpY3Rba2V5XSAhPSBudWxsKSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RpY3Rba2V5XS5kZXN0b3J5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICog6ZSA5q+B5pa55rOVXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGRlc3RvcnkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1BhbmVsQ2hpbGRDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9QYW5lbENoaWxkQ29udHJvbFwiO1xyXG5pbXBvcnQge1NraW5EYXRhfSBmcm9tIFwiLi4vRGF0YS9Ta2luRGF0YVwiO1xyXG5pbXBvcnQge0FnZW5jeVNraW59IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5U2tpblwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQgeyBHbG9iYWxUaXAgfSBmcm9tIFwiLi4vdXRpbHMvR2xvYmFsVGlwXCI7XHJcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XHJcbmltcG9ydCBNb3ZpZUNsaXAgPSBMYXlhLk1vdmllQ2xpcDtcclxuaW1wb3J0IHsgdHRhZCB9IGZyb20gXCIuLi9XWFNESy90dGFkXCI7XHJcbmV4cG9ydCBjbGFzcyBTa2luSXRlbSBleHRlbmRzIGZhaXJ5Z3VpLkdCdXR0b24gXHJcbntcclxuICAgIGxvYWRfaWNvbjpmYWlyeWd1aS5HTG9hZGVyO1xyXG4gICAgY19zdGF0ZTpmYWlyeWd1aS5Db250cm9sbGVyO1xyXG4gICAgdHh0X25lZWQ6ZmFpcnlndWkuR1RleHRGaWVsZDtcclxuICAgIHBpZnV2bzpTa2luRGF0YTtcclxuICAgIGJ0bl8wOmZhaXJ5Z3VpLkdMb2FkZXI7XHJcbiAgICBwcml2YXRlIGFnZW5jeXNraW46QWdlbmN5U2tpbjtcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGJnQ29sb3JDaGFubmVsczogYW55ID0geyByOiA5OSwgZzogMCwgYjogMHhGRiB9O1xyXG4gICAgcHJpdmF0ZSBnZXRIZXhDb2xvclN0cmluZygpOiBzdHJpbmcge1xyXG4gICAgICAgIHRoaXMuYmdDb2xvckNoYW5uZWxzLnIgPSBNYXRoLmZsb29yKHRoaXMuYmdDb2xvckNoYW5uZWxzLnIpO1xyXG4gICAgICAgIC8vIOe7v+iJsumAmumBk+S9v+eUqDBcclxuICAgICAgICB0aGlzLmJnQ29sb3JDaGFubmVscy5nID0gMDtcclxuICAgICAgICAvL29iai5nID0gTWF0aC5mbG9vcihvYmouZyk7XHJcbiAgICAgICAgdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuYiA9IE1hdGguZmxvb3IodGhpcy5iZ0NvbG9yQ2hhbm5lbHMuYik7XHJcblxyXG4gICAgICAgIHZhciByOiBTdHJpbmcgPSB0aGlzLmJnQ29sb3JDaGFubmVscy5yLnRvU3RyaW5nKDE2KTtcclxuICAgICAgICByID0gci5sZW5ndGggPT0gMiA/IHIgOiBcIjBcIiArIHI7XHJcbiAgICAgICAgdmFyIGc6IFN0cmluZyA9IHRoaXMuYmdDb2xvckNoYW5uZWxzLmcudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgIGcgPSBnLmxlbmd0aCA9PSAyID8gZyA6IFwiMFwiICsgZztcclxuICAgICAgICB2YXIgYjogU3RyaW5nID0gdGhpcy5iZ0NvbG9yQ2hhbm5lbHMuYi50b1N0cmluZygxNik7XHJcbiAgICAgICAgYiA9IGIubGVuZ3RoID09IDIgPyBiIDogXCIwXCIgKyBiO1xyXG4gICAgICAgIHJldHVybiBcIiNcIiArIHIgKyBnICsgYjtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdEZyb21YTUwoeG1sOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5jb25zdHJ1Y3RGcm9tWE1MKHhtbCk7XHJcbiAgICAgICAgZm9yICh2YXIgc3RyIGluIHRoaXMuX2NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtOiBmYWlyeWd1aS5HT2JqZWN0ID0gdGhpcy5fY2hpbGRyZW5bc3RyXTtcclxuICAgICAgICAgICAgdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25Jbml0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5hZ2VuY3lza2luID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lTa2luICk7XHJcbiAgICAgICAgdGhpcy5jX3N0YXRlID0gdGhpcy5nZXRDb250cm9sbGVyKCBcImNfc3RhdGVcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMub24oIExheWEuRXZlbnQuQ0xJQ0ssdGhpcyx0aGlzLmJ0bmNsaWNrICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidG5jbGljaygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5waWZ1dm8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAxOiAvL+aLpeaciVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWdlbmN5c2tpbi5HYWluUGlmdSggdGhpcy5waWZ1dm8gKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOi8v5rS75Yqo6I635Y+WXHJcbiAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyhcIuaaguacquW8gOaUvlwiKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAzOi8v55yL6KeG6aKR6I635Y+WXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXl2aWRlb2NhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcGluZ3RhaXV0aWxzLkluc3RhbmNlLnBsYXlWaWRlbyggXCJcIix0aGlzLHRoaXMucGxheXZpZGVvY2FsbGJhY2sgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0Oi8v6YeR5biB6LSt5LmwXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZ2VuY3lza2luLkdhaW5QaWZ1KCB0aGlzLnBpZnV2byApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgU1dGUGF0aDogc3RyaW5nID0gXCJyZXMvc3dmL2RyYWdvbi5zd2ZcIjtcclxuXHJcblx0XHRwcml2YXRlIE1DV2lkdGg6IG51bWJlciA9IDMxODtcclxuXHRcdHByaXZhdGUgTUNIZWlnaHQ6IG51bWJlciA9IDQwNjtcclxuICAgIHByaXZhdGUgY3JlYXRlTW92aWVDbGlwKCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBtYzogTW92aWVDbGlwID0gbmV3IE1vdmllQ2xpcCgpO1xyXG4gICAgICAgIG1jLmxvYWQodGhpcy5TV0ZQYXRoKTtcclxuXHJcbiAgICAgICAgbWMueCA9IChMYXlhLnN0YWdlLndpZHRoIC0gdGhpcy5NQ1dpZHRoKSAvIDI7XHJcbiAgICAgICAgbWMueSA9IChMYXlhLnN0YWdlLmhlaWdodCAtIHRoaXMuTUNIZWlnaHQpIC8gMjtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChtYyk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHByaXZhdGUgcGxheXZpZGVvY2FsbGJhY2soKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdHRhZC5TaG93VmlkZW8oKGlzTG9hZD0+e1xyXG4gICAgICAgICAgICBpZihpc0xvYWQpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZ2VuY3lza2luLkdhaW5QaWZ1KCB0aGlzLnBpZnV2byApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93RGF0YSggdm86U2tpbkRhdGEgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5waWZ1dm8gPSB2bztcclxuICAgICAgICBpZiggdGhpcy5waWZ1dm8gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkX2ljb24uaWNvbiA9IEFzc2V0UGF0aC5nZXRyb2xlaWNvbiggdGhpcy5waWZ1dm8ucm9sZUNGRy5pY29uICk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmFnZW5jeXNraW4uUm9sZURhdGEuQ2hhcmFjdGVySUQgPT0gdGhpcy5waWZ1dm8ucm9sZUNGRy5pZCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLnBpZnV2by5zdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLnBpZnV2by5yb2xlQ0ZHLmdldFN0YXRlIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY19zdGF0ZS5zZWxlY3RlZEluZGV4ID0gMztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eHRfbmVlZC50ZXh0ID0gdGhpcy5waWZ1dm8uaGFzbnVtICsgXCIvXCIgKyB0aGlzLnBpZnV2by5yb2xlQ0ZHLm5lZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNfc3RhdGUuc2VsZWN0ZWRJbmRleCA9IDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHh0X25lZWQudGV4dCA9IHRoaXMucGlmdXZvLnJvbGVDRkcubmVlZC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jX3N0YXRlLnNlbGVjdGVkSW5kZXggPSAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBwcmVGaXhOdW1iZXIobnVtOm51bWJlciwgc3RyTGVuOm51bWJlcik6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIChcIjAwMDAwMDAwMDBcIiArIG51bSkuc2xpY2UoLXN0ckxlbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBldmFsQmdDb2xvcigpOiB2b2lkIHtcclxuICAgICAgICB2YXIgY29sb3I6IG51bWJlciA9IE1hdGgucmFuZG9tKCkgKiAweEZGRkZGRjtcclxuICAgICAgICB2YXIgY2hhbm5lbHM6IEFycmF5PG51bWJlcj4gPSB0aGlzLmdldENvbG9yQ2hhbm5hbHMoY29sb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q29sb3JDaGFubmFscyhjb2xvcjogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICAgICAgdmFyIHJlc3VsdDogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbG9yID4+IDE2KTtcclxuICAgICAgICByZXN1bHQucHVzaChjb2xvciA+PiA4ICYgMHhGRik7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goY29sb3IgJiAweEZGKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgZGlzcG9zZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm9mZiggTGF5YS5FdmVudC5DTElDSyx0aGlzLHRoaXMuYnRuY2xpY2sgKTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICBcclxufSIsIi8qKlxyXG4gKiDnu6fmib9iYXNlVmlld+eVjOmdoueahOaJk+W8gOWFs+mXreWKqOaViOexu+Wei1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFZpZXdBY3Rpb24gXHJcbnsgICBcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIF90ZXh0OkxheWEuVGV4dCA9IG51bGw7XHJcbiAgICBcdC8qKlxyXG5cdCAqIOWKqOeUu+eKtuaAgeW8gOWni+aXtuaJp+ihjOOAglxyXG5cdCAqL1xyXG5cdHB1YmxpYyBvblN0YXRlRW50ZXIoKTp2b2lkIHtcclxuXHRcdGNvbnNvbGUubG9nKFwi5Yqo55S75byA5aeL5pKt5pS+5LqGXCIpO1xyXG5cdFx0dGhpcy5fdGV4dC50ZXh0ID0gXCLliqjnlLvnirbmgIHvvJrliqjnlLvlvIDlp4vmkq3mlL5cIjtcclxuXHR9XHJcblx0XHRcclxuXHQvKipcclxuXHQgKiDliqjnlLvnirbmgIHmm7TmlrDml7bmiafooYzjgIJcclxuXHQgKi9cclxuXHRwdWJsaWMgb25TdGF0ZVVwZGF0ZSgpOnZvaWQge1xyXG5cdFx0Y29uc29sZS5sb2coXCLliqjnlLvnirbmgIHmm7TmlrDkuoZcIik7XHJcblx0XHR0aGlzLl90ZXh0LnRleHQgPSBcIuWKqOeUu+eKtuaAge+8muWKqOeUu+abtOaWsOS4rVwiO1xyXG5cdH1cclxuXHRcdFxyXG5cdC8qKlxyXG5cdCAqIOWKqOeUu+eKtuaAgemAgOWHuuaXtuaJp+ihjOOAglxyXG5cdCAqL1xyXG5cdHB1YmxpYyBvblN0YXRlRXhpdCgpOnZvaWQge1xyXG5cdFx0Y29uc29sZS5sb2coXCLliqjnlLvpgIDlh7rkuoZcIik7XHJcblx0XHR0aGlzLl90ZXh0LnRleHQgPSBcIuWKqOeUu+eKtuaAge+8muWKqOeUu+W8gOWni+mAgOWHulwiO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiDku47lsI/lj5jlpKdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIEFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heDpzdHJpbmcgPSBcIkFjdGlvblR5cGVfYWRkc2NhbGVNaW5Ub01heFwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICog5LuO5aSn5Y+Y5bCP56e75Ye6XHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBBY3Rpb25UeXBlX3JlbW92ZXNjYWxlTWF4VG9NaW46c3RyaW5nID0gXCJBY3Rpb25UeXBlX3JlbW92ZXNjYWxlTWF4VG9NaW5cIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOayoeacieWKqOaViFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9ub25lOnN0cmluZyA9IFwiQWN0aW9uVHlwZV9ub25lXCI7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgc2NlbmU6TGF5YS5TY2VuZTNEO1xyXG4gICAgcHJpdmF0ZSBtYXQxOkxheWEuQmxpbm5QaG9uZ01hdGVyaWFsOyBcclxuICAgIHByaXZhdGUgbWVzaDE6TGF5YS5NZXNoO1xyXG4gICAgcHJpdmF0ZSBtZXNoMjpMYXlhLk1lc2g7XHJcbiAgICBwdWJsaWMgYWRkQm94KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGZvciAobGV0IGk6bnVtYmVyID0gMDsgaSA8IDg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFZlcnRpY2FsQm94KC0wLjY1LCAwLjE2NSArIGkgKiAwLjMzICogMiwgMCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVmVydGljYWxCb3goMCwgMC4xNjUgKyBpICogMC4zMyAqIDIsIDApO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFZlcnRpY2FsQm94KDAuNjUsIDAuMTY1ICsgaSAqIDAuMzMgKiAyLCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYWRkVmVydGljYWxCb3goeDpudW1iZXIsIHk6bnVtYmVyLCB6Om51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBib3g6TGF5YS5NZXNoU3ByaXRlM0QgPSB0aGlzLnNjZW5lLmFkZENoaWxkKG5ldyBMYXlhLk1lc2hTcHJpdGUzRCh0aGlzLm1lc2gxKSkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5tYXRlcmlhbCA9IHRoaXMubWF0MTtcclxuICAgICAgICBib3gubWVzaFJlbmRlcmVyLmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAgICAgICAgYm94LnRyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoeCwgeSwgeik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIHJpZ2lkQm9keTpMYXlhLlJpZ2lkYm9keTNEID0gYm94LmFkZENvbXBvbmVudChMYXlhLlJpZ2lkYm9keTNEKSBhcyBMYXlhLlJpZ2lkYm9keTNEO1xyXG4gICAgICAgIHJpZ2lkQm9keS5tYXNzID0gMTA7XHJcbiAgICAgICAgcmlnaWRCb2R5LmZyaWN0aW9uID0gMC40O1xyXG4gICAgICAgIHJpZ2lkQm9keS5yZXN0aXR1dGlvbiA9IDAuMjtcclxuICAgICAgICB2YXIgYm94U2hhcGU6TGF5YS5Cb3hDb2xsaWRlclNoYXBlID0gbmV3IExheWEuQm94Q29sbGlkZXJTaGFwZSgwLjUsIDAuMzMsIDIpO1xyXG4gICAgICAgIHJpZ2lkQm9keS5jb2xsaWRlclNoYXBlID0gYm94U2hhcGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47lj7Povrnnp7vliqjliLDkuK3lpK5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIEFjdGlvblR5cGVfYWRkbW92ZVRvTWlkZGxlOnN0cmluZz1cIkFjdGlvblR5cGVfYWRkbW92ZVRvTWlkZGxlXCI7XHJcbiAgICAvKipcclxuICAgICAqIOS7juacgOWPs+i+ueenu+WHulxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9yZW1vdmVtb3ZlVG9SaWdodDpzdHJpbmcgPSBcIkFjdGlvblR5cGVfcmVtb3ZlbW92ZVRvUmlnaHRcIjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS7juW6lemDqOWQkeS4iuenu+WKqFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbUJvdHRvbTpzdHJpbmc9XCJBY3Rpb25UeXBlX2FkZG1vdmVGcm9tQm90dG9tXCI7XHJcbiAgICAvKipcclxuICAgICAqIOS7juS4iuWQkeW6lemDqOenu+WKqFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgQWN0aW9uVHlwZV9hZGRtb3ZlRnJvbXVwOnN0cmluZz1cIkFjdGlvblR5cGVfYWRkbW92ZUZyb211cFwiO1xyXG5cclxuICAgIFxyXG5cclxuICAgIFxyXG59Il19