1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960 |
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- (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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelResDic_1 = require("../PrefabControl/PanelResDic");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var Singleton_1 = require("../utils/Singleton");
- var ServerSocket_1 = require("../WXSDK/ServerSocket");
- var RoleData_1 = require("../Data/RoleData");
- /*
- * name;
- */
- var AgencyBaseControl = /** @class */ (function (_super) {
- __extends(AgencyBaseControl, _super);
- function AgencyBaseControl() {
- var _this = _super.call(this) || this;
- _this._objectPool = PanelResDic_1.PanelResDic.Instance;
- _this.initSelf();
- return _this;
- }
- AgencyBaseControl.prototype.initSelf = function () {
- };
- /**********混淆 */
- AgencyBaseControl.prototype.drawSomething = function () {
- this.sp = new Laya.Sprite();
- Laya.stage.addChild(this.sp);
- //画线
- this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
- //画连续直线
- this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5);
- //画曲线
- 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);
- //画矩形
- this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00");
- //画多边形
- this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00");
- //画三角形
- this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00");
- //画圆
- this.sp.graphics.drawCircle(98, 332, 50, "#00ffff");
- //画扇形
- this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff");
- //绘制圆角矩形,自定义路径
- 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" });
- };
- /********** */
- /**
- * 注册全局侦听事件
- *
- */
- AgencyBaseControl.prototype.DisOn = function (type, callbackobj, callbackHandler) {
- DispatcherManager_1.DispatcherManager.addEventListener(type, callbackobj, callbackHandler);
- };
- /**
- * 抛出全局事件
- */
- AgencyBaseControl.prototype.DisTrigger = function (type, data) {
- if (data === void 0) { data = null; }
- DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
- };
- /**
- * 移除全局侦听事件
- */
- AgencyBaseControl.prototype.DisOff = function (type, callbackobj, callbackHandler) {
- DispatcherManager_1.DispatcherManager.removeEventListener(type, callbackobj, callbackHandler);
- };
- /************************** */
- AgencyBaseControl.prototype.setup = function () {
- var textBox = new Laya.Sprite();
- // 随机摆放文本
- var text;
- for (var i = 0; i < 1000; i++) {
- text = new Laya.Text();
- text.fontSize = 20;
- text.text = (Math.random() * 100).toFixed(0);
- text.rotation = Math.random() * 360;
- text.color = "#CCCCCC";
- text.x = Math.random() * Laya.stage.width;
- text.y = Math.random() * Laya.stage.height;
- textBox.addChild(text);
- }
- //缓存为静态图像
- textBox.cacheAs = "bitmap";
- Laya.stage.addChild(textBox);
- };
- /********* ********************/
- AgencyBaseControl.prototype.getSingleTon = function (ref) {
- return this._objectPool.getSingleTon(ref);
- };
- AgencyBaseControl.prototype.sendMessage = function (act, data, isShowWait) {
- if (data === void 0) { data = null; }
- if (isShowWait === void 0) { isShowWait = true; }
- ServerSocket_1.ServerSocket.Instance.sendMessage(act, data, isShowWait);
- };
- Object.defineProperty(AgencyBaseControl.prototype, "RoleData", {
- get: function () {
- if (!this.roleData) {
- this.roleData = RoleData_1.RoleData.Instance;
- }
- return this.roleData;
- },
- enumerable: true,
- configurable: true
- });
- return AgencyBaseControl;
- }(Singleton_1.Singleton));
- exports.AgencyBaseControl = AgencyBaseControl;
- },{"../Data/RoleData":33,"../PrefabControl/PanelResDic":48,"../WXSDK/ServerSocket":78,"../utils/DispatcherManager":85,"../utils/Singleton":91}],2:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AgencyBaseControl_1 = require("./AgencyBaseControl");
- var GameState_1 = require("../utils/GameState");
- var ViewManager_1 = require("../View/ViewManager");
- var CompletePanel_1 = require("../View/CompletePanel");
- var GameStateControl_1 = require("../Control/GameStateControl");
- var GameUtils_1 = require("../utils/GameUtils");
- var SceneControl_1 = require("../Control/SceneControl");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var Sdk_1 = require("../WXSDK/Sdk");
- var AgencyTrial_1 = require("./AgencyTrial");
- var GiftView_1 = require("../View/GiftView");
- var RecordManager_1 = require("../WXSDK/RecordManager");
- var MainPanel_1 = require("../View/MainPanel");
- var AgencyInGame = /** @class */ (function (_super) {
- __extends(AgencyInGame, _super);
- function AgencyInGame() {
- return _super.call(this) || this;
- }
- AgencyInGame.prototype.initSelf = function () {
- this.DisOn(GameState_1.GameState.end, this, this.endgameHandler);
- this.DisOn(GameState_1.GameState.revive, this, this.RevivegameHandler);
- this.DisOn(GameState_1.GameState.lose, this, this.LosegameHandler);
- };
- /**复活界面 */
- AgencyInGame.prototype.RevivegameHandler = function () {
- Laya.timer.once(1000, this, this.reviveView);
- };
- /**失败界面 */
- AgencyInGame.prototype.LosegameHandler = function () {
- Laya.timer.once(1000, this, this.loseView);
- };
- AgencyInGame.prototype.reviveView = function () {
- RecordManager_1.RecordManager.Instance.RecordStop();
- var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
- var getGold = 0;
- Sdk_1.WxApi.recordAldEvent("打开结算界面(复活)");
- ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
- };
- AgencyInGame.prototype.loseView = function () {
- RecordManager_1.RecordManager.Instance.RecordStop();
- var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
- var getGold = 0;
- Sdk_1.WxApi.recordAldEvent("打开结算界面(失败)");
- this.RecropLevelEnd(false);
- ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
- };
- AgencyInGame.prototype.endgameHandler = function () {
- RecordManager_1.RecordManager.Instance.RecordStop();
- Laya.timer.once(1000, this, this.startEndView);
- };
- AgencyInGame.prototype.startEndView = function () {
- var nowmingcvi = GameStateControl_1.GameStateControl.Instance.nowMingCi;
- var getGold = 0;
- if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
- getGold = this.RoleData.levelcfg.winGold;
- Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏胜利)");
- this.RecropLevelEnd(true);
- }
- else {
- var arr = GameUtils_1.GameUtils.cutstrtoArr(this.RoleData.levelcfg.failGod);
- getGold = GameUtils_1.GameUtils.randRangeint(Number(arr[0]), Number(arr[1]));
- Sdk_1.WxApi.recordAldEvent("打开结算界面(游戏失败)");
- this.RecropLevelEnd(false);
- }
- ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, getGold);
- // ViewManager.Instance.add( ChoutiPanView,2 );
- };
- AgencyInGame.prototype.RecropLevelEnd = function (_win) {
- // if(!Laya.Browser.onWeiXin)return;
- // var stageid = this.RoleData.LevelID.toString();
- // var useid = PlayerAccount.CurrentAccount.CurAccountData.UseId;
- // var stagename = "第" + this.RoleData.LevelID + "关";
- // if(_win)
- // {
- // WxApi.levelSuccess(stageid,stagename,stageid);
- // }
- // else
- // {
- // var equipid = this.RoleData.CharacterID.toString();
- // var carname = this.RoleData.roleCfg.name;
- // WxApi.levelFail(stageid,stagename,stageid,"0",carname);
- // }
- };
- AgencyInGame.prototype.returnmainview = function (win) {
- if (win && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
- var ran = Math.random();
- console.log("误触几率为---", ran);
- if (ran <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.EndCheat) {
- ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
- }
- GameState_1.GameState.fuhuocishu = 1;
- GameState_1.GameState.recordscree = false;
- GameState_1.GameState.isdie = false;
- PropManager_1.PropManager.Instance.CloseGameOverEffect();
- ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
- this.DisTrigger(GameState_1.GameState.returnMainView);
- SceneControl_1.SceneControl.Instance.ShowTheGameScene();
- var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
- if (agencytrial.isshiyonging) {
- SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
- agencytrial.isshiyonging = false;
- }
- }
- else {
- GameState_1.GameState.fuhuocishu = 1;
- GameState_1.GameState.recordscree = false;
- GameState_1.GameState.isdie = false;
- PropManager_1.PropManager.Instance.CloseGameOverEffect();
- ViewManager_1.ViewManager.Instance.close(CompletePanel_1.CompletePanel);
- this.DisTrigger(GameState_1.GameState.returnMainView);
- SceneControl_1.SceneControl.Instance.ShowTheGameScene();
- var agencytrial = this.getSingleTon(AgencyTrial_1.AgencyTrial);
- if (agencytrial.isshiyonging) {
- SceneControl_1.SceneControl.Instance.CreatePlayer(this.RoleData.roleCfg);
- agencytrial.isshiyonging = false;
- }
- }
- if (GameState_1.GameState.GameNum % 3 == 0) {
- MainPanel_1.MainPanel.instance.skinclick();
- }
- //打开好友邀请界面
- // ViewManager.Instance.add(FriendInviteView);
- };
- AgencyInGame.prototype.startGame = function () {
- AgencyInGame.gamenum++;
- var stageid = this.RoleData.getNowServerLevel().toString().toString();
- var stagename = "第" + stageid + "关";
- var useid = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.UseId;
- Sdk_1.WxApi.levelStart(stageid, stagename, useid);
- GameStateControl_1.GameStateControl.Instance.startGame();
- };
- AgencyInGame.key = "AgencyInGame";
- AgencyInGame.gamenum = 0;
- return AgencyInGame;
- }(AgencyBaseControl_1.AgencyBaseControl));
- exports.AgencyInGame = AgencyInGame;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var ViewManager_1 = require("../View/ViewManager");
- var LoadingPanel_1 = require("../View/LoadingPanel");
- var AgencyUserMessage_1 = require("./AgencyUserMessage");
- var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
- var AgencyBaseControl_1 = require("./AgencyBaseControl");
- var AgencyMain_1 = require("./AgencyMain");
- var RoleCFG_1 = require("../CFG/RoleCFG");
- var LevelCFG_1 = require("../CFG/LevelCFG");
- var BuildCFG_1 = require("../CFG/BuildCFG");
- var NpcCFG_1 = require("../CFG/NpcCFG");
- var GameCFG_1 = require("../CFG/GameCFG");
- var AgencySkin_1 = require("./AgencySkin");
- var Sdk_1 = require("../WXSDK/Sdk");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var NetworkManager_1 = require("../WXSDK/NetworkManager");
- var Global_1 = require("../Global");
- var LotteryCFG_1 = require("../CFG/LotteryCFG");
- var AgencyLottery_1 = require("./AgencyLottery");
- var ttad_1 = require("../WXSDK/ttad");
- var AgencyLogin = /** @class */ (function (_super) {
- __extends(AgencyLogin, _super);
- function AgencyLogin() {
- return _super.call(this) || this;
- }
- AgencyLogin.prototype.initSelf = function () {
- this.DisOn(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_loginSucceed, this, this.Success);
- };
- AgencyLogin.prototype.Login = function () {
- ViewManager_1.ViewManager.Instance.add(LoadingPanel_1.LoadingPanel);
- this.loginprogress(0);
- // if(Laya.Browser.onWeiXin)
- // {
- // this.LoginWX();
- // }
- // else
- // {
- this.LoginLocal();
- // }
- };
- AgencyLogin.prototype.LoginWX = function () {
- var _this = this;
- Sdk_1.WxApi.recordAldEvent("开始微信登录");
- Sdk_1.WxApi.WXLogin(function (res) {
- if (res != "error") {
- Sdk_1.WxApi.recordAldEvent("微信登录成功");
- console.log("hplogin:" + "querychannel->" + Sdk_1.WxApi.querychannel + " referrerInfoappId->" + Sdk_1.WxApi.referrerInfoappId);
- _this.LoginLocal();
- }
- else {
- Sdk_1.WxApi.recordAldEvent("微信登录失败");
- _this.LoginWX();
- }
- });
- };
- AgencyLogin.prototype.LoginLocal = function (res) {
- if (res === void 0) { res = null; }
- Sdk_1.WxApi.recordAldEvent("开始本地登录");
- if (res) {
- new PlayerAccount_1.PlayerAccount(res.code, "", "", 0, "", "", "", "", Sdk_1.WxApi.shareOpenId, Sdk_1.WxApi.shareOpenId, Global_1.Global.gameVersion);
- }
- NetworkManager_1.NetworkManager.Instance.login(null, Laya.Handler.create(this, this.LoginComplete), null);
- //this.LoadSbp();
- };
- AgencyLogin.prototype.LoginComplete = function () {
- Sdk_1.WxApi.recordAldEvent("本地服务器登录完成...");
- // ShareUtil.Instance.onRegister();
- // GuangGao.InitVideo();
- Sdk_1.WxApi.aldSendOpenid(PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.openid);
- this.Success();
- };
- AgencyLogin.prototype.loginprogress = function (value) {
- var loadingPanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
- if (loadingPanel) {
- loadingPanel.showWord(value);
- }
- };
- AgencyLogin.prototype.Success = function () {
- this.ResolveData();
- this.initData();
- this.StartMain();
- ttad_1.ttad.InitAD();
- };
- AgencyLogin.prototype.StartMain = function () {
- console.log("当前配置表总关卡:", LevelCFG_1.default.vec.length);
- this.getSingleTon(AgencyMain_1.AgencyMain).StartMain();
- };
- /**
- * 解析配置数据
- */
- AgencyLogin.prototype.ResolveData = function () {
- var byteData = PlayerAccount_1.PlayerAccount.CurrentAccount.nowConfig.gameConfig[0].config;
- if (byteData && byteData != "") {
- var arr = byteData.split("%file%");
- var i;
- var nums = arr.length;
- for (i = 0; i < nums; i++) {
- var itemarr = arr[i].split("%cfg%");
- var cla = AgencyLogin.configClass[itemarr[0]];
- if (cla) {
- cla.initCfg(itemarr[1]);
- }
- else {
- }
- }
- return true;
- }
- return false;
- };
- /**
- * 初始化游戏数据
- */
- AgencyLogin.prototype.initData = function () {
- this.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).init();
- this.getSingleTon(AgencySkin_1.AgencySkin).init();
- this.getSingleTon(AgencyLottery_1.AgencyLottery).init();
- };
- AgencyLogin.key = "AgencyLogin";
- AgencyLogin.configClass = {
- RoleCFG: RoleCFG_1.default,
- LevelCFG: LevelCFG_1.default,
- BuildCFG: BuildCFG_1.default,
- NpcCFG: NpcCFG_1.default,
- GameCFG: GameCFG_1.default,
- LotteryCFG: LotteryCFG_1.default
- };
- return AgencyLogin;
- }(AgencyBaseControl_1.AgencyBaseControl));
- exports.AgencyLogin = AgencyLogin;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AgencyBaseControl_1 = require("./AgencyBaseControl");
- var ViewManager_1 = require("../View/ViewManager");
- var LotteryPanel_1 = require("../View/LotteryPanel");
- var LotteryCFG_1 = require("../CFG/LotteryCFG");
- var GameUtils_1 = require("../utils/GameUtils");
- var GlobalTip_1 = require("../utils/GlobalTip");
- var RoleCFG_1 = require("../CFG/RoleCFG");
- var AgencySkin_1 = require("./AgencySkin");
- var AgencyLottery = /** @class */ (function (_super) {
- __extends(AgencyLottery, _super);
- function AgencyLottery() {
- var _this = _super.call(this) || this;
- _this.mStartX = 400;
- _this.mStartY = 500;
- _this.mActionIndex = 0;
- _this.mCurrIndex = 0;
- _this.mCurrSkinIndex = 0;
- return _this;
- }
- AgencyLottery.prototype.init = function () {
- };
- AgencyLottery.prototype.openView = function () {
- ViewManager_1.ViewManager.Instance.add(LotteryPanel_1.LotteryPanel);
- };
- /**************************** */
- AgencyLottery.prototype.createAnimation = function () {
- var ani = new Laya.Animation();
- // ani.loadAtlas(this.AniConfPath); // 加载图集动画
- ani.interval = 30; // 设置播放间隔(单位:毫秒)
- ani.index = 1; // 当前播放索引
- ani.play(); // 播放图集动画
- // 获取动画的边界信息
- var bounds = ani.getGraphicBounds();
- ani.pivot(bounds.width / 2, bounds.height / 2);
- ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
- Laya.stage.addChild(ani);
- };
- /************************* */
- AgencyLottery.prototype.getreward = function (cfg) {
- if (cfg) {
- switch (cfg.type) {
- case 1:
- this.RoleData.Money += Number(cfg.value);
- GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得" + cfg.value + "金币!");
- break;
- case 2:
- var rolecfg = RoleCFG_1.default.dict[cfg.value];
- this.getSingleTon(AgencySkin_1.AgencySkin).setRoleState(rolecfg, 1);
- GlobalTip_1.GlobalTip.Instance.showWordTips("恭喜获得角色" + rolecfg.rolename);
- break;
- }
- }
- };
- AgencyLottery.prototype.GetReward = function () {
- var index = 0;
- var dicts = LotteryCFG_1.default.vec;
- var maxNum = 0;
- var cfg;
- var i = 0;
- for (i = 0; i < dicts.length; i++) {
- cfg = dicts[i];
- maxNum += cfg.weight;
- }
- var sordvalue = GameUtils_1.GameUtils.randRangeint(1, maxNum);
- var totalnum = 0;
- for (i = 0; i < dicts.length; i++) {
- cfg = dicts[i];
- totalnum += cfg.weight;
- if (totalnum >= sordvalue) {
- index = i;
- break;
- }
- }
- return index;
- };
- /************************************************ */
- AgencyLottery.prototype.startFun = function () {
- this.mAniPath = "res/spine/spineRes1/dragon.sk";
- // this.mFactory = new Templet();
- // this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
- // this.mFactory.on(Event.ERROR, this, this.onError);
- // this.mFactory.loadAni(this.mAniPath);
- };
- AgencyLottery.prototype.onError = function () {
- console.log("error");
- };
- AgencyLottery.prototype.parseComplete = function () {
- //创建模式为1,可以启用换装
- this.mArmature = this.mFactory.buildArmature(1);
- this.mArmature.x = this.mStartX;
- this.mArmature.y = this.mStartY;
- this.mArmature.scale(0.5, 0.5);
- Laya.stage.addChild(this.mArmature);
- // this.mArmature.on(Event.STOPPED, this, this.completeHandler);
- this.play();
- };
- AgencyLottery.prototype.completeHandler = function () {
- this.play();
- };
- AgencyLottery.prototype.play = function () {
- this.mCurrIndex++;
- if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
- this.mCurrIndex = 0;
- }
- this.mArmature.play(this.mCurrIndex, false);
- };
- AgencyLottery.key = "AgencyLottery";
- return AgencyLottery;
- }(AgencyBaseControl_1.AgencyBaseControl));
- exports.AgencyLottery = AgencyLottery;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AgencyBaseControl_1 = require("./AgencyBaseControl");
- var ResourceControl_1 = require("../Control/ResourceControl");
- var LoadingPanel_1 = require("../View/LoadingPanel");
- var ViewManager_1 = require("../View/ViewManager");
- var ResDataControl_1 = require("../Control/ResDataControl");
- var MainPanel_1 = require("../View/MainPanel");
- var SceneControl_1 = require("../Control/SceneControl");
- var AssetPath_1 = require("../Config/AssetPath");
- var GameStateControl_1 = require("../Control/GameStateControl");
- var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
- var NpcCFG_1 = require("../CFG/NpcCFG");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
- var GiftView_1 = require("../View/GiftView");
- var AssetManager_1 = require("../Control/AssetManager");
- var AgencyMain = /** @class */ (function (_super) {
- __extends(AgencyMain, _super);
- function AgencyMain() {
- var _this = _super.call(this) || this;
- _this._loadjd = 0;
- _this._alljd = 0;
- return _this;
- }
- AgencyMain.prototype.initSelf = function () {
- };
- AgencyMain.prototype.StartMain = function () {
- this._loadjd = 0;
- this._alljd = 20;
- WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage", this, this.sub1complete, this.loadprogress, null);
- };
- AgencyMain.prototype.sub1complete = function () {
- this._loadjd = 20;
- this._alljd = 30;
- WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage("subpackage1", this, this.SubpackageOver, this.loadprogress, null);
- };
- AgencyMain.prototype.onComplete = function () {
- //添加父级猴子
- var dude = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/skinModel/dude/dude.lh"));
- //缩放
- var scale = new Laya.Vector3(0.1, 0.1, 0.1);
- dude.transform.localScale = scale;
- dude.transform.rotate(new Laya.Vector3(0, 3.14, 0));
- };
- /*************************************** */
- AgencyMain.prototype.SubpackageOver = function () {
- var _this = this;
- AssetManager_1.AssetManager.LoadAssetFun(function () {
- _this._loadjd = 50;
- _this._alljd = 40;
- var pathArr = [];
- var urlArr = [];
- urlArr.push(AssetPath_1.AssetPath.get3DModel("startpanel"));
- urlArr.push(AssetPath_1.AssetPath.get3DModel("endpanel"));
- urlArr.push(AssetPath_1.AssetPath.get3DModel("speedupeffect"));
- urlArr.push(AssetPath_1.AssetPath.get3DModel("color_white"));
- urlArr.push(AssetPath_1.AssetPath.get3DModel("color_yellow"));
- urlArr.push(AssetPath_1.AssetPath.get3DModel("winline"));
- urlArr.push(AssetPath_1.AssetPath.get3DModel("fireworks"));
- urlArr.push(AssetPath_1.AssetPath.get3DModel("DirectionalLight"));
- // urlArr.push( AssetPath.get3DModel( "distantview" ) );
- urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(_this.RoleData.roleCfg.name));
- urlArr.push(AssetPath_1.AssetPath.get3DRoleModel("Arrow"));
- var arr = _this.RoleData.levelmapArr;
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
- urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
- }
- }
- var npcArr = _this.RoleData.levelcfg.npc;
- for (i = 0; i < npcArr.length; i++) {
- if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
- urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
- }
- }
- for (i = 0; i < urlArr.length; i++) {
- pathArr.push({ url: urlArr[i] });
- }
- ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, _this, _this.load3Dcomplete, _this.loadprogress);
- });
- };
- AgencyMain.prototype.load3Dcomplete = function () {
- this._loadjd = 90;
- this._alljd = 10;
- ResourceControl_1.ResourceControl.Instance.loadGroup("main", this, this.loadcomplete, this.loadprogress, false);
- };
- AgencyMain.prototype.loadprogress = function (value) {
- var loadingpanel = ViewManager_1.ViewManager.Instance.getView(LoadingPanel_1.LoadingPanel);
- if (loadingpanel) {
- value = this._loadjd + Math.ceil(value / 100 * this._alljd);
- loadingpanel.showWord(value);
- }
- };
- AgencyMain.prototype.loadcomplete = function () {
- fairygui.UIConfig.buttonSound = "ui://lecxynh2iz9y26";
- GameStateControl_1.GameStateControl.Instance.init();
- ResDataControl_1.ResDataControl.Instance.AddViewPackByName("main");
- ViewManager_1.ViewManager.Instance.close(LoadingPanel_1.LoadingPanel);
- // FYHD_Sdk.InitSdk();
- ViewManager_1.ViewManager.Instance.add(MainPanel_1.MainPanel);
- console.log("新用户FYHD_Sdk.isnewuser---", FYHD_Sdk_1.FYHD_Sdk.isnewuser);
- var newuser = Laya.LocalStorage.getItem("is_newuser");
- if (FYHD_Sdk_1.FYHD_Sdk.isnewuser) {
- Laya.timer.once(500, this, function () {
- if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
- ViewManager_1.ViewManager.Instance.add(GiftView_1.default);
- }
- });
- }
- else {
- Laya.LocalStorage.setItem("is_newuser", "1");
- }
- SceneControl_1.SceneControl.Instance.SetScene();
- PropManager_1.PropManager.Instance.InitEffect();
- };
- AgencyMain.key = "AgencyMain";
- return AgencyMain;
- }(AgencyBaseControl_1.AgencyBaseControl));
- exports.AgencyMain = AgencyMain;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AgencyBaseControl_1 = require("./AgencyBaseControl");
- var LocalDataControl_1 = require("../Control/LocalDataControl");
- var UserDataInfo_1 = require("../Data/UserDataInfo");
- var SkinData_1 = require("../Data/SkinData");
- var RoleCFG_1 = require("../CFG/RoleCFG");
- var ViewManager_1 = require("../View/ViewManager");
- var SkinPanel_1 = require("../View/SkinPanel");
- var GlobalTip_1 = require("../utils/GlobalTip");
- var GameState_1 = require("../utils/GameState");
- var AgencySkin = /** @class */ (function (_super) {
- __extends(AgencySkin, _super);
- function AgencySkin() {
- var _this = _super.call(this) || this;
- AgencySkin.instance = _this;
- return _this;
- }
- AgencySkin.prototype.initSelf = function () {
- };
- AgencySkin.prototype.init = function () {
- this.localdata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin);
- var pifuData;
- if (!this.localdata.hasOwnProperty("pifu")) {
- this.localdata["pifu"] = {};
- }
- pifuData = this.localdata["pifu"];
- this.pifuArr = [];
- this.pifuDict = {};
- var i = 0;
- var nums = RoleCFG_1.default.vec.length;
- for (i = 0; i < nums; i++) {
- var pifuvo = new SkinData_1.SkinData;
- var cfg = RoleCFG_1.default.vec[i];
- pifuvo.roleCFG = cfg;
- var d = pifuData[cfg.id];
- if (d) {
- pifuvo.state = Number(d.state);
- pifuvo.hasnum = Number(d.hasnum);
- }
- else {
- pifuvo.state = 0;
- pifuvo.hasnum = 0;
- }
- if (cfg.getState == 0) {
- pifuvo.state = 1;
- }
- this.pifuArr.push(pifuvo);
- this.pifuDict[pifuvo.roleCFG.id] = pifuvo;
- }
- };
- AgencySkin.prototype.openview = function () {
- ViewManager_1.ViewManager.Instance.add(SkinPanel_1.SkinPanel);
- };
- AgencySkin.prototype.setRoleState = function (cfg, value) {
- var pifuvo = this.pifuDict[cfg.id];
- if (pifuvo) {
- pifuvo.state = 1;
- this.AddLocalSkinData(pifuvo.roleCFG.id, pifuvo.state, pifuvo.hasnum);
- }
- };
- AgencySkin.prototype.AddLocalSkinData = function (id, state, hasnum) {
- this.localdata["pifu"][id] = {};
- this.localdata["pifu"][id]["state"] = state;
- this.localdata["pifu"][id]["hasnum"] = hasnum;
- LocalDataControl_1.LocalDataControl.Instance.AddData(UserDataInfo_1.UserDataInfo.skin, this.localdata);
- };
- AgencySkin.prototype.createCantralRect = function () {
- this.rect = new Laya.Sprite();
- this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
- Laya.stage.addChild(this.rect);
- this.updateRectPos();
- };
- AgencySkin.prototype.updateRectPos = function () {
- this.rect.x = Laya.stage.width / 2;
- this.rect.y = Laya.stage.height / 2;
- };
- /****************************************** */
- AgencySkin.prototype.GainPifu = function (_skinitem) {
- if (_skinitem.state == 1) {
- this.RoleData.CharacterID = _skinitem.roleCFG.id;
- this.DisTrigger(GameState_1.GameState.updateSKinView);
- }
- else {
- switch (_skinitem.roleCFG.getState) {
- case 1: //视频获取
- _skinitem.hasnum++;
- if (_skinitem.roleCFG.need <= _skinitem.hasnum) {
- _skinitem.state = 1;
- }
- this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
- this.DisTrigger(GameState_1.GameState.updateSKinView);
- break;
- case 2: //金币购买
- if (this.RoleData.Money >= _skinitem.roleCFG.need) {
- this.RoleData.Money -= _skinitem.roleCFG.need;
- _skinitem.state = 1;
- this.AddLocalSkinData(_skinitem.roleCFG.id, _skinitem.state, _skinitem.hasnum);
- this.DisTrigger(GameState_1.GameState.updateSKinView);
- GlobalTip_1.GlobalTip.Instance.showWordTips("购买成功");
- }
- else {
- GlobalTip_1.GlobalTip.Instance.showWordTips("金币不足");
- }
- break;
- case 3: //活动获取
- break;
- }
- }
- };
- AgencySkin.prototype.GainNoHaveSkin = function () {
- var arr = [];
- for (var s in this.pifuDict) {
- if (this.pifuDict[s].state == 0) {
- arr.push(this.pifuDict[s]);
- }
- }
- return arr;
- };
- AgencySkin.key = "AgencySkin";
- return AgencySkin;
- }(AgencyBaseControl_1.AgencyBaseControl));
- exports.AgencySkin = AgencySkin;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AgencyBaseControl_1 = require("./AgencyBaseControl");
- var ViewManager_1 = require("../View/ViewManager");
- var TrialPanel_1 = require("../View/TrialPanel");
- var GameStateControl_1 = require("../Control/GameStateControl");
- var AssetPath_1 = require("../Config/AssetPath");
- var ResourceControl_1 = require("../Control/ResourceControl");
- var SceneControl_1 = require("../Control/SceneControl");
- var AgencyInGame_1 = require("./AgencyInGame");
- var EggPanel_1 = require("../View/EggPanel");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var AgencyTrial = /** @class */ (function (_super) {
- __extends(AgencyTrial, _super);
- function AgencyTrial() {
- var _this = _super.call(this) || this;
- _this.isshiyonging = false;
- return _this;
- }
- AgencyTrial.prototype.openview = function (arr) {
- ViewManager_1.ViewManager.Instance.add(TrialPanel_1.TrialPanel, arr);
- };
- /**退出界面 */
- AgencyTrial.prototype.ExitPanel = function (_data) {
- this.isshiyonging = _data ? true : false;
- this._selectvo = _data;
- if (_data) {
- var urlArr = [];
- urlArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(_data.roleCFG.name) });
- ResourceControl_1.ResourceControl.Instance.loader3DArr(urlArr, this, this.SceneCreateComplete, null, true);
- }
- else {
- // if(AgencyInGame.gamenum>1){
- var random = Math.random();
- if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser && random <= PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.HitEgg) {
- ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
- }
- else {
- GameStateControl_1.GameStateControl.Instance.entergame();
- }
- // }
- // else{
- // GameStateControl.Instance.entergame();
- // }
- }
- ViewManager_1.ViewManager.Instance.close(TrialPanel_1.TrialPanel);
- };
- /************************************************ */
- AgencyTrial.prototype.createSprite = function () {
- this.sprit = new Laya.Sprite();
- this.sprit.graphics.drawRect(0, 0, 200, 200, "#D2691E");
- this.sprit.pivot(100, 100);
- this.sprit.x = Laya.stage.width / 2;
- this.sprit.y = Laya.stage.height / 2;
- this.sprit.size(200, 200);
- Laya.stage.addChild(this.sprit);
- // this.sp.on(Interaction_CustomEvent.ROTATE, this, this.onRotate); // 侦听自定义的事件
- // this.sprit.on(Event.CLICK, this, this.onSpriteClick);
- };
- AgencyTrial.prototype.onSpriteClick = function (e) {
- var randomAngle = Math.random() * 180;
- //发送自定义事件
- // this.sprit.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
- };
- // 触发自定义的rotate事件
- AgencyTrial.prototype.onRotate = function (newAngle) {
- // Tween.to(this.sp, { "rotation": newAngle }, 1000, Ease.elasticOut);
- };
- /******************************* */
- AgencyTrial.prototype.SceneCreateComplete = function () {
- SceneControl_1.SceneControl.Instance.CreatePlayer(this._selectvo.roleCFG);
- if (AgencyInGame_1.AgencyInGame.gamenum > 1) {
- if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.WhiteUser) {
- ViewManager_1.ViewManager.Instance.add(EggPanel_1.default);
- }
- else {
- GameStateControl_1.GameStateControl.Instance.entergame();
- }
- }
- else {
- GameStateControl_1.GameStateControl.Instance.entergame();
- }
- };
- /******************************* */
- AgencyTrial.prototype.createText = function () {
- var txt = new Laya.Text();
- //给文本的text属性赋值
- txt.text = "Layabox是性能最强的HTML5引擎技术提供商与优秀的游戏发行商,面向Flash开发者提供HTML5开发技术方案!";
- //设置宽度,高度自动匹配
- txt.width = 400;
- //自动换行
- txt.wordWrap = true;
- txt.align = "center";
- txt.fontSize = 40;
- txt.font = "Microsoft YaHei";
- txt.color = "#ff0000";
- txt.bold = true;
- txt.leading = 5;
- //设置描边属性
- txt.stroke = 2;
- txt.strokeColor = "#ffffff";
- txt.borderColor = "#00ff00";
- txt.x = (Laya.stage.width - txt.textWidth) / 2;
- txt.y = (Laya.stage.height - txt.textHeight) / 2;
- Laya.stage.addChild(txt);
- };
- /************************** */
- AgencyTrial.prototype.createInput = function () {
- var inputText = new Laya.Input();
- // 移动端输入提示符
- inputText.prompt = "Type some word...";
- //多行输入
- inputText.multiline = true;
- inputText.wordWrap = true;
- inputText.size(350, 100);
- inputText.x = Laya.stage.width - inputText.width >> 1;
- inputText.y = Laya.stage.height - inputText.height >> 1;
- inputText.padding = [2, 2, 2, 2];
- inputText.bgColor = "#666666";
- inputText.color = "#ffffff";
- inputText.fontSize = 20;
- Laya.stage.addChild(inputText);
- };
- AgencyTrial.key = "AgencyTrial";
- return AgencyTrial;
- }(AgencyBaseControl_1.AgencyBaseControl));
- exports.AgencyTrial = AgencyTrial;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AgencyBaseControl_1 = require("./AgencyBaseControl");
- var AgencyUserMessage = /** @class */ (function (_super) {
- __extends(AgencyUserMessage, _super);
- function AgencyUserMessage() {
- var _this = _super.call(this) || this;
- _this.roleisinit = false;
- return _this;
- }
- AgencyUserMessage.prototype.initSelf = function () {
- };
- /**加金币 */
- AgencyUserMessage.prototype.GoldUp = function (_num) {
- this.RoleData.Money += _num;
- };
- /**************************** */
- AgencyUserMessage.prototype.createInput = function () {
- var inputText = new Laya.Input();
- inputText.size(350, 100);
- inputText.x = Laya.stage.width - inputText.width >> 1;
- inputText.y = Laya.stage.height - inputText.height >> 1;
- inputText.text = "这段文本不可编辑,但可复制";
- inputText.editable = false;
- // 设置字体样式
- inputText.bold = true;
- inputText.bgColor = "#666666";
- inputText.color = "#ffffff";
- inputText.fontSize = 20;
- Laya.stage.addChild(inputText);
- };
- /******************************** */
- AgencyUserMessage.prototype.init = function () {
- this.RoleData.init();
- this.roleisinit = true;
- };
- /************************ */
- AgencyUserMessage.prototype.createText = function () {
- var txt = new Laya.Text();
- txt.text =
- "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
- "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!\n" +
- "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
- txt.borderColor = "#FFFF00";
- txt.size(300, 50);
- txt.fontSize = 20;
- txt.color = "#ffffff";
- Laya.stage.addChild(txt);
- return txt;
- };
- /**************************** */
- /**升级 */
- AgencyUserMessage.prototype.LevelUp = function () {
- this.RoleData.LevelUp();
- };
- AgencyUserMessage.key = "AgencyUserMessage";
- return AgencyUserMessage;
- }(AgencyBaseControl_1.AgencyBaseControl));
- exports.AgencyUserMessage = AgencyUserMessage;
- },{"./AgencyBaseControl":1}],9:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- //------------------------------------------------------------------------------
- //工具生成,请勿修改。
- //配置文件名称:build.xlsx。
- //------------------------------------------------------------------------------
- var BuildCFG = /** @class */ (function () {
- function BuildCFG() {
- }
- BuildCFG.initCfg = function (str) {
- var i = 0;
- var arr = str.split("\n");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var singleStr = arr[i];
- var singleArr = singleStr.split("&");
- if (BuildCFG.dict[singleArr[0]])
- continue;
- var item = new BuildCFG();
- item.name = singleArr[0];
- item.buffx = Number(singleArr[1]);
- item.buffy = Number(singleArr[2]);
- item.buffz = Number(singleArr[3]);
- item.time = Number(singleArr[4]);
- BuildCFG.dict[item.name] = item;
- BuildCFG.vec.push(item);
- }
- };
- BuildCFG.dict = {};
- BuildCFG.vec = [];
- return BuildCFG;
- }());
- exports.default = BuildCFG;
- },{}],10:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- //------------------------------------------------------------------------------
- //工具生成,请勿修改。
- //配置文件名称:game.xlsx。
- //------------------------------------------------------------------------------
- var GameCFG = /** @class */ (function () {
- function GameCFG() {
- }
- GameCFG.initCfg = function (str) {
- var i = 0;
- var arr = str.split("\n");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var singleStr = arr[i];
- var singleArr = singleStr.split("&");
- if (GameCFG.dict[singleArr[0]])
- continue;
- var item = new GameCFG();
- item.id = Number(singleArr[0]);
- item.value = singleArr[1];
- GameCFG.dict[item.id] = item;
- GameCFG.vec.push(item);
- }
- };
- GameCFG.dict = {};
- GameCFG.vec = [];
- return GameCFG;
- }());
- exports.default = GameCFG;
- },{}],11:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- //------------------------------------------------------------------------------
- //工具生成,请勿修改。
- //配置文件名称:level.xlsx。
- //------------------------------------------------------------------------------
- var LevelCFG = /** @class */ (function () {
- function LevelCFG() {
- }
- LevelCFG.initCfg = function (str) {
- var i = 0;
- var arr = str.split("\n");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var singleStr = arr[i];
- var singleArr = singleStr.split("&");
- if (LevelCFG.dict[singleArr[0]])
- continue;
- var item = new LevelCFG();
- item.id = Number(singleArr[0]);
- item.road = singleArr[1];
- item.roleinitpos = JSON.parse(singleArr[2]);
- item.npc = JSON.parse(singleArr[3]);
- item.firstScenepos = singleArr[4];
- item.winGold = Number(singleArr[5]);
- item.failGod = singleArr[6];
- LevelCFG.dict[item.id] = item;
- LevelCFG.vec.push(item);
- }
- };
- LevelCFG.dict = {};
- LevelCFG.vec = [];
- return LevelCFG;
- }());
- exports.default = LevelCFG;
- },{}],12:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- //------------------------------------------------------------------------------
- //工具生成,请勿修改。
- //配置文件名称:lottery.xlsx。
- //------------------------------------------------------------------------------
- var LotteryCFG = /** @class */ (function () {
- function LotteryCFG() {
- }
- LotteryCFG.initCfg = function (str) {
- var i = 0;
- var arr = str.split("\n");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var singleStr = arr[i];
- var singleArr = singleStr.split("&");
- if (LotteryCFG.dict[singleArr[0]])
- continue;
- var item = new LotteryCFG();
- item.id = Number(singleArr[0]);
- item.type = Number(singleArr[1]);
- item.value = singleArr[2];
- item.weight = Number(singleArr[3]);
- LotteryCFG.dict[item.id] = item;
- LotteryCFG.vec.push(item);
- }
- };
- LotteryCFG.dict = {};
- LotteryCFG.vec = [];
- return LotteryCFG;
- }());
- exports.default = LotteryCFG;
- },{}],13:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- //------------------------------------------------------------------------------
- //工具生成,请勿修改。
- //配置文件名称:npc.xlsx。
- //------------------------------------------------------------------------------
- var NpcCFG = /** @class */ (function () {
- function NpcCFG() {
- }
- NpcCFG.initCfg = function (str) {
- var i = 0;
- var arr = str.split("\n");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var singleStr = arr[i];
- var singleArr = singleStr.split("&");
- if (NpcCFG.dict[singleArr[0]])
- continue;
- var item = new NpcCFG();
- item.id = Number(singleArr[0]);
- item.name = singleArr[1];
- item.speed = Number(singleArr[2]);
- item.frontjump = JSON.parse(singleArr[3]);
- item.leftjump = JSON.parse(singleArr[4]);
- item.rightjump = JSON.parse(singleArr[5]);
- item.upclimb = Number(singleArr[6]);
- item.slideclimb = JSON.parse(singleArr[7]);
- item.jump_left = Number(singleArr[8]);
- item.jump_right = Number(singleArr[9]);
- item.start_ahead = Number(singleArr[10]);
- item.distance = Number(singleArr[11]);
- item.gravity = Number(singleArr[12]);
- NpcCFG.dict[item.id] = item;
- NpcCFG.vec.push(item);
- }
- };
- NpcCFG.dict = {};
- NpcCFG.vec = [];
- return NpcCFG;
- }());
- exports.default = NpcCFG;
- },{}],14:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- //------------------------------------------------------------------------------
- //工具生成,请勿修改。
- //配置文件名称:role.xlsx。
- //------------------------------------------------------------------------------
- var RoleCFG = /** @class */ (function () {
- function RoleCFG() {
- }
- RoleCFG.initCfg = function (str) {
- var i = 0;
- var arr = str.split("\n");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var singleStr = arr[i];
- var singleArr = singleStr.split("&");
- if (RoleCFG.dict[singleArr[0]])
- continue;
- var item = new RoleCFG();
- item.id = Number(singleArr[0]);
- item.name = singleArr[1];
- item.speed = Number(singleArr[2]);
- item.frontjump = JSON.parse(singleArr[3]);
- item.leftjump = JSON.parse(singleArr[4]);
- item.rightjump = JSON.parse(singleArr[5]);
- item.upclimb = Number(singleArr[6]);
- item.slideclimb = JSON.parse(singleArr[7]);
- item.getState = Number(singleArr[8]);
- item.need = Number(singleArr[9]);
- item.icon = singleArr[10];
- item.gravity = Number(singleArr[11]);
- item.rolename = singleArr[12];
- RoleCFG.dict[item.id] = item;
- RoleCFG.vec.push(item);
- }
- };
- RoleCFG.dict = {};
- RoleCFG.vec = [];
- return RoleCFG;
- }());
- exports.default = RoleCFG;
- },{}],15:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Global_1 = require("../Global");
- /*
- * name;
- */
- var AssetPath = /** @class */ (function () {
- function AssetPath() {
- }
- AssetPath.init = function () {
- AssetPath.versionrandom = "?v=" + Math.random();
- };
- AssetPath.getsound = function (id) {
- return Global_1.Global.getUrl(AssetPath.resources + AssetPath.music + id + ".mp3");
- };
- AssetPath.getResConfig = function () {
- return Global_1.Global.getUrl(AssetPath.resources + "resConfig.json");
- };
- AssetPath.getConfig = function (configname) {
- return Global_1.Global.getUrl(AssetPath.resources + configname + ".bin");
- };
- AssetPath.get3Dscene = function (name) {
- return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".ls");
- };
- AssetPath.get3DModel = function (name) {
- return Global_1.Global.getUrl(AssetPath.res + AssetPath.prop + "Conventional/" + name + ".lh");
- };
- AssetPath.get3DRoleModel = function (name) {
- return Global_1.Global.getUrl(AssetPath.res + "character/Conventional/" + name + ".lh");
- };
- AssetPath.getroleicon = function (id) {
- return Global_1.Global.getUrl(AssetPath.res + "skinicon/" + id + ".png");
- };
- AssetPath.getVerisonurl = function () {
- if (Global_1.Global.isdebug) {
- return Global_1.Global.getUrl(AssetPath.res + "version.json") + AssetPath.versionrandom;
- }
- return Global_1.Global.getUrl(AssetPath.res + "version" + Global_1.Global.resconfigVersion + ".json");
- };
- AssetPath.getGameVersion = function () {
- return Global_1.Global.getUrl("gameversion.json");
- };
- /**获取匹配人物头像icon */
- AssetPath.pipeiicon = function (id) {
- return Global_1.Global.getUrl(AssetPath.res + "icon/" + id + ".png");
- };
- AssetPath.res = "res/";
- AssetPath.resources = "resources/";
- // export var configs:string = "configs/";
- AssetPath.ui = "ui/";
- AssetPath.subpacksgeui = "character/ui/";
- AssetPath.music = "music/";
- AssetPath.versionrandom = "";
- AssetPath.prop = "prop/";
- AssetPath.skinicon = "skinicon/";
- return AssetPath;
- }());
- exports.AssetPath = AssetPath;
- },{"../Global":41}],16:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AssetPath_1 = require("./AssetPath");
- var Global_1 = require("../Global");
- /*
- * name;
- */
- var RecConfigs = /** @class */ (function (_super) {
- __extends(RecConfigs, _super);
- function RecConfigs() {
- var _this = _super.call(this) || this;
- RecConfigs.ins = _this;
- return _this;
- }
- Object.defineProperty(RecConfigs, "Instance", {
- get: function () {
- if (RecConfigs.ins == null) {
- return new RecConfigs();
- }
- return RecConfigs.ins;
- },
- enumerable: true,
- configurable: true
- });
- RecConfigs.prototype.init = function () {
- this.ResDic = {};
- };
- /****************************************************************** */
- RecConfigs.prototype.loadUI = function () {
- Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
- var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "正常模式"));
- changeActionButton.size(160, 40);
- changeActionButton.labelBold = true;
- changeActionButton.labelSize = 30;
- changeActionButton.sizeGrid = "4,4,4,4";
- changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
- changeActionButton.pos(Laya.stage.width / 2 - changeActionButton.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 100 * Laya.Browser.pixelRatio);
- changeActionButton.on(Laya.Event.CLICK, this, function () {
- if (++this.curStateIndex % 2 == 1) {
- this.sprite3D.active = false;
- this.lineSprite3D.active = true;
- changeActionButton.label = "网格模式";
- }
- else {
- this.sprite3D.active = true;
- this.lineSprite3D.active = false;
- changeActionButton.label = "正常模式";
- }
- });
- }));
- };
- /****************************************************************** */
- RecConfigs.prototype.initRec = function (_res) {
- if (_res != null && !RecConfigs.inited) {
- RecConfigs.inited = true;
- var groupsArr = _res.groups;
- var resourcesArr = _res.resources;
- var resourcesDict = {};
- for (var item in resourcesArr) {
- var child = resourcesArr[item];
- switch (child.type) {
- case "bin":
- child.type = Laya.Loader.BUFFER;
- break;
- case "ls":
- child.type = Laya.Scene;
- break;
- case "lh":
- child.type = Laya.Sprite3D;
- break;
- case "lm":
- child.type = Laya.MeshSprite3D;
- break;
- }
- resourcesDict[child.name] = child;
- }
- for (var grouptype in groupsArr) {
- var groupchild = groupsArr[grouptype];
- var arr = groupchild.keys.split(",");
- var childArr = [];
- var chidstr;
- for (chidstr in arr) {
- var strChild = arr[chidstr];
- if (strChild != "") {
- var urls = resourcesDict[strChild].url;
- urls = urls.replace("res/", AssetPath_1.AssetPath.res);
- childArr.push({ url: Global_1.Global.getUrl(urls), type: resourcesDict[strChild].type });
- }
- }
- this.ResDic[groupchild.name] = childArr;
- }
- Laya.loader.clearRes(AssetPath_1.AssetPath.getResConfig());
- }
- };
- /**
- * 是否已经初始化
- */
- RecConfigs.inited = false;
- return RecConfigs;
- }(Laya.EventDispatcher));
- exports.RecConfigs = RecConfigs;
- },{"../Global":41,"./AssetPath":15}],17:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AssetPath = /** @class */ (function () {
- function AssetPath() {
- }
- /*粒子特效地址*/
- AssetPath.FxPrefabsPath = "res/character/FX/Conventional/FX.lh";
- return AssetPath;
- }());
- exports.AssetPath = AssetPath;
- var AssetManager = /** @class */ (function () {
- function AssetManager() {
- }
- /**加载资源*/
- AssetManager.LoadAssetFun = function (fun) {
- var _this = this;
- var respaths = [];
- respaths = respaths.concat(AssetPath.FxPrefabsPath);
- Laya.loader.create(respaths, Laya.Handler.create(this, function () {
- var PlayerPrefabs = Laya.loader.getRes(AssetPath.FxPrefabsPath);
- if (PlayerPrefabs) {
- for (var i = 0; i < PlayerPrefabs.numChildren; i++) {
- var asset = PlayerPrefabs.getChildAt(i);
- asset.active = false;
- _this.AllMapDic.push(asset);
- }
- Laya.loader.clearRes(AssetPath.FxPrefabsPath);
- }
- else {
- console.log("PolicePrefabs为空");
- }
- if (fun) {
- fun();
- }
- else {
- console.log("fun为空");
- }
- }));
- };
- /**所有地图*/
- AssetManager.AllMapDic = new Array();
- return AssetManager;
- }());
- exports.AssetManager = AssetManager;
- },{}],18:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AssetPath_1 = require("../Config/AssetPath");
- /*
- * name;
- */
- var AudioControl = /** @class */ (function (_super) {
- __extends(AudioControl, _super);
- function AudioControl() {
- var _this = _super.call(this) || this;
- _this._isbgOpen = true;
- _this.open = true;
- _this._isAllOpen = true;
- _this._nowBgName = "";
- _this._isPlaybging = false;
- /**
- * 声音开关引用索引
- */
- _this._soundIndex = 0;
- AudioControl.ins = _this;
- return _this;
- }
- Object.defineProperty(AudioControl, "Instance", {
- get: function () {
- if (AudioControl.ins == null) {
- return new AudioControl();
- }
- return AudioControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- AudioControl.prototype.init = function () {
- Laya.SoundManager.autoReleaseSound = false;
- Laya.SoundManager.autoStopMusic = true;
- };
- Object.defineProperty(AudioControl.prototype, "gamesoundOpen", {
- set: function (value) {
- this.open = value;
- Laya.SoundManager.soundMuted = !value;
- if (value == true) {
- fairygui.UIConfig.buttonSoundVolumeScale = 1;
- }
- else {
- fairygui.UIConfig.buttonSoundVolumeScale = 0;
- }
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AudioControl.prototype, "GetSoundSwitch", {
- /**
- * 音效是否开启
- */
- get: function () {
- return this.open;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AudioControl.prototype, "isbgOpen", {
- /**
- * 背景音乐是否开启
- */
- get: function () {
- return this._isbgOpen;
- },
- set: function (value) {
- this._isbgOpen = value;
- Laya.SoundManager.musicMuted = !value;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AudioControl.prototype, "isAllOpen", {
- /**
- * 所有音乐是否开启
- */
- get: function () {
- return this._isAllOpen;
- },
- set: function (value) {
- if (value) {
- this._soundIndex--;
- if (this._soundIndex < 0) {
- this._soundIndex = 0;
- }
- if (!this._isPlaybging && this._soundIndex == 0) {
- this._isAllOpen = true;
- this.setGameVolume(1);
- this.playbgSound(this._nowBgName);
- fairygui.UIConfig.buttonSoundVolumeScale = 1;
- }
- else {
- this._isAllOpen = false;
- }
- }
- else {
- this._isAllOpen = false;
- if (this._soundIndex < 0) {
- this._soundIndex = 0;
- }
- this._soundIndex++;
- if (this._isPlaybging) {
- this.stopbgSound();
- }
- this.setGameVolume(0);
- fairygui.UIConfig.buttonSoundVolumeScale = 0;
- }
- },
- enumerable: true,
- configurable: true
- });
- /**
- * 停止播放音效
- */
- AudioControl.prototype.stopGameSound = function () {
- Laya.SoundManager.stopAllSound();
- };
- /**
- * 停止所有声音
- */
- AudioControl.prototype.ClearAllSOUND = function () {
- this.stopGameSound();
- this.stopbgSound();
- };
- /**
- * 播放背景音乐
- * @param soundName 声音名
- */
- AudioControl.prototype.playbgSound = function (soundName) {
- this._nowBgName = soundName;
- if (this._isAllOpen && this._nowBgName != "" && this._soundIndex <= 0 && !this._isPlaybging) {
- this._isPlaybging = true;
- Laya.SoundManager.playMusic(AssetPath_1.AssetPath.getsound(this._nowBgName));
- this.bgSoundVolume = 0.4;
- }
- };
- /**
- * 停止背景音乐
- */
- AudioControl.prototype.stopbgSound = function () {
- this._isPlaybging = false;
- Laya.SoundManager.stopMusic();
- };
- Object.defineProperty(AudioControl.prototype, "bgSoundVolume", {
- get: function () {
- return Laya.SoundManager.musicVolume;
- },
- /**
- * 设置背景音乐音量
- * @param value 音量范围从 0(静音)至 1(最大音量)。
- */
- set: function (value) {
- Laya.SoundManager.setMusicVolume(value);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AudioControl.prototype, "soundVolume", {
- get: function () {
- return Laya.SoundManager.soundVolume;
- },
- /**
- * 设置背景音乐音量
- * @param value 音量范围从 0(静音)至 1(最大音量)。
- */
- set: function (value) {
- Laya.SoundManager.setSoundVolume(value);
- },
- enumerable: true,
- configurable: true
- });
- /**
- * 设置所有声音音量
- * @param value 音量范围从 0(静音)至 1(最大音量)。
- */
- AudioControl.prototype.setGameVolume = function (value) {
- this.bgSoundVolume = value;
- this.soundVolume = value;
- };
- /**
- * 播放音效
- * @param soundName 音效名
- * @param loop 播放次数
- */
- AudioControl.prototype.playGameSound = function (soundName, loop) {
- if (loop === void 0) { loop = 1; }
- if (this._isAllOpen && soundName != "" && Laya.SoundManager.soundVolume != 0) {
- Laya.SoundManager.playSound(AssetPath_1.AssetPath.getsound(soundName), loop);
- }
- };
- return AudioControl;
- }(Laya.EventDispatcher));
- exports.AudioControl = AudioControl;
- },{"../Config/AssetPath":15}],19:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var ResourceControl_1 = require("./ResourceControl");
- var SkinItem_1 = require("../utils/SkinItem");
- var CpaDownsView_1 = require("../Push/CpaDownsView");
- var CpaItem_1 = require("../Push/CpaItem");
- var BaoKuanGameView_1 = require("../Push/BaoKuanGameView");
- var ShiwantuijianView_1 = require("../Push/ShiwantuijianView");
- /*
- * name;
- */
- var ConnectControl = /** @class */ (function (_super) {
- __extends(ConnectControl, _super);
- function ConnectControl() {
- var _this = _super.call(this) || this;
- /****************************************************** */
- _this.motionCross = false;
- _this.blendType = 0;
- _this.motionIndex = 0;
- _this.motions = ["run", "run_2", "attack", "attack_1", "attack_2", "dead", "idle_2", "idle_3", "idle_4", "idle4", "reload", "replace", "replace_2", "stop"];
- return _this;
- }
- /**
- * 组件绑定
- */
- ConnectControl.ConnectComponent = function () {
- //main
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2pwlk1a", SkinItem_1.SkinItem);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c527", CpaDownsView_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c528", CpaItem_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c529", BaoKuanGameView_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52a", CpaItem_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52b", ShiwantuijianView_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52c", CpaItem_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc21", CpaItem_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2eksc22", CpaItem_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52e", CpaItem_1.default);
- fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2uotu6h", CpaItem_1.default);
- // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2ip616l", GiftView);
- // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2k8c52d", TuijianView);
- // fairygui.UIObjectFactory.setPackageItemExtension("ui://lecxynh2kalr6k",FriendInviteView);
- };
- ConnectControl.prototype.sceneLoaded = function (scene) {
- Laya.stage.addChild(scene);
- var animator = scene.getChildAt(2).getComponent(Laya.Animator);
- this.addButton(100, 100, 160, 30, "动画过渡:否", 20, function (e) {
- this.motionCross = !this.motionCross;
- if (this.motionCross)
- e.target.label = "动画过渡:是";
- else
- e.target.label = "动画过渡:否";
- });
- this.addButton(100, 160, 160, 30, "混合模式:全身", 20, function (e) {
- this.blendType++;
- (this.blendType === 3) && (this.blendType = 0);
- switch (this.blendType) {
- case 0:
- e.target.label = "混合模式:全身";
- break;
- case 1:
- e.target.label = "混合模式:上身";
- break;
- case 2:
- e.target.label = "混合模式:下身";
- break;
- }
- });
- this.addButton(100, 220, 260, 40, "切换动作:attack_2", 28, function (e) {
- switch (this.blendType) {
- case 0:
- if (this.motionCross) {
- animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
- animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
- }
- else {
- animator.play(this.motions[this.motionIndex], 0);
- animator.play(this.motions[this.motionIndex], 1);
- }
- break;
- case 1:
- if (this.motionCross)
- animator.crossFade(this.motions[this.motionIndex], 0.2, 0);
- else
- animator.play(this.motions[this.motionIndex], 0);
- break;
- case 2:
- if (this.motionCross)
- animator.crossFade(this.motions[this.motionIndex], 0.2, 1);
- else
- animator.play(this.motions[this.motionIndex], 1);
- break;
- }
- e.target.label = "切换动作:" + this.motions[this.motionIndex];
- this.motionIndex++;
- (this.motionIndex === this.motions.length) && (this.motionIndex = 0);
- });
- };
- ConnectControl.prototype.addButton = function (x, y, width, height, text, size, clickFun) {
- var thiss = this;
- Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(null, function () {
- var changeActionButton = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", text));
- changeActionButton.size(width, height);
- changeActionButton.labelBold = true;
- changeActionButton.labelSize = size;
- changeActionButton.sizeGrid = "4,4,4,4";
- changeActionButton.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
- changeActionButton.pos(x, y);
- changeActionButton.on(Laya.Event.CLICK, thiss, clickFun);
- }));
- };
- /****************************************************** */
- /**
- * 数据绑定
- */
- ConnectControl.Connnect = function () {
- this.ConnectFairygui();
- this.ConnectComponent();
- };
- /**
- * ui框架的绑定
- */
- ConnectControl.ConnectFairygui = function () {
- fairygui.UIConfig.gameLoaderManager = ResourceControl_1.ResourceControl.Instance;
- //特效绑定( url 绑定组名,只有公共特效需要绑定 ) "ui://fqpgxr1kl6mw0":"effect1"
- fairygui.UIConfig.gameEffectDict = {};
- };
- return ConnectControl;
- }(Laya.EventDispatcher));
- exports.ConnectControl = ConnectControl;
- },{"../Push/BaoKuanGameView":50,"../Push/CpaDownsView":52,"../Push/CpaItem":54,"../Push/ShiwantuijianView":56,"../utils/SkinItem":92,"./ResourceControl":28}],20:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var LocalDataControl_1 = require("./LocalDataControl");
- var TimeUtils_1 = require("../Time/TimeUtils");
- var UserDataInfo_1 = require("../Data/UserDataInfo");
- var TimesTamper_1 = require("../Time/TimesTamper");
- var DateControl = /** @class */ (function () {
- function DateControl() {
- DateControl.ins = this;
- }
- Object.defineProperty(DateControl, "Instance", {
- get: function () {
- if (DateControl.ins == null) {
- return new DateControl();
- }
- return DateControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- /************************************************************** */
- DateControl.prototype.loadUI = function () {
- Laya.loader.load(["res/threeDimen/ui/button.png"], Laya.Handler.create(this, function () {
- var button = Laya.stage.addChild(new Laya.Button("res/threeDimen/ui/button.png", "关闭HDR"));
- button.size(200, 40);
- button.labelBold = true;
- button.labelSize = 30;
- button.sizeGrid = "4,4,4,4";
- button.scale(Laya.Browser.pixelRatio, Laya.Browser.pixelRatio);
- button.pos(Laya.stage.width / 2 - button.width * Laya.Browser.pixelRatio / 2, Laya.stage.height - 60 * Laya.Browser.pixelRatio);
- button.on(Laya.Event.CLICK, this, function () {
- var enableHDR = this.camera.enableHDR;
- if (enableHDR)
- button.label = "开启HDR";
- else
- button.label = "关闭HDR";
- this.camera.enableHDR = !enableHDR;
- });
- }));
- };
- /************************************************ */
- DateControl.prototype.SetSelf = function () {
- var lastday = LocalDataControl_1.LocalDataControl.Instance.getstr(UserDataInfo_1.UserDataInfo.lastDay);
- var nowday = TimeUtils_1.TimeUtils.formatYearMonthDate1(TimesTamper_1.TimesTamper.Instance.serverTime);
- if (lastday != nowday) {
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lastDay, nowday);
- DateControl.Fresh = true;
- }
- else {
- DateControl.Fresh = false;
- }
- };
- return DateControl;
- }());
- exports.DateControl = DateControl;
- },{"../Data/UserDataInfo":35,"../Time/TimeUtils":58,"../Time/TimesTamper":60,"./LocalDataControl":23}],21:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var JoystickModule_1 = require("../JoystickModule");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- var SceneControl_1 = require("../Control/SceneControl");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var TimerService_1 = require("../Time/TimerService");
- var GameCFG_1 = require("../CFG/GameCFG");
- var AudioControl_1 = require("../Control/AudioControl");
- var Sdk_1 = require("../WXSDK/Sdk");
- var PanelResDic_1 = require("../PrefabControl/PanelResDic");
- var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
- var AgencyTrial_1 = require("../Agency/AgencyTrial");
- var AgencySkin_1 = require("../Agency/AgencySkin");
- var RecordManager_1 = require("../WXSDK/RecordManager");
- var GameStateControl = /** @class */ (function () {
- function GameStateControl() {
- /**
- * 0:未开始,1:游戏中,2:暂停中
- */
- this.nowGameState = 0;
- this._zhuanxiangbeishu = 0;
- this._huadongSpeedX = 0;
- this._huadongClimbSpeedX = 0;
- this.endGamePlayerArr = [];
- this._isneedShunyiX = false;
- this._nowTime = 0;
- this._lastAngle = 0;
- this._time = 0;
- this.nowMingCi = 0;
- this._nums = 0;
- this._all = 0;
- GameStateControl.ins = this;
- }
- Object.defineProperty(GameStateControl, "Instance", {
- get: function () {
- if (GameStateControl.ins == null) {
- return new GameStateControl();
- }
- return GameStateControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- GameStateControl.prototype.init = function () {
- this._huadongSpeedX = Number(GameCFG_1.default.dict[4].value);
- this._huadongClimbSpeedX = Number(GameCFG_1.default.dict[5].value);
- if (GameCFG_1.default.dict[7]) {
- this._zhuanxiangbeishu = Number(GameCFG_1.default.dict[7].value);
- }
- else {
- this._zhuanxiangbeishu = 2;
- }
- this.initEvent();
- };
- GameStateControl.prototype.initEvent = function () {
- DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.lose, this, this.endGame);
- DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.end, this, this.endGame);
- DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.npcend, this, this.npcendGameHandler);
- };
- GameStateControl.prototype.npcendGameHandler = function (str) {
- this.endGamePlayerArr.push(str);
- };
- GameStateControl.prototype.setClickPanel = function (panel) {
- this._joystickModule = new JoystickModule_1.JoystickModule(panel);
- this._joystickModule.setEventCallback(this, this.ondownfun, this.onmovefun, this.onupfun);
- };
- GameStateControl.prototype.ondownfun = function () {
- this._lastAngle = 0;
- this._nowTime = Laya.Browser.now() / 1000;
- };
- GameStateControl.prototype.onmovefun = function (offsetX) {
- if (this.nowGameState == 1) {
- var disAngle = this._joystickModule.angle - this._lastAngle;
- this._lastAngle = this._joystickModule.angle;
- if (PropManager_1.PropManager.iscarmanpc) {
- PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, disAngle * this._zhuanxiangbeishu);
- }
- else {
- SceneControl_1.SceneControl.Instance.PlayerScript.Joy(offsetX > 0 ? this._huadongSpeedX : -this._huadongSpeedX, offsetX > 0 ? this._huadongClimbSpeedX : -this._huadongClimbSpeedX, disAngle * this._zhuanxiangbeishu);
- }
- }
- };
- GameStateControl.prototype.onupfun = function () {
- if (PropManager_1.PropManager.iscarmanpc) {
- PropManager_1.PropManager.npcscriptDict["npc_0"].Joy(0, 0);
- }
- else {
- if (this.nowGameState == 1) {
- SceneControl_1.SceneControl.Instance.PlayerScript.Joy(0, 0, 0);
- }
- }
- };
- GameStateControl.prototype.update = function (dt) {
- if (this.nowGameState == 1) {
- this._time = 0;
- var npcdict = PropManager_1.PropManager.npcscriptDict;
- this._nums = 0;
- this._all = 0;
- var s;
- var npcsp;
- for (s in npcdict) {
- npcsp = npcdict[s];
- if (npcsp.getAction() == 1) {
- if (PropManager_1.PropManager.mainRole.transform.position.z < npcsp.getPostion().z) {
- this._nums++;
- }
- this._all++;
- }
- }
- this.nowMingCi = this.endGamePlayerArr.length + ((this._all + 1) - this._nums);
- PropManager_1.PropManager.txt_mingci.text = "第" + this.nowMingCi + "名";
- }
- };
- GameStateControl.prototype.startGame = function () {
- var RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
- var agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
- var nohasskinArr = agencyskin.GainNoHaveSkin();
- if (nohasskinArr.length == 0) {
- this.entergame();
- }
- else {
- PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyTrial_1.AgencyTrial).openview(nohasskinArr);
- }
- };
- GameStateControl.prototype.entergame = function (jiasu) {
- RecordManager_1.RecordManager.Instance.RecordStart();
- this.nowMingCi = 0;
- this.endGamePlayerArr.length = 0;
- this.nowGameState = 1;
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- this.update(500);
- if (jiasu) {
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start, jiasu);
- }
- else {
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.start);
- }
- AudioControl_1.AudioControl.Instance.playbgSound("bgm");
- Sdk_1.WxApi.recordAldEvent("主界面点击开始游戏...");
- };
- GameStateControl.prototype.stopGame = function () {
- this.nowGameState = 2;
- this.onupfun();
- };
- GameStateControl.prototype.endGame = function () {
- if (PropManager_1.PropManager.jiantouArr && PropManager_1.PropManager.jiantouArr.length > 0) {
- var arr = PropManager_1.PropManager.jiantouArr;
- for (var i = arr.length - 1; i >= 0; i--) {
- arr[i].destroy();
- arr.splice(i, 1);
- }
- }
- PropManager_1.PropManager.jiantouArr.length = 0;
- this.nowGameState = 0;
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- var npcdict = PropManager_1.PropManager.npcscriptDict;
- if (npcdict) {
- for (var s in npcdict) {
- npcdict[s].stop();
- }
- }
- this.onupfun();
- AudioControl_1.AudioControl.Instance.stopbgSound();
- };
- return GameStateControl;
- }());
- exports.GameStateControl = GameStateControl;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Global_1 = require("../Global");
- var LayOUT_1 = require("../utils/LayOUT");
- /*
- * name;
- */
- var LayoutControl = /** @class */ (function (_super) {
- __extends(LayoutControl, _super);
- function LayoutControl() {
- var _this = _super.call(this) || this;
- _this._uilayerZorder = 0;
- _this._upuilayerZorder = 200;
- _this._tipslayerZorder = 1000;
- _this._guidelayerZorder = 600;
- /**
- * ui层
- */
- _this.uiLayer = new fairygui.GComponent();
- /**
- * 最定层
- */
- _this.topLayer = new fairygui.GComponent();
- /**
- * 背景层( 或者3D场景层 )
- */
- _this.background = new fairygui.GComponent();
- _this._position = new Laya.Vector3();
- _this._outPos = new Laya.Vector3();
- _this.scaleDelta = 0;
- LayoutControl.ins = _this;
- return _this;
- }
- Object.defineProperty(LayoutControl, "Instance", {
- get: function () {
- if (LayoutControl.ins == null) {
- return new LayoutControl();
- }
- return LayoutControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- LayoutControl.prototype.AddLayerByName = function (itemview, layer) {
- if (layer == LayOUT_1.LayOUT.BG) {
- LayoutControl.Instance.background.addChild(itemview);
- }
- else if (layer == LayOUT_1.LayOUT.UI) {
- this._uilayerZorder++;
- LayoutControl.Instance.uiLayer.addChild(itemview);
- itemview.sortingOrder = this._uilayerZorder;
- }
- else if (layer == LayOUT_1.LayOUT.UITop) {
- this._upuilayerZorder++;
- LayoutControl.Instance.uiLayer.addChild(itemview);
- itemview.sortingOrder = this._upuilayerZorder;
- }
- else if (layer == LayOUT_1.LayOUT.TIP) {
- // GameLayerManager.Instance.tipsLayer.addChild(itemview);
- this._tipslayerZorder++;
- LayoutControl.Instance.uiLayer.addChild(itemview);
- itemview.sortingOrder = this._tipslayerZorder;
- }
- else if (layer == LayOUT_1.LayOUT.GUIDE) {
- this._guidelayerZorder++;
- LayoutControl.Instance.uiLayer.addChild(itemview);
- itemview.sortingOrder = this._guidelayerZorder;
- }
- };
- //初始化层级
- LayoutControl.prototype.initlayer = function () {
- Global_1.Global.stage.addChild(fairygui.GRoot.inst.displayObject);
- fairygui.GRoot.inst.addChild(this.background);
- fairygui.GRoot.inst.addChild(this.uiLayer);
- fairygui.GRoot.inst.addChild(this.topLayer);
- };
- LayoutControl.prototype.addHorizontalBox = function (x, y, z) {
- var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh2));
- box.meshRenderer.material = this.mat1;
- box.meshRenderer.castShadow = true;
- box.meshRenderer.receiveShadow = true;
- this.tmpVector.setValue(x, y, z);
- box.transform.position = this.tmpVector;
- var rigidBody = box.addComponent(Laya.Rigidbody3D);
- rigidBody.mass = 10;
- rigidBody.friction = 1.0;
- rigidBody.restitution = 0.2;
- var boxShape = new Laya.BoxColliderShape(2, 0.33, 0.5);
- rigidBody.colliderShape = boxShape;
- };
- /************************************************ */
- LayoutControl.prototype.ClearLayerByName = function (layer) {
- switch (layer) {
- case LayOUT_1.LayOUT.UI:
- this._uilayerZorder--;
- if (this._uilayerZorder < 0) {
- this._uilayerZorder = 0;
- }
- break;
- case LayOUT_1.LayOUT.UITop:
- this._upuilayerZorder--;
- if (this._upuilayerZorder < 200) {
- this._upuilayerZorder = 200;
- }
- break;
- case LayOUT_1.LayOUT.TIP:
- this._tipslayerZorder--;
- if (this._tipslayerZorder < 1000) {
- this._tipslayerZorder = 1000;
- }
- break;
- case LayOUT_1.LayOUT.GUIDE:
- this._tipslayerZorder--;
- if (this._tipslayerZorder < 600) {
- this._tipslayerZorder = 600;
- }
- break;
- }
- };
- LayoutControl.prototype.onComplete = function () {
- //加载三维地面
- var grid = this.scene.addChild(Laya.Loader.getRes("res/threeDimen/staticModel/grid/plane.lh"));
- //加载二维猴子
- this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
- //开启定时器循环
- Laya.timer.frameLoop(1, this, this.animate);
- };
- LayoutControl.prototype.animate = function () {
- //变换位置
- this._position.x = Math.sin(this.scaleDelta += 0.01);
- //计算位置
- this.camera.viewport.project(this._position, this.camera.projectionViewMatrix, this._outPos);
- this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
- };
- return LayoutControl;
- }(Laya.EventDispatcher));
- exports.LayoutControl = LayoutControl;
- },{"../Global":41,"../utils/LayOUT":90}],23:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Global_1 = require("../Global");
- var PlatfromType_1 = require("../WXSDK/PlatfromType");
- /*
- * 本地数据缓存管理器
- */
- var LocalDataControl = /** @class */ (function (_super) {
- __extends(LocalDataControl, _super);
- function LocalDataControl() {
- var _this = _super.call(this) || this;
- LocalDataControl.ins = _this;
- return _this;
- }
- Object.defineProperty(LocalDataControl, "Instance", {
- get: function () {
- if (LocalDataControl.ins == null) {
- return new LocalDataControl();
- }
- return LocalDataControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- LocalDataControl.prototype.init = function () {
- };
- /**
- * 添加本地缓存数据 object
- * @param key
- * @param value
- */
- LocalDataControl.prototype.AddData = function (key, value) {
- this.AddLocalData(key, value);
- };
- /**
- * 获取本地缓存数据 object
- * @param key
- */
- LocalDataControl.prototype.getObj = function (key) {
- return this.GetLocalCaCheData(key);
- };
- /**
- * 添加本地缓存数据 string
- * @param key
- * @param value
- */
- LocalDataControl.prototype.addstr = function (key, value) {
- this.addCacheStr(key, value);
- };
- LocalDataControl.prototype.addnum = function (key, value) {
- this.addCacheStr(key, value.toString());
- };
- /**
- * 获取本地缓存数据 string
- * @param key
- */
- LocalDataControl.prototype.getstr = function (key) {
- return this.getCachestr(key);
- };
- /**
- * 获取本地缓存数据 number
- * @param key
- */
- LocalDataControl.prototype.getnum = function (key) {
- return Number(this.getCachestr(key));
- };
- /**
- * 清理指定本地缓存数据
- * @param key
- */
- LocalDataControl.prototype.removeCache = function (key) {
- this.removeselectCache(key);
- };
- /**
- * 清理所有本地缓存数据
- */
- LocalDataControl.prototype.clearAll = function () {
- this.clearAllCache();
- };
- LocalDataControl.prototype.AddLocalData = function (key, value) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- this.setStorageSyncWX(key, value);
- break;
- default:
- Laya.LocalStorage.setJSON(key, value);
- break;
- }
- };
- LocalDataControl.prototype.GetLocalCaCheData = function (key) {
- var obj;
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- obj = this.getStorageSyncWX(key);
- break;
- default:
- obj = Laya.LocalStorage.getJSON(key);
- break;
- }
- if (!obj) {
- obj = {};
- }
- return obj;
- };
- LocalDataControl.prototype.addCacheStr = function (key, value) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- this.setStorageSyncWX(key, value);
- break;
- default:
- Laya.LocalStorage.setItem(key, value);
- break;
- }
- };
- LocalDataControl.prototype.getCachestr = function (key) {
- var str = "0";
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- str = this.getStorageSyncWX(key);
- break;
- default:
- str = Laya.LocalStorage.getItem(key);
- break;
- }
- if (str == null || str == "") {
- str = "0";
- }
- return str;
- };
- LocalDataControl.prototype.removeselectCache = function (key) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- this.removeStorageWX(key);
- break;
- default:
- Laya.LocalStorage.removeItem(key);
- break;
- }
- };
- LocalDataControl.prototype.clearAllCache = function () {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- this.clearStorageWX();
- break;
- default:
- Laya.LocalStorage.clear();
- break;
- }
- };
- /**
- * 本地存储
- * @param key
- * @param data
- */
- LocalDataControl.prototype.setStorageSyncWX = function (key, data) {
- var wx = Laya.Browser.window.wx;
- if (wx) {
- wx.setStorageSync(key, data);
- }
- };
- /**
- * 获取本地存储
- * @param key
- */
- LocalDataControl.prototype.getStorageSyncWX = function (key) {
- var wx = Laya.Browser.window.wx;
- if (wx) {
- return wx.getStorageSync(key);
- }
- return null;
- };
- /**
- * 从本地缓存中移除指定 key
- * @param key
- */
- LocalDataControl.prototype.removeStorageWX = function (key) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.removeStorage(key);
- }
- };
- /**
- * 清理存储数据
- */
- LocalDataControl.prototype.clearStorageWX = function () {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.clearStorageSync();
- }
- };
- return LocalDataControl;
- }(Laya.EventDispatcher));
- exports.LocalDataControl = LocalDataControl;
- },{"../Global":41,"../WXSDK/PlatfromType":74}],24:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var ResDataControl_1 = require("../Control/ResDataControl");
- var ResourceControl_1 = require("../Control/ResourceControl");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var PanelResDic_1 = require("../PrefabControl/PanelResDic");
- var ViewAction_1 = require("../utils/ViewAction");
- var ViewManager_1 = require("../View/ViewManager");
- var ComponentEventData_1 = require("../Data/ComponentEventData");
- var GamePool_1 = require("../PrefabControl/GamePool");
- /*
- * name;
- */
- var PanelBaseControl = /** @class */ (function (_super) {
- __extends(PanelBaseControl, _super);
- /**
- * 界面初始化
- * @param pkgName 包名
- * @param resName 界面名
- * @param isAddpackage 是否添加包
- * @param ActionType 界面打开动画类型
- * @param clickBgIsColse 黑色背景 0:无背景 1:背景无关闭事件 2:背景有关闭事件
- * @param iscache 是否添加到缓存池(如是为true,则加入进缓存池定时根据是否引用清理。 若是为false,则不清理当前缓存,如若清理,请手动清理 )
- */
- function PanelBaseControl(pkgName, resName, isAddpackage, ActionType, clickBgIsColse, iscache) {
- if (pkgName === void 0) { pkgName = ""; }
- if (resName === void 0) { resName = ""; }
- if (isAddpackage === void 0) { isAddpackage = false; }
- if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
- if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
- if (iscache === void 0) { iscache = true; }
- var _this = _super.call(this) || this;
- _this.isguideing = false;
- _this.PackageName = "";
- _this.ResourcesName = "";
- _this._iscache = true;
- _this._ActionType = ViewAction_1.ViewAction.ActionType_none;
- _this._clickBgIsColse = 0;
- /**
- * 事件容器
- */
- _this.EventResDic = {};
- /**
- * 全局事件容器
- */
- _this.EventGlobal = {};
- _this._iscache = iscache;
- _this.PackageName = pkgName;
- _this.ResourcesName = resName;
- _this._isAddpackage = isAddpackage;
- _this._ActionType = ActionType;
- _this._clickBgIsColse = clickBgIsColse;
- _this.showModalWait();
- return _this;
- }
- PanelBaseControl.prototype.ResolveUI = function (pkgname, resname, isaddpackage, ActionType, clickBgIsColse, iscache) {
- if (ActionType === void 0) { ActionType = ViewAction_1.ViewAction.ActionType_none; }
- if (clickBgIsColse === void 0) { clickBgIsColse = 0; }
- if (iscache === void 0) { iscache = true; }
- this.PackageName = pkgname;
- this.ResourcesName = resname;
- this._ActionType = ActionType;
- this._clickBgIsColse = clickBgIsColse;
- ResDataControl_1.ResDataControl.Instance.AddViewPackByName(pkgname, isaddpackage, iscache);
- this.contentPane = fairygui.UIPackage.createObject(pkgname, resname).asCom;
- for (var str in this.contentPane._children) {
- var item = this.contentPane._children[str];
- if (item.name == "item_panel") {
- var itempanel = item;
- if (itempanel) {
- for (var str1 in itempanel._children) {
- var itempanelItem = itempanel._children[str1];
- this[itempanelItem.name] = itempanelItem;
- }
- }
- // this[item.name] = item;
- this.item_panel = item;
- }
- else {
- this[item.name] = item;
- }
- }
- this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
- this.contentPane.setPivot(0.5, 0.5);
- this.setPivot(0.5, 0.5);
- this.setclickBgIsColse();
- this.initView();
- this.initEvent();
- this.ShowViewACTION();
- };
- /**
- * 加载ui
- * @param groupName 组名
- * @param target 作用域
- * @param onLoadedHandler 加载完成回调函数
- */
- PanelBaseControl.prototype.LoadViewUI = function (groupName, target, onLoadedHandler) {
- this._loadTarget = target;
- this._onLoadedHandler = onLoadedHandler;
- ResourceControl_1.ResourceControl.Instance.loadGroup(groupName, this, this.LoadComplete);
- };
- /******************************************************************* */
- PanelBaseControl.prototype.createLabel = function (color, strokeColor) {
- var STROKE_WIDTH = 4;
- var label = new Laya.Label();
- label.font = "Microsoft YaHei";
- label.text = "SAMPLE DEMO";
- label.fontSize = 30;
- label.color = color;
- if (strokeColor) {
- label.stroke = STROKE_WIDTH;
- label.strokeColor = strokeColor;
- }
- Laya.stage.addChild(label);
- return label;
- };
- /****************************************************************** */
- /**
- * 加载资源数组
- * @param urls 资源数组
- * @param target 作用域
- * @param onLoadedHandler 加载完成回调函数
- */
- PanelBaseControl.prototype.loadUibyArr = function (urls, target, onLoadedHandler) {
- // this.showModalWait();
- this._loadTarget = target;
- this._onLoadedHandler = onLoadedHandler;
- ResourceControl_1.ResourceControl.Instance.Loaders(urls, this, this.LoadComplete);
- };
- /********************************************************************* */
- PanelBaseControl.prototype.createRadioGroup = function (skin) {
- var rg = new Laya.RadioGroup();
- rg.skin = skin;
- rg.space = 70;
- rg.direction = "v";
- rg.labels = "Item1, Item2, Item3";
- rg.labelColors = "#787878,#d3d3d3,#FFFFFF";
- rg.labelSize = 20;
- rg.labelBold = true;
- rg.labelPadding = "5,0,0,5";
- rg.selectHandler = new Laya.Handler(this, this.onSelectChange);
- Laya.stage.addChild(rg);
- return rg;
- };
- PanelBaseControl.prototype.onSelectChange = function (index) {
- console.log("你选择了第 " + (index + 1) + " 项");
- };
- /********************************************************************* */
- PanelBaseControl.prototype.LoadComplete = function () {
- if (this._loadTarget && this._onLoadedHandler) {
- this._onLoadedHandler.call(this._loadTarget);
- }
- };
- PanelBaseControl.prototype.removeEffectPackage = function (packageName) {
- ResDataControl_1.ResDataControl.Instance.ClearPackByName(packageName, true);
- };
- PanelBaseControl.prototype.getpanelController = function (name) {
- if (this.item_panel) {
- return this.item_panel.getController(name);
- }
- return null;
- };
- /************************************************************ */
- PanelBaseControl.prototype.setup = function () {
- this.createLabel("#FFFFFF", null).pos(30, 50);
- this.createLabel("#00FFFF", null).pos(290, 50);
- this.createLabel("#FFFF00", "#FFFFFF").pos(30, 100);
- this.createLabel("#000000", "#FFFFFF").pos(290, 100);
- this.createLabel("#FFFFFF", "#00FFFF").pos(30, 150);
- this.createLabel("#0080FF", "#00FFFF").pos(290, 150);
- };
- /************************************************************ */
- PanelBaseControl.prototype.getpanelTransition = function (name) {
- if (this.item_panel) {
- return this.item_panel.getTransition(name);
- }
- return null;
- };
- PanelBaseControl.prototype.getChildformContentPanel = function (name) {
- if (this.contentPane) {
- return this.contentPane.getChild(name);
- }
- return null;
- };
- /*界面初始化*/
- PanelBaseControl.prototype.onInit = function () {
- _super.prototype.onInit.call(this);
- if (this.PackageName != "" && this.ResourcesName != "") {
- this.ResolveUI(this.PackageName, this.ResourcesName, this._isAddpackage, this._ActionType, this._clickBgIsColse, this._iscache);
- }
- };
- //解析ui
- PanelBaseControl.prototype.initView = function () {
- };
- PanelBaseControl.prototype.initEvent = function () {
- };
- PanelBaseControl.prototype.ShowViewACTION = function () {
- switch (this._ActionType) {
- case ViewAction_1.ViewAction.ActionType_none:
- this.windowanmoend();
- break;
- case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
- this.contentPane.x = fairygui.GRoot.inst.width;
- Laya.Tween.to(this.contentPane, { x: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
- break;
- case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
- this.contentPane.y = fairygui.GRoot.inst.height;
- Laya.Tween.to(this.contentPane, { y: 0 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
- break;
- case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
- this.contentPane.scaleX = this.contentPane.scaleY = 0.01;
- Laya.Tween.to(this.contentPane, { scaleX: 1, scaleY: 1 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.windowanmoend));
- break;
- }
- };
- /******************************************************** */
- PanelBaseControl.prototype.createCheckBox = function (skin) {
- var cb = new Laya.CheckBox(skin);
- Laya.stage.addChild(cb);
- cb.labelColors = "white";
- cb.labelSize = 20;
- cb.labelFont = "Microsoft YaHei";
- cb.labelPadding = "3,0,0,5";
- return cb;
- };
- PanelBaseControl.prototype.updateLabel = function (checkBox) {
- checkBox.label = checkBox.selected ? "已选中" : "未选中";
- };
- /******************************************************** */
- PanelBaseControl.prototype.windowanmoend = function () {
- Laya.timer.callLater(this, this.onShowView);
- };
- PanelBaseControl.prototype.onShowView = function () {
- this.closeModalWait();
- this.showClickBg();
- };
- PanelBaseControl.prototype.showClickBg = function () {
- if (this._clickBg) {
- this._clickBg.alpha = 0.55;
- if (this._clickBgIsColse == 2 && !this.hasClickListener()) {
- this._clickBg.onClick(this, this.ClickExitView);
- }
- }
- };
- /**点击关闭页面按钮 */
- PanelBaseControl.prototype.ClickExitView = function () {
- ViewManager_1.ViewManager.Instance.close(this.viewKey, true);
- };
- /*获取管理数据模块*/
- PanelBaseControl.prototype.getProxy = function (d) {
- return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
- };
- /**
- * 界面关闭事件
- */
- PanelBaseControl.prototype.ExitView = function (ActionType) {
- if (ActionType === void 0) { ActionType = ""; }
- if (this._clickBg) {
- this._clickBg.visible = false;
- }
- if (ActionType == "") {
- switch (this._ActionType) {
- case ViewAction_1.ViewAction.ActionType_none:
- this.destory();
- break;
- case ViewAction_1.ViewAction.ActionType_addmoveToMiddle:
- Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
- break;
- case ViewAction_1.ViewAction.ActionType_addmoveFromBottom:
- Laya.Tween.to(this, { y: fairygui.GRoot.inst.height }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
- break;
- case ViewAction_1.ViewAction.ActionType_addscaleMinToMax:
- Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
- break;
- }
- }
- else {
- switch (ActionType) {
- case ViewAction_1.ViewAction.ActionType_none:
- this.destory();
- break;
- case ViewAction_1.ViewAction.ActionType_removescaleMaxToMin:
- Laya.Tween.to(this, { scaleX: 0.01, scaleY: 0.01 }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
- break;
- case ViewAction_1.ViewAction.ActionType_removemoveToRight:
- Laya.Tween.to(this, { x: fairygui.GRoot.inst.width }, 300, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.destory));
- break;
- }
- }
- };
- PanelBaseControl.prototype.getTransitionByName = function (id) {
- return this.contentPane.getTransition(id);
- };
- /**注册事件 */
- PanelBaseControl.prototype.dispacheDatatrigger = function (type, data) {
- if (data === void 0) { data = null; }
- DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
- };
- /**
- * 注册全局事件
- * @param type
- * @param thisObject
- * @param listener
- */
- PanelBaseControl.prototype.addDataEvent = function (type, thisObject, listener) {
- if (!this.EventGlobal.hasOwnProperty(type)) {
- var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
- this.EventGlobal[type] = vo;
- vo.type = type;
- vo.thisObject = thisObject;
- vo.listener = listener;
- DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
- }
- };
- /**
- * 移除全局事件
- * @param type
- * @param thisObject
- * @param listener
- */
- PanelBaseControl.prototype.ClearEventData = function (type, thisObject, listener) {
- if (this.EventGlobal[type]) {
- var vo = this.EventGlobal[type];
- DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
- vo.clear();
- delete this.EventGlobal[type];
- }
- };
- /**
- * 移除组件事件
- * @param type 时间类型
- * @param callbackobj 作用域
- * @param callbackHandler 事件回调
- */
- PanelBaseControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
- if (target && this.EventResDic[target.name]) {
- var arr = this.EventResDic[target.name];
- var i = 0;
- var nums = arr.length;
- var vo;
- for (i; i < nums; i++) {
- vo = arr[i];
- if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
- target.off(type, thisObject, listener);
- vo.clear();
- arr.splice(i, 1);
- break;
- }
- }
- }
- };
- /**
- * 注册组件事件,调用此方法,界面关闭会自动移除
- * @param type 时间类型
- * @param callbackobj 作用域
- * @param callbackHandler 事件回调
- */
- PanelBaseControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
- if (args === void 0) { args = null; }
- if (target) {
- if (target.name == null || target.name == "") {
- throw "baseview addListener target.name is null";
- }
- var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
- vo.target = target;
- vo.type = type;
- vo.thisObject = thisObject;
- vo.listener = listener;
- if (!this.EventResDic.hasOwnProperty(target.name)) {
- this.EventResDic[target.name] = [];
- }
- var bo = this.JudgeIsHaveEvent(target, type);
- if (!bo) {
- target.on(type, thisObject, listener, args);
- this.EventResDic[target.name].push(vo);
- }
- }
- };
- /**判断是否含有事件 */
- PanelBaseControl.prototype.JudgeIsHaveEvent = function (target, type) {
- var eventArr;
- eventArr = this.EventResDic[target.name];
- var childvo;
- for (var s in eventArr) {
- childvo = eventArr[s];
- if (childvo && childvo.type == type) {
- return true;
- }
- }
- return false;
- };
- PanelBaseControl.prototype.getComById = function (id) {
- return this.contentPane.getChild(id).asCom;
- };
- PanelBaseControl.prototype.getControllerByBame = function (id) {
- return this.contentPane.getController(id);
- };
- /**
- * 移除所有组件事件
- */
- PanelBaseControl.prototype.ClearEvent = function () {
- if (this.EventResDic) {
- var s;
- var dict = this.EventResDic;
- var arr;
- var i;
- var nums = 0;
- var vo;
- for (s in dict) {
- arr = dict[s];
- if (arr && arr.length > 0) {
- i = 0;
- nums = arr.length;
- for (i = nums - 1; i >= 0; i--) {
- vo = arr[i];
- if (vo) {
- if (vo.target) {
- vo.target.off(vo.type, vo.thisObject, vo.listener);
- }
- vo.clear();
- }
- arr.splice(i, 1);
- }
- }
- delete this.EventResDic[s];
- }
- }
- this.EventResDic = {};
- };
- PanelBaseControl.prototype.clearEvent = function () {
- };
- /* 销毁*/
- PanelBaseControl.prototype.destory = function () {
- this.clearEvent();
- this.closeModalWait();
- this.ClearGlobalEvent();
- this.ClearEvent();
- this._loadTarget = null;
- this._onLoadedHandler = null;
- Laya.Tween.clearTween(this);
- ResDataControl_1.ResDataControl.Instance.ClearPackByName(this.PackageName, false);
- this.PackageName = null;
- this.ResourcesName = null;
- if (this._clickBg) {
- this._clickBg.offClick(this, this.ClickExitView);
- this._clickBg.dispose();
- this._clickBg = null;
- }
- this.viewKey = null;
- this.dispose();
- };
- PanelBaseControl.prototype.setclickBgIsColse = function () {
- if (this.isShowing && this._clickBgIsColse > 0 && this.contentPane) {
- if (!this._clickBg && PanelBaseControl.viewbgUrl != "") {
- this._clickBg = new fairygui.GLoader();
- this._clickBg.touchable = true;
- this._clickBg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
- this._clickBg.url = PanelBaseControl.viewbgUrl;
- this._clickBg.fill = fairygui.LoaderFillType.ScaleFree;
- this._clickBg.alpha = 0;
- this.contentPane.addChildAt(this._clickBg, 0);
- }
- }
- };
- /**
- * 移除所有全局事件
- */
- PanelBaseControl.prototype.ClearGlobalEvent = function () {
- if (this.EventGlobal) {
- var s;
- var dict = this.EventGlobal;
- for (s in dict) {
- var vo = dict[s];
- if (vo) {
- this.ClearEventData(vo.type, vo.thisObject, vo.listener);
- }
- }
- }
- this.EventGlobal = {};
- };
- PanelBaseControl.viewbgUrl = "";
- return PanelBaseControl;
- }(fairygui.Window));
- exports.PanelBaseControl = PanelBaseControl;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var PanelResDic_1 = require("../PrefabControl/PanelResDic");
- var ComponentEventData_1 = require("../Data/ComponentEventData");
- var GamePool_1 = require("../PrefabControl/GamePool");
- var PanelChildControl = /** @class */ (function (_super) {
- __extends(PanelChildControl, _super);
- function PanelChildControl() {
- var _this = _super.call(this) || this;
- /**
- * 事件容器
- */
- _this.EventResDic = {};
- /**
- * 全局事件容器
- */
- _this.EventGlobal = {};
- /******************************************** */
- _this.DIALOG_WIDTH = 220;
- _this.DIALOG_HEIGHT = 275;
- _this.CLOSE_BTN_WIDTH = 43;
- _this.CLOSE_BTN_PADDING = 5;
- return _this;
- }
- /**
- * 移除所有组件事件
- */
- PanelChildControl.prototype.ClearEvent = function () {
- if (this.EventResDic) {
- var s;
- var dict = this.EventResDic;
- var arr;
- var i;
- var nums = 0;
- var vo;
- for (s in dict) {
- arr = dict[s];
- if (arr && arr.length > 0) {
- i = 0;
- nums = arr.length;
- for (i = nums - 1; i >= 0; i--) {
- vo = arr[i];
- if (vo) {
- if (vo.target) {
- vo.target.off(vo.type, vo.thisObject, vo.listener);
- }
- vo.clear();
- }
- arr.splice(i, 1);
- }
- }
- delete this.EventResDic[s];
- }
- }
- this.EventResDic = {};
- };
- PanelChildControl.prototype.dispose = function () {
- this.ClearGlobalEvent();
- this.ClearEvent();
- _super.prototype.dispose.call(this);
- };
- PanelChildControl.prototype.constructFromXML = function (xml) {
- _super.prototype.constructFromXML.call(this, xml);
- for (var str in this._children) {
- var item = this._children[str];
- this[item.name] = item;
- }
- this.onInit();
- };
- PanelChildControl.prototype.onInit = function () {
- };
- /*获取管理数据模块*/
- PanelChildControl.prototype.getProxy = function (d) {
- return PanelResDic_1.PanelResDic.Instance.getSingleTon(d);
- };
- PanelChildControl.prototype.dispacheDatatrigger = function (type, data) {
- if (data === void 0) { data = null; }
- DispatcherManager_1.DispatcherManager.dispatchEvent(type, data);
- };
- PanelChildControl.prototype.hasDataEvent = function (type) {
- return DispatcherManager_1.DispatcherManager.hasEventListener(type);
- };
- /**
- * 注册全局事件
- * @param type
- * @param thisObject
- * @param listener
- */
- PanelChildControl.prototype.AddEventData = function (type, thisObject, listener) {
- if (!this.EventGlobal.hasOwnProperty(type)) {
- var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
- this.EventGlobal[type] = vo;
- vo.type = type;
- vo.thisObject = thisObject;
- vo.listener = listener;
- DispatcherManager_1.DispatcherManager.addEventListener(type, thisObject, listener);
- }
- };
- PanelChildControl.prototype.onSkinLoadComplete = function () {
- var dialog = new Laya.Dialog();
- var bg = new Laya.Image(this.assets[0]);
- dialog.addChild(bg);
- var button = new Laya.Button(this.assets[1]);
- // button.name = Dialog.CLOSE;
- button.pos(this.DIALOG_WIDTH - this.CLOSE_BTN_WIDTH - this.CLOSE_BTN_PADDING, this.CLOSE_BTN_PADDING);
- dialog.addChild(button);
- dialog.dragArea = "0,0," + this.DIALOG_WIDTH + "," + this.DIALOG_HEIGHT;
- dialog.show();
- };
- /******************************************** */
- /**
- * 移除全局事件
- * @param type
- * @param thisObject
- * @param listener
- */
- PanelChildControl.prototype.removeDataEvent = function (type, thisObject, listener) {
- if (this.EventGlobal[type]) {
- var vo = this.EventGlobal[type];
- DispatcherManager_1.DispatcherManager.removeEventListener(type, thisObject, listener);
- vo.clear();
- delete this.EventGlobal[type];
- }
- };
- /**
- * 注册组件事件,调用此方法,界面关闭会自动移除
- * @param type 时间类型
- * @param callbackobj 作用域
- * @param callbackHandler 事件回调
- */
- PanelChildControl.prototype.AddEventByType = function (target, type, thisObject, listener, args) {
- if (args === void 0) { args = null; }
- if (target) {
- if (target.name == null || target.name == "") {
- throw "childbaseview addListener target.name is null";
- }
- var vo = GamePool_1.GamePool.GetItem(ComponentEventData_1.ComponentEventData.ResDicValue);
- vo.target = target;
- vo.type = type;
- vo.thisObject = thisObject;
- vo.listener = listener;
- if (!this.EventResDic.hasOwnProperty(target.name)) {
- this.EventResDic[target.name] = [];
- }
- var bo = this.JudgeIsHaveEvent(target, type);
- if (!bo) {
- target.on(type, thisObject, listener, args);
- this.EventResDic[target.name].push(vo);
- }
- }
- };
- PanelChildControl.prototype.JudgeIsHaveEvent = function (target, type) {
- var eventArr;
- eventArr = this.EventResDic[target.name];
- var childvo;
- for (var s in eventArr) {
- childvo = eventArr[s];
- if (childvo && childvo.type == type) {
- return true;
- }
- }
- return false;
- };
- /**
- * 移除组件事件
- * @param type 时间类型
- * @param callbackobj 作用域
- * @param callbackHandler 事件回调
- */
- PanelChildControl.prototype.ClearEventByType = function (target, type, thisObject, listener) {
- if (target && this.EventResDic[target.name]) {
- var arr = this.EventResDic[target.name];
- var i = 0;
- var nums = arr.length;
- var vo;
- for (i; i < nums; i++) {
- vo = arr[i];
- if (vo && vo.type == type && vo.thisObject == thisObject && vo.listener == listener) {
- target.off(type, thisObject, listener);
- vo.clear();
- arr.splice(i, 1);
- break;
- }
- }
- }
- };
- /**
- * 移除所有全局事件
- */
- PanelChildControl.prototype.ClearGlobalEvent = function () {
- if (this.EventGlobal) {
- var s;
- var dict = this.EventGlobal;
- for (s in dict) {
- var vo = dict[s];
- if (vo) {
- this.removeDataEvent(vo.type, vo.thisObject, vo.listener);
- }
- }
- }
- this.EventGlobal = {};
- };
- /***************************************************** */
- PanelChildControl.prototype.placeHScroller = function () {
- var hs = new Laya.HScrollBar();
- hs.skin = "res/ui/hscroll.png";
- hs.width = 300;
- hs.pos(50, 170);
- hs.min = 0;
- hs.max = 100;
- hs.changeHandler = new Laya.Handler(this, this.onChange);
- Laya.stage.addChild(hs);
- };
- PanelChildControl.prototype.placeVScroller = function () {
- var vs = new Laya.VScrollBar();
- vs.skin = "res/ui/vscroll.png";
- vs.height = 300;
- vs.pos(400, 50);
- vs.min = 0;
- vs.max = 100;
- vs.changeHandler = new Laya.Handler(this, this.onChange);
- Laya.stage.addChild(vs);
- };
- PanelChildControl.prototype.onChange = function (value) {
- console.log("滚动条的位置: value=" + value);
- };
- return PanelChildControl;
- }(fairygui.GComponent));
- exports.PanelChildControl = PanelChildControl;
- },{"../Data/ComponentEventData":30,"../PrefabControl/GamePool":47,"../PrefabControl/PanelResDic":48,"../utils/DispatcherManager":85}],26:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PoolManager = /** @class */ (function () {
- function PoolManager() {
- PoolManager.PoolManagerInstance = this;
- }
- Object.defineProperty(PoolManager, "Instance", {
- get: function () {
- if (PoolManager.PoolManagerInstance) {
- return PoolManager.PoolManagerInstance;
- }
- else {
- var instance = new PoolManager();
- return instance;
- }
- },
- enumerable: true,
- configurable: true
- });
- PoolManager.GetSprite3D = function (_obj) {
- var objName = _obj.name;
- if (this.Sprite3DDic[objName] != null && this.Sprite3DDic[objName] != undefined) {
- if (this.Sprite3DDic[objName].length > 0) {
- var obj = this.Sprite3DDic[objName][0];
- if (!obj || obj.destroyed)
- obj = Laya.Sprite3D.instantiate(_obj);
- this.Sprite3DDic[objName].splice(0, 1);
- // obj.transform.position = _obj.transform.position.clone();
- // obj.transform.rotation = _obj.transform.rotation.clone();
- obj.transform.scale = _obj.transform.scale.clone();
- obj.active = true;
- return obj;
- }
- else {
- var newobj = Laya.Sprite3D.instantiate(_obj);
- newobj.active = true;
- return newobj;
- }
- }
- else {
- var newobj = Laya.Sprite3D.instantiate(_obj);
- newobj.active = true;
- return newobj;
- }
- };
- PoolManager.RecoverSprite3D = function (_obj, _active) {
- if (_active === void 0) { _active = false; }
- if (!_obj) {
- console.warn("PoolManager Recover Error!", null);
- return;
- }
- if (_obj.destroyed) {
- console.warn("PoolManager Recover Error!", "destroyed");
- return;
- }
- if (!_active && _obj.active == false) {
- console.warn("PoolManager Recover Error!", _obj.name);
- return;
- }
- var objName = _obj.name;
- if (this.Sprite3DDic[objName] != null && this.Sprite3DDic[objName] != undefined) {
- var array = this.Sprite3DDic[objName];
- if (array.length > this.PoolSize) {
- _obj.destroy();
- return;
- }
- else {
- array.push(_obj);
- }
- }
- else {
- array = [];
- array.push(_obj);
- this.Sprite3DDic[objName] = array;
- //console.log(objName,array.length);
- }
- _obj.transform.position = new Laya.Vector3(0, 0, -100);
- _obj.removeSelf();
- _obj.active = false;
- };
- PoolManager.ClearPool = function () {
- for (var key in this.Sprite3DDic) {
- var objs = this.Sprite3DDic[key];
- for (var i = 0; i < objs.length; i++) {
- objs[i].destroy();
- }
- }
- this.Sprite3DDic = {};
- };
- PoolManager.PoolSize = 80;
- PoolManager.Sprite3DDic = {};
- return PoolManager;
- }());
- exports.default = PoolManager;
- },{}],27:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var ResourceControl_1 = require("./ResourceControl");
- var LocalData_1 = require("../Data/LocalData");
- var GamePool_1 = require("../PrefabControl/GamePool");
- var AssetPath_1 = require("../Config/AssetPath");
- var TimerService_1 = require("../Time/TimerService");
- var Tab = Laya.Tab;
- /*
- * 资源管理器;
- */
- var ResDataControl = /** @class */ (function () {
- function ResDataControl() {
- /************************************************ */
- this._time = 0;
- this.ClearInterval = 50000;
- this.CheckInterval = 20000;
- /******************************************************************* */
- this.skins = ["res/ui/tab1.png", "res/ui/tab2.png"];
- ResDataControl.ins = this;
- }
- Object.defineProperty(ResDataControl, "Instance", {
- get: function () {
- if (ResDataControl.ins == null) {
- return new ResDataControl();
- }
- return ResDataControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * 添加包
- * @param path 路径( 事例:res/ui/ )
- * @param pkgname 包名
- * @param isaddpackage 是否添加
- * @param isCache 是否缓存
- */
- ResDataControl.prototype.AddPackByName = function (path, pkgname, isaddpackage, isCache) {
- if (isaddpackage === void 0) { isaddpackage = true; }
- if (isCache === void 0) { isCache = true; }
- if (isaddpackage) {
- fairygui.UIPackage.addPackage(path + pkgname, pkgname);
- }
- this.AddLocalLiveData(pkgname, isCache);
- };
- ResDataControl.prototype.init = function () {
- GamePool_1.GamePool.Mark(LocalData_1.LocalData.ResDicValue, LocalData_1.LocalData);
- this.urlRes = {};
- this.packageRes = {};
- this.NoLiveData = { "loading": true, "main": true, "uicomponent": true };
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- };
- /**
- * 清理资源缓存(Array)
- * @param urls 资源数组
- * @param packageName 包名
- */
- ResDataControl.prototype.RemoveResources = function (urls, packageName) {
- if (packageName === void 0) { packageName = ""; }
- if (packageName != "") {
- fairygui.UIPackage.removePackage(packageName);
- }
- for (var s in urls) {
- this.RemoveResourcesByurl(urls[s].url, true);
- }
- };
- /************************************************ */
- ResDataControl.prototype.placeHSlider = function () {
- var hs = new Laya.HSlider();
- hs.skin = "res/ui/hslider.png";
- hs.width = 300;
- hs.pos(50, 170);
- hs.min = 0;
- hs.max = 100;
- hs.value = 50;
- hs.tick = 1;
- Laya.stage.addChild(hs);
- };
- ResDataControl.prototype.placeVSlider = function () {
- var vs = new Laya.VSlider();
- vs.skin = "res/ui/vslider.png";
- vs.height = 300;
- vs.pos(400, 50);
- vs.min = 0;
- vs.max = 100;
- vs.value = 50;
- vs.tick = 1;
- Laya.stage.addChild(vs);
- };
- ResDataControl.prototype.update = function (dt) {
- this._time += dt;
- if (this._time > this.CheckInterval) //1分钟检查一次
- {
- if (ResourceControl_1.ResourceControl.Instance.running) //如果当前在加载中,延时1秒检测
- {
- this._time -= 1000;
- return;
- }
- this.RefreshGroupRes();
- this._time = 0;
- }
- };
- /**
- * 清理资源缓存(url)
- * @param url 要清理的资源url
- * @param isClear 对于缓存池中的数据,当引用为0时,是否直接强制清除( 如果为false,则等待缓存定时刷新时候再去判断 )
- */
- ResDataControl.prototype.RemoveResourcesByurl = function (url, isClear) {
- if (isClear === void 0) { isClear = false; }
- if (this.urlRes.hasOwnProperty(url)) {
- if (isClear) {
- Laya.loader.clearRes(url);
- delete this.urlRes[url];
- }
- else {
- this.urlRes[url]--;
- }
- }
- else {
- Laya.loader.clearRes(url);
- }
- };
- ResDataControl.prototype.ClearLiveDataByPackName = function (pkgName) {
- if (this.packageRes[pkgName]) {
- var vo = this.packageRes[pkgName];
- vo.clear();
- delete this.packageRes[pkgName];
- }
- };
- /**
- * 添加ui包
- * @param pkgname 包名
- * @param isaddpackage 是否创建uipackage
- * @param isCache 是否添加到组缓存中( 如果添加,则参与定时清理的逻辑,常驻资源请勿设置为ture )
- */
- ResDataControl.prototype.AddViewPackByName = function (pkgname, isaddpackage, isCache) {
- if (isaddpackage === void 0) { isaddpackage = true; }
- if (isCache === void 0) { isCache = true; }
- if (isaddpackage) {
- if (pkgname == "main") {
- fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.res + AssetPath_1.AssetPath.subpacksgeui + pkgname, pkgname);
- }
- else {
- fairygui.UIPackage.addPackage(AssetPath_1.AssetPath.resources + AssetPath_1.AssetPath.ui + pkgname, pkgname);
- }
- }
- this.AddLocalLiveData(pkgname, isCache);
- };
- /**
- * 移除包
- * @param pkgname 包名
- * @param isclear 是否强制清除( 如果为false则等待定时器判断清理,如果为true则强制清除 )
- */
- ResDataControl.prototype.ClearPackByName = function (pkgname, isclear) {
- if (isclear === void 0) { isclear = false; }
- if (pkgname == "" || pkgname == null) {
- return;
- }
- if (isclear) {
- fairygui.UIPackage.removePackage(pkgname);
- if (this.packageRes.hasOwnProperty(pkgname)) {
- delete this.packageRes[pkgname];
- }
- }
- else {
- if (this.packageRes.hasOwnProperty(pkgname)) {
- var vo = this.packageRes[pkgname];
- if (vo) {
- vo.ref--;
- }
- }
- }
- };
- ResDataControl.prototype.RefreshGroupRes = function () {
- var nowTime = Laya.Browser.now();
- var s;
- if (this.packageRes) {
- var vo;
- for (s in this.packageRes) {
- vo = this.packageRes[s];
- if (vo.ref <= 0 && (nowTime - vo.time) > this.ClearInterval) {
- this.ClearPackByName(vo.packageName, true);
- this.ClearLiveDataByPackName(vo.packageName);
- }
- }
- }
- //清理图片缓存
- if (this.urlRes) {
- var resourceurlPool = this.urlRes;
- for (s in resourceurlPool) {
- if (resourceurlPool[s] <= 0) {
- this.RemoveResourcesByurl(s, true);
- }
- }
- }
- };
- ResDataControl.prototype.onSkinLoaded = function () {
- var tabA = this.createTab(this.skins[0]);
- tabA.pos(40, 120);
- tabA.labelColors = "#000000,#d3d3d3,#333333";
- var tabB = this.createTab(this.skins[1]);
- tabB.pos(40, 220);
- tabB.labelColors = "#FFFFFF,#8FB299,#FFFFFF";
- };
- ResDataControl.prototype.createTab = function (skin) {
- var tab = new Tab();
- tab.skin = skin;
- tab.labelBold = true;
- tab.labelSize = 20;
- tab.labelStrokeColor = "#000000";
- tab.labels = "Tab Control 1,Tab Control 2,Tab Control 3";
- tab.labelPadding = "0,0,0,0";
- tab.selectedIndex = 1;
- Laya.stage.addChild(tab);
- return tab;
- };
- /******************************************************************* */
- /**
- * 获取已经加载过的数据
- * @param url 资源url
- * @param isCache 是否存储在缓存池中,默认为true
- */
- ResDataControl.prototype.GainResources = function (url, isCache) {
- if (isCache === void 0) { isCache = true; }
- if (isCache) {
- if (this.urlRes[url] == null) {
- this.urlRes[url] = 0;
- }
- this.urlRes[url]++;
- }
- return Laya.loader.getRes(url);
- };
- ResDataControl.prototype.AddLocalLiveData = function (pkgname, isCache) {
- if (isCache && !this.NoLiveData.hasOwnProperty(pkgname)) {
- var vo;
- if (!this.packageRes.hasOwnProperty(pkgname)) {
- vo = GamePool_1.GamePool.GetItem(LocalData_1.LocalData.ResDicValue);
- vo.packageName = pkgname;
- this.packageRes[pkgname] = vo;
- }
- else {
- vo = this.packageRes[pkgname];
- }
- vo.ref++;
- vo.time = Laya.Browser.now();
- }
- };
- return ResDataControl;
- }());
- exports.ResDataControl = ResDataControl;
- },{"../Config/AssetPath":15,"../Data/LocalData":32,"../PrefabControl/GamePool":47,"../Time/TimerService":59,"./ResourceControl":28}],28:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /*
- * name;
- */
- var Handler = Laya.Handler;
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var RecConfigs_1 = require("../Config/RecConfigs");
- var ResourceControl = /** @class */ (function (_super) {
- __extends(ResourceControl, _super);
- function ResourceControl() {
- var _this = _super.call(this) || this;
- _this._groupIndex = 0;
- _this.running = false;
- /**
- * 要加载的总数量
- */
- _this._loadNum = 0;
- /**
- * 已经加载的数量
- */
- _this._loadedNum = 0;
- _this._preloadNum = 0;
- _this._cut = 0;
- _this._nowLoadArr = null;
- ResourceControl.ins = _this;
- return _this;
- }
- Object.defineProperty(ResourceControl, "Instance", {
- get: function () {
- if (ResourceControl.ins == null) {
- return new ResourceControl();
- }
- return ResourceControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- ResourceControl.prototype.init = function () {
- this._configs = new Array();
- this._groups = {};
- Laya.loader.retryNum = 4;
- Laya.loader.on(Laya.Event.ERROR, this, this.onError);
- Laya.loader.on("errorsMsg", this, this.errorsMsghandler);
- Laya.loader.on("gameerrorsMsg", this, this.gameerrorsMsghandler);
- };
- ResourceControl.prototype.onLoadConfigComplete = function () {
- if (this._onConfigCompleteTarget != null && this._onConfigComplete != null) {
- this._onConfigComplete.call(this._onConfigCompleteTarget);
- }
- };
- ResourceControl.prototype.errorsMsghandler = function (msg) {
- DispatcherManager_1.DispatcherManager.dispatchEvent("loadfailEvent", msg);
- };
- ResourceControl.prototype.gameerrorsMsghandler = function (msg) {
- DispatcherManager_1.DispatcherManager.dispatchEvent("gameserrosEvent", msg);
- };
- /**
- * 加载资源组
- * @param groupName 组名
- * @param onResourceLoadTarget 作用域
- * @param ResourceLoadComplete 完成事件
- * @param onResourceProgress 加载进度事件
- * @param isShow 是否显示加载状态
- */
- ResourceControl.prototype.loadGroup = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
- if (onResourceProgress === void 0) { onResourceProgress = null; }
- if (isShow === void 0) { isShow = true; }
- if (args === void 0) { args = null; }
- // Debuger.log(groupName);
- var data = {};
- data.complete = ResourceLoadComplete;
- data.completeTarget = onResourceLoadTarget;
- data.progress = onResourceProgress;
- data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
- data.isShow = isShow;
- data.args = args;
- data.type = "group";
- data.resouseType = "2D";
- this._configs.push(data);
- this.loadStart();
- };
- /**
- * 加载单个资源
- * @param url 资源url
- * @param type 资源类型
- * @param onResourceLoadTarget 作用域
- * @param ResourceLoadComplete 完成事件
- * @param onResourceProgress 加载进度事件
- * @param isShow 是否显示加载状态
- */
- ResourceControl.prototype.Loader = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
- if (onResourceProgress === void 0) { onResourceProgress = null; }
- if (isShow === void 0) { isShow = true; }
- if (args === void 0) { args = null; }
- var data = {};
- data.complete = ResourceLoadComplete;
- data.completeTarget = onResourceLoadTarget;
- data.progress = onResourceProgress;
- data.urls = [{ url: url, type: type }];
- data.isShow = isShow;
- data.args = args;
- data.type = "single";
- data.resouseType = "2D";
- this._configs.push(data);
- this.loadStart();
- };
- /**
- * 加载数组资源
- * @param urls
- * @param onResourceLoadTarget
- * @param ResourceLoadComplete
- * @param onResourceProgress
- * @param isShow
- */
- ResourceControl.prototype.Loaders = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
- if (onResourceProgress === void 0) { onResourceProgress = null; }
- if (isShow === void 0) { isShow = true; }
- if (args === void 0) { args = null; }
- var data = {};
- data.complete = ResourceLoadComplete;
- data.completeTarget = onResourceLoadTarget;
- data.progress = onResourceProgress;
- data.urls = urls;
- data.isShow = isShow;
- data.type = "arr";
- data.args = args;
- data.resouseType = "2D";
- this._configs.push(data);
- this.loadStart();
- };
- /**
- * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
- * @param urls
- * @param onResourceLoadTarget
- * @param ResourceLoadComplete
- * @param onResourceProgress
- * @param isShow
- */
- ResourceControl.prototype.loaderArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, cut) {
- if (onResourceProgress === void 0) { onResourceProgress = null; }
- if (cut === void 0) { cut = 3; }
- var data = {};
- data.complete = ResourceLoadComplete;
- data.completeTarget = onResourceLoadTarget;
- data.progress = onResourceProgress;
- data.urls = urls;
- data.isShow = false;
- data.type = "loaderArr";
- data.cut = cut;
- data.resouseType = "2D";
- this._configs.push(data);
- this.startLoad1();
- };
- ResourceControl.prototype.startLoad1 = function () {
- if (!this.running && this._configs.length > 0) {
- this._nowLoadData = this._configs.shift();
- this._nowLoadArr = this._nowLoadData.urls.concat().reverse();
- this._loadNum = this._nowLoadArr.length;
- this._loadedNum = 0;
- this._preloadNum = this._loadedNum;
- this._cut = Number(this._nowLoadData.cut);
- this.loadStart1();
- }
- };
- ResourceControl.prototype.loadStart1 = function () {
- if (this.running) {
- return;
- }
- if (this._nowLoadArr && this._nowLoadArr.length > 0) {
- this.running = true;
- var needArr;
- if (this._nowLoadArr.length > this._cut) {
- needArr = this._nowLoadArr.splice(0, this._cut);
- }
- else {
- needArr = this._nowLoadArr.splice(0);
- }
- this._cut = needArr.length;
- this._preloadNum = this._loadedNum;
- this.onLoadingArr(0);
- var resouseType = this._nowLoadData.resouseType;
- if (resouseType == "2D" || resouseType == null) {
- Laya.loader.load(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
- }
- else {
- Laya.loader.create(needArr, Handler.create(this, this.onLoadCompleteArr), Handler.create(this, this.onLoadingArr, null, false));
- }
- }
- else {
- this._nowLoadData = null;
- this.startLoad1();
- }
- };
- ResourceControl.prototype.onLoadingArr = function (value) {
- this._loadedNum = this._preloadNum + value * this._cut;
- if (this._nowLoadData) {
- var allvalue = Math.ceil((this._loadedNum / this._loadNum) * 100);
- if (this._nowLoadData.progress != null) {
- this._nowLoadData.progress.call(this._nowLoadData.completeTarget, allvalue, Math.floor(value * 100));
- }
- }
- };
- ResourceControl.prototype.onLoadCompleteArr = function () {
- this.onLoadingArr(1);
- this._loadedNum = this._preloadNum + this._cut;
- this.running = false;
- if (this._loadedNum == this._loadNum) {
- if (this._nowLoadData && this._nowLoadData.complete) {
- this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
- }
- }
- Laya.timer.callLater(this, this.loadStart1);
- // this.loadStart1();
- };
- ResourceControl.prototype.loadStart = function () {
- if (this.running || this._configs.length == 0) {
- return;
- }
- this.running = true;
- this._nowLoadData = this._configs[0];
- var arr = this._nowLoadData.urls;
- var isShow = this._nowLoadData.isShow;
- if (isShow) {
- fairygui.GRoot.inst.showModalWait();
- }
- var resouseType = this._nowLoadData.resouseType;
- if (arr != null) {
- if (resouseType == "2D" || resouseType == null) {
- Laya.loader.load(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
- }
- else {
- Laya.loader.create(arr, Handler.create(this, this.onLoadComplete), Handler.create(this, this.onLoading, null, false));
- }
- }
- };
- // 加载进度侦听器
- ResourceControl.prototype.onLoading = function (progress) {
- if (this._nowLoadData) {
- progress = Math.ceil(Number(progress * 100));
- if (this._nowLoadData.progress != null) {
- this._nowLoadData.progress.call(this._nowLoadData.completeTarget, progress);
- }
- }
- };
- ResourceControl.prototype.onLoadComplete = function (args) {
- if (args === void 0) { args = null; }
- fairygui.GRoot.inst.closeModalWait();
- if (this._nowLoadData && this._nowLoadData.complete) {
- if (this._nowLoadData.args) {
- this._nowLoadData.complete.call(this._nowLoadData.completeTarget, this._nowLoadData.args);
- }
- else {
- this._nowLoadData.complete.call(this._nowLoadData.completeTarget);
- }
- }
- this.running = false;
- this._nowLoadData = null;
- this._configs.shift();
- this.loadStart();
- };
- ResourceControl.prototype.onError = function (err) {
- fairygui.GRoot.inst.closeModalWait();
- };
- /**
- * 加载3D单个资源
- * @param url 资源url
- * @param type 资源类型
- * @param onResourceLoadTarget 作用域
- * @param ResourceLoadComplete 完成事件
- * @param onResourceProgress 加载进度事件
- * @param isShow 是否显示加载状态
- */
- ResourceControl.prototype.Loader3D = function (url, type, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow) {
- if (onResourceProgress === void 0) { onResourceProgress = null; }
- if (isShow === void 0) { isShow = true; }
- var data = {};
- data.complete = ResourceLoadComplete;
- data.completeTarget = onResourceLoadTarget;
- data.progress = onResourceProgress;
- data.urls = [{ url: url, type: type }];
- data.isShow = isShow;
- data.type = "single";
- data.resouseType = "3D";
- this._configs.push(data);
- this.loadStart();
- };
- /**
- * 加载3D资源组
- * @param groupName 组名
- * @param onResourceLoadTarget 作用域
- * @param ResourceLoadComplete 完成事件
- * @param onResourceProgress 加载进度事件
- * @param isShow 是否显示加载状态
- */
- ResourceControl.prototype.loadGroup3D = function (groupName, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isShow, args) {
- if (onResourceProgress === void 0) { onResourceProgress = null; }
- if (isShow === void 0) { isShow = true; }
- if (args === void 0) { args = null; }
- var data = {};
- data.complete = ResourceLoadComplete;
- data.completeTarget = onResourceLoadTarget;
- data.progress = onResourceProgress;
- data.urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
- data.isShow = isShow;
- data.args = args;
- data.type = "group";
- data.resouseType = "3D";
- this._configs.push(data);
- this.loadStart();
- };
- /**
- * 加载资源数组,此加载方法会单个加载数组内的资源,用于显示两个进度条( 一个总进度条,一个单个资源进度条 )
- * @param urls
- * @param onResourceLoadTarget
- * @param ResourceLoadComplete
- * @param onResourceProgress
- * @param isShow
- */
- ResourceControl.prototype.loader3DArr = function (urls, onResourceLoadTarget, ResourceLoadComplete, onResourceProgress, isshow, args) {
- if (onResourceProgress === void 0) { onResourceProgress = null; }
- if (isshow === void 0) { isshow = false; }
- if (args === void 0) { args = null; }
- var data = {};
- data.complete = ResourceLoadComplete;
- data.completeTarget = onResourceLoadTarget;
- data.progress = onResourceProgress;
- data.urls = urls;
- data.isShow = isshow;
- data.args = args;
- data.type = "loaderArr";
- data.resouseType = "3D";
- this._configs.push(data);
- this.loadStart();
- };
- /**
- * 加载特效
- * @param groupName
- * @param onResourceLoadTarget
- * @param ResourceLoadComplete
- * @param args
- */
- ResourceControl.prototype.loadEffect = function (groupName, onResourceLoadTarget, ResourceLoadComplete, args) {
- if (args === void 0) { args = null; }
- var urls = RecConfigs_1.RecConfigs.Instance.ResDic[groupName];
- if (urls && urls.length > 0) {
- Laya.loader.load(urls, Handler.create(onResourceLoadTarget, ResourceLoadComplete, [args]));
- }
- };
- return ResourceControl;
- }(Laya.EventDispatcher));
- exports.ResourceControl = ResourceControl;
- },{"../Config/RecConfigs":16,"../utils/DispatcherManager":85}],29:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var LayoutControl_1 = require("./LayoutControl");
- var AssetPath_1 = require("../Config/AssetPath");
- var CameraManager_1 = require("../Game/CameraManager");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var Player_1 = require("../Game/Player");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
- var PanelResDic_1 = require("../PrefabControl/PanelResDic");
- var GameUtils_1 = require("../utils/GameUtils");
- var NpcCFG_1 = require("../CFG/NpcCFG");
- var NpcScript_1 = require("../Game/NpcScript");
- var ResourceControl_1 = require("./ResourceControl");
- var GameCFG_1 = require("../CFG/GameCFG");
- var CharacterState_1 = require("../PrefabControl/CharacterState");
- var UserInfoEvent_1 = require("../Data/UserInfoEvent");
- var CharacterPool_1 = require("../PrefabControl/CharacterPool");
- var Sprite = Laya.Sprite;
- var Event = Laya.Event;
- var SceneControl = /** @class */ (function () {
- function SceneControl() {
- this._initPosY = 1;
- this.index = 0;
- this.preRadian = 0;
- SceneControl.ins = this;
- }
- Object.defineProperty(SceneControl, "Instance", {
- get: function () {
- if (SceneControl.ins == null) {
- return new SceneControl();
- }
- return SceneControl.ins;
- },
- enumerable: true,
- configurable: true
- });
- //创建主角
- SceneControl.prototype.CreatePlayer = function (rolecfg) {
- var iscreate = false;
- if (!PropManager_1.PropManager.mainRole) {
- iscreate = true;
- }
- else if (PropManager_1.PropManager.mainRole.name != "Character" + rolecfg.name) {
- iscreate = true;
- this.ClearMomentCharacter();
- }
- if (iscreate) {
- // var sp:Laya.Sprite3D = Laya.Loader.getRes(AssetPath.get3DRoleModel(RoleData.roleCfg.name)) as Laya.Sprite3D;
- // PropManager.mainRole = Laya.Sprite3D.instantiate(sp, PropManager.scene3D, false,new Laya.Vector3( 0,0,0 )) as Laya.Sprite3D;
- PropManager_1.PropManager.mainRole = CharacterPool_1.CharacterPool.AddCharacter(rolecfg.name, Player_1.Player, PropManager_1.PropManager.scene3D);
- PropManager_1.PropManager.mainRole.name = "Character" + rolecfg.name;
- this.PlayerScript = PropManager_1.PropManager.mainRole.getComponent(Player_1.Player);
- // this.mainRoleScript.resouseName = RoleData.roleCfg.name;
- // if( )
- // this.mainRoleScript = PropManager.mainRole.addComponent( MainRAoleScript );
- }
- var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
- var RoleData = agencyusermessage.RoleData;
- var info = RoleData.levelcfg.roleinitpos;
- var chidarr = GameUtils_1.GameUtils.cutstrtoArr(info.offsetPos);
- var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
- var posVec = new Laya.Vector3;
- var selectVec;
- if (info.initbuild == "startpanel") {
- posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
- posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + offsetPos.y;
- posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
- selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
- }
- else {
- var childpos = PropManager_1.PropManager.getPosVecbyScene(RoleData.levelmapArr[0], info.initbuild);
- posVec.x = childpos.x + offsetPos.x;
- posVec.y = childpos.y + offsetPos.y;
- posVec.z = childpos.z + offsetPos.z;
- selectVec = childpos;
- }
- PropManager_1.PropManager.mainRole.transform.position = posVec;
- this.cameraScript.SetCameraPosition(PropManager_1.PropManager.mainRole.transform.position);
- this.PlayerScript.setnowSelectVec(selectVec);
- this.PlayerScript.nowAction = CharacterState_1.CharacterState.stand;
- this.PlayerScript.PlayAnimator(CharacterState_1.CharacterState.stand);
- // var UIPos = PropManager.mainRole.transform.position;
- // var NAMEUI = new Laya.Text();
- // NAMEUI.text = "自己";
- // NAMEUI.fontSize = 60;
- // NAMEUI.color = "#ffffff";
- // NAMEUI.scaleX = 0.5;
- // NAMEUI.scaleY = 0.5;
- // NAMEUI.align = "center";
- // NAMEUI.valign = "middle";
- // Laya.stage.addChild(NAMEUI);
- // Laya.timer.frameLoop(1, this, () => {
- // let ScreenPos = new Laya.Vector3();
- // PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
- // NAMEUI.pos(ScreenPos.x, ScreenPos.y);
- // })
- };
- //创建npc
- SceneControl.prototype.createNpc = function () {
- console.log("CreatNpc---");
- this.ClearNpc();
- var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
- var RoleData = agencyusermessage.RoleData;
- var arr = RoleData.levelcfg.npc;
- var childdict;
- var index = 0;
- PropManager_1.PropManager.npcnum = arr.length;
- for (var s in arr) {
- childdict = arr[s];
- var selectVec = null;
- var npccfg = NpcCFG_1.default.dict[childdict.id];
- var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(npccfg.name));
- var chidarr = GameUtils_1.GameUtils.cutstrtoArr(childdict.offsetPos);
- var offsetPos = new Laya.Vector3(Number(chidarr[0]), Number(chidarr[1]), Number(chidarr[2]));
- var posVec = new Laya.Vector3;
- if (childdict.scene == "startpanel") {
- posVec.x = PropManager_1.PropManager.startPlane.transform.position.x + offsetPos.x;
- posVec.y = PropManager_1.PropManager.startPlane.transform.position.y + 1 + offsetPos.y;
- posVec.z = PropManager_1.PropManager.startPlane.transform.position.z + offsetPos.z;
- selectVec = PropManager_1.PropManager.startPlane.getChildByName("child_pos").transform.position;
- }
- else {
- var childpos = PropManager_1.PropManager.getPosVecbyScene(childdict.scene, childdict.initbuild);
- posVec.x = childpos.x + offsetPos.x;
- posVec.y = childpos.y + offsetPos.y;
- posVec.z = childpos.z + offsetPos.z;
- selectVec = childpos;
- }
- var npcsp = CharacterPool_1.CharacterPool.AddCharacter(npccfg.name, NpcScript_1.NpcScript, PropManager_1.PropManager.scene3D);
- npcsp.name = "npc_" + index;
- npcsp.transform.position = posVec;
- var npcscript = npcsp.getComponent(NpcScript_1.NpcScript);
- npcscript.setnowSelectVec(selectVec);
- npcscript.npcinfo(npccfg);
- PropManager_1.PropManager.npcDict[npcsp.name] = npcsp;
- PropManager_1.PropManager.npcscriptDict[npcsp.name] = npcscript;
- npcscript.PlayAnimator(CharacterState_1.CharacterState.stand);
- index++;
- // this.ShowUI(npcsp);
- }
- console.log("CreatNpc2---");
- };
- SceneControl.prototype.ShowUI = function (_sprite) {
- var UIPos = _sprite.transform.position;
- var NAMEUI = new Laya.Text();
- var random = GameUtils_1.GameUtils.randRangeint(1, 30);
- NAMEUI.text = "npc_" + this.index;
- NAMEUI.fontSize = 60;
- NAMEUI.color = "#ffffff";
- NAMEUI.scaleX = 0.5;
- NAMEUI.scaleY = 0.5;
- NAMEUI.align = "center";
- NAMEUI.valign = "middle";
- Laya.stage.addChild(NAMEUI);
- Laya.timer.frameLoop(1, this, function () {
- var ScreenPos = new Laya.Vector3();
- PropManager_1.PropManager.carma.worldToViewportPoint(UIPos, ScreenPos);
- NAMEUI.pos(ScreenPos.x, ScreenPos.y + 20);
- });
- this.index++;
- };
- SceneControl.prototype.ShowTheGameScene = function () {
- var pathArr = [];
- var urlArr = [];
- this.cameraScript.iscanfollow = true;
- var roleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
- var arr = roleData.levelmapArr;
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- if (urlArr.indexOf(AssetPath_1.AssetPath.get3DModel(arr[i])) == -1) {
- urlArr.push(AssetPath_1.AssetPath.get3DModel(arr[i]));
- }
- }
- var npcArr = roleData.levelcfg.npc;
- for (i = 0; i < npcArr.length; i++) {
- if (urlArr.indexOf(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name)) == -1) {
- urlArr.push(AssetPath_1.AssetPath.get3DRoleModel(NpcCFG_1.default.dict[npcArr[i].id].name));
- }
- }
- for (i = 0; i < urlArr.length; i++) {
- pathArr.push({ url: urlArr[i] });
- }
- ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.SceneCreatComplete, null, true);
- };
- SceneControl.prototype.SceneCreatComplete = function () {
- this.RefreshTerrain();
- var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
- var RoleData = agencyusermessage.RoleData;
- this.CreatePlayer(RoleData.roleCfg);
- this.createNpc();
- };
- SceneControl.prototype.ListenOnEvent = function () {
- DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.start, this, this.EnterGame);
- DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.jump, this, this.Jump);
- DispatcherManager_1.DispatcherManager.addEventListener(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.RefreshCharacterModel);
- };
- SceneControl.prototype.CharacterLoadEnd = function (url) {
- var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
- var RoleData = agencyusermessage.RoleData;
- if (AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name) == url) {
- this.CreatePlayer(RoleData.roleCfg);
- }
- };
- SceneControl.prototype.Jump = function () {
- this.PlayerScript.TestJump();
- };
- /************************************************************** */
- SceneControl.prototype.setup = function () {
- this.createSprite();
- Laya.stage.on(Event.MOUSE_UP, this, this.onMouseUp);
- Laya.stage.on(Event.MOUSE_OUT, this, this.onMouseUp);
- };
- SceneControl.prototype.createSprite = function () {
- this.sp = new Sprite();
- var w = 200, h = 300;
- this.sp.graphics.drawRect(0, 0, w, h, "#FF7F50");
- this.sp.size(w, h);
- this.sp.pivot(w / 2, h / 2);
- this.sp.pos(Laya.stage.width / 2, Laya.stage.height / 2);
- Laya.stage.addChild(this.sp);
- this.sp.on(Event.MOUSE_DOWN, this, this.onMouseDown);
- };
- SceneControl.prototype.onMouseDown = function (e) {
- var touches = e.touches;
- if (touches && touches.length == 2) {
- this.preRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
- Laya.stage.on(Event.MOUSE_MOVE, this, this.onMouseMove);
- }
- };
- SceneControl.prototype.onMouseMove = function (e) {
- var touches = e.touches;
- if (touches && touches.length == 2) {
- var nowRadian = Math.atan2(touches[0].stageY - touches[1].stageY, touches[0].stageX - touches[1].stageX);
- this.sp.rotation += 180 / Math.PI * (nowRadian - this.preRadian);
- this.preRadian = nowRadian;
- }
- };
- SceneControl.prototype.onMouseUp = function (e) {
- Laya.stage.off(Event.MOUSE_MOVE, this, this.onMouseMove);
- };
- /********************************** */
- SceneControl.prototype.EnterGame = function (jiasu) {
- this.PlayerScript.startRun(jiasu);
- var npcdict = PropManager_1.PropManager.npcscriptDict;
- for (var s in npcdict) {
- var npcscript = npcdict[s];
- npcscript.startRun();
- }
- };
- SceneControl.prototype.ClearMomentCharacter = function () {
- if (PropManager_1.PropManager.mainRole && this.PlayerScript) {
- CharacterPool_1.CharacterPool.ClearCharacter(PropManager_1.PropManager.mainRole, this.PlayerScript.resouseName, this.PlayerScript);
- this.PlayerScript = null;
- PropManager_1.PropManager.mainRole = null;
- }
- };
- SceneControl.prototype.SetScene = function () {
- var backgroundParent = LayoutControl_1.LayoutControl.Instance.background.displayObject;
- var scenebg = fairygui.UIPackage.createObject("main", "gambg");
- scenebg.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
- LayoutControl_1.LayoutControl.Instance.background.addChild(scenebg);
- // UiManager.instance.add( GameBgView,null,LayerNotify.LAYER_BACKGROUND );
- //添加3D场景
- PropManager_1.PropManager.scene3D = backgroundParent.addChild(new Laya.Scene3D());
- PropManager_1.PropManager.scene3D.physicsSimulation.continuousCollisionDetection = true;
- //添加照相机
- PropManager_1.PropManager.carma = (PropManager_1.PropManager.scene3D.addChild(new Laya.Camera(0, 0.1, 70)));
- this.cameraScript = PropManager_1.PropManager.carma.addComponent(CameraManager_1.CameraManager);
- PropManager_1.PropManager.carma.clearFlag = Laya.BaseCamera.CLEARFLAG_DEPTHONLY;
- //添加方向光
- var directionLight = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("DirectionalLight")); //PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
- PropManager_1.PropManager.scene3D.addChild(directionLight);
- // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
- // var directionLight: Laya.DirectionLight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
- // directionLight.color = new Laya.Vector3(1,1,1);
- // directionLight.intensity = 0.5;
- // directionLight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
- PropManager_1.PropManager.startPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("startpanel"));
- PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.startPlane);
- PropManager_1.PropManager.endPlane = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel("endpanel"));
- PropManager_1.PropManager.scene3D.addChild(PropManager_1.PropManager.endPlane);
- // PropManager.bgsprite3d = Laya.Loader.getRes(AssetPath.get3DModel("distantview"));
- // PropManager.scene3D.addChild(PropManager.bgsprite3d);
- //雾化代码
- PropManager_1.PropManager.scene3D.enableFog = true;
- //设置雾化的颜色
- var fogArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[2].value);
- if (GameCFG_1.default.dict[8]) {
- var wucolor = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[8].value);
- PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(Number(wucolor[0]), Number(wucolor[1]), Number(wucolor[2]));
- }
- else {
- PropManager_1.PropManager.scene3D.fogColor = new Laya.Vector3(0, 0, 0.6);
- }
- //设置雾化的起始位置,相对于相机的距离
- var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[3].value);
- PropManager_1.PropManager.scene3D.fogStart = Number(valueArr[0]);
- //设置雾化最浓处的距离。
- PropManager_1.PropManager.scene3D.fogRange = Number(valueArr[1]);
- this.ShowTheGameScene();
- this.ListenOnEvent();
- };
- /**清除所有NPC */
- SceneControl.prototype.ClearNpc = function () {
- var npcdict = PropManager_1.PropManager.npcDict;
- var s;
- for (s in npcdict) {
- var sp = npcdict[s];
- var npcscript = PropManager_1.PropManager.npcscriptDict[s];
- var resousename = npcscript.resouseName;
- CharacterPool_1.CharacterPool.ClearCharacter(sp, resousename, npcscript);
- delete PropManager_1.PropManager.npcscriptDict[s];
- delete npcdict[s];
- }
- };
- SceneControl.prototype.Pattern = function (mapSprite3D) {
- console.log("Pattern1----");
- if (PropManager_1.PropManager.patternDict[mapSprite3D.name]) {
- delete PropManager_1.PropManager.patternDict[mapSprite3D.name];
- }
- var BlocksSprite = mapSprite3D.getChildByName("Blocks");
- var chiddict = {};
- var chidsp;
- var buildSp;
- var index = 0;
- while (BlocksSprite.getChildByName("build_all_" + index)) {
- buildSp = BlocksSprite.getChildByName("build_all_" + index);
- chidsp = buildSp.getChildByName("child_pos");
- chiddict["build_all_" + index] = chidsp.transform.position;
- if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
- PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
- }
- index++;
- }
- index = 0;
- while (BlocksSprite.getChildByName("build_front_" + index)) {
- buildSp = BlocksSprite.getChildByName("build_front_" + index);
- chidsp = buildSp.getChildByName("child_pos");
- chiddict["build_front_" + index] = chidsp.transform.position;
- if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
- PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
- }
- index++;
- }
- index = 0;
- while (BlocksSprite.getChildByName("build_left_" + index)) {
- buildSp = BlocksSprite.getChildByName("build_left_" + index);
- chidsp = buildSp.getChildByName("child_pos");
- chiddict["build_left_" + index] = chidsp.transform.position;
- if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
- PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
- }
- index++;
- }
- index = 0;
- while (BlocksSprite.getChildByName("build_right_" + index)) {
- buildSp = BlocksSprite.getChildByName("build_right_" + index);
- chidsp = buildSp.getChildByName("child_pos");
- chiddict["build_right_" + index] = chidsp.transform.position;
- if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
- PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
- }
- index++;
- }
- index = 0;
- while (BlocksSprite.getChildByName("build_frontleft_" + index)) {
- buildSp = BlocksSprite.getChildByName("build_frontleft_" + index);
- chidsp = buildSp.getChildByName("child_pos");
- chiddict["build_frontleft_" + index] = chidsp.transform.position;
- if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
- PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
- }
- index++;
- }
- index = 0;
- while (BlocksSprite.getChildByName("build_frontright_" + index)) {
- buildSp = BlocksSprite.getChildByName("build_frontright_" + index);
- chidsp = buildSp.getChildByName("child_pos");
- chiddict["build_frontright_" + index] = chidsp.transform.position;
- if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
- PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
- }
- index++;
- }
- index = 0;
- while (BlocksSprite.getChildByName("build_leftright_" + index)) {
- buildSp = BlocksSprite.getChildByName("build_leftright_" + index);
- chidsp = buildSp.getChildByName("child_pos");
- chiddict["build_leftright_" + index] = chidsp.transform.position;
- if (PropManager_1.PropManager.diePosY > buildSp.transform.position.y) {
- PropManager_1.PropManager.diePosY = buildSp.transform.position.y;
- }
- index++;
- }
- index = 0;
- var Props = mapSprite3D.getChildByName("Props");
- while (Props.getChildByName("Scaffolding_" + index)) {
- chidsp = Props.getChildByName("Scaffolding_" + index).getChildByName("child_pos");
- chiddict["Scaffolding_" + index] = chidsp.transform.position;
- index++;
- }
- index = 0;
- while (Props.getChildByName("grilling_" + index)) {
- chidsp = Props.getChildByName("grilling_" + index).getChildByName("child_pos");
- chiddict["grilling_" + index] = chidsp.transform.position;
- index++;
- }
- index = 0;
- var jumpchildSp;
- var iscreatejt = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData.LevelID < 3 ? true : false;
- while (Props.getChildByName("JumpBoost_" + index)) {
- jumpchildSp = Props.getChildByName("JumpBoost_" + index);
- if (iscreatejt) {
- var pos = jumpchildSp.transform.position.clone();
- pos.y += 3;
- var jiantou = Laya.Sprite3D.instantiate(Laya.loader.getRes(AssetPath_1.AssetPath.get3DRoleModel("Arrow")), PropManager_1.PropManager.scene3D, false, pos);
- PropManager_1.PropManager.jiantouArr.push(jiantou);
- }
- index++;
- }
- PropManager_1.PropManager.patternDict[mapSprite3D.name] = chiddict;
- console.log("Pattern2----");
- };
- /***************************************************** */
- SceneControl.prototype.onSpriteClick = function (e) {
- var randomAngle = Math.random() * 180;
- //发送自定义事件
- // this.sp.event(Interaction_CustomEvent.ROTATE, [randomAngle]);
- };
- // 触发自定义的rotate事件
- SceneControl.prototype.onRotate = function (newAngle) {
- Laya.Tween.to(this.sp, { "rotation": newAngle }, 1000, Laya.Ease.elasticOut);
- };
- /***************************************************** */
- SceneControl.prototype.RefreshCharacterModel = function () {
- var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
- var RoleData = agencyusermessage.RoleData;
- var pathArr = [];
- pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
- ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.CharacterLoadEnd, null, true, AssetPath_1.AssetPath.get3DModel(RoleData.roleCfg.name));
- };
- /*********更新地形 */
- SceneControl.prototype.RefreshTerrain = function () {
- var agencyusermessage = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage);
- var RoleData = agencyusermessage.RoleData;
- var nowlevelcfg = RoleData.levelcfg;
- var mapArr = RoleData.levelmapArr;
- var mapSprite3D;
- var mapname;
- var _lastmapSprite3D;
- for (var s in PropManager_1.PropManager.nowmapDict) {
- PropManager_1.PropManager.nowmapDict[s].active = false;
- }
- for (var i = 0; i < mapArr.length; i++) {
- mapname = mapArr[i];
- console.log("mapname1----", mapname);
- if (PropManager_1.PropManager.nowmapDict[mapname]) {
- mapSprite3D = PropManager_1.PropManager.nowmapDict[mapname];
- mapSprite3D.active = true;
- }
- else {
- console.log("mapname2----", mapname);
- var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(mapname));
- console.log("mapname3----", mapname);
- mapSprite3D = Laya.Sprite3D.instantiate(sp, PropManager_1.PropManager.scene3D, false, null);
- console.log("mapname4----", mapname);
- PropManager_1.PropManager.nowmapDict[mapname] = mapSprite3D;
- console.log("mapname5----", mapname);
- }
- if (i == 0) {
- var arr = GameUtils_1.GameUtils.cutstrtoArr(nowlevelcfg.firstScenepos);
- mapSprite3D.transform.position = new Laya.Vector3(Number(arr[0]), Number(arr[1]), Number(arr[2]));
- }
- else {
- var endPos = _lastmapSprite3D.getChildByName("END").transform.position.clone();
- endPos.x = 0;
- endPos.y = 0;
- mapSprite3D.transform.position = endPos;
- }
- this.Pattern(mapSprite3D);
- _lastmapSprite3D = mapSprite3D;
- var endPos1 = mapSprite3D.getChildByName("END").transform.position.clone();
- endPos1.z += Number(GameCFG_1.default.dict[6].value);
- PropManager_1.PropManager.endPlane.transform.position = endPos1;
- PropManager_1.PropManager.gamewinPosZ = endPos1.z;
- PropManager_1.PropManager.gamewinPosZ -= 2;
- // PropManager.bgsprite3d.transform.position = new Laya.Vector3( 0,-20,-40 );
- }
- };
- /*使用界面显示,0:砸蛋,1:宝箱*/
- SceneControl.EggGGroup = 0;
- /**签到是否正在显示 */
- SceneControl.IsShowSign = false;
- return SceneControl;
- }());
- exports.SceneControl = SceneControl;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var GamePool_1 = require("../PrefabControl/GamePool");
- var ComponentEventData = /** @class */ (function () {
- function ComponentEventData() {
- }
- ComponentEventData.prototype.listenKeyboard = function () {
- this.keyDownList = [];
- //添加键盘按下事件,一直按着某按键则会不断触发
- Laya.stage.on(Laya.Event.KEY_DOWN, this, this.onKeyDown);
- //添加键盘抬起事件
- Laya.stage.on(Laya.Event.KEY_UP, this, this.onKeyUp);
- };
- /**键盘按下处理*/
- ComponentEventData.prototype.onKeyDown = function (e) {
- var keyCode = e["keyCode"];
- this.keyDownList[keyCode] = true;
- };
- ComponentEventData.prototype.clear = function () {
- this.target = null;
- this.type = null;
- this.thisObject = null;
- this.listener = null;
- GamePool_1.GamePool.RemoveItem(ComponentEventData.ResDicValue, this);
- };
- /**键盘抬起处理*/
- ComponentEventData.prototype.onKeyUp = function (e) {
- delete this.keyDownList[e["keyCode"]];
- };
- ComponentEventData.ResDicValue = "ComponentEventData";
- return ComponentEventData;
- }());
- exports.ComponentEventData = ComponentEventData;
- },{"../PrefabControl/GamePool":47}],31:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /*
- * name;
- */
- var DataInfoBase = /** @class */ (function (_super) {
- __extends(DataInfoBase, _super);
- function DataInfoBase() {
- return _super.call(this) || this;
- }
- /***********混淆********* */
- DataInfoBase.prototype.showApe = function () {
- var monkey1Path = "./res/apes/monkey1.png", monkey2Path = "./res/apes/monkey2.png";
- // 方法1:使用loadImage
- var ape = new Laya.Sprite();
- Laya.stage.addChild(ape);
- ape.loadImage(monkey1Path);
- // 方法2:使用drawTexture
- Laya.loader.load(monkey2Path, Laya.Handler.create(this, function () {
- var monkey2 = Laya.loader.getRes(monkey2Path);
- var ape2 = new Laya.Sprite();
- Laya.stage.addChild(ape2);
- ape2.graphics.drawTexture(monkey2, 100, 0);
- }));
- };
- /*********************** */
- DataInfoBase.prototype.DataInfo = function (data) {
- if (data) {
- for (var s in data) {
- var itemd = this[s];
- if (itemd != null) {
- this[s] = data[s];
- }
- // else
- // {
- // Debuger.log( "VO:未定义属性-" + s );
- // }
- }
- }
- };
- /*********混淆 */
- DataInfoBase.prototype.createButton = function (skin, name, cb, index) {
- var btn = new Laya.Button(skin, name);
- Laya.stage.addChild(btn);
- btn.on(Laya.Event.CLICK, this, cb);
- btn.size(147, 55);
- btn.name = name;
- btn.right = 10;
- btn.top = index * (btn.height + 10);
- return btn;
- };
- /***************** */
- DataInfoBase.prototype.dispatchEvent = function (type, data) {
- this.event(type, data);
- };
- return DataInfoBase;
- }(Laya.EventDispatcher));
- exports.DataInfoBase = DataInfoBase;
- },{}],32:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var GamePool_1 = require("../PrefabControl/GamePool");
- var Sprite = Laya.Sprite;
- var Event = Laya.Event;
- /*
- * name;
- */
- var LocalData = /** @class */ (function (_super) {
- __extends(LocalData, _super);
- function LocalData() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- /**
- * 引用次数
- */
- _this.ref = 0;
- /**
- * 最后一次被引用的时间
- */
- _this.time = 0;
- /**
- * 包名
- */
- _this.packageName = "";
- return _this;
- }
- LocalData.prototype.createCoralRect = function () {
- var coralRect = new Sprite();
- coralRect.graphics.drawRect(0, 0, Laya.stage.width, Laya.stage.height / 2, "#FF7F50");
- //设置名称
- coralRect.name = "珊瑚色容器";
- coralRect.size(Laya.stage.width, Laya.stage.height / 2);
- Laya.stage.addChild(coralRect);
- coralRect.on(Event.MOUSE_DOWN, this, this.onDown);
- };
- LocalData.prototype.createDeepSkyblueRect = function () {
- var deepSkyblueRect = new Sprite();
- deepSkyblueRect.graphics.drawRect(0, 0, 100, 100, "#00BFFF");
- //设置名称
- deepSkyblueRect.name = "天蓝色矩形";
- //设置宽高(要接收鼠标事件必须设置宽高,否则不会被命中)
- deepSkyblueRect.size(100, 100);
- deepSkyblueRect.pos(10, 10);
- Laya.stage.addChild(deepSkyblueRect);
- deepSkyblueRect.on(Event.MOUSE_DOWN, this, this.onDown);
- };
- LocalData.prototype.clear = function () {
- this.ref = 0;
- this.time = 0;
- this.packageName = "";
- GamePool_1.GamePool.RemoveItem(LocalData.ResDicValue, this);
- };
- /**侦听处理方法*/
- LocalData.prototype.onDown = function (e) {
- this.logger.text += "点击 - " + e.target.name + "\n";
- };
- LocalData.ResDicValue = "LocalData";
- return LocalData;
- }(Laya.EventDispatcher));
- exports.LocalData = LocalData;
- },{"../PrefabControl/GamePool":47}],33:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var UserInfoEvent_1 = require("../Data/UserInfoEvent");
- var LocalDataControl_1 = require("../Control/LocalDataControl");
- var UserDataInfo_1 = require("../Data/UserDataInfo");
- var RoleCFG_1 = require("../CFG/RoleCFG");
- var LevelCFG_1 = require("../CFG/LevelCFG");
- var GameUtils_1 = require("../utils/GameUtils");
- var DataInfoBase_1 = require("./DataInfoBase");
- var Templet = Laya.Templet;
- var Event = Laya.Event;
- var RoleData = /** @class */ (function (_super) {
- __extends(RoleData, _super);
- function RoleData() {
- var _this = _super.call(this) || this;
- /**
- * 金币
- */
- _this._Gold = 0;
- _this._roleid = 0;
- _this._leveid = 0;
- _this.mStartX = 400;
- _this.mStartY = 500;
- _this.mActionIndex = 0;
- _this.mCurrIndex = 0;
- _this.mCurrSkinIndex = 0;
- /****************************************************** */
- _this.movespeed = 0;
- _this.frontjump = new Laya.Vector3;
- _this.leftjump = new Laya.Vector3;
- _this.rightjump = new Laya.Vector3;
- _this.upclimb = 0;
- _this.slideclimb = new Laya.Vector3;
- RoleData.ins = _this;
- return _this;
- }
- Object.defineProperty(RoleData, "Instance", {
- get: function () {
- if (RoleData.ins == null) {
- return new RoleData();
- }
- return RoleData.ins;
- },
- enumerable: true,
- configurable: true
- });
- RoleData.prototype.init = function () {
- var localdatacontrol = LocalDataControl_1.LocalDataControl.Instance;
- // var nowGold:number = Number(PlayerAccount.CurrentAccount.CurAccountData.GetUser(AccountUser.money));
- // this.Gold = nowGold;
- this.Money = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.gold);
- this._roleid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.roleid);
- if (this.CharacterID == 0) {
- this.CharacterID = 1;
- }
- else {
- this.InitCharacterInfo();
- }
- this._leveid = localdatacontrol.getnum(UserDataInfo_1.UserDataInfo.levelid);
- if (this._leveid == 0) {
- this._leveid = 1;
- }
- this.RefreshLevel();
- };
- Object.defineProperty(RoleData.prototype, "nowlevel", {
- get: function () {
- return this._leveid;
- },
- enumerable: true,
- configurable: true
- });
- RoleData.prototype.getNowServerLevel = function () {
- return this._leveid;
- };
- RoleData.prototype.LevelUp = function () {
- this._leveid++;
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.levelid, this._leveid.toString());
- this.RefreshLevel();
- };
- /*********************************************************** */
- RoleData.prototype.startFun = function () {
- this.mAniPath = "res/spine/spineRes6/alien.sk";
- this.mFactory = new Templet();
- this.mFactory.on(Event.COMPLETE, this, this.parseComplete);
- this.mFactory.on(Event.ERROR, this, this.onError);
- this.mFactory.loadAni(this.mAniPath);
- };
- RoleData.prototype.onError = function () {
- console.log("error");
- };
- RoleData.prototype.parseComplete = function () {
- //创建模式为1,可以启用换装
- this.mArmature = this.mFactory.buildArmature(1);
- this.mArmature.x = this.mStartX;
- this.mArmature.y = this.mStartY;
- this.mArmature.scale(0.5, 0.5);
- Laya.stage.addChild(this.mArmature);
- this.mArmature.on(Event.LABEL, this, this.onEvent);
- this.play();
- };
- /******************************************************************** */
- RoleData.prototype.RefreshLevel = function () {
- var lv = this._leveid;
- var nowcfglv = 0;
- var allnums = LevelCFG_1.default.vec.length;
- if (lv > allnums) {
- var value = (lv - allnums) % (allnums - 2);
- if (value == 0) {
- nowcfglv = allnums;
- }
- else {
- nowcfglv = value + 2;
- }
- }
- else {
- nowcfglv = lv;
- }
- this.levelcfg = LevelCFG_1.default.dict[nowcfglv];
- this.levelmapArr = GameUtils_1.GameUtils.cutstrtoArr(this.levelcfg.road);
- DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_levelid);
- };
- RoleData.prototype.play = function () {
- this.mCurrIndex++;
- if (this.mCurrIndex >= this.mArmature.getAnimNum()) {
- this.mCurrIndex = 0;
- }
- this.mArmature.play(this.mCurrIndex, false);
- };
- RoleData.prototype.onEvent = function (e) {
- Laya.stage.addChild(this.mLabelSprite);
- this.mLabelSprite.x = this.mStartX;
- this.mLabelSprite.y = this.mStartY;
- this.mLabelSprite.graphics.clear();
- };
- RoleData.prototype.InitCharacterInfo = function () {
- this.roleCfg = RoleCFG_1.default.dict[this._roleid];
- this.movespeed = this.roleCfg.speed;
- this.frontjump = this.roleCfg.frontjump;
- this.leftjump = this.roleCfg.leftjump;
- this.rightjump = this.roleCfg.rightjump;
- this.upclimb = Number(this.roleCfg.upclimb);
- this.slideclimb = this.roleCfg.slideclimb;
- // this.frontjump.x = Number( this.roleCfg.frontjump.x );
- // this.frontjump.y = Number( this.roleCfg.frontjump.y );
- // this.frontjump.z = Number( this.roleCfg.frontjump.z );
- // this.leftjump.x = Number( this.roleCfg.leftjump.x );
- // this.leftjump.y = Number( this.roleCfg.leftjump.y );
- // this.leftjump.z = Number( this.roleCfg.leftjump.z );
- // this.rightjump.x = Number( this.roleCfg.rightjump.x );
- // this.rightjump.y = Number( this.roleCfg.rightjump.y );
- // this.rightjump.z = Number( this.roleCfg.rightjump.z );
- // this.slideclimb.x = Number( this.roleCfg.slideclimb.x );
- // this.slideclimb.y = Number( this.roleCfg.slideclimb.y );
- // this.slideclimb.z = Number( this.roleCfg.slideclimb.z );
- };
- Object.defineProperty(RoleData.prototype, "LevelID", {
- // public set leveid( value:number )
- // {
- // if( this._leveid != value )
- // {
- // this._leveid = value;
- // this.levelcfg = LevelCFG.dict[ this._leveid ];
- // this.levelmapArr = GameUtils.cutstrtoArr(this.levelcfg.road);
- // CacheManager.getInstance().addstr( UserDataInfo.levelid,this._leveid.toString() );
- // DispatcherManager.dispatchEvent( UserInfoEvent.userinfoEvent_updateroleid );
- // }
- // }
- get: function () {
- return this._leveid;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(RoleData.prototype, "CharacterID", {
- get: function () {
- return this._roleid;
- },
- set: function (value) {
- if (this._roleid != value) {
- this._roleid = value;
- this.InitCharacterInfo();
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.roleid, this._roleid.toString());
- DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid);
- }
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(RoleData.prototype, "Money", {
- get: function () {
- return this._Gold;
- },
- set: function (value) {
- if (this._Gold != value) {
- this._Gold = value;
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.gold, this._Gold.toString());
- DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData);
- }
- },
- enumerable: true,
- configurable: true
- });
- return RoleData;
- }(DataInfoBase_1.DataInfoBase));
- exports.RoleData = RoleData;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var SkinData = /** @class */ (function () {
- function SkinData() {
- /**
- * 0:未拥有,1:已经拥有
- */
- this.state = 0;
- this.hasnum = 0;
- /************************************ */
- }
- /************************************ */
- SkinData.prototype.createText = function () {
- var txt = new Laya.Text();
- txt.text = "Layabox是HTML5引擎技术提供商与优秀的游戏发行商,面向AS/JS/TS开发者提供HTML5开发技术方案!";
- txt.width = 300;
- txt.fontSize = 40;
- txt.color = "#ffffff";
- //设置文本为多行文本
- txt.wordWrap = true;
- txt.x = Laya.stage.width - txt.textWidth >> 1;
- txt.y = Laya.stage.height - txt.textHeight >> 1;
- Laya.stage.addChild(txt);
- };
- return SkinData;
- }());
- exports.SkinData = SkinData;
- },{}],35:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Event = Laya.Event;
- var UserDataInfo = /** @class */ (function () {
- function UserDataInfo() {
- }
- /******************************* */
- UserDataInfo.prototype.onCallLater = function () {
- console.log("onCallLater triggered");
- var text = new Laya.Text();
- text.font = "SimHei";
- text.fontSize = 30;
- text.color = "#FFFFFF";
- text.text = "打开控制台可见该函数仅触发了一次";
- text.size(Laya.stage.width, Laya.stage.height);
- text.wordWrap = true;
- text.valign = "middle";
- text.align = "center";
- Laya.stage.addChild(text);
- };
- UserDataInfo.prototype.onDecreaseAlpha1 = function (e) {
- //移除鼠标单击事件
- this.button1.off(Event.CLICK, this, this.onDecreaseAlpha1);
- //定时执行一次(间隔时间)
- Laya.timer.once(3000, this, this.onComplete1);
- };
- UserDataInfo.prototype.onDecreaseAlpha2 = function (e) {
- //移除鼠标单击事件
- this.button2.off(Event.CLICK, this, this.onDecreaseAlpha2);
- //定时执行一次(基于帧率)
- Laya.timer.frameOnce(60, this, this.onComplete2);
- };
- UserDataInfo.prototype.onComplete1 = function () {
- //spBtn1的透明度减少0.5
- this.button1.alpha -= 0.5;
- };
- UserDataInfo.prototype.onComplete2 = function () {
- //spBtn2的透明度减少0.5
- this.button2.alpha -= 0.5;
- };
- /******************************************************** */
- /**
- * 记录上次离开时间
- */
- UserDataInfo.lasttime = "lasttime";
- UserDataInfo.caplastflushtime = "captime";
- UserDataInfo.capstorageappids = "capappids";
- UserDataInfo.hasgetappids = "hasgetappids";
- /******************************* */
- /**
- * 角色信息
- */
- UserDataInfo.roleData = "roleData";
- /********************************************************************** */
- UserDataInfo.gold = "gold";
- UserDataInfo.roleid = "roleid";
- UserDataInfo.levelid = "levelid";
- /**
- * 皮肤
- */
- UserDataInfo.skin = "skin";
- UserDataInfo.lastDay = "lastDay";
- UserDataInfo.nowdayShare = "dayshare";
- UserDataInfo.nowdayVideo = "dayvideo";
- return UserDataInfo;
- }());
- exports.UserDataInfo = UserDataInfo;
- },{}],36:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var UserInfoEvent = /** @class */ (function () {
- function UserInfoEvent() {
- }
- UserInfoEvent.UserInfoEvent_updateUserData = "UserInfoEvent_updateUserData";
- UserInfoEvent.userinfoEvent_updateroleid = "userinfoEvent_updateroleid";
- UserInfoEvent.userinfoEvent_levelid = "userinfoEvent_levelid";
- UserInfoEvent.updatePlayerInfo = "UserInfoEvent_updatePlayerInfo";
- return UserInfoEvent;
- }());
- exports.UserInfoEvent = UserInfoEvent;
- },{}],37:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Global_1 = require("./Global");
- var PanelResDic_1 = require("./PrefabControl/PanelResDic");
- var DispatcherManager_1 = require("./utils/DispatcherManager");
- var ComponentEventData_1 = require("./Data/ComponentEventData");
- var RecConfigs_1 = require("./Config/RecConfigs");
- var TimesTamper_1 = require("./Time/TimesTamper");
- var AssetPath_1 = require("./Config/AssetPath");
- var TimerService_1 = require("./Time/TimerService");
- var GlobalWaiting_1 = require("./GlobalWaiting");
- var PanelBaseControl_1 = require("./Control/PanelBaseControl");
- var GamePool_1 = require("./PrefabControl/GamePool");
- var LayoutControl_1 = require("./Control/LayoutControl");
- var ViewManager_1 = require("./View/ViewManager");
- var ResourceControl_1 = require("./Control/ResourceControl");
- var ResDataControl_1 = require("./Control/ResDataControl");
- var AudioControl_1 = require("./Control/AudioControl");
- var ConnectControl_1 = require("./Control/ConnectControl");
- var pingtaiutils_1 = require("./WXSDK/pingtaiutils");
- var AgencyLogin_1 = require("./Agency/AgencyLogin");
- var AgencyUserMessage_1 = require("./Agency/AgencyUserMessage");
- var AgencyMain_1 = require("./Agency/AgencyMain");
- var AgencyInGame_1 = require("./Agency/AgencyInGame");
- var AgencySkin_1 = require("./Agency/AgencySkin");
- var AgencyTrial_1 = require("./Agency/AgencyTrial");
- var AgencyLottery_1 = require("./Agency/AgencyLottery");
- /*
- * name;
- */
- var GameContents = /** @class */ (function (_super) {
- __extends(GameContents, _super);
- function GameContents() {
- return _super.call(this) || this;
- }
- /**
- * 初始化游戏
- */
- GameContents.prototype.initGame = function () {
- RecConfigs_1.RecConfigs.Instance.init();
- DispatcherManager_1.DispatcherManager.init();
- TimerService_1.TimerService.Instance.init();
- LayoutControl_1.LayoutControl.Instance.initlayer();
- ViewManager_1.ViewManager.Instance.init();
- ResourceControl_1.ResourceControl.Instance.init();
- ResDataControl_1.ResDataControl.Instance.init();
- AudioControl_1.AudioControl.Instance.init();
- ConnectControl_1.ConnectControl.Connnect();
- TimesTamper_1.TimesTamper.Instance.init();
- pingtaiutils_1.pingtaiutils.Instance.init();
- this.initPoolObject();
- this.initProxy();
- this.initmapView();
- this.beginLoadHandler();
- };
- /**
- * 初始化对象池
- */
- GameContents.prototype.initPoolObject = function () {
- GamePool_1.GamePool.Mark(ComponentEventData_1.ComponentEventData.ResDicValue, ComponentEventData_1.ComponentEventData);
- };
- /**
- * 初始化模块代理类
- */
- GameContents.prototype.initProxy = function () {
- var mvcpool = PanelResDic_1.PanelResDic.Instance;
- mvcpool.AgencyAdd(AgencyLogin_1.AgencyLogin);
- mvcpool.AgencyAdd(AgencyUserMessage_1.AgencyUserMessage);
- mvcpool.AgencyAdd(AgencyMain_1.AgencyMain);
- mvcpool.AgencyAdd(AgencyInGame_1.AgencyInGame);
- mvcpool.AgencyAdd(AgencySkin_1.AgencySkin);
- mvcpool.AgencyAdd(AgencyTrial_1.AgencyTrial);
- mvcpool.AgencyAdd(AgencyLottery_1.AgencyLottery);
- };
- GameContents.prototype.initmapView = function () {
- var mvcpool = PanelResDic_1.PanelResDic.Instance;
- // mvcpool.mapView( MapViewType.DailyrewardView,DailyrewardView );
- };
- GameContents.prototype.beginLoadHandler = function () {
- var patharr = [];
- patharr.push({ url: AssetPath_1.AssetPath.getResConfig(), type: Laya.Loader.JSON });
- patharr.push({ url: AssetPath_1.AssetPath.getGameVersion(), type: Laya.Loader.JSON });
- ResourceControl_1.ResourceControl.Instance.Loaders(patharr, this, this.recloadComplete);
- };
- GameContents.prototype.recloadComplete = function () {
- var gameversion = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getGameVersion(), false);
- if (gameversion) {
- Global_1.Global.gameVersion = gameversion.version;
- }
- else {
- Global_1.Global.gameVersion = "1.0.0";
- }
- var configres = ResDataControl_1.ResDataControl.Instance.GainResources(AssetPath_1.AssetPath.getResConfig(), false);
- RecConfigs_1.RecConfigs.Instance.initRec(configres);
- ResourceControl_1.ResourceControl.Instance.loadGroup("loading", this, this.onPreLoaded, this.onPreprogress);
- };
- GameContents.prototype.onPreprogress = function (value) {
- };
- GameContents.prototype.onPreLoaded = function () {
- ResDataControl_1.ResDataControl.Instance.AddViewPackByName("loading", true, false);
- var globalwaiturl = fairygui.UIPackage.getItemURL("loading", "globalWaiting");
- PanelBaseControl_1.PanelBaseControl.viewbgUrl = fairygui.UIPackage.getItemURL("loading", "img_black");
- fairygui.UIObjectFactory.setPackageItemExtension(globalwaiturl, GlobalWaiting_1.GlobalWaiting);
- fairygui.UIConfig.globalModalWaiting = globalwaiturl;
- fairygui.UIConfig.windowModalWaiting = globalwaiturl;
- // CPAUtils.init();
- this.Login();
- };
- GameContents.prototype.Login = function () {
- PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyLogin_1.AgencyLogin).Login();
- };
- return GameContents;
- }(Laya.EventDispatcher));
- exports.GameContents = GameContents;
- },{"./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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PropManager_1 = require("../PrefabControl/PropManager");
- var GameUtils_1 = require("../utils/GameUtils");
- var GameCFG_1 = require("../CFG/GameCFG");
- var Sprite = Laya.Sprite;
- var TiledMap = Laya.TiledMap;
- var Point = Laya.Point;
- var Rectangle = Laya.Rectangle;
- var Handler = Laya.Handler;
- var CameraManager = /** @class */ (function (_super) {
- __extends(CameraManager, _super);
- function CameraManager() {
- var _this = _super.call(this) || this;
- _this.iscanfollow = false;
- /***************************************************************** */
- _this._upvec = new Laya.Vector3(0, 1, 0);
- _this._index = 0;
- _this._slerpValue = 8;
- _this._lookatVec = new Laya.Vector3;
- return _this;
- }
- CameraManager.prototype.onAwake = function () {
- //获取脚本所属对象
- this.camera = this.owner;
- this._toVec = new Laya.Vector3();
- this.camera.fieldOfView = 90;
- };
- CameraManager.prototype.onStart = function () {
- this._transform = this.camera.transform;
- //旋转摄像机角度
- this._transform.rotate(new Laya.Vector3(0, 0, 0), true, false);
- // this.camera.clearColor = null;
- };
- CameraManager.prototype.createMap = function () {
- this.tiledMap = new TiledMap();
- 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));
- };
- CameraManager.prototype.onStageClick = function () {
- var p = new Point(0, 0);
- this.layer.getTilePositionByScreenPos(Laya.stage.mouseX, Laya.stage.mouseY, p);
- this.layer.getScreenPositionByTilePos(Math.floor(p.x), Math.floor(p.y), p);
- this.sprite.pos(p.x, p.y);
- };
- CameraManager.prototype.mapLoaded = function () {
- this.layer = this.tiledMap.getLayerByIndex(0);
- var radiusX = 32;
- var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
- var color = "#FF7F50";
- this.sprite = new Sprite();
- this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
- this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
- this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
- this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
- Laya.stage.addChild(this.sprite);
- };
- CameraManager.prototype.onUpdate = function () {
- if (this.iscanfollow) {
- if (PropManager_1.PropManager.iscarmanpc) {
- if (PropManager_1.PropManager.npcDict["npc_0"]) {
- Laya.Vector3.add(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._disVector, this._toVec);
- this._transform.position = this._toVec;
- this._transform.position.x = PropManager_1.PropManager.npcDict["npc_0"].transform.position.x;
- this._transform.lookAt(PropManager_1.PropManager.npcDict["npc_0"].transform.position, this._upvec);
- }
- }
- else {
- if (PropManager_1.PropManager.mainRole) {
- Laya.Vector3.add(PropManager_1.PropManager.mainRole.transform.position, this._disVector, this._toVec);
- // this._toVec.x = PropManager.mainRole.transform.position.x;
- // this._transform.position = this._toVec;
- // this._transform.lookAt( PropManager.mainRole.transform.position,this._upvec );
- Laya.Vector3.lerp(this._transform.position, this._toVec, 16 / 1000 * this._slerpValue, this._toVec);
- // this._toVec.z = PropManager.mainRole.transform.position.z+this._disVector.z;
- // this._toVec.y = PropManager.mainRole.transform.position.y + this._disVector.y;
- this._transform.position = this._toVec;
- this._lookatVec.x = this._toVec.x;
- this._lookatVec.y = PropManager_1.PropManager.mainRole.transform.position.y;
- this._lookatVec.z = PropManager_1.PropManager.mainRole.transform.position.z;
- this._transform.lookAt(this._lookatVec, this._upvec);
- }
- }
- }
- };
- CameraManager.prototype.GameEndRotate = function (targetPos, speed) {
- this.iscanfollow = false;
- this._transform.translate(speed, false);
- this._transform.lookAt(targetPos, this._upvec);
- };
- CameraManager.prototype.SetCameraPosition = function (vec) {
- var valueArr = GameUtils_1.GameUtils.cutstrtoArr(GameCFG_1.default.dict[1].value);
- this._disVector = new Laya.Vector3(Number(valueArr[0]), Number(valueArr[1]), Number(valueArr[2]));
- Laya.Vector3.add(vec, this._disVector, this._toVec);
- this.camera.transform.position = this._toVec;
- this.camera.transform.position.x = vec.x;
- // this.camera.transform.lookAt( vec,new Laya.Vector3( 0,1,0 ) );
- };
- return CameraManager;
- }(Laya.Script3D));
- exports.CameraManager = CameraManager;
- },{"../CFG/GameCFG":10,"../PrefabControl/PropManager":49,"../utils/GameUtils":87}],39:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var TimerService_1 = require("../Time/TimerService");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var CharacterState_1 = require("../PrefabControl/CharacterState");
- var BuildCFG_1 = require("../CFG/BuildCFG");
- var CameraManager_1 = require("./CameraManager");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- var GameUtils_1 = require("../utils/GameUtils");
- var AssetManager_1 = require("../Control/AssetManager");
- var PoolManager_1 = require("../Control/PoolManager");
- var NpcScript = /** @class */ (function (_super) {
- __extends(NpcScript, _super);
- function NpcScript() {
- var _this = _super.call(this) || this;
- _this._nowAction = "";
- _this.resouseName = "";
- _this._shangpaVec = new Laya.Vector3;
- /**是否发生碰撞 */
- _this.haveCollision = false;
- _this._TargetCollision = "";
- _this._normalizeVec = new Laya.Vector3;
- _this.staybuild = "";
- _this.stayscene = "";
- /**
- * 0:未锁,1:锁左边,2:锁右边
- */
- _this._lockxstate = 0;
- /**
- * 状态,0:等待状态,1:开始状态,2:完成状态
- */
- _this._nowRoleState = 0;
- _this.movespeed = 0;
- _this.frontjumpspeed = new Laya.Vector3;
- _this.leftjumpspeed = new Laya.Vector3;
- _this.rightjumpspeed = new Laya.Vector3;
- _this.climbspeed = 0;
- _this.sideclimbspeed = new Laya.Vector3;
- _this._lockbyBuildname = "";
- /**
- * 0:未被锁,1:锁定左边,2:锁定右边,
- */
- _this._lockstate = 0;
- _this.LastAction = "";
- _this._moveTime = 0;
- _this._chixuTime = 0;
- _this._isActionNums = false;
- _this._isneedactionnum = 0;
- _this._needactiontime = 0;
- _this.NowLastActionState = "";
- _this._moveVec = new Laya.Vector3;
- _this.jumpSpeed = new Laya.Vector3;
- _this.jumpHight = 0;
- _this._disy = 0;
- _this.Gravity_g = 10; //重力加速度
- _this._checktime = 0;
- _this._ending = false;
- _this._endAnmoSpeed = new Laya.Vector3();
- _this._endanmotime = 1;
- _this._endAnmoSpeed1 = new Laya.Vector3;
- _this._changeMoveX = 0;
- _this.HaveForceJump = false;
- _this.quaternion = new Laya.Quaternion;
- return _this;
- }
- NpcScript.prototype.onAwake = function () {
- this._animator = this.owner.getComponent(Laya.Animator);
- PropManager_1.PropManager.setAnimator(this._animator);
- };
- NpcScript.prototype.onStart = function () {
- this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
- this._transform = this.owner.transform;
- var sp = this.owner;
- // (sp.getChildByName("lefttrail") as Laya.TrailSprite3D).active = false;
- // (sp.getChildByName("righttrail") as Laya.TrailSprite3D ).active = false;
- var LeftTrial1 = sp.getChildByName("lefttrail");
- var RightTrial1 = sp.getChildByName("righttrail");
- console.log();
- var scale = 0.001;
- var index = GameUtils_1.GameUtils.randRangeint(0, AssetManager_1.AssetManager.AllMapDic.length - 1);
- index = index % AssetManager_1.AssetManager.AllMapDic.length;
- var prefabs = AssetManager_1.AssetManager.AllMapDic[index];
- this.LeftTrial = PoolManager_1.default.GetSprite3D(prefabs);
- LeftTrial1.parent.addChild(this.LeftTrial);
- this.LeftTrial.transform.localPosition = LeftTrial1.transform.localPosition.clone();
- this.LeftTrial.transform.localRotationEuler = LeftTrial1.transform.localRotationEuler.clone();
- this.LeftTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
- this.RightTrial = PoolManager_1.default.GetSprite3D(prefabs);
- RightTrial1.parent.addChild(this.RightTrial);
- this.RightTrial.transform.localPosition = RightTrial1.transform.localPosition.clone();
- this.RightTrial.transform.localRotationEuler = RightTrial1.transform.localRotationEuler.clone();
- this.RightTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
- RightTrial1.active = false;
- LeftTrial1.active = false;
- console.log(sp.name);
- };
- NpcScript.prototype.startRun = function () {
- if (this._nowNpcinfo.gravity) {
- this.Gravity_g = this._nowNpcinfo.gravity;
- }
- else {
- this.Gravity_g = 10;
- }
- this._checktime = 500;
- this._nowRoleState = 1;
- this._ending = false;
- this._changeMoveX = 0;
- this._initPosVec = this._transform.position.clone();
- this.staybuild = "";
- this.stayscene = "";
- this._nowAction = CharacterState_1.CharacterState.stand;
- this.nowAction = CharacterState_1.CharacterState.run;
- this._speedMoveV3.x = 0;
- this._speedMoveV3.y = 0;
- this._speedMoveV3.z = -this.movespeed;
- this._iscanMove = true;
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- };
- NpcScript.prototype.npcinfo = function (cfg) {
- this._nowNpcinfo = cfg;
- this.movespeed = this._nowNpcinfo.speed;
- this.climbspeed = Number(this._nowNpcinfo.upclimb);
- this.frontjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.frontjump.x), Number(this._nowNpcinfo.frontjump.y), Number(this._nowNpcinfo.frontjump.z));
- this.leftjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.leftjump.x), Number(this._nowNpcinfo.leftjump.y), Number(this._nowNpcinfo.leftjump.z));
- this.rightjumpspeed = new Laya.Vector3(Number(this._nowNpcinfo.rightjump.x), Number(this._nowNpcinfo.rightjump.y), Number(this._nowNpcinfo.rightjump.z));
- this.sideclimbspeed = new Laya.Vector3(Number(this._nowNpcinfo.slideclimb.x), Number(this._nowNpcinfo.slideclimb.y), Number(this._nowNpcinfo.slideclimb.z));
- // this.frontjump.x = Number( this._nowNpcinfo.frontjump.x );
- // this.frontjump.y = Number( this._nowNpcinfo.frontjump.y );
- // this.frontjump.z = Number( this._nowNpcinfo.frontjump.z );
- // this.leftjump.x = Number( this._nowNpcinfo.leftjump.x );
- // this.leftjump.y = Number( this._nowNpcinfo.leftjump.y );
- // this.leftjump.z = Number( this._nowNpcinfo.leftjump.z );
- // this.rightjump.x = Number( this._nowNpcinfo.rightjump.x );
- // this.rightjump.y = Number( this._nowNpcinfo.rightjump.y );
- // this.rightjump.z = Number( this._nowNpcinfo.rightjump.z );
- // this.upclimb = Number( this._nowNpcinfo.upclimb );
- // this.slideclimb.x = Number( this._nowNpcinfo.slideclimb.x );
- // this.slideclimb.y = Number( this._nowNpcinfo.slideclimb.y );
- // this.slideclimb.z = Number( this._nowNpcinfo.slideclimb.z );
- };
- /**
- * 开始碰撞时执行
- */
- NpcScript.prototype.onCollisionEnter = function (collision) {
- if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
- var contactPoint = collision.contacts[0];
- this.Calculate(contactPoint.normal, collision.other.owner);
- }
- };
- NpcScript.prototype.setnowSelectVec = function (pos) {
- this._nowselectVec = pos;
- };
- NpcScript.prototype.Calculate = function (normal, target) {
- if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
- return;
- }
- this._TargetCollision = target.name;
- var n = new Laya.Vector3;
- Laya.Vector3.normalize(normal, this._normalizeVec);
- if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
- this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
- {
- if (this._TargetCollision.indexOf("build") != -1) {
- this.staybuild = this._TargetCollision;
- this.stayscene = target.parent.parent.name;
- }
- if (this._TargetCollision.indexOf("irongauze") != -1) {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
- }
- else {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
- }
- if (this._normalizeVec.z == -1) //上爬
- {
- if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.1)) {
- this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.climbup;
- this._shangpaVec = this._nowselectVec.clone();
- }
- }
- else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- else if (this._normalizeVec.x == -1) {
- if (this.nowAction == CharacterState_1.CharacterState.run) {
- this._lockxstate = 1;
- }
- else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
- this._lockxstate = 1;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.climbleft;
- }
- }
- else if (this._normalizeVec.x == 1) {
- if (this.nowAction == CharacterState_1.CharacterState.run) {
- this._lockxstate = 2;
- }
- else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
- this._lockxstate = 2;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.climbright;
- }
- }
- else {
- if (this._normalizeVec.z != 1) {
- this.nowAction = CharacterState_1.CharacterState.climbupblock;
- this._shangpaVec = this._nowselectVec.clone();
- }
- }
- }
- else if (this._TargetCollision.indexOf("panel_jump") != -1) //加速板跳跃
- {
- this.nowAction = CharacterState_1.CharacterState.speedupjump;
- // this.setJump( this.nowAction );
- }
- else if (this._TargetCollision.indexOf("panel_downslip") != -1) {
- this.nowAction = CharacterState_1.CharacterState.downmove;
- // this.setJump( this.nowAction );
- }
- else if (this._TargetCollision.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
- if (this._normalizeVec.z == -1) //上爬
- {
- this.nowAction = CharacterState_1.CharacterState.climbup;
- this._shangpaVec = this._nowselectVec.clone();
- }
- }
- else if (this._TargetCollision.indexOf("box_sidejump") != -1) {
- this.nowAction = CharacterState_1.CharacterState.sidespeedup;
- // this.setJump( this.nowAction );
- }
- else if (this._TargetCollision.indexOf("box_Surmount") != -1) {
- this.nowAction = CharacterState_1.CharacterState.cross;
- // this.setJump( this.nowAction );
- }
- else if (this._TargetCollision.indexOf("irongauze") != -1) {
- this.nowAction = CharacterState_1.CharacterState.climbup;
- this._shangpaVec = this._nowselectVec.clone();
- }
- };
- /**
- * 持续碰撞时执行
- */
- NpcScript.prototype.onCollisionStay = function (collision) {
- // Debuger.log( "碰撞中" );
- if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
- this.haveCollision = true;
- var contactPoint = collision.contacts[0];
- var target = collision.other.owner;
- var targetname = target.name;
- if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1 && targetname.indexOf("role") == -1) {
- this._TargetCollision = targetname;
- }
- if (this._TargetCollision.indexOf("build") != -1 || this._TargetCollision.indexOf("Scaffolding") != -1 ||
- this._TargetCollision.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
- {
- if (this._TargetCollision.indexOf("build") != -1) {
- this.staybuild = this._TargetCollision;
- this.stayscene = target.parent.parent.name;
- }
- if (this._TargetCollision.indexOf("irongauze") != -1) {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
- }
- else {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._TargetCollision);
- }
- }
- }
- };
- /**
- * 结束碰撞时执行
- */
- NpcScript.prototype.onCollisionExit = function (collision) {
- this.haveCollision = false;
- if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
- var contactPoint = collision.contacts[0];
- this.CheckEnd(contactPoint.normal, collision.other.owner);
- }
- };
- NpcScript.prototype.CheckEnd = function (normal, target) {
- if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1 || target.name.indexOf("role") != -1) {
- return;
- }
- if (this.HaveForceJump) {
- this.HaveForceJump = false;
- return;
- }
- if (this._lockxstate) {
- this._lockxstate = 0;
- return;
- }
- if (this._TargetCollision != target.name) {
- return;
- }
- if (target.name.indexOf("panel_jump") != -1) {
- return;
- }
- switch (this.nowAction) {
- case CharacterState_1.CharacterState.climbup:
- case CharacterState_1.CharacterState.climbupblock:
- if (this._TargetCollision.indexOf("box_Board") != -1) {
- this.JumpAction(this._changeMoveX);
- }
- else {
- if (this._changeMoveX > 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- }
- else if (this._changeMoveX < 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- }
- }
- break;
- case CharacterState_1.CharacterState.climbright:
- case CharacterState_1.CharacterState.climbleft:
- this.JumpAction(this._changeMoveX);
- break;
- case CharacterState_1.CharacterState.run:
- this.JumpAction(this._changeMoveX);
- break;
- case CharacterState_1.CharacterState.MoveX:
- this.JumpAction(this._speedMoveV3.x);
- break;
- }
- };
- NpcScript.prototype.JumpAction = function (value, isquanzhong) {
- if (isquanzhong === void 0) { isquanzhong = false; }
- if (value > 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- }
- else if (value < 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- }
- else {
- if (isquanzhong) {
- if (this._TargetCollision.indexOf("build") != -1) {
- var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
- var allvalue = 0;
- var sort;
- var selectdir = "";
- if (this._TargetCollision.indexOf("leftright") != -1) {
- allvalue = this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
- sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
- if (sort <= this._nowNpcinfo.jump_left) {
- selectdir = "left";
- }
- else {
- selectdir = "right";
- }
- }
- else if (this._TargetCollision.indexOf("frontright") != -1) {
- allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_right;
- sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
- if (sort <= this._nowNpcinfo.start_ahead) {
- selectdir = "front";
- }
- else {
- selectdir = "right";
- }
- }
- else if (this._TargetCollision.indexOf("frontleft") != -1) {
- allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left;
- sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
- if (sort <= this._nowNpcinfo.start_ahead) {
- selectdir = "front";
- }
- else {
- selectdir = "left";
- }
- }
- else if (this._TargetCollision.indexOf("right") != -1) {
- selectdir = "right";
- }
- else if (this._TargetCollision.indexOf("left") != -1) {
- selectdir = "left";
- }
- else if (this._TargetCollision.indexOf("front") != -1) {
- selectdir = "front";
- }
- else {
- allvalue = this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left + this._nowNpcinfo.jump_right;
- sort = GameUtils_1.GameUtils.randRangeint(0, allvalue);
- if (sort <= this._nowNpcinfo.start_ahead) {
- selectdir = "front";
- }
- else if (sort <= this._nowNpcinfo.start_ahead + this._nowNpcinfo.jump_left) {
- selectdir = "left";
- }
- else {
- selectdir = "right";
- }
- }
- switch (selectdir) {
- case "left":
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- break;
- case "right":
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- break;
- case "front":
- this.nowAction = CharacterState_1.CharacterState.jump;
- break;
- default:
- this.nowAction = CharacterState_1.CharacterState.jump;
- break;
- }
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.jump;
- }
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.jump;
- }
- }
- };
- Object.defineProperty(NpcScript.prototype, "nowAction", {
- get: function () {
- return this._nowAction;
- },
- set: function (value) {
- if (this._nowRoleState == 1) {
- if (this._nowAction != value || this.LastAction == CharacterState_1.CharacterState.speedupjump || this.LastAction == CharacterState_1.CharacterState.jumpright) {
- this.LastAction = this._nowAction;
- this._nowAction = value;
- this._moveTime = 0;
- switch (this._nowAction) {
- case CharacterState_1.CharacterState.stand:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.stand);
- break;
- case CharacterState_1.CharacterState.run:
- if (this.LastAction == CharacterState_1.CharacterState.jump || this.LastAction == CharacterState_1.CharacterState.jumpleft || this.LastAction == CharacterState_1.CharacterState.jumpright) {
- this._isActionNums = true;
- this._isneedactionnum = 1;
- var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
- if (sort < 50) {
- this.PlayAnimator(CharacterState_1.CharacterState.land1);
- }
- else {
- this.PlayAnimator(CharacterState_1.CharacterState.land2);
- }
- }
- else {
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- }
- break;
- case CharacterState_1.CharacterState.jump:
- this.PlayAnimator(CharacterState_1.CharacterState.jump);
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.jumpSpeed.x = this.frontjumpspeed.x;
- this.jumpSpeed.y = this.frontjumpspeed.y;
- this.jumpSpeed.z = this.frontjumpspeed.z;
- break;
- case CharacterState_1.CharacterState.jumpleft:
- this.jumpSpeed = this.leftjumpspeed;
- // this.jumpSpeed.x = this.leftjumpspeed.x;
- // this.jumpSpeed.y = this.leftjumpspeed.y;
- // this.jumpSpeed.z = this.leftjumpspeed.z;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
- break;
- case CharacterState_1.CharacterState.jumpright:
- this.jumpSpeed = this.rightjumpspeed;
- // this.jumpSpeed.x = this.rightjumpspeed.x;
- // this.jumpSpeed.y = this.rightjumpspeed.y;
- // this.jumpSpeed.z = this.rightjumpspeed.z;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
- break;
- case CharacterState_1.CharacterState.speedupjump:
- var buildcfg = BuildCFG_1.default.dict["panel_jump"];
- this.jumpSpeed.x = buildcfg.buffx;
- this.jumpSpeed.y = buildcfg.buffy;
- if (this.LastAction == CharacterState_1.CharacterState.speedupjump) {
- this.jumpSpeed.z = this.jumpSpeed.z * buildcfg.buffz;
- }
- else {
- this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
- }
- if (this.NowLastActionState == value) {
- this.jumpSpeed.y = buildcfg.buffy * 2;
- }
- else {
- this.jumpSpeed.y = buildcfg.buffy;
- }
- this._isActionNums = true;
- this._isneedactionnum = 1;
- var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
- if (sort < 50) {
- this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
- }
- else {
- this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
- }
- break;
- case CharacterState_1.CharacterState.downmove:
- var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
- this.jumpSpeed.x = buildcfg.buffx;
- this.jumpSpeed.y = buildcfg.buffy;
- this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
- this._chixuTime = buildcfg.time;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.huachan);
- break;
- case CharacterState_1.CharacterState.cross:
- var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
- this.jumpSpeed.x = buildcfg.buffx;
- this.jumpSpeed.y = buildcfg.buffy + 0.5;
- this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz;
- this._chixuTime = buildcfg.time;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
- break;
- case CharacterState_1.CharacterState.climbup:
- case CharacterState_1.CharacterState.climbupblock:
- this.jumpSpeed.x = 0;
- this.jumpSpeed.y = this.climbspeed;
- this.jumpSpeed.z = 0;
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
- break;
- case CharacterState_1.CharacterState.climbleft:
- this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z);
- // this.jumpSpeed.x = 0;
- // this.jumpSpeed.y = this.sideclimbspeed.y;
- // this.jumpSpeed.z = this.sideclimbspeed.z;
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.runwallleft);
- break;
- case CharacterState_1.CharacterState.climbright:
- this.jumpSpeed = new Laya.Vector3(0, this.sideclimbspeed.y, this.sideclimbspeed.z);
- // this.jumpSpeed.x = 0;
- // this.jumpSpeed.y = this.sideclimbspeed.y;
- // this.jumpSpeed.z = this.sideclimbspeed.z;
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
- break;
- case CharacterState_1.CharacterState.ClimbMotion:
- this._isActionNums = true;
- this._isneedactionnum = 0;
- this._needactiontime = 0.3;
- this._moveTime = 0;
- this.PlayAnimator(CharacterState_1.CharacterState.climbend);
- break;
- }
- this.NowLastActionState = value;
- }
- }
- },
- enumerable: true,
- configurable: true
- });
- NpcScript.prototype.update = function (dt) {
- if (this._nowRoleState == 1) {
- dt = 16;
- this._checktime += dt;
- if (PropManager_1.PropManager.iscarmanpc) {
- }
- else {
- if (this._checktime >= 500) {
- this._checktime = 0;
- if (this._nowNpcinfo && PropManager_1.PropManager.mainRole) {
- if (this._transform.position.z + this._nowNpcinfo.distance < PropManager_1.PropManager.mainRole.transform.position.z) {
- this._iscanMove = false;
- }
- else {
- this._iscanMove = true;
- }
- }
- }
- }
- if (this._iscanMove) {
- var distime = dt / 1000;
- this._moveTime += distime;
- switch (this.nowAction) {
- case CharacterState_1.CharacterState.run: //跑动
- this._moveVec.y = 0;
- this._moveVec.z = distime * this._speedMoveV3.z;
- if (this._lockxstate == 0) {
- this._moveVec.x = this._changeMoveX * distime;
- }
- else if (this._lockxstate == 1) {
- if (this._changeMoveX < 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- else if (this._lockxstate == 2) {
- if (this._changeMoveX > 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.climbup: //爬升
- this._moveVec.z = 0;
- this._moveVec.y = distime * this.jumpSpeed.y;
- if (this._lockxstate == 1) {
- if (this._changeMoveX < 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- else if (this._lockstate == 2) {
- if (this._changeMoveX > 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- this._transform.translate(this._moveVec, false);
- if (this._shangpaVec) {
- if (this._transform.position.y + 1 > this._shangpaVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- }
- else if (this._nowselectVec) {
- if (this._transform.position.y + 1 > this._nowselectVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- }
- break;
- case CharacterState_1.CharacterState.climbupblock:
- this._moveVec.z = 0;
- this._moveVec.y = distime * this.jumpSpeed.y;
- this._moveVec.x = 0;
- this._transform.translate(this._moveVec, false);
- if (this._shangpaVec) {
- if (this._transform.position.y + 1 > this._shangpaVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- }
- else if (this._transform.position.y + 1 > this._nowselectVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- break;
- case CharacterState_1.CharacterState.jump: //跳跃
- case CharacterState_1.CharacterState.jumpleft:
- case CharacterState_1.CharacterState.jumpright:
- this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
- this.jumpSpeed.y = this._disy;
- this._moveVec.x = this.jumpSpeed.x * distime;
- this._moveVec.y = this._disy * distime;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.speedupjump:
- this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
- this.jumpSpeed.y = this._disy;
- this._moveVec.x = this.jumpSpeed.x * distime;
- this._moveVec.y = this._disy * distime;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.climbleft:
- case CharacterState_1.CharacterState.climbright:
- this._moveVec.z = distime * this.jumpSpeed.y;
- this._moveVec.y = this.jumpSpeed.y * distime;
- this._moveVec.x = 0;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.MoveX:
- this._moveVec.z = distime * this._speedMoveV3.z;
- this._moveVec.x = this._speedMoveV3.x * distime;
- this._transform.translate(this._moveVec, false);
- if (this._moveTime > 0.1) {
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- break;
- case CharacterState_1.CharacterState.downmove:
- this._moveVec.y = this.jumpSpeed.x;
- this._moveVec.x = this.jumpSpeed.y;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- if (this._moveTime > this._chixuTime) {
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- break;
- case CharacterState_1.CharacterState.sidespeedup:
- this._moveVec.y = 0;
- this._moveVec.x = 0;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- if (this._moveTime > this._chixuTime && this.LastAction == CharacterState_1.CharacterState.climbleft || this.LastAction == CharacterState_1.CharacterState.climbright) {
- this.nowAction = this.LastAction;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.jump;
- // this.setJump( this.nowAction );
- }
- break;
- case CharacterState_1.CharacterState.cross:
- this._disy = this.jumpSpeed.y - this.Gravity_g * distime;
- this.jumpSpeed.y = this._disy;
- this._moveVec.x = this.jumpSpeed.x * distime;
- this._moveVec.y = this._disy * distime;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.ClimbMotion:
- if (this._nowselectVec) {
- if (this._transform.position.y < this._nowselectVec.y) {
- this._moveVec.x = 0;
- this._moveVec.y = (1 / 0.3) * distime;
- this._moveVec.z = 0;
- this._transform.translate(this._moveVec, false);
- }
- }
- break;
- }
- if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this.haveCollision) {
- if (this._transform.position.z <= this._nowselectVec.z) {
- if (this._changeMoveX > 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- }
- else if (this._changeMoveX < 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.jump;
- }
- }
- }
- if (this._transform.position.y < PropManager_1.PropManager.diePosY) //角色死亡
- {
- if (this.stayscene == "" || this.staybuild == "") {
- this._transform.position = this._initPosVec.clone();
- }
- else {
- this._transform.position = PropManager_1.PropManager.getPosVecbyScene(this.stayscene, this.staybuild).clone();
- }
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) {
- this.Win();
- }
- if (this._isActionNums) {
- //如果当前播放state已经播放完了一次
- if (this._isneedactionnum > 0) {
- if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
- switch (this._nowActionName) {
- case CharacterState_1.CharacterState.jump:
- case CharacterState_1.CharacterState.leftjump:
- case CharacterState_1.CharacterState.rightjump:
- case CharacterState_1.CharacterState.highjump1:
- case CharacterState_1.CharacterState.highjump2:
- case CharacterState_1.CharacterState.hurdle:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.sky);
- break;
- case CharacterState_1.CharacterState.huachan:
- case CharacterState_1.CharacterState.climbend:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- this.nowAction = CharacterState_1.CharacterState.run;
- this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
- break;
- case CharacterState_1.CharacterState.land1:
- case CharacterState_1.CharacterState.land2:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- break;
- }
- }
- }
- else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
- switch (this._nowActionName) {
- case CharacterState_1.CharacterState.jump:
- case CharacterState_1.CharacterState.leftjump:
- case CharacterState_1.CharacterState.rightjump:
- case CharacterState_1.CharacterState.highjump1:
- case CharacterState_1.CharacterState.highjump2:
- case CharacterState_1.CharacterState.hurdle:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.sky);
- break;
- case CharacterState_1.CharacterState.huachan:
- case CharacterState_1.CharacterState.climbend:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- this.nowAction = CharacterState_1.CharacterState.run;
- this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
- break;
- }
- }
- }
- }
- else {
- if (this._ending) {
- var distime = dt / 1000;
- this._moveTime += distime;
- if (this._moveTime >= this._endanmotime) {
- this.GameOver();
- }
- else {
- this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
- this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
- this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
- PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
- }
- }
- }
- }
- };
- NpcScript.prototype.GameOver = function () {
- this._ending = false;
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
- };
- NpcScript.prototype.Win = function () {
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- this._nowRoleState = 2;
- this.PlayAnimator(CharacterState_1.CharacterState.sky);
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.npcend, this.owner.name);
- };
- NpcScript.prototype.stop = function () {
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- };
- NpcScript.prototype.destroy = function () {
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- _super.prototype.destroy.call(this);
- };
- NpcScript.prototype.Joy = function (value, angle) {
- if (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
- this._changeMoveX = value;
- }
- if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
- {
- this.HaveForceJump = true;
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- }
- else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
- this.HaveForceJump = true;
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- }
- if (this.nowAction == CharacterState_1.CharacterState.jump ||
- this.nowAction == CharacterState_1.CharacterState.jumpleft ||
- this.nowAction == CharacterState_1.CharacterState.jumpright ||
- this.nowAction == CharacterState_1.CharacterState.speedupjump)
- angle = -angle * Math.PI / 180;
- Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
- Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
- };
- NpcScript.prototype.PlayAnimator = function (actionName) {
- // this._nowActionName = actionName;
- var _actionname = this.TransitionActionName(actionName);
- this._nowActionName = actionName;
- if (this._animator) {
- if (this._nowActionName == CharacterState_1.CharacterState.climbend) {
- this._animator.speed = 1.5;
- }
- else {
- this._animator.speed = 1;
- }
- this._animator.play(_actionname, 0, 0);
- }
- };
- /**转换动作名称 */
- NpcScript.prototype.TransitionActionName = function (_actionname) {
- switch (_actionname) {
- case "rollover1":
- return "cefan1";
- case "rollover2":
- return "cefan2";
- case "runwallleft":
- return "paoqiangleft";
- case "rightjump":
- return "rightjump";
- case "runwallright":
- return "paoqiangright";
- case "leftjump":
- return "leftjump";
- case "climbwall":
- return "paqiang";
- case "climbend":
- return "climbend";
- case "stand":
- return "stand";
- case "sky":
- return "kongzhong";
- case "land1":
- return "luodi1";
- case "land2":
- return "luodi2";
- case "highjump1":
- return "datiao1";
- case "highjump2":
- return "datiao2";
- case "run":
- return "run";
- case "jump":
- return "jump";
- case "climbup":
- return "Climb";
- case "falldown":
- return "Freefalling";
- case "climbleft":
- return "left_climb";
- case "climbright":
- return "right_climb";
- case "jumpright":
- return "right_jump";
- case "jumpleft":
- return "left_jump";
- case "ClimbMotion":
- return "PlayPalouAction";
- case "huachan":
- return "huachan";
- case "hurdle":
- return "kualan";
- case "speedupjump":
- return "jiasuJump";
- case "MoveX":
- return "xshunyi";
- case "downmove":
- return "downSlide";
- case "sidespeedup":
- return "slidejiasu";
- case "cross":
- return "surmount";
- case "climbupblock":
- return "lockclimb";
- }
- };
- NpcScript.prototype.TestJump = function () {
- this.nowAction = CharacterState_1.CharacterState.jump;
- };
- NpcScript.prototype.getPostion = function () {
- return this._transform.position;
- };
- NpcScript.prototype.getAction = function () {
- return this._nowRoleState;
- };
- NpcScript.prototype.onDestroy = function () {
- console.log("拖尾回收成功----");
- PoolManager_1.default.RecoverSprite3D(this.LeftTrial);
- PoolManager_1.default.RecoverSprite3D(this.RightTrial);
- };
- return NpcScript;
- }(Laya.Script3D));
- exports.NpcScript = NpcScript;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var TimerService_1 = require("../Time/TimerService");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var CharacterState_1 = require("../PrefabControl/CharacterState");
- var PanelResDic_1 = require("../PrefabControl/PanelResDic");
- var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
- var BuildCFG_1 = require("../CFG/BuildCFG");
- var CameraManager_1 = require("./CameraManager");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- var GameUtils_1 = require("../utils/GameUtils");
- var GameStateControl_1 = require("../Control/GameStateControl");
- var AudioControl_1 = require("../Control/AudioControl");
- var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var AssetManager_1 = require("../Control/AssetManager");
- var PoolManager_1 = require("../Control/PoolManager");
- var Player = /** @class */ (function (_super) {
- __extends(Player, _super);
- function Player() {
- var _this = _super.call(this) || this;
- _this._isActionNums = false;
- _this._isneedactionnum = 0;
- _this._needactiontime = 0;
- _this._nowActionState = "";
- _this._multiple = new Laya.Vector3(1, 1, 1);
- _this.LastActionState = "";
- _this._moveTime = 0;
- /**
- * 加速buffvec
- */
- _this._lastjiasuState = "";
- _this.buff_speeduptime = 0;
- _this.canshake = false;
- _this.shaketime = 0;
- _this.doublespeedup = false;
- _this.resouseName = "";
- _this._isColling = false;
- _this._nowCollTargetName = "";
- _this._normalizeVec = new Laya.Vector3;
- _this._nowbuildname = "";
- _this._nowscenename = "";
- /**
- * 0:未锁,1:锁左边,2:锁右边
- */
- _this._lockxstate = 0;
- _this._lockbyBuildname = "";
- /**
- * 0:未被锁,1:锁定左边,2:锁定右边,
- */
- _this._lockstate = 0;
- _this._shangpaVec = new Laya.Vector3;
- _this.NowLastActionState = "";
- _this._moveVec = new Laya.Vector3;
- _this.jumpSpeed = new Laya.Vector3;
- _this.jumpHight = 0;
- _this._disy = 0;
- _this.g = 10; //重力加速度
- _this._ending = false;
- _this._endAnmoSpeed = new Laya.Vector3();
- _this._endanmotime = 1;
- _this._endAnmoSpeed1 = new Laya.Vector3;
- _this._changeMoveX = 0;
- _this.isforceJump = false;
- _this.quaternion = new Laya.Quaternion;
- Player.ins = _this;
- return _this;
- }
- Object.defineProperty(Player, "Instance", {
- get: function () {
- if (Player.ins == null) {
- return new Player();
- }
- return Player.ins;
- },
- enumerable: true,
- configurable: true
- });
- Player.prototype.onAwake = function () {
- this._animator = this.owner.getComponent(Laya.Animator);
- PropManager_1.PropManager.setAnimator(this._animator);
- this._speedMoveV3 = new Laya.Vector3(0, 0, 0);
- var sp = this.owner;
- this._transform = sp.transform;
- this._RoleData = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencyUserMessage_1.AgencyUserMessage).RoleData;
- sp.getComponent(Laya.Rigidbody3D).ccdMotionThreshold = 0.001;
- var LeftTrial1 = sp.getChildByName("lefttrail");
- var RightTrial1 = sp.getChildByName("righttrail");
- // this.LeftTrial = sp.getChildByName("lefttrail") as Laya.TrailSprite3D;
- // this.RightTrial = sp.getChildByName("righttrail") as Laya.TrailSprite3D;
- var scale = 0.001;
- var index = GameUtils_1.GameUtils.randRangeint(0, AssetManager_1.AssetManager.AllMapDic.length - 1);
- index = index % AssetManager_1.AssetManager.AllMapDic.length;
- var prefabs = AssetManager_1.AssetManager.AllMapDic[index];
- this.LeftTrial = PoolManager_1.default.GetSprite3D(prefabs);
- LeftTrial1.parent.addChild(this.LeftTrial);
- this.LeftTrial.transform.localPosition = LeftTrial1.transform.localPosition.clone();
- this.LeftTrial.transform.localRotationEuler = LeftTrial1.transform.localRotationEuler.clone();
- this.LeftTrial.transform.localScale = LeftTrial1.transform.localScale.clone();
- this.LeftTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
- this.RightTrial = PoolManager_1.default.GetSprite3D(prefabs);
- RightTrial1.parent.addChild(this.RightTrial);
- this.RightTrial.transform.localPosition = RightTrial1.transform.localPosition.clone();
- this.RightTrial.transform.localRotationEuler = RightTrial1.transform.localRotationEuler.clone();
- this.RightTrial.transform.localScale = new Laya.Vector3(scale, scale, scale);
- RightTrial1.active = false;
- LeftTrial1.active = false;
- };
- Player.prototype.startRun = function (jiasu) {
- var _this = this;
- if (this._RoleData.roleCfg.gravity) {
- this.g = this._RoleData.roleCfg.gravity;
- }
- else {
- this.g = 10;
- }
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = 1;
- this.buff_speeduptime = 0;
- this.doublespeedup = false;
- this._lastjiasuState = "";
- this._ending = false;
- this._changeMoveX = 0;
- this._initPosVec = this._transform.position.clone();
- console.log("玩家的初始位置----", this._initPosVec);
- this._nowbuildname = "";
- this._nowscenename = "";
- this.nowAction = CharacterState_1.CharacterState.run;
- this._speedMoveV3.x = 0;
- this._speedMoveV3.y = 0;
- if (jiasu) {
- this._speedMoveV3.z = -this._RoleData.movespeed * 2;
- Laya.timer.once(3000, this, function () {
- _this._speedMoveV3.z = -_this._RoleData.movespeed;
- });
- }
- else {
- this._speedMoveV3.z = -this._RoleData.movespeed;
- }
- this._iscanMove = true;
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- };
- // private pzdict:any = {};
- // private pzarr:Array<any> = [];
- /**
- * 开始碰撞时执行
- */
- Player.prototype.onCollisionEnter = function (collision) {
- if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
- var contactPoint = collision.contacts[0];
- this.Calculate(contactPoint.normal, collision.other.owner, contactPoint.positionOnB);
- }
- };
- /**
- * 持续碰撞时执行
- */
- Player.prototype.onCollisionStay = function (collision) {
- // Debuger.log( "碰撞中" );
- if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
- this._isColling = true;
- var contactPoint = collision.contacts[0];
- var target = collision.other.owner;
- var targetname = target.name;
- if (targetname != "SliderBoost" && targetname.indexOf("npc") == -1) {
- this._nowCollTargetName = targetname;
- }
- if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
- this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
- {
- if (this._nowCollTargetName.indexOf("build") != -1) {
- this._nowbuildname = this._nowCollTargetName;
- this._nowscenename = target.parent.parent.name;
- }
- if (this._nowCollTargetName.indexOf("irongauze") != -1) {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
- }
- else {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
- }
- }
- }
- };
- /**
- * 结束碰撞时执行
- */
- Player.prototype.onCollisionExit = function (collision) {
- this._isColling = false;
- if (collision && collision.contacts && collision.contacts.length > 0 && collision.other) {
- var contactPoint = collision.contacts[0];
- this.CheckEnd(contactPoint.normal, collision.other.owner);
- }
- };
- /**检测结束碰撞 */
- Player.prototype.CheckEnd = function (normal, target) {
- if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
- return;
- }
- if (this.isforceJump) {
- this.isforceJump = false;
- return;
- }
- if (this._lockxstate) {
- this._lockxstate = 0;
- return;
- }
- if (this._nowCollTargetName != target.name) {
- return;
- }
- if (target.name.indexOf("panel_jump") != -1) {
- return;
- }
- switch (this.nowAction) {
- case CharacterState_1.CharacterState.climbup:
- case CharacterState_1.CharacterState.climbupblock:
- if (this._nowCollTargetName.indexOf("box_Board") != -1) {
- this.JumpAction(this._changeMoveX);
- }
- else {
- if (this._changeMoveX > 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- }
- else if (this._changeMoveX < 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- }
- }
- break;
- case CharacterState_1.CharacterState.climbright:
- case CharacterState_1.CharacterState.climbleft:
- this.JumpAction(this._changeMoveX);
- break;
- case CharacterState_1.CharacterState.run:
- this.JumpAction(this._changeMoveX);
- break;
- case CharacterState_1.CharacterState.MoveX:
- this.JumpAction(this._speedMoveV3.x);
- break;
- }
- };
- Player.prototype.setnowSelectVec = function (pos) {
- this._nowselectVec = pos;
- };
- /**计算碰撞 */
- Player.prototype.Calculate = function (normal, target, collpoint) {
- if (target.name == "SliderBoost" || target.name.indexOf("npc") != -1) {
- return;
- }
- this._nowCollTargetName = target.name;
- var n = new Laya.Vector3;
- Laya.Vector3.normalize(normal, this._normalizeVec);
- if (this._nowCollTargetName.indexOf("build") != -1 || this._nowCollTargetName.indexOf("Scaffolding") != -1 ||
- this._nowCollTargetName.indexOf("irongauze") != -1) //碰到建筑,判断是上爬,左爬还是右爬
- {
- if (this._nowCollTargetName.indexOf("build") != -1) {
- this._nowbuildname = this._nowCollTargetName;
- this._nowscenename = target.parent.parent.name;
- }
- if (this._nowCollTargetName.indexOf("irongauze") != -1) {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.parent.name, target.parent.name);
- }
- else {
- this._nowselectVec = PropManager_1.PropManager.getPosVecbyScene(target.parent.parent.name, this._nowCollTargetName);
- }
- if (this._normalizeVec.z == -1) //上爬
- {
- if (this._nowselectVec && this._transform.position.y > (this._nowselectVec.y - 0.2)) {
- this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.climbup;
- this._shangpaVec = this._nowselectVec.clone();
- }
- }
- else if (this._normalizeVec.y == 1 || this._normalizeVec.y == -1) {
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- else if (this._normalizeVec.x == -1) {
- if (this.nowAction == CharacterState_1.CharacterState.run) {
- this._lockxstate = 1;
- }
- else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
- this._lockxstate = 1;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.climbleft;
- }
- }
- else if (this._normalizeVec.x == 1) {
- if (this.nowAction == CharacterState_1.CharacterState.run) {
- this._lockxstate = 2;
- }
- else if (this.nowAction == CharacterState_1.CharacterState.climbup) {
- this._lockxstate = 2;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.climbright;
- }
- }
- else {
- if (this._normalizeVec.z != 1) {
- this.nowAction = CharacterState_1.CharacterState.climbupblock;
- this._shangpaVec = this._nowselectVec.clone();
- }
- }
- }
- else if (this._nowCollTargetName.indexOf("panel_jump") != -1) //加速板跳跃
- {
- this.nowAction = CharacterState_1.CharacterState.speedupjump;
- }
- else if (this._nowCollTargetName.indexOf("panel_downslip") != -1) {
- this.nowAction = CharacterState_1.CharacterState.downmove;
- }
- else if (this._nowCollTargetName.indexOf("box_Board") != -1 && this.nowAction != CharacterState_1.CharacterState.downmove) {
- if (this._normalizeVec.z == -1) //上爬
- {
- this.nowAction = CharacterState_1.CharacterState.climbup;
- this._shangpaVec = this._nowselectVec.clone();
- }
- }
- else if (this._nowCollTargetName.indexOf("box_sidejump") != -1) {
- this.nowAction = CharacterState_1.CharacterState.sidespeedup;
- }
- else if (this._nowCollTargetName.indexOf("box_Surmount") != -1) {
- this.nowAction = CharacterState_1.CharacterState.cross;
- }
- else if (this._nowCollTargetName.indexOf("irongauze") != -1) {
- this.nowAction = CharacterState_1.CharacterState.climbup;
- this._shangpaVec = this._nowselectVec.clone();
- }
- };
- Player.prototype.JumpAction = function (value) {
- if (value > 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- // this.setJump( this.nowAction );
- }
- else if (value < 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- // this.setJump( this.nowAction );
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.jump;
- // this.setJump( this.nowAction );
- }
- };
- Player.prototype.PlayAnimator = function (actionName) {
- var _actionname = this.TransitionActionName(actionName);
- this._StateName = actionName;
- if (this._animator) {
- if (this._StateName == CharacterState_1.CharacterState.climbend || this._StateName == CharacterState_1.CharacterState.land1 || this._StateName == CharacterState_1.CharacterState.land2) {
- this._animator.speed = 1.5;
- }
- else {
- this._animator.speed = 1;
- }
- this._animator.play(_actionname, 0, 0);
- }
- };
- /**转换动作名称 */
- Player.prototype.TransitionActionName = function (_actionname) {
- switch (_actionname) {
- case "rollover1":
- return "cefan1";
- case "rollover2":
- return "cefan2";
- case "runwallleft":
- return "paoqiangleft";
- case "rightjump":
- return "rightjump";
- case "runwallright":
- return "paoqiangright";
- case "leftjump":
- return "leftjump";
- case "climbwall":
- return "paqiang";
- case "climbend":
- return "climbend";
- case "stand":
- return "stand";
- case "sky":
- return "kongzhong";
- case "land1":
- return "luodi1";
- case "land2":
- return "luodi2";
- case "highjump1":
- return "datiao1";
- case "highjump2":
- return "datiao2";
- case "run":
- return "run";
- case "jump":
- return "jump";
- case "climbup":
- return "Climb";
- case "falldown":
- return "Freefalling";
- case "climbleft":
- return "left_climb";
- case "climbright":
- return "right_climb";
- case "jumpright":
- return "right_jump";
- case "jumpleft":
- return "left_jump";
- case "ClimbMotion":
- return "PlayPalouAction";
- case "huachan":
- return "huachan";
- case "hurdle":
- return "kualan";
- case "speedupjump":
- return "jiasuJump";
- case "MoveX":
- return "xshunyi";
- case "downmove":
- return "downSlide";
- case "sidespeedup":
- return "slidejiasu";
- case "cross":
- return "surmount";
- case "climbupblock":
- return "lockclimb";
- }
- };
- Object.defineProperty(Player.prototype, "nowAction", {
- get: function () {
- return this._nowActionState;
- },
- set: function (value) {
- if (this._nowActionState != value || this.LastActionState == CharacterState_1.CharacterState.speedupjump || this._nowActionState == CharacterState_1.CharacterState.speedupjump) {
- this.LastActionState = this._nowActionState;
- this._nowActionState = value;
- this._moveTime = 0;
- this.canshake = false;
- this.ChangeTrial(true);
- switch (this._nowActionState) {
- case CharacterState_1.CharacterState.stand:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.stand);
- break;
- case CharacterState_1.CharacterState.run:
- if (this.LastActionState == CharacterState_1.CharacterState.jump || this.LastActionState == CharacterState_1.CharacterState.jumpleft || this.LastActionState == CharacterState_1.CharacterState.jumpright) {
- this._isActionNums = true;
- this._isneedactionnum = 1;
- var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
- if (sort < 50) {
- this.PlayAnimator(CharacterState_1.CharacterState.land1);
- }
- else {
- this.PlayAnimator(CharacterState_1.CharacterState.land2);
- }
- }
- else {
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- }
- break;
- case CharacterState_1.CharacterState.jump:
- this.PlayAnimator(CharacterState_1.CharacterState.jump);
- PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.jumpSpeed.x = this._RoleData.frontjump.x;
- this.jumpSpeed.y = this._RoleData.frontjump.y;
- this.jumpSpeed.z = this._RoleData.frontjump.z;
- AudioControl_1.AudioControl.Instance.playGameSound("tiao");
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- break;
- case CharacterState_1.CharacterState.jumpleft:
- PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
- this.jumpSpeed.x = this._RoleData.leftjump.x;
- this.jumpSpeed.y = this._RoleData.leftjump.y;
- this.jumpSpeed.z = this._RoleData.leftjump.z;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.leftjump);
- AudioControl_1.AudioControl.Instance.playGameSound("tiao");
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- break;
- case CharacterState_1.CharacterState.jumpright:
- PropManager_1.PropManager.Instance.SetEffectColor("color_white", this._transform.position);
- this.jumpSpeed.x = this._RoleData.rightjump.x;
- this.jumpSpeed.y = this._RoleData.rightjump.y;
- this.jumpSpeed.z = this._RoleData.rightjump.z;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.rightjump);
- AudioControl_1.AudioControl.Instance.playGameSound("tiao");
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- break;
- case CharacterState_1.CharacterState.speedupjump:
- var buildcfg = BuildCFG_1.default.dict["panel_jump"];
- if (this.buff_speeduptime > 0) {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz * buildcfg.buffz;
- this.doublespeedup = true;
- }
- else {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz;
- }
- this.buff_speeduptime = buildcfg.time;
- this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
- if (this.NowLastActionState == value) {
- this.jumpSpeed.y = buildcfg.buffy * 2;
- }
- else {
- this.jumpSpeed.y = buildcfg.buffy;
- }
- this.jumpSpeed.y = buildcfg.buffy;
- this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
- if (sort < 50) {
- this.PlayAnimator(CharacterState_1.CharacterState.highjump1);
- }
- else {
- this.PlayAnimator(CharacterState_1.CharacterState.highjump2);
- }
- AudioControl_1.AudioControl.Instance.playGameSound("tiao");
- Laya.timer.clear(this, this.playspeedSound);
- Laya.timer.once(200, this, this.playspeedSound);
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- break;
- case CharacterState_1.CharacterState.downmove:
- var buildcfg = BuildCFG_1.default.dict["panel_downslip"];
- if (this.buff_speeduptime > 0) {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz * buildcfg.buffz;
- this.doublespeedup = true;
- }
- else {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz;
- }
- this.buff_speeduptime = buildcfg.time;
- this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
- this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
- this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.huachan);
- this.playspeedSound();
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- break;
- case CharacterState_1.CharacterState.sidespeedup:
- var buildcfg = BuildCFG_1.default.dict["box_sidejump"];
- if (this.buff_speeduptime > 0) {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz * buildcfg.buffz;
- this.doublespeedup = true;
- }
- else {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz;
- }
- this.buff_speeduptime = buildcfg.time;
- this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
- this.jumpSpeed.y = buildcfg.buffy * this._multiple.y;
- this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
- this._isActionNums = false;
- this.playspeedSound();
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- // this.PlayAnimator( CharacterState. );
- break;
- case CharacterState_1.CharacterState.cross:
- var buildcfg = BuildCFG_1.default.dict["box_Surmount"];
- if (this.buff_speeduptime > 0) {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz * buildcfg.buffz;
- this.doublespeedup = true;
- }
- else {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = buildcfg.buffz;
- }
- this.buff_speeduptime = buildcfg.time;
- this.jumpSpeed.x = buildcfg.buffx * this._multiple.x;
- this.jumpSpeed.y = (buildcfg.buffy + 0.5) * this._multiple.y;
- this.jumpSpeed.z = this._speedMoveV3.z * buildcfg.buffz * this._multiple.z;
- this._isActionNums = true;
- this._isneedactionnum = 1;
- this.PlayAnimator(CharacterState_1.CharacterState.hurdle);
- break;
- case CharacterState_1.CharacterState.climbup:
- case CharacterState_1.CharacterState.climbupblock:
- this.jumpSpeed.x = 0;
- this.jumpSpeed.y = this._RoleData.upclimb;
- this.jumpSpeed.z = 0;
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.climbwall);
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- this.canshake = true;
- this.shaketime = 0;
- this.ChangeTrial(false);
- break;
- case CharacterState_1.CharacterState.climbleft:
- this.jumpSpeed.x = 0;
- this.jumpSpeed.y = this._RoleData.slideclimb.y;
- this.jumpSpeed.z = this._RoleData.slideclimb.z;
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.runwallleft);
- this.ChangeTrial(false);
- break;
- case CharacterState_1.CharacterState.climbright:
- this.jumpSpeed.x = 0;
- this.jumpSpeed.y = this._RoleData.slideclimb.y;
- this.jumpSpeed.z = this._RoleData.slideclimb.z;
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.runwallright);
- this.ChangeTrial(false);
- break;
- case CharacterState_1.CharacterState.ClimbMotion:
- this._isActionNums = true;
- this._isneedactionnum = 0;
- this._needactiontime = 0.3;
- this._moveTime = 0;
- this.PlayAnimator(CharacterState_1.CharacterState.climbend);
- break;
- }
- this.NowLastActionState = value;
- }
- },
- enumerable: true,
- configurable: true
- });
- Player.prototype.playspeedSound = function () {
- AudioControl_1.AudioControl.Instance.playGameSound("speedup");
- };
- Player.prototype.ChangeTrial = function (bo) {
- if (this.LeftTrial && this.RightTrial && this.LeftTrial.active != bo) {
- this.LeftTrial.active = bo;
- this.RightTrial.active = bo;
- }
- };
- Player.prototype.Joy = function (value, value1, angle) {
- if (this.nowAction == CharacterState_1.CharacterState.run) {
- this._changeMoveX = value;
- }
- else if (this.nowAction == CharacterState_1.CharacterState.climbup || CharacterState_1.CharacterState.climbleft || CharacterState_1.CharacterState.climbright) {
- this._changeMoveX = value1;
- }
- if (this.nowAction == CharacterState_1.CharacterState.climbleft && this._changeMoveX > 0) //强制跳跃
- {
- this.isforceJump = true;
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- }
- else if (this.nowAction == CharacterState_1.CharacterState.climbright && this._changeMoveX < 0) {
- this.isforceJump = true;
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- }
- if (this.nowAction == CharacterState_1.CharacterState.jump ||
- this.nowAction == CharacterState_1.CharacterState.jumpleft ||
- this.nowAction == CharacterState_1.CharacterState.jumpright ||
- this.nowAction == CharacterState_1.CharacterState.speedupjump) {
- angle = -angle * Math.PI / 180;
- Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), angle, this.quaternion);
- var jumpz = this.jumpSpeed.z;
- Laya.Vector3.transformQuat(this.jumpSpeed, this.quaternion, this.jumpSpeed);
- this.jumpSpeed.z = jumpz;
- }
- };
- Player.prototype.update = function (dt) {
- dt = 16;
- if (this._iscanMove) {
- var distime = dt / 1000;
- this._moveTime += distime;
- switch (this.nowAction) {
- case CharacterState_1.CharacterState.run: //跑动
- this._moveVec.y = 0;
- this._moveVec.z = distime * (this._speedMoveV3.z * this._multiple.z);
- if (this._lockxstate == 0) {
- this._moveVec.x = this._changeMoveX * distime;
- }
- else if (this._lockxstate == 1) {
- if (this._changeMoveX < 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- else if (this._lockxstate == 2) {
- if (this._changeMoveX > 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.climbup: //爬升
- this._moveVec.z = 0;
- this._moveVec.y = distime * this.jumpSpeed.y;
- if (this._lockxstate == 1) {
- if (this._changeMoveX < 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- else if (this._lockstate == 2) {
- if (this._changeMoveX > 0) {
- this._moveVec.x = 0;
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- }
- else {
- this._moveVec.x = this._changeMoveX * distime;
- }
- this._transform.translate(this._moveVec, false);
- if (this._shangpaVec) {
- if (this._transform.position.y + 1 > this._shangpaVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- }
- else if (this._nowselectVec) {
- if (this._transform.position.y + 1 > this._nowselectVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- }
- break;
- case CharacterState_1.CharacterState.climbupblock:
- this._moveVec.z = 0;
- this._moveVec.y = distime * this.jumpSpeed.y;
- this._moveVec.x = 0;
- this._transform.translate(this._moveVec, false);
- if (this._shangpaVec) {
- if (this._transform.position.y + 1 > this._shangpaVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- }
- else if (this._transform.position.y + 1 > this._nowselectVec.y) {
- this.nowAction = CharacterState_1.CharacterState.ClimbMotion;
- }
- break;
- case CharacterState_1.CharacterState.jump: //跳跃
- case CharacterState_1.CharacterState.jumpleft:
- case CharacterState_1.CharacterState.jumpright:
- this._disy = this.jumpSpeed.y - this.g * distime;
- this.jumpSpeed.y = this._disy;
- this._moveVec.x = this.jumpSpeed.x * distime;
- this._moveVec.y = this._disy * distime;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.speedupjump:
- this._disy = this.jumpSpeed.y - this.g * distime;
- this.jumpSpeed.y = this._disy;
- this._moveVec.x = this.jumpSpeed.x * distime;
- this._moveVec.y = this._disy * distime;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.climbleft:
- case CharacterState_1.CharacterState.climbright:
- this._moveVec.z = distime * this.jumpSpeed.y;
- this._moveVec.y = this.jumpSpeed.y * distime;
- this._moveVec.x = 0;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.MoveX:
- this._moveVec.z = distime * this._speedMoveV3.z;
- this._moveVec.x = this._speedMoveV3.x * distime;
- this._transform.translate(this._moveVec, false);
- if (this._moveTime > 0.1) {
- this.nowAction = CharacterState_1.CharacterState.run;
- }
- break;
- case CharacterState_1.CharacterState.downmove:
- this._moveVec.y = this.jumpSpeed.x;
- this._moveVec.x = this.jumpSpeed.y;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.sidespeedup:
- this._moveVec.y = 0;
- this._moveVec.x = 0;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- if (this.buff_speeduptime <= 0 && this.LastActionState == CharacterState_1.CharacterState.climbleft || this.LastActionState == CharacterState_1.CharacterState.climbright) {
- this.nowAction = this.LastActionState;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.jump;
- }
- break;
- case CharacterState_1.CharacterState.cross:
- this._disy = this.jumpSpeed.y - this.g * distime;
- this.jumpSpeed.y = this._disy;
- this._moveVec.x = this.jumpSpeed.x * distime;
- this._moveVec.y = this._disy * distime;
- this._moveVec.z = this.jumpSpeed.z * distime;
- this._transform.translate(this._moveVec, false);
- break;
- case CharacterState_1.CharacterState.ClimbMotion:
- if (this._nowselectVec) {
- if (this._transform.position.y < this._nowselectVec.y) {
- this._moveVec.x = 0;
- this._moveVec.y = (1 / 0.3) * distime;
- this._moveVec.z = 0;
- this._transform.translate(this._moveVec, false);
- }
- }
- break;
- }
- if (this._nowselectVec && (this.nowAction == CharacterState_1.CharacterState.run || this.nowAction == CharacterState_1.CharacterState.downmove) && !this._isColling) {
- if (this._transform.position.z <= this._nowselectVec.z) {
- if (this._changeMoveX > 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpright;
- }
- else if (this._changeMoveX < 0) {
- this.nowAction = CharacterState_1.CharacterState.jumpleft;
- }
- else {
- this.nowAction = CharacterState_1.CharacterState.jump;
- }
- }
- }
- if (this._transform.position.y < PropManager_1.PropManager.diePosY - PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.DieDistance) //角色死亡
- {
- if (this._nowscenename == "" || this._nowbuildname == "") {
- if (GameState_1.GameState.fuhuocishu > 0) {
- this.Revive();
- }
- else {
- this.Lose();
- }
- }
- else {
- if (GameState_1.GameState.fuhuocishu > 0) {
- this.Revive();
- }
- else {
- this.Lose();
- }
- }
- this.nowAction = CharacterState_1.CharacterState.stand;
- }
- if (this._transform.position.z < PropManager_1.PropManager.gamewinPosZ) //到达终点
- {
- this.Win();
- }
- else {
- PropManager_1.PropManager.pro_jindu.value = this._transform.position.z / PropManager_1.PropManager.gamewinPosZ * 100;
- }
- if (this._isActionNums) {
- if (this._isneedactionnum > 0) {
- if (this._animator.getCurrentAnimatorPlayState().normalizedTime >= this._isneedactionnum) {
- switch (this._StateName) {
- case CharacterState_1.CharacterState.jump:
- case CharacterState_1.CharacterState.leftjump:
- case CharacterState_1.CharacterState.rightjump:
- case CharacterState_1.CharacterState.highjump1:
- case CharacterState_1.CharacterState.highjump2:
- case CharacterState_1.CharacterState.hurdle:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.sky);
- break;
- case CharacterState_1.CharacterState.huachan:
- case CharacterState_1.CharacterState.climbend:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- this.nowAction = CharacterState_1.CharacterState.run;
- this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
- break;
- case CharacterState_1.CharacterState.land1:
- // this._isActionNums = false;
- // this.PlayAnimator( CharacterState.run );
- case CharacterState_1.CharacterState.land2:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- break;
- case CharacterState_1.CharacterState.huachan:
- this.nowAction = CharacterState_1.CharacterState.run;
- break;
- }
- }
- }
- else if (this._needactiontime != 0 && this._moveTime > this._needactiontime) {
- switch (this._StateName) {
- case CharacterState_1.CharacterState.jump:
- case CharacterState_1.CharacterState.leftjump:
- case CharacterState_1.CharacterState.rightjump:
- case CharacterState_1.CharacterState.highjump1:
- case CharacterState_1.CharacterState.highjump2:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.sky);
- this._changeMoveX = 0;
- break;
- case CharacterState_1.CharacterState.hurdle:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.sky);
- break;
- case CharacterState_1.CharacterState.huachan:
- case CharacterState_1.CharacterState.climbend:
- this._isActionNums = false;
- this.PlayAnimator(CharacterState_1.CharacterState.run);
- this.nowAction = CharacterState_1.CharacterState.run;
- this._transform.position = new Laya.Vector3(this._transform.position.x, this._nowselectVec.y, this._transform.position.z);
- break;
- }
- }
- }
- if (this.buff_speeduptime > 0) {
- this.buff_speeduptime -= distime;
- PropManager_1.PropManager.Instance.SpeedUpEffect("jiasulizi", this._transform.position);
- if (this.doublespeedup) {
- PropManager_1.PropManager.Instance.SpeedUpEffect1("jiasulizi", this._transform.position);
- }
- }
- else {
- this._multiple.x = 1;
- this._multiple.y = 1;
- this._multiple.z = 1;
- this.doublespeedup = false;
- PropManager_1.PropManager.Instance.CloseSpeedUpEffect();
- PropManager_1.PropManager.Instance.CloseSpeedUpEffect1();
- }
- if (this.canshake) {
- this.shaketime += distime;
- if (this.shaketime >= 0.5) {
- this.shaketime = 0;
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- }
- }
- }
- else {
- if (this._ending) {
- var distime = dt / 1000;
- this._moveTime += distime;
- if (this._moveTime >= this._endanmotime) {
- this.GameOver();
- }
- else {
- this._endAnmoSpeed1.x = this._endAnmoSpeed.x * distime;
- this._endAnmoSpeed1.y = this._endAnmoSpeed.y * distime;
- this._endAnmoSpeed1.z = this._endAnmoSpeed.z * distime;
- PropManager_1.PropManager.carma.getComponent(CameraManager_1.CameraManager).GameEndRotate(this._transform.position, this._endAnmoSpeed1);
- }
- }
- }
- };
- Player.prototype.Win = function () {
- AudioControl_1.AudioControl.Instance.playGameSound("over");
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.end);
- var carmaTrans = PropManager_1.PropManager.carma.transform;
- this._endAnmoSpeed.z = (this._transform.position.z - 2 - carmaTrans.position.z) / this._endanmotime;
- this._endAnmoSpeed.y = (this._transform.position.y - carmaTrans.position.y) / this._endanmotime;
- this._endAnmoSpeed.x = (this._transform.position.x + 3 - carmaTrans.position.x) / this._endanmotime;
- this._moveTime = 0;
- this._iscanMove = false;
- this._ending = true;
- this.PlayAnimator(CharacterState_1.CharacterState.sky);
- PropManager_1.PropManager.Instance.GameOverEffecf("yanhua", this._transform.position, GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0 ? true : false);
- };
- /**出现复活界面 */
- Player.prototype.Revive = function () {
- AudioControl_1.AudioControl.Instance.playGameSound("over");
- GameState_1.GameState.isdie = true;
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.revive);
- this._iscanMove = false;
- this.PlayAnimator(CharacterState_1.CharacterState.stand);
- // this._ending = true;
- };
- Player.prototype.Lose = function () {
- AudioControl_1.AudioControl.Instance.playGameSound("over");
- GameState_1.GameState.isdie = true;
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
- this._iscanMove = false;
- this.PlayAnimator(CharacterState_1.CharacterState.stand);
- this._ending = true;
- };
- Player.prototype.GameOver = function () {
- this._ending = false;
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- };
- Player.prototype.TestJump = function () {
- this.nowAction = CharacterState_1.CharacterState.jump;
- };
- Player.prototype.destroy = function () {
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- _super.prototype.destroy.call(this);
- };
- Player.prototype.XMove = function (state) {
- if (this.nowAction == CharacterState_1.CharacterState.run) {
- this._moveTime = 0;
- this._speedMoveV3.x = state * 20;
- this.nowAction = CharacterState_1.CharacterState.MoveX;
- }
- };
- Player.prototype.dispose = function () {
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- };
- Player.prototype.onDestroy = function () {
- console.log("拖尾回收成功2222222----");
- PoolManager_1.default.RecoverSprite3D(this.LeftTrial);
- PoolManager_1.default.RecoverSprite3D(this.RightTrial);
- };
- return Player;
- }(Laya.Script3D));
- exports.Player = Player;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Global = /** @class */ (function () {
- function Global() {
- }
- Global.curHeight = function () {
- return Laya.stage.height;
- };
- Global.curWidth = function () {
- return Laya.stage.width;
- };
- Global.setVars = function () {
- Global.stage = Laya.stage;
- Global.sethttpurl();
- };
- Global.getUrl = function (url) {
- if (url.indexOf("wxlocal") == -1) {
- return Global.resourcehtttp + url + Global.versions;
- }
- return url;
- };
- Global.sethttpurl = function () {
- if (Global.isdebug) {
- Global.httpurl = "https://wxgamedev.51yoyoyo.com/";
- }
- else {
- Global.httpurl = "https://minport.51yoyoyo.com/";
- }
- };
- Global.httpurl = "";
- Global.resourcehtttp = "";
- Global.cdnurl = "https://wxgame.51yoyoyo.com/";
- /**
- * 资源后缀版本号
- */
- Global.versions = ""; //"?v=1.0.7";
- Global.initWidth = 720;
- Global.initHeight = 1280;
- /**
- * 资源版本号
- */
- Global.resconfigVersion = "";
- /**
- * 当前平台
- */
- Global.nowplatfrom = "";
- /**
- * 当前游戏appid
- */
- Global.appid = "wx46f4626932e5f48b";
- /**
- * 游戏版本号
- */
- Global.gameVersion = "1.0.1";
- /**
- * 是否调试版本
- */
- Global.isdebug = false;
- Global.AppKeyID = 0;
- Global.MemberID = 0;
- return Global;
- }());
- exports.Global = Global;
- },{}],42:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var GlobalWaiting = /** @class */ (function (_super) {
- __extends(GlobalWaiting, _super);
- function GlobalWaiting() {
- var _this = _super.call(this) || this;
- _this._isforcehide = false;
- _this._lastTime = 0;
- return _this;
- }
- GlobalWaiting.prototype.constructFromXML = function (xml) {
- this.setSize(fairygui.GRoot.inst.width, fairygui.GRoot.inst.height);
- _super.prototype.constructFromXML.call(this, xml);
- this.img_0 = this.getChild("img_0").asImage;
- this.img_0.visible = false;
- this.on(Laya.Event.DISPLAY, this, this.onAddedToStage);
- this.on(Laya.Event.UNDISPLAY, this, this.onRemoveFromStage);
- };
- GlobalWaiting.prototype.onAddedToStage = function () {
- this._lastTime = Laya.Browser.now();
- Laya.timer.frameLoop(1, this, this.onTimer);
- };
- GlobalWaiting.prototype.onTimer = function () {
- if (this.img_0) {
- var nowtime = Laya.Browser.now();
- var distime = nowtime - this._lastTime;
- if (distime / 1000 >= 0) {
- if (!this._isforcehide) {
- this.img_0.visible = true;
- }
- var i = this.img_0.rotation;
- i += 10;
- if (i > 360)
- i = i % 360;
- this.img_0.rotation = i;
- }
- else {
- this.img_0.visible = false;
- }
- }
- };
- GlobalWaiting.prototype.hideimg = function () {
- this._isforcehide = true;
- if (this.img_0) {
- this.img_0.visible = false;
- }
- };
- GlobalWaiting.prototype.onRemoveFromStage = function () {
- Laya.timer.clear(this, this.onTimer);
- };
- return GlobalWaiting;
- }(fairygui.GComponent));
- exports.GlobalWaiting = GlobalWaiting;
- },{}],43:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var JoystickModule = /** @class */ (function (_super) {
- __extends(JoystickModule, _super);
- function JoystickModule(clickpanel) {
- var _this = _super.call(this) || this;
- _this.dis = 0;
- _this.degree = 0;
- _this.angle = 0;
- _this.offx = 0;
- _this._iscanCBack = false;
- _this.mLastMouseX = 0;
- _this.mLastMouseY = 0;
- _this.mX = 0;
- _this.mY = 0;
- _this._iacanCallback = false;
- _this._clickpanel = clickpanel;
- _this._button = new Laya.Point();
- _this.touchId = -1;
- _this.radius = 400;
- _this._curPos = new Laya.Point();
- _this._clickpanel.on(Laya.Event.MOUSE_DOWN, _this, _this.onTouchDown);
- return _this;
- }
- JoystickModule.prototype.onTouchDown = function (evt) {
- if (this.touchId == -1) { //First touch
- this.touchId = evt.touchId;
- this.offx = 0;
- this._iscanCBack = false;
- fairygui.GRoot.inst.globalToLocal(Laya.stage.mouseX, Laya.stage.mouseY, this._curPos);
- var bx = this._curPos.x;
- var by = this._curPos.y;
- this._lastStageX = bx;
- this._lastStageY = by;
- this._startStageX = bx;
- this._startStageY = by;
- this._button.x = bx;
- this._button.y = by;
- if (this._callobj && this._downCallback) {
- this._downCallback.call(this._callobj);
- }
- this._clickpanel.on(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
- this._clickpanel.on(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
- this._clickpanel.on(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
- }
- };
- JoystickModule.prototype.setEventCallback = function (callobj, downCallback, movecallback, upcallback) {
- this._callobj = callobj;
- this._downCallback = downCallback;
- this._movecallback = movecallback;
- this._updatecallback = upcallback;
- };
- JoystickModule.prototype.Trigger = function (evt) {
- this.onTouchDown(evt);
- };
- //创建地图
- JoystickModule.prototype.createMap = function () {
- //创建地图对象
- this.tiledMap = new Laya.TiledMap();
- this.mX = this.mY = 0;
- //创建地图,适当的时候调用destory销毁地图
- this.tiledMap.createMap("res/tiledMap/desert.json", new Laya.Rectangle(0, 0, Laya.Browser.width, Laya.Browser.height), new Laya.Handler(this, this.completeHandler));
- };
- /**
- * 地图加载完成的回调
- */
- JoystickModule.prototype.completeHandler = function () {
- console.log("地图创建完成");
- console.log("ClientW:" + Laya.Browser.clientWidth + " ClientH:" + Laya.Browser.clientHeight);
- };
- /************************************************* */
- JoystickModule.prototype.OnTouchUp = function (evt) {
- if (evt === void 0) { evt = null; }
- if (this.touchId != -1 && evt.touchId == this.touchId) {
- this.touchup();
- if (this._callobj && this._updatecallback) {
- this._updatecallback.call(this._callobj);
- }
- }
- };
- JoystickModule.prototype.touchup = function () {
- this._iscanCBack = false;
- this.touchId = -1;
- this._clickpanel.off(Laya.Event.MOUSE_MOVE, this, this.OnTouchMove);
- this._clickpanel.off(Laya.Event.MOUSE_UP, this, this.OnTouchUp);
- this._clickpanel.off(Laya.Event.MOUSE_OUT, this, this.OnTouchUp);
- this._iacanCallback = false;
- this.degree = 0;
- };
- JoystickModule.prototype.OnTouchMove = function (evt) {
- if (this.touchId != -1 && evt.touchId == this.touchId) {
- var bx = Laya.stage.mouseX;
- var by = Laya.stage.mouseY;
- var moveX = bx - this._lastStageX;
- var moveY = by - this._lastStageY;
- this._lastStageX = bx;
- this._lastStageY = by;
- var buttonX = this._button.x + moveX;
- var buttonY = this._button.y + moveY;
- var offsetX = buttonX - this._startStageX;
- var offsetY = buttonY - this._startStageY;
- var disX = 0;
- if (moveX >= 2 || moveX <= -2) {
- this._iscanCBack = true;
- }
- else {
- this._iscanCBack = false;
- }
- this.offx = moveX;
- if (offsetX == 0 && offsetY == 0) {
- return;
- }
- if (offsetX > 0) {
- if (offsetX > this.radius) {
- disX = this.radius;
- this.angle = 90;
- }
- else {
- disX = this.radius - offsetX;
- this.angle = 90 - disX / this.radius * 90;
- }
- }
- else if (offsetX == 0) {
- this.angle = 0;
- }
- else {
- if (-offsetX > this.radius) {
- disX = this.radius;
- this.angle = -90;
- }
- else {
- disX = this.radius + offsetX;
- this.angle = -(90 - disX / this.radius * 90);
- }
- }
- var rad = Math.atan2(offsetY, offsetX);
- this.degree = rad;
- var maxX = this.radius * Math.cos(rad);
- var maxY = this.radius * Math.sin(rad);
- if (Math.abs(offsetX) > Math.abs(maxX))
- offsetX = maxX;
- if (Math.abs(offsetY) > Math.abs(maxY))
- offsetY = maxY;
- buttonX = this._startStageX + offsetX;
- buttonY = this._startStageY + offsetY;
- if (buttonX < 0)
- buttonX = 0;
- if (buttonY > fairygui.GRoot.inst.height)
- buttonY = fairygui.GRoot.inst.height;
- this._button.x = buttonX;
- this._button.y = buttonY;
- this.dis = Math.sqrt(offsetX * offsetX + offsetY * offsetY);
- this._iacanCallback = true;
- if (this._iscanCBack && this._callobj && this._movecallback && this._iacanCallback) {
- this._movecallback.call(this._callobj, this.offx);
- }
- }
- };
- JoystickModule.prototype.dispose = function () {
- this._clickpanel.off(Laya.Event.MOUSE_DOWN, this, this.onTouchDown);
- };
- // private _center:fairygui.GImage;
- JoystickModule.JoystickMoving = "JoystickMoving";
- JoystickModule.JoystickUp = "JoystickUp";
- return JoystickModule;
- }(Laya.EventDispatcher));
- exports.JoystickModule = JoystickModule;
- },{}],44:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Global_1 = require("./Global");
- var Stage = Laya.Stage;
- var AssetPath_1 = require("./Config/AssetPath");
- var GameContents_1 = require("./GameContents");
- var Sdk_1 = require("./WXSDK/Sdk");
- var Main = /** @class */ (function () {
- function Main() {
- //根据IDE设置初始化引擎
- // Laya.init(Global.initWidth, Global.initHeight, Laya["WebGL"]);
- Laya3D.init(Global_1.Global.initWidth, Global_1.Global.initHeight);
- Laya.stage.scaleMode = Stage.SCALE_FIXED_WIDTH;
- Laya.stage.alignH = Stage.ALIGN_CENTER;
- Laya.stage.alignV = Stage.ALIGN_TOP;
- Laya.stage.screenMode = Stage.SCREEN_VERTICAL;
- Laya.stage.bgColor = "#54B9F6";
- // Laya.Stat.show();
- Laya.alertGlobalError = true;
- window['Config3D'] && (window['Config3D']["_default"]["_defaultPhysicsMemory"] = 128);
- if (Laya.Browser.window.tt) {
- // WxApi.WxInit();
- Sdk_1.WxApi.CheckWXUpdate();
- }
- Laya.stage.on("resize", this, this.onResize);
- }
- Main.prototype.onResize = function () {
- Laya.stage.off("resize", this, this.onResize);
- Global_1.Global.setVars();
- AssetPath_1.AssetPath.init();
- fairygui.UIConfig.packageFileExtension = "bin";
- fairygui.UIConfig.textureLinearSampling = true;
- fairygui.UIConfig.defaultFont = "黑体";
- fairygui.UIConfig.versions = Global_1.Global.versions;
- var gameContent = new GameContents_1.GameContents();
- gameContent.initGame();
- };
- return Main;
- }());
- //激活启动类
- new Main();
- },{"./Config/AssetPath":15,"./GameContents":37,"./Global":41,"./WXSDK/Sdk":77}],45:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AssetPath_1 = require("../Config/AssetPath");
- var CharacterPool = /** @class */ (function () {
- function CharacterPool() {
- }
- CharacterPool.AddCharacter = function (resouceName, clas, parent) {
- var skinnedmesh;
- var arr = CharacterPool.roledict[resouceName];
- if (arr && arr.length > 0) {
- skinnedmesh = arr.shift();
- skinnedmesh.active = true;
- parent.addChild(skinnedmesh);
- }
- else {
- var sp = Laya.Loader.getRes(AssetPath_1.AssetPath.get3DRoleModel(resouceName));
- skinnedmesh = Laya.Sprite3D.instantiate(sp, parent, false, new Laya.Vector3(0, 0, 0));
- }
- if (clas) {
- var cla = skinnedmesh.addComponent(clas);
- cla.resouseName = resouceName;
- }
- var _out = new Laya.Quaternion;
- Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), 180 * Math.PI / 180, _out);
- skinnedmesh.transform.rotation = _out;
- return skinnedmesh;
- };
- CharacterPool.ClearCharacter = function (sp, resouceName, cla) {
- if (!CharacterPool.roledict[resouceName]) {
- CharacterPool.roledict[resouceName] = [];
- }
- if (cla) {
- cla.destroy();
- }
- sp.active = false;
- sp.removeSelf();
- CharacterPool.roledict[resouceName].push(sp);
- };
- CharacterPool.roledict = {};
- return CharacterPool;
- }());
- exports.CharacterPool = CharacterPool;
- },{"../Config/AssetPath":15}],46:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var CharacterState = /** @class */ (function () {
- function CharacterState() {
- }
- /**侧翻 cefan1 */
- CharacterState.rollover1 = "rollover1";
- /**侧翻 cefan2 */
- CharacterState.rollover2 = "rollover2";
- /**跑墙左 paoqiangleft */
- CharacterState.runwallleft = "runwallleft";
- /**右跳 rightjump */
- CharacterState.rightjump = "rightjump";
- /**跑墙右 paoqiangright */
- CharacterState.runwallright = "runwallright";
- /**左跳 leftjump*/
- CharacterState.leftjump = "leftjump";
- /**爬墙 paqiang */
- CharacterState.climbwall = "climbwall";
- /** ? climbend */
- CharacterState.climbend = "climbend";
- /**站立 stand*/
- CharacterState.stand = "stand";
- /**空中 kongzhong */
- CharacterState.sky = "sky";
- /**落地 luodi1 */
- CharacterState.land1 = "land1";
- /**落地 luodi2 */
- CharacterState.land2 = "land2";
- /**大跳 datiao1 */
- CharacterState.highjump1 = "highjump1";
- /**大跳 datiao2 */
- CharacterState.highjump2 = "highjump2";
- /**跑动 run */
- CharacterState.run = "run";
- /**跳跃 jump*/
- CharacterState.jump = "jump";
- /**爬升 Climb */
- CharacterState.climbup = "climbup";
- /**自由落体 Freefalling */
- CharacterState.falldown = "falldown";
- /**左爬 left_climb */
- CharacterState.climbleft = "climbleft";
- /**右爬 right_climb*/
- CharacterState.climbright = "climbright";
- /**右跳 right_jump */
- CharacterState.jumpright = "jumpright";
- /**左跳 left_jump */
- CharacterState.jumpleft = "jumpleft";
- /** PlayPalouAction*/
- CharacterState.ClimbMotion = "ClimbMotion";
- /** ? huachan */
- CharacterState.huachan = "huachan";
- /**跨栏 kualan */
- CharacterState.hurdle = "hurdle";
- /**
- * 加速板跳跃 jiasuJump
- */
- CharacterState.speedupjump = "speedupjump";
- /**
- * x方向瞬移 xshunyi
- */
- CharacterState.MoveX = "MoveX";
- /**
- * 下滑位移 downSlide
- */
- CharacterState.downmove = "downmove";
- /**
- * 侧面加速 slidejiasu
- */
- CharacterState.sidespeedup = "sidespeedup";
- /**
- * 翻越 surmount
- */
- CharacterState.cross = "cross";
- /**
- * 锁定爬升 lockclimb
- */
- CharacterState.climbupblock = "climbupblock";
- return CharacterState;
- }());
- exports.CharacterState = CharacterState;
- },{}],47:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /*
- * 对象池类
- */
- var Animation = Laya.Animation;
- var GamePool = /** @class */ (function (_super) {
- __extends(GamePool, _super);
- function GamePool() {
- var _this = _super.call(this) || this;
- _this.AniConfPath = "res/fighter/fighter.json";
- return _this;
- }
- GamePool.RemoveItem = function (key, obj) {
- if (GamePool.contain[key]) {
- var index = GamePool.contain[key].indexOf(obj);
- if (index == -1) {
- GamePool.contain[key].push(obj);
- }
- }
- };
- GamePool.GetItem = function (key) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- if (GamePool.contain[key]) {
- var arr = GamePool.contain[key];
- if (arr.length == 0) {
- var calssobj = GamePool.sprite3DArray[key];
- var vo = new calssobj();
- return vo;
- }
- return GamePool.contain[key].shift();
- }
- else {
- console.log("此key值对应的类未被注册");
- return null;
- }
- };
- /******************************************* */
- GamePool.prototype.createAnimation = function () {
- var ani = new Animation();
- ani.loadAtlas(this.AniConfPath); // 加载图集动画
- ani.interval = 30; // 设置播放间隔(单位:毫秒)
- ani.index = 1; // 当前播放索引
- ani.play(); // 播放图集动画
- // 获取动画的边界信息
- var bounds = ani.getGraphicBounds();
- ani.pivot(bounds.width / 2, bounds.height / 2);
- ani.pos(Laya.stage.width / 2, Laya.stage.height / 2);
- Laya.stage.addChild(ani);
- };
- /******************************************* */
- GamePool.GetItemFairyGUI = function (url) {
- if (!GamePool.contain[url]) {
- GamePool.contain[url] = [];
- }
- var arr = GamePool.contain[url];
- if (arr.length == 0) {
- var vo = fairygui.UIPackage.createObjectFromURL(url);
- return vo;
- }
- return GamePool.contain[url].shift();
- };
- GamePool.Mark = function (key, classarg) {
- GamePool.sprite3DArray[key] = classarg;
- GamePool.contain[key] = [];
- };
- GamePool.sprite3DArray = {};
- GamePool.contain = {};
- return GamePool;
- }(Laya.EventDispatcher));
- exports.GamePool = GamePool;
- },{}],48:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Singleton_1 = require("../utils/Singleton");
- /*
- * name;
- */
- var PanelResDic = /** @class */ (function (_super) {
- __extends(PanelResDic, _super);
- function PanelResDic() {
- var _this = _super.call(this) || this;
- PanelResDic.ins = _this;
- return _this;
- }
- Object.defineProperty(PanelResDic, "Instance", {
- get: function () {
- if (PanelResDic.ins == null) {
- return new PanelResDic();
- }
- return PanelResDic.ins;
- },
- enumerable: true,
- configurable: true
- });
- PanelResDic.getView = function (viewkey) {
- if (!PanelResDic._mapviewDict[viewkey]) {
- throw "err0 未绑定的viewkey:" + viewkey;
- }
- return PanelResDic._mapviewDict[viewkey];
- };
- PanelResDic.prototype.getSingleTon = function (ref) {
- return Singleton_1.Singleton.Instance(ref);
- };
- PanelResDic.prototype.mapView = function (viewkey, ref) {
- if (!PanelResDic._mapviewDict[viewkey]) {
- PanelResDic._mapviewDict[viewkey] = ref;
- ref.key = viewkey;
- }
- };
- PanelResDic.prototype.AgencyAdd = function (ref) {
- Singleton_1.Singleton.create(ref);
- };
- PanelResDic.prototype.AgencyClear = function (ref) {
- Singleton_1.Singleton.remove(ref);
- };
- PanelResDic._mapviewDict = {};
- return PanelResDic;
- }(Laya.EventDispatcher));
- exports.PanelResDic = PanelResDic;
- },{"../utils/Singleton":91}],49:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AssetPath_1 = require("../Config/AssetPath");
- var GameUtils_1 = require("../utils/GameUtils");
- var PropManager = /** @class */ (function () {
- function PropManager() {
- this._outQUaternion4 = new Laya.Quaternion;
- this._outQUaternion = new Laya.Quaternion;
- PropManager.ins = this;
- }
- Object.defineProperty(PropManager, "Instance", {
- get: function () {
- if (PropManager.ins == null) {
- return new PropManager();
- }
- return PropManager.ins;
- },
- enumerable: true,
- configurable: true
- });
- PropManager.getPosVecbyScene = function (sceneName, buildname) {
- if (PropManager.patternDict[sceneName]) {
- return PropManager.patternDict[sceneName][buildname];
- }
- return null;
- };
- /**
- * @param animator
- * @param animatorDict
- */
- PropManager.setAnimator = function (animator) {
- var chiddict;
- for (var s in PropManager.actionDict) {
- if (!animator.getControllerLayer().getAnimatorState(s)) {
- chiddict = PropManager.actionDict[s];
- //创建一个动画动作状态
- var state1 = new Laya.AnimatorState();
- //设置动作状态的名称
- state1.name = s;
- //设置动作状态播放的起始时间(起始时间与结束时间的设置为0-1的百分比数值) 要截取的时间点 / 动画的总时长
- state1.clipStart = chiddict.s / PropManager.actionnums;
- //设置动作状态播放的结束时间
- state1.clipEnd = chiddict.e / PropManager.actionnums;
- //得到默认动画赋值给Clip(getDefaultState默认动画为Unity中animation的数组顺序0下标的动画)
- state1.clip = animator.getDefaultState().clip;
- //动画播放是否循环
- state1.clip.islooping = chiddict.islooping;
- //添加动画状态到动画组件里
- animator.addState(state1);
- }
- }
- };
- PropManager.prototype.InitEffect = function () {
- var lizi = PropManager.getlizibyName("speedupeffect");
- lizi.particleSystem.play();
- lizi.active = false;
- var lizi = PropManager.getlizibyName("color_white");
- lizi.particleSystem.play();
- lizi.active = false;
- var lizi = PropManager.getlizibyName("color_yellow");
- lizi.particleSystem.play();
- lizi.active = false;
- };
- PropManager.prototype.SetEffectColor = function (name, pos) {
- var closetime = 0;
- Laya.timer.clear(this, this.EffectEnd);
- this.EffectEndColor();
- if (name == "color_white") {
- var sort = GameUtils_1.GameUtils.randRangeint(0, 100);
- if (sort > 50) {
- name = "color_yellow";
- }
- }
- closetime = 500;
- this._tanselizi = PropManager.getlizibyName(name);
- this._tanselizi.transform.position = pos;
- this._tanselizi.particleSystem.play();
- if (closetime != 0) {
- Laya.timer.once(closetime, this, this.EffectEndColor);
- }
- };
- PropManager.prototype.EffectEndColor = function () {
- if (this._tanselizi) {
- this._tanselizi.particleSystem.stop();
- this._tanselizi.active = false;
- }
- };
- PropManager.prototype.SpeedUpEffect1 = function (name, pos) {
- if (!this._engamelizi4 || (this._engamelizi4 && !this._engamelizi4.active)) {
- this._engamelizi4 = PropManager.getlizibyName("speedupeffect");
- this._engamelizi4.particleSystem.looping = true;
- this._engamelizi4.transform.scale = new Laya.Vector3(20, 20, 20);
- Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion4);
- this._engamelizi4.transform.rotation = this._outQUaternion4;
- this._engamelizi4.particleSystem.play();
- }
- var lzpos = pos.clone();
- lzpos.y += 5;
- lzpos.z -= 10;
- this._engamelizi4.transform.position = lzpos;
- };
- PropManager.prototype.CloseSpeedUpEffect1 = function () {
- if (this._engamelizi4 && this._engamelizi4.active) {
- this._engamelizi4.active = false;
- }
- };
- PropManager.prototype.SpeedUpEffect = function (name, pos) {
- if (!this._engamelizi3 || (this._engamelizi3 && !this._engamelizi3.active)) {
- this._engamelizi3 = PropManager.getlizibyName("speedupeffect");
- this._engamelizi3.particleSystem.looping = true;
- this._engamelizi3.transform.scale = new Laya.Vector3(20, 20, 20);
- Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(1, 0, 0), -50, this._outQUaternion);
- this._engamelizi3.transform.rotation = this._outQUaternion;
- this._engamelizi3.particleSystem.play();
- }
- var lzpos = pos.clone();
- lzpos.y += 5;
- this._engamelizi3.transform.position = lzpos;
- };
- PropManager.prototype.CloseSpeedUpEffect = function () {
- if (this._engamelizi3 && this._engamelizi3.active) {
- this._engamelizi3.active = false;
- }
- };
- PropManager.prototype.GameOverEffecf = function (name, pos, iswin) {
- this._engamelizi1 = PropManager.getlizibyName("fireworks");
- this._engamelizi1.transform.position = pos;
- this._engamelizi1.particleSystem.play();
- if (iswin) {
- this._engamelizi2 = PropManager.getlizibyName("winline");
- this._engamelizi2.transform.position = pos;
- this._engamelizi2.particleSystem.play();
- }
- };
- PropManager.prototype.CloseGameOverEffect = function () {
- if (this._engamelizi1) {
- this._engamelizi1.particleSystem.stop();
- this._engamelizi1.active = false;
- }
- if (this._engamelizi2) {
- this._engamelizi2.particleSystem.stop();
- this._engamelizi2.active = false;
- }
- };
- // public setliziPlay( name:string,pos:Laya.Vector3 ):void
- // {
- // var closetime:number = 0;
- // Laya.timer.clear( this,this.liziend );
- // switch( name )
- // {
- // case "tanse_bai":
- // if( name == "tanse_bai" )
- // {
- // var sort:number = GameUtils.randRangeint( 0,100 );
- // if( sort > 50 )
- // {
- // name = "tanse_huang";
- // }
- // }
- // closetime = 500;
- // break;
- // case "jiasulizi":
- // break;
- // case "win_xian":
- // closetime = 0;
- // break;
- // case "yanhua":
- // closetime = 0;
- // break;
- // }
- // var lizi:Laya.ShuriKenParticle3D = PropManager.getlizibyName( name );
- // lizi.transform.position = pos;
- // lizi.particleSystem.play();
- // if( closetime != 0 )
- // {
- // Laya.timer.once( closetime,this,this.liziend,[lizi] );
- // }
- // }
- PropManager.prototype.EffectEnd = function (lizi) {
- if (lizi) {
- lizi.particleSystem.stop();
- lizi.active = false;
- }
- };
- PropManager.getlizibyName = function (name) {
- var lizisp;
- if (PropManager.liziDict[name]) {
- lizisp = PropManager.liziDict[name];
- }
- else {
- lizisp = Laya.Sprite3D.instantiate(Laya.Loader.getRes(AssetPath_1.AssetPath.get3DModel(name)));
- PropManager.liziDict[name] = lizisp;
- PropManager.scene3D.addChild(lizisp);
- }
- lizisp.active = true;
- return lizisp;
- };
- PropManager.nowmapDict = {};
- PropManager.diePosY = 0;
- PropManager.gamewinPosZ = 0;
- PropManager.patternDict = {};
- PropManager.npcDict = {};
- PropManager.npcscriptDict = {};
- PropManager.npcnum = 0;
- PropManager.iscarmanpc = false;
- PropManager.liziDict = {};
- PropManager.jiantouArr = [];
- // /**
- // * 判断是否爬到顶端
- // */
- // static checkisClimbTop( sceneName:string,buildname:string, pos:Laya.Vector3 ):boolean
- // {
- // var vec:Laya.Vector3 = PropManager.getPosVecbyScene( sceneName,buildname );
- // if( vec && Math.abs(vec.y - pos.y) < 1.5 )
- // {
- // return true;
- // }
- // return false;
- // }
- PropManager.actionnums = 575;
- PropManager.actionDict = {
- "climbend": { s: 550, e: 575, islooping: false },
- "stand": { s: 0, e: 80, islooping: true },
- "run": { s: 90, e: 106, islooping: true },
- "jump": { s: 110, e: 132, islooping: true },
- "kongzhong": { s: 132, e: 145, islooping: true },
- "luodi1": { s: 145, e: 160, islooping: true },
- "luodi2": { s: 170, e: 202, islooping: true },
- "datiao1": { s: 210, e: 235, islooping: true },
- "datiao2": { s: 240, e: 273, islooping: true },
- "huachan": { s: 280, e: 310, islooping: true },
- "kualan": { s: 310, e: 346, islooping: true },
- "cefan1": { s: 350, e: 391, islooping: true },
- "cefan2": { s: 400, e: 434, islooping: true },
- "paoqiangleft": { s: 440, islooping: true, e: 456 },
- "rightjump": { s: 460, e: 477, islooping: true },
- "paoqiangright": { s: 480, e: 496, islooping: true },
- "leftjump": { s: 500, e: 517, islooping: true },
- "paqiang": { s: 520, e: 542, islooping: true }
- };
- return PropManager;
- }());
- exports.PropManager = PropManager;
- },{"../Config/AssetPath":15,"../utils/GameUtils":87}],50:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelChildControl_1 = require("../Control/PanelChildControl");
- var CpaEvent_1 = require("./CpaEvent");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var RecommendView_1 = require("./RecommendView");
- var TimerService_1 = require("../Time/TimerService");
- var BaoKuanGameView = /** @class */ (function (_super) {
- __extends(BaoKuanGameView, _super);
- function BaoKuanGameView() {
- var _this = _super.call(this) || this;
- _this._time = 0;
- _this.key = 0;
- _this._istart = false;
- return _this;
- }
- BaoKuanGameView.prototype.onInit = function () {
- this.initView();
- this.initEvent();
- };
- BaoKuanGameView.prototype.initView = function () {
- this.c_state = this.getController("c_state");
- this.t0 = this.getTransition("t0");
- this.c_state.selectedIndex = 0;
- };
- BaoKuanGameView.prototype.initEvent = function () {
- console.log("监听互推事件---BaokuanGame0");
- this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
- };
- BaoKuanGameView.prototype.yqhomedataHandler = function () {
- console.log("监听互推事件---BaokuanGame1");
- this.RefreshBKYX();
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- };
- BaoKuanGameView.prototype.update = function (dt) {
- if (this._istart) {
- this._time += dt;
- if (this._time >= 5000) {
- this._time = 0;
- this.RefreshBKYX(true);
- }
- }
- };
- BaoKuanGameView.prototype.RefreshBKYX = function (isanmo) {
- if (isanmo === void 0) { isanmo = false; }
- if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.recommend)
- return;
- console.log("监听互推事件---BaokuanGame2");
- this.c_state.selectedIndex = 1;
- var datas = RecommendView_1.Recommend.cainixihuanData;
- var item;
- for (var i = 0; i < 4; i++) {
- if (this.key + i >= datas.length - 1) {
- this.key = 0;
- }
- var curdata = datas[this.key + i];
- item = this["item_" + i];
- item.showData(curdata, true);
- if (curdata == null)
- continue;
- }
- this.key += 4;
- if (this.key >= datas.length - 1) {
- this.key = 0;
- }
- this._istart = true;
- if (isanmo) {
- this.t0.play(null, 1);
- }
- };
- return BaoKuanGameView;
- }(PanelChildControl_1.PanelChildControl));
- exports.default = BaoKuanGameView;
- },{"../Control/PanelChildControl":25,"../Time/TimerService":59,"../WXSDK/PlayerAccount":75,"./CpaEvent":53,"./RecommendView":55}],51:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var RecommendView_1 = require("./RecommendView");
- var ViewManager_1 = require("../View/ViewManager");
- var TimerService_1 = require("../Time/TimerService");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- var CompletePanel_1 = require("../View/CompletePanel");
- var RoleData_1 = require("../Data/RoleData");
- var ChoutiPanView = /** @class */ (function (_super) {
- __extends(ChoutiPanView, _super);
- function ChoutiPanView(end) {
- var _this = _super.call(this, "main", "choutipanView") || this;
- _this._iscanmove = false;
- _this.isend = 0;
- _this._movetime = 0;
- _this._flushtime = 0;
- _this.dir = true;
- _this._nowvalue = 0;
- _this.isend = end;
- return _this;
- }
- ChoutiPanView.prototype.initView = function () {
- this.list_0.setVirtual();
- this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
- this.list_1.setVirtual();
- this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
- this._nowList0 = RecommendView_1.Recommend.gdyxData;
- this._nowList1 = RecommendView_1.Recommend.gdyxData;
- this.list_0.numItems = this._nowList0.length;
- this.list_1.numItems = this._nowList1.length;
- this._isStart = true;
- this._iscanmove = true;
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- };
- ChoutiPanView.prototype.initEvent = function () {
- this.AddEventByType(this.btn_return, Laya.Event.CLICK, this, this.onclosefun);
- this.AddEventByType(this.btn_jixugame, Laya.Event.CLICK, this, this.onclosefun);
- this.AddEventByType(this.list_1, Laya.Event.MOUSE_DOWN, this, this.downclick);
- this.AddEventByType(this.list_1, Laya.Event.MOUSE_UP, this, this.upclick);
- this.AddEventByType(this.list_1, Laya.Event.MOUSE_OUT, this, this.upclick);
- };
- ChoutiPanView.prototype.itemrenderlist = function (index, item) {
- if (index < this._nowList0.length) {
- item.showData(this._nowList0[index]);
- }
- };
- ChoutiPanView.prototype.itemrenderlist1 = function (index, item) {
- if (index < this._nowList1.length) {
- item.showData(this._nowList1[index]);
- }
- };
- ChoutiPanView.prototype.downclick = function () {
- this._isdown = true;
- this._iscanmove = false;
- Laya.timer.clear(this, this.timeoutCallback);
- };
- ChoutiPanView.prototype.timeoutCallback = function () {
- this._iscanmove = true;
- };
- ChoutiPanView.prototype.upclick = function () {
- if (this._isdown) {
- this._isdown = false;
- this._nowvalue = this.list_1.scrollPane.percY;
- Laya.timer.once(2000, this, this.timeoutCallback);
- }
- };
- ChoutiPanView.prototype.update = function (dt) {
- if (this._isStart) {
- if (this.list_1.scrollPane && this._nowList1 && this._iscanmove) {
- if (this.dir) {
- this._nowvalue += 0.001;
- if (this._nowvalue >= 1) {
- this._nowvalue = 1;
- this.dir = false;
- }
- }
- else {
- this._nowvalue -= 0.001;
- if (this._nowvalue <= 0) {
- this._nowvalue = 0;
- this.dir = true;
- }
- }
- this.list_1.scrollPane.setPercY(this._nowvalue);
- }
- }
- };
- ChoutiPanView.prototype.onclosefun = function () {
- if (this.isend == 1) {
- ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
- }
- else if (this.isend == 2) {
- var gold = RoleData_1.RoleData.Instance.levelcfg.winGold;
- ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
- ViewManager_1.ViewManager.Instance.add(CompletePanel_1.CompletePanel, gold);
- }
- else {
- ViewManager_1.ViewManager.Instance.close(ChoutiPanView);
- }
- };
- ChoutiPanView.prototype.destory = function () {
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- _super.prototype.destory.call(this);
- };
- ChoutiPanView.key = "ChoutiPanView";
- return ChoutiPanView;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.default = ChoutiPanView;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelChildControl_1 = require("../Control/PanelChildControl");
- var CpaEvent_1 = require("./CpaEvent");
- var RecommendView_1 = require("./RecommendView");
- var TimerService_1 = require("../Time/TimerService");
- var SceneControl_1 = require("../Control/SceneControl");
- var CpaDownsView = /** @class */ (function (_super) {
- __extends(CpaDownsView, _super);
- function CpaDownsView() {
- var _this = _super.call(this) || this;
- _this._iscanmove = false;
- _this._movetime = 0;
- _this._flushtime = 0;
- _this.dir = true;
- _this._nowvalue = 0;
- return _this;
- }
- CpaDownsView.prototype.onInit = function () {
- this.c_state = this.getController("c_state");
- this.c_state.selectedIndex = 0;
- this.initView();
- this.initEvent();
- };
- CpaDownsView.prototype.initView = function () {
- this.list_0.setVirtual();
- this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
- this._isStart = false;
- };
- CpaDownsView.prototype.initEvent = function () {
- this.AddEventData(CpaEvent_1.default.YQHomeData, this, this.yqhomedataHandler);
- this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
- this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
- this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
- };
- CpaDownsView.prototype.downclick = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- this._isdown = true;
- this._iscanmove = false;
- Laya.timer.clear(this, this.timeoutCallback);
- // ttad.CreateMoreGameBtn();
- };
- CpaDownsView.prototype.timeoutCallback = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- this._iscanmove = true;
- };
- CpaDownsView.prototype.upclick = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- if (this._isdown) {
- this._isdown = false;
- this._nowvalue = this.list_0.scrollPane.percX;
- Laya.timer.once(2000, this, this.timeoutCallback);
- }
- };
- CpaDownsView.prototype.update = function (dt) {
- if (this._isStart) {
- if (this.list_0.scrollPane && this._nowList && this._iscanmove) {
- if (this.dir) {
- this._nowvalue += 0.001;
- if (this._nowvalue >= 1) {
- this._nowvalue = 1;
- this.dir = false;
- }
- }
- else {
- this._nowvalue -= 0.001;
- if (this._nowvalue <= 0) {
- this._nowvalue = 0;
- this.dir = true;
- }
- }
- this.list_0.scrollPane.setPercX(this._nowvalue);
- }
- }
- };
- CpaDownsView.prototype.itemrenderlist = function (index, item) {
- if (index < this._nowList.length) {
- item.showData(this._nowList[index], true);
- }
- };
- CpaDownsView.prototype.yqhomedataHandler = function () {
- this.c_state.selectedIndex = 1;
- this._nowList = RecommendView_1.Recommend.cainixihuanData;
- this.list_0.numItems = this._nowList.length;
- for (var i = 0; i < this._nowList.length; i++) {
- }
- this._isStart = true;
- this._iscanmove = true;
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- };
- CpaDownsView.prototype.dispose = function () {
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- _super.prototype.dispose.call(this);
- };
- return CpaDownsView;
- }(PanelChildControl_1.PanelChildControl));
- exports.default = CpaDownsView;
- },{"../Control/PanelChildControl":25,"../Control/SceneControl":29,"../Time/TimerService":59,"./CpaEvent":53,"./RecommendView":55}],53:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var CpaEvent = /** @class */ (function () {
- function CpaEvent() {
- }
- CpaEvent.YQHomeData = "CpaEvent_YQHomeData";
- return CpaEvent;
- }());
- exports.default = CpaEvent;
- },{}],54:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelChildControl_1 = require("../Control/PanelChildControl");
- var GameUtils_1 = require("../utils/GameUtils");
- var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
- var CpaItem = /** @class */ (function (_super) {
- __extends(CpaItem, _super);
- function CpaItem() {
- var _this = _super.call(this) || this;
- _this.ispenchoutipan = false;
- return _this;
- }
- CpaItem.prototype.onInit = function () {
- this.name = "capItem";
- this.AddEventByType(this, Laya.Event.CLICK, this, this.onbtnclick);
- };
- CpaItem.prototype.onbtnclick = function () {
- if (this._vo) {
- var data = this._vo;
- FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(data, this.ispenchoutipan);
- // var appid = data.to_appid;
- // var path = data.jump_path;
- // let param = {"appId":appid.toString(),"path":path.toString()};
- // if(Laya.Browser.onMobile)
- // {
- // Laya.Browser.window.wx.navigateToMiniProgram(
- // {
- // appId:appid.toString(),
- // path:path.toString(),
- // success:res=>
- // {
- // WxApi.recordAldEvent("跳转到游戏失成功","1");
- // },
- // fail:res=>
- // {
- // if( this.ispenchoutipan )
- // {
- // ViewManager.Instance.add( ChoutiPanView );
- // }
- // }
- // });
- // }
- }
- };
- CpaItem.prototype.showData = function (data, isopenchoutipan) {
- if (isopenchoutipan === void 0) { isopenchoutipan = false; }
- this.ispenchoutipan = isopenchoutipan;
- this._vo = data;
- if (data) {
- this.load_icon.url = data.icon;
- if (this.txt_word) {
- this.txt_word.text = data.togame_name;
- }
- if (this.img_tip) {
- this.img_tip.visible = Math.random() > 0.5 ? true : false;
- }
- if (this.txt_word1) {
- this.txt_word1.text = GameUtils_1.GameUtils.randRangeint(235470, 1561430).toString() + "人玩";
- }
- }
- };
- return CpaItem;
- }(PanelChildControl_1.PanelChildControl));
- exports.default = CpaItem;
- },{"../Control/PanelChildControl":25,"../WXSDK/FYHD_Sdk":71,"../utils/GameUtils":87}],55:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var CpaEvent_1 = require("./CpaEvent");
- var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
- var recommendPan = /** @class */ (function () {
- function recommendPan(data) {
- this.game_flg = data["game_flg"];
- this.game_id = data["game_id"];
- this.game_name = data["game_name"];
- this.id = data["id"];
- this.location_flg = data["location_flg"];
- this.location_id = data["location_id"];
- this.location_name = data["location_name"];
- this.matter_type = data["matter_type"];
- }
- return recommendPan;
- }());
- exports.recommendPan = recommendPan;
- var Recommend = /** @class */ (function () {
- function Recommend() {
- Recommend.InitData();
- }
- Recommend.InitData = function () {
- Recommend.cainixihuanData = Recommend.GetCaiNiXiaHuanDatas();
- Recommend.jiesuanData = Recommend.GetJIeSuanDatas();
- Recommend.gdyxData = Recommend.GetGDYXDatas();
- Recommend.baokuanyouxiData = Recommend.GetBaoKuanYouXiDatas();
- Recommend.moreData = Recommend.GetMoreDatas();
- for (var key in FYHD_Sdk_1.FYHD_Sdk.pushData) {
- Recommend.recommendDic[FYHD_Sdk_1.FYHD_Sdk.pushData[key].location_flg] = new recommendPan(FYHD_Sdk_1.FYHD_Sdk.pushData[key]);
- }
- Recommend.getdata = true;
- DispatcherManager_1.DispatcherManager.dispatchEvent(CpaEvent_1.default.YQHomeData);
- console.log("互推数据初始化recommend--------------");
- };
- Recommend.GetSSDatas = function () {
- var items = [];
- if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
- return items;
- for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
- items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
- }
- return items;
- };
- Recommend.GetCaiNiXiaHuanDatas = function () {
- var items = [];
- if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
- return items;
- for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
- items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
- }
- return items;
- };
- Recommend.GetMoreDatas = function () {
- var items = [];
- if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
- return items;
- for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
- items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
- }
- return items;
- };
- Recommend.GetBaoKuanYouXiDatas = function () {
- var items = [];
- if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
- return items;
- for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
- items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
- }
- return items;
- };
- Recommend.GetJIeSuanDatas = function () {
- var items = [];
- if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
- return items;
- for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
- items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
- }
- return items;
- };
- Recommend.GetGDYXDatas = function () {
- var items = [];
- if (!FYHD_Sdk_1.FYHD_Sdk.pushData)
- return items;
- for (var i = 0; i < FYHD_Sdk_1.FYHD_Sdk.pushData.length; i++) {
- items.push(new RecommendItem(FYHD_Sdk_1.FYHD_Sdk.pushData[i]));
- }
- return items;
- };
- Recommend.getdata = false;
- Recommend.recommendDic = {};
- Recommend.cainixihuanData = [];
- Recommend.baokuanyouxiData = [];
- Recommend.gdyxData = [];
- Recommend.jiesuanData = [];
- Recommend.moreData = [];
- return Recommend;
- }());
- exports.Recommend = Recommend;
- var RecommendItem = /** @class */ (function () {
- function RecommendItem(Data) {
- this.icon = Data["icon"];
- this.to_appid = Data["to_appid"];
- this.togame_name = Data["togame_name"];
- this.jump_path = Data["jump_path"];
- this.jump_type = Data["jump_type"];
- this.panel = Data["panel"];
- this.qrcode = Data["qrcode"];
- }
- return RecommendItem;
- }());
- exports.RecommendItem = RecommendItem;
- var RecommendView = /** @class */ (function () {
- function RecommendView() {
- }
- return RecommendView;
- }());
- exports.default = RecommendView;
- },{"../WXSDK/FYHD_Sdk":71,"../utils/DispatcherManager":85,"./CpaEvent":53}],56:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelChildControl_1 = require("../Control/PanelChildControl");
- var RecommendView_1 = require("./RecommendView");
- var TimerService_1 = require("../Time/TimerService");
- // import { ttad } from "../ttad";
- var ShiwantuijianView = /** @class */ (function (_super) {
- __extends(ShiwantuijianView, _super);
- function ShiwantuijianView() {
- var _this = _super.call(this) || this;
- _this._iscanmove = false;
- _this._movetime = 0;
- _this._flushtime = 0;
- _this.dir = true;
- _this._nowvalue = 0;
- return _this;
- }
- ShiwantuijianView.prototype.onInit = function () {
- this.initView();
- this.initEvent();
- };
- ShiwantuijianView.prototype.initView = function () {
- this.list_0.setVirtual();
- this.list_0.itemRenderer = Laya.Handler.create(this, this.itemrenderlist, null, false);
- this._nowlist = RecommendView_1.Recommend.jiesuanData;
- if (this._nowlist.length > 0) {
- this.list_0.numItems = this._nowlist.length;
- this.visible = true;
- for (var i = 0; i < this._nowlist.length; i++) {
- }
- this._isStart = true;
- this._iscanmove = true;
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- }
- else {
- this.visible = false;
- }
- };
- ShiwantuijianView.prototype.initEvent = function () {
- this.AddEventByType(this.list_0, Laya.Event.MOUSE_DOWN, this, this.downclick);
- this.AddEventByType(this.list_0, Laya.Event.MOUSE_UP, this, this.upclick);
- this.AddEventByType(this.list_0, Laya.Event.MOUSE_OUT, this, this.upclick);
- };
- ShiwantuijianView.prototype.downclick = function () {
- this._isdown = true;
- this._iscanmove = false;
- Laya.timer.clear(this, this.timeoutCallback);
- // ttad.CreateMoreGameBtn();
- };
- ShiwantuijianView.prototype.timeoutCallback = function () {
- this._iscanmove = true;
- };
- ShiwantuijianView.prototype.upclick = function () {
- if (this._isdown) {
- this._isdown = false;
- this._nowvalue = this.list_0.scrollPane.percY;
- Laya.timer.once(2000, this, this.timeoutCallback);
- }
- };
- ShiwantuijianView.prototype.itemrenderlist = function (index, item) {
- if (index < this._nowlist.length) {
- item.showData(this._nowlist[index], true);
- }
- };
- ShiwantuijianView.prototype.update = function (dt) {
- if (this._isStart) {
- if (this.list_0.scrollPane && this._nowlist && this._nowlist.length > 0 && this._iscanmove) {
- if (this.dir) {
- this._nowvalue += 0.001;
- if (this._nowvalue >= 1) {
- this._nowvalue = 1;
- this.dir = false;
- }
- }
- else {
- this._nowvalue -= 0.001;
- if (this._nowvalue <= 0) {
- this._nowvalue = 0;
- this.dir = true;
- }
- }
- this.list_0.scrollPane.setPercY(this._nowvalue);
- }
- }
- };
- ShiwantuijianView.prototype.dispose = function () {
- this._iscanmove = false;
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- _super.prototype.dispose.call(this);
- };
- return ShiwantuijianView;
- }(PanelChildControl_1.PanelChildControl));
- exports.default = ShiwantuijianView;
- },{"../Control/PanelChildControl":25,"../Time/TimerService":59,"./RecommendView":55}],57:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var RecommendView_1 = require("./RecommendView");
- var ViewManager_1 = require("../View/ViewManager");
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var GameUtils_1 = require("../utils/GameUtils");
- var FYHD_Sdk_1 = require("../WXSDK/FYHD_Sdk");
- var TuijianView = /** @class */ (function (_super) {
- __extends(TuijianView, _super);
- function TuijianView() {
- return _super.call(this, "main", "tuijianView") || this;
- }
- TuijianView.prototype.initView = function () {
- this.list_1.setVirtual();
- this.list_1.itemRenderer = Laya.Handler.create(this, this.itemrenderlist1, null, false);
- this.list_2.setVirtual();
- this.list_2.itemRenderer = Laya.Handler.create(this, this.itemrenderlist2, null, false);
- this._nowlist1 = RecommendView_1.Recommend.gdyxData;
- this._nowlist2 = RecommendView_1.Recommend.gdyxData;
- this.list_1.numItems = 7;
- this.list_2.numItems = this._nowlist2.length;
- };
- TuijianView.prototype.initEvent = function () {
- this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
- this.AddEventByType(this.more, Laya.Event.CLICK, this, this.JumpApp);
- };
- TuijianView.prototype.itemrenderlist1 = function (index, item) {
- if (index < 7) {
- item.showData(this._nowlist1[index]);
- }
- };
- TuijianView.prototype.itemrenderlist2 = function (index, item) {
- if (index < this._nowlist2.length) {
- item.showData(this._nowlist2[index]);
- }
- };
- TuijianView.prototype.onclosefun = function () {
- ViewManager_1.ViewManager.Instance.close(TuijianView);
- };
- //随机跳转游戏
- TuijianView.prototype.JumpApp = function () {
- var ran = GameUtils_1.GameUtils.randRangeint(0, this._nowlist1.length - 1);
- FYHD_Sdk_1.FYHD_Sdk.ShowHuTuiJump(this._nowlist1[ran], false);
- };
- TuijianView.key = "TuijianView";
- return TuijianView;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.default = TuijianView;
- },{"../Control/PanelBaseControl":24,"../View/ViewManager":70,"../WXSDK/FYHD_Sdk":71,"../utils/GameUtils":87,"./RecommendView":55}],58:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var TimeUtils = /** @class */ (function () {
- function TimeUtils() {
- }
- /**
- * 月/日 小时:分钟
- * @param value
- */
- TimeUtils.formatData = function (value) {
- var str = "";
- var date = new Date(value * 1000);
- str = this.getTwo(date.getMonth() + 1) + "/" + this.getTwo(date.getDate()) + " " + this.getTwo(date.getHours()) + ":" + this.getTwo(date.getMinutes());
- return str;
- };
- /**
- * 月/日
- * @param value
- */
- TimeUtils.formatData1 = function (value) {
- var str = "";
- var date = new Date(value * 1000);
- str = (date.getMonth() + 1) + "月" + date.getDate() + "日";
- return str;
- };
- /**
- * 年月日
- * @param value
- */
- TimeUtils.formatYearMonthDate = function (value) {
- var str = "";
- var date = new Date(value * 1000);
- str = date.getFullYear() + "." + (date.getMonth() + 1) + "." + date.getDate();
- return str;
- };
- /**
- * 年-月-日
- * @param value
- */
- TimeUtils.formatYearMonthDate1 = function (value) {
- var str = "";
- var date = new Date(value * 1000);
- var month = (date.getMonth() + 1) >= 10 ? (date.getMonth() + 1).toString() : "0" + (date.getMonth() + 1);
- var dates = date.getDate() >= 10 ? date.getDate().toString() : "0" + date.getDate();
- str = date.getFullYear() + "-" + month + "-" + dates;
- return str;
- };
- TimeUtils.LXandJXTimeType = function (value) {
- var str = "";
- if (value < 0) {
- str = "0秒";
- }
- else if (value < 60) {
- str = Math.floor(value) + "秒";
- }
- else if (value < 60 * 60) {
- str = Math.floor(value / 60) + "分钟";
- }
- else {
- var hour;
- hour = Math.floor(value / 60 / 60);
- str = hour + "小时";
- str += Math.floor((value - hour * 60 * 60) / 60) + "分钟";
- }
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回24:59:59
- */
- TimeUtils.formatTime = function (time) {
- var str = "";
- var hours = Math.floor(time / 3600);
- if (hours > 0) {
- str += hours >= 10 ? (hours + ":") : ("0" + hours + ":");
- }
- var minutes = Math.floor((time % 3600) / 60);
- str += minutes >= 10 ? (minutes + ":") : ("0" + minutes + ":");
- var second = Math.floor(time % 60);
- str += second >= 10 ? (second + "") : ("0" + second);
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回24小时59分59秒
- */
- TimeUtils.formatTime1 = function (time) {
- var str = "";
- var hours = Math.floor(time / 3600);
- if (hours > 0) {
- str += hours + "小时";
- }
- var minutes = Math.floor((time % 3600) / 60);
- str += minutes + "分钟";
- var second = Math.floor(time % 60);
- str += second + "秒";
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回1小时24分10秒
- */
- TimeUtils.formatTime5 = function (time) {
- var str = "";
- var hours = Math.floor(time / 3600);
- if (hours > 0) {
- str += hours + "小时";
- }
- var minutes = Math.floor((time % 3600) / 60);
- if (minutes > 0) {
- str += minutes + "分";
- }
- var second = Math.floor(time % 60);
- str += second + "秒";
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回1天24小时59分59秒
- */
- TimeUtils.formatTime2 = function (time) {
- var str = "";
- var day = Math.floor(time / 86400);
- if (day > 0) {
- str += day + "天";
- }
- var hours = Math.floor(time / 3600);
- if (hours > 0) {
- str += hours + "小时";
- }
- var minutes = Math.floor((time % 3600) / 60);
- if (minutes > 0) {
- str += minutes + "分钟";
- }
- var second = Math.ceil(time % 60);
- str += second + "秒";
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回1天24小时( 只保留两个 )
- */
- TimeUtils.formatTime6 = function (time) {
- var str = "";
- var index = 0;
- var day = Math.floor(time / 86400);
- if (day > 0) {
- str += day + "天";
- index++;
- }
- var hours = Math.floor((time % 86400) / 3600);
- if (hours > 0) {
- str += hours + "小时";
- index++;
- }
- if (index < 2) {
- var minutes = Math.floor((time % 3600) / 60);
- if (minutes > 0) {
- str += minutes + "分";
- index++;
- }
- }
- if (index < 2) {
- var second = Math.ceil(time % 60);
- str += second + "秒";
- }
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回1天24小时59分
- */
- TimeUtils.formatTime3 = function (time) {
- var str = "";
- var day = Math.floor(time / 86400);
- str += day + "天";
- var hours = Math.floor(time % 86400 / 3600);
- str += hours + "小时";
- var minutes = Math.floor((time % 86400 % 3600) / 60);
- str += minutes + "分";
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回1天24小时59分
- */
- TimeUtils.formatTime4 = function (time) {
- var str = "";
- if (time > 86400) {
- var day = Math.floor(time / 86400);
- str += day + "天";
- }
- if (time > 3600) {
- var hours = Math.floor(time % 86400 / 3600);
- str += hours + "小时";
- }
- if (time > 60) {
- var minutes = Math.floor((time % 86400 % 3600) / 60);
- str += minutes + "分钟";
- }
- return str;
- };
- /**
- * 格式化时间
- * @param time 秒
- * @return 返回1天24小时59分
- */
- TimeUtils.formatTime4Arr = function (time) {
- var arrTime = [];
- var str = "";
- // if (time >= 86400) {
- // var day: number = Math.floor(time / 86400);
- // arrTime.unshift(String(day));
- // }
- if (time >= 3600) {
- var hours = Math.floor(time % 86400 / 3600);
- arrTime.unshift(String(hours));
- }
- if (time >= 60) {
- var minutes = Math.floor((time % 86400 % 3600) / 60);
- arrTime.unshift(String(minutes));
- }
- return arrTime;
- };
- TimeUtils.getTwo = function (value) {
- var str = String(value);
- if (str.length < 2) {
- str = "0" + str;
- }
- return str;
- };
- /**
- * 日期转时间戳
- * @param str 2018-1-1
- */
- TimeUtils.datetoTime = function (str) {
- return Date.parse(str) / 1000;
- };
- return TimeUtils;
- }());
- exports.TimeUtils = TimeUtils;
- },{}],59:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /*
- * name;
- */
- var TimerService = /** @class */ (function (_super) {
- __extends(TimerService, _super);
- function TimerService() {
- var _this = _super.call(this) || this;
- _this._timeScale = 1;
- _this._unscalableList = [];
- TimerService.ins = _this;
- return _this;
- }
- Object.defineProperty(TimerService, "Instance", {
- get: function () {
- if (TimerService.ins == null) {
- return new TimerService();
- }
- return TimerService.ins;
- },
- enumerable: true,
- configurable: true
- });
- TimerService.prototype.init = function () {
- Laya.timer.frameLoop(1, this, this.onTimer);
- };
- TimerService.prototype.initEvent = function () {
- };
- TimerService.prototype.stop = function () {
- Laya.timer.clear(this, this.onTimer);
- };
- TimerService.prototype.recover = function () {
- this.stop();
- Laya.timer.frameLoop(1, this, this.onTimer);
- };
- TimerService.prototype.onTimer = function () {
- var i = 0;
- for (i = 0; i < this._unscalableList.length; i++) {
- this._unscalableList[i].update(Laya.timer.delta * this._timeScale);
- }
- };
- TimerService.prototype.hasUpdataTarget = function (updateTarget) {
- var index;
- index = this._unscalableList.indexOf(updateTarget);
- if (index != -1) {
- return true;
- }
- return false;
- };
- TimerService.prototype.addUpdateTarget = function (updateTarget) {
- var index;
- index = this._unscalableList.indexOf(updateTarget);
- if (index == -1) {
- this._unscalableList.push(updateTarget);
- }
- };
- TimerService.prototype.removeUpdateTarget = function (updateTarget) {
- var index = this._unscalableList.indexOf(updateTarget);
- if (index != -1) {
- this._unscalableList.splice(index, 1);
- }
- };
- Object.defineProperty(TimerService.prototype, "timeScale", {
- get: function () {
- return this._timeScale;
- },
- /**
- * @private
- */
- set: function (value) {
- if (value < 0 || isNaN(value)) {
- value = 1;
- }
- this._timeScale = value;
- },
- enumerable: true,
- configurable: true
- });
- return TimerService;
- }(Laya.EventDispatcher));
- exports.TimerService = TimerService;
- },{}],60:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var UserDataInfo_1 = require("../Data/UserDataInfo");
- var LocalDataControl_1 = require("../Control/LocalDataControl");
- var TimesTamper = /** @class */ (function () {
- function TimesTamper() {
- this.lastgameTime = 0;
- /**
- * 同步服务器时间(秒)
- */
- this._serverTime = 0;
- this.iscan = false;
- this._onlinedistime = 0;
- this._time = 0;
- this._onlinetime = 0;
- }
- Object.defineProperty(TimesTamper, "Instance", {
- get: function () {
- if (TimesTamper.ins == null) {
- return new TimesTamper();
- }
- return TimesTamper.ins;
- },
- enumerable: true,
- configurable: true
- });
- TimesTamper.prototype.init = function () {
- this.lastgameTime = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.lasttime);
- Laya.timer.frameLoop(1, this, this.update);
- };
- TimesTamper.prototype.updateServiceTime = function (serverTime) {
- this._serverTime = Number(serverTime);
- this.iscan = true;
- this._onlinedistime = this._serverTime;
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
- };
- TimesTamper.prototype.update = function () {
- if (this.iscan) {
- this._time += Laya.timer.delta;
- this._onlinetime += Laya.timer.delta;
- this._serverTime += Laya.timer.delta / 1000;
- if (this._time >= 30000) {
- this._time = 0;
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.lasttime, this._serverTime.toString());
- }
- if (this._onlinetime >= 90000) {
- this._onlinetime = 0;
- this.sendonlineTongji();
- }
- }
- };
- TimesTamper.prototype.sendonlineTongji = function () {
- var distime = this.serverTime - this._onlinedistime;
- if (distime > 0) {
- this._onlinedistime = this.serverTime;
- }
- };
- Object.defineProperty(TimesTamper.prototype, "serverTime", {
- /**
- * 服务器时间 ( 秒 )
- * @return
- *
- */
- get: function () {
- return this._serverTime;
- },
- enumerable: true,
- configurable: true
- });
- return TimesTamper;
- }());
- exports.TimesTamper = TimesTamper;
- },{"../Control/LocalDataControl":23,"../Data/UserDataInfo":35}],61:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var ViewAction_1 = require("../utils/ViewAction");
- var GameStateControl_1 = require("../Control/GameStateControl");
- var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
- var AgencyInGame_1 = require("../Agency/AgencyInGame");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var ViewManager_1 = require("../View/ViewManager");
- var GuangGao_1 = require("../WXSDK/GuangGao");
- var GameState_1 = require("../utils/GameState");
- var Player_1 = require("../Game/Player");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var CharacterState_1 = require("../PrefabControl/CharacterState");
- var RecordManager_1 = require("../WXSDK/RecordManager");
- var ttad_1 = require("../WXSDK/ttad");
- // import ChoutiPanView from "../Push/ChoutiPanView";
- var CompletePanel = /** @class */ (function (_super) {
- __extends(CompletePanel, _super);
- function CompletePanel(gold) {
- var _this = _super.call(this, "main", "gameresult", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
- _this.getgold = 0;
- _this._position = new Laya.Vector3();
- _this._outPos = new Laya.Vector3();
- _this.scaleDelta = 0;
- _this.scale = new Laya.Vector3(0.1, 0.1, 0.1);
- _this.time = 9;
- _this.count = false;
- _this.fuhuo = false;
- _this.getgold = gold;
- return _this;
- }
- /*************************************************************** */
- CompletePanel.prototype.loadScene = function () {
- Laya.Scene3D.load("res/threeDimen/scene/ParticleScene/Example_01.ls", Laya.Handler.create(this, function (scene) {
- this.scene = Laya.stage.addChildAt(scene, 0);
- var camera = this.scene.addChild(new Laya.Camera(0, 0.1, 100));
- camera.transform.translate(new Laya.Vector3(0, 1, 0));
- }));
- };
- CompletePanel.prototype.garbageCollection = function () {
- this.scene.destroy(); //销毁场景
- this.scene = null;
- Laya.Resource.destroyUnusedResources(); //销毁无用资源(没有被场景树引用,并且没有加资源锁的)
- };
- /*************************************************************** */
- CompletePanel.prototype.btn1click = function () {
- if (this.c_state.selectedIndex == 0) {
- if (this.duihao.visible) {
- this.playvideocallback();
- }
- else {
- this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
- this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp();
- this._gameProxy.returnmainview(true);
- }
- }
- else if (this.c_state.selectedIndex == 1) {
- this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
- this._gameProxy.returnmainview();
- // ViewManager.Instance.add( ChoutiPanView );
- }
- else if (this.c_state.selectedIndex == 2) {
- // ShareUtil.shareImage("分享复活----",this.sharerevive,"1")
- this.sharerevive();
- }
- };
- CompletePanel.prototype.onComplete = function () {
- Laya.Sprite3D.load("res/threeDimen/skinModel/LayaMonkey/LayaMonkey.lh", Laya.Handler.create(this, function (layaMonkey3D) {
- this.layaMonkey3D = layaMonkey3D;
- this.scene.addChild(layaMonkey3D);
- this.layaMonkey2D = Laya.stage.addChild(new Laya.Image("res/threeDimen/monkey.png"));
- Laya.timer.frameLoop(1, this, this.animate);
- }));
- };
- CompletePanel.prototype.animate = function () {
- this._position.x = Math.sin(this.scaleDelta += 0.01);
- this.layaMonkey3D.transform.position = this._position;
- this.layaMonkey3D.transform.scale = this.scale;
- //转换坐标
- this.camera.viewport.project(this.layaMonkey3D.transform.position, this.camera.projectionViewMatrix, this._outPos);
- //赋值给2D
- this.layaMonkey2D.pos(this._outPos.x / Laya.stage.clientScaleX, this._outPos.y / Laya.stage.clientScaleY);
- };
- /******************************************** */
- CompletePanel.prototype.btn0click = function () {
- if (this.c_state.selectedIndex == 0) {
- this.playvideocallback();
- // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
- }
- else if (this.c_state.selectedIndex == 1) {
- this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(this.getgold);
- this._gameProxy.returnmainview();
- // ViewManager.Instance.add( ChoutiPanView );
- }
- else if (this.c_state.selectedIndex == 2) {
- this.count = false;
- // pingtaiutils.Instance.playVideo("",this,this.playvideorevive);
- this.playvideorevive();
- }
- };
- /**看视频复活成功 */
- CompletePanel.prototype.playvideorevive = function () {
- var _this = this;
- ttad_1.ttad.ShowVideo((function (isLoad) {
- if (isLoad) {
- // ViewManager.Instance.add(ChoutiPanView);
- GameState_1.GameState.fuhuocishu--;
- ViewManager_1.ViewManager.Instance.close(CompletePanel);
- GameState_1.GameState.isdie = false;
- Player_1.Player.Instance._iscanMove = true;
- // Player.Instance.PlayAnimator( CharacterState.run );
- Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
- if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
- console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
- console.log("玩家速度_moveVec", Player_1.Player.Instance._moveVec);
- Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
- }
- else {
- console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
- console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
- console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
- Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
- }
- Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
- Laya.timer.once(3000, _this, function () {
- Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
- });
- }
- else {
- _this.count = true;
- }
- }));
- };
- /**分享复活成功 */
- CompletePanel.prototype.sharerevive = function () {
- var _this = this;
- RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
- if (isLoad) {
- RecordManager_1.RecordManager.Instance.RecordStart();
- GameState_1.GameState.fuhuocishu--;
- // GameState.recordscree = true;
- ViewManager_1.ViewManager.Instance.close(CompletePanel);
- GameState_1.GameState.isdie = false;
- Player_1.Player.Instance._iscanMove = true;
- // Player.Instance.PlayAnimator( CharacterState.run );
- Player_1.Player.Instance.nowAction = CharacterState_1.CharacterState.run;
- if (Player_1.Player.Instance._nowscenename == "" || Player_1.Player.Instance._nowbuildname == "") {
- console.log("玩家位置----", Player_1.Player.Instance._initPosVec);
- Player_1.Player.Instance._transform.position = new Laya.Vector3(0, 1, 3);
- }
- else {
- console.log("当前场景名字---", Player_1.Player.Instance._nowscenename);
- console.log("当前建筑名字---", Player_1.Player.Instance._nowbuildname);
- console.log("建筑物位置----", PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname));
- Player_1.Player.Instance._transform.position = PropManager_1.PropManager.getPosVecbyScene(Player_1.Player.Instance._nowscenename, Player_1.Player.Instance._nowbuildname).clone();
- }
- // GlobalTip.Instance.showWordTips("复活加速成功");
- Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed * 2;
- Laya.timer.once(3000, _this, function () {
- Player_1.Player.Instance._speedMoveV3.z = -Player_1.Player.Instance._RoleData.movespeed;
- });
- }
- else {
- _this.count = true;
- }
- });
- // if(_success){
- // // ViewManager.Instance.add(ChoutiPanView);
- // GameState.fuhuocishu --;
- // ViewManager.Instance.close( CompletePanel );
- // GameState.isdie = false;
- // Player.Instance._iscanMove = true;
- // // Player.Instance.PlayAnimator( CharacterState.run );
- // Player.Instance.nowAction = CharacterState.run;
- // if (Player.Instance._nowscenename == "" || Player.Instance._nowbuildname == "") {
- // console.log("玩家位置----",Player.Instance._initPosVec);
- // Player.Instance._transform.position = Player.Instance._initPosVec.clone()
- // }
- // else {
- // console.log("当前场景名字---",Player.Instance._nowscenename);
- // console.log("当前建筑名字---",Player.Instance._nowbuildname);
- // console.log("建筑物位置----",PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname));
- // Player.Instance._transform.position = PropManager.getPosVecbyScene(Player.Instance._nowscenename, Player.Instance._nowbuildname).clone();
- // }
- // // GlobalTip.Instance.showWordTips("复活加速成功");
- // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed*2;
- // Laya.timer.once(3000,this,()=>{
- // Player.Instance._speedMoveV3.z = -Player.Instance._RoleData.movespeed;
- // })
- // }
- // else{
- // this.count = true;
- // }
- };
- CompletePanel.prototype.playvideocallback = function () {
- var _this = this;
- ttad_1.ttad.ShowVideo((function (isLoad) {
- if (isLoad) {
- _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3);
- _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).LevelUp();
- _this._gameProxy.returnmainview(true);
- _this.BattleBtn.visible = false;
- }
- }));
- // ttad.ShowVideo((isLoad=>{
- // if(isLoad){
- // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( this.getgold*3 );
- // this._gameProxy.returnmainview(true);
- // }
- // }))
- };
- //分享视频
- CompletePanel.prototype.ShareVideoCallBack = function () {
- var _this = this;
- RecordManager_1.RecordManager.Instance.ShareVideo((function (isLoad) {
- if (isLoad) {
- _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(_this.getgold * 3);
- _this.BattleBtn.visible = false;
- _this.ShareVideo.visible = false;
- }
- }));
- };
- //点击勾选框
- CompletePanel.prototype.ClickKuang = function () {
- if (this.duihao.visible) {
- this.duihao.visible = false;
- this.btn_1.visible = this.duihao.visible;
- this.btn_2.visible = !this.duihao.visible;
- }
- else {
- this.duihao.visible = true;
- this.btn_1.visible = this.duihao.visible;
- this.btn_2.visible = !this.duihao.visible;
- }
- };
- CompletePanel.prototype.destory = function () {
- Laya.timer.clear(this, this.CountTime);
- // Laya.timer.clear(this,this.playanimator);
- // GuangGao.Clear();
- ttad_1.ttad.Clear();
- _super.prototype.destory.call(this);
- };
- CompletePanel.prototype.initView = function () {
- var _this = this;
- this.tianjia.visible = false;
- this.TianJiaAni = this.getTransitionByName("tianjiaani");
- this.TianJiaAni.stop();
- // Laya.timer.loop(2000,this,this.playanimator);
- this.count = true;
- this._gameProxy = this.getProxy(AgencyInGame_1.AgencyInGame);
- this.c_state = this.getControllerByBame("c_state");
- this.txt_gold.text = this.getgold.toString();
- this.duihao = this.kuang.getChildAt(1);
- this.duihao.visible = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.Choose;
- this.share_goldnum = this.ShareVideo.getChildAt(4);
- this.ShareVideoBtn = this.ShareVideo.getChildAt(1);
- this.jiesuanbtn = this.ShareVideo.getChildAt(2);
- this.share_goldnum.text = this.getgold.toString();
- this.btn_1.visible = this.duihao.visible;
- this.btn_2.visible = !this.duihao.visible;
- if (GameState_1.GameState.recordscree) {
- this.BattleBtn.visible = false;
- }
- else {
- this.BattleBtn.visible = false;
- if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShowBattleBtn) {
- this.BattleBtn.visible = true;
- }
- }
- // this.BattleBtn.visible = !GameState.recordscree;
- if (!GameState_1.GameState.isdie) { //玩家未死亡的状态
- if (GameStateControl_1.GameStateControl.Instance.endGamePlayerArr.length == 0) {
- this.c_state.selectedIndex = 0;
- }
- else {
- this.c_state.selectedIndex = 1;
- }
- }
- else {
- if (GameState_1.GameState.fuhuocishu > 0) {
- this.c_state.selectedIndex = 2;
- Laya.timer.loop(1000, this, this.CountTime);
- }
- else {
- this.c_state.selectedIndex = 1;
- }
- }
- if (this.c_state.selectedIndex == 0) {
- this.ShareVideo.visible = true;
- this.jiesuanbtn.visible = false;
- Laya.timer.once(2000, this, function () {
- _this.jiesuanbtn.visible = true;
- });
- }
- else {
- this.ShareVideo.visible = false;
- }
- GuangGao_1.GuangGao.CheatBanner(this.btn_1);
- };
- CompletePanel.prototype.playanimator = function () {
- this.TianJiaAni.play(null, 1);
- };
- CompletePanel.prototype.ClickJieSuan = function () {
- this.ShareVideo.visible = false;
- };
- CompletePanel.prototype.initEvent = function () {
- this.AddEventByType(this.btn_0, Laya.Event.CLICK, this, this.btn0click);
- this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.btn1click);
- this.AddEventByType(this.BattleBtn, Laya.Event.CLICK, this, this.ShareBattle);
- this.AddEventByType(this.btn_2, Laya.Event.CLICK, this, this.btn1click);
- this.AddEventByType(this.kuang, Laya.Event.CLICK, this, this.ClickKuang);
- this.AddEventByType(this.ShareVideoBtn, Laya.Event.CLICK, this, this.ShareVideoCallBack);
- this.AddEventByType(this.jiesuanbtn, Laya.Event.CLICK, this, this.ClickJieSuan);
- };
- //倒计时
- CompletePanel.prototype.CountTime = function () {
- if (this.count && this.time > 0) {
- this.time -= 1;
- this.timenum.text = this.time.toString();
- if (this.time < 1) {
- Laya.timer.clear(this, this.CountTime);
- GameState_1.GameState.fuhuocishu--;
- // Laya.timer.clear(this,this.playanimator);
- ViewManager_1.ViewManager.Instance.close(CompletePanel);
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.lose);
- }
- }
- };
- //录屏分享
- CompletePanel.prototype.ShareBattle = function () {
- var _this = this;
- RecordManager_1.RecordManager.Instance.ShareVideo(function (isLoad) {
- if (isLoad) {
- _this.BattleBtn.visible = false;
- }
- });
- // RecordManager.Instance.ShareVideo((isLoad=>{
- // if(isLoad){
- // this.BattleBtn.visible = false;
- // }
- // }))
- };
- CompletePanel.key = "CompletePanel";
- return CompletePanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.CompletePanel = CompletePanel;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var GameUtils_1 = require("../utils/GameUtils");
- var TimerService_1 = require("../Time/TimerService");
- var GuangGao_1 = require("../WXSDK/GuangGao");
- var ViewAction_1 = require("../utils/ViewAction");
- var ViewManager_1 = require("./ViewManager");
- var SceneControl_1 = require("../Control/SceneControl");
- var GameStateControl_1 = require("../Control/GameStateControl");
- var GlobalTip_1 = require("../utils/GlobalTip");
- var ttad_1 = require("../WXSDK/ttad");
- var EggPanel = /** @class */ (function (_super) {
- __extends(EggPanel, _super);
- function EggPanel() {
- var _this = _super.call(this, "main", "eggview", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
- _this._isComplete = false;
- _this._isShowBanner = false;
- _this._bannerVal = 0.5;
- _this._maxClickCnt = 18;
- _this._clickCnt = 0;
- _this._interval = 100;
- _this._decrement = 1;
- _this._time = 0;
- return _this;
- }
- EggPanel.prototype.initView = function () {
- this.hitani = this.getTransitionByName("hitani");
- this.pro_0.value = 1;
- this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- // GuangGao.CheatBanner(this.btn_1);
- // GuangGao.Clear();//h["default"].Clear()r["default"]
- ttad_1.ttad.Clear();
- var sceneheight = Laya.stage.height;
- this.btn_1.y = sceneheight - this.btn_1.height - 15;
- this.getrewardbtn.y = this.btn_1.y;
- this.getrewardbtn.visible = false;
- if (SceneControl_1.SceneControl.EggGGroup == 0) {
- this.n6.visible = true;
- }
- };
- EggPanel.prototype.bannercallback = function () {
- };
- EggPanel.prototype.initEvent = function () {
- this.AddEventByType(this.btn_1, Laya.Event.CLICK, this, this.qiaoDa);
- this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, EggPanel.onclosefun);
- this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, EggPanel.VideoGetReward);
- };
- EggPanel.prototype.update = function (dt) {
- this._time += dt;
- if (this._time >= this._interval) {
- this._time = 0;
- this.Daojishi();
- }
- };
- EggPanel.prototype.Daojishi = function () {
- var pv = this.pro_0.value;
- pv -= this._decrement;
- if (pv <= 0)
- pv = 1;
- this.pro_0.value = pv;
- this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
- };
- EggPanel.prototype.qiaoDa = function () {
- var _this = this;
- if (!this._isComplete) {
- if (this.hitani != null && !this.hitani.playing) {
- this.hitani.play(null, 1);
- }
- this._clickCnt++;
- if (this._clickCnt > this._maxClickCnt)
- this._clickCnt = this._maxClickCnt;
- var pv = this._clickCnt / this._maxClickCnt;
- if (pv > 1) {
- pv = 1;
- }
- this.pro_0.value = pv * 100;
- if (pv >= this._bannerVal && !this._isShowBanner) {
- this._isShowBanner = true;
- this.getrewardbtn.visible = true;
- // GuangGao.OpenBanner();
- Laya.timer.once(2000, this, function () {
- _this.getrewardbtn.visible = false;
- });
- }
- if (pv >= 1) {
- this._isComplete = true;
- EggPanel.getreward();
- }
- }
- };
- EggPanel.getreward = function () {
- // var zpproxy:AgencyLottery = this.getProxy( AgencyLottery ) as AgencyLottery;
- // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
- // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
- // zpproxy.getreward( selectcfg );
- // TimerService.Instance.removeUpdateTarget( this );
- GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
- EggPanel.onclosefun();
- };
- //看视频得奖励
- EggPanel.VideoGetReward = function () {
- ttad_1.ttad.ShowVideo((function (isLoad) {
- if (isLoad) {
- GlobalTip_1.GlobalTip.Instance.showWordTips("获得开局加速");
- EggPanel.onclosefun();
- }
- else {
- EggPanel.onclosefun();
- }
- }));
- };
- EggPanel.prototype.hidebanner = function () {
- // PlatformTool.getInstance().hideBanner("EggView");
- GuangGao_1.GuangGao.hidebanner();
- };
- EggPanel.onclosefun = function () {
- ViewManager_1.ViewManager.Instance.close(EggPanel);
- };
- EggPanel.prototype.destory = function () {
- // PlatformTool.getInstance().hideBanner("EggView");
- // GuangGao.hidebanner();
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- _super.prototype.destory.call(this);
- GameStateControl_1.GameStateControl.Instance.entergame(true);
- };
- EggPanel.key = "EggPanel";
- return EggPanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.default = EggPanel;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var GameUtils_1 = require("../utils/GameUtils");
- var TimerService_1 = require("../Time/TimerService");
- var GuangGao_1 = require("../WXSDK/GuangGao");
- var ViewManager_1 = require("./ViewManager");
- var GlobalTip_1 = require("../utils/GlobalTip");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var RoleData_1 = require("../Data/RoleData");
- var ttad_1 = require("../WXSDK/ttad");
- var GiftView = /** @class */ (function (_super) {
- __extends(GiftView, _super);
- function GiftView() {
- var _this = _super.call(this, "main", "giftcheatview") || this;
- _this._isComplete = false;
- _this._isShowBanner = false;
- _this._bannerVal = 0.5;
- _this._maxClickCnt = 18;
- _this._clickCnt = 0;
- _this._interval = 100;
- _this._decrement = 1;
- _this._time = 0;
- return _this;
- }
- GiftView.prototype.initView = function () {
- this.anniu = this.item.asCom.getChildAt(2);
- this.kuaisudianji = this.item.asCom.getChildAt(0);
- this.shou = this.item.asCom.getChildAt(3);
- this.di = this.item.asCom.getChildAt(1);
- this.getrewardbtn = this.item.asCom.getChildAt(4);
- this.getrewardbtn.visible = false;
- this.clickani = this.item.getTransition("clickbtnani");
- this.jindu.value = 1;
- this._bannerVal = GameUtils_1.GameUtils.randRangefloat(0.2, 0.4);
- TimerService_1.TimerService.Instance.addUpdateTarget(this);
- // GuangGao.Clear();
- ttad_1.ttad.Clear();
- Laya.timer.loop(2000, this, this.playAnimator);
- // var sceneheight = Laya.stage.height;
- // this.btnbox.y=sceneheight-this.btnbox.y-15;
- };
- GiftView.prototype.playAnimator = function () {
- this.clickani.play(null, 1);
- };
- GiftView.prototype.initEvent = function () {
- this.AddEventByType(this.anniu, Laya.Event.CLICK, this, this.qiaoDa);
- this.AddEventByType(this.getrewardbtn, Laya.Event.CLICK, this, this.VideoGetReward);
- };
- GiftView.prototype.update = function (dt) {
- this._time += dt;
- if (this._time >= this._interval) {
- this._time = 0;
- this.Daojishi();
- }
- };
- GiftView.prototype.Daojishi = function () {
- var pv = this.jindu.value;
- pv -= this._decrement;
- if (pv <= 0)
- pv = 1;
- this.jindu.value = pv;
- this._clickCnt = Math.ceil(pv * this._maxClickCnt / 100);
- };
- GiftView.prototype.qiaoDa = function () {
- var _this = this;
- if (this.shou.visible) {
- this.shou.visible = false;
- this.kuaisudianji.visible = false;
- Laya.timer.clear(this, this.playAnimator);
- }
- if (!this._isComplete) {
- this._clickCnt++;
- if (this._clickCnt > this._maxClickCnt)
- this._clickCnt = this._maxClickCnt;
- var pv = this._clickCnt / this._maxClickCnt;
- if (pv > 1) {
- pv = 1;
- }
- this.jindu.value = pv * 100;
- if (pv >= this._bannerVal && !this._isShowBanner) {
- this._isShowBanner = true;
- this.getrewardbtn.visible = true;
- Laya.timer.once(2000, this, function () {
- _this.getrewardbtn.visible = false;
- });
- }
- if (pv >= 1) {
- this._isComplete = true;
- GiftView.getreward();
- }
- }
- };
- GiftView.getreward = function () {
- RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
- // ( this.getProxy( AgencyUserMessage ) as AgencyUserMessage ).GoldUp( PlayerAccount.CurrentAccount.CurAccountData.CheatReward );
- // var index = ( this.getProxy( AgencyLottery ) as AgencyLottery ).GetReward();
- // var selectcfg:LotteryCFG = LotteryCFG.vec[ index ];
- // zpproxy.getreward( selectcfg );
- // TimerService.Instance.removeUpdateTarget( this );
- GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
- GiftView.onclosefun();
- };
- //看视频得奖励
- GiftView.prototype.VideoGetReward = function () {
- ttad_1.ttad.ShowVideo((function (isLoad) {
- if (isLoad) {
- RoleData_1.RoleData.Instance.Money += PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward;
- GlobalTip_1.GlobalTip.Instance.showWordTips("获得" + PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.CheatReward + "金币");
- GiftView.onclosefun();
- }
- else {
- GiftView.onclosefun();
- }
- }));
- };
- GiftView.prototype.hidebanner = function () {
- GuangGao_1.GuangGao.hidebanner();
- };
- GiftView.onclosefun = function () {
- ViewManager_1.ViewManager.Instance.close(GiftView);
- };
- GiftView.prototype.destory = function () {
- GuangGao_1.GuangGao.hidebanner();
- TimerService_1.TimerService.Instance.removeUpdateTarget(this);
- _super.prototype.destory.call(this);
- };
- GiftView.key = "GiftView";
- return GiftView;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.default = GiftView;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- /*
- * name;
- */
- var WordTipsPanel = /** @class */ (function (_super) {
- __extends(WordTipsPanel, _super);
- function WordTipsPanel() {
- var _this = _super.call(this, "loading", "wordTips") || this;
- _this.nowword = "";
- return _this;
- }
- /****************************************** */
- WordTipsPanel.prototype.showText = function () {
- var text = new Laya.Text();
- text.text = "Orientation-Portrait";
- text.color = "gray";
- text.font = "Impact";
- text.fontSize = 50;
- text.x = Laya.stage.width - text.width >> 1;
- text.y = Laya.stage.height - text.height >> 1;
- Laya.stage.addChild(text);
- };
- /****************************************** */
- WordTipsPanel.prototype.showWord = function (word) {
- this.nowword = word;
- this.text_word.text = word;
- this.t1.play(Laya.Handler.create(this, this.playEndCallback), 1);
- };
- WordTipsPanel.prototype.onInit = function () {
- _super.prototype.onInit.call(this);
- this.t1 = this.getpanelTransition("t1");
- };
- WordTipsPanel.prototype.createCantralRect = function () {
- this.rect = new Laya.Sprite();
- this.rect.graphics.drawRect(-100, -100, 200, 200, "gray");
- Laya.stage.addChild(this.rect);
- this.updateRectPos();
- };
- WordTipsPanel.prototype.updateRectPos = function () {
- this.rect.x = Laya.stage.width / 2;
- this.rect.y = Laya.stage.height / 2;
- };
- /*************************************************** */
- WordTipsPanel.prototype.playEndCallback = function () {
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.removeselect, this);
- };
- WordTipsPanel.key = "WordTipsPanel";
- return WordTipsPanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.WordTipsPanel = WordTipsPanel;
- },{"../Control/PanelBaseControl":24,"../utils/DispatcherManager":85,"../utils/GameState":86}],65:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var LoadingPanel = /** @class */ (function (_super) {
- __extends(LoadingPanel, _super);
- function LoadingPanel() {
- return _super.call(this, "loading", "loading") || this;
- }
- LoadingPanel.prototype.onInit = function () {
- _super.prototype.onInit.call(this);
- };
- LoadingPanel.prototype.showWord = function (value) {
- this.pro.value = value;
- };
- LoadingPanel.prototype.onBoyClick = function (e) {
- //点击后小人会放大缩小
- var boy = e.target;
- if (boy.scaleX === 1) {
- boy.scale(1.2, 1.2);
- }
- else {
- boy.scale(1, 1);
- }
- };
- LoadingPanel.prototype.onTxtClick = function (e) {
- //点击后切换适配模式
- e.stopPropagation();
- };
- LoadingPanel.prototype.destory = function () {
- this.clearEvent();
- _super.prototype.destory.call(this);
- };
- LoadingPanel.key = "LoadingPanel";
- return LoadingPanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.LoadingPanel = LoadingPanel;
- },{"../Control/PanelBaseControl":24}],66:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var ViewAction_1 = require("../utils/ViewAction");
- var ViewManager_1 = require("../View/ViewManager");
- var LotteryCFG_1 = require("../CFG/LotteryCFG");
- var AssetPath_1 = require("../Config/AssetPath");
- var RoleCFG_1 = require("../CFG/RoleCFG");
- var AgencyLottery_1 = require("../Agency/AgencyLottery");
- var GuangGao_1 = require("../WXSDK/GuangGao");
- var ttad_1 = require("../WXSDK/ttad");
- var LotteryPanel = /** @class */ (function (_super) {
- __extends(LotteryPanel, _super);
- function LotteryPanel() {
- return _super.call(this, "main", "LotteryView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
- }
- LotteryPanel.prototype.showLogger = function () {
- this.logger = new Laya.Text();
- this.logger.fontSize = 30;
- this.logger.color = "#FFFFFF";
- this.logger.align = 'center';
- this.logger.valign = 'middle';
- this.logger.size(Laya.stage.width, Laya.stage.height);
- this.logger.text = "等待响应...\n";
- Laya.stage.addChild(this.logger);
- };
- /************************************* */
- LotteryPanel.prototype.onHttpRequestError = function (e) {
- console.log(e);
- };
- LotteryPanel.prototype.initEvent = function () {
- this.AddEventByType(this.backbtn, Laya.Event.CLICK, this, this.onclosefun);
- this.AddEventByType(this.lotterybtn, Laya.Event.CLICK, this, this.choujiangclick);
- };
- LotteryPanel.prototype.playComplte = function () {
- if (this.tw) {
- this.tw.clear();
- this.tw = null;
- }
- this.backbtn.enabled = true;
- this.lotterybtn.enabled = true;
- this.agencylottery.getreward(this._selectcfg);
- };
- LotteryPanel.prototype.onclosefun = function () {
- if (this.tw) {
- this.tw.clear();
- this.tw = null;
- }
- GuangGao_1.GuangGao.Clear();
- ViewManager_1.ViewManager.Instance.close(LotteryPanel);
- };
- LotteryPanel.prototype.initView = function () {
- this.agencylottery = this.getProxy(AgencyLottery_1.AgencyLottery);
- var vec = LotteryCFG_1.default.vec;
- for (var i = 0; i < vec.length; i++) {
- var cfg = vec[i];
- if (cfg.type == 1) {
- this["icon_" + i].url = fairygui.UIPackage.getItemURL("main", "img_gold");
- this["txt_" + i].text = "X" + cfg.value;
- }
- else {
- var rolecfg = RoleCFG_1.default.dict[cfg.value];
- this["icon_" + i].url = AssetPath_1.AssetPath.getroleicon(rolecfg.icon);
- this["txt_" + i].text = rolecfg.rolename;
- }
- }
- GuangGao_1.GuangGao.CheatBanner(this.lotterybtn);
- };
- /**************************************** */
- LotteryPanel.prototype.onSocketClose = function () {
- console.log("Socket closed");
- };
- LotteryPanel.prototype.onMessageReveived = function (message) {
- console.log("Message from server:");
- if (typeof message == "string") {
- console.log(message);
- }
- else if (message instanceof ArrayBuffer) {
- }
- };
- /**************************************** */
- LotteryPanel.prototype.choujiangclick = function () {
- this.videocallback();
- // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
- };
- LotteryPanel.prototype.videocallback = function () {
- var _this = this;
- ttad_1.ttad.ShowVideo((function (isLoad) {
- if (isLoad) {
- _this.startPlay();
- }
- }));
- };
- LotteryPanel.prototype.startPlay = function () {
- var index = this.agencylottery.GetReward();
- this._selectcfg = LotteryCFG_1.default.vec[index];
- this.backbtn.enabled = false;
- this.lotterybtn.enabled = false;
- this._nowgetIndex = index;
- var angle = 360 * 6 + (this._nowgetIndex) * 45 - 15;
- if (this.item_panel.rotation == 0) {
- this._tweeObject = { value: 0 };
- }
- else {
- this._tweeObject = { value: this._preIndex * 45 - 15 };
- }
- this._preIndex = this._nowgetIndex;
- this.tw = laya.utils.Tween.to(this._tweeObject, { value: angle }, 3000, laya.utils.Ease.quadInOut, Laya.Handler.create(this, this.playComplte));
- this.tw.update = Laya.Handler.create(this, function () {
- var value = this._tweeObject.value % 360;
- this.item_panel.rotation = value;
- }, null, false);
- };
- LotteryPanel.key = "LotteryPanel";
- return LotteryPanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.LotteryPanel = LotteryPanel;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var GameStateControl_1 = require("../Control/GameStateControl");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- var PropManager_1 = require("../PrefabControl/PropManager");
- var AgencyUserMessage_1 = require("../Agency/AgencyUserMessage");
- var UserInfoEvent_1 = require("../Data/UserInfoEvent");
- var AgencySkin_1 = require("../Agency/AgencySkin");
- var AgencyInGame_1 = require("../Agency/AgencyInGame");
- var ViewManager_1 = require("../View/ViewManager");
- var AgencyLottery_1 = require("../Agency/AgencyLottery");
- var TuijianView_1 = require("../Push/TuijianView");
- var ttad_1 = require("../WXSDK/ttad");
- var Sdk_1 = require("../WXSDK/Sdk");
- var PlayerAccount_1 = require("../WXSDK/PlayerAccount");
- var AssetPath_1 = require("../Config/AssetPath");
- var LocalDataControl_1 = require("../Control/LocalDataControl");
- var UserDataInfo_1 = require("../Data/UserDataInfo");
- var SceneControl_1 = require("../Control/SceneControl");
- var MainPanel = /** @class */ (function (_super) {
- __extends(MainPanel, _super);
- function MainPanel() {
- var _this = _super.call(this, "main", "mainview") || this;
- /****************************************** */
- // 一只凤凰的分辨率是550 * 400
- _this.phoenixWidth = 550;
- _this.phoenixHeight = 400;
- _this.bgColorTweener = new Laya.Tween();
- _this.gradientInterval = 2000;
- _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
- //#endregion
- //#region 初始化签到
- _this.isShowSign = false;
- _this.PaoKuSign = "PaoKuSignInfo";
- _this.SignInfo = null;
- MainPanel.instance = _this;
- return _this;
- }
- MainPanel.prototype.updateUserDataHandler = function () {
- this.txt_gold.text = this.agencyusermessage.RoleData.Money.toString();
- };
- MainPanel.prototype.returnmainHandler = function () {
- var RoleData = this.agencyusermessage.RoleData;
- // if( RoleData.nowlevel <= 2 )
- // {
- // this.c_state.selectedIndex = 0;
- // }
- // else
- // {
- this.c_state.selectedIndex = 1;
- // }
- };
- MainPanel.prototype.onInit = function () {
- _super.prototype.onInit.call(this);
- };
- MainPanel.prototype.createPhoenixes = function () {
- var scaleFactor = Math.min(Laya.stage.width / (this.phoenixWidth * 2), Laya.stage.height / this.phoenixHeight);
- // 加了混合模式的凤凰
- var blendedPhoenix;
- blendedPhoenix.blendMode = "lighter";
- blendedPhoenix.scale(scaleFactor, scaleFactor);
- blendedPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
- // 正常模式的凤凰
- var normalPhoenix;
- normalPhoenix.scale(scaleFactor, scaleFactor);
- normalPhoenix.x = this.phoenixWidth * scaleFactor;
- normalPhoenix.y = (Laya.stage.height - this.phoenixHeight * scaleFactor) / 2;
- };
- /****************************************** */
- MainPanel.prototype.initView = function () {
- this.ExitBtn.visible = false;
- this.MoreFunBtn.visible = false;
- this.MoreGameBtn.visible = false;
- ttad_1.ttad.Showbanner();
- // Laya.timer.once(500,this,()=>{
- // console.log("main界面白名单----",FYHD_Sdk.iswhite);
- // if(FYHD_Sdk.iswhite){
- // this.ExitBtn.visible = true;
- // }
- // else{
- // this.ExitBtn.visible = false;
- // }
- // })
- this.MoreFunBtnScale = this.getTransitionByName("morefunbtnscale");
- Laya.timer.loop(1000, this, this.playanimator2);
- this.SkinAni = this.SkinBtn.getTransition("skinani");
- this.LotteryAni = this.LotteryBtn.getTransition("lotteryani");
- this.MoreAni = this.MoreGameBtn.getTransition("moreani");
- Laya.timer.loop(3000, this, this.playanimator);
- this.agencyusermessage = this.getProxy(AgencyUserMessage_1.AgencyUserMessage);
- PropManager_1.PropManager.pro_jindu = this.pro_dis;
- PropManager_1.PropManager.txt_mingci = this.txt_mingci;
- this.c_state = this.getControllerByBame("c_state");
- GameStateControl_1.GameStateControl.Instance.setClickPanel(this.load_clickpanel);
- this.returnmainHandler();
- this.updateUserDataHandler();
- this.InitSignItem();
- };
- MainPanel.prototype.playanimator = function () {
- this.SkinAni.play(null, 1);
- this.LotteryAni.play(null, 1);
- this.MoreAni.play(null, 1);
- };
- MainPanel.prototype.playanimator2 = function () {
- this.MoreFunBtnScale.play(null, 1);
- };
- MainPanel.prototype.choujiangclick = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- ttad_1.ttad.Clear();
- this.getProxy(AgencyLottery_1.AgencyLottery).openView();
- };
- MainPanel.prototype.tuijianclick = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- ViewManager_1.ViewManager.Instance.add(TuijianView_1.default);
- };
- MainPanel.prototype.skinclick = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- ttad_1.ttad.Clear();
- this.getProxy(AgencySkin_1.AgencySkin).openview();
- };
- MainPanel.prototype.moreclick = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- // ViewManager.Instance.add( ChoutiPanView );
- ttad_1.ttad.CreateMoreGameBtn();
- };
- MainPanel.prototype.btnclick = function () {
- if (SceneControl_1.SceneControl.IsShowSign)
- return;
- GameState_1.GameState.GameNum++;
- ttad_1.ttad.Clear();
- this.c_state.selectedIndex = 2;
- this.txt_lv.text = this.agencyusermessage.RoleData.getNowServerLevel().toString();
- this.getProxy(AgencyInGame_1.AgencyInGame).startGame();
- };
- MainPanel.prototype.setclick = function () {
- };
- MainPanel.prototype.mapLoaded = function () {
- this.layer = this.tiledMap.getLayerByIndex(0);
- var radiusX = 32;
- var radiusY = Math.tan(180 / Math.PI * 30) * radiusX;
- var color = "#FF7F50";
- this.sprite = new Laya.Sprite();
- this.sprite.graphics.drawLine(0, 0, -radiusX, radiusY, color);
- this.sprite.graphics.drawLine(0, 0, radiusX, radiusY, color);
- this.sprite.graphics.drawLine(-radiusX, radiusY, 0, radiusY * 2, color);
- this.sprite.graphics.drawLine(radiusX, radiusY, 0, radiusY * 2, color);
- Laya.stage.addChild(this.sprite);
- };
- /*************************************** */
- MainPanel.prototype.initEvent = function () {
- this.AddEventByType(this.load_start, Laya.Event.CLICK, this, this.btnclick);
- this.AddEventByType(this.SkinBtn, Laya.Event.CLICK, this, this.skinclick);
- // this.AddEventByType( this.MoreGameBtn,Laya.Event.CLICK,this,this.moreclick );
- // this.AddEventByType( this.MoreFunBtn,Laya.Event.CLICK,this,this.moreclick );
- // this.AddEventByType( this.ExitBtn,Laya.Event.CLICK,this,this.tuijianclick );
- this.addDataEvent(GameState_1.GameState.returnMainView, this, this.returnmainHandler);
- this.AddEventByType(this.LotteryBtn, Laya.Event.CLICK, this, this.choujiangclick);
- this.addDataEvent(UserInfoEvent_1.UserInfoEvent.UserInfoEvent_updateUserData, this, this.updateUserDataHandler);
- };
- MainPanel.prototype.InitSignItem = function () {
- this.LoadSignData();
- var _bo = true;
- if (this.getSystemTime() == this.SignInfo["time"]) {
- _bo = false;
- }
- else {
- this.SignInfo["FisstLoad"] = 0;
- }
- if (this.SignInfo["FisstLoad"] == 1) {
- _bo = false;
- }
- // if(PlayerAccount.CurrentAccount.CurAccountData.SignDebug)
- // {
- // _bo=true;
- // }
- SceneControl_1.SceneControl.IsShowSign = _bo;
- this.SignPanel.visible = _bo;
- if (!_bo) {
- return;
- }
- this.SignFun();
- };
- MainPanel.prototype.btn_SignFun = function () {
- if (this.getSystemTime() == this.SignInfo["time"]) {
- this.isShowSign = true;
- }
- this.SignFun();
- if (this.isShowSign) {
- Sdk_1.WxApi.ShowTxt("已签到"); //y.WxApi.ShowTxt("已签到")
- this.SignSelectedMoney = 0 + "";
- }
- };
- MainPanel.prototype.SignFun = function () {
- this.SignItem = new Array();
- this.SignItem.push(this.SignItem1);
- this.SignItem.push(this.SignItem2);
- this.SignItem.push(this.SignItem3);
- this.SignItem.push(this.SignItem4);
- this.SignItem.push(this.SignItem5);
- this.SignItem.push(this.SignItem6);
- this.SignItem.push(this.SignItem7);
- this.SignTickImage = this.SignAd.asCom.getChildAt(2);
- var signTickButton = this.SignAd.asCom.getChildAt(1);
- this.signAdButton = this.SignAd.asCom.getChildAt(3);
- this.signNoramButton = this.SignAd.asCom.getChildAt(4);
- this.SignDanbeiBtn = this.SignAd.asCom.getChildAt(5);
- this.SignTickImage.visible = (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.ShowSign);
- this.signNoramButton.visible = this.SignTickImage.visible;
- this.SignDanbeiBtn.visible = !this.signNoramButton.visible;
- this.AddEventByType(signTickButton, Laya.Event.CLICK, this, this.SignTickButtonFun);
- this.AddEventByType(this.signAdButton, Laya.Event.CLICK, this, this.SignAdButtonFun);
- this.AddEventByType(this.signNoramButton, Laya.Event.CLICK, this, this.SignAdButtonFun);
- this.AddEventByType(this.SignDanbeiBtn, Laya.Event.CLICK, this, this.SignNormalButtonFun);
- var num = this.SignInfo["day"];
- var numIndex = 100;
- if (num < 7) {
- numIndex = 100;
- }
- else {
- numIndex = 107;
- num = num % 7;
- }
- this.SignPiFu = null;
- this.SignSelectedMoney = 0 + "";
- for (var index = 0; index < this.SignItem.length; index++) {
- var data = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetRewardConfig((numIndex + 1 + index));
- var pifu = null;
- if (data["reward_item"] != 1000) {
- if (Number(data["reward_item"]) > 6000) {
- var pifuIndedx = Number(data["reward_item"]) % 6000;
- pifu = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetSkinAttr(pifuIndedx);
- console.log(pifu);
- }
- }
- var isOk = true;
- var isCnaSign = true;
- if (index < num) {
- isOk = true;
- isCnaSign = false;
- }
- else if (index == num) {
- isOk = false;
- isCnaSign = true;
- }
- else {
- isOk = false;
- isCnaSign = false;
- }
- var text;
- if (index < 6) {
- text = "第 " + (index + 1) + " 天";
- }
- else {
- text = "豪华皮肤";
- }
- this.SetSignItemInfo(this.SignItem[index], text, data, isOk, isCnaSign, pifu);
- }
- ttad_1.ttad.Showbanner(); //
- };
- /**签到*/
- MainPanel.prototype.SetSignItemInfo = function (_signItem, text, data, _isOk, _isCanSign, pifu) {
- console.log(data);
- if (pifu == null) {
- console.log(111111111111);
- var mytext = _signItem.asCom.getChildAt(2);
- mytext.text = text;
- var mymoney = _signItem.asCom.getChildAt(3);
- mymoney.text = data["reward_num"];
- _signItem.asCom.getChildAt(5).visible = false;
- if (_isOk) {
- _signItem.asCom.getChildAt(1).visible = false;
- _signItem.asCom.getChildAt(6).visible = true;
- _signItem.asCom.getChildAt(7).visible = true;
- }
- else if (_isCanSign) {
- _signItem.asCom.getChildAt(1).visible = true;
- _signItem.asCom.getChildAt(7).visible = false;
- _signItem.asCom.getChildAt(6).visible = false;
- this.SignSelectedItem = _signItem;
- this.SignSelectedText = text;
- this.SignSelectedMoney = data["reward_num"];
- // var child1=_signItem.asCom.getChildAt(7) as fairygui.GButton;
- // child1.visible=true;
- // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null);
- // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun );
- }
- else {
- _signItem.asCom.getChildAt(1).visible = false;
- _signItem.asCom.getChildAt(6).visible = false;
- _signItem.asCom.getChildAt(7).visible = false;
- }
- }
- else {
- console.log(2222222222);
- var mytext = _signItem.asCom.getChildAt(2);
- var mymoney = _signItem.asCom.getChildAt(3);
- mymoney.visible = false;
- var myimage = _signItem.asCom.getChildAt(4);
- myimage.visible = false;
- var GLoader = _signItem.asCom.getChildAt(5);
- if (_isOk) {
- GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon);
- _signItem.asCom.getChildAt(1).visible = false;
- _signItem.asCom.getChildAt(6).visible = true;
- _signItem.asCom.getChildAt(7).visible = true;
- }
- else if (_isCanSign) {
- _signItem.asCom.getChildAt(1).visible = true;
- _signItem.asCom.getChildAt(7).visible = false;
- _signItem.asCom.getChildAt(6).visible = false;
- this.SignSelectedItem = _signItem;
- this.SignSelectedText = text;
- this.SignSelectedMoney = 0 + "";
- this.SignPiFu = pifu;
- GLoader.visible = true;
- GLoader.icon = AssetPath_1.AssetPath.getroleicon(this.SignPiFu.icon);
- // this.addListener(child1,Laya.Event.CLICK,this.SignButtonFun,null);
- // this.addListener( child1,Laya.Event.CLICK,this,this.SignButtonFun );
- }
- else {
- GLoader.icon = AssetPath_1.AssetPath.getroleicon(pifu.icon);
- _signItem.asCom.getChildAt(1).visible = false;
- _signItem.asCom.getChildAt(6).visible = false;
- _signItem.asCom.getChildAt(7).visible = false;
- }
- }
- };
- MainPanel.prototype.SignButtonFun = function () {
- var _this = this;
- console.log("收取了");
- if (this.getSystemTime == this.SignInfo["time"]) {
- return;
- }
- this.SignAd.visible = true;
- Laya.timer.once(3000, this, function () { _this.signNoramButton.visible = true; });
- this.SetSignItemInfo(this.SignSelectedItem, this.SignSelectedText, this.SignSelectedMoney, true, false, this.SignPiFu);
- this.SaveSignData();
- };
- /*勾选方法*/
- MainPanel.prototype.SignTickButtonFun = function () {
- this.SignTickImage.visible = !this.SignTickImage.visible;
- this.SignDanbeiBtn.visible = !this.SignTickImage.visible;
- this.signNoramButton.visible = this.SignTickImage.visible;
- };
- /*点击视频双倍领取*/
- MainPanel.prototype.SignAdButtonFun = function () {
- this.WinAdButtonFun();
- };
- /*普通领取*/
- MainPanel.prototype.SignNormalButtonFun = function () {
- this.SaveSignData();
- if (this.SignTickImage.visible == true) {
- this.WinAdButtonFun();
- }
- else {
- this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(this.SignSelectedMoney) * 1);
- if (this.SignPiFu != null) {
- this.SignAddPifu();
- }
- this.updateUserDataHandler();
- }
- SceneControl_1.SceneControl.IsShowSign = false;
- this.SignPanel.visible = false;
- ttad_1.ttad.Clear(); //;y.WxApi.ShowTxt("签到成功")
- };
- /**胜利界面广告按钮*/
- MainPanel.prototype.WinAdButtonFun = function () {
- var _this = this;
- Sdk_1.WxApi.recordAldEvent("签到...");
- if (!Laya.Browser.onMobile) {
- return;
- }
- ttad_1.ttad.ShowVideo(function (flag) {
- console.log("播放视频返回成功" + flag);
- if (flag) {
- console.log("播放视频返回");
- _this.getProxy(AgencyUserMessage_1.AgencyUserMessage).GoldUp(Number(_this.SignSelectedMoney) * 2);
- if (_this.SignPiFu != null) {
- _this.SignAddPifu();
- }
- _this.SaveSignData(); //this.SaveSignData()
- _this.SignPanel.visible = false;
- SceneControl_1.SceneControl.IsShowSign = false;
- _this.updateUserDataHandler();
- }
- });
- };
- MainPanel.prototype.LoadSignData = function () {
- // this.SignInfo={"day":0,"time":0,"FisstLoad":0};
- // Laya.LocalStorage.setJSON("PaoKuSign",this.SignInfo);
- this.SignInfo = Laya.LocalStorage.getJSON(this.PaoKuSign);
- if (this.SignInfo == 0 || this.SignInfo == null) {
- var time = this.getSystemTime();
- this.SignInfo = { "day": 0, "time": 0, "FisstLoad": 0 };
- Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo);
- }
- console.log("asdasd");
- };
- MainPanel.prototype.SaveSignData = function () {
- this.SignInfo["FisstLoad"] = 1;
- this.SignInfo["day"]++;
- this.SignInfo["time"] = this.getSystemTime();
- Laya.LocalStorage.setJSON(this.PaoKuSign, this.SignInfo);
- };
- MainPanel.prototype.getSystemTime = function () {
- var curDate = new Date();
- var month = curDate.getMonth() + 1;
- console.log("月:" + month.toString());
- var date = curDate.getDate();
- console.log("日:" + date.toString());
- return Number((month + "" + date));
- };
- MainPanel.prototype.SignAddPifu = function () {
- var cachedata = LocalDataControl_1.LocalDataControl.Instance.GetLocalCaCheData(UserDataInfo_1.UserDataInfo.skin);
- // var cachedata = CacheManager.getInstance().getCacheObj( UserCacheType.skin );
- var id = this.SignPiFu["id"];
- var _skinProxy = this.getProxy(AgencySkin_1.AgencySkin);
- var piFuVO = null;
- for (var index = 0; index < _skinProxy.pifuArr.length; index++) {
- piFuVO = _skinProxy.pifuArr[index];
- if (piFuVO.roleCFG.id == id) {
- break;
- }
- }
- piFuVO.state = 1;
- AgencySkin_1.AgencySkin.instance.AddLocalSkinData(piFuVO.roleCFG.id, piFuVO.state, piFuVO.hasnum);
- DispatcherManager_1.DispatcherManager.dispatchEvent(GameState_1.GameState.updateSKinView);
- console.log("获取皮肤");
- console.log(cachedata);
- };
- MainPanel.key = "MainPanel";
- return MainPanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.MainPanel = MainPanel;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var ViewAction_1 = require("../utils/ViewAction");
- var AgencySkin_1 = require("../Agency/AgencySkin");
- var GameState_1 = require("../utils/GameState");
- var UserInfoEvent_1 = require("../Data/UserInfoEvent");
- var ResourceControl_1 = require("../Control/ResourceControl");
- var AssetPath_1 = require("../Config/AssetPath");
- var CharacterState_1 = require("../PrefabControl/CharacterState");
- var ViewManager_1 = require("../View/ViewManager");
- var CharacterPool_1 = require("../PrefabControl/CharacterPool");
- var Player_1 = require("../Game/Player");
- var SkinPanel = /** @class */ (function (_super) {
- __extends(SkinPanel, _super);
- function SkinPanel() {
- var _this = _super.call(this, "main", "skinview", false, ViewAction_1.ViewAction.ActionType_none, 0) || this;
- _this._isdestorys = false;
- _this._out = new Laya.Quaternion;
- return _this;
- }
- SkinPanel.prototype.initView = function () {
- this._isdestorys = false;
- this.c_title = this.getControllerByBame("c_title");
- this.agencyskin = this.getProxy(AgencySkin_1.AgencySkin);
- this.list_0.setVirtual();
- this.list_0.itemRenderer = Laya.Handler.create(this, this.itemlistrender, null, false);
- this.c_title.selectedIndex = 0;
- this.onchange();
- //添加3D场景
- this._ui3DScene = this.displayObject.addChildAt(new Laya.Scene3D(), 0);
- //添加照相机
- this._uicarma3D = (this._ui3DScene.addChild(new Laya.Camera(0, 0.1, 80)));
- // this._uicarma3D.clearColor = null;
- this._uicarma3D.viewport = new Laya.Viewport(this.x, this.y, this.width, this.height);
- this._uicarma3D.transform.translate(new Laya.Vector3(0, 1.2, 5), false);
- // //添加方向光
- // this._uilight = PropManager.scene3D.addChild(new Laya.DirectionLight()) as Laya.DirectionLight;
- // this._uilight.color = new Laya.Vector3(0.6,0.6,0.6);
- // this._uilight.transform.worldMatrix.setForward(new Laya.Vector3(1, -1, 0));
- this.updateroleHandler();
- };
- SkinPanel.prototype.initEvent = function () {
- this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
- this.AddEventByType(this.c_title, fairygui.Events.STATE_CHANGED, this, this.onchange);
- this.addDataEvent(GameState_1.GameState.updateSKinView, this, this.onchange);
- this.addDataEvent(UserInfoEvent_1.UserInfoEvent.userinfoEvent_updateroleid, this, this.updateroleHandler);
- };
- SkinPanel.prototype.ClearCharacter = function () {
- if (this._rolemo) {
- var script = this._rolemo.getComponent(Player_1.Player);
- CharacterPool_1.CharacterPool.ClearCharacter(this._rolemo, script.resouseName, script);
- this._rolemo = null;
- }
- };
- SkinPanel.prototype.onclosefun = function () {
- ViewManager_1.ViewManager.Instance.close(SkinPanel);
- };
- SkinPanel.prototype.destory = function () {
- this._isdestorys = true;
- this.ClearCharacter();
- if (this._uicarma3D) {
- this._uicarma3D.destroy();
- this._uicarma3D = null;
- }
- if (this._ui3DScene) {
- this._ui3DScene.destroy();
- this._ui3DScene = null;
- }
- _super.prototype.destory.call(this);
- };
- SkinPanel.prototype.onchange = function () {
- if (this.c_title.selectedIndex == 0) {
- this.list_0.numItems = this.agencyskin.pifuArr.length;
- }
- else {
- this.list_0.numItems = 0;
- }
- };
- SkinPanel.prototype.itemlistrender = function (index, item) {
- if (this.c_title.selectedIndex == 0) {
- if (index < this.agencyskin.pifuArr.length) {
- item.showData(this.agencyskin.pifuArr[index]);
- }
- }
- };
- SkinPanel.prototype.updateroleHandler = function () {
- var RoleData = this.agencyskin.RoleData;
- this.ClearCharacter();
- var pathArr = [];
- pathArr.push({ url: AssetPath_1.AssetPath.get3DRoleModel(RoleData.roleCfg.name) });
- ResourceControl_1.ResourceControl.Instance.loader3DArr(pathArr, this, this.loadcomplete, null, true, RoleData.roleCfg.name);
- };
- SkinPanel.prototype.loadcomplete = function (resousename) {
- var RoleData = this.agencyskin.RoleData;
- if (!this._isdestorys && this._ui3DScene && resousename == RoleData.roleCfg.name) {
- this._rolemo = CharacterPool_1.CharacterPool.AddCharacter(resousename, Player_1.Player, this._ui3DScene);
- this._rolemo.transform.position = new Laya.Vector3(0, 2, 0);
- Laya.Quaternion.createFromAxisAngle(new Laya.Vector3(0, 1, 0), -135 * 180 / Math.PI, this._out);
- this._rolemo.transform.rotation = this._out;
- this._rolemo.getComponent(Player_1.Player).PlayAnimator(CharacterState_1.CharacterState.stand);
- }
- };
- SkinPanel.key = "SkinPanel";
- return SkinPanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.SkinPanel = SkinPanel;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PanelBaseControl_1 = require("../Control/PanelBaseControl");
- var ViewAction_1 = require("../utils/ViewAction");
- var GameUtils_1 = require("../utils/GameUtils");
- var AssetPath_1 = require("../Config/AssetPath");
- var AgencyTrial_1 = require("../Agency/AgencyTrial");
- var GuangGao_1 = require("../WXSDK/GuangGao");
- var ttad_1 = require("../WXSDK/ttad");
- var TrialPanel = /** @class */ (function (_super) {
- __extends(TrialPanel, _super);
- function TrialPanel(arr) {
- var _this = _super.call(this, "main", "shiyongView", false, ViewAction_1.ViewAction.ActionType_none, 1) || this;
- _this.skinarr = arr;
- return _this;
- }
- TrialPanel.prototype.onInit = function () {
- _super.prototype.onInit.call(this);
- };
- TrialPanel.prototype.initView = function () {
- this.agencytrial = this.getProxy(AgencyTrial_1.AgencyTrial);
- var index = GameUtils_1.GameUtils.randRangeint(0, this.skinarr.length - 1);
- this._selectvo = this.skinarr[index];
- this.load_icon.url = AssetPath_1.AssetPath.getroleicon(this._selectvo.roleCFG.icon);
- // pingtaiutils.Instance.createBanner( "ShiYongView" );
- GuangGao_1.GuangGao.CheatBanner(this.btn_close);
- };
- TrialPanel.prototype.initEvent = function () {
- this.AddEventByType(this.btn_close, Laya.Event.CLICK, this, this.onclosefun);
- this.AddEventByType(this.btn_video, Laya.Event.CLICK, this, this.videofun);
- };
- TrialPanel.prototype.videofun = function () {
- // pingtaiutils.Instance.playVideo( "",this,this.videocallback );
- this.videocallback();
- };
- TrialPanel.prototype.videocallback = function () {
- var _this = this;
- ttad_1.ttad.ShowVideo((function (isLoad) {
- if (isLoad) {
- _this.agencytrial.ExitPanel(_this._selectvo);
- }
- }));
- };
- TrialPanel.prototype.onclosefun = function () {
- this.agencytrial.ExitPanel(null);
- };
- TrialPanel.prototype.destory = function () {
- // GuangGao.Clear();
- ttad_1.ttad.Clear();
- _super.prototype.destory.call(this);
- };
- TrialPanel.key = "TrialPanel";
- return TrialPanel;
- }(PanelBaseControl_1.PanelBaseControl));
- exports.TrialPanel = TrialPanel;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var LayOUT_1 = require("../utils/LayOUT");
- var LayoutControl_1 = require("../Control/LayoutControl");
- /**
- *
- * @author
- *
- */
- var ViewManager = /** @class */ (function (_super) {
- __extends(ViewManager, _super);
- function ViewManager() {
- var _this = _super.call(this) || this;
- ViewManager.ins = _this;
- return _this;
- }
- Object.defineProperty(ViewManager, "Instance", {
- get: function () {
- if (ViewManager.ins == null) {
- return new ViewManager();
- }
- return ViewManager.ins;
- },
- enumerable: true,
- configurable: true
- });
- ViewManager.prototype.init = function () {
- this._views = {};
- this.initEvent();
- };
- ViewManager.prototype.initEvent = function () {
- };
- /**
- * view 视图对象类
- * data 绑定数据 ( data 如果不为空,代表构造函数传参 )
- * layer 层级
- */
- ViewManager.prototype.add = function (view, data, layer) {
- if (data === void 0) { data = null; }
- if (layer === void 0) { layer = LayOUT_1.LayOUT.UI; }
- if (view.key == null) {
- throw new Error("view have no key");
- }
- var type = view.key;
- if (this._views[type]) {
- var itemview = this._views[type];
- return itemview;
- }
- var d;
- if (data != null) {
- d = new view(data);
- }
- else {
- d = new view();
- }
- d.viewKey = view;
- d.gameLayer = layer;
- LayoutControl_1.LayoutControl.Instance.AddLayerByName(d, layer);
- this._views[type] = d;
- return d;
- };
- /**
- * 关闭界面
- * @param view 界面
- * @param isbgclose 是否是点击背景关闭的状态
- * @param isplayAnmo 是否播放关闭动画( 主要用于强制关闭 )
- */
- ViewManager.prototype.close = function (view, isbgclose, isplayAnmo) {
- if (isbgclose === void 0) { isbgclose = false; }
- if (isplayAnmo === void 0) { isplayAnmo = true; }
- var type = view.key;
- var item = this._views[type];
- if (!item) {
- return;
- }
- LayoutControl_1.LayoutControl.Instance.ClearLayerByName(item.gameLayer);
- if (isplayAnmo) {
- item.ExitView();
- }
- else {
- item.destory();
- }
- delete this._views[type];
- };
- ViewManager.prototype.onresize = function (w, h) {
- if (this._views != null) {
- var itemview;
- for (var item in this._views) {
- itemview = this._views[item];
- itemview.setSize(w, h);
- }
- }
- };
- ViewManager.prototype.getView = function (view) {
- var type = view.key;
- return this._views[type];
- };
- return ViewManager;
- }(Laya.EventDispatcher));
- exports.ViewManager = ViewManager;
- },{"../Control/LayoutControl":22,"../utils/LayOUT":90}],71:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var RecommendView_1 = require("../Push/RecommendView");
- var ViewManager_1 = require("../View/ViewManager");
- var ChoutiPanView_1 = require("../Push/ChoutiPanView");
- // import { Main } from "../Main";
- // import ListItem from "../GameTools/ListItem";
- // import { PanelManager, PanelType } from "../View/PanelManager";
- // import GuangGao from "./GuangGao";
- // import { WXSDK } from "./WXSDK";
- var FYHD_Sdk = /** @class */ (function () {
- function FYHD_Sdk() {
- }
- //初始化sdk
- FYHD_Sdk.InitSdk = function () {
- Laya.Browser.window.sdk.getFyhd().startSdk();
- FYHD_Sdk.UserInfoAuth();
- // let white = Laya.LocalStorage.getItem("is_white");
- // if(white){
- // FYHD_Sdk.iswhite = true;
- // }
- // else{
- // FYHD_Sdk.getWhiteConfig();
- // }
- // let newuser = Laya.LocalStorage.getItem("is_newuser");
- // if(!newuser){
- // FYHD_Sdk.isnewuser = true;
- // Laya.LocalStorage.setItem("is_newuser","1");
- // }
- // else{
- // FYHD_Sdk.isnewuser = false;
- // }
- // FYHD_Sdk.PushData();
- };
- //用户授权
- FYHD_Sdk.UserInfoAuth = function () {
- if (!Laya.Browser.onWeiXin)
- return;
- Laya.Browser.window.sdk.getFyhd().getFyhdUserInfo(null, false, function (data) {
- console.log("无授权回调:" + JSON.stringify(data));
- if (data.result.user) {
- FYHD_Sdk.openid = data.result.user.openid;
- FYHD_Sdk.AuthInfo();
- }
- });
- };
- FYHD_Sdk.AuthInfo = function () {
- var args = {
- openid: FYHD_Sdk.openid,
- };
- Laya.Browser.window.sdk.getFyhd().loginData(args, function (data) {
- console.log("授权上报回调:" + JSON.stringify(data));
- FYHD_Sdk.ValueUser();
- });
- };
- FYHD_Sdk.ValueUser = function () {
- var args = {
- openid: FYHD_Sdk.openid,
- };
- Laya.Browser.window.sdk.getFyhd().valueuser(args, function (data) {
- console.log("有效用户上报:" + JSON.stringify(data));
- });
- };
- FYHD_Sdk.getWhiteConfig = function () {
- Laya.Browser.window.sdk.getFyhd().whiteConfig(function (e) {
- FYHD_Sdk.iswhite = e.data.is_white;
- if (FYHD_Sdk.iswhite) {
- Laya.LocalStorage.setItem("is_white", "1");
- }
- console.log("白名单---", e);
- });
- };
- FYHD_Sdk.SetHuTuiList = function (list, scrol, type) {
- if (scrol === void 0) { scrol = 1; }
- if (type === void 0) { type = ""; }
- var arr = this.pushData;
- if (!arr || arr.length == 0)
- return;
- list.selectEnable = false;
- scrol == 1 ? list.vScrollBarSkin = "" : list.hScrollBarSkin = "";
- list.renderHandler = Laya.Handler.create(this, this.updateItem, [type], false);
- list.array = arr;
- list.refresh();
- };
- FYHD_Sdk.updateItem = function (type, cell, index) {
- // var aditem = cell.getComponent(ListItem) as ListItem;
- // aditem.Refresh(type);
- };
- //点击事件上报
- FYHD_Sdk.ClickAd = function (ad_type) {
- console.log("上报类型---", ad_type);
- if (!Laya.Browser.onWeiXin)
- return;
- var param = {
- ad_type: ad_type,
- //此处添加openid
- openid: FYHD_Sdk.openid
- };
- console.log("点击参数:" + param);
- Laya.Browser.window.sdk.getFyhd().advertisement(param, function (data) {
- console.log("点击结果:" + JSON.stringify(data));
- });
- };
- //互推信息
- FYHD_Sdk.PushData = function () {
- //console.log("pushdata--",Main.WX);
- if (!Laya.Browser.onWeiXin)
- return;
- var param = {};
- Laya.Browser.window.sdk.getFyhd().shareRecommend(param, function (data) {
- console.log("热门游戏数据--", data);
- if (data.data) {
- FYHD_Sdk.pushData = data.data;
- FYHD_Sdk.pushData.sort(FYHD_Sdk.ListSort);
- FYHD_Sdk.isHaveDate = true;
- //此处派发事件,展示互推
- //EventManager.event(FYHD_Sdk.ShowAd);
- }
- console.log("获取互推信息:" + JSON.stringify(FYHD_Sdk.pushData));
- new RecommendView_1.Recommend();
- });
- };
- FYHD_Sdk.ShowHuTuiJump = function (data, open) {
- if (!Laya.Browser.onWeiXin)
- return;
- if (data.jump_type == 2) //二维码跳转方法
- {
- Laya.Browser.window.wx.previewImage({ current: data.qrcode, urls: [data.qrcode] });
- }
- else if (data.jump_type == 1) //直跳方法
- {
- Laya.Browser.window.wx.navigateToMiniProgram({
- appId: data.to_appid,
- path: data.jump_path,
- success: function (res) {
- // 打开成功
- console.log("上报成功:" + JSON.stringify(res));
- FYHD_Sdk.PushClick(data.to_appid);
- },
- fail: function (res) {
- if (open) {
- ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
- }
- }
- });
- }
- else if (data.jump_type == 0) //平台跳转方法
- {
- Laya.Browser.window.wx.navigateToMiniProgram({
- appId: data.platform_appid,
- path: data.jump_path,
- success: function (res) {
- // 打开成功
- console.log("上报成功:" + JSON.stringify(res));
- FYHD_Sdk.PushClick(data.to_appid);
- },
- fail: function (res) {
- if (open) {
- ViewManager_1.ViewManager.Instance.add(ChoutiPanView_1.default);
- }
- }
- });
- }
- };
- //互推点击
- FYHD_Sdk.PushClick = function (to_appid) {
- if (!Laya.Browser.onWeiXin)
- return;
- var param = {
- openid: FYHD_Sdk.openid,
- to_appid: to_appid,
- };
- Laya.Browser.window.sdk.getFyhd().sharePlay(param, function (data) {
- console.log("点击上报结果:" + JSON.stringify(data));
- });
- };
- FYHD_Sdk.ListSort = function (a, b) {
- if (Number(a["panel"]) < Number(b["panel"])) {
- return -1;
- }
- if (Number(a["panel"]) == Number(b["panel"])) {
- return 0;
- }
- if (Number(a["panel"]) > Number(b["panel"])) {
- return 1;
- }
- };
- FYHD_Sdk.Ad_ClickType = {
- Video: "video_click",
- Watch: "watch",
- Share: "share",
- Banner: "banner",
- Push: "push",
- PushClick: "icon_click"
- };
- FYHD_Sdk.pushData = [];
- FYHD_Sdk.isHaveDate = false;
- FYHD_Sdk.ShowAd = "ShowAd";
- return FYHD_Sdk;
- }());
- exports.FYHD_Sdk = FYHD_Sdk;
- },{"../Push/ChoutiPanView":51,"../Push/RecommendView":55,"../View/ViewManager":70}],72:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PlayerAccount_1 = require("./PlayerAccount");
- var ttad_1 = require("./ttad");
- var WxGameItem = /** @class */ (function () {
- function WxGameItem() {
- this.appNameHidden = false;
- this.color = "C93B3BFF";
- this.size = 100;
- this.borderWidth = 50;
- this.borderColor = "A1A0A0FF";
- }
- return WxGameItem;
- }());
- exports.WxGameItem = WxGameItem;
- var GuangGao = /** @class */ (function () {
- function GuangGao() {
- this.isVideoLoadCom = false;
- }
- Object.defineProperty(GuangGao, "hasbanner", {
- get: function () {
- if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.banner) {
- return true;
- }
- else {
- return false;
- }
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(GuangGao, "hasvideo", {
- get: function () {
- if (Laya.Browser.onWeiXin && PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video) {
- var videonum = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.GetGlobe;
- return true;
- }
- else {
- return false;
- }
- },
- enumerable: true,
- configurable: true
- });
- //预先加载视屏广告
- GuangGao.InitVideo = function () {
- var _this = this;
- if (!Laya.Browser.onWeiXin || !PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video)
- return;
- console.log(this.bannerAdUnitId);
- //vedio
- this.fsaasfafssfa = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
- this.fsaasfafssfa.onLoad(function () {
- console.log('激励视频 广告加载成功');
- _this.asfasfsaffsa = true;
- });
- this.fsaasfafssfa.onError(function (err) {
- console.log("激励视屏加载失败:" + err);
- _this.asfasfsaffsa = false;
- });
- this.afsfsaafsfsa = true;
- };
- //看视频
- GuangGao.ShowVideo = function (callback) {
- var _this = this;
- if (this.hasvideo) {
- if (this.asfasfsaffsa) {
- console.log("showVideoAd:" + this.asfasfsaffsa);
- this.SetVideoCallBack(callback);
- this.fsaasfafssfa.show().catch(function (err) {
- _this.fsaasfafssfa.load().then(function () {
- _this.SetVideoCallBack(callback);
- _this.fsaasfafssfa.show();
- });
- });
- }
- else {
- // ShareUtil.shareImage("视频没有分享", callback
- // , "1");
- }
- }
- else {
- callback(false);
- // ShareUtil.shareImage("视频没有分享", callback
- // , "1");
- }
- };
- GuangGao.SetVideoCallBack = function (callback) {
- var _this = this;
- this.fsaasfafssfa.offClose();
- this.fsaasfafssfa.onClose(function (res) {
- console.log("激励视频关闭:" + res.isEnded);
- if (res && res.isEnded || res === undefined) {
- callback && callback(true);
- }
- else {
- callback && callback(false);
- }
- _this.fsaasfafssfa.offClose();
- });
- };
- //打开banner
- GuangGao.OpenBanner = function (gap, callVack, iswait) {
- // if (!this.hasbanner)
- // {
- // callVack(null);
- // return;
- // }
- var _this = this;
- if (gap === void 0) { gap = 0; }
- if (callVack === void 0) { callVack = null; }
- if (iswait === void 0) { iswait = false; }
- if (!Laya.Browser.onWeiXin) {
- callVack(null);
- return;
- }
- this.canshowbanner = true;
- var idd = this.bannerAdUnitId;
- console.log("adUnitId:" + idd);
- var newBanner = Laya.Browser.window.wx.createBannerAd({
- adUnitId: idd,
- style: {
- left: 0,
- top: 0,
- width: 460
- }
- });
- newBanner.onError(function (err) {
- console.log(err);
- callVack(null);
- });
- newBanner.onLoad(function () {
- if (_this.curbanner)
- _this.curbanner.destroy();
- _this.curbanner = newBanner;
- var hight = _this.GetRealHight(gap);
- if (callVack != null) {
- callVack(hight);
- }
- if (_this.canshowbanner && !iswait) {
- _this.curbanner.show();
- }
- else {
- _this.curbanner.hide();
- }
- });
- };
- GuangGao.GetRealHight = function (gap) {
- if (this.curbanner) {
- var info = Laya.Browser.window.wx.getSystemInfoSync();
- this.curbanner.style.width = info.windowWidth;
- this.curbanner.style.top = info.windowHeight - this.curbanner.style.realHeight - gap;
- return Laya.stage.height / info.windowHeight * this.curbanner.style.realHeight;
- }
- };
- //clear
- GuangGao.Clear = function () {
- GuangGao.clearTween();
- Laya.timer.clearAll(this);
- Laya.Tween.clearAll(this);
- this.canshowbanner = false;
- if (this.curbanner)
- this.curbanner.hide();
- // if (!Laya.Browser.onWeiXin) return;
- // if (this.curbanner) this.curbanner.hide();
- };
- GuangGao.hidebanner = function () {
- if (!Laya.Browser.onWeiXin)
- return;
- if (this.curbanner)
- this.curbanner.hide();
- };
- GuangGao.showbanner = function () {
- if (!Laya.Browser.onWeiXin)
- return;
- if (this.curbanner)
- this.curbanner.show();
- };
- Object.defineProperty(GuangGao, "cancheat", {
- get: function () {
- if (PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.cheat) {
- return true;
- }
- else {
- return false;
- }
- // if(!PlayerAccount.CurrentAccount.CurAccountData.cheat)
- // {
- // console.log("cheat:false-> CurAccountData.cheat != 1");
- // return false;
- // }
- // var checkscence = PlayerAccount.CurrentAccount.CurAccountData.checkscence;
- // if (checkscence == false)
- // {
- // console.log("cheat:true-> " + WxApi.sceneValue);
- // return true;
- // }
- // if (WxApi.sceneValue == "1037" || WxApi.sceneValue == "1058"|| WxApi.sceneValue == "1067" || WxApi.sceneValue == "1095")
- // {
- // console.log("cheat:true-> " + WxApi.sceneValue);
- // return true;
- // }
- // console.log("cheat:false-> " + WxApi.sceneValue);
- // return false;
- },
- enumerable: true,
- configurable: true
- });
- GuangGao.SetPosBanner = function (btn, complete) {
- var _this = this;
- if (Laya.Browser.onPC) {
- complete(false);
- return;
- }
- var info = Laya.Browser.window.wx.getSystemInfoSync();
- //console.log(info);
- //console.log(btn);
- //console.log(btn.y,Laya.stage.height,info.windowHeight);
- var reshight = btn.y * info.windowHeight / Laya.stage.height;
- //console.log("reshight",reshight);
- var idd = this.bannerAdUnitId;
- console.log("adUnitId:" + idd);
- if (this.curbanner)
- this.curbanner.destroy();
- var newBanner = Laya.Browser.window.wx.createBannerAd({
- adUnitId: idd,
- style: {
- left: 0,
- top: 0,
- width: 720
- }
- });
- newBanner.onError(function (err) {
- console.log(err);
- complete(false);
- });
- newBanner.onLoad(function () {
- _this.curbanner = newBanner;
- _this.curbanner.style.top = reshight;
- //console.log("top",this.asgagassga.style.top);
- if (_this.curbanner) {
- console.log("banner show");
- _this.curbanner.show();
- Laya.timer.once(2300, _this, function () {
- _this.curbanner.style.top = info.windowHeight - GuangGao.bannerhigt;
- complete(true);
- });
- }
- });
- newBanner.onResize(function (res) {
- GuangGao.bannerhigt = res.height;
- _this.curbanner.style.width = info.windowWidth;
- _this.curbanner.style.top = reshight;
- });
- };
- //按钮误导
- GuangGao.CheatBanner = function (btn, complete, gap) {
- if (complete === void 0) { complete = null; }
- if (gap === void 0) { gap = 0; }
- ttad_1.ttad.Showbanner();
- // if(!GuangGao.cancheat)
- // {
- // console.log("ignorecheat");
- // GuangGao.OpenBanner(0,(height) =>
- // {
- // if(height == null)
- // {
- // }
- // });
- // }
- // else
- // {
- // btn.y = Laya.stage.height-btn.height - 100;
- // GuangGao.OpenBanner(gap,(height) =>
- // {
- // if(height == null)
- // {
- // }
- // else
- // {
- // console.log("cheatstart","bottom:100");
- // // btn.mouseEnabled = false;
- // var end=Laya.stage.height-height-btn.height - 80;
- // console.log("y:" + end);
- // Laya.timer.once(PlayerAccount.CurrentAccount.CurAccountData.cheattime*1000,this,()=>
- // {
- // // btn.mouseEnabled = true;
- // this.showbanner();
- // GuangGao.clearTween();
- // GuangGao.tween = Laya.Tween.to(btn,{y:end},200,null,Laya.Handler.create(this,()=>
- // {
- // if(complete != null)
- // {
- // complete();
- // }
- // }))
- // })
- // }
- // },true);
- // }
- };
- GuangGao.clearTween = function () {
- if (GuangGao.tween) {
- GuangGao.tween.clear();
- GuangGao.tween = null;
- }
- };
- GuangGao.prototype.loadVideo = function (cb) {
- var _this = this;
- if (!Laya.Browser.onWeiXin) {
- if (cb)
- cb(true);
- return;
- }
- ;
- this._onLoadVideo = cb;
- if (!this._rewardedVideoAd) {
- var index = GuangGao.videlAdUnitId;
- this._rewardedVideoAd = Laya.Browser.window.wx.createRewardedVideoAd({ adUnitId: index });
- var isc = false;
- this._rewardedVideoAd.onLoad(function () {
- console.log("[LOG] 激励视频广告加载成功");
- _this.isVideoLoadCom = true;
- if (isc)
- return;
- isc = true;
- _this._onLoadVideo && _this._onLoadVideo(true);
- _this._onLoadVideo = null;
- });
- this._rewardedVideoAd.onError(function (err) {
- console.log("[LOG] 激励视频广告加载失败");
- console.log(err);
- _this.isVideoLoadCom = false;
- _this._onLoadVideo && _this._onLoadVideo(false);
- _this._onLoadVideo = null;
- });
- this._rewardedVideoAd.onClose(function (res) {
- if (!res || res.isEnded) {
- _this._onVideoClose && _this._onVideoClose(true);
- _this._onVideoClose = null;
- }
- else {
- _this._onVideoClose && _this._onVideoClose(false);
- _this._onVideoClose = null;
- }
- });
- }
- else {
- if (this.isVideoLoadCom) {
- this._onLoadVideo && this._onLoadVideo(true);
- this._onLoadVideo = null;
- }
- else {
- this._onLoadVideo && this._onLoadVideo(false);
- this._onLoadVideo = null;
- }
- }
- };
- GuangGao.prototype.showVideo = function (cb) {
- var _this = this;
- if (!Laya.Browser.onWeiXin) {
- if (cb)
- cb(true);
- return;
- }
- ;
- this._onVideoClose = cb;
- this._rewardedVideoAd.show().catch(function (err) {
- _this._rewardedVideoAd.load().then(function () {
- _this._rewardedVideoAd.show();
- });
- });
- };
- GuangGao.videlAdUnitId = "adunit-0c687084c908ee89";
- GuangGao.bannerAdUnitId = "adunit-8c2d586135fa6d4f";
- GuangGao.afsfsaafsfsa = false;
- //视屏广告是否加载成功
- GuangGao.asfasfsaffsa = false;
- GuangGao.canshowbanner = true;
- GuangGao.bannerhigt = 0;
- return GuangGao;
- }());
- exports.GuangGao = GuangGao;
- },{"./PlayerAccount":75,"./ttad":83}],73:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Event = Laya.Event;
- var HttpRequest = Laya.HttpRequest;
- var PlayerAccount_1 = require("./PlayerAccount");
- var Sdk_1 = require("./Sdk");
- var TimesTamper_1 = require("../Time/TimesTamper");
- var Global_1 = require("../Global");
- // const PROTOCOL_URL:string = "https://pipelineapi.xwxgame.com/";
- var PROTOCOL_URL = "https://parkourracetoutiao2api.xwxgame.com/";
- var PROTOCOLS = /** @class */ (function () {
- function PROTOCOLS() {
- }
- PROTOCOLS.Login = "user/login"; // not token
- PROTOCOLS.game = "game/start";
- PROTOCOLS.end = "game/play";
- PROTOCOLS.Sign = "sign/sign";
- // public static EquipHero = "theme/equipHero";
- // public static BuyHero = "theme/buyHero";
- // public static EquipHat = "theme/equipHat";
- // public static BuyHat = "theme/buyHat";
- // public static BuyDance = "theme/buyDance";
- // public static EquipDance = "theme/equipDance";
- PROTOCOLS.Buy = "theme/buy";
- PROTOCOLS.Equip = "theme/equip";
- PROTOCOLS.share = "fission/share";
- PROTOCOLS.vd = "fission/vd";
- PROTOCOLS.revival = "game/revival";
- PROTOCOLS.fission = "theme/fission";
- PROTOCOLS.themefission = "theme/fission";
- PROTOCOLS.treasure = "treasure/click";
- PROTOCOLS.Config = "config/table";
- PROTOCOLS.Lottery = "lottery/lottery";
- PROTOCOLS.GetAchieve = "achievement/getRewards";
- PROTOCOLS.usersync = "user/sync";
- return PROTOCOLS;
- }());
- exports.PROTOCOLS = PROTOCOLS;
- ;
- var NetworkManager = /** @class */ (function () {
- function NetworkManager() {
- NetworkManager.instance = this;
- }
- Object.defineProperty(NetworkManager, "Instance", {
- get: function () {
- if (NetworkManager.instance) {
- return NetworkManager.instance;
- }
- else {
- return new NetworkManager();
- }
- },
- enumerable: true,
- configurable: true
- });
- //#region 登入
- /******************************* login *****************************/
- NetworkManager.prototype.login = function (progresscb, completecb, errorcb) {
- var userInfor = PlayerAccount_1.PlayerAccount.CurrentAccount;
- var ver = Global_1.Global.gameVersion;
- 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;
- var httpRequest = new HttpRequest();
- httpRequest.once(Event.PROGRESS, this, this.onHttpRequestProgress, [progresscb, httpRequest]);
- httpRequest.once(Event.COMPLETE, this, this.onLoginRequestComplete, [completecb, httpRequest]);
- httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
- httpRequest.send(PROTOCOL_URL + PROTOCOLS.Login, args, "post", "text");
- };
- NetworkManager.prototype.onHttpRequestProgress = function (progresscb, httpRequest) {
- if (progresscb) {
- console.log("HttpRequestProgress:...");
- progresscb.run();
- }
- };
- NetworkManager.prototype.onLoginRequestComplete = function (completecb, httpRequest) {
- //console.log("登录数据:", httpRequest.data);
- var data = JSON.parse(httpRequest.data);
- if (data["code"] != "0") {
- console.log("登录异常错误!错误信息:", httpRequest.data);
- Sdk_1.WxApi.recordAldEvent("登录异常错误!错误信息:= " + data["code"], "httpRequest.dat");
- //completecb.runWith(data);
- return;
- }
- PlayerAccount_1.PlayerAccount.ServerTime = data["t"];
- TimesTamper_1.TimesTamper.Instance.updateServiceTime(Number(data["t"]));
- Sdk_1.WxApi.recordAldEvent("登录正式成功");
- PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, completecb);
- // ShareUtil.ShareMessage();
- };
- NetworkManager.prototype.onHttpRequestError = function (errorcb, httpRequest) {
- if (errorcb != null) {
- errorcb.runWith(httpRequest);
- }
- Sdk_1.WxApi.recordAldEvent("Error! Http request error.. ", "httpRequest.dat");
- Sdk_1.WxApi.ShowLoading("连接网络失败...");
- Laya.timer.once(8000, this, function () { Sdk_1.WxApi.HideLoading(); });
- console.log("Error! Http request error..." + httpRequest.data);
- };
- //#endregion
- /*
- * 通用Http Post协议发送
- * protocol 对应“PROTOCOLS”字典中协议名称
- * hasToken 是否使用token,目前只有login协议不需要token,其他都需要token,所以此处自动组合
- * param 参数列表,key是字段名,val是值,值需要先转string
- * completecb 协议发送成功回调函数
- * errorcb 协议发送失败回调函数
- * return 返回值为void
- */
- NetworkManager.prototype.HttpPostRequest = function (protocol, param, completecb, errorcb, hasToken) {
- if (hasToken === void 0) { hasToken = true; }
- var args = "";
- var url = PROTOCOL_URL + protocol;
- // chechk add token
- var account = PlayerAccount_1.PlayerAccount.CurrentAccount;
- var accountdata = account.CurAccountData;
- if (hasToken == true) {
- args = "token=" + accountdata.m_token + "&";
- }
- Sdk_1.WxApi.ShowLoading("连接网络中...");
- if (protocol == PROTOCOLS.game || protocol == PROTOCOLS.end || protocol == PROTOCOLS.fission || protocol == PROTOCOLS.vd ||
- protocol == PROTOCOLS.themefission || protocol == PROTOCOLS.Lottery || protocol == PROTOCOLS.usersync) {
- var str = "abcdefghijkimnopqrstuvwxyz0123456789";
- var code = "{";
- var mask = "";
- for (var i = 0; i < 4; i++) {
- mask += str[Math.floor(Math.random() * 100) % str.length];
- }
- for (var i = 0; i < param.length; i++) {
- for (var key in param[i]) {
- code += "\"" + key + "\":\"" + param[i][key] + "\"";
- }
- if (i < param.length - 1) {
- code += ",";
- }
- else {
- code += "}";
- }
- }
- args += "_r=" + mask + this.base64Encode(code);
- }
- else {
- if (param != null) {
- for (var i = 0; i < param.length; i++) {
- for (var key in param[i]) {
- var val = param[i][key];
- args += key + "=" + val;
- if (i < param.length - 1) {
- args += "&";
- }
- }
- }
- }
- }
- var httpRequest = new HttpRequest();
- httpRequest.once(Event.COMPLETE, this, this.onHttpRequestComplete, [completecb, errorcb, httpRequest]);
- httpRequest.once(Event.ERROR, this, this.onHttpRequestError, [errorcb, httpRequest]);
- httpRequest.send(url, args, "post", "text");
- };
- NetworkManager.prototype.onHttpRequestComplete = function (succeedcb, failurecb, httpRequest) {
- Sdk_1.WxApi.HideLoading();
- var data = JSON.parse(httpRequest.data);
- if (data["code"] == 0) {
- PlayerAccount_1.PlayerAccount.CurrentAccount.SetAccountData(data, null);
- if (succeedcb != null) {
- succeedcb.runWith(data);
- }
- }
- else {
- if (failurecb != null) {
- failurecb.runWith(data);
- }
- console.log("Error! Http request complete error, code: " + data["code"] + " message: " + data["message"]);
- }
- };
- NetworkManager.prototype.base64Encode = function (str) {
- var c1, c2, c3;
- var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- var i = 0, len = str.length, string = '';
- while (i < len) {
- c1 = str.charCodeAt(i++) & 0xff;
- if (i == len) {
- string += base64EncodeChars.charAt(c1 >> 2);
- string += base64EncodeChars.charAt((c1 & 0x3) << 4);
- string += "==";
- break;
- }
- c2 = str.charCodeAt(i++);
- if (i == len) {
- string += base64EncodeChars.charAt(c1 >> 2);
- string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
- string += base64EncodeChars.charAt((c2 & 0xF) << 2);
- string += "=";
- break;
- }
- c3 = str.charCodeAt(i++);
- string += base64EncodeChars.charAt(c1 >> 2);
- string += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
- string += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
- string += base64EncodeChars.charAt(c3 & 0x3F);
- }
- return string;
- };
- return NetworkManager;
- }());
- exports.NetworkManager = NetworkManager;
- },{"../Global":41,"../Time/TimesTamper":60,"./PlayerAccount":75,"./Sdk":77}],74:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PlatfromType = /** @class */ (function () {
- function PlatfromType() {
- }
- /**
- * 电脑
- */
- PlatfromType.pc = "pc";
- /**
- * 微信小游戏
- */
- PlatfromType.wx = "wx";
- /**
- * qq小游戏
- */
- PlatfromType.qq = "qq";
- /**
- * 抖音
- */
- PlatfromType.tt = "tt";
- return PlatfromType;
- }());
- exports.PlatfromType = PlatfromType;
- },{}],75:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Sdk_1 = require("../WXSDK/Sdk");
- var GameUtils_1 = require("../utils/GameUtils");
- var NetworkManager_1 = require("./NetworkManager");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var UserInfoEvent_1 = require("../Data/UserInfoEvent");
- var requiretype;
- (function (requiretype) {
- requiretype[requiretype["\u7CFB\u7EDF\u8D60\u9001"] = 1] = "\u7CFB\u7EDF\u8D60\u9001";
- requiretype[requiretype["\u91D1\u5E01\u8D2D\u4E70"] = 2] = "\u91D1\u5E01\u8D2D\u4E70";
- requiretype[requiretype["\u89C2\u770B\u89C6\u9891"] = 3] = "\u89C2\u770B\u89C6\u9891";
- requiretype[requiretype["\u5206\u4EAB"] = 4] = "\u5206\u4EAB";
- requiretype[requiretype["\u7B7E\u5230"] = 5] = "\u7B7E\u5230";
- requiretype[requiretype["\u6D3B\u52A8"] = 6] = "\u6D3B\u52A8";
- requiretype[requiretype["\u901A\u8FC7\u5173\u5361"] = 7] = "\u901A\u8FC7\u5173\u5361";
- requiretype[requiretype["\u7D2F\u8BA1\u767B\u9646"] = 8] = "\u7D2F\u8BA1\u767B\u9646";
- requiretype[requiretype["\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230"] = 9] = "\u9080\u8BF7\u4EBA\u6570\u8FBE\u5230";
- requiretype[requiretype["\u7816\u77F3\u8D2D\u4E70"] = 10] = "\u7816\u77F3\u8D2D\u4E70";
- })(requiretype = exports.requiretype || (exports.requiretype = {}));
- var AccountConfig;
- (function (AccountConfig) {
- AccountConfig[AccountConfig["crop"] = 0] = "crop";
- AccountConfig[AccountConfig["things"] = 1] = "things";
- AccountConfig[AccountConfig["land"] = 2] = "land";
- AccountConfig[AccountConfig["global"] = 3] = "global";
- AccountConfig[AccountConfig["entity"] = 4] = "entity";
- AccountConfig[AccountConfig["sign"] = 5] = "sign";
- AccountConfig[AccountConfig["rewards"] = 6] = "rewards";
- AccountConfig[AccountConfig["achievement"] = 7] = "achievement";
- AccountConfig[AccountConfig["invite"] = 8] = "invite";
- AccountConfig[AccountConfig["mission"] = 9] = "mission";
- AccountConfig[AccountConfig["treasure_click"] = 10] = "treasure_click";
- AccountConfig[AccountConfig["theme"] = 11] = "theme";
- AccountConfig[AccountConfig["lottery"] = 12] = "lottery";
- })(AccountConfig = exports.AccountConfig || (exports.AccountConfig = {}));
- var AccountUser;
- (function (AccountUser) {
- AccountUser[AccountUser["money"] = 0] = "money";
- AccountUser[AccountUser["diamond"] = 1] = "diamond";
- AccountUser[AccountUser["user_id"] = 2] = "user_id";
- AccountUser[AccountUser["game_times"] = 3] = "game_times";
- AccountUser[AccountUser["get_themes"] = 4] = "get_themes";
- AccountUser[AccountUser["video_times"] = 5] = "video_times";
- AccountUser[AccountUser["equip_themes"] = 6] = "equip_themes";
- AccountUser[AccountUser["last_action_time"] = 7] = "last_action_time";
- AccountUser[AccountUser["last_favorite_time"] = 8] = "last_favorite_time";
- AccountUser[AccountUser["progress_themes"] = 9] = "progress_themes";
- AccountUser[AccountUser["revival"] = 10] = "revival";
- AccountUser[AccountUser["stage"] = 11] = "stage";
- AccountUser[AccountUser["vmoney"] = 12] = "vmoney";
- })(AccountUser = exports.AccountUser || (exports.AccountUser = {}));
- var heroAttr;
- (function (heroAttr) {
- heroAttr[heroAttr["id"] = 0] = "id";
- heroAttr[heroAttr["name"] = 1] = "name";
- heroAttr[heroAttr["quality"] = 2] = "quality";
- heroAttr[heroAttr["icon"] = 3] = "icon";
- heroAttr[heroAttr["prefab"] = 4] = "prefab";
- heroAttr[heroAttr["require_num"] = 5] = "require_num";
- heroAttr[heroAttr["require_type"] = 6] = "require_type";
- })(heroAttr = exports.heroAttr || (exports.heroAttr = {}));
- var signdata;
- (function (signdata) {
- signdata[signdata["sign_days"] = 0] = "sign_days";
- signdata[signdata["sign_time"] = 1] = "sign_time";
- })(signdata = exports.signdata || (exports.signdata = {}));
- var entity;
- (function (entity) {
- entity[entity["id"] = 0] = "id";
- entity[entity["name"] = 1] = "name";
- entity[entity["entity_id"] = 2] = "entity_id";
- entity[entity["icon"] = 3] = "icon";
- })(entity = exports.entity || (exports.entity = {}));
- var skinattr;
- (function (skinattr) {
- skinattr[skinattr["effectValue_1"] = 0] = "effectValue_1";
- skinattr[skinattr["effectValue_2"] = 1] = "effectValue_2";
- skinattr[skinattr["effectValue_3"] = 2] = "effectValue_3";
- skinattr[skinattr["effectValue_4"] = 3] = "effectValue_4";
- })(skinattr = exports.skinattr || (exports.skinattr = {}));
- var AccountData = /** @class */ (function () {
- function AccountData(_token, _config, _appSetting, _user, _userbase, _useInvite, _user_stage, _user_sign, _user_achievement, _lottery, _use_land_task, _user_video) {
- if (_useInvite === void 0) { _useInvite = null; }
- if (_user_stage === void 0) { _user_stage = null; }
- this.openid = "";
- this.userId = "";
- this.roadconfig = {};
- this.m_RewardDic = {};
- this.m_EntityDic = {};
- this.m_AchievementDic = {};
- this.m_token = _token;
- this.m_app_setting = _appSetting;
- this.m_user = _user;
- this.m_user_base = _userbase;
- this.m_sign = _user_sign;
- this.m_task = _user_achievement;
- this.lottery = _lottery;
- this.m_use_land_task = _use_land_task;
- this.m_user_video = _user_video;
- this.userId = this.m_user["user_id"];
- this.openid = this.m_user_base["openid"];
- console.log("user_id:" + this.userId);
- //console.log("open_id:"+this.openid);
- }
- Object.defineProperty(AccountData.prototype, "DieDistance", {
- // public m_skinDic:Dictionary<number,SkinData> = new Dictionary();
- //获取玩家落入空中死亡距离
- get: function () {
- return Number(this.m_app_setting["DieDistance"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "HitEgg", {
- //获取开局砸蛋几率
- get: function () {
- return Number(this.m_app_setting["HitEgg"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "EndCheat", {
- //获取结算后砸蛋出现几率
- get: function () {
- return Number(this.m_app_setting["EndCheat"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "CheatReward", {
- //获取误触奖励金币数
- get: function () {
- return Number(this.m_app_setting["CheatReward"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "WhiteUser", {
- //白名单用户
- get: function () {
- return this.m_app_setting["WhiteUser"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "StrategySwitch", {
- //签到功能是否开启
- get: function () {
- return this.m_app_setting["StrategySwitch"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "ShowSign", {
- //签到功能是否开启
- get: function () {
- return this.m_app_setting["ShowSign"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "Choose", {
- //自动勾选
- get: function () {
- return this.m_app_setting["choose"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "ShowBattleBtn", {
- //发起挑战按钮开关
- get: function () {
- return this.m_app_setting["ShowBattleBtn"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "lotterytime", {
- get: function () {
- return Number(this.lottery["day_video_times"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "share", {
- get: function () {
- return this.m_app_setting["share"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "sharecontent", {
- get: function () {
- return this.m_app_setting["sharecontent"];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "ShareImage", {
- get: function () {
- return this.m_app_setting["ShareImage"];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "cheattime", {
- get: function () {
- return Number(this.m_app_setting["cheattime"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "banner", {
- get: function () {
- return this.m_app_setting["banner"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "video", {
- get: function () {
- return this.m_app_setting["video"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "BtnCanMove", {
- get: function () {
- return this.m_app_setting["BtnCanMove"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "checkscence", {
- get: function () {
- return this.m_app_setting["checkscence"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "banner_dis", {
- get: function () {
- return Number(this.m_app_setting["banner_dis"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "bannerMoveTime", {
- get: function () {
- return Number(this.m_app_setting["bannerMoveTime"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "createBannerTimes", {
- get: function () {
- return Number(this.m_app_setting["createBannerTimes"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "bannerMoveProp", {
- get: function () {
- return Number(this.m_app_setting["bannerMoveProp"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "isShareThenVideo", {
- get: function () {
- return this.m_app_setting["isShareThenVideo"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "isShowHuiTui", {
- get: function () {
- return this.m_app_setting["isShowHuiTui"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "start_sprint", {
- get: function () {
- return Number(this.m_app_setting["start_sprint"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "IsVideoModel", {
- get: function () {
- return this.m_app_setting["IsVideoModel"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "videoModelNum", {
- get: function () {
- return Number(this.m_app_setting["videoModelNum"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "VideoModelTitle", {
- get: function () {
- return this.m_app_setting["VideoModelTitle"];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "failcount", {
- get: function () {
- return Number(this.m_app_setting["failcount"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "spminspeed", {
- get: function () {
- return Number(this.m_app_setting["spminspeed"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "bgm", {
- get: function () {
- return this.m_app_setting["bgm"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "camerahight", {
- get: function () {
- return Number(this.m_app_setting["camerahight"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "ctnfilename", {
- get: function () {
- return this.m_app_setting["ctnfilename"];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "cheat", {
- get: function () {
- return this.m_app_setting["cheat"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "shakestage", {
- get: function () {
- return this.m_app_setting["shakestage"] && this.m_app_setting["shakestage"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "stageconfigcdn", {
- get: function () {
- return this.m_app_setting["stageconfigcdn"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "playerspeed", {
- get: function () {
- return Number(this.m_app_setting["playerspeed"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "videlAdUnitId", {
- get: function () {
- return this.m_app_setting["videlAdUnitId"];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "bannerAdUnitId", {
- get: function () {
- return this.m_app_setting["bannerAdUnitId"];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "tri", {
- get: function () {
- return this.m_app_setting["tri"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "recommend", {
- get: function () {
- return this.m_app_setting["recommend"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "recommendflg", {
- get: function () {
- return this.m_app_setting["recommendflg"];
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "egg", {
- get: function () {
- return this.m_app_setting["egg"] == "1";
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "eggrate", {
- get: function () {
- return Number(this.m_app_setting["eggrate"]);
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(AccountData.prototype, "UseId", {
- get: function () {
- return this.userId;
- },
- enumerable: true,
- configurable: true
- });
- AccountData.prototype.GetConfig = function (_type) {
- var type = AccountConfig[_type];
- return this.m_configs[type];
- };
- AccountData.prototype.GetUser = function (_type) {
- var type = AccountUser[_type];
- return this.m_user[type];
- };
- Object.defineProperty(AccountData.prototype, "GetVideoTotal", {
- get: function () {
- return Number(this.m_user_video["total"]);
- },
- enumerable: true,
- configurable: true
- });
- AccountData.prototype.GetSign = function (_datatype) {
- var type = signdata[_datatype];
- return this.m_sign[type];
- };
- AccountData.prototype.GetRewardConfig = function (_rewardid) {
- var reward = this.m_RewardDic[_rewardid];
- return reward;
- };
- AccountData.prototype.GetEntity = function (_id, attr) {
- if (!this.m_EntityDic[_id])
- return null;
- return this.m_EntityDic[_id][entity[attr]];
- };
- AccountData.prototype.GetRewardDic = function () {
- var config = this.GetConfig(AccountConfig.rewards);
- for (var key in config) {
- this.m_RewardDic[config[key].id] = config[key];
- }
- };
- AccountData.prototype.GetEntityDic = function () {
- var config = this.GetConfig(AccountConfig.entity);
- for (var key in config) {
- this.m_EntityDic[config[key].entity_id] = config[key];
- }
- };
- AccountData.prototype.GetThemeById = function (_id) {
- var data = this.GetConfig(AccountConfig.theme);
- if (data) {
- for (var index = 0; index < data.length; index++) {
- var element = data[index];
- if (element.id == _id) {
- return element;
- }
- }
- }
- };
- AccountData.prototype.GetSkinAttr = function (_id) {
- var config = this.GetConfig(AccountConfig.theme);
- for (var i = 0; i < config.length; i++) {
- if (config[i].id == _id) {
- return config[i];
- }
- }
- };
- AccountData.prototype.GetAchievementData = function () {
- var data = this.GetConfig(AccountConfig.achievement);
- var dic = {};
- for (var key1 in data) {
- var type1 = data[key1].type;
- //var obj = {};
- if (dic[type1]) {
- continue;
- }
- var array = [];
- for (var key2 in data) {
- var type2 = data[key2].type;
- if (type1 == type2) {
- array.push(data[key2]);
- }
- }
- dic[type1] = array;
- }
- this.m_AchievementDic = dic;
- };
- AccountData.prototype.HasTheme = function (_id) {
- var has = false;
- var getthemes = this.GetUser(AccountUser.get_themes);
- for (var i = 0; i < getthemes.length; i++) {
- if (getthemes[i] == _id) {
- has = true;
- }
- }
- return has;
- };
- AccountData.prototype.GetSkinDic = function (_config) {
- };
- AccountData.prototype.GetHeroProgress = function (_id) {
- var config = this.m_user["progress_heroes"];
- var progress = config[_id] ? config[_id] : 0;
- return progress;
- };
- AccountData.prototype.GetHatProgress = function (_id) {
- var config = this.m_user["progress_hats"];
- var progress = config[_id] ? config[_id] : 0;
- return progress;
- };
- AccountData.prototype.GetCbProgress = function (_id) {
- var config = this.m_user["progress_dances"];
- var progress = config[_id] ? config[_id] : 0;
- return progress;
- };
- AccountData.prototype.HasMotor = function (_id) {
- var data = this.GetUser(AccountUser.get_themes);
- for (var i = 0; i < data.length; i++) {
- var hd = data[i];
- if (_id == hd) {
- return true;
- }
- }
- return false;
- };
- //获取皮肤的进度
- AccountData.prototype.GetMotorProgress = function (_id) {
- var config = this.m_user["progress_themes"];
- var progress = config[_id] ? config[_id] : 0;
- return progress;
- };
- AccountData.prototype.GetSeverConfig = function (_config) {
- this.m_configs = _config;
- this.GetSkinDic(this.m_configs);
- this.GetRewardDic();
- this.GetEntityDic();
- // this.GetAchievementData();
- var _globe = _config["global"];
- for (var index = 0; index < _globe.length; index++) {
- var element = _globe[index];
- if (element.key == "tilirec") {
- PlayerAccount.CurrentAccount.tilirec = Number(element.value);
- return;
- }
- }
- };
- AccountData.prototype.UpdateSkinDic = function () {
- this.GetSkinDic(this.m_configs);
- };
- AccountData.prototype.GetGlobe = function (_key) {
- var globe = this.GetConfig(AccountConfig.global);
- for (var key in globe) {
- var obj = globe[key];
- var kkk = obj["key"];
- if (kkk == _key) {
- var value = obj["value"];
- return value;
- }
- }
- return null;
- };
- return AccountData;
- }());
- exports.AccountData = AccountData;
- var PlayerAccount = /** @class */ (function () {
- function PlayerAccount(_code, _nickname, _avatar, _gender, _country, _province, _city, _device, _shareid, _scence, _ver) {
- this.IsTest = false;
- this.localTime = Laya.timer.currTimer;
- this.Code = _code;
- this.NickName = _nickname;
- this.Avatar = _avatar;
- this.Gender = _gender;
- this.Country = _country;
- this.Province = _province;
- this.City = _city;
- this.Device = _device;
- this.ShareId = _shareid;
- this.Scene = _scence;
- this.ver = _ver;
- this.IsTest = false;
- PlayerAccount.instance = this;
- }
- Object.defineProperty(PlayerAccount, "CurrentAccount", {
- get: function () {
- if (PlayerAccount.instance == null) {
- console.log("生成本地测试账号...");
- return PlayerAccount.TestAccount;
- }
- return PlayerAccount.instance;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(PlayerAccount, "TestAccount", {
- get: function () {
- var code = Laya.LocalStorage.getItem("localcode");
- if (!code) {
- var time = new Date().getTime().toString();
- var random = GameUtils_1.GameUtils.randRangeint(10000, 99999).toString();
- code = "xj_" + time + random;
- Laya.LocalStorage.setItem("localcode", code);
- console.log(time, random);
- console.log("新用户", code);
- }
- else {
- console.log("老用户", code);
- }
- var curaccount = new PlayerAccount(code, null, null, null, null, null, null, null, null, null, null);
- curaccount.IsTest = true;
- return curaccount;
- },
- enumerable: true,
- configurable: true
- });
- PlayerAccount.prototype.SetAccountData = function (data, completecb) {
- var _this = this;
- var token = data["token"];
- var configs = data["configs"];
- var app_setting = data["app_setting"];
- var user = data["user"];
- var user_base = data["user_base"];
- var user_sign = data["user_sign"];
- var user_achievement = data["user_achievement"];
- var user_lottery = data["user_lottery"];
- var user_land_task = data["user_land_task"];
- var user_video = data["user_video"];
- if (this.CurAccountData == null) {
- Sdk_1.WxApi.recordAldEvent("开始获取config数据");
- this.CurAccountData = new AccountData(token, configs, app_setting, user, user_base, null, null, user_sign, user_achievement, user_lottery, user_land_task, user_video);
- this.CheckLocalConfig(data.table_version, function (_config) {
- _this.CurAccountData.GetSeverConfig(_config);
- _this.nowConfig = _config;
- if (completecb != null) {
- completecb.runWith(data);
- }
- });
- }
- else {
- if (configs) {
- this.CurAccountData.m_configs = configs;
- }
- if (app_setting) {
- this.CurAccountData.m_app_setting = app_setting;
- }
- if (user) {
- this.CurAccountData.m_user = user;
- }
- if (user_base) {
- this.CurAccountData.m_user_base = user_base;
- }
- if (user_sign) {
- this.CurAccountData.m_sign = user_sign;
- }
- if (user_achievement) {
- this.CurAccountData.m_task = user_achievement;
- }
- if (user_lottery) {
- this.CurAccountData.lottery = user_lottery;
- }
- if (user_land_task) {
- this.CurAccountData.m_use_land_task = user_land_task;
- }
- if (user_video) {
- this.CurAccountData.m_user_video = user_video;
- }
- }
- DispatcherManager_1.DispatcherManager.dispatchEvent(UserInfoEvent_1.UserInfoEvent.updatePlayerInfo);
- };
- PlayerAccount.prototype.CheckLocalConfig = function (_ver, cb) {
- var curconfig = Laya.LocalStorage.getJSON(PlayerAccount.localcofigkey);
- if (curconfig) {
- //Laya.LocalStorage.removeItem(PlayerAccount.localcofigkey);
- if (curconfig.ver == _ver) {
- console.log("sever配置是最新的...", _ver);
- Sdk_1.WxApi.recordAldEvent("config接口获取成功");
- cb(curconfig);
- }
- else {
- NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
- data.configs.ver = _ver;
- Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
- console.log("sever配置更新完成...", _ver);
- Sdk_1.WxApi.recordAldEvent("config接口获取成功");
- cb(data.configs);
- }), Laya.Handler.create(this, function (data) {
- console.log("配置获取失败" + data);
- Sdk_1.WxApi.recordAldEvent("config接口获取失败");
- }));
- }
- }
- else {
- NetworkManager_1.NetworkManager.Instance.HttpPostRequest(NetworkManager_1.PROTOCOLS.Config, null, Laya.Handler.create(this, function (data) {
- data.configs.ver = _ver;
- Laya.LocalStorage.setJSON(PlayerAccount.localcofigkey, data.configs);
- console.log("sever保存配置完成...", _ver);
- Sdk_1.WxApi.recordAldEvent("config接口获取成功");
- cb(data.configs);
- }), Laya.Handler.create(this, function (data) {
- console.log("配置获取失败" + data);
- Sdk_1.WxApi.recordAldEvent("config接口获取失败");
- }));
- }
- };
- Object.defineProperty(PlayerAccount.prototype, "ServerTime", {
- get: function () {
- var time = Laya.timer.currTimer;
- var stime = PlayerAccount.ServerTime + Math.ceil((time - this.localTime) / 1000);
- return stime;
- },
- enumerable: true,
- configurable: true
- });
- PlayerAccount.localcofigkey = "mconfig";
- return PlayerAccount;
- }());
- exports.PlayerAccount = PlayerAccount;
- },{"../Data/UserInfoEvent":36,"../WXSDK/Sdk":77,"../utils/DispatcherManager":85,"../utils/GameUtils":87,"./NetworkManager":73}],76:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var RecordManager = /** @class */ (function () {
- function RecordManager() {
- RecordManager.instance = this;
- console.log("new record");
- }
- Object.defineProperty(RecordManager, "Instance", {
- get: function () {
- if (RecordManager.instance) {
- return RecordManager.instance;
- }
- else {
- var curmanager = new RecordManager();
- curmanager.OnNew();
- return curmanager;
- }
- },
- enumerable: true,
- configurable: true
- });
- RecordManager.prototype.RecordStart = function () {
- if (!Laya.Browser.onMobile)
- return;
- console.log("RecordStart");
- this.record.start({
- duration: 60,
- });
- };
- RecordManager.prototype.RecordStop = function () {
- if (!Laya.Browser.onMobile)
- return;
- console.log("RecordStop");
- this.record.stop();
- };
- RecordManager.prototype.ShareVideo = function (_cb) {
- if (!Laya.Browser.onMobile)
- return;
- Laya.Browser.window.tt.shareAppMessage({
- channel: "video",
- query: "",
- templateId: "266q4fgb8al7i3e7ie",
- title: "赢得了我,认你做大哥又如何",
- desc: "赢得了我,认你做大哥又如何",
- extra: {
- videoPath: this.completepath,
- videoTopics: ["赢得了我,认你做大哥又如何"]
- },
- success: function () {
- _cb && _cb(true);
- console.log("分享视频成功");
- },
- fail: function (e) {
- _cb && _cb(false);
- console.log("分享视频失败");
- }
- });
- };
- RecordManager.prototype.OnNew = function () {
- var _this = this;
- if (!Laya.Browser.onMobile)
- return;
- this.record = Laya.Browser.window.tt.getGameRecorderManager();
- this.record.onStart(function (res) {
- // 录屏开始
- console.log(res);
- });
- this.record.onStop(function (res) {
- _this.completepath = res.videoPath;
- console.log(res.videoPath);
- });
- };
- return RecordManager;
- }());
- exports.RecordManager = RecordManager;
- },{}],77:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var systemtype;
- (function (systemtype) {
- systemtype[systemtype["ios"] = 0] = "ios";
- systemtype[systemtype["android"] = 1] = "android";
- systemtype[systemtype["other"] = 2] = "other";
- })(systemtype = exports.systemtype || (exports.systemtype = {}));
- var WxApi = /** @class */ (function () {
- function WxApi() {
- }
- WxApi.recordAldEvent = function (key, value) {
- if (value === void 0) { value = ""; }
- // if(Laya.Browser.window && Laya.Browser.window.wx)
- // {
- // Laya.Browser.window.wx.aldSendEvent(key,{key:value});
- // }
- console.log("事件: ", key);
- };
- WxApi.WXLogin = function (cb) {
- var that = this;
- Laya.Browser.window.wx.login({
- success: function (res) {
- if (res.code) {
- console.log("code:", res.code);
- cb(res);
- }
- else {
- console.log('获取用户登录态失败!' + res.errMsg);
- }
- },
- fail: function (res) { console.log("wx.login: failed, res=" + res); }
- });
- };
- WxApi.WxInit = function () {
- var _this = this;
- if (!Laya.Browser.onWeiXin)
- return;
- Laya.Browser.window.wx.showShareMenu({
- withShareTicket: true
- });
- Laya.Browser.window.wx.onShow(function (option) {
- console.log(option);
- _this.shareOpenId = option.query.userId;
- _this.querychannel = option.query.channel;
- if (option.referrerInfo) {
- _this.referrerInfoappId = option.referrerInfo.appId;
- console.log("onShow appId is:", option.referrerInfo.appId);
- }
- _this.sceneValue = option.scene;
- var scene = Laya.LocalStorage.getItem("scene");
- if (scene) {
- _this.sceneValue = scene;
- console.log("读取配置场景值:" + scene);
- }
- else {
- console.log("第一次拉取场景值:" + _this.sceneValue);
- Laya.LocalStorage.setItem("scene", _this.sceneValue);
- }
- });
- };
- WxApi.ShowLoading = function (title) {
- if (title === void 0) { title = "加载中..."; }
- // if (this.isShowing) return;
- // this.isShowing = true;
- // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.showLoading({ title: title, mask: true });
- };
- WxApi.HideLoading = function () {
- // this.isShowing = false;
- // (Laya.Browser.onMiniGame) && Laya.Browser.window.wx.hideLoading();
- };
- WxApi.aldSendOpenid = function (_openid) {
- // if(Laya.Browser.onMiniGame)
- // {
- // console.log("aldSendOpenid",_openid);
- // Laya.Browser.window.wx.aldSendOpenid(_openid);
- // }
- };
- //检测更新
- WxApi.CheckWXUpdate = function () {
- var updateManager = Laya.Browser.window.tt.getUpdateManager();
- updateManager.onCheckForUpdate(function (res) {
- console.log("最新版本:" + res.hasUpdate);
- });
- updateManager.onUpdateReady(function () {
- Laya.Browser.window.tt.showModal({
- showCancel: false,
- title: '更新提示',
- content: '新版本已经准备好,是否重启应用?',
- success: function (res) {
- updateManager.applyUpdate();
- },
- fail: function (res) {
- updateManager.applyUpdate();
- }
- });
- });
- };
- WxApi.levelStart = function (stageId, stageName, userId) {
- // console.log("开始记录关卡:" + stageId);
- // if (Laya.Browser.window && Laya.Browser.window.wx) {
- // Laya.Browser.window.wx.aldStage.onStart(
- // {
- // stageId: stageId, //关卡ID 该字段必传
- // stageName: stageName, //关卡名称 该字段必传
- // userId: userId //用户ID 可选
- // }
- // );
- // if(WxApi.newaccount)
- // {
- // Laya.Browser.window.wx.aldStage.onStart(
- // {
- // stageId: "新用户:" + stageId, //关卡ID 该字段必传
- // stageName: stageName, //关卡名称 该字段必传
- // userId: userId //用户ID 可选
- // }
- // );
- // }
- // }
- };
- WxApi.levelRunning = function (stageId, stageName, userId, userevive) {
- console.log("记录关卡中:" + stageId);
- // if(Laya.Browser.window && Laya.Browser.window.wx)
- // {
- // Laya.Browser.window.wx.aldStage.onRunning({
- // stageId : stageId, //关卡ID 该字段必传
- // stageName : stageName, //关卡名称 该字段必传
- // userId : userId, //用户ID 可选
- // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
- // params : {
- // itemName : "使用复活",//使用道具名称 该字段必传
- // itemCount : 1, //使用道具数量 可选
- // desc : userevive //使用道具描述
- // }
- // });
- // if(WxApi.newaccount)
- // {
- // Laya.Browser.window.wx.aldStage.onRunning({
- // stageId :"新用户:" + stageId, //关卡ID 该字段必传
- // stageName : stageName, //关卡名称 该字段必传
- // userId : userId, //用户ID 可选
- // event : "revive", //使用道具 关卡进行中,用户触发的操作 该字段必传
- // params : {
- // itemName : "使用复活",//使用道具名称 该字段必传
- // itemCount : 1, //使用道具数量 可选
- // desc : userevive //使用道具描述
- // }
- // })
- // }
- // }
- };
- WxApi.levelSuccess = function (stageId, stageName, userId) {
- console.log("记录关卡:完成" + stageId);
- // if (Laya.Browser.window && Laya.Browser.window.wx) {
- // Laya.Browser.window.wx.aldStage.onEnd(
- // {
- // stageId: stageId, //关卡ID 该字段必传
- // stageName: stageName, //关卡名称 该字段必传
- // userId: userId, //用户ID 可选
- // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
- // params:
- // {
- // desc: "关卡完成" //描述
- // }
- // }
- // );
- // if(WxApi.newaccount)
- // {
- // Laya.Browser.window.wx.aldStage.onEnd(
- // {
- // stageId:"新用户:" + stageId, //关卡ID 该字段必传
- // stageName: stageName, //关卡名称 该字段必传
- // userId: userId, //用户ID 可选
- // event: "complete", //关卡完成 关卡进行中,用户触发的操作 该字段必传
- // params:
- // {
- // desc: "关卡完成" //描述
- // }
- // }
- // );
- // }
- // }
- };
- WxApi.levelFail = function (stageId, stageName, userId, score, carname) {
- console.log("记录关卡:失败" + stageId);
- // if (Laya.Browser.window && Laya.Browser.window.wx) {
- // Laya.Browser.window.wx.aldStage.onEnd(
- // {
- // stageId: stageId, //关卡ID 该字段必传
- // stageName: stageName, //关卡名称 该字段必传
- // userId: userId, //用户ID 可选
- // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
- // params:
- // {
- // desc: "失败",
- // score: score,//描述
- // car: carname//描述
- // }
- // }
- // );
- // if(WxApi.newaccount)
- // {
- // Laya.Browser.window.wx.aldStage.onEnd(
- // {
- // stageId:"新用户:" + stageId, //关卡ID 该字段必传
- // stageName: stageName, //关卡名称 该字段必传
- // userId: userId, //用户ID 可选
- // event: "fail", //关卡完成 关卡进行中,用户触发的操作 该字段必传
- // params:
- // {
- // desc: "失败",
- // score: score,//描述
- // car: carname//描述
- // }
- // }
- // );
- // }
- // }
- };
- WxApi.OnShow = function (cb) {
- if (!Laya.Browser.window.tt)
- return;
- Laya.Browser.window.tt.onShow(cb);
- };
- WxApi.OffShow = function (cb) {
- if (!Laya.Browser.onWeiXin)
- return;
- Laya.Browser.window.tt.offShow(cb);
- };
- WxApi.shake = function () {
- Laya.Browser.window.tt.vibrateShort({});
- };
- WxApi.shakeLong = function () {
- Laya.Browser.window.tt.vibrateLong({});
- };
- WxApi.Shake = function (_short) {
- if (_short === void 0) { _short = true; }
- if (Laya.Browser.window.tt && WxApi.CanShake) {
- if (_short) {
- this.shake();
- }
- else {
- this.shakeLong();
- }
- }
- if (!_short) {
- this.stageShake();
- }
- };
- WxApi.stageShake = function (callBack, speed) {
- if (callBack === void 0) { callBack = null; }
- if (speed === void 0) { speed = 32; }
- if (this.isShake || !this.canshakestage)
- return;
- this.isShake = true;
- var point = new Laya.Vector2(Laya.stage.x, Laya.stage.y);
- Laya.stage.timerLoop(speed, this, this.shakeObject, [point, callBack]);
- };
- WxApi.shakeObject = function (_point, _callBack) {
- var count = (this.num++) % 4;
- this.offsetArr[this.num % 2] = count < 2 ? 0 : this.offset;
- Laya.stage.x = this.offsetArr[0] + _point.x;
- Laya.stage.y = this.offsetArr[1] + _point.y;
- if (this.num > (this.times * 4 + 1)) {
- Laya.stage.clearTimer(this, this.shakeObject);
- Laya.stage.pos(0, 0);
- this.num = 0;
- this.isShake = false;
- if (_callBack != null) {
- _callBack();
- }
- }
- };
- WxApi.ShowTxt = function (text) {
- if (Laya.Browser.window.tt) {
- Laya.Browser.window.tt.showToast({ title: text });
- }
- else {
- console.log(text);
- }
- };
- Object.defineProperty(WxApi, "SystemFrom", {
- get: function () {
- if (!Laya.Browser.onWeiXin)
- return systemtype.other;
- var info = Laya.Browser.window.wx.getSystemInfoSync();
- var system = info.system;
- var IOS = system.indexOf("iOS") != -1;
- var Android = system.indexOf("Android") != -1;
- if (IOS) {
- return systemtype.ios;
- }
- else if (Android) {
- return systemtype.android;
- }
- else {
- return systemtype.other;
- }
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(WxApi, "IsLongScreenSystem", {
- get: function () {
- if (!Laya.Browser.onWeiXin)
- return false;
- var systemInfo = Laya.Browser.window.wx.getSystemInfoSync();
- var platformModel = "ipx";
- if (systemInfo != null) {
- var model = systemInfo.model;
- platformModel = systemInfo.brand + "_" + model + "_" + systemInfo.system + "_wx" + systemInfo.version + "_SDKVer" + systemInfo.SDKVersion;
- console.log("platformModel:" + platformModel);
- return !(model.indexOf("X") < 0) ||
- ((model.indexOf("oppo") >= 0 || model.indexOf("OPPO") >= 0) && (model.indexOf("R15") >= 0 || model.indexOf("r15") >= 0)) ||
- systemInfo.statusBarHeight > 20 ||
- (model.indexOf("Note") >= 0 && (model.indexOf("7") >= 0 || model.indexOf("8") >= 0)) ||
- ((model.indexOf("iPhone") >= 0) && (model.indexOf("11") >= 0));
- }
- },
- enumerable: true,
- configurable: true
- });
- WxApi.writeStage = function (stage) {
- var kvDataList = new Array();
- var date = new Date().getTime();
- var myValue = JSON.stringify({
- "wxgame": {
- "stage": stage,
- "update_time": date.toString(),
- }
- });
- kvDataList.push({ key: "stage", value: myValue });
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.setUserCloudStorage({
- KVDataList: kvDataList,
- success: function (r) {
- console.log("上传分数成功");
- }
- });
- }
- };
- WxApi.cpVersionGreaterOrEqual = function (v1, v2) {
- console.log("[LOG]\u57FA\u7840\u5E93\u7248\u672C\u53F7 curVer:" + v1 + " targVer:" + v2);
- var v1Arr = v1.split(".");
- var v2Arr = v2.split(".");
- var len = v1Arr.length;
- if (v2Arr.length < len) {
- len = v2Arr.length;
- }
- for (var i = 0; i < len; i++) {
- var ver1 = Number(v1Arr[i]);
- var ver2 = Number(v2Arr[i]);
- if (ver1 > ver2) {
- return true;
- }
- else if (ver1 < ver2) {
- return false;
- }
- }
- return v1Arr.length >= v2Arr.length;
- };
- WxApi.newaccount = false;
- WxApi.sceneValue = "";
- WxApi.shareOpenId = "";
- WxApi.querychannel = "";
- WxApi.referrerInfoappId = "";
- //显示加载信息
- WxApi.isShowing = false;
- WxApi.CanShake = true;
- WxApi.times = 1.3;
- WxApi.num = 0;
- WxApi.offsetArr = [0, 0];
- WxApi.offset = 14;
- WxApi.canshakestage = false;
- return WxApi;
- }());
- exports.WxApi = WxApi;
- },{}],78:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var SocketNofify_1 = require("../WXSDK/SocketNofify");
- var ServerSocket = /** @class */ (function () {
- /**
- * socket连接中
- */
- function ServerSocket() {
- /**
- * 1:自动断线,2:主动断线
- */
- this._offlinestate = 0;
- /**
- * 断线重连次数
- */
- this._connetNums = 0;
- this._socketconneting = false;
- ServerSocket.ins = this;
- }
- Object.defineProperty(ServerSocket, "Instance", {
- get: function () {
- if (ServerSocket.ins == null) {
- return new ServerSocket();
- }
- return ServerSocket.ins;
- },
- enumerable: true,
- configurable: true
- });
- //连接服务器
- ServerSocket.prototype.connectServer = function (gameHost) {
- this._socketconneting = true;
- this.removeSocket();
- if (!this.sock || !this.sock.connected) {
- this.openwaitpanel();
- if (!this.sock) {
- this.sock = new Laya.Socket();
- this.sock.on(Laya.Event.OPEN, this, this.onSocketOpen);
- this.sock.on(Laya.Event.MESSAGE, this, this.onReceiveMessage);
- this.sock.on(Laya.Event.CLOSE, this, this.onSocketClose);
- this.sock.on(Laya.Event.ERROR, this, this.ioErro);
- }
- this.sock.connectByUrl(gameHost);
- }
- };
- ServerSocket.prototype.isConnect = function () {
- if (this.sock && this.sock.connected) {
- return true;
- }
- return false;
- };
- ServerSocket.prototype.ioErro = function (e) {
- if (e === void 0) { e = null; }
- this._socketconneting = false;
- this._connetNums++;
- this.closewaitpanel();
- this.removeSocket();
- this._offlinestate = 1;
- };
- ServerSocket.prototype.removeSocket = function () {
- this._socketconneting = false;
- if (this.sock) {
- this.sock.off(Laya.Event.OPEN, this, this.onSocketOpen);
- this.sock.off(Laya.Event.MESSAGE, this, this.onReceiveMessage);
- this.sock.off(Laya.Event.CLOSE, this, this.onSocketClose);
- this.sock.off(Laya.Event.ERROR, this, this.ioErro);
- this.sock.cleanSocket();
- this.sock.close();
- this.sock = null;
- }
- };
- /**
- * 手动关闭游戏socket
- */
- ServerSocket.prototype.colseSocket = function (offlinestate) {
- if (offlinestate === void 0) { offlinestate = 1; }
- if (this.isConnect()) {
- this.closewaitpanel();
- this.removeSocket();
- if (offlinestate != -1) {
- this._offlinestate = offlinestate;
- }
- DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
- }
- };
- ServerSocket.prototype.onSocketClose = function (e) {
- if (e === void 0) { e = null; }
- this._socketconneting = false;
- this.closewaitpanel();
- this._offlinestate = 1;
- DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CLOSE);
- };
- ServerSocket.prototype.closewaitpanel = function () {
- fairygui.GRoot.inst.closeModalWait();
- };
- ServerSocket.prototype.openwaitpanel = function () {
- fairygui.GRoot.inst.showModalWait();
- };
- //连接成功返回
- ServerSocket.prototype.onSocketOpen = function (event) {
- if (event === void 0) { event = null; }
- this._connetNums = 0;
- this.closewaitpanel();
- this._offlinestate = 0;
- DispatcherManager_1.DispatcherManager.dispatchEvent(SocketNofify_1.SocketNofify.SOCKET_CONNECT_SUCCEED, null, false);
- };
- //向服务端发送消息
- ServerSocket.prototype.sendMessage = function (act, data, isShowWait) {
- if (isShowWait === void 0) { isShowWait = true; }
- if (this.sock && this.sock.connected) {
- if (isShowWait) {
- this.openwaitpanel();
- }
- if (!data) {
- data = {};
- }
- data.ACTION = act;
- this.sock.send(JSON.stringify(data));
- }
- else {
- }
- };
- //消息返回后,会广播出去
- //Global.addEventListener("你发送的cmd名称",监听方法,this)
- ServerSocket.prototype.onReceiveMessage = function (msg) {
- if (msg === void 0) { msg = null; }
- var socketdata = JSON.parse(msg);
- };
- return ServerSocket;
- }());
- exports.ServerSocket = ServerSocket;
- },{"../WXSDK/SocketNofify":79,"../utils/DispatcherManager":85}],79:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var SocketNofify = /** @class */ (function () {
- function SocketNofify() {
- }
- /**
- * socket连接成功
- */
- SocketNofify.SOCKET_CONNECT_SUCCEED = "SOCKET_CONNECT_SUCCEED";
- /**
- * socket关闭
- */
- SocketNofify.SOCKET_CLOSE = "SOCKET_CLOSE";
- /**
- * 游戏重新连接
- */
- SocketNofify.Game_againConnetSocket = "Game_againConnetSocket";
- return SocketNofify;
- }());
- exports.SocketNofify = SocketNofify;
- },{}],80:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var WECHATEVENT = /** @class */ (function () {
- function WECHATEVENT() {
- }
- /**
- * 游戏进入后台事件
- */
- WECHATEVENT.WECHATEVENT_onhide = "WECHATEVENT_onhide";
- WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd = "WECHATEVENT_onAudioInterruptionEnd";
- WECHATEVENT.WECHATEVENT_losefocus = "WECHATEVENT_losefocus";
- WECHATEVENT.WECHATEVENT_getfocus = "WECHATEVENT_getfocus";
- WECHATEVENT.WECHATEVENT_updateVideoNums = "WECHATEVENT_updateVideoNums";
- /**
- * 用户打点
- */
- WECHATEVENT.message_9891002 = "9891002";
- /**
- * 获取后台数据
- */
- WECHATEVENT.message_9891101 = "9891101";
- WECHATEVENT.WECHATEVENT_loginSucceed = "WECHATEVENT_loginSucceed";
- /**
- * 游戏从后台恢复显示事件
- */
- WECHATEVENT.WECHATEVENT_onshow = "WECHATEVENT_onshow";
- /**
- * 从收藏或者浮窗进入游戏
- */
- WECHATEVENT.WECHATEVENT_fromscorfk = "WECHATEVENT_fromscorfk";
- /**
- * 登录
- */
- WECHATEVENT.message_9891001 = "9891001";
- /**
- * 广告点击
- */
- WECHATEVENT.message_9891102 = "9891102";
- /**
- * 点击确定跳转到外部游戏
- */
- WECHATEVENT.message_9891103 = "9891103";
- return WECHATEVENT;
- }());
- exports.WECHATEVENT = WECHATEVENT;
- },{}],81:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var GameUtils_1 = require("../utils/GameUtils");
- var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
- var Global_1 = require("../Global");
- var DateControl_1 = require("../Control/DateControl");
- var LocalDataControl_1 = require("../Control/LocalDataControl");
- var UserDataInfo_1 = require("../Data/UserDataInfo");
- var GlobalTip_1 = require("../utils/GlobalTip");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var AudioControl_1 = require("../Control/AudioControl");
- /*
- * name;
- */
- var WXGamePlatform = /** @class */ (function () {
- function WXGamePlatform() {
- this.isShareing = false;
- this.bannerRunTime = 0;
- this._bannerTypeList = [];
- this._screenwidth = 0;
- this.bannerheight = 0;
- this.bannerwidth = 0;
- this.isonResize = false;
- /**
- * 排行榜打开类型存储
- */
- this._openrankDict = {};
- WXGamePlatform.ins = this;
- }
- Object.defineProperty(WXGamePlatform, "Instance", {
- get: function () {
- if (WXGamePlatform.ins == null) {
- return new WXGamePlatform();
- }
- return WXGamePlatform.ins;
- },
- enumerable: true,
- configurable: true
- });
- WXGamePlatform.prototype.init = function () {
- this.showShareMenu({ withShareTicket: true });
- this.onAudioInterruptionBegin();
- this.onAudioInterruptionEnd();
- };
- WXGamePlatform.prototype.initShareDian = function (data) {
- if (data && data.length > 0) {
- var itemd;
- for (var s in data) {
- itemd = data[s];
- WXGamePlatform.ShareDict[itemd.key] = itemd;
- }
- var firstd = data[0];
- this.onShareAppMessage(firstd.tile, Global_1.Global.cdnurl + firstd.img);
- }
- };
- WXGamePlatform.prototype.initData = function () {
- if (DateControl_1.DateControl.Fresh) {
- WXGamePlatform.dayShareNum = 0;
- WXGamePlatform.dayVideoNum = 0;
- this.updateDayShareInfo();
- this.updateDayVideoInfo();
- }
- else {
- WXGamePlatform.dayShareNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayShare);
- WXGamePlatform.dayVideoNum = LocalDataControl_1.LocalDataControl.Instance.getnum(UserDataInfo_1.UserDataInfo.nowdayVideo);
- }
- };
- /**
- * 存储当天分享的信息
- */
- WXGamePlatform.prototype.updateDayShareInfo = function () {
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayShare, WXGamePlatform.dayShareNum.toString());
- };
- WXGamePlatform.prototype.updateDayVideoInfo = function () {
- LocalDataControl_1.LocalDataControl.Instance.addstr(UserDataInfo_1.UserDataInfo.nowdayVideo, WXGamePlatform.dayVideoNum.toString());
- };
- WXGamePlatform.prototype.createUserAndLogin = function (callobj, succeedcallback, progressCallback, failcallback) {
- if (progressCallback === void 0) { progressCallback = null; }
- if (failcallback === void 0) { failcallback = null; }
- WXGamePlatform.loginCallobj = callobj;
- WXGamePlatform.loginsucceedcallback = succeedcallback;
- WXGamePlatform.loginprogressCallback = progressCallback;
- var wx = Laya.Browser.window.wx;
- if (wx) {
- var login_info = WXGamePlatform.Instance.getLaunchOptionsSync();
- if (login_info) {
- var query = login_info.query;
- if (query && query.ChanID) {
- WXGamePlatform.QuDaoID = query.ChanID;
- }
- var referrerInfo = login_info.referrerInfo;
- if (WXGamePlatform.QuDaoID == "" && referrerInfo && referrerInfo.appId) {
- WXGamePlatform.QuDaoID = referrerInfo.appId;
- }
- if (login_info.scene) {
- WXGamePlatform.fromscene = Number(login_info.scene);
- }
- }
- var systemres = wx.getSystemInfoSync();
- var version = systemres.SDKVersion;
- if (wx.getUpdateManager) {
- var updateManager = wx.getUpdateManager();
- updateManager.onCheckForUpdate(function (res) {
- // 请求完新版本信息的回调
- if (res.hasUpdate == true) {
- updateManager.onUpdateReady(function () {
- Laya.Browser.window.wx.showModal({
- title: '更新提示',
- content: '新版本已经准备好,是否重启应用?',
- success: function (res) {
- if (res.confirm) {
- // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
- updateManager.applyUpdate();
- }
- else {
- WXGamePlatform.Instance.exitGame();
- }
- }
- });
- });
- updateManager.onUpdateFailed(function () {
- // 新版本下载失败
- WXGamePlatform.Instance.exitGame();
- });
- }
- else {
- // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
- // {
- // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
- // }
- var wxplatform = WXGamePlatform.Instance;
- wxplatform.login(callobj, succeedcallback, failcallback);
- }
- });
- }
- else {
- // if( WXGamePlatform.loginCallobj && WXGamePlatform.loginprogressCallback )
- // {
- // WXGamePlatform.loginprogressCallback.call( WXGamePlatform.loginCallobj,10 );
- // }
- var wxplatform = WXGamePlatform.Instance;
- wxplatform.login(callobj, succeedcallback, failcallback);
- }
- }
- };
- WXGamePlatform.prototype.createUserInfoButton = function (callobj, callback, failcallback) {
- this.userinfocallobj = callobj;
- this.userinfosuccallback = callback;
- this.userinfofailcallback = failcallback;
- var wx = Laya.Browser.window.wx;
- var res = wx.getSystemInfoSync();
- if (res) {
- var posx = (res.windowWidth - 151) / 2;
- var posy = res.windowHeight - 172 - 40;
- WXGamePlatform.Instance.userinfobutton = wx.createUserInfoButton({
- type: 'image',
- image: 'wxlocal/login.png',
- style: {
- left: posx,
- top: posy,
- width: 151,
- height: 72
- }
- });
- WXGamePlatform.Instance.userinfobutton.onTap(WXGamePlatform.Instance.userinfoButtonClick);
- }
- };
- /**
- * 判断是否已经授权
- */
- WXGamePlatform.prototype.getaccredit = function (callobj, accreditCallback) {
- if (WXGamePlatform.accreditstate == 0) {
- var wx = Laya.Browser.window.wx;
- if (wx) {
- wx.getSetting({
- success: function (res) {
- var itemd = res.authSetting;
- if (itemd.hasOwnProperty("scope.userInfo") && itemd["scope.userInfo"] == true) //已经授权过
- {
- if (accreditCallback && callobj) {
- accreditCallback.call(callobj, true);
- }
- }
- else {
- if (accreditCallback && callobj) {
- accreditCallback.call(callobj, false);
- }
- }
- }
- });
- }
- else {
- if (accreditCallback && callobj) {
- accreditCallback.call(callobj, true);
- }
- }
- }
- else {
- if (accreditCallback && callobj) {
- accreditCallback.call(callobj, true);
- }
- }
- };
- WXGamePlatform.prototype.userinfoButtonClick = function (res) {
- var wxplatform = WXGamePlatform.Instance;
- if (res) {
- var errMsg = res.errMsg;
- if (errMsg == "getUserInfo:ok") {
- WXGamePlatform.accreditstate = 1;
- wxplatform.closeuserinfobUtton();
- wxplatform.getUserInfo(false, wxplatform.userinfocallobj, wxplatform.userinfosuccallback, wxplatform.userinfofailcallback);
- }
- else {
- if (wxplatform.userinfocallobj && wxplatform.userinfofailcallback) {
- wxplatform.userinfofailcallback.call(wxplatform.userinfocallobj);
- }
- }
- }
- };
- WXGamePlatform.prototype.closeuserinfobUtton = function () {
- var wxplatform = WXGamePlatform.Instance;
- if (wxplatform.userinfobutton) {
- wxplatform.userinfobutton.offTap(wxplatform.userinfoButtonClick);
- wxplatform.userinfobutton.destroy();
- wxplatform.userinfobutton = null;
- }
- };
- WXGamePlatform.prototype.getUserInfo = function (islogin, callobj, callback, failcallback) {
- fairygui.GRoot.inst.showModalWait();
- var wxplatform = WXGamePlatform.Instance;
- var wx = Laya.Browser.window.wx;
- if (wx) {
- wx.getUserInfo({
- success: function (res) {
- var userInfo = res.userInfo;
- WXGamePlatform.nickName = userInfo.nickName;
- if (islogin) {
- wxplatform.login(callobj, callback, failcallback);
- }
- else {
- if (callobj && callback) {
- callback.call(callobj, WXGamePlatform.nickName);
- }
- }
- }
- });
- }
- };
- /**
- * 登录
- * @param callobj
- * @param succeedcallback
- * @param failCallback
- */
- WXGamePlatform.prototype.login = function (callobj, callback, failcallback) {
- var wxplatform = WXGamePlatform.Instance;
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.login({
- success: function (res) {
- WXGamePlatform.code = res.code;
- var itemd = {};
- if (WXGamePlatform.QuDaoID != "") {
- itemd.ChanID = WXGamePlatform.QuDaoID;
- }
- itemd.Code = WXGamePlatform.code;
- itemd.AppID = Global_1.Global.appid;
- itemd.Version = Global_1.Global.gameVersion;
- },
- fail: function (res) {
- wxplatform.login(callobj, callback, failcallback);
- }
- });
- }
- };
- WXGamePlatform.prototype.loginSucceedCallback = function (data) {
- if (WXGamePlatform.loginCallobj && WXGamePlatform.loginsucceedcallback) {
- WXGamePlatform.loginsucceedcallback.call(WXGamePlatform.loginCallobj, data);
- }
- };
- WXGamePlatform.prototype.loadSubpackage = function (name, subcallobj, subcallback, updatecallback, subfailcallback) {
- if (Laya.Browser.window.wx) {
- this._subcallobj = subcallobj;
- this._subcallback = subcallback;
- this._updatecallback = updatecallback;
- this._subfailcallback = subfailcallback;
- var wx = Laya.Browser.window.wx;
- if (wx.loadSubpackage) {
- var loadTask = wx.loadSubpackage({
- name: name,
- success: function (res) {
- // 分包加载成功后通过 success 回调
- var wxgamePlatform = WXGamePlatform.Instance;
- if (wxgamePlatform._subcallback && wxgamePlatform._subcallobj) {
- wxgamePlatform._subcallback.call(wxgamePlatform._subcallobj);
- }
- },
- fail: function (res) {
- // 分包加载失败通过 fail 回调
- var wxgamePlatform = WXGamePlatform.Instance;
- if (wxgamePlatform._subfailcallback && wxgamePlatform._subcallobj) {
- wxgamePlatform._subfailcallback.call(wxgamePlatform._subcallobj);
- }
- }
- });
- if (loadTask.onProgressUpdate) {
- loadTask.onProgressUpdate(function (res) {
- var wxgamePlatform = WXGamePlatform.Instance;
- if (wxgamePlatform._updatecallback && wxgamePlatform._subcallobj) {
- wxgamePlatform._updatecallback.call(wxgamePlatform._subcallobj, res.progress);
- }
- });
- }
- }
- else {
- if (subcallobj && subcallback) {
- subcallback.call(subcallobj);
- }
- }
- }
- else {
- if (subcallobj && subcallback) {
- subcallback.call(subcallobj);
- }
- }
- };
- /**
- * 获取转发详细信息
- * @param obj
- * @param callobj
- * @param succeedcallback
- * @param failCallback
- */
- WXGamePlatform.prototype.getShareInfo = function (obj, callobj, succeedcallback, failCallback) {
- if (failCallback === void 0) { failCallback = null; }
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.getShareInfo({
- shareTicket: obj.shareTicket,
- success: function (res) {
- succeedcallback.call(callobj, res);
- }
- });
- }
- };
- /**
- * 监听用户点击右上角菜单的“转发”按钮时触发的事件
- * @param title
- * @param imageUrl
- */
- WXGamePlatform.prototype.onShareAppMessage = function (title, imageUrl) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.onShareAppMessage(function () {
- return {
- title: title,
- imageUrl: imageUrl
- };
- });
- }
- };
- /**
- * 主动拉起转发,进入选择通讯录界面。
- * @param title
- * @param imageUrl
- */
- WXGamePlatform.prototype.shareAppMessage = function (d) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.shareAppMessage(d);
- }
- };
- /**
- * 显示当前页面的转发按钮
- * @param obj
- */
- WXGamePlatform.prototype.showShareMenu = function (obj) {
- if (obj === void 0) { obj = null; }
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.showShareMenu(obj);
- }
- };
- /**
- * 更新转发属性
- * @param obj
- */
- WXGamePlatform.prototype.updateShareMenu = function (obj) {
- if (obj === void 0) { obj = null; }
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.updateShareMenu(obj);
- }
- };
- /**
- * 显示当前页面的转发按钮
- */
- WXGamePlatform.prototype.showMenu = function () {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.showShareMenu();
- }
- };
- /**
- * 本地存储
- * @param key
- * @param data
- */
- WXGamePlatform.prototype.setStorageSync = function (key, data) {
- var wx = Laya.Browser.window.wx;
- if (wx) {
- wx.setStorageSync(key, data);
- }
- };
- /**
- * 获取本地存储
- * @param key
- */
- WXGamePlatform.prototype.getStorageSync = function (key) {
- var wx = Laya.Browser.window.wx;
- if (wx) {
- return wx.getStorageSync(key);
- }
- return null;
- };
- WXGamePlatform.prototype.setUserCloudStorage = function (obj, callobj, succeedcallback, failCallback) {
- if (callobj === void 0) { callobj = null; }
- if (succeedcallback === void 0) { succeedcallback = null; }
- if (failCallback === void 0) { failCallback = null; }
- var wx = Laya.Browser.window.wx;
- if (wx && wx.setUserCloudStorage) {
- wx.setUserCloudStorage({
- KVDataList: obj,
- success: function (res) {
- if (succeedcallback) {
- succeedcallback.call(callobj, res);
- }
- },
- fail: function (res) {
- if (failCallback) {
- failCallback.call(callobj);
- }
- }
- });
- }
- };
- /**
- * 显示消息提示框
- * @param word
- */
- WXGamePlatform.prototype.toast = function (word) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.showToast({ title: word });
- }
- };
- /**
- * 向开放数据域发送消息
- * @param obj
- */
- WXGamePlatform.prototype.postMessage = function (str, data) {
- if (data === void 0) { data = null; }
- var wx = Laya.Browser.window.wx;
- if (wx) {
- var context = wx.getOpenDataContext();
- context.postMessage({ action: str, data: data });
- }
- };
- /**
- * 创建一个 InnerAudioContext 实例
- */
- WXGamePlatform.prototype.createInnerAudioContext = function () {
- if (Laya.Browser.window.wx) {
- return Laya.Browser.window.wx.createInnerAudioContext();
- }
- return null;
- };
- /**
- * 获取系统信息
- */
- WXGamePlatform.prototype.getSystemInfoSync = function () {
- if (Laya.Browser.window.wx) {
- return Laya.Browser.window.wx.getSystemInfoSync();
- }
- return null;
- };
- /**
- * 预览图片,调用之后会在新打开的页面中全屏预览传入的图片,预览的过程中用户可以进行保存图片、发送给朋友等操作
- * @param obj
- */
- WXGamePlatform.prototype.previewImage = function (obj) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.previewImage(obj);
- }
- };
- /**
- * 监听小游戏隐藏到后台事件。锁屏、按 HOME 键退到桌面、显示在聊天顶部等操作会触发此事件。
- * @param callobj
- * @param succeedcallback
- */
- WXGamePlatform.prototype.onHide = function (callobj, succeedcallback) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.onHide(function (res) {
- WXGamePlatform.isShowing = false;
- if (succeedcallback && callobj) {
- succeedcallback.call(callobj, res);
- }
- });
- }
- };
- /**
- * 返回小程序启动参数
- * @param callobj
- * @param succeedcallback
- */
- WXGamePlatform.prototype.getLaunchOptionsSync = function () {
- if (Laya.Browser.window.wx) {
- return Laya.Browser.window.wx.getLaunchOptionsSync();
- }
- return null;
- };
- /**
- * 隐藏消息提示框
- * @param obj
- */
- WXGamePlatform.prototype.hideToast = function (obj) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.hideToast(obj);
- }
- };
- /**
- * 显示模态对话框
- * @param obj
- */
- WXGamePlatform.prototype.showModal = function (obj) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.showModal(obj);
- }
- };
- /**
- * 清理存储数据
- */
- WXGamePlatform.prototype.clearStorage = function () {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.clearStorageSync();
- }
- };
- /**
- * 使手机发生较短时间的振动(15 ms)
- * @param obj
- */
- WXGamePlatform.prototype.vibrateShort = function () {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.vibrateShort();
- }
- };
- /**
- * 从本地缓存中移除指定 key
- * @param key
- */
- WXGamePlatform.prototype.removeStorage = function (key) {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.removeStorage(key);
- }
- };
- WXGamePlatform.prototype.onAudioInterruptionBegin = function () {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.onAudioInterruptionBegin(function () {
- // SoundssManager.Instance.playbgSound("bgm");
- AudioControl_1.AudioControl.Instance.ClearAllSOUND();
- });
- }
- };
- WXGamePlatform.prototype.onAudioInterruptionEnd = function () {
- if (Laya.Browser.window.wx) {
- Laya.Browser.window.wx.onAudioInterruptionEnd(function () {
- var wxgameplatform = WXGamePlatform.Instance;
- Laya.timer.clear(wxgameplatform, wxgameplatform.onAudioEndCallback);
- Laya.timer.once(500, wxgameplatform, wxgameplatform.onAudioEndCallback);
- });
- }
- };
- WXGamePlatform.prototype.onAudioEndCallback = function () {
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
- };
- /**
- * 退出游戏
- */
- WXGamePlatform.prototype.exitGame = function () {
- var wx = Laya.Browser.window.wx;
- if (wx) {
- wx.exitMiniProgram();
- }
- };
- /**
- * 打开客服对话框
- */
- WXGamePlatform.prototype.openCustomerService = function () {
- var wx = Laya.Browser.window.wx;
- if (wx) {
- var version = wx.getSystemInfoSync().SDKVersion;
- if (GameUtils_1.GameUtils.compareVersion(version, '2.0.3') >= 0 && wx.openCustomerServiceConversation) {
- wx.openCustomerServiceConversation({
- showMessageCard: true,
- sendMessageImg: "https://resource.51yoyoyo.com/res/wxsendmessageimg/smi.jpg"
- });
- }
- else {
- // AlertUtils.showWordTips("当前微信版本不支持");
- }
- }
- };
- /**
- * 监听内存不足告警
- */
- WXGamePlatform.prototype.onMemoryWarning = function () {
- var wx = Laya.Browser.window.wx;
- if (wx && wx.onMemoryWarning) {
- wx.onMemoryWarning(function () {
- });
- }
- };
- WXGamePlatform.prototype.onError = function () {
- var wx = Laya.Browser.window.wx;
- if (wx && wx.onError) {
- wx.onError(function (res) {
- console.log("*****onError", res);
- });
- }
- };
- /**
- * 开始分享
- */
- WXGamePlatform.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
- if (callobj === void 0) { callobj = null; }
- if (succeedCallback === void 0) { succeedCallback = null; }
- if (failCallback === void 0) { failCallback = null; }
- WXGamePlatform.nowShareindex = 0;
- if (WXGamePlatform.ShareDict[key]) {
- this.shareApp(WXGamePlatform.ShareDict[key], callobj, succeedCallback, failCallback);
- }
- };
- WXGamePlatform.prototype.shareApp = function (info, callobj, success, failCallback) {
- this.nowshareObj = callobj;
- this.nowshareinfo = info;
- this.nowsharesucceedfun = success;
- this.nowsharefailfun = failCallback;
- this.startShareTime = Laya.Browser.now();
- this.isShareing = true;
- WXGamePlatform.callbackfailstate = 0;
- this.shareAppMessage({
- title: info.tile, imageUrl: Global_1.Global.cdnurl + info.img, query: "",
- success: function (res) {
- },
- fail: function (res) {
- GlobalTip_1.GlobalTip.Instance.showWordTips("您取消了分享");
- if (failCallback && callobj) {
- failCallback.call(callobj);
- }
- },
- cancel: function (res) {
- WXGamePlatform.callbackfailstate = 1;
- }
- });
- };
- /**
- * 监听小游戏回到前台的事件
- * @param callobj
- * @param succeedcallback
- * @param failCallback
- */
- WXGamePlatform.prototype.onShow = function (callobj, succeedcallback, failCallback) {
- if (callobj === void 0) { callobj = null; }
- if (succeedcallback === void 0) { succeedcallback = null; }
- if (failCallback === void 0) { failCallback = null; }
- this.showobj = callobj;
- this.showCallback = succeedcallback;
- var wx = Laya.Browser.window.wx;
- if (wx) {
- wx.onShow(function (res) {
- WXGamePlatform.isShowing = true;
- if (res && res.scene) {
- WXGamePlatform.fromscene = Number(res.scene);
- }
- Laya.timer.frameOnce(1, WXGamePlatform.Instance, WXGamePlatform.Instance.onShowSucceed);
- });
- }
- };
- WXGamePlatform.prototype.onShowSucceed = function () {
- var wxgameplatform = WXGamePlatform.Instance;
- if (wxgameplatform.showobj && wxgameplatform.showCallback) {
- wxgameplatform.showCallback.call(wxgameplatform.showobj);
- }
- if (wxgameplatform.isShareing) //如果是分享状态
- {
- wxgameplatform.isShareing = false;
- var isShareSucceed = false;
- if (WXGamePlatform.callbackfailstate == 0) {
- var nowTime = Laya.Browser.now();
- var disTime = (nowTime - wxgameplatform.startShareTime) / 1000;
- if (disTime >= WXGamePlatform.ShareTime || WXGamePlatform.nowShareindex >= 3) {
- isShareSucceed = true;
- }
- }
- WXGamePlatform.callbackfailstate = 0;
- if (isShareSucceed) {
- WXGamePlatform.dayShareNum++;
- wxgameplatform.updateDayShareInfo();
- if (wxgameplatform.nowshareObj && wxgameplatform.nowsharesucceedfun) {
- wxgameplatform.nowsharesucceedfun.call(wxgameplatform.nowshareObj);
- }
- }
- else {
- WXGamePlatform.nowShareindex++;
- wxgameplatform.showModal({
- title: "提示", content: "请每次分享到不同群,是否重新分享?", showCancel: true, cancelText: '取消', confirmText: '确定',
- success: function (res) {
- var wxplatform = WXGamePlatform.Instance;
- if (res.confirm) {
- WXGamePlatform.Instance.shareApp(wxplatform.nowshareinfo, wxplatform.nowshareObj, wxplatform.nowsharesucceedfun, wxplatform.nowsharefailfun);
- }
- else {
- if (wxplatform.nowsharefailfun && wxplatform.nowshareObj) {
- wxplatform.nowsharefailfun.call(wxplatform.nowshareObj);
- }
- }
- },
- fail: function () {
- },
- complete: function () {
- }
- });
- }
- }
- };
- /**
- * 看视频领奖励
- * @param callobj
- * @param succeedcallback
- */
- WXGamePlatform.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
- var _this = this;
- if (callobj === void 0) { callobj = null; }
- if (succeedcallback === void 0) { succeedcallback = null; }
- if (failCallback === void 0) { failCallback = null; }
- if (istongjiNum === void 0) { istongjiNum = true; }
- var wx = Laya.Browser.window.wx;
- if (wx && wx.createRewardedVideoAd) {
- if (!WXGamePlatform.videoplaying) {
- var time = this.lockVideoLeftTime();
- if (time > 0) {
- GlobalTip_1.GlobalTip.Instance.showWordTips("广告尚未准备好,请" + time + "秒后再试");
- return;
- }
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
- WXGamePlatform.istongjiVideoNum = istongjiNum;
- this.nowvideokey = key;
- WXGamePlatform.videoplaying = true;
- this.videocallobj = callobj;
- this.videosucceedCallback = succeedcallback;
- this.videofailCallback = failCallback;
- this.videoAd = wx.createRewardedVideoAd({
- adUnitId: 'adunit-0c687084c908ee89'
- });
- this.videoAd.onClose(this.closeAD);
- this.videoAd.onError(this.onerro);
- this.videoAd.load().then(function () { return _this.videoAd.show(); }).catch(function (err) { console.log(err.errMsg), WXGamePlatform.Instance.failVideo(); });
- }
- }
- };
- WXGamePlatform.prototype.lockVideoLeftTime = function () {
- var time = (Laya.Browser.now() - WXGamePlatform.lastVideoTime) / 1000;
- time = WXGamePlatform.VideoTime - time;
- return Math.ceil(time);
- };
- WXGamePlatform.prototype.onerro = function (res) {
- var wxgamePlatform = WXGamePlatform.Instance;
- WXGamePlatform.videoplaying = false;
- wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
- wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
- };
- // 关闭广告
- WXGamePlatform.prototype.closeAD = function (status) {
- WXGamePlatform.lastVideoTime = Laya.Browser.now();
- var wxgamePlatform = WXGamePlatform.Instance;
- if (status && status.isEnded || status == undefined) {
- if (WXGamePlatform.istongjiVideoNum) {
- WXGamePlatform.dayVideoNum++;
- wxgamePlatform.updateDayVideoInfo();
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_updateVideoNums);
- }
- if (wxgamePlatform.videocallobj && wxgamePlatform.videosucceedCallback) {
- wxgamePlatform.videosucceedCallback.call(wxgamePlatform.videocallobj);
- }
- }
- else {
- GlobalTip_1.GlobalTip.Instance.showWordTips("未观看完整视频,无法获得奖励");
- if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
- wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
- }
- }
- WXGamePlatform.videoplaying = false;
- wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
- wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
- };
- // 广告失败
- WXGamePlatform.prototype.failVideo = function () {
- WXGamePlatform.lastVideoTime = Laya.Browser.now();
- WXGamePlatform.videoplaying = false;
- GlobalTip_1.GlobalTip.Instance.showWordTips("广告加载失败,试试别的方式吧~");
- var wxgamePlatform = WXGamePlatform.Instance;
- wxgamePlatform.videoAd.offError(wxgamePlatform.onerro); //移除 不然被多次调用
- wxgamePlatform.videoAd.offClose(wxgamePlatform.closeAD); //移除 不然被多次调用
- if (wxgamePlatform.videocallobj && wxgamePlatform.videofailCallback) {
- wxgamePlatform.videofailCallback.call(wxgamePlatform.videocallobj);
- }
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
- };
- WXGamePlatform.prototype.isCanVideo = function () {
- if (WXGamePlatform.dayVideoNum < WXGamePlatform.VideoNum) {
- if (WXGamePlatform.dayVideoNum == 0) {
- return true;
- }
- var videobs = Math.floor(WXGamePlatform.dayVideoNum / WXGamePlatform.VideotoShare);
- var sharebs = Math.floor(WXGamePlatform.dayShareNum / WXGamePlatform.SharetoVideo);
- if (videobs > sharebs) {
- return false;
- }
- else if (videobs < sharebs) {
- return true;
- }
- else {
- var videoyushu = WXGamePlatform.dayVideoNum % WXGamePlatform.VideotoShare;
- if (videoyushu != 0) {
- return true;
- }
- var shareyushu = WXGamePlatform.dayShareNum % WXGamePlatform.SharetoVideo;
- if (shareyushu != 0) {
- return false;
- }
- return true;
- }
- }
- return false;
- };
- WXGamePlatform.prototype.createBanner = function (bannertype, style) {
- if (bannertype === void 0) { bannertype = ""; }
- if (Laya.Browser.window.wx) {
- if (bannertype != "") {
- var bo = false;
- for (var i = 0; i < this._bannerTypeList.length; i++) {
- if (bannertype == this._bannerTypeList[i].type) {
- this._bannerTypeList[i].style = style;
- var arr = this._bannerTypeList.splice(i, 1);
- this._bannerTypeList.push(arr[0]);
- bo = true;
- break;
- }
- }
- if (!bo) {
- this._bannerTypeList.push({ type: bannertype, style: style });
- }
- }
- else {
- if (this._bannerTypeList.length == 0) {
- return;
- }
- else {
- var item = this._bannerTypeList[this._bannerTypeList.length - 1];
- style = item.style;
- }
- }
- if (this.bannerAd) {
- var now = Laya.Browser.now();
- //超过3分钟刷新
- if (now - this.bannerRunTime > 60000 * 3) {
- this.bannerAd.offError(this.bannerError);
- this.bannerAd.offResize(this.bannerResize);
- this.bannerAd.destory();
- this.createNewBanner(style);
- }
- else {
- this.showBanner(style);
- }
- }
- else {
- this.createNewBanner(style);
- }
- }
- };
- WXGamePlatform.prototype.createNewBanner = function (style) {
- var wx = Laya.Browser.window.wx;
- if (wx && wx.createBannerAd) {
- this.nowStype = style;
- this.bannerRunTime = Laya.Browser.now();
- var info = this.getSystemInfoSync();
- this._screenwidth = info.screenWidth;
- var scale = 1;
- if (style.hasOwnProperty("scale")) {
- scale = style.scale;
- }
- this.bannerAd = wx.createBannerAd({
- adUnitId: 'adunit-8c2d586135fa6d4f',
- adIntervals: 30,
- style: {
- left: 0,
- top: info.screenHeight - 105,
- width: info.screenWidth * scale
- }
- });
- if (this.bannerAd) {
- this.bannerAd.onError(this.bannerError);
- this.showBanner(style);
- }
- }
- };
- WXGamePlatform.prototype.bannerResize = function (res) {
- var self = WXGamePlatform.Instance;
- self.bannerAd.offResize(self.bannerResize);
- self.isonResize = false;
- var nowstype = self.nowStype;
- if (!nowstype) {
- return;
- }
- var info = self.getSystemInfoSync();
- var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
- var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
- self.bannerwidth = res.width;
- self.bannerheight = res.height;
- if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
- self.bannerAd.style.left = nowstype.x * percentageW;
- }
- else {
- self.bannerAd.style.left = (info.windowWidth - res.width) * 0.5;
- }
- if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
- self.bannerAd.style.top = nowstype.y * percentageH;
- }
- else {
- self.bannerAd.style.top = (info.windowHeight - res.height) - 15;
- }
- };
- WXGamePlatform.prototype.bannerError = function (err) {
- };
- WXGamePlatform.prototype.showBanner = function (style) {
- if (this.bannerAd) {
- this.nowStype = style;
- var info = this.getSystemInfoSync();
- var nowstype = this.nowStype;
- var scale = 1;
- if (nowstype.hasOwnProperty("scale")) {
- scale = nowstype.scale;
- }
- var percentageH = Laya.Browser.clientHeight / Laya.stage.displayHeight;
- var percentageW = Laya.Browser.clientWidth / Laya.stage.displayWidth;
- if (nowstype.hasOwnProperty("x") && nowstype.x != 0) {
- this.bannerAd.style.left = nowstype.x * percentageW;
- }
- else {
- this.bannerAd.style.left = (info.windowWidth - this.bannerwidth) * 0.5;
- }
- if (nowstype.hasOwnProperty("y") && nowstype.y != 0) {
- this.bannerAd.style.top = nowstype.y * percentageH;
- }
- else {
- this.bannerAd.style.top = (info.windowHeight - this.bannerheight) - 15;
- }
- this.bannerAd.style.width = info.screenWidth * scale;
- if (!this.isonResize) {
- this.isonResize = true;
- this.bannerAd.onResize(this.bannerResize);
- }
- this.bannerAd.show();
- }
- };
- WXGamePlatform.prototype.hideBanner = function (type) {
- if (type === void 0) { type = ""; }
- if (this.bannerAd) {
- this.bannerAd.hide();
- }
- if (type != "") {
- for (var i = 0; i < this._bannerTypeList.length; i++) {
- if (type == this._bannerTypeList[i].type) {
- this._bannerTypeList.splice(i, 1);
- break;
- }
- }
- if (this._bannerTypeList.length > 0) {
- var item = this._bannerTypeList[this._bannerTypeList.length - 1];
- this.createBanner(item.type, item.style);
- }
- }
- };
- // private _wxOpenDataViewer:WXOpenDataViewer;
- /**
- * 打开好友排行榜
- */
- WXGamePlatform.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
- if (parent === void 0) { parent = null; }
- if (data === void 0) { data = null; }
- this.closeziyuStage();
- this._openrankDict[viewType] = { type: type, viewType: viewType, rect: rect, parent: parent, data: data };
- this.initziyuStage(rect, parent);
- this.postMessage(type, data);
- };
- /**
- * 排行榜打开状态时候,切换显示类型
- * @param type
- */
- WXGamePlatform.prototype.changeFriendRank = function (type) {
- this.postMessage(type);
- };
- /**
- * 排行榜上一页
- */
- WXGamePlatform.prototype.prePageRank = function () {
- };
- /**
- * 排行榜下一页
- */
- WXGamePlatform.prototype.nextPageRank = function () {
- };
- /**
- * 关闭好友排行榜
- */
- WXGamePlatform.prototype.closeFriendRank = function (viewType) {
- this.closeziyuStage();
- if (this._openrankDict[viewType]) {
- delete this._openrankDict[viewType];
- }
- for (var s in this._openrankDict) {
- var itemd = this._openrankDict[s];
- this.openFriendRank(itemd.type, itemd.viewType, itemd.rect, itemd.parent, itemd.data);
- break;
- }
- };
- /**
- * 初始化子域
- * @param rect
- * @param parent
- */
- WXGamePlatform.prototype.initziyuStage = function (rect, parent) {
- // if( !this._wxOpenDataViewer )
- // {
- // this._wxOpenDataViewer = new WXOpenDataViewer();
- // if( parent )
- // {
- // parent.addChild( this._wxOpenDataViewer );
- // }
- // else
- // {
- // GameLayerManager.Instance.topLayer.displayObject.addChild( this._wxOpenDataViewer );
- // }
- // }
- // this._wxOpenDataViewer.x = rect.x;
- // this._wxOpenDataViewer.y = rect.y;
- // this._wxOpenDataViewer.width = rect.width;
- // this._wxOpenDataViewer.height = rect.height;
- };
- /**
- * 销毁子域
- */
- WXGamePlatform.prototype.closeziyuStage = function () {
- // if( this._wxOpenDataViewer )
- // {
- // this._wxOpenDataViewer.destroy();
- // this._wxOpenDataViewer.removeSelf();
- // this._wxOpenDataViewer = null;
- // }
- };
- /**
- * 数据上传(用于排行榜数据显示)
- * @param param1 上报数据
- * @param param2 上报数据
- */
- WXGamePlatform.prototype.storeToCloud = function (param1, param2) {
- var cacheMager = LocalDataControl_1.LocalDataControl.Instance;
- var score1 = cacheMager.getnum("param1");
- // var score2:number = cacheMager.getnum( "param2" );
- param1 = Math.floor(param1);
- param2 = Math.floor(param2);
- var result1 = param1;
- var result2 = param2;
- if (result1 < score1) {
- result1 = score1;
- }
- else {
- cacheMager.addstr("param1", result1.toString());
- }
- var arr = [];
- arr.push({ key: "param1", value: result1.toString() });
- arr.push({ key: "param2", value: result2 + "" });
- this.setUserCloudStorage(arr);
- };
- WXGamePlatform.prototype.createGameClubButton = function (style, icon) {
- if (icon === void 0) { icon = "green"; }
- var wx = Laya.Browser.window.wx;
- if (wx && style) {
- style.width = 40;
- style.height = 40;
- WXGamePlatform.gameclubButton = wx.createGameClubButton({
- icon: icon,
- style: style
- });
- if (WXGamePlatform.gameclubButton) {
- WXGamePlatform.gameclubButton.show();
- }
- }
- };
- WXGamePlatform.QuDaoID = ""; //微信广告ID
- WXGamePlatform.isShowing = true;
- /**
- * 授权状态 0:未判断,1:已授权
- */
- WXGamePlatform.accreditstate = 0;
- /**
- * 当天分享次数
- */
- WXGamePlatform.dayShareNum = 0;
- /**
- * 当天看视频次数
- */
- WXGamePlatform.dayVideoNum = 0;
- /**
- * 判断分享是否成功时间间隔
- */
- WXGamePlatform.ShareTime = 0;
- /**
- * 每日最大看视频次数(成功累加一次)
- */
- WXGamePlatform.VideoNum = 0;
- /**
- * 看视频冷却时间
- */
- WXGamePlatform.VideoTime = 0;
- /**
- * 8好位cpa可弹出时间间隔(秒)
- */
- WXGamePlatform.jiliweitime = 100;
- /**
- * 分享几次切换到视频
- */
- WXGamePlatform.SharetoVideo = 1;
- /**
- * 视频几次切换到分享
- */
- WXGamePlatform.VideotoShare = 1;
- /**
- * 分享数据容器
- */
- WXGamePlatform.ShareDict = {};
- /**
- * 用户来源id
- */
- WXGamePlatform.fromscene = 0;
- WXGamePlatform.nowShareindex = 0;
- WXGamePlatform.callbackfailstate = 0;
- WXGamePlatform.lastVideoTime = 0;
- /**
- * 视频是否在播放中
- */
- WXGamePlatform.videoplaying = false;
- WXGamePlatform.istongjiVideoNum = true;
- return WXGamePlatform;
- }());
- exports.WXGamePlatform = WXGamePlatform;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var WXGamePlatform_1 = require("../WXSDK/WXGamePlatform");
- var PlatfromType_1 = require("./PlatfromType");
- var WECHATEVENT_1 = require("../WXSDK/WECHATEVENT");
- var Global_1 = require("../Global");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var TimesTamper_1 = require("../Time/TimesTamper");
- var DateControl_1 = require("../Control/DateControl");
- var AudioControl_1 = require("../Control/AudioControl");
- /*
- * name;
- */
- var pingtaiutils = /** @class */ (function () {
- function pingtaiutils() {
- this._isenable = false;
- pingtaiutils.ins = this;
- }
- Object.defineProperty(pingtaiutils, "Instance", {
- get: function () {
- if (pingtaiutils.ins == null) {
- return new pingtaiutils();
- }
- return pingtaiutils.ins;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * 初始化平台
- */
- pingtaiutils.prototype.initPlatfrom = function () {
- if (Laya.Browser.window.tt) {
- Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.tt;
- }
- else if (Laya.Browser.window.wx) //微信小游戏
- {
- Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.wx;
- }
- else {
- Global_1.Global.nowplatfrom = PlatfromType_1.PlatfromType.pc;
- }
- };
- pingtaiutils.prototype.init = function () {
- this.initPlatfrom();
- // switch( Global.nowplatfrom )
- // {
- // case PlatfromType.wx:
- // WXGamePlatform.Instance.init();
- // break;
- // case PlatfromType.qq:
- // break;
- // default:
- // break;
- // }
- // this.onShow( this,this.showcallback );
- // this.onHide(this,this.hidecallback);
- };
- pingtaiutils.prototype.initData = function () {
- DateControl_1.DateControl.Instance.SetSelf();
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.initData();
- break;
- default:
- break;
- }
- };
- /**
- * 合违规判断 true:合规,false:违规
- */
- pingtaiutils.checkEnable = function () {
- if (pingtaiutils.islegal == 1) {
- return true;
- }
- return false;
- };
- pingtaiutils.prototype.login = function (callobj, succeedcallback, progressCallback, failcallback) {
- if (callobj === void 0) { callobj = null; }
- if (succeedcallback === void 0) { succeedcallback = null; }
- if (progressCallback === void 0) { progressCallback = null; }
- if (failcallback === void 0) { failcallback = null; }
- fairygui.GRoot.inst.showModalWait();
- this._logincallobj = callobj;
- this._loginsucceedcallback = succeedcallback;
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.createUserAndLogin(this, this.loginSucceed, this.loginprogressCallback, this.loginfailcallback);
- break;
- default:
- this.loginSucceed(null);
- break;
- }
- };
- pingtaiutils.prototype.loginprogressCallback = function (value) {
- };
- pingtaiutils.prototype.loginSucceed = function (data) {
- fairygui.GRoot.inst.closeModalWait();
- };
- pingtaiutils.prototype.loginfailcallback = function () {
- };
- pingtaiutils.prototype.onShow = function (callobj, succeedcallback, failCallback) {
- if (callobj === void 0) { callobj = null; }
- if (succeedcallback === void 0) { succeedcallback = null; }
- if (failCallback === void 0) { failCallback = null; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.onShow(callobj, succeedcallback, failCallback);
- break;
- case PlatfromType_1.PlatfromType.qq:
- break;
- }
- };
- pingtaiutils.prototype.showcallback = function () {
- Laya.timer.clear(this, this.againplaybgSound);
- Laya.timer.once(500, this, this.againplaybgSound);
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onshow);
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_getfocus);
- var fromscene = pingtaiutils.fromscene();
- if (fromscene == 1089 || fromscene == 1131) {
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_fromscorfk);
- }
- };
- pingtaiutils.prototype.againplaybgSound = function () {
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onAudioInterruptionEnd);
- };
- pingtaiutils.prototype.onHide = function (callobj, succeedcallback) {
- if (callobj === void 0) { callobj = null; }
- if (succeedcallback === void 0) { succeedcallback = null; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.onHide(callobj, succeedcallback);
- break;
- case PlatfromType_1.PlatfromType.qq:
- break;
- }
- };
- pingtaiutils.prototype.hidecallback = function () {
- TimesTamper_1.TimesTamper.Instance.sendonlineTongji();
- AudioControl_1.AudioControl.Instance.ClearAllSOUND();
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_onhide);
- DispatcherManager_1.DispatcherManager.dispatchEvent(WECHATEVENT_1.WECHATEVENT.WECHATEVENT_losefocus);
- };
- Object.defineProperty(pingtaiutils.prototype, "isshow", {
- /**
- * 当前游戏是否在显示中
- */
- get: function () {
- var bo = true;
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- if (WXGamePlatform_1.WXGamePlatform.isShowing) {
- bo = true;
- }
- bo = false;
- break;
- }
- return bo;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * 分包加载
- */
- pingtaiutils.prototype.loadSubpackage = function (typename, callobj, callback, callprogress, failcallback) {
- if (failcallback === void 0) { failcallback = null; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.loadSubpackage(typename, callobj, callback, callprogress, failcallback);
- break;
- default:
- if (callobj && callback) {
- callback.call(callobj);
- }
- break;
- }
- };
- /**
- * 获取是否已经授权
- * @param callobj
- * @param callback
- */
- pingtaiutils.prototype.isaccredit = function (callobj, accreditCallback) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
- break;
- case PlatfromType_1.PlatfromType.qq:
- WXGamePlatform_1.WXGamePlatform.Instance.getaccredit(callobj, accreditCallback);
- break;
- default:
- if (accreditCallback && callobj) {
- accreditCallback.call(callobj, true);
- }
- break;
- }
- };
- /**
- * 拿角色信息授权
- */
- pingtaiutils.prototype.createaccredit = function (callobj, callback, failcallback) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.createUserInfoButton(callobj, callback, failcallback);
- break;
- }
- };
- pingtaiutils.prototype.closeuserinfoButton = function () {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.closeuserinfobUtton();
- break;
- }
- };
- /**
- * 退出游戏
- */
- pingtaiutils.prototype.exitGame = function () {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.exitGame();
- break;
- }
- };
- /**
- * 打开客服对话框
- */
- pingtaiutils.prototype.openCustomerService = function () {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.openCustomerService();
- break;
- }
- };
- /**
- * 短震动
- */
- pingtaiutils.prototype.vibrateShort = function () {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.vibrateShort();
- break;
- default:
- break;
- }
- };
- pingtaiutils.isCanVideo = function () {
- var bo = false;
- if (pingtaiutils.checkEnable()) {
- bo = true;
- }
- else {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- bo = WXGamePlatform_1.WXGamePlatform.Instance.isCanVideo();
- break;
- default:
- bo = true;
- break;
- }
- }
- return bo;
- };
- pingtaiutils.prototype.startShareApp = function (key, callobj, succeedCallback, failCallback) {
- if (callobj === void 0) { callobj = null; }
- if (succeedCallback === void 0) { succeedCallback = null; }
- if (failCallback === void 0) { failCallback = null; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.startShareApp(key, callobj, succeedCallback, failCallback);
- break;
- default:
- if (callobj && succeedCallback) {
- succeedCallback.call(callobj);
- }
- break;
- }
- };
- pingtaiutils.prototype.playVideo = function (key, callobj, succeedcallback, failCallback, istongjiNum) {
- if (callobj === void 0) { callobj = null; }
- if (succeedcallback === void 0) { succeedcallback = null; }
- if (failCallback === void 0) { failCallback = null; }
- if (istongjiNum === void 0) { istongjiNum = true; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.playVideo(key, callobj, succeedcallback, failCallback, istongjiNum);
- break;
- default:
- if (callobj && succeedcallback) {
- succeedcallback.call(callobj);
- }
- break;
- }
- };
- pingtaiutils.prototype.createBanner = function (bannertype, style) {
- if (style === void 0) { style = { x: 0, y: 0, scale: 1 }; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.createBanner(bannertype, style);
- break;
- default:
- break;
- }
- };
- pingtaiutils.prototype.hideBanner = function (bannertype) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.hideBanner(bannertype);
- break;
- default:
- break;
- }
- };
- /**
- * 数据上传(用于排行榜数据显示)
- * @param param1 上报数据1
- * @param param2 上报数据2
- */
- pingtaiutils.prototype.storeToCloud = function (param1, param2) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.storeToCloud(param1, param2);
- break;
- default:
- break;
- }
- };
- /**
- * 打开好友排行榜
- */
- pingtaiutils.prototype.openFriendRank = function (type, viewType, rect, parent, data) {
- if (parent === void 0) { parent = null; }
- if (data === void 0) { data = null; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.openFriendRank(type, viewType, rect, parent, data);
- break;
- default:
- break;
- }
- };
- /**
- * 排行榜打开状态时候,切换显示类型
- * @param type
- */
- pingtaiutils.prototype.changeFriendRank = function (type) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.changeFriendRank(type);
- break;
- default:
- break;
- }
- };
- /**
- * 排行榜上一页
- */
- pingtaiutils.prototype.prePageRank = function () {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.prePageRank();
- break;
- default:
- break;
- }
- };
- /**
- * 排行榜下一页
- */
- pingtaiutils.prototype.nextPageRank = function () {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.nextPageRank();
- break;
- default:
- break;
- }
- };
- /**
- * 关闭好友排行榜
- */
- pingtaiutils.prototype.closeFriendRank = function (viewType) {
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.closeFriendRank(viewType);
- break;
- default:
- break;
- }
- };
- pingtaiutils.prototype.lockVideoLeftTime = function () {
- var time = 0;
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- time = WXGamePlatform_1.WXGamePlatform.Instance.lockVideoLeftTime();
- break;
- default:
- break;
- }
- return time;
- };
- pingtaiutils.dayVideoNums = function () {
- var time = 0;
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- time = WXGamePlatform_1.WXGamePlatform.dayVideoNum;
- break;
- default:
- break;
- }
- return time;
- };
- /**
- * 1089:添加到我的小程序,1131:添加到浮窗
- */
- pingtaiutils.fromscene = function () {
- var scene = 0;
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- scene = WXGamePlatform_1.WXGamePlatform.fromscene;
- break;
- default:
- break;
- }
- return scene;
- };
- pingtaiutils.createGameClubButton = function (style, icon) {
- if (icon === void 0) { icon = "green"; }
- switch (Global_1.Global.nowplatfrom) {
- case PlatfromType_1.PlatfromType.wx:
- WXGamePlatform_1.WXGamePlatform.Instance.createGameClubButton(style, icon);
- break;
- default:
- break;
- }
- };
- /**
- * 是否合规
- */
- pingtaiutils.islegal = 0;
- return pingtaiutils;
- }());
- exports.pingtaiutils = pingtaiutils;
- },{"../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){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var PlayerAccount_1 = require("./PlayerAccount");
- // import { Account } from "../Account/Account";
- var ttshare = /** @class */ (function () {
- function ttshare() {
- }
- ttshare.share = function () {
- Laya.Browser.window.tt.shareAppMessage({
- channel: "article",
- templateId: "ocgf9b46464b9anlff",
- title: "冲啊冲",
- imageUrl: "jiazai/123.png",
- query: "res.query",
- success: function () { },
- fail: function () { },
- });
- };
- return ttshare;
- }());
- exports.ttshare = ttshare;
- var ttad = /** @class */ (function () {
- function ttad() {
- ttad.instance = this;
- }
- Object.defineProperty(ttad, "Instance", {
- get: function () {
- if (ttad.instance) {
- return ttad.instance;
- }
- else {
- return new ttad();
- }
- },
- enumerable: true,
- configurable: true
- });
- ttad.InitAD = function () {
- if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
- return;
- ttad.bannerAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.bannerAdUnitId : ttad.bannerAdUnitId;
- console.log("bannerAdUnitId", ttad.bannerAdUnitId);
- ttad.videlAdUnitId = PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId ? PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.videlAdUnitId : ttad.videlAdUnitId;
- console.log("videlAdUnitId", ttad.videlAdUnitId);
- ttad.videoAd = Laya.Browser.window.tt.createRewardedVideoAd({ adUnitId: this.videlAdUnitId });
- ttad.videoAd.onClose(function (res) {
- if (res.isEnded) {
- if (ttad.closecallback) {
- ttad.closecallback(true);
- }
- }
- else {
- if (ttad.closecallback) {
- ttad.closecallback(false);
- }
- }
- });
- };
- ttad.ShowVideo = function (_cb) {
- var _this = this;
- if (!PlayerAccount_1.PlayerAccount.CurrentAccount.CurAccountData.video || !Laya.Browser.onMobile)
- return;
- console.log("show video");
- ttad.closecallback = _cb;
- ttad.videoAd.show().then(function () {
- console.log("广告显示成功");
- }).catch(function (err) {
- // ttad.ShowTxt("视频正在加载中");
- console.log("广告组件出现问题", err);
- // 可以手动加载一次
- Laya.timer.once(200, _this, function () {
- ttad.videoAd.load().then(function () {
- console.log("手动加载成功");
- // 加载成功后需要再显示广告
- return ttad.videoAd.show();
- });
- });
- });
- };
- ttad.Showbanner = function () {
- if (!Laya.Browser.onMobile)
- return;
- console.log("show banner");
- ttad.canshow = true;
- var infor = Laya.Browser.window.tt.getSystemInfoSync();
- var targetBannerAdWidth = 200;
- if (ttad.bannerAd)
- ttad.bannerAd.destroy();
- Laya.timer.once(200, this, function () {
- ttad.bannerAd = Laya.Browser.window.tt.createBannerAd({
- adUnitId: ttad.bannerAdUnitId,
- style: {
- width: targetBannerAdWidth,
- top: infor.windowHeight - (targetBannerAdWidth / 16) * 9 // 根据系统约定尺寸计算出广告高度
- }
- });
- ttad.bannerAd.onLoad(function () {
- if (ttad.canshow) {
- ttad.bannerAd.show().then(function () {
- console.log("广告显示成功");
- }).catch(function (err) {
- console.log("广告组件出现问题", err);
- });
- }
- });
- ttad.bannerAd.onResize(function (size) {
- console.log(size.width, size.height);
- ttad.bannerAd.style.top = infor.windowHeight - size.height;
- ttad.bannerAd.style.left = (infor.windowWidth - size.width) / 2;
- });
- });
- };
- ttad.Clear = function () {
- ttad.canshow = false;
- ttad.closecallback = null;
- if (ttad.bannerAd)
- ttad.bannerAd.hide();
- };
- /**抖音更多游戏方法*/
- ttad.CreateMoreGameBtn = function (fun) {
- if (fun === void 0) { fun = null; }
- if (!Laya.Browser.onMobile)
- return;
- if (Laya.Browser.onIOS) {
- ttad.ShowTxt("暂未开放");
- return;
- }
- Laya.Browser.window.tt.showMoreGamesModal({
- appLaunchOptions: [
- {
- appId: "tt66d0106df9eaa083",
- query: "foo=bar&baz=qux",
- extraData: {}
- }
- ],
- success: function (res) {
- console.log("success", res.errMsg);
- if (fun) {
- fun();
- }
- },
- fail: function (res) {
- console.log("fail", res.errMsg);
- }
- });
- // 监听弹窗关闭
- // this.onMoreGamesModalClose();
- };
- /*监听弹窗关闭*/
- // static onMoreGamesModalClose()
- // {
- // if(!Laya.Browser.onMobile)return;
- // if( Laya.Browser.onIOS)
- // {
- // ttad.ShowTxt("暂未开放");
- // return;
- // }
- // Laya.Browser.window.tt.onMoreGamesModalClose(function() {
- // console.log("modal closed");
- // if(Scene3DManager.getInstance().IsGamePasue)
- // {
- // EventUtils.dispatchEvent( GameEvent.continueGame );
- // }
- // });
- // }
- ttad.ShowTxt = function (text) {
- if (Laya.Browser.window.tt) {
- Laya.Browser.window.tt.showToast({ title: text });
- }
- else {
- console.log(text);
- }
- };
- ttad.videlAdUnitId = "15gfgp58pocp80hbkb";
- ttad.bannerAdUnitId = "dsk7cohbl2f4jpjtq5";
- ttad.canshow = true;
- return ttad;
- }());
- exports.ttad = ttad;
- },{"./PlayerAccount":75}],84:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /**
- * 全局侦听类及消息处理
- */
- var DisPatcherOn = /** @class */ (function (_super) {
- __extends(DisPatcherOn, _super);
- function DisPatcherOn() {
- var _this = _super.call(this) || this;
- _this.isInit = false;
- DisPatcherOn.ins = _this;
- if (_this.isInit) {
- }
- if (_this._dispatcher == null) {
- _this._dispatcher = new Laya.EventDispatcher();
- _this.isInit = true;
- }
- return _this;
- }
- Object.defineProperty(DisPatcherOn, "Instance", {
- get: function () {
- if (DisPatcherOn.ins == null)
- return new DisPatcherOn();
- return DisPatcherOn.ins;
- },
- enumerable: true,
- configurable: true
- });
- DisPatcherOn.prototype.addEventListener = function (type, listener, thisObject, useCapture, priority) {
- if (useCapture === void 0) { useCapture = false; }
- if (priority === void 0) { priority = 0; }
- this._dispatcher.on(type, thisObject, listener);
- };
- DisPatcherOn.prototype.removeEventListener = function (type, listener, thisObject, useCapture) {
- if (useCapture === void 0) { useCapture = false; }
- this._dispatcher.off(type, thisObject, listener);
- };
- DisPatcherOn.prototype.hasEventListener = function (type) {
- return this._dispatcher.hasListener(type);
- };
- DisPatcherOn.prototype.dispatchEvent = function (type, data) {
- return this._dispatcher.event(type, data);
- };
- return DisPatcherOn;
- }(Laya.EventDispatcher));
- exports.DisPatcherOn = DisPatcherOn;
- },{}],85:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var LEvent_1 = require("./LEvent");
- var DisPatcherOn_1 = require("./DisPatcherOn");
- /*
- * name;
- */
- var DispatcherManager = /** @class */ (function () {
- function DispatcherManager() {
- }
- DispatcherManager.init = function () {
- DisPatcherOn_1.DisPatcherOn.Instance;
- };
- //新建事件
- DispatcherManager.Event = function (type, obj, bubbles, cancelable) {
- if (obj === void 0) { obj = null; }
- if (bubbles === void 0) { bubbles = false; }
- if (cancelable === void 0) { cancelable = false; }
- return new LEvent_1.LEvent(type, obj, bubbles, cancelable);
- };
- //派发事件
- DispatcherManager.dispatchEvent = function (type, obj, bubbles, cancelable) {
- if (obj === void 0) { obj = null; }
- if (bubbles === void 0) { bubbles = false; }
- if (cancelable === void 0) { cancelable = false; }
- DisPatcherOn_1.DisPatcherOn.Instance.dispatchEvent(type, obj);
- };
- //监听事件
- DispatcherManager.addEventListener = function (type, thisObject, listener, useCapture, priority) {
- if (useCapture === void 0) { useCapture = false; }
- if (priority === void 0) { priority = 0; }
- DisPatcherOn_1.DisPatcherOn.Instance.addEventListener(type, listener, thisObject, useCapture, priority);
- };
- DispatcherManager.hasEventListener = function (type) {
- return DisPatcherOn_1.DisPatcherOn.Instance.hasEventListener(type);
- };
- DispatcherManager.removeEventListener = function (type, thisObject, listener, useCapture, priority) {
- if (useCapture === void 0) { useCapture = false; }
- if (priority === void 0) { priority = 0; }
- DisPatcherOn_1.DisPatcherOn.Instance.removeEventListener(type, listener, thisObject);
- };
- return DispatcherManager;
- }());
- exports.DispatcherManager = DispatcherManager;
- },{"./DisPatcherOn":84,"./LEvent":89}],86:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var Sprite = Laya.Sprite;
- var GameState = /** @class */ (function () {
- function GameState() {
- /*********************************************************************** */
- this.btnArr = ["res/button.png", "res/button.png", "res/button.png"];
- this.nameArr = ["canvas截图", "sprite截图", "清理"];
- }
- GameState.prototype.drawSomething = function () {
- this.sp = new Sprite();
- Laya.stage.addChild(this.sp);
- //画线
- this.sp.graphics.drawLine(10, 58, 146, 58, "#ff0000", 3);
- //画连续直线
- this.sp.graphics.drawLines(176, 58, [0, 0, 39, -50, 78, 0, 117, 50, 156, 0], "#ff0000", 5);
- //画曲线
- 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);
- //画矩形
- this.sp.graphics.drawRect(10, 166, 166, 90, "#ffff00");
- //画多边形
- this.sp.graphics.drawPoly(264, 166, [0, 0, 60, 0, 78.48, 57, 30, 93.48, -18.48, 57], "#ffff00");
- //画三角形
- this.sp.graphics.drawPoly(400, 166, [0, 100, 50, 0, 100, 100], "#ffff00");
- //画圆
- this.sp.graphics.drawCircle(98, 332, 50, "#00ffff");
- //画扇形
- this.sp.graphics.drawPie(240, 290, 100, 10, 60, "#00ffff");
- //绘制圆角矩形,自定义路径
- 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" });
- };
- GameState.prototype._onclick = function (e) {
- switch (e.target.name) {
- case this.nameArr[0]:
- var base64Url = this._canvas.toDataURL("image/png", 1);
- this.drawImage.skin = base64Url;
- break;
- case this.nameArr[1]:
- var text = Laya.stage.drawToTexture(Laya.Browser.clientWidth, Laya.Browser.clientHeight, 0, 0);
- this.drawSp.graphics.drawTexture(text, 0, 0, this.drawSp.width, this.drawSp.height);
- break;
- case this.nameArr[2]:
- this.drawImage.skin = null;
- this.drawSp.graphics.clear();
- this.drawSp.graphics.drawRect(0, 0, this.drawSp.width, this.drawSp.height, "#ff0000");
- break;
- }
- };
- GameState.removeselect = "GameState_removeselect";
- GameState.npcend = "GameState_npcendGame";
- /**
- * 通关成功
- */
- GameState.win = "GameState_winGame";
- /**
- * 通关失败
- */
- GameState.fail = "GameState_failGame";
- GameState.jump = "GameState_jumpgame";
- /**
- * 暂停游戏
- */
- GameState.stop = "GameState_stopGame";
- /**
- * 回到主界面
- */
- GameState.returnMainView = "returnMainView";
- GameState.updateSKinView = "GameState_updateSKinView";
- /*********************************************************************** */
- /**
- * 开始游戏
- */
- GameState.start = "GameState_startGame";
- /**
- * 结束游戏
- */
- GameState.end = "GameState_endGame";
- /**失败 */
- GameState.lose = "GameState_loseGame";
- /**
- * 复活
- */
- GameState.revive = "GameState_reviveGame";
- /**是否复活 */
- GameState.isdie = false;
- /**允许复活次数 */
- GameState.fuhuocishu = 1;
- /**是否已经发布过录屏 */
- GameState.recordscree = false;
- /**游戏次数*/
- GameState.GameNum = 0;
- return GameState;
- }());
- exports.GameState = GameState;
- },{}],87:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /*
- * 公共接口
- */
- var GameUtils;
- (function (GameUtils) {
- /**
- * 随机函数(返回整型)
- */
- function randRangeint(min, max) {
- var value = Math.floor(Math.random() * (max - min + 1)) + min;
- if (value > max) {
- value = max;
- }
- return value;
- }
- GameUtils.randRangeint = randRangeint;
- /**
- * 随机函数( 不取整 )
- */
- function randRangefloat(min, max) {
- var value = Math.random() * (max - min + 1) + min;
- if (value > max) {
- value = max;
- }
- return value;
- }
- GameUtils.randRangefloat = randRangefloat;
- function getTexbyPkgAndName(pkgname, texname) {
- var uipackage = fairygui.UIPackage.getByName(pkgname);
- if (uipackage) {
- return uipackage.getItemAssetByName(texname);
- }
- return null;
- }
- GameUtils.getTexbyPkgAndName = getTexbyPkgAndName;
- /**
- * 切割分号变成Point对象
- * @param str
- */
- function cutfenhaoPoint(str) {
- var arr = str.split(";");
- return new Laya.Point(Number(arr[0]), Number(arr[1]));
- }
- GameUtils.cutfenhaoPoint = cutfenhaoPoint;
- /**
- * 切割分号变成数据(number)
- */
- function cutfenhaotoArrnum(str) {
- var numArr = [];
- if (str == "") {
- return numArr;
- }
- var arr = str.split(";");
- var i = 0;
- for (i; i < arr.length; i++) {
- numArr.push(Number(arr[i]));
- }
- return numArr;
- }
- GameUtils.cutfenhaotoArrnum = cutfenhaotoArrnum;
- /**
- * 切割分号变成数据(string)
- */
- function cutfenhaotoArrstr(str) {
- return str.split(";");
- }
- GameUtils.cutfenhaotoArrstr = cutfenhaotoArrstr;
- /**
- * 切割分号变成数据( { key:1,value:1 } )
- */
- function cutfenhaotoObj(str) {
- var obj = {};
- var arr = str.split(";");
- obj.key = arr[0];
- obj.value = arr[1];
- return obj;
- }
- GameUtils.cutfenhaotoObj = cutfenhaotoObj;
- /**切割str*/
- function cutstrtoArr(str) {
- var arr = str.split("|");
- return arr;
- }
- GameUtils.cutstrtoArr = cutstrtoArr;
- /**切割str( 1:1|1:1 ) to Array<{ key:1,value:1 }> */
- function cutstrtoArr1(str) {
- var reslutArr = [];
- var arr = str.split("|");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var itemarr = arr[i].split(";");
- reslutArr.push({ key: itemarr[0], value: itemarr[1] });
- }
- return reslutArr;
- }
- GameUtils.cutstrtoArr1 = cutstrtoArr1;
- function cutstrtoObj(str) {
- var resultobj = {};
- var arr = str.split("|");
- var i = 0;
- for (i = 0; i < arr.length; i++) {
- var itemarr = arr[i].split(";");
- resultobj[itemarr[0]] = itemarr[1];
- }
- return resultobj;
- }
- GameUtils.cutstrtoObj = cutstrtoObj;
- function compareVersion(v1, v2) {
- v1 = v1.split('.');
- v2 = v2.split('.');
- var len = Math.max(v1.length, v2.length);
- while (v1.length < len) {
- v1.push('0');
- }
- while (v2.length < len) {
- v2.push('0');
- }
- for (var i = 0; i < len; i++) {
- var num1 = parseInt(v1[i]);
- var num2 = parseInt(v2[i]);
- if (num1 > num2) {
- return 1;
- }
- else if (num1 < num2) {
- return -1;
- }
- }
- return 0;
- }
- GameUtils.compareVersion = compareVersion;
- })(GameUtils = exports.GameUtils || (exports.GameUtils = {}));
- },{}],88:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var GlobalTipPanel_1 = require("../View/GlobalTipPanel");
- var LayoutControl_1 = require("../Control/LayoutControl");
- var LayOUT_1 = require("../utils/LayOUT");
- var DispatcherManager_1 = require("../utils/DispatcherManager");
- var GameState_1 = require("../utils/GameState");
- /*
- * name;
- */
- var GlobalTip = /** @class */ (function () {
- function GlobalTip() {
- GlobalTip.ins = this;
- }
- Object.defineProperty(GlobalTip, "Instance", {
- get: function () {
- if (GlobalTip.ins == null) {
- return new GlobalTip();
- }
- return GlobalTip.ins;
- },
- enumerable: true,
- configurable: true
- });
- GlobalTip.prototype.initEvent = function () {
- GlobalTip.isEvent = true;
- DispatcherManager_1.DispatcherManager.addEventListener(GameState_1.GameState.removeselect, this, this.addwordList);
- };
- GlobalTip.prototype.showWordTips = function (word) {
- if (!GlobalTip.isEvent) {
- GlobalTip.Instance.initEvent();
- }
- if (GlobalTip.showWordList.length > 0) {
- var lastword = GlobalTip.showWordList[GlobalTip.showWordList.length - 1].nowword;
- // if( lastword == word )
- // {
- // return;
- // }
- }
- if (GlobalTip.wordList.length > 0) {
- var item = GlobalTip.wordList.shift();
- LayoutControl_1.LayoutControl.Instance.AddLayerByName(item, LayOUT_1.LayOUT.TIP);
- GlobalTip.showWordList.push(item);
- item.showWord(word);
- }
- else {
- if (GlobalTip.showWordList.length < 10) {
- var item1 = new GlobalTipPanel_1.WordTipsPanel();
- LayoutControl_1.LayoutControl.Instance.AddLayerByName(item1, LayOUT_1.LayOUT.TIP);
- GlobalTip.showWordList.push(item1);
- item1.showWord(word);
- }
- else {
- var item1 = GlobalTip.showWordList.shift();
- item1.showWord(word);
- GlobalTip.showWordList.push(item1);
- }
- }
- };
- GlobalTip.prototype.addwordList = function (item) {
- if (item) {
- item.removeFromParent();
- var index = GlobalTip.showWordList.indexOf(item);
- if (index != -1) {
- GlobalTip.showWordList.splice(index, 1);
- }
- LayoutControl_1.LayoutControl.Instance.ClearLayerByName(LayOUT_1.LayOUT.TIP);
- GlobalTip.wordList.push(item);
- }
- };
- GlobalTip.wordList = [];
- GlobalTip.showWordList = [];
- GlobalTip.maxNum = 10;
- GlobalTip.isEvent = false;
- return GlobalTip;
- }());
- exports.GlobalTip = GlobalTip;
- },{"../Control/LayoutControl":22,"../View/GlobalTipPanel":64,"../utils/DispatcherManager":85,"../utils/GameState":86,"../utils/LayOUT":90}],89:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var LEvent = /** @class */ (function (_super) {
- __extends(LEvent, _super);
- function LEvent(type, obj, bubbles, cancelable) {
- if (obj === void 0) { obj = null; }
- if (bubbles === void 0) { bubbles = false; }
- if (cancelable === void 0) { cancelable = false; }
- var _this = _super.call(this) || this;
- _this.CLASS_NAME = "LEvent";
- if (obj) {
- _this._obj = obj;
- }
- return _this;
- }
- LEvent.prototype.clone = function (obj) {
- return new LEvent(this.type, obj ? obj : this._obj);
- };
- LEvent.prototype.toString = function () {
- console.log(this.CLASS_NAME, "type", "bubbles", "cancelable");
- };
- Object.defineProperty(LEvent.prototype, "param", {
- /**
- * 传参获取
- * @returns {any}
- */
- get: function () {
- return this._obj;
- },
- enumerable: true,
- configurable: true
- });
- return LEvent;
- }(Laya.Event));
- exports.LEvent = LEvent;
- },{}],90:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var LayOUT = /** @class */ (function () {
- function LayOUT() {
- }
- /**
- * 背景层
- */
- LayOUT.BG = "BG";
- /**
- * ui层
- */
- LayOUT.UI = "UI";
- /**
- * ui层上层
- */
- LayOUT.UITop = "UITop";
- /**
- * tips层
- */
- LayOUT.TIP = "TIP";
- /**
- * 新手引导层
- */
- LayOUT.GUIDE = "GUIDE";
- return LayOUT;
- }());
- exports.LayOUT = LayOUT;
- },{}],91:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /*
- * name;
- */
- var Singleton = /** @class */ (function (_super) {
- __extends(Singleton, _super);
- function Singleton() {
- return _super.call(this) || this;
- }
- /**
- * 获取单例类,若不存在则返回空
- * @param ref 继承自Singleton的类
- * @return *
- */
- Singleton.Instance = function (ref) {
- if (ref.key == null) {
- throw new Error("getinstance erro");
- }
- return this._dict[ref.key];
- };
- /**
- * 获取单例类,若不存在则创建
- * @param ref 继承自Singleton的类
- * @return *
- */
- Singleton.getInstanceOrCreate = function (ref) {
- if (ref.key == null) {
- throw new Error("getInstanceOrCreate erro");
- }
- this.create(ref);
- return this._dict[ref.key];
- };
- /**
- * 创建单例类
- * @param ref 继承自Singleton的类
- * @return void
- */
- Singleton.create = function (ref) {
- if (ref.key == null) {
- throw new Error("create erro");
- }
- if (this._dict[ref.key] == null) {
- this._dict[ref.key] = new ref();
- }
- return this._dict[ref.key];
- };
- /**
- * 删除单例类
- * @param ref 继承自Singleton的类
- * @return void
- */
- Singleton.remove = function (ref) {
- var key = ref.key;
- if (this._dict[key] != null) {
- this._dict[key].destory();
- }
- };
- /**
- * 销毁方法
- */
- Singleton.prototype.destory = function () {
- };
- Singleton._dict = {};
- return Singleton;
- }(Laya.EventDispatcher));
- exports.Singleton = Singleton;
- },{}],92:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- var AgencySkin_1 = require("../Agency/AgencySkin");
- var PanelResDic_1 = require("../PrefabControl/PanelResDic");
- var GlobalTip_1 = require("../utils/GlobalTip");
- var AssetPath_1 = require("../Config/AssetPath");
- var MovieClip = Laya.MovieClip;
- var ttad_1 = require("../WXSDK/ttad");
- var SkinItem = /** @class */ (function (_super) {
- __extends(SkinItem, _super);
- function SkinItem() {
- var _this = _super.call(this) || this;
- /********************************************************** */
- _this.bgColorChannels = { r: 99, g: 0, b: 0xFF };
- /********************************************** */
- _this.SWFPath = "res/swf/dragon.swf";
- _this.MCWidth = 318;
- _this.MCHeight = 406;
- return _this;
- }
- SkinItem.prototype.getHexColorString = function () {
- this.bgColorChannels.r = Math.floor(this.bgColorChannels.r);
- // 绿色通道使用0
- this.bgColorChannels.g = 0;
- //obj.g = Math.floor(obj.g);
- this.bgColorChannels.b = Math.floor(this.bgColorChannels.b);
- var r = this.bgColorChannels.r.toString(16);
- r = r.length == 2 ? r : "0" + r;
- var g = this.bgColorChannels.g.toString(16);
- g = g.length == 2 ? g : "0" + g;
- var b = this.bgColorChannels.b.toString(16);
- b = b.length == 2 ? b : "0" + b;
- return "#" + r + g + b;
- };
- /********************************************************** */
- SkinItem.prototype.constructFromXML = function (xml) {
- _super.prototype.constructFromXML.call(this, xml);
- for (var str in this._children) {
- var item = this._children[str];
- this[item.name] = item;
- }
- this.onInit();
- };
- SkinItem.prototype.onInit = function () {
- this.initView();
- this.initEvent();
- };
- SkinItem.prototype.initView = function () {
- this.agencyskin = PanelResDic_1.PanelResDic.Instance.getSingleTon(AgencySkin_1.AgencySkin);
- this.c_state = this.getController("c_state");
- };
- SkinItem.prototype.initEvent = function () {
- this.on(Laya.Event.CLICK, this, this.btnclick);
- };
- SkinItem.prototype.btnclick = function () {
- if (this.pifuvo) {
- switch (this.c_state.selectedIndex) {
- case 0:
- break;
- case 1: //拥有
- this.agencyskin.GainPifu(this.pifuvo);
- break;
- case 2: //活动获取
- GlobalTip_1.GlobalTip.Instance.showWordTips("暂未开放");
- break;
- case 3: //看视频获取
- this.playvideocallback();
- // pingtaiutils.Instance.playVideo( "",this,this.playvideocallback );
- break;
- case 4: //金币购买
- this.agencyskin.GainPifu(this.pifuvo);
- break;
- }
- }
- };
- SkinItem.prototype.createMovieClip = function () {
- var mc = new MovieClip();
- mc.load(this.SWFPath);
- mc.x = (Laya.stage.width - this.MCWidth) / 2;
- mc.y = (Laya.stage.height - this.MCHeight) / 2;
- Laya.stage.addChild(mc);
- };
- /********************************************** */
- SkinItem.prototype.playvideocallback = function () {
- var _this = this;
- ttad_1.ttad.ShowVideo((function (isLoad) {
- if (isLoad) {
- _this.agencyskin.GainPifu(_this.pifuvo);
- }
- }));
- };
- SkinItem.prototype.showData = function (vo) {
- this.pifuvo = vo;
- if (this.pifuvo) {
- this.load_icon.icon = AssetPath_1.AssetPath.getroleicon(this.pifuvo.roleCFG.icon);
- if (this.agencyskin.RoleData.CharacterID == this.pifuvo.roleCFG.id) {
- this.c_state.selectedIndex = 0;
- }
- else if (this.pifuvo.state == 1) {
- this.c_state.selectedIndex = 1;
- }
- else {
- switch (this.pifuvo.roleCFG.getState) {
- case 1:
- this.c_state.selectedIndex = 3;
- this.txt_need.text = this.pifuvo.hasnum + "/" + this.pifuvo.roleCFG.need;
- break;
- case 2:
- this.c_state.selectedIndex = 4;
- this.txt_need.text = this.pifuvo.roleCFG.need.toString();
- break;
- case 3:
- this.c_state.selectedIndex = 2;
- break;
- }
- }
- }
- };
- /******************************************************** */
- SkinItem.prototype.preFixNumber = function (num, strLen) {
- return ("0000000000" + num).slice(-strLen);
- };
- SkinItem.prototype.evalBgColor = function () {
- var color = Math.random() * 0xFFFFFF;
- var channels = this.getColorChannals(color);
- };
- SkinItem.prototype.getColorChannals = function (color) {
- var result = [];
- result.push(color >> 16);
- result.push(color >> 8 & 0xFF);
- result.push(color & 0xFF);
- return result;
- };
- /******************************************************** */
- SkinItem.prototype.dispose = function () {
- this.off(Laya.Event.CLICK, this, this.btnclick);
- _super.prototype.dispose.call(this);
- };
- return SkinItem;
- }(fairygui.GButton));
- exports.SkinItem = SkinItem;
- },{"../Agency/AgencySkin":6,"../Config/AssetPath":15,"../PrefabControl/PanelResDic":48,"../WXSDK/ttad":83,"../utils/GlobalTip":88}],93:[function(require,module,exports){
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /**
- * 继承baseView界面的打开关闭动效类型
- */
- var ViewAction = /** @class */ (function () {
- function ViewAction() {
- /************************ */
- this._text = null;
- }
- /**
- * 动画状态开始时执行。
- */
- ViewAction.prototype.onStateEnter = function () {
- console.log("动画开始播放了");
- this._text.text = "动画状态:动画开始播放";
- };
- /**
- * 动画状态更新时执行。
- */
- ViewAction.prototype.onStateUpdate = function () {
- console.log("动画状态更新了");
- this._text.text = "动画状态:动画更新中";
- };
- /**
- * 动画状态退出时执行。
- */
- ViewAction.prototype.onStateExit = function () {
- console.log("动画退出了");
- this._text.text = "动画状态:动画开始退出";
- };
- ViewAction.prototype.addBox = function () {
- for (var i = 0; i < 8; i++) {
- this.addVerticalBox(-0.65, 0.165 + i * 0.33 * 2, 0);
- this.addVerticalBox(0, 0.165 + i * 0.33 * 2, 0);
- this.addVerticalBox(0.65, 0.165 + i * 0.33 * 2, 0);
- }
- };
- ViewAction.prototype.addVerticalBox = function (x, y, z) {
- var box = this.scene.addChild(new Laya.MeshSprite3D(this.mesh1));
- box.meshRenderer.material = this.mat1;
- box.meshRenderer.castShadow = true;
- box.meshRenderer.receiveShadow = true;
- box.transform.position = new Laya.Vector3(x, y, z);
- var rigidBody = box.addComponent(Laya.Rigidbody3D);
- rigidBody.mass = 10;
- rigidBody.friction = 0.4;
- rigidBody.restitution = 0.2;
- var boxShape = new Laya.BoxColliderShape(0.5, 0.33, 2);
- rigidBody.colliderShape = boxShape;
- };
- /**
- * 从小变大
- */
- ViewAction.ActionType_addscaleMinToMax = "ActionType_addscaleMinToMax";
- /**
- * 从大变小移出
- */
- ViewAction.ActionType_removescaleMaxToMin = "ActionType_removescaleMaxToMin";
- /**
- * 没有动效
- */
- ViewAction.ActionType_none = "ActionType_none";
- /********************************************** */
- /**
- * 从右边移动到中央
- */
- ViewAction.ActionType_addmoveToMiddle = "ActionType_addmoveToMiddle";
- /**
- * 从最右边移出
- */
- ViewAction.ActionType_removemoveToRight = "ActionType_removemoveToRight";
- /**
- * 从底部向上移动
- */
- ViewAction.ActionType_addmoveFromBottom = "ActionType_addmoveFromBottom";
- /**
- * 从上向底部移动
- */
- ViewAction.ActionType_addmoveFromup = "ActionType_addmoveFromup";
- return ViewAction;
- }());
- exports.ViewAction = ViewAction;
- },{}]},{},[44])
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkU6L0xheWFBaXIvTGF5YTIuMy4wL3Jlc291cmNlcy9hcHAvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNyYy9BZ2VuY3kvQWdlbmN5QmFzZUNvbnRyb2wudHMiLCJzcmMvQWdlbmN5L0FnZW5jeUluR2FtZS50cyIsInNyYy9BZ2VuY3kvQWdlbmN5TG9naW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeUxvdHRlcnkudHMiLCJzcmMvQWdlbmN5L0FnZW5jeU1haW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVNraW4udHMiLCJzcmMvQWdlbmN5L0FnZW5jeVRyaWFsLnRzIiwic3JjL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZS50cyIsInNyYy9DRkcvQnVpbGRDRkcudHMiLCJzcmMvQ0ZHL0dhbWVDRkcudHMiLCJzcmMvQ0ZHL0xldmVsQ0ZHLnRzIiwic3JjL0NGRy9Mb3R0ZXJ5Q0ZHLnRzIiwic3JjL0NGRy9OcGNDRkcudHMiLCJzcmMvQ0ZHL1JvbGVDRkcudHMiLCJzcmMvQ29uZmlnL0Fzc2V0UGF0aC50cyIsInNyYy9Db25maWcvUmVjQ29uZmlncy50cyIsInNyYy9Db250cm9sL0Fzc2V0TWFuYWdlci50cyIsInNyYy9Db250cm9sL0F1ZGlvQ29udHJvbC50cyIsInNyYy9Db250cm9sL0Nvbm5lY3RDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvRGF0ZUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9HYW1lU3RhdGVDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvTGF5b3V0Q29udHJvbC50cyIsInNyYy9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9QYW5lbEJhc2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUGFuZWxDaGlsZENvbnRyb2wudHMiLCJzcmMvQ29udHJvbC9Qb29sTWFuYWdlci50cyIsInNyYy9Db250cm9sL1Jlc0RhdGFDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvUmVzb3VyY2VDb250cm9sLnRzIiwic3JjL0NvbnRyb2wvU2NlbmVDb250cm9sLnRzIiwic3JjL0RhdGEvQ29tcG9uZW50RXZlbnREYXRhLnRzIiwic3JjL0RhdGEvRGF0YUluZm9CYXNlLnRzIiwic3JjL0RhdGEvTG9jYWxEYXRhLnRzIiwic3JjL0RhdGEvUm9sZURhdGEudHMiLCJzcmMvRGF0YS9Ta2luRGF0YS50cyIsInNyYy9EYXRhL1VzZXJEYXRhSW5mby50cyIsInNyYy9EYXRhL1VzZXJJbmZvRXZlbnQudHMiLCJzcmMvR2FtZUNvbnRlbnRzLnRzIiwic3JjL0dhbWUvQ2FtZXJhTWFuYWdlci50cyIsInNyYy9HYW1lL05wY1NjcmlwdC50cyIsInNyYy9HYW1lL1BsYXllci50cyIsInNyYy9HbG9iYWwudHMiLCJzcmMvR2xvYmFsV2FpdGluZy50cyIsInNyYy9Kb3lzdGlja01vZHVsZS50cyIsInNyYy9NYWluLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyUG9vbC50cyIsInNyYy9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlLnRzIiwic3JjL1ByZWZhYkNvbnRyb2wvR2FtZVBvb2wudHMiLCJzcmMvUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpYy50cyIsInNyYy9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyLnRzIiwic3JjL1B1c2gvQmFvS3VhbkdhbWVWaWV3LnRzIiwic3JjL1B1c2gvQ2hvdXRpUGFuVmlldy50cyIsInNyYy9QdXNoL0NwYURvd25zVmlldy50cyIsInNyYy9QdXNoL0NwYUV2ZW50LnRzIiwic3JjL1B1c2gvQ3BhSXRlbS50cyIsInNyYy9QdXNoL1JlY29tbWVuZFZpZXcudHMiLCJzcmMvUHVzaC9TaGl3YW50dWlqaWFuVmlldy50cyIsInNyYy9QdXNoL1R1aWppYW5WaWV3LnRzIiwic3JjL1RpbWUvVGltZVV0aWxzLnRzIiwic3JjL1RpbWUvVGltZXJTZXJ2aWNlLnRzIiwic3JjL1RpbWUvVGltZXNUYW1wZXIudHMiLCJzcmMvVmlldy9Db21wbGV0ZVBhbmVsLnRzIiwic3JjL1ZpZXcvRWdnUGFuZWwudHMiLCJzcmMvVmlldy9HaWZ0Vmlldy50cyIsInNyYy9WaWV3L0dsb2JhbFRpcFBhbmVsLnRzIiwic3JjL1ZpZXcvTG9hZGluZ1BhbmVsLnRzIiwic3JjL1ZpZXcvTG90dGVyeVBhbmVsLnRzIiwic3JjL1ZpZXcvTWFpblBhbmVsLnRzIiwic3JjL1ZpZXcvU2tpblBhbmVsLnRzIiwic3JjL1ZpZXcvVHJpYWxQYW5lbC50cyIsInNyYy9WaWV3L1ZpZXdNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL0ZZSERfU2RrLnRzIiwic3JjL1dYU0RLL0d1YW5nR2FvLnRzIiwic3JjL1dYU0RLL05ldHdvcmtNYW5hZ2VyLnRzIiwic3JjL1dYU0RLL1BsYXRmcm9tVHlwZS50cyIsInNyYy9XWFNESy9QbGF5ZXJBY2NvdW50LnRzIiwic3JjL1dYU0RLL1JlY29yZE1hbmFnZXIudHMiLCJzcmMvV1hTREsvU2RrLnRzIiwic3JjL1dYU0RLL1NlcnZlclNvY2tldC50cyIsInNyYy9XWFNESy9Tb2NrZXROb2ZpZnkudHMiLCJzcmMvV1hTREsvV0VDSEFURVZFTlQudHMiLCJzcmMvV1hTREsvV1hHYW1lUGxhdGZvcm0udHMiLCJzcmMvV1hTREsvcGluZ3RhaXV0aWxzLnRzIiwic3JjL1dYU0RLL3R0YWQudHMiLCJzcmMvdXRpbHMvRGlzUGF0Y2hlck9uLnRzIiwic3JjL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyLnRzIiwic3JjL3V0aWxzL0dhbWVTdGF0ZS50cyIsInNyYy91dGlscy9HYW1lVXRpbHMudHMiLCJzcmMvdXRpbHMvR2xvYmFsVGlwLnRzIiwic3JjL3V0aWxzL0xFdmVudC50cyIsInNyYy91dGlscy9MYXlPVVQudHMiLCJzcmMvdXRpbHMvU2luZ2xldG9uLnRzIiwic3JjL3V0aWxzL1NraW5JdGVtLnRzIiwic3JjL3V0aWxzL1ZpZXdBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsNERBQXlEO0FBQ3pELGdFQUErRDtBQUMvRCxnREFBNkM7QUFDN0Msc0RBQW1EO0FBQ25ELDZDQUEwQztBQUUxQzs7RUFFRTtBQUNGO0lBQXVDLHFDQUFTO0lBTTVDO1FBQUEsWUFDSSxpQkFBTyxTQUdWO1FBRkcsS0FBSSxDQUFDLFdBQVcsR0FBRyx5QkFBVyxDQUFDLFFBQVEsQ0FBQztRQUN4QyxLQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0lBQ3BCLENBQUM7SUFDUyxvQ0FBUSxHQUFsQjtJQUdBLENBQUM7SUFFRCxnQkFBZ0I7SUFDUix5Q0FBYSxHQUFyQjtRQUNJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUk7UUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPO1FBQ1AsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRixLQUFLO1FBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEksS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRyxNQUFNO1FBQ04sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLElBQUk7UUFDSixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNELGNBQWM7UUFDZCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMs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LFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDeEMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsUUFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDdkMsY0FBYyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxTQUFTLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUU7UUFDN0MsV0FBVyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDMUMsZUFBZSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDOUMsVUFBVSxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7UUFDekMsU0FBUyxFQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLFNBQVMsRUFBQyxJQUFJLEVBQUU7S0FDMUMsQ0FBQztJQTJOUCxrQkFBQztDQWxURCxBQWtUQyxJQUFBO0FBbFRZLGtDQUFXOzs7O0FDSHhCLGtFQUErRDtB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R0FBRyxLQUFLLENBQUM7U0FDbkM7UUFDRCxtQkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELG9DQUFZLEdBQVo7UUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELG9DQUFZLEdBQVo7UUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVTLGlDQUFTLEdBQW5CO1FBRUksSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsU0FBUyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBSyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBRSxJQUFJLENBQUMsYUFBYSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxJ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QUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRixLQUFLO1FBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEksS0FBSztRQUNMLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsTUFBTTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRyxNQUFNO1FBQ04sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFFLElBQUk7UUFDSixJ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UUFBUSxHQUFHLEdBQUcsQ0FBQztRQUN6QixTQUFTLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUM1QixJQUFJLFFBQVEsR0FBeUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RSxTQUFTLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztJQUN2QyxDQUFDO0lBMUNEOztPQUVHO0lBQ0ksc0NBQTJCLEdBQVUsNkJBQTZCLENBQUM7SUFFMUU7O09BRUc7SUFDSSx5Q0FBOEIsR0FBVSxnQ0FBZ0MsQ0FBQztJQUVoRjs7T0FFRztJQUNJLDBCQUFlLEdBQVUsaUJBQWlCLENBQUM7SUErQmxELGtEQUFrRDtJQUdsRDs7T0FFRztJQUNJLHFDQUEwQixHQUFRLDRCQUE0QixDQUFDO0lBQ3RFOztPQUVHO0lBQ0ksdUNBQTRCLEdBQVUsOEJBQThCLENBQUM7SUFFNUU7O09BRUc7SUFDSSx1Q0FBNEIsR0FBUSw4QkFBOEIsQ0FBQztJQUMxRTs7T0FFRztJQUNJLG1DQUF3QixHQUFRLDBCQUEwQixDQUFDO0lBS3RFLGlCQUFDO0NBaEdELEFBZ0dDLElBQUE7QUFoR1ksZ0NBQVUiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbiAgICB9O1xyXG59KSgpO1xyXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtTaW5nbGV0b259IGZyb20gXCIuLi91dGlscy9TaW5nbGV0b25cIjtcclxuaW1wb3J0IHtTZXJ2ZXJTb2NrZXR9IGZyb20gXCIuLi9XWFNESy9TZXJ2ZXJTb2NrZXRcIjtcclxuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEFnZW5jeUJhc2VDb250cm9sIGV4dGVuZHMgU2luZ2xldG9uXHJcbntcclxuICAgIHByaXZhdGUgX29iamVjdFBvb2w6IFBhbmVsUmVzRGljO1xyXG5cclxuICAgIHByaXZhdGUgc3A6TGF5YS5TcHJpdGU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX29iamVjdFBvb2wgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZTtcclxuICAgICAgICB0aGlzLmluaXRTZWxmKCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioq5re35reGICovXHJcbiAgICBwcml2YXRlIGRyYXdTb21ldGhpbmcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zcCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcCk7XHJcbiAgICAgICAgLy/nlLvnur9cclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdMaW5lKDEwLCA1OCwgMTQ2LCA1OCwgXCIjZmYwMDAwXCIsIDMpO1xyXG4gICAgICAgIC8v55S76L+e57ut55u057q/XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3TGluZXMoMTc2LCA1OCwgWzAsIDAsIDM5LCAtNTAsIDc4LCAwLCAxMTcsIDUwLCAxNTYsIDBdLCBcIiNmZjAwMDBcIiwgNSk7XHJcbiAgICAgICAgLy/nlLvmm7Lnur9cclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdDdXJ2ZXMoMzUyLCA1OCwgWzAsIDAsIDE5LCAtMTAwLCAzOSwgMCwgNTgsIDEwMCwgNzgsIDAsIDk3LCAtMTAwLCAxMTcsIDAsIDEzNiwgMTAwLCAxNTYsIDBdLCBcIiNmZjAwMDBcIiwgNSk7XHJcbiAgICAgICAgLy/nlLvnn6nlvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdSZWN0KDEwLCAxNjYsIDE2NiwgOTAsIFwiI2ZmZmYwMFwiKTtcclxuICAgICAgICAvL+eUu+Wkmui+ueW9olxyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BvbHkoMjY0LCAxNjYsIFswLCAwLCA2MCwgMCwgNzguNDgsIDU3LCAzMCwgOTMuNDgsIC0xOC40OCwgNTddLCBcIiNmZmZmMDBcIik7XHJcbiAgICAgICAgLy/nlLvkuInop5LlvaJcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdQb2x5KDQwMCwgMTY2LCBbMCwgMTAwLCA1MCwgMCwgMTAwLCAxMDBdLCBcIiNmZmZmMDBcIik7XHJcbiAgICAgICAgLy/nlLvlnIZcclxuICAgICAgICB0aGlzLnNwLmdyYXBoaWNzLmRyYXdDaXJjbGUoOTgsIDMzMiwgNTAsIFwiIzAwZmZmZlwiKTtcclxuICAgICAgICAvL+eUu+aJh+W9olxyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BpZSgyNDAsIDI5MCwgMTAwLCAxMCwgNjAsIFwiIzAwZmZmZlwiKTtcclxuICAgICAgICAvL+e7mOWItuWchuinkuefqeW9ou+8jOiHquWumuS5iei3r+W+hFxyXG4gICAgICAgIHRoaXMuc3AuZ3JhcGhpY3MuZHJhd1BhdGgoNDAwLCAzMTAsIFtbXCJtb3ZlVG9cIiwgNSwgMF0sIFtcImxpbmVUb1wiLCAxMDUsIDBdLCBbXCJhcmNUb1wiLCAxMTAsIDAsIDExMCwgNSwgNV0sIFtcImxpbmVUb1wiLCAxMTAsIDU1XSwgW1wiYXJjVG9cIiwgMTEwLCA2MCwgMTA1LCA2MCwgNV0sIFtcImxpbmVUb1wiLCA1LCA2MF0sIFtcImFyY1RvXCIsIDAsIDYwLCAwLCA1NSwgNV0sIFtcImxpbmVUb1wiLCAwLCA1XSwgW1wiYXJjVG9cIiwgMCwgMCwgNSwgMCwgNV0sIFtcImNsb3NlUGF0aFwiXV0sIHtmaWxsU3R5bGU6IFwiIzAwZmZmZlwifSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKiAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIOazqOWGjOWFqOWxgOS+puWQrOS6i+S7tlxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBEaXNPbiggdHlwZTpzdHJpbmcsIGNhbGxiYWNrb2JqOmFueSwgY2FsbGJhY2tIYW5kbGVyOkZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2tvYmosIGNhbGxiYWNrSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIOaKm+WHuuWFqOWxgOS6i+S7tiBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIERpc1RyaWdnZXIodHlwZTpzdHJpbmcsIGRhdGE6YW55ID0gbnVsbCk6dm9pZFxyXG5cdHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCB0eXBlLCBkYXRhICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTlhajlsYDkvqblkKzkuovku7ZcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIERpc09mZih0eXBlOnN0cmluZyxjYWxsYmFja29iajphbnksIGNhbGxiYWNrSGFuZGxlcjpGdW5jdGlvbik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2tvYmosIGNhbGxiYWNrSGFuZGxlciApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cCgpOiB2b2lkIHtcclxuICAgICAgICB2YXIgdGV4dEJveDpMYXlhLlNwcml0ZSA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG5cclxuICAgICAgICAvLyDpmo/mnLrmkYbmlL7mlofmnKxcclxuICAgICAgICB2YXIgdGV4dDpMYXlhLlRleHQ7XHJcbiAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IDEwMDA7IGkrKykge1xyXG4gICAgICAgICAgICB0ZXh0ID0gbmV3IExheWEuVGV4dCgpO1xyXG4gICAgICAgICAgICB0ZXh0LmZvbnRTaXplID0gMjA7XHJcbiAgICAgICAgICAgIHRleHQudGV4dCA9IChNYXRoLnJhbmRvbSgpICogMTAwKS50b0ZpeGVkKDApO1xyXG4gICAgICAgICAgICB0ZXh0LnJvdGF0aW9uID0gTWF0aC5yYW5kb20oKSAqIDM2MDtcclxuICAgICAgICAgICAgdGV4dC5jb2xvciA9IFwiI0NDQ0NDQ1wiO1xyXG5cclxuICAgICAgICAgICAgdGV4dC54ID0gTWF0aC5yYW5kb20oKSAqIExheWEuc3RhZ2Uud2lkdGg7XHJcbiAgICAgICAgICAgIHRleHQueSA9IE1hdGgucmFuZG9tKCkgKiBMYXlhLnN0YWdlLmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIHRleHRCb3guYWRkQ2hpbGQodGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v57yT5a2Y5Li66Z2Z5oCB5Zu+5YOPXHJcbiAgICAgICAgdGV4dEJveC5jYWNoZUFzID0gXCJiaXRtYXBcIjtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0ZXh0Qm94KTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKiogKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgcHJvdGVjdGVkIGdldFNpbmdsZVRvbihyZWY6YW55KTphbnlcclxuXHR7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX29iamVjdFBvb2wuZ2V0U2luZ2xlVG9uKHJlZik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHNlbmRNZXNzYWdlKCBhY3Q6c3RyaW5nLGRhdGE6YW55ID0gbnVsbCxpc1Nob3dXYWl0OmJvb2xlYW4gPSB0cnVlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFNlcnZlclNvY2tldC5JbnN0YW5jZS5zZW5kTWVzc2FnZShhY3QsIGRhdGEsIGlzU2hvd1dhaXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcm9sZURhdGE6Um9sZURhdGE7XHJcblxyXG4gICAgcHVibGljIGdldCBSb2xlRGF0YSgpOlJvbGVEYXRhXHJcbiAgICB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvbGVEYXRhKXtcclxuICAgICAgICAgICAgdGhpcy5yb2xlRGF0YSA9IFJvbGVEYXRhLkluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5yb2xlRGF0YTtcclxuICAgIH1cclxufSIsImltcG9ydCB7QWdlbmN5QmFzZUNvbnRyb2x9IGZyb20gXCIuL0FnZW5jeUJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4uL1ZpZXcvVmlld01hbmFnZXJcIjtcclxuaW1wb3J0IHtDb21wbGV0ZVBhbmVsfSBmcm9tIFwiLi4vVmlldy9Db21wbGV0ZVBhbmVsXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvR2FtZVN0YXRlQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7U2NlbmVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBQUk9UT0NPTFMsIE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL05ldHdvcmtNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQge0FnZW5jeVRyaWFsfSBmcm9tIFwiLi9BZ2VuY3lUcmlhbFwiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5pbXBvcnQgRnJpZW5kSW52aXRlVmlldyBmcm9tIFwiLi4vUHVzaC9GcmllbmRJbnZpdGVWaWV3XCI7XHJcbmltcG9ydCBHaWZ0VmlldyBmcm9tIFwiLi4vVmlldy9HaWZ0Vmlld1wiO1xyXG5pbXBvcnQgQ2hvdXRpUGFuVmlldyBmcm9tIFwiLi4vUHVzaC9DaG91dGlQYW5WaWV3XCI7XHJcbmltcG9ydCB7IFJlY29yZE1hbmFnZXIgfSBmcm9tIFwiLi4vV1hTREsvUmVjb3JkTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBNYWluUGFuZWwgfSBmcm9tIFwiLi4vVmlldy9NYWluUGFuZWxcIjtcclxuXHJcbmV4cG9ydCAgY2xhc3MgQWdlbmN5SW5HYW1lIGV4dGVuZHMgQWdlbmN5QmFzZUNvbnRyb2wgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lJbkdhbWVcIjtcclxuICAgIHN0YXRpYyBnYW1lbnVtOm51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlbGYoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5EaXNPbiggR2FtZVN0YXRlLmVuZCx0aGlzLHRoaXMuZW5kZ2FtZUhhbmRsZXIgKTtcclxuICAgICAgICB0aGlzLkRpc09uKEdhbWVTdGF0ZS5yZXZpdmUsdGhpcyx0aGlzLlJldml2ZWdhbWVIYW5kbGVyKTtcclxuICAgICAgICB0aGlzLkRpc09uKEdhbWVTdGF0ZS5sb3NlLHRoaXMsdGhpcy5Mb3NlZ2FtZUhhbmRsZXIpO1xyXG4gICAgfVxyXG4gICAgLyoq5aSN5rS755WM6Z2iICovXHJcbiAgICBwcml2YXRlIFJldml2ZWdhbWVIYW5kbGVyKCk6dm9pZHtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMTAwMCx0aGlzLHRoaXMucmV2aXZlVmlldyk7XHJcbiAgICB9XHJcbiAgICAvKirlpLHotKXnlYzpnaIgKi9cclxuICAgIHByaXZhdGUgTG9zZWdhbWVIYW5kbGVyKCk6dm9pZHtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMTAwMCx0aGlzLHRoaXMubG9zZVZpZXcpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSByZXZpdmVWaWV3KCl7XHJcbiAgICAgICAgUmVjb3JkTWFuYWdlci5JbnN0YW5jZS5SZWNvcmRTdG9wKCk7XHJcbiAgICAgICAgdmFyIG5vd21pbmdjdmk6bnVtYmVyID0gR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5ub3dNaW5nQ2k7XHJcbiAgICAgICAgdmFyIGdldEdvbGQ6bnVtYmVyID0gMDtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuaJk+W8gOe7k+eul+eVjOmdoijlpI3mtLspXCIpO1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggQ29tcGxldGVQYW5lbCxnZXRHb2xkICk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGxvc2VWaWV3KCk6dm9pZHtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0b3AoKTtcclxuICAgICAgICB2YXIgbm93bWluZ2N2aTpudW1iZXIgPSBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLm5vd01pbmdDaTtcclxuICAgICAgICB2YXIgZ2V0R29sZDpudW1iZXIgPSAwO1xyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5omT5byA57uT566X55WM6Z2iKOWksei0pSlcIik7XHJcbiAgICAgICAgdGhpcy5SZWNyb3BMZXZlbEVuZCggZmFsc2UgKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENvbXBsZXRlUGFuZWwsZ2V0R29sZCApO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBlbmRnYW1lSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBSZWNvcmRNYW5hZ2VyLkluc3RhbmNlLlJlY29yZFN0b3AoKTtcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoIDEwMDAsdGhpcyx0aGlzLnN0YXJ0RW5kVmlldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0RW5kVmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbm93bWluZ2N2aTpudW1iZXIgPSBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLm5vd01pbmdDaTtcclxuICAgICAgICB2YXIgZ2V0R29sZDpudW1iZXIgPSAwO1xyXG4gICAgICAgIGlmKCBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmVuZEdhbWVQbGF5ZXJBcnIubGVuZ3RoID09IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZ2V0R29sZCA9IHRoaXMuUm9sZURhdGEubGV2ZWxjZmcud2luR29sZDtcclxuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5ri45oiP6IOc5YipKVwiKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNyb3BMZXZlbEVuZCggdHJ1ZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIoIHRoaXMuUm9sZURhdGEubGV2ZWxjZmcuZmFpbEdvZCApO1xyXG4gICAgICAgICAgICBnZXRHb2xkID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggTnVtYmVyKGFyclswXSksTnVtYmVyKGFyclsxXSkgKTtcclxuICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLmiZPlvIDnu5PnrpfnlYzpnaIo5ri45oiP5aSx6LSlKVwiKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNyb3BMZXZlbEVuZCggZmFsc2UgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBDb21wbGV0ZVBhbmVsLGdldEdvbGQgKTtcclxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JbnN0YW5jZS5hZGQoIENob3V0aVBhblZpZXcsMiApO1xyXG4gICAgfVxyXG5cclxuICAgIFJlY3JvcExldmVsRW5kKF93aW46Ym9vbGVhbilcclxuICAgIHtcclxuICAgICAgICAvLyBpZighTGF5YS5Ccm93c2VyLm9uV2VpWGluKXJldHVybjtcclxuICAgICAgICAvLyB2YXIgc3RhZ2VpZCA9IHRoaXMuUm9sZURhdGEuTGV2ZWxJRC50b1N0cmluZygpO1xyXG4gICAgICAgIC8vIHZhciB1c2VpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuVXNlSWQ7XHJcbiAgICAgICAgLy8gdmFyIHN0YWdlbmFtZSA9IFwi56ysXCIgKyB0aGlzLlJvbGVEYXRhLkxldmVsSUQgKyBcIuWFs1wiO1xyXG4gICAgICAgIC8vIGlmKF93aW4pXHJcbiAgICAgICAgLy8ge1xyXG4gICAgICAgIC8vICAgICBXeEFwaS5sZXZlbFN1Y2Nlc3Moc3RhZ2VpZCxzdGFnZW5hbWUsc3RhZ2VpZCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2VcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICAgIHZhciBlcXVpcGlkID0gdGhpcy5Sb2xlRGF0YS5DaGFyYWN0ZXJJRC50b1N0cmluZygpO1xyXG4gICAgICAgIC8vICAgICB2YXIgY2FybmFtZSA9IHRoaXMuUm9sZURhdGEucm9sZUNmZy5uYW1lO1xyXG4gICAgICAgIC8vICAgICBXeEFwaS5sZXZlbEZhaWwoc3RhZ2VpZCxzdGFnZW5hbWUsc3RhZ2VpZCxcIjBcIixjYXJuYW1lKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJldHVybm1haW52aWV3KHdpbj8pOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiAod2luICYmIFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuV2hpdGVVc2VyKSB7XHJcbiAgICAgICAgICAgIGxldCByYW4gPSBNYXRoLnJhbmRvbSgpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuivr+inpuWHoOeOh+S4ui0tLVwiLCByYW4pO1xyXG4gICAgICAgICAgICBpZiAocmFuIDw9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuRW5kQ2hlYXQpIHtcclxuICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChHaWZ0Vmlldyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUgPSAxO1xyXG4gICAgICAgICAgICBHYW1lU3RhdGUucmVjb3Jkc2NyZWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLkNsb3NlR2FtZU92ZXJFZmZlY3QoKTtcclxuICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoQ29tcGxldGVQYW5lbCk7XHJcbiAgICAgICAgICAgIHRoaXMuRGlzVHJpZ2dlcihHYW1lU3RhdGUucmV0dXJuTWFpblZpZXcpO1xyXG4gICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuU2hvd1RoZUdhbWVTY2VuZSgpO1xyXG4gICAgICAgICAgICB2YXIgYWdlbmN5dHJpYWw6IEFnZW5jeVRyaWFsID0gdGhpcy5nZXRTaW5nbGVUb24oQWdlbmN5VHJpYWwpO1xyXG4gICAgICAgICAgICBpZiAoYWdlbmN5dHJpYWwuaXNzaGl5b25naW5nKSAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLkNyZWF0ZVBsYXllcih0aGlzLlJvbGVEYXRhLnJvbGVDZmcpO1xyXG4gICAgICAgICAgICAgICAgYWdlbmN5dHJpYWwuaXNzaGl5b25naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgR2FtZVN0YXRlLmZ1aHVvY2lzaHUgPSAxO1xyXG4gICAgICAgICAgICBHYW1lU3RhdGUucmVjb3Jkc2NyZWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gZmFsc2U7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLkNsb3NlR2FtZU92ZXJFZmZlY3QoKTtcclxuICAgICAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoQ29tcGxldGVQYW5lbCk7XHJcbiAgICAgICAgICAgIHRoaXMuRGlzVHJpZ2dlcihHYW1lU3RhdGUucmV0dXJuTWFpblZpZXcpO1xyXG4gICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuU2hvd1RoZUdhbWVTY2VuZSgpO1xyXG4gICAgICAgICAgICB2YXIgYWdlbmN5dHJpYWw6IEFnZW5jeVRyaWFsID0gdGhpcy5nZXRTaW5nbGVUb24oQWdlbmN5VHJpYWwpO1xyXG4gICAgICAgICAgICBpZiAoYWdlbmN5dHJpYWwuaXNzaGl5b25naW5nKSAge1xyXG4gICAgICAgICAgICAgICAgU2NlbmVDb250cm9sLkluc3RhbmNlLkNyZWF0ZVBsYXllcih0aGlzLlJvbGVEYXRhLnJvbGVDZmcpO1xyXG4gICAgICAgICAgICAgICAgYWdlbmN5dHJpYWwuaXNzaGl5b25naW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoR2FtZVN0YXRlLkdhbWVOdW0lMyA9PSAwKXtcclxuICAgICAgICAgICAgTWFpblBhbmVsLmluc3RhbmNlLnNraW5jbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL+aJk+W8gOWlveWPi+mCgOivt+eVjOmdolxyXG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChGcmllbmRJbnZpdGVWaWV3KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEFnZW5jeUluR2FtZS5nYW1lbnVtICsrO1xyXG4gICAgICAgIHZhciBzdGFnZWlkID0gdGhpcy5Sb2xlRGF0YS5nZXROb3dTZXJ2ZXJMZXZlbCgpLnRvU3RyaW5nKCkudG9TdHJpbmcoKTtcclxuICAgICAgICB2YXIgc3RhZ2VuYW1lID0gXCLnrKxcIiArIHN0YWdlaWQgKyBcIuWFs1wiO1xyXG4gICAgICAgIHZhciB1c2VpZCA9IFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuVXNlSWQ7XHJcbiAgICAgICAgV3hBcGkubGV2ZWxTdGFydChzdGFnZWlkLHN0YWdlbmFtZSx1c2VpZCk7XHJcbiAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5zdGFydEdhbWUoKTtcclxuICAgIH1cclxuICAgXHJcbn0iLCJpbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7TG9hZGluZ1BhbmVsfSBmcm9tIFwiLi4vVmlldy9Mb2FkaW5nUGFuZWxcIjtcclxuXHJcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuL0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCB7V0VDSEFURVZFTlR9IGZyb20gXCIuLi9XWFNESy9XRUNIQVRFVkVOVFwiO1xyXG5pbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0FnZW5jeU1haW59IGZyb20gXCIuL0FnZW5jeU1haW5cIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vQ0ZHL0xldmVsQ0ZHXCI7XHJcbmltcG9ydCBCdWlsZENGRyBmcm9tIFwiLi4vQ0ZHL0J1aWxkQ0ZHXCI7XHJcbmltcG9ydCBOcGNDRkcgZnJvbSBcIi4uL0NGRy9OcGNDRkdcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uL0NGRy9HYW1lQ0ZHXCI7XHJcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4vQWdlbmN5U2tpblwiO1xyXG5pbXBvcnQgeyBXeEFwaSB9IGZyb20gXCIuLi9XWFNESy9TZGtcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL05ldHdvcmtNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IE1haW5Db25maWcgfSBmcm9tIFwiLi4vTWFpbkNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xyXG5pbXBvcnQge0FnZW5jeUxvdHRlcnl9IGZyb20gXCIuL0FnZW5jeUxvdHRlcnlcIjtcclxuaW1wb3J0IHsgRllIRF9TZGsgfSBmcm9tIFwiLi4vV1hTREsvRllIRF9TZGtcIjtcclxuaW1wb3J0IHsgU2hhcmVVdGlsIH0gZnJvbSBcIi4uL1dYU0RLL1NoYXJlVXRpbFwiO1xyXG5pbXBvcnQgeyBHdWFuZ0dhbyB9IGZyb20gXCIuLi9XWFNESy9HdWFuZ0dhb1wiO1xyXG5pbXBvcnQgeyB0dGFkIH0gZnJvbSBcIi4uL1dYU0RLL3R0YWRcIjtcclxuaW1wb3J0IHsgQXNzZXRNYW5hZ2VyIH0gZnJvbSBcIi4uL0NvbnRyb2wvQXNzZXRNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWdlbmN5TG9naW4gZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbCBcclxue1xyXG4gICAgc3RhdGljIGtleTpzdHJpbmcgPSBcIkFnZW5jeUxvZ2luXCI7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLkRpc09uKCBXRUNIQVRFVkVOVC5XRUNIQVRFVkVOVF9sb2dpblN1Y2NlZWQsdGhpcyx0aGlzLlN1Y2Nlc3MgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgTG9naW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBMb2FkaW5nUGFuZWwgKTtcclxuICAgICAgICB0aGlzLmxvZ2lucHJvZ3Jlc3MoMCk7XHJcbiAgICAgICAgLy8gaWYoTGF5YS5Ccm93c2VyLm9uV2VpWGluKVxyXG4gICAgICAgIC8vIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5Mb2dpbldYKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGVsc2VcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgICAgIHRoaXMuTG9naW5Mb2NhbCgpO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuICAgIExvZ2luV1goKVxyXG4gICAge1xyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5byA5aeL5b6u5L+h55m75b2VXCIpO1xyXG4gICAgICAgIFd4QXBpLldYTG9naW4oKHJlcykgPT4gXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gXCJlcnJvclwiKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuW+ruS/oeeZu+W9leaIkOWKn1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImhwbG9naW46XCIgKyBcInF1ZXJ5Y2hhbm5lbC0+XCIrIFd4QXBpLnF1ZXJ5Y2hhbm5lbCArIFwiIHJlZmVycmVySW5mb2FwcElkLT5cIiArIFd4QXBpLnJlZmVycmVySW5mb2FwcElkKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkxvZ2luTG9jYWwoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvq7kv6HnmbvlvZXlpLHotKVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Mb2dpbldYKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIExvZ2luTG9jYWwocmVzID0gbnVsbCkgXHJcbiAgICB7XHJcbiAgICAgICAgV3hBcGkucmVjb3JkQWxkRXZlbnQoXCLlvIDlp4vmnKzlnLDnmbvlvZVcIik7XHJcbiAgICAgICAgaWYocmVzKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmV3IFBsYXllckFjY291bnQocmVzLmNvZGUsIFwiXCIsIFwiXCIsIDAsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFd4QXBpLnNoYXJlT3BlbklkLCBXeEFwaS5zaGFyZU9wZW5JZCxHbG9iYWwuZ2FtZVZlcnNpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBOZXR3b3JrTWFuYWdlci5JbnN0YW5jZS5sb2dpbihudWxsLCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuTG9naW5Db21wbGV0ZSksIG51bGwpO1xyXG4gICAgICAgIC8vdGhpcy5Mb2FkU2JwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgTG9naW5Db21wbGV0ZSgpIFxyXG4gICAge1xyXG4gICAgICAgIFd4QXBpLnJlY29yZEFsZEV2ZW50KFwi5pys5Zyw5pyN5Yqh5Zmo55m75b2V5a6M5oiQLi4uXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNoYXJlVXRpbC5JbnN0YW5jZS5vblJlZ2lzdGVyKCk7XHJcbiAgICAgICAgLy8gR3VhbmdHYW8uSW5pdFZpZGVvKCk7XHJcbiAgICAgICAgV3hBcGkuYWxkU2VuZE9wZW5pZChQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLm9wZW5pZCk7XHJcbiAgICAgXHJcbiAgICAgICAgdGhpcy5TdWNjZXNzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2dpbnByb2dyZXNzKCB2YWx1ZTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGxvYWRpbmdQYW5lbDpMb2FkaW5nUGFuZWwgPSBWaWV3TWFuYWdlci5JbnN0YW5jZS5nZXRWaWV3KCBMb2FkaW5nUGFuZWwgKTtcclxuICAgICAgICBpZiggbG9hZGluZ1BhbmVsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRpbmdQYW5lbC5zaG93V29yZCggdmFsdWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBTdWNjZXNzKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUmVzb2x2ZURhdGEoICk7XHJcbiAgICAgICAgdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgICAgIHRoaXMuU3RhcnRNYWluKCk7XHJcbiAgICAgICAgdHRhZC5Jbml0QUQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFN0YXJ0TWFpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBjb25zb2xlLmxvZyggXCLlvZPliY3phY3nva7ooajmgLvlhbPljaHvvJpcIixMZXZlbENGRy52ZWMubGVuZ3RoICk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5TWFpbiApIGFzIEFnZW5jeU1haW4gKS5TdGFydE1haW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbmZpZ0NsYXNzOmFueSA9XHJcbiAgICB7XHJcbiAgICAgICAgUm9sZUNGRzpSb2xlQ0ZHLFxyXG4gICAgICAgIExldmVsQ0ZHOkxldmVsQ0ZHLFxyXG4gICAgICAgIEJ1aWxkQ0ZHOkJ1aWxkQ0ZHLFxyXG4gICAgICAgIE5wY0NGRzpOcGNDRkcsXHJcbiAgICAgICAgR2FtZUNGRzpHYW1lQ0ZHLFxyXG4gICAgICAgIExvdHRlcnlDRkc6TG90dGVyeUNGR1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kej5p6Q6YWN572u5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgUmVzb2x2ZURhdGEoKTpib29sZWFuIFxyXG4gICAge1xyXG4gICAgICAgIGxldCBieXRlRGF0YTphbnkgPSBQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50Lm5vd0NvbmZpZy5nYW1lQ29uZmlnWzBdLmNvbmZpZztcclxuICAgICAgICBpZiggYnl0ZURhdGEgJiYgYnl0ZURhdGEgIT0gXCJcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBieXRlRGF0YS5zcGxpdChcIiVmaWxlJVwiKTtcclxuICAgICAgICAgICAgdmFyIGk6bnVtYmVyO1xyXG4gICAgICAgICAgICB2YXIgbnVtczpudW1iZXIgPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IoIGk9MDtpPG51bXM7aSsrIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1hcnI6QXJyYXk8c3RyaW5nPiA9IGFycltpXS5zcGxpdChcIiVjZmclXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNsYTogYW55ID0gQWdlbmN5TG9naW4uY29uZmlnQ2xhc3NbaXRlbWFyclswXV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhLmluaXRDZmcoaXRlbWFyclsxXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5ri45oiP5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdERhdGEoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKSBhcyBBZ2VuY3lVc2VyTWVzc2FnZSApLmluaXQoKTtcclxuICAgICAgICAoIHRoaXMuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lTa2luICkgYXMgQWdlbmN5U2tpbiApLmluaXQoKTtcclxuICAgICAgICAoIHRoaXMuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lMb3R0ZXJ5ICkgYXMgQWdlbmN5TG90dGVyeSApLmluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgIFxyXG59IiwiaW1wb3J0IHtBZ2VuY3lCYXNlQ29udHJvbH0gZnJvbSBcIi4vQWdlbmN5QmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge0xvdHRlcnlQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvTG90dGVyeVBhbmVsXCI7XHJcbmltcG9ydCBMb3R0ZXJ5Q0ZHIGZyb20gXCIuLi9DRkcvTG90dGVyeUNGR1wiO1xyXG5pbXBvcnQgeyBHYW1lVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVV0aWxzXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4vQWdlbmN5U2tpblwiO1xyXG5cclxuZXhwb3J0ICBjbGFzcyBBZ2VuY3lMb3R0ZXJ5IGV4dGVuZHMgQWdlbmN5QmFzZUNvbnRyb2wgXHJcbntcclxuICAgIHN0YXRpYyBrZXk6c3RyaW5nID0gXCJBZ2VuY3lMb3R0ZXJ5XCI7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBpbml0KCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlblZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuYWRkKCBMb3R0ZXJ5UGFuZWwgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVBbmltYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGFuaTpMYXlhLkFuaW1hdGlvbiA9IG5ldyBMYXlhLkFuaW1hdGlvbigpO1xyXG4gICAgICAgIC8vIGFuaS5sb2FkQXRsYXModGhpcy5BbmlDb25mUGF0aCk7IC8vIOWKoOi9veWbvumbhuWKqOeUu1xyXG4gICAgICAgIGFuaS5pbnRlcnZhbCA9IDMwOyAvLyDorr7nva7mkq3mlL7pl7TpmpTvvIjljZXkvY3vvJrmr6vnp5LvvIlcclxuICAgICAgICBhbmkuaW5kZXggPSAxOyAvLyDlvZPliY3mkq3mlL7ntKLlvJVcclxuICAgICAgICBhbmkucGxheSgpOyAvLyDmkq3mlL7lm77pm4bliqjnlLtcclxuXHJcbiAgICAgICAgLy8g6I635Y+W5Yqo55S755qE6L6555WM5L+h5oGvXHJcbiAgICAgICAgdmFyIGJvdW5kczpMYXlhLlJlY3RhbmdsZSA9IGFuaS5nZXRHcmFwaGljQm91bmRzKCk7XHJcbiAgICAgICAgYW5pLnBpdm90KGJvdW5kcy53aWR0aCAvIDIsIGJvdW5kcy5oZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgYW5pLnBvcyhMYXlhLnN0YWdlLndpZHRoIC8gMiwgTGF5YS5zdGFnZS5oZWlnaHQgLyAyKTtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChhbmkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbUFuaVBhdGg6c3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBtU3RhcnRYOm51bWJlciA9IDQwMDtcclxuICAgIHByaXZhdGUgbVN0YXJ0WTpudW1iZXIgPSA1MDA7XHJcbiAgICBwcml2YXRlIG1GYWN0b3J5OkxheWEuVGVtcGxldDtcclxuICAgIHByaXZhdGUgbUFjdGlvbkluZGV4Om51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG1DdXJySW5kZXg6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgbUFybWF0dXJlOkxheWEuU2tlbGV0b247XHJcbiAgICBwcml2YXRlIG1DdXJyU2tpbkluZGV4Om51bWJlciA9IDA7XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0cmV3YXJkKCBjZmc6TG90dGVyeUNGRyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggY2ZnIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggY2ZnLnR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Sb2xlRGF0YS5Nb25leSArPSBOdW1iZXIoY2ZnLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBHbG9iYWxUaXAuSW5zdGFuY2Uuc2hvd1dvcmRUaXBzKCBcIuaBreWWnOiOt+W+l1wiICsgY2ZnLnZhbHVlICsgXCLph5HluIHvvIFcIiApO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvbGVjZmc6Um9sZUNGRyA9IFJvbGVDRkcuZGljdFsgY2ZnLnZhbHVlIF07XHJcbiAgICAgICAgICAgICAgICAgICAgKCB0aGlzLmdldFNpbmdsZVRvbiggQWdlbmN5U2tpbiApIGFzIEFnZW5jeVNraW4gKS5zZXRSb2xlU3RhdGUoIHJvbGVjZmcsMSApO1xyXG4gICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi5oGt5Zac6I635b6X6KeS6ImyXCIgKyByb2xlY2ZnLnJvbGVuYW1lICk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIEdldFJld2FyZCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSAwO1xyXG4gICAgICAgIHZhciBkaWN0czpBcnJheTxMb3R0ZXJ5Q0ZHPiA9IExvdHRlcnlDRkcudmVjO1xyXG4gICAgICAgIHZhciBtYXhOdW06bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgY2ZnOkxvdHRlcnlDRkc7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoIGk9MDtpPGRpY3RzLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2ZnID0gZGljdHNbaV07XHJcbiAgICAgICAgICAgIG1heE51bSArPSBjZmcud2VpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc29yZHZhbHVlOm51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDEsbWF4TnVtICk7XHJcbiAgICAgICAgdmFyIHRvdGFsbnVtOm51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgZGljdHMubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjZmcgPSBkaWN0c1tpXTtcclxuICAgICAgICAgICAgdG90YWxudW0gKz0gY2ZnLndlaWdodDtcclxuICAgICAgICAgICAgaWYoIHRvdGFsbnVtID49IHNvcmR2YWx1ZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHB1YmxpYyBzdGFydEZ1bigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm1BbmlQYXRoID0gXCJyZXMvc3BpbmUvc3BpbmVSZXMxL2RyYWdvbi5za1wiO1xyXG4gICAgICAgIC8vIHRoaXMubUZhY3RvcnkgPSBuZXcgVGVtcGxldCgpO1xyXG4gICAgICAgIC8vIHRoaXMubUZhY3Rvcnkub24oRXZlbnQuQ09NUExFVEUsIHRoaXMsIHRoaXMucGFyc2VDb21wbGV0ZSk7XHJcbiAgICAgICAgLy8gdGhpcy5tRmFjdG9yeS5vbihFdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkVycm9yKTtcclxuICAgICAgICAvLyB0aGlzLm1GYWN0b3J5LmxvYWRBbmkodGhpcy5tQW5pUGF0aCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG9uRXJyb3IoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJlcnJvclwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcGFyc2VDb21wbGV0ZSgpOnZvaWQge1xyXG4gICAgICAgIC8v5Yib5bu65qih5byP5Li6Me+8jOWPr+S7peWQr+eUqOaNouijhVxyXG4gICAgICAgIHRoaXMubUFybWF0dXJlID10aGlzLm1GYWN0b3J5LmJ1aWxkQXJtYXR1cmUoMSk7XHJcbiAgICAgICAgdGhpcy5tQXJtYXR1cmUueCA9IHRoaXMubVN0YXJ0WDtcclxuICAgICAgICB0aGlzLm1Bcm1hdHVyZS55ID0gdGhpcy5tU3RhcnRZO1xyXG4gICAgICAgIHRoaXMubUFybWF0dXJlLnNjYWxlKDAuNSwgMC41KTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMubUFybWF0dXJlKTtcclxuICAgICAgICAvLyB0aGlzLm1Bcm1hdHVyZS5vbihFdmVudC5TVE9QUEVELCB0aGlzLCB0aGlzLmNvbXBsZXRlSGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5wbGF5KCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHByaXZhdGUgY29tcGxldGVIYW5kbGVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMucGxheSgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIHBsYXkoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5tQ3VyckluZGV4Kys7XHJcbiAgICAgICAgaWYgKHRoaXMubUN1cnJJbmRleCA+PSB0aGlzLm1Bcm1hdHVyZS5nZXRBbmltTnVtKCkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm1DdXJySW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1Bcm1hdHVyZS5wbGF5KHRoaXMubUN1cnJJbmRleCxmYWxzZSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxufSIsImltcG9ydCB7QWdlbmN5QmFzZUNvbnRyb2x9IGZyb20gXCIuL0FnZW5jeUJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7UmVzb3VyY2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtMb2FkaW5nUGFuZWx9IGZyb20gXCIuLi9WaWV3L0xvYWRpbmdQYW5lbFwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc0RhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7TWFpblBhbmVsfSBmcm9tIFwiLi4vVmlldy9NYWluUGFuZWxcIjtcclxuaW1wb3J0IHtTY2VuZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1NjZW5lQ29udHJvbFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtSb2xlRGF0YX0gZnJvbSBcIi4uL0RhdGEvUm9sZURhdGFcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQge1dYR2FtZVBsYXRmb3JtfSBmcm9tIFwiLi4vV1hTREsvV1hHYW1lUGxhdGZvcm1cIjtcclxuaW1wb3J0IFJvbGVDRkcgZnJvbSBcIi4uL0NGRy9Sb2xlQ0ZHXCI7XHJcbmltcG9ydCBOcGNDRkcgZnJvbSBcIi4uL0NGRy9OcGNDRkdcIjtcclxuaW1wb3J0IHtMb2NhbERhdGFDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9Mb2NhbERhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQge1Byb3BNYW5hZ2VyfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9Qcm9wTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5pbXBvcnQgR2lmdFZpZXcgZnJvbSBcIi4uL1ZpZXcvR2lmdFZpZXdcIjtcclxuaW1wb3J0IHsgQXNzZXRNYW5hZ2VyIH0gZnJvbSBcIi4uL0NvbnRyb2wvQXNzZXRNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWdlbmN5TWFpbiBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5TWFpblwiO1xyXG4gICAgXHJcbiAgICBwcml2YXRlIF9sb2FkamQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2FsbGpkOm51bWJlciA9IDA7XHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcclxuICAgIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFN0YXJ0TWFpbigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2FkamQgPSAwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gMjA7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UubG9hZFN1YnBhY2thZ2UoIFwic3VicGFja2FnZVwiLHRoaXMsdGhpcy5zdWIxY29tcGxldGUsdGhpcy5sb2FkcHJvZ3Jlc3MsbnVsbCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3ViMWNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xvYWRqZCA9IDIwO1xyXG4gICAgICAgIHRoaXMuX2FsbGpkID0gMzA7XHJcbiAgICAgICAgV1hHYW1lUGxhdGZvcm0uSW5zdGFuY2UubG9hZFN1YnBhY2thZ2UoIFwic3VicGFja2FnZTFcIix0aGlzLHRoaXMuU3VicGFja2FnZU92ZXIsdGhpcy5sb2FkcHJvZ3Jlc3MsbnVsbCApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBzY2VuZTpMYXlhLlNjZW5lM0Q7XHJcbiAgICBwdWJsaWMgb25Db21wbGV0ZSgpIHtcclxuXHRcdC8v5re75Yqg54i257qn54y05a2QXHJcblx0XHR2YXIgZHVkZSA9IHRoaXMuc2NlbmUuYWRkQ2hpbGQoTGF5YS5Mb2FkZXIuZ2V0UmVzKFwicmVzL3RocmVlRGltZW4vc2tpbk1vZGVsL2R1ZGUvZHVkZS5saFwiKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuXHRcdC8v57yp5pS+XHJcblx0XHR2YXIgc2NhbGUgPSBuZXcgTGF5YS5WZWN0b3IzKDAuMSwgMC4xLCAwLjEpO1xyXG5cdFx0ZHVkZS50cmFuc2Zvcm0ubG9jYWxTY2FsZSA9IHNjYWxlO1xyXG5cdFx0ZHVkZS50cmFuc2Zvcm0ucm90YXRlKG5ldyBMYXlhLlZlY3RvcjMoIDAsIDMuMTQsIDApKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHRcclxuXHJcbiAgICBwcml2YXRlIFN1YnBhY2thZ2VPdmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIEFzc2V0TWFuYWdlci5Mb2FkQXNzZXRGdW4oKCk9PntcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRqZCA9IDUwO1xyXG4gICAgICAgICAgICB0aGlzLl9hbGxqZCA9IDQwO1xyXG4gICAgICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgICAgIHZhciB1cmxBcnI6QXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIFwic3RhcnRwYW5lbFwiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcImVuZHBhbmVsXCIgKSApO1xyXG4gICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIFwic3BlZWR1cGVmZmVjdFwiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcImNvbG9yX3doaXRlXCIgKSApO1xyXG4gICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIFwiY29sb3JfeWVsbG93XCIgKSApO1xyXG4gICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNETW9kZWwoIFwid2lubGluZVwiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcImZpcmV3b3Jrc1wiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBcIkRpcmVjdGlvbmFsTGlnaHRcIiApICk7XHJcbiAgICAgICAgICAgIC8vIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggXCJkaXN0YW50dmlld1wiICkgKTtcclxuICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggdGhpcy5Sb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKSApO1xyXG4gICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBcIkFycm93XCIgKSApO1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSB0aGlzLlJvbGVEYXRhLmxldmVsbWFwQXJyO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICBmb3IoIGkgPSAwO2kgPCBhcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggQXNzZXRQYXRoLmdldDNETW9kZWwoIGFycltpXSApICkgPT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RNb2RlbCggYXJyW2ldICkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBucGNBcnI6QXJyYXk8YW55PiA9IHRoaXMuUm9sZURhdGEubGV2ZWxjZmcubnBjO1xyXG4gICAgICAgICAgICBmb3IoIGkgPSAwO2kgPCBucGNBcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICkgPT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybEFyci5wdXNoKCBBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoIE5wY0NGRy5kaWN0WyBucGNBcnJbaV0uaWQgXS5uYW1lICkgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IoIGkgPSAwO2kgPCB1cmxBcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBhdGhBcnIucHVzaCggeyB1cmw6dXJsQXJyW2ldIH0gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLmxvYWQzRGNvbXBsZXRlLHRoaXMubG9hZHByb2dyZXNzICk7XHJcblxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkM0Rjb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2FkamQgPSA5MDtcclxuICAgICAgICB0aGlzLl9hbGxqZCA9IDEwO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkR3JvdXAoIFwibWFpblwiLHRoaXMsdGhpcy5sb2FkY29tcGxldGUsdGhpcy5sb2FkcHJvZ3Jlc3MsZmFsc2UgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRwcm9ncmVzcyggdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsb2FkaW5ncGFuZWw6TG9hZGluZ1BhbmVsID0gVmlld01hbmFnZXIuSW5zdGFuY2UuZ2V0VmlldyggTG9hZGluZ1BhbmVsICk7XHJcbiAgICAgICAgaWYoIGxvYWRpbmdwYW5lbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2xvYWRqZCArIE1hdGguY2VpbCggdmFsdWUvMTAwKnRoaXMuX2FsbGpkICk7XHJcbiAgICAgICAgICAgIGxvYWRpbmdwYW5lbC5zaG93V29yZCggdmFsdWUgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkY29tcGxldGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmQgPSBcInVpOi8vbGVjeHluaDJpejl5MjZcIjtcclxuICAgICAgICBHYW1lU3RhdGVDb250cm9sLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5BZGRWaWV3UGFja0J5TmFtZSggXCJtYWluXCIgKTtcclxuICAgICAgICBWaWV3TWFuYWdlci5JbnN0YW5jZS5jbG9zZSggTG9hZGluZ1BhbmVsICk7XHJcbiAgICAgICAgLy8gRllIRF9TZGsuSW5pdFNkaygpO1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggTWFpblBhbmVsICk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLmlrDnlKjmiLdGWUhEX1Nkay5pc25ld3VzZXItLS1cIixGWUhEX1Nkay5pc25ld3VzZXIpO1xyXG5cclxuICAgICAgICBsZXQgbmV3dXNlciA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpc19uZXd1c2VyXCIpO1xyXG4gICAgICAgIGlmKEZZSERfU2RrLmlzbmV3dXNlcil7XHJcbiAgICAgICAgICAgIExheWEudGltZXIub25jZSg1MDAsdGhpcywoKT0+e1xyXG4gICAgICAgICAgICAgICAgaWYoUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5XaGl0ZVVzZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChHaWZ0Vmlldyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJpc19uZXd1c2VyXCIsXCIxXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuU2V0U2NlbmUoKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5Jbml0RWZmZWN0KCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge0xvY2FsRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2xcIjtcclxuaW1wb3J0IHtVc2VyRGF0YUluZm99IGZyb20gXCIuLi9EYXRhL1VzZXJEYXRhSW5mb1wiO1xyXG5pbXBvcnQge1NraW5EYXRhfSBmcm9tIFwiLi4vRGF0YS9Ta2luRGF0YVwiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vQ0ZHL1JvbGVDRkdcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge1NraW5QYW5lbH0gZnJvbSBcIi4uL1ZpZXcvU2tpblBhbmVsXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCwgQWNjb3VudFVzZXIgfSBmcm9tIFwiLi4vV1hTREsvUGxheWVyQWNjb3VudFwiO1xyXG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciwgUFJPVE9DT0xTIH0gZnJvbSBcIi4uL1dYU0RLL05ldHdvcmtNYW5hZ2VyXCI7XHJcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuL0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWdlbmN5U2tpbiBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5U2tpblwiO1xyXG4gICAgc3RhdGljIGluc3RhbmNlOkFnZW5jeVNraW47XHJcbiAgICBcclxuICAgIGxvY2FsZGF0YTphbnk7XHJcbiAgICBwaWZ1QXJyOkFycmF5PFNraW5EYXRhPjtcclxuICAgIHBpZnVEaWN0OmFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIFxyXG4gICAgeyBcclxuICAgICAgICBzdXBlcigpOyBcclxuICAgICAgICBBZ2VuY3lTa2luLmluc3RhbmNlID0gdGhpcztcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRTZWxmKCk6dm9pZFxyXG4gICAge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmxvY2FsZGF0YSA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuR2V0TG9jYWxDYUNoZURhdGEoIFVzZXJEYXRhSW5mby5za2luICk7XHJcbiAgICAgICAgdmFyIHBpZnVEYXRhOmFueTtcclxuICAgICAgICBpZiggIXRoaXMubG9jYWxkYXRhLmhhc093blByb3BlcnR5KCBcInBpZnVcIiApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBwaWZ1RGF0YSA9IHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXTtcclxuICAgICAgICB0aGlzLnBpZnVBcnIgPSBbXTtcclxuICAgICAgICB0aGlzLnBpZnVEaWN0ID0ge307XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgbnVtczpudW1iZXIgPSBSb2xlQ0ZHLnZlYy5sZW5ndGg7XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgbnVtcztpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHBpZnV2bzpTa2luRGF0YSA9IG5ldyBTa2luRGF0YTtcclxuICAgICAgICAgICAgdmFyIGNmZzpSb2xlQ0ZHID0gUm9sZUNGRy52ZWNbaV07XHJcbiAgICAgICAgICAgIHBpZnV2by5yb2xlQ0ZHID0gY2ZnO1xyXG4gICAgICAgICAgICB2YXIgZDphbnkgPSBwaWZ1RGF0YVsgY2ZnLmlkIF07XHJcbiAgICAgICAgICAgIGlmKCBkIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gTnVtYmVyKCBkLnN0YXRlICk7XHJcbiAgICAgICAgICAgICAgICBwaWZ1dm8uaGFzbnVtID0gTnVtYmVyKCBkLmhhc251bSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGlmdXZvLnN0YXRlID0gMDtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5oYXNudW0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCBjZmcuZ2V0U3RhdGUgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5waWZ1QXJyLnB1c2goIHBpZnV2byApO1xyXG4gICAgICAgICAgICB0aGlzLnBpZnVEaWN0WyBwaWZ1dm8ucm9sZUNGRy5pZCBdID0gcGlmdXZvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW52aWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggU2tpblBhbmVsICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldFJvbGVTdGF0ZSggY2ZnOlJvbGVDRkcsdmFsdWU6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBwaWZ1dm86U2tpbkRhdGEgPSB0aGlzLnBpZnVEaWN0WyBjZmcuaWQgXTtcclxuICAgICAgICBpZiggcGlmdXZvIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBpZnV2by5zdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuQWRkTG9jYWxTa2luRGF0YShwaWZ1dm8ucm9sZUNGRy5pZCxwaWZ1dm8uc3RhdGUscGlmdXZvLmhhc251bSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyAgQWRkTG9jYWxTa2luRGF0YSggaWQ6YW55LHN0YXRlOm51bWJlcixoYXNudW06bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubG9jYWxkYXRhW1wicGlmdVwiXVtpZF0gPSB7fTtcclxuICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl1baWRdW1wic3RhdGVcIl0gPSBzdGF0ZTtcclxuICAgICAgICB0aGlzLmxvY2FsZGF0YVtcInBpZnVcIl1baWRdW1wiaGFzbnVtXCJdID0gaGFzbnVtO1xyXG4gICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkRGF0YSggVXNlckRhdGFJbmZvLnNraW4sdGhpcy5sb2NhbGRhdGEgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHJlY3Q6TGF5YS5TcHJpdGU7XHJcblxyXG5cdFx0cHJpdmF0ZSBjcmVhdGVDYW50cmFsUmVjdCgpOiB2b2lkIHtcclxuXHRcdFx0dGhpcy5yZWN0ID0gbmV3IExheWEuU3ByaXRlKCk7XHJcblx0XHRcdHRoaXMucmVjdC5ncmFwaGljcy5kcmF3UmVjdCgtMTAwLCAtMTAwLCAyMDAsIDIwMCwgXCJncmF5XCIpO1xyXG5cdFx0XHRMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMucmVjdCk7XHJcblxyXG5cdFx0XHR0aGlzLnVwZGF0ZVJlY3RQb3MoKTtcclxuXHRcdH1cclxuXHJcblx0XHRwcml2YXRlIHVwZGF0ZVJlY3RQb3MoKTogdm9pZCB7XHJcblx0XHRcdHRoaXMucmVjdC54ID0gTGF5YS5zdGFnZS53aWR0aCAvIDI7XHJcblx0XHRcdHRoaXMucmVjdC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLyAyO1xyXG5cdFx0fVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHB1YmxpYyBHYWluUGlmdSggX3NraW5pdGVtOlNraW5EYXRhICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBfc2tpbml0ZW0uc3RhdGUgPT0gMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLlJvbGVEYXRhLkNoYXJhY3RlcklEID0gX3NraW5pdGVtLnJvbGVDRkcuaWQ7XHJcbiAgICAgICAgICAgIHRoaXMuRGlzVHJpZ2dlciggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHN3aXRjaCggX3NraW5pdGVtLnJvbGVDRkcuZ2V0U3RhdGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6Ly/op4bpopHojrflj5ZcclxuICAgICAgICAgICAgICAgIF9za2luaXRlbS5oYXNudW0rKztcclxuICAgICAgICAgICAgICAgICAgICBpZiggX3NraW5pdGVtLnJvbGVDRkcubmVlZCA8PSBfc2tpbml0ZW0uaGFzbnVtIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9za2luaXRlbS5zdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkTG9jYWxTa2luRGF0YShfc2tpbml0ZW0ucm9sZUNGRy5pZCxfc2tpbml0ZW0uc3RhdGUsX3NraW5pdGVtLmhhc251bSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5EaXNUcmlnZ2VyKCBHYW1lU3RhdGUudXBkYXRlU0tpblZpZXcgKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAyOi8v6YeR5biB6LSt5LmwXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuUm9sZURhdGEuTW9uZXkgPj0gX3NraW5pdGVtLnJvbGVDRkcubmVlZCApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJvbGVEYXRhLk1vbmV5IC09IF9za2luaXRlbS5yb2xlQ0ZHLm5lZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF9za2luaXRlbS5zdGF0ZSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWRkTG9jYWxTa2luRGF0YShfc2tpbml0ZW0ucm9sZUNGRy5pZCxfc2tpbml0ZW0uc3RhdGUsX3NraW5pdGVtLmhhc251bSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRGlzVHJpZ2dlciggR2FtZVN0YXRlLnVwZGF0ZVNLaW5WaWV3ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFRpcC5JbnN0YW5jZS5zaG93V29yZFRpcHMoIFwi6LSt5Lmw5oiQ5YqfXCIgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVGlwLkluc3RhbmNlLnNob3dXb3JkVGlwcyhcIumHkeW4geS4jei2s1wiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgMzovL+a0u+WKqOiOt+WPllxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgXHJcbiAgICBwdWJsaWMgR2Fpbk5vSGF2ZVNraW4oKTpBcnJheTxTa2luRGF0YT5cclxuICAgIHtcclxuICAgICAgICB2YXIgYXJyOkFycmF5PFNraW5EYXRhPiA9IFtdO1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gdGhpcy5waWZ1RGljdCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggKHRoaXMucGlmdURpY3Rbc10gYXMgU2tpbkRhdGEpLnN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaCggdGhpcy5waWZ1RGljdFtzXSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge0FnZW5jeUJhc2VDb250cm9sfSBmcm9tIFwiLi9BZ2VuY3lCYXNlQ29udHJvbFwiO1xyXG5pbXBvcnQge1NraW5EYXRhfSBmcm9tIFwiLi4vRGF0YS9Ta2luRGF0YVwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7VHJpYWxQYW5lbH0gZnJvbSBcIi4uL1ZpZXcvVHJpYWxQYW5lbFwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgQXNzZXRQYXRoIH0gZnJvbSBcIi4uL0NvbmZpZy9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHtSZXNvdXJjZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc291cmNlQ29udHJvbFwiO1xyXG5pbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7IEFnZW5jeUluR2FtZSB9IGZyb20gXCIuL0FnZW5jeUluR2FtZVwiO1xyXG5pbXBvcnQgeyBGWUhEX1NkayB9IGZyb20gXCIuLi9XWFNESy9GWUhEX1Nka1wiO1xyXG5pbXBvcnQgRWdnVmlldyBmcm9tIFwiLi4vVmlldy9FZ2dQYW5lbFwiO1xyXG5pbXBvcnQgRWdnUGFuZWwgZnJvbSBcIi4uL1ZpZXcvRWdnUGFuZWxcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50IH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZ2VuY3lUcmlhbCBleHRlbmRzIEFnZW5jeUJhc2VDb250cm9sIFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5VHJpYWxcIjtcclxuXHJcbiAgICBpc3NoaXlvbmdpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgcHJpdmF0ZSBzcHJpdDpMYXlhLlNwcml0ZTtcclxuICAgIFxyXG4gICAgY29uc3RydWN0b3IoKSBcclxuICAgIHsgXHJcbiAgICAgICAgc3VwZXIoKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW52aWV3KCBhcnI6QXJyYXk8U2tpbkRhdGE+ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZCggVHJpYWxQYW5lbCxhcnIgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKirpgIDlh7rnlYzpnaIgKi9cclxuICAgIHB1YmxpYyBFeGl0UGFuZWwoIF9kYXRhOlNraW5EYXRhICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaXNzaGl5b25naW5nID0gX2RhdGEgPyB0cnVlOmZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdHZvID0gX2RhdGE7XHJcbiAgICAgICAgaWYoIF9kYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB1cmxBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgICB1cmxBcnIucHVzaCggeyB1cmw6QXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBfZGF0YS5yb2xlQ0ZHLm5hbWUgKX0gKTtcclxuICAgICAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRlcjNEQXJyKCB1cmxBcnIsdGhpcyx0aGlzLlNjZW5lQ3JlYXRlQ29tcGxldGUsbnVsbCx0cnVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIGlmKEFnZW5jeUluR2FtZS5nYW1lbnVtPjEpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XHJcbiAgICAgICAgICAgICAgICBpZihQbGF5ZXJBY2NvdW50LkN1cnJlbnRBY2NvdW50LkN1ckFjY291bnREYXRhLldoaXRlVXNlciAmJiAgcmFuZG9tPD0gUGxheWVyQWNjb3VudC5DdXJyZW50QWNjb3VudC5DdXJBY2NvdW50RGF0YS5IaXRFZ2cpe1xyXG4gICAgICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChFZ2dQYW5lbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW50ZXJnYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgLy8gZWxzZXtcclxuICAgICAgICAgICAgLy8gICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW50ZXJnYW1lKCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmNsb3NlKCBUcmlhbFBhbmVsICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0dm86U2tpbkRhdGE7XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTcHJpdGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zcHJpdCA9IG5ldyBMYXlhLlNwcml0ZSgpO1xyXG4gICAgICAgIHRoaXMuc3ByaXQuZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgMjAwLCAyMDAsIFwiI0QyNjkxRVwiKTtcclxuICAgICAgICB0aGlzLnNwcml0LnBpdm90KDEwMCwgMTAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5zcHJpdC54ID0gTGF5YS5zdGFnZS53aWR0aCAvIDI7XHJcbiAgICAgICAgdGhpcy5zcHJpdC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgICB0aGlzLnNwcml0LnNpemUoMjAwLCAyMDApO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodGhpcy5zcHJpdCk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuc3Aub24oSW50ZXJhY3Rpb25fQ3VzdG9tRXZlbnQuUk9UQVRFLCB0aGlzLCB0aGlzLm9uUm90YXRlKTsgICAgLy8g5L6m5ZCs6Ieq5a6a5LmJ55qE5LqL5Lu2XHJcbiAgICAgICAgLy8gdGhpcy5zcHJpdC5vbihFdmVudC5DTElDSywgdGhpcywgdGhpcy5vblNwcml0ZUNsaWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU3ByaXRlQ2xpY2soZTogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB2YXIgcmFuZG9tQW5nbGU6IG51bWJlciA9IE1hdGgucmFuZG9tKCkgKiAxODA7XHJcbiAgICAgICAgLy/lj5HpgIHoh6rlrprkuYnkuovku7ZcclxuICAgICAgICAvLyB0aGlzLnNwcml0LmV2ZW50KEludGVyYWN0aW9uX0N1c3RvbUV2ZW50LlJPVEFURSwgW3JhbmRvbUFuZ2xlXSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6Kem5Y+R6Ieq5a6a5LmJ55qEcm90YXRl5LqL5Lu2XHJcbiAgICBwcml2YXRlIG9uUm90YXRlKG5ld0FuZ2xlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAvLyBUd2Vlbi50byh0aGlzLnNwLCB7IFwicm90YXRpb25cIjogbmV3QW5nbGUgfSwgMTAwMCwgRWFzZS5lbGFzdGljT3V0KTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJpdmF0ZSBTY2VuZUNyZWF0ZUNvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5DcmVhdGVQbGF5ZXIodGhpcy5fc2VsZWN0dm8ucm9sZUNGRyk7XHJcbiAgICAgICAgaWYoQWdlbmN5SW5HYW1lLmdhbWVudW0+MSl7XHJcbiAgICAgICAgICAgIGlmKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuV2hpdGVVc2VyKXtcclxuICAgICAgICAgICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmFkZChFZ2dQYW5lbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuSW5zdGFuY2UuZW50ZXJnYW1lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbnRlcmdhbWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVRleHQoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHR4dDogTGF5YS5UZXh0ID0gbmV3IExheWEuVGV4dCgpO1xyXG4gICAgICAgIC8v57uZ5paH5pys55qEdGV4dOWxnuaAp+i1i+WAvFxyXG4gICAgICAgIHR4dC50ZXh0ID0gXCJMYXlhYm945piv5oCn6IO95pyA5by655qESFRNTDXlvJXmk47mioDmnK/mj5DkvpvllYbkuI7kvJjnp4DnmoTmuLjmiI/lj5HooYzllYbvvIzpnaLlkJFGbGFzaOW8gOWPkeiAheaPkOS+m0hUTUw15byA5Y+R5oqA5pyv5pa55qGI77yBXCI7XHJcbiAgICAgICAgLy/orr7nva7lrr3luqbvvIzpq5jluqboh6rliqjljLnphY1cclxuICAgICAgICB0eHQud2lkdGggPSA0MDA7XHJcbiAgICAgICAgLy/oh6rliqjmjaLooYxcclxuICAgICAgICB0eHQud29yZFdyYXAgPSB0cnVlO1xyXG5cclxuICAgICAgICB0eHQuYWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIHR4dC5mb250U2l6ZSA9IDQwO1xyXG4gICAgICAgIHR4dC5mb250ID0gXCJNaWNyb3NvZnQgWWFIZWlcIjtcclxuICAgICAgICB0eHQuY29sb3IgPSBcIiNmZjAwMDBcIjtcclxuICAgICAgICB0eHQuYm9sZCA9IHRydWU7XHJcbiAgICAgICAgdHh0LmxlYWRpbmcgPSA1O1xyXG5cclxuICAgICAgICAvL+iuvue9ruaPj+i+ueWxnuaAp1xyXG4gICAgICAgIHR4dC5zdHJva2UgPSAyO1xyXG4gICAgICAgIHR4dC5zdHJva2VDb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG5cclxuICAgICAgICB0eHQuYm9yZGVyQ29sb3IgPSBcIiMwMGZmMDBcIlxyXG5cclxuICAgICAgICB0eHQueCA9IChMYXlhLnN0YWdlLndpZHRoIC0gdHh0LnRleHRXaWR0aCkgLyAyO1xyXG4gICAgICAgIHR4dC55ID0gKExheWEuc3RhZ2UuaGVpZ2h0IC0gdHh0LnRleHRIZWlnaHQpIC8gMjtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0eHQpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIFxyXG5cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUlucHV0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBpbnB1dFRleHQ6TGF5YS5JbnB1dCA9IG5ldyBMYXlhLklucHV0KCk7XHJcblxyXG4gICAgICAgIC8vIOenu+WKqOerr+i+k+WFpeaPkOekuuesplxyXG4gICAgICAgIGlucHV0VGV4dC5wcm9tcHQgPSBcIlR5cGUgc29tZSB3b3JkLi4uXCI7XHJcblxyXG4gICAgICAgIC8v5aSa6KGM6L6T5YWlXHJcbiAgICAgICAgaW5wdXRUZXh0Lm11bHRpbGluZSA9IHRydWU7XHJcbiAgICAgICAgaW5wdXRUZXh0LndvcmRXcmFwID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaW5wdXRUZXh0LnNpemUoMzUwLCAxMDApO1xyXG4gICAgICAgIGlucHV0VGV4dC54ID0gTGF5YS5zdGFnZS53aWR0aCAtIGlucHV0VGV4dC53aWR0aCA+PiAxO1xyXG4gICAgICAgIGlucHV0VGV4dC55ID0gTGF5YS5zdGFnZS5oZWlnaHQgLSBpbnB1dFRleHQuaGVpZ2h0ID4+IDE7XHJcbiAgICAgICAgaW5wdXRUZXh0LnBhZGRpbmcgPSBbMiwgMiwgMiwgMl07XHJcblxyXG4gICAgICAgIGlucHV0VGV4dC5iZ0NvbG9yID0gXCIjNjY2NjY2XCI7XHJcbiAgICAgICAgaW5wdXRUZXh0LmNvbG9yID0gXCIjZmZmZmZmXCI7XHJcbiAgICAgICAgaW5wdXRUZXh0LmZvbnRTaXplID0gMjA7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoaW5wdXRUZXh0KTtcclxuICAgIH1cclxuIFxyXG59IiwiaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gXCIuLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQgeyBUaW1lc1RhbXBlciB9IGZyb20gXCIuLi9UaW1lL1RpbWVzVGFtcGVyXCI7XHJcbmltcG9ydCB7IEdsb2JhbFRpcCB9IGZyb20gXCIuLi91dGlscy9HbG9iYWxUaXBcIjtcclxuaW1wb3J0IHtXRUNIQVRFVkVOVH0gZnJvbSBcIi4uL1dYU0RLL1dFQ0hBVEVWRU5UXCI7XHJcbmltcG9ydCB7QWdlbmN5QmFzZUNvbnRyb2x9IGZyb20gXCIuL0FnZW5jeUJhc2VDb250cm9sXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCBMZXZlbENGRyBmcm9tIFwiLi4vQ0ZHL0xldmVsQ0ZHXCI7XHJcbmltcG9ydCB7IFBsYXllckFjY291bnQsIEFjY291bnRVc2VyIH0gZnJvbSBcIi4uL1dYU0RLL1BsYXllckFjY291bnRcIjtcclxuaW1wb3J0IHsgTmV0d29ya01hbmFnZXIsIFBST1RPQ09MUyB9IGZyb20gXCIuLi9XWFNESy9OZXR3b3JrTWFuYWdlclwiO1xyXG5pbXBvcnQge1VzZXJJbmZvRXZlbnR9IGZyb20gXCIuLi9EYXRhL1VzZXJJbmZvRXZlbnRcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQWdlbmN5VXNlck1lc3NhZ2UgZXh0ZW5kcyBBZ2VuY3lCYXNlQ29udHJvbFxyXG57XHJcbiAgICBzdGF0aWMga2V5OnN0cmluZyA9IFwiQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuXHJcbiAgICBwcml2YXRlIHJvbGVpc2luaXQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XHJcbiAgICBcclxuICAgIHByb3RlY3RlZCBpbml0U2VsZigpOnZvaWRcclxuICAgIHtcclxuICAgICAgIFxyXG4gICAgfSAgIFxyXG5cclxuICAgIC8qKuWKoOmHkeW4gSAqL1xyXG4gICAgcHVibGljIEdvbGRVcCggX251bTpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5Sb2xlRGF0YS5Nb25leSArPSBfbnVtO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUlucHV0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBpbnB1dFRleHQ6TGF5YS5JbnB1dCA9IG5ldyBMYXlhLklucHV0KCk7XHJcblxyXG4gICAgICAgIGlucHV0VGV4dC5zaXplKDM1MCwgMTAwKTtcclxuICAgICAgICBpbnB1dFRleHQueCA9IExheWEuc3RhZ2Uud2lkdGggLSBpbnB1dFRleHQud2lkdGggPj4gMTtcclxuICAgICAgICBpbnB1dFRleHQueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC0gaW5wdXRUZXh0LmhlaWdodCA+PiAxO1xyXG5cclxuICAgICAgICBpbnB1dFRleHQudGV4dCA9IFwi6L+Z5q615paH5pys5LiN5Y+v57yW6L6R77yM5L2G5Y+v5aSN5Yi2XCI7XHJcbiAgICAgICAgaW5wdXRUZXh0LmVkaXRhYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIOiuvue9ruWtl+S9k+agt+W8j1xyXG4gICAgICAgIGlucHV0VGV4dC5ib2xkID0gdHJ1ZTtcclxuICAgICAgICBpbnB1dFRleHQuYmdDb2xvciA9IFwiIzY2NjY2NlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG4gICAgICAgIGlucHV0VGV4dC5mb250U2l6ZSA9IDIwO1xyXG5cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGlucHV0VGV4dCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlJvbGVEYXRhLmluaXQoKTtcclxuICAgICAgICB0aGlzLnJvbGVpc2luaXQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlVGV4dCgpOkxheWEuVGV4dCB7XHJcbiAgICAgICAgdmFyIHR4dDpMYXlhLlRleHQgPSBuZXcgTGF5YS5UZXh0KCk7XHJcblxyXG4gICAgICAgIHR4dC50ZXh0ID1cclxuICAgICAgICAgICAgXCJMYXlhYm945pivSFRNTDXlvJXmk47mioDmnK/mj5DkvpvllYbkuI7kvJjnp4DnmoTmuLjmiI/lj5HooYzllYbvvIzpnaLlkJFBUy9KUy9UU+W8gOWPkeiAheaPkOS+m0hUTUw15byA5Y+R5oqA5pyv5pa55qGI77yBXFxuXCIgK1xyXG4gICAgICAgICAgICBcIkxheWFib3jmmK9IVE1MNeW8leaTjuaKgOacr+aPkOS+m+WVhuS4juS8mOengOeahOa4uOaIj+WPkeihjOWVhu+8jOmdouWQkUFTL0pTL1RT5byA5Y+R6ICF5o+Q5L6bSFRNTDXlvIDlj5HmioDmnK/mlrnmoYjvvIFcXG5cIiArXHJcbiAgICAgICAgICAgIFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVwiO1xyXG5cclxuICAgICAgICB0eHQuYm9yZGVyQ29sb3IgPSBcIiNGRkZGMDBcIjtcclxuXHJcbiAgICAgICAgdHh0LnNpemUoMzAwLCA1MCk7XHJcbiAgICAgICAgdHh0LmZvbnRTaXplID0gMjA7XHJcbiAgICAgICAgdHh0LmNvbG9yID0gXCIjZmZmZmZmXCI7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQodHh0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHR4dDtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgLyoq5Y2H57qnICovXHJcbiAgICBwdWJsaWMgTGV2ZWxVcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlJvbGVEYXRhLkxldmVsVXAoKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXHJcbi8v6YWN572u5paH5Lu25ZCN56ew77yaYnVpbGQueGxzeOOAglxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdWlsZENGR1xyXG57XHJcblx0cHVibGljIG5hbWU6c3RyaW5nOy8v5bu6562R5ZCNXHJcblx0cHVibGljIGJ1ZmZ4Om51bWJlcjsvL2J1ZmZ4XHJcblx0cHVibGljIGJ1ZmZ5Om51bWJlcjsvL2J1ZmZ5XHJcblx0cHVibGljIGJ1ZmZ6Om51bWJlcjsvL2J1ZmZ6XHJcblx0cHVibGljIHRpbWU6bnVtYmVyOy8v5oyB57ut5pe26Ze0KOenkilcclxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XHJcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8QnVpbGRDRkc+ID0gW107XHJcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcclxuXHR7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxyXG5cdFx0e1xyXG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcclxuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcclxuXHRcdFx0aWYoQnVpbGRDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xyXG5cdFx0XHR2YXIgaXRlbTpCdWlsZENGRz0gbmV3IEJ1aWxkQ0ZHKCk7XHJcblx0XHRcdGl0ZW0ubmFtZT1zaW5nbGVBcnJbMF07XHJcblx0XHRcdGl0ZW0uYnVmZng9IE51bWJlcihzaW5nbGVBcnJbMV0pO1xyXG5cdFx0XHRpdGVtLmJ1ZmZ5PSBOdW1iZXIoc2luZ2xlQXJyWzJdKTtcclxuXHRcdFx0aXRlbS5idWZmej0gTnVtYmVyKHNpbmdsZUFyclszXSk7XHJcblx0XHRcdGl0ZW0udGltZT0gTnVtYmVyKHNpbmdsZUFycls0XSk7XHJcblx0XHRcdEJ1aWxkQ0ZHLmRpY3RbaXRlbS5uYW1lXT1pdGVtO1xyXG5cdFx0XHRCdWlsZENGRy52ZWMucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG59IiwiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy/lt6XlhbfnlJ/miJDvvIzor7fli7/kv67mlLnjgIJcclxuLy/phY3nva7mlofku7blkI3np7DvvJpnYW1lLnhsc3jjgIJcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2FtZUNGR1xyXG57XHJcblx0cHVibGljIGlkOm51bWJlcjsvL2lkXHJcblx0cHVibGljIHZhbHVlOnN0cmluZzsvL+Wtl+auteWAvFxyXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcclxuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxHYW1lQ0ZHPiA9IFtdO1xyXG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXHJcblx0e1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcclxuXHRcdHtcclxuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XHJcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XHJcblx0XHRcdGlmKEdhbWVDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xyXG5cdFx0XHR2YXIgaXRlbTpHYW1lQ0ZHPSBuZXcgR2FtZUNGRygpO1xyXG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcclxuXHRcdFx0aXRlbS52YWx1ZT1zaW5nbGVBcnJbMV07XHJcblx0XHRcdEdhbWVDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xyXG5cdFx0XHRHYW1lQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mmxldmVsLnhsc3jjgIJcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGV2ZWxDRkdcclxue1xyXG5cdHB1YmxpYyBpZDpudW1iZXI7Ly/lhbPljaFcclxuXHRwdWJsaWMgcm9hZDpzdHJpbmc7Ly/lhbPljaHmqKHlnotcclxuXHRwdWJsaWMgcm9sZWluaXRwb3M6YW55Oy8v546p5a626KeS6Imy5Yid5aeL56uZ5L2NXHJcblx0cHVibGljIG5wYzphbnk7Ly9ucGNcclxuXHRwdWJsaWMgZmlyc3RTY2VuZXBvczpzdHJpbmc7Ly/liJ3lp4vnrKzkuIDkuKrlnLrmma/mqKHlnovnmoTkvY3nva5cclxuXHRwdWJsaWMgd2luR29sZDpudW1iZXI7Ly/pgJrlhbPmiJDlip/ojrflvpfph5HluIFcclxuXHRwdWJsaWMgZmFpbEdvZDpzdHJpbmc7Ly/pgJrlhbPlpLHotKXojrflvpfph5HluIFcclxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XHJcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8TGV2ZWxDRkc+ID0gW107XHJcblx0cHVibGljIHN0YXRpYyBpbml0Q2ZnKHN0cjpzdHJpbmcpOnZvaWRcclxuXHR7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IHN0ci5zcGxpdChcIlxcblwiKTtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0Zm9yKGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKVxyXG5cdFx0e1xyXG5cdFx0XHR2YXIgc2luZ2xlU3RyOnN0cmluZyA9IGFycltpXTtcclxuXHRcdFx0dmFyIHNpbmdsZUFycjpBcnJheTxzdHJpbmc+ID0gc2luZ2xlU3RyLnNwbGl0KFwiJlwiKTtcclxuXHRcdFx0aWYoTGV2ZWxDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xyXG5cdFx0XHR2YXIgaXRlbTpMZXZlbENGRz0gbmV3IExldmVsQ0ZHKCk7XHJcblx0XHRcdGl0ZW0uaWQ9IE51bWJlcihzaW5nbGVBcnJbMF0pO1xyXG5cdFx0XHRpdGVtLnJvYWQ9c2luZ2xlQXJyWzFdO1xyXG5cdFx0XHRpdGVtLnJvbGVpbml0cG9zPSBKU09OLnBhcnNlKHNpbmdsZUFyclsyXSk7XHJcblx0XHRcdGl0ZW0ubnBjPSBKU09OLnBhcnNlKHNpbmdsZUFyclszXSk7XHJcblx0XHRcdGl0ZW0uZmlyc3RTY2VuZXBvcz1zaW5nbGVBcnJbNF07XHJcblx0XHRcdGl0ZW0ud2luR29sZD0gTnVtYmVyKHNpbmdsZUFycls1XSk7XHJcblx0XHRcdGl0ZW0uZmFpbEdvZD1zaW5nbGVBcnJbNl07XHJcblx0XHRcdExldmVsQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcclxuXHRcdFx0TGV2ZWxDRkcudmVjLnB1c2goaXRlbSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXHJcbi8v6YWN572u5paH5Lu25ZCN56ew77yabG90dGVyeS54bHN444CCXHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvdHRlcnlDRkdcclxue1xyXG5cdHB1YmxpYyBpZDpudW1iZXI7Ly9pZFxyXG5cdHB1YmxpYyB0eXBlOm51bWJlcjsvL+WxnuaAp+exu+Wei1xyXG5cdHB1YmxpYyB2YWx1ZTpzdHJpbmc7Ly/nsbvlnovlgLxcclxuXHRwdWJsaWMgd2VpZ2h0Om51bWJlcjsvL+adg+mHjVxyXG5cdHB1YmxpYyBzdGF0aWMgZGljdDphbnkgPSB7fTtcclxuXHRwdWJsaWMgc3RhdGljIHZlYzpBcnJheTxMb3R0ZXJ5Q0ZHPiA9IFtdO1xyXG5cdHB1YmxpYyBzdGF0aWMgaW5pdENmZyhzdHI6c3RyaW5nKTp2b2lkXHJcblx0e1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHR2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBzdHIuc3BsaXQoXCJcXG5cIik7XHJcblx0XHR2YXIgaTpudW1iZXI9MDtcclxuXHRcdGZvcihpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKylcclxuXHRcdHtcclxuXHRcdFx0dmFyIHNpbmdsZVN0cjpzdHJpbmcgPSBhcnJbaV07XHJcblx0XHRcdHZhciBzaW5nbGVBcnI6QXJyYXk8c3RyaW5nPiA9IHNpbmdsZVN0ci5zcGxpdChcIiZcIik7XHJcblx0XHRcdGlmKExvdHRlcnlDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xyXG5cdFx0XHR2YXIgaXRlbTpMb3R0ZXJ5Q0ZHPSBuZXcgTG90dGVyeUNGRygpO1xyXG5cdFx0XHRpdGVtLmlkPSBOdW1iZXIoc2luZ2xlQXJyWzBdKTtcclxuXHRcdFx0aXRlbS50eXBlPSBOdW1iZXIoc2luZ2xlQXJyWzFdKTtcclxuXHRcdFx0aXRlbS52YWx1ZT1zaW5nbGVBcnJbMl07XHJcblx0XHRcdGl0ZW0ud2VpZ2h0PSBOdW1iZXIoc2luZ2xlQXJyWzNdKTtcclxuXHRcdFx0TG90dGVyeUNGRy5kaWN0W2l0ZW0uaWRdPWl0ZW07XHJcblx0XHRcdExvdHRlcnlDRkcudmVjLnB1c2goaXRlbSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufSIsIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbi8v5bel5YW355Sf5oiQ77yM6K+35Yu/5L+u5pS544CCXHJcbi8v6YWN572u5paH5Lu25ZCN56ew77yabnBjLnhsc3jjgIJcclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTnBjQ0ZHXHJcbntcclxuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v6KeS6ImyaWRcclxuXHRwdWJsaWMgbmFtZTpzdHJpbmc7Ly/op5LoibLotYTmupDlkI1cclxuXHRwdWJsaWMgc3BlZWQ6bnVtYmVyOy8v6KeS6Imy5YmN6L+b56e75Yqo6YCf5bqmKOexsy/np5IpXHJcblx0cHVibGljIGZyb250anVtcDphbnk7Ly/liY3ot7PliqDpgJ/luqZcclxuXHRwdWJsaWMgbGVmdGp1bXA6YW55Oy8v5bem6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIHJpZ2h0anVtcDphbnk7Ly/lj7Pot7PliqDpgJ/luqZcclxuXHRwdWJsaWMgdXBjbGltYjpudW1iZXI7Ly/niKzljYfpgJ/luqZcclxuXHRwdWJsaWMgc2xpZGVjbGltYjphbnk7Ly/mlpznnYDniKzmpbzpgJ/luqZcclxuXHRwdWJsaWMganVtcF9sZWZ0Om51bWJlcjsvL+WQkeW3pui3s+i3g+adg+mHjVxyXG5cdHB1YmxpYyBqdW1wX3JpZ2h0Om51bWJlcjsvL+WQkeWPs+i3s+adg+mHjVxyXG5cdHB1YmxpYyBzdGFydF9haGVhZDpudW1iZXI7Ly/nm7Tot7PmnYPph41cclxuXHRwdWJsaWMgZGlzdGFuY2U6bnVtYmVyOy8vbnBj6LaF6L+H546p5a626Led56a75YGc5q2iXHJcblx0cHVibGljIGdyYXZpdHk6bnVtYmVyOy8v6YeN5Yqb5Yqg6YCf5bqmXHJcblx0cHVibGljIHN0YXRpYyBkaWN0OmFueSA9IHt9O1xyXG5cdHB1YmxpYyBzdGF0aWMgdmVjOkFycmF5PE5wY0NGRz4gPSBbXTtcclxuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXHJcblx0XHR7XHJcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xyXG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xyXG5cdFx0XHRpZihOcGNDRkcuZGljdFtzaW5nbGVBcnJbMF1dKWNvbnRpbnVlO1xyXG5cdFx0XHR2YXIgaXRlbTpOcGNDRkc9IG5ldyBOcGNDRkcoKTtcclxuXHRcdFx0aXRlbS5pZD0gTnVtYmVyKHNpbmdsZUFyclswXSk7XHJcblx0XHRcdGl0ZW0ubmFtZT1zaW5nbGVBcnJbMV07XHJcblx0XHRcdGl0ZW0uc3BlZWQ9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xyXG5cdFx0XHRpdGVtLmZyb250anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbM10pO1xyXG5cdFx0XHRpdGVtLmxlZnRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls0XSk7XHJcblx0XHRcdGl0ZW0ucmlnaHRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls1XSk7XHJcblx0XHRcdGl0ZW0udXBjbGltYj0gTnVtYmVyKHNpbmdsZUFycls2XSk7XHJcblx0XHRcdGl0ZW0uc2xpZGVjbGltYj0gSlNPTi5wYXJzZShzaW5nbGVBcnJbN10pO1xyXG5cdFx0XHRpdGVtLmp1bXBfbGVmdD0gTnVtYmVyKHNpbmdsZUFycls4XSk7XHJcblx0XHRcdGl0ZW0uanVtcF9yaWdodD0gTnVtYmVyKHNpbmdsZUFycls5XSk7XHJcblx0XHRcdGl0ZW0uc3RhcnRfYWhlYWQ9IE51bWJlcihzaW5nbGVBcnJbMTBdKTtcclxuXHRcdFx0aXRlbS5kaXN0YW5jZT0gTnVtYmVyKHNpbmdsZUFyclsxMV0pO1xyXG5cdFx0XHRpdGVtLmdyYXZpdHk9IE51bWJlcihzaW5nbGVBcnJbMTJdKTtcclxuXHRcdFx0TnBjQ0ZHLmRpY3RbaXRlbS5pZF09aXRlbTtcclxuXHRcdFx0TnBjQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn0iLCIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vL+W3peWFt+eUn+aIkO+8jOivt+WLv+S/ruaUueOAglxyXG4vL+mFjee9ruaWh+S7tuWQjeensO+8mnJvbGUueGxzeOOAglxyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlQ0ZHXHJcbntcclxuXHRwdWJsaWMgaWQ6bnVtYmVyOy8v6KeS6ImyaWRcclxuXHRwdWJsaWMgbmFtZTpzdHJpbmc7Ly/op5LoibLotYTmupDlkI1cclxuXHRwdWJsaWMgc3BlZWQ6bnVtYmVyOy8v6KeS6Imy5YmN6L+b56e75Yqo6YCf5bqmKOexsy/np5IpXHJcblx0cHVibGljIGZyb250anVtcDphbnk7Ly/liY3ot7PliqDpgJ/luqZcclxuXHRwdWJsaWMgbGVmdGp1bXA6YW55Oy8v5bem6Lez5Yqg6YCf5bqmXHJcblx0cHVibGljIHJpZ2h0anVtcDphbnk7Ly/lj7Pot7PliqDpgJ/luqZcclxuXHRwdWJsaWMgdXBjbGltYjpudW1iZXI7Ly/niKzljYfpgJ/luqZcclxuXHRwdWJsaWMgc2xpZGVjbGltYjphbnk7Ly/mlpznnYDniKzmpbzpgJ/luqZcclxuXHRwdWJsaWMgZ2V0U3RhdGU6bnVtYmVyOy8v6I635Y+W6KeS6Imy5pa55byPXHJcblx0cHVibGljIG5lZWQ6bnVtYmVyOy8v6I635Y+W6KeS6Imy6Iqx6LS5XHJcblx0cHVibGljIGljb246c3RyaW5nOy8v5Zu+5qCHaWNvblxyXG5cdHB1YmxpYyBncmF2aXR5Om51bWJlcjsvL+mHjeWKm+WKoOmAn+W6plxyXG5cdHB1YmxpYyByb2xlbmFtZTpzdHJpbmc7Ly/op5LoibLlkI3lrZdcclxuXHRwdWJsaWMgc3RhdGljIGRpY3Q6YW55ID0ge307XHJcblx0cHVibGljIHN0YXRpYyB2ZWM6QXJyYXk8Um9sZUNGRz4gPSBbXTtcclxuXHRwdWJsaWMgc3RhdGljIGluaXRDZmcoc3RyOnN0cmluZyk6dm9pZFxyXG5cdHtcclxuXHRcdHZhciBpOm51bWJlcj0wO1xyXG5cdFx0dmFyIGFycjpBcnJheTxzdHJpbmc+ID0gc3RyLnNwbGl0KFwiXFxuXCIpO1xyXG5cdFx0dmFyIGk6bnVtYmVyPTA7XHJcblx0XHRmb3IoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspXHJcblx0XHR7XHJcblx0XHRcdHZhciBzaW5nbGVTdHI6c3RyaW5nID0gYXJyW2ldO1xyXG5cdFx0XHR2YXIgc2luZ2xlQXJyOkFycmF5PHN0cmluZz4gPSBzaW5nbGVTdHIuc3BsaXQoXCImXCIpO1xyXG5cdFx0XHRpZihSb2xlQ0ZHLmRpY3Rbc2luZ2xlQXJyWzBdXSljb250aW51ZTtcclxuXHRcdFx0dmFyIGl0ZW06Um9sZUNGRz0gbmV3IFJvbGVDRkcoKTtcclxuXHRcdFx0aXRlbS5pZD0gTnVtYmVyKHNpbmdsZUFyclswXSk7XHJcblx0XHRcdGl0ZW0ubmFtZT1zaW5nbGVBcnJbMV07XHJcblx0XHRcdGl0ZW0uc3BlZWQ9IE51bWJlcihzaW5nbGVBcnJbMl0pO1xyXG5cdFx0XHRpdGVtLmZyb250anVtcD0gSlNPTi5wYXJzZShzaW5nbGVBcnJbM10pO1xyXG5cdFx0XHRpdGVtLmxlZnRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls0XSk7XHJcblx0XHRcdGl0ZW0ucmlnaHRqdW1wPSBKU09OLnBhcnNlKHNpbmdsZUFycls1XSk7XHJcblx0XHRcdGl0ZW0udXBjbGltYj0gTnVtYmVyKHNpbmdsZUFycls2XSk7XHJcblx0XHRcdGl0ZW0uc2xpZGVjbGltYj0gSlNPTi5wYXJzZShzaW5nbGVBcnJbN10pO1xyXG5cdFx0XHRpdGVtLmdldFN0YXRlPSBOdW1iZXIoc2luZ2xlQXJyWzhdKTtcclxuXHRcdFx0aXRlbS5uZWVkPSBOdW1iZXIoc2luZ2xlQXJyWzldKTtcclxuXHRcdFx0aXRlbS5pY29uPXNpbmdsZUFyclsxMF07XHJcblx0XHRcdGl0ZW0uZ3Jhdml0eT0gTnVtYmVyKHNpbmdsZUFyclsxMV0pO1xyXG5cdFx0XHRpdGVtLnJvbGVuYW1lPXNpbmdsZUFyclsxMl07XHJcblx0XHRcdFJvbGVDRkcuZGljdFtpdGVtLmlkXT1pdGVtO1xyXG5cdFx0XHRSb2xlQ0ZHLnZlYy5wdXNoKGl0ZW0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbn0iLCJpbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7UmVjQ29uZmlnc30gZnJvbSBcIi4vUmVjQ29uZmlnc1wiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgQXNzZXRQYXRoXHJcbntcclxuICAgIHN0YXRpYyAgcmVzOiBzdHJpbmcgPSBcInJlcy9cIjtcclxuICAgIHN0YXRpYyAgcmVzb3VyY2VzOnN0cmluZyA9IFwicmVzb3VyY2VzL1wiO1xyXG4gICAgLy8gZXhwb3J0IHZhciBjb25maWdzOnN0cmluZyA9IFwiY29uZmlncy9cIjtcclxuICAgIHN0YXRpYyAgdWk6c3RyaW5nID0gXCJ1aS9cIjtcclxuICAgIHN0YXRpYyAgc3VicGFja3NnZXVpOnN0cmluZyA9IFwiY2hhcmFjdGVyL3VpL1wiXHJcbiAgICBzdGF0aWMgIG11c2ljOnN0cmluZyA9IFwibXVzaWMvXCI7XHJcbiAgICBzdGF0aWMgIHZlcnNpb25yYW5kb206c3RyaW5nID0gXCJcIjtcclxuICAgIHN0YXRpYyAgcHJvcDpzdHJpbmcgPSBcInByb3AvXCJcclxuICAgIHN0YXRpYyAgc2tpbmljb246c3RyaW5nID0gXCJza2luaWNvbi9cIlxyXG5cclxuICAgIHN0YXRpYyAgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBBc3NldFBhdGgudmVyc2lvbnJhbmRvbSA9IFwiP3Y9XCIgKyBNYXRoLnJhbmRvbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgZ2V0c291bmQoIGlkOnN0cmluZyApOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzb3VyY2VzICsgQXNzZXRQYXRoLm11c2ljICsgaWQgK1wiLm1wM1wiICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljICBnZXRSZXNDb25maWcoKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlc291cmNlcyAgKyBcInJlc0NvbmZpZy5qc29uXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldENvbmZpZyggY29uZmlnbmFtZTpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlc291cmNlcyAgKyBjb25maWduYW1lICtcIi5iaW5cIiApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgZ2V0M0RzY2VuZSggbmFtZTphbnkgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlcyArIEFzc2V0UGF0aC5wcm9wICsgXCJDb252ZW50aW9uYWwvXCIgKyBuYW1lICsgXCIubHNcIiApO1xyXG4gICAgfSBcclxuXHJcbiAgICBzdGF0aWMgIGdldDNETW9kZWwoIG5hbWU6YW55ICk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgKyBBc3NldFBhdGgucHJvcCArIFwiQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxoXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldDNEUm9sZU1vZGVsKCBuYW1lOmFueSApOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBHbG9iYWwuZ2V0VXJsKCBBc3NldFBhdGgucmVzICsgXCJjaGFyYWN0ZXIvQ29udmVudGlvbmFsL1wiICsgbmFtZSArIFwiLmxoXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldHJvbGVpY29uKCBpZDpzdHJpbmcgKTpzdHJpbmdcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlcyAgKyBcInNraW5pY29uL1wiICsgaWQgKyBcIi5wbmdcIiApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyAgZ2V0VmVyaXNvbnVybCgpOnN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIGlmKCBHbG9iYWwuaXNkZWJ1ZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlcyArIFwidmVyc2lvbi5qc29uXCIgKSArIEFzc2V0UGF0aC52ZXJzaW9ucmFuZG9tO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gR2xvYmFsLmdldFVybCggQXNzZXRQYXRoLnJlcyArIFwidmVyc2lvblwiICsgR2xvYmFsLnJlc2NvbmZpZ1ZlcnNpb24gKyBcIi5qc29uXCIgKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgIGdldEdhbWVWZXJzaW9uKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIFwiZ2FtZXZlcnNpb24uanNvblwiICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6I635Y+W5Yy56YWN5Lq654mp5aS05YOPaWNvbiAqL1xyXG4gICAgc3RhdGljIHBpcGVpaWNvbiAoaWQ6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICAgICAgcmV0dXJuIEdsb2JhbC5nZXRVcmwoIEFzc2V0UGF0aC5yZXMgICsgXCJpY29uL1wiICsgaWQgKyBcIi5wbmdcIiApO1xyXG4gICAgfVxyXG5cclxuICBcclxufSAiLCJpbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi9Bc3NldFBhdGhcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5cclxuLypcclxuKiBuYW1lO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgUmVjQ29uZmlncyBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpSZWNDb25maWdzO1xyXG5cclxuICAgIHB1YmxpYyBSZXNEaWM6YW55O1xyXG4gICAgLyoqXHJcbiAgICAgKiDmmK/lkKblt7Lnu4/liJ3lp4vljJZcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBpbml0ZWQ6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6UmVjQ29uZmlnc1xyXG4gICAge1xyXG4gICAgICAgIGlmKCBSZWNDb25maWdzLmlucyA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVjQ29uZmlncygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVjQ29uZmlncy5pbnM7XHJcbiAgICB9XHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBSZWNDb25maWdzLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5SZXNEaWMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGxvYWRVSSgpOnZvaWQge1xyXG4gICAgICAgIExheWEubG9hZGVyLmxvYWQoW1wicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiXSwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBmdW5jdGlvbigpOnZvaWQge1xyXG4gICAgICAgICAgICB2YXIgY2hhbmdlQWN0aW9uQnV0dG9uOkxheWEuQnV0dG9uID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5CdXR0b24oXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCIsIFwi5q2j5bi45qih5byPXCIpKSBhcyBMYXlhLkJ1dHRvbjtcclxuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnNpemUoMTYwLCA0MCk7XHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5sYWJlbEJvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWxTaXplID0gMzA7XHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5zaXplR3JpZCA9IFwiNCw0LDQsNFwiO1xyXG4gICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2NhbGUoTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8sIExheWEuQnJvd3Nlci5waXhlbFJhdGlvKTtcclxuICAgICAgICAgICAgY2hhbmdlQWN0aW9uQnV0dG9uLnBvcyhMYXlhLnN0YWdlLndpZHRoIC8gMiAtIGNoYW5nZUFjdGlvbkJ1dHRvbi53aWR0aCAqIExheWEuQnJvd3Nlci5waXhlbFJhdGlvIC8gMiwgTGF5YS5zdGFnZS5oZWlnaHQgLSAxMDAgKiBMYXlhLkJyb3dzZXIucGl4ZWxSYXRpbyk7XHJcbiAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCBmdW5jdGlvbigpOnZvaWQge1xyXG4gICAgICAgICAgICAgICAgaWYgKCsrdGhpcy5jdXJTdGF0ZUluZGV4ICUgMiA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcHJpdGUzRC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVTcHJpdGUzRC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5sYWJlbCA9IFwi572R5qC85qih5byPXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ByaXRlM0QuYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVTcHJpdGUzRC5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWwgPSBcIuato+W4uOaooeW8j1wiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHVibGljIGluaXRSZWMoIF9yZXM6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgaWYoIF9yZXMgIT0gbnVsbCAmJiAhUmVjQ29uZmlncy5pbml0ZWQgKVxyXG4gICAgICAge1xyXG4gICAgICAgICAgICBSZWNDb25maWdzLmluaXRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBncm91cHNBcnI6QXJyYXk8YW55PiA9IF9yZXMuZ3JvdXBzO1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VzQXJyOkFycmF5PGFueT4gPSBfcmVzLnJlc291cmNlcztcclxuICAgICAgICAgICAgdmFyIHJlc291cmNlc0RpY3Q6YW55ID0ge307XHJcbiAgICAgICAgICAgIGZvciggdmFyIGl0ZW0gaW4gcmVzb3VyY2VzQXJyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkOmFueSA9IHJlc291cmNlc0FycltpdGVtXTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCggY2hpbGQudHlwZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJpblwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5Mb2FkZXIuQlVGRkVSO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC50eXBlID0gTGF5YS5TY2VuZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGhcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHlwZSA9IExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxtXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnR5cGUgPSBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc291cmNlc0RpY3RbY2hpbGQubmFtZV0gPSBjaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IoIHZhciBncm91cHR5cGUgaW4gZ3JvdXBzQXJyIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGdyb3VwY2hpbGQ6YW55ID0gZ3JvdXBzQXJyW2dyb3VwdHlwZV07XHJcbiAgICAgICAgICAgICAgICB2YXIgYXJyOkFycmF5PHN0cmluZz4gPSBncm91cGNoaWxkLmtleXMuc3BsaXQoIFwiLFwiICk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRBcnI6QXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWRzdHI7XHJcbiAgICAgICAgICAgICAgICBmb3IoIGNoaWRzdHIgaW4gYXJyIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyQ2hpbGQ6c3RyaW5nID0gYXJyW2NoaWRzdHJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKCBzdHJDaGlsZCAhPSBcIlwiIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxzOnN0cmluZyA9IHJlc291cmNlc0RpY3Rbc3RyQ2hpbGRdLnVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXJscyA9IHVybHMucmVwbGFjZShcInJlcy9cIixBc3NldFBhdGgucmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRBcnIucHVzaCggeyB1cmw6R2xvYmFsLmdldFVybCh1cmxzKSwgdHlwZTpyZXNvdXJjZXNEaWN0W3N0ckNoaWxkXS50eXBlIH0gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLlJlc0RpY1tncm91cGNoaWxkLm5hbWVdID0gY2hpbGRBcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXMoQXNzZXRQYXRoLmdldFJlc0NvbmZpZygpKTtcclxuICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxufSIsImltcG9ydCBFdmVudERpc3BhdGNoZXI9TGF5YS5FdmVudERpc3BhdGNoZXI7XHJcbmltcG9ydCBTcHJpdGUzRCA9IExheWEuU3ByaXRlM0Q7XHJcbmltcG9ydCBWZWN0b3IzPUxheWEuVmVjdG9yMztcclxuZXhwb3J0IGNsYXNzIEFzc2V0UGF0aFxyXG57XHJcbiAgIFxyXG4gICAgLyrnspLlrZDnibnmlYjlnLDlnYAqL1xyXG4gICAgc3RhdGljIEZ4UHJlZmFic1BhdGg9XCJyZXMvY2hhcmFjdGVyL0ZYL0NvbnZlbnRpb25hbC9GWC5saFwiO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFzc2V0TWFuYWdlclxyXG57XHJcblxyXG4gICAgLyoq5omA5pyJ5Zyw5Zu+Ki9cclxuICAgIHN0YXRpYyBBbGxNYXBEaWM6U3ByaXRlM0RbXT1uZXcgQXJyYXkoKTtcclxuXHJcblxyXG4gICAgLyoq5Yqg6L296LWE5rqQKi9cclxuICAgIHN0YXRpYyBMb2FkQXNzZXRGdW4oZnVuOkZ1bmN0aW9uKVxyXG4gICAge1xyXG4gICAgICAgIHZhciByZXNwYXRoczpzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIHJlc3BhdGhzPXJlc3BhdGhzLmNvbmNhdChBc3NldFBhdGguRnhQcmVmYWJzUGF0aCk7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIuY3JlYXRlKHJlc3BhdGhzLExheWEuSGFuZGxlci5jcmVhdGUodGhpcywoKT0+e1xyXG5cclxuICAgICAgICAgICB2YXIgUGxheWVyUHJlZmFicz1MYXlhLmxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLkZ4UHJlZmFic1BhdGgpIGFzIFNwcml0ZTNEO1xyXG4gICAgICAgICAgIGlmKFBsYXllclByZWZhYnMpXHJcbiAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPFBsYXllclByZWZhYnMubnVtQ2hpbGRyZW47aSsrKVxyXG4gICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHZhciBhc3NldD1QbGF5ZXJQcmVmYWJzLmdldENoaWxkQXQoaSkgYXMgU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICAgIGFzc2V0LmFjdGl2ZT1mYWxzZTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5BbGxNYXBEaWMucHVzaChhc3NldCk7XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIuY2xlYXJSZXMoQXNzZXRQYXRoLkZ4UHJlZmFic1BhdGgpO1xyXG4gICAgICAgICAgIH1lbHNlXHJcbiAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlBvbGljZVByZWZhYnPkuLrnqbpcIik7XHJcbiAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmKGZ1bilcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZnVuKCk7XHJcblxyXG4gICAgICAgICAgICB9ZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImZ1buS4uuepulwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KSk7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG59XHJcblxyXG4iLCJpbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5cclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpBdWRpb0NvbnRyb2w7XHJcbiAgICBwcml2YXRlIF9pc2JnT3Blbjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgb3Blbjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX2lzQWxsT3Blbjpib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX25vd0JnTmFtZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfaXNQbGF5Ymdpbmc6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLyoqXHJcbiAgICAgKiDlo7Dpn7PlvIDlhbPlvJXnlKjntKLlvJVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfc291bmRJbmRleDpudW1iZXIgPSAwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOkF1ZGlvQ29udHJvbFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBBdWRpb0NvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBdWRpb0NvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEF1ZGlvQ29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuYXV0b1JlbGVhc2VTb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLmF1dG9TdG9wTXVzaWMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgZ2FtZXNvdW5kT3Blbih2YWx1ZTpib29sZWFuKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMub3BlbiA9IHZhbHVlO1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnNvdW5kTXV0ZWQgPSAhdmFsdWU7XHJcbiAgICAgICAgaWYoIHZhbHVlID09IHRydWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlDb25maWcuYnV0dG9uU291bmRWb2x1bWVTY2FsZSA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kVm9sdW1lU2NhbGUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOmfs+aViOaYr+WQpuW8gOWQr1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IEdldFNvdW5kU3dpdGNoKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBpc2JnT3Blbih2YWx1ZTpib29sZWFuKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2lzYmdPcGVuID0gdmFsdWU7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIubXVzaWNNdXRlZCA9ICF2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiDjOaZr+mfs+S5kOaYr+WQpuW8gOWQr1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzYmdPcGVuKCk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc2JnT3BlbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGlzQWxsT3BlbiggdmFsdWU6Ym9vbGVhbiApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHZhbHVlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdW5kSW5kZXgtLTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX3NvdW5kSW5kZXggPCAwIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc291bmRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIXRoaXMuX2lzUGxheWJnaW5nJiZ0aGlzLl9zb3VuZEluZGV4PT0wIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNBbGxPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0R2FtZVZvbHVtZSggMSApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5YmdTb3VuZCggdGhpcy5fbm93QmdOYW1lICk7XHJcbiAgICAgICAgICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy5idXR0b25Tb3VuZFZvbHVtZVNjYWxlID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lzQWxsT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzQWxsT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fc291bmRJbmRleCA8IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9zb3VuZEluZGV4Kys7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuX2lzUGxheWJnaW5nKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BiZ1NvdW5kKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXRHYW1lVm9sdW1lKCAwICk7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmJ1dHRvblNvdW5kVm9sdW1lU2NhbGUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWBnOatouaSreaUvumfs+aViFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RvcEdhbWVTb3VuZCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zdG9wQWxsU291bmQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWBnOatouaJgOacieWjsOmfs1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ2xlYXJBbGxTT1VORCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnN0b3BHYW1lU291bmQoKTtcclxuICAgICAgICB0aGlzLnN0b3BiZ1NvdW5kKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmkq3mlL7og4zmma/pn7PkuZBcclxuICAgICAqIEBwYXJhbSBzb3VuZE5hbWUg5aOw6Z+z5ZCNXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwbGF5YmdTb3VuZCggc291bmROYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9ub3dCZ05hbWUgPSBzb3VuZE5hbWU7XHJcbiAgICAgICAgaWYoIHRoaXMuX2lzQWxsT3BlbiAmJiB0aGlzLl9ub3dCZ05hbWUgIT0gXCJcIiAmJiB0aGlzLl9zb3VuZEluZGV4PD0gMCAmJiAhdGhpcy5faXNQbGF5YmdpbmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5faXNQbGF5YmdpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5wbGF5TXVzaWMoIEFzc2V0UGF0aC5nZXRzb3VuZCggdGhpcy5fbm93QmdOYW1lICkgKTtcclxuICAgICAgICAgICAgdGhpcy5iZ1NvdW5kVm9sdW1lID0gMC40O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWBnOatouiDjOaZr+mfs+S5kFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RvcGJnU291bmQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faXNQbGF5YmdpbmcgPSBmYWxzZTtcclxuICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5zdG9wTXVzaWMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOaJgOaciemfs+S5kOaYr+WQpuW8gOWQr1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGlzQWxsT3BlbigpOmJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNBbGxPcGVuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u6IOM5pmv6Z+z5LmQ6Z+z6YePXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUg6Z+z6YeP6IyD5Zu05LuOIDDvvIjpnZnpn7PvvInoh7MgMe+8iOacgOWkp+mfs+mHj++8ieOAglxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IGJnU291bmRWb2x1bWUoIHZhbHVlOm51bWJlciApXHJcbiAgICB7XHJcbiAgICAgICAgTGF5YS5Tb3VuZE1hbmFnZXIuc2V0TXVzaWNWb2x1bWUoIHZhbHVlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBiZ1NvdW5kVm9sdW1lKCk6bnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIExheWEuU291bmRNYW5hZ2VyLm11c2ljVm9sdW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6K6+572u6IOM5pmv6Z+z5LmQ6Z+z6YePXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUg6Z+z6YeP6IyD5Zu05LuOIDDvvIjpnZnpn7PvvInoh7MgMe+8iOacgOWkp+mfs+mHj++8ieOAglxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0IHNvdW5kVm9sdW1lKCB2YWx1ZTpudW1iZXIgKVxyXG4gICAge1xyXG4gICAgICAgIExheWEuU291bmRNYW5hZ2VyLnNldFNvdW5kVm9sdW1lKCB2YWx1ZSApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgc291bmRWb2x1bWUoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTGF5YS5Tb3VuZE1hbmFnZXIuc291bmRWb2x1bWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDorr7nva7miYDmnInlo7Dpn7Ppn7Pph49cclxuICAgICAqIEBwYXJhbSB2YWx1ZSDpn7Pph4/ojIPlm7Tku44gMO+8iOmdmemfs++8ieiHsyAx77yI5pyA5aSn6Z+z6YeP77yJ44CCXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRHYW1lVm9sdW1lKHZhbHVlOm51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuYmdTb3VuZFZvbHVtZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuc291bmRWb2x1bWUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICAvKipcclxuICAgICAqIOaSreaUvumfs+aViFxyXG4gICAgICogQHBhcmFtIHNvdW5kTmFtZSDpn7PmlYjlkI1cclxuICAgICAqIEBwYXJhbSBsb29wIOaSreaUvuasoeaVsFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGxheUdhbWVTb3VuZCggc291bmROYW1lOnN0cmluZywgbG9vcDpudW1iZXIgPSAxICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9pc0FsbE9wZW4gJiYgc291bmROYW1lICE9IFwiXCIgJiYgTGF5YS5Tb3VuZE1hbmFnZXIuc291bmRWb2x1bWUgIT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLlNvdW5kTWFuYWdlci5wbGF5U291bmQoIEFzc2V0UGF0aC5nZXRzb3VuZCggc291bmROYW1lICksbG9vcCApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBcclxufSIsImltcG9ydCB7UmVzb3VyY2VDb250cm9sfSBmcm9tIFwiLi9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtSZXNEYXRhQ29udHJvbH0gZnJvbSBcIi4vUmVzRGF0YUNvbnRyb2xcIjtcclxuaW1wb3J0IHtTa2luSXRlbX0gZnJvbSBcIi4uL3V0aWxzL1NraW5JdGVtXCI7XHJcbmltcG9ydCBDcGFEb3duc1ZpZXcgZnJvbSBcIi4uL1B1c2gvQ3BhRG93bnNWaWV3XCI7XHJcbmltcG9ydCBDcGFJdGVtIGZyb20gXCIuLi9QdXNoL0NwYUl0ZW1cIjtcclxuaW1wb3J0IEJhb0t1YW5HYW1lVmlldyBmcm9tIFwiLi4vUHVzaC9CYW9LdWFuR2FtZVZpZXdcIjtcclxuaW1wb3J0IFNoaXdhbnR1aWppYW5WaWV3IGZyb20gXCIuLi9QdXNoL1NoaXdhbnR1aWppYW5WaWV3XCI7XHJcbmltcG9ydCBGcmllbmRJbnZpdGVWaWV3IGZyb20gXCIuLi9QdXNoL0ZyaWVuZEludml0ZVZpZXdcIjtcclxuaW1wb3J0IFR1aWppYW5WaWV3IGZyb20gXCIuLi9QdXNoL1R1aWppYW5WaWV3XCI7XHJcbmltcG9ydCBHaWZ0VmlldyBmcm9tIFwiLi4vVmlldy9HaWZ0Vmlld1wiO1xyXG5cclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIENvbm5lY3RDb250cm9sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOe7hOS7tue7keWumlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIENvbm5lY3RDb21wb25lbnQoKTogdm9pZCBcclxuICAgIHtcclxuICAgICAgICAvL21haW5cclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgycHdsazFhXCIsIFNraW5JdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTI3XCIsIENwYURvd25zVmlldyk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyOFwiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTI5XCIsIEJhb0t1YW5HYW1lVmlldyk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyYVwiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTJiXCIsIFNoaXdhbnR1aWppYW5WaWV3KTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTJjXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJla3NjMjFcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmVrc2MyMlwiLCBDcGFJdGVtKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oXCJ1aTovL2xlY3h5bmgyazhjNTJlXCIsIENwYUl0ZW0pO1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJT2JqZWN0RmFjdG9yeS5zZXRQYWNrYWdlSXRlbUV4dGVuc2lvbihcInVpOi8vbGVjeHluaDJ1b3R1NmhcIiwgQ3BhSXRlbSk7XHJcbiAgICAgICAgLy8gZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmlwNjE2bFwiLCBHaWZ0Vmlldyk7XHJcbiAgICAgICAgLy8gZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMms4YzUyZFwiLCBUdWlqaWFuVmlldyk7XHJcbiAgICAgICAgLy8gZmFpcnlndWkuVUlPYmplY3RGYWN0b3J5LnNldFBhY2thZ2VJdGVtRXh0ZW5zaW9uKFwidWk6Ly9sZWN4eW5oMmthbHI2a1wiLEZyaWVuZEludml0ZVZpZXcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgbW90aW9uQ3Jvc3M6Qm9vbGVhbiA9IGZhbHNlO1xyXG5cdHByaXZhdGUgYmxlbmRUeXBlOm51bWJlciA9IDA7XHJcblx0cHJpdmF0ZSBtb3Rpb25JbmRleDpudW1iZXIgPSAwO1xyXG5cdHByaXZhdGUgbW90aW9uczpBcnJheTxzdHJpbmc+ID0gW1wicnVuXCIsIFwicnVuXzJcIiwgXCJhdHRhY2tcIiwgXCJhdHRhY2tfMVwiLCBcImF0dGFja18yXCIsIFwiZGVhZFwiLCBcImlkbGVfMlwiLCBcImlkbGVfM1wiLCBcImlkbGVfNFwiLCBcImlkbGU0XCIsIFwicmVsb2FkXCIsIFwicmVwbGFjZVwiLCBcInJlcGxhY2VfMlwiLCBcInN0b3BcIl07XHJcblx0XHJcbiAgICBwcml2YXRlIHNjZW5lTG9hZGVkKHNjZW5lOkxheWEuU2NlbmUzRCk6dm9pZCB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChzY2VuZSk7XHJcbiAgICAgICAgdmFyIGFuaW1hdG9yOkxheWEuQW5pbWF0b3IgPSBzY2VuZS5nZXRDaGlsZEF0KDIpLmdldENvbXBvbmVudChMYXlhLkFuaW1hdG9yKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmFkZEJ1dHRvbigxMDAsIDEwMCwgMTYwLCAzMCwgXCLliqjnlLvov4fmuKE65ZCmXCIsIDIwLCBmdW5jdGlvbihlOkxheWEuRXZlbnQpOnZvaWQge1xyXG4gICAgICAgICAgICB0aGlzLm1vdGlvbkNyb3NzID0gIXRoaXMubW90aW9uQ3Jvc3M7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vdGlvbkNyb3NzKVxyXG4gICAgICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5Yqo55S76L+H5rihOuaYr1wiO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAoZS50YXJnZXQgYXMgTGF5YS5CdXR0b24pLmxhYmVsID0gXCLliqjnlLvov4fmuKE65ZCmXCI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b24oMTAwLCAxNjAsIDE2MCwgMzAsIFwi5re35ZCI5qih5byPOuWFqOi6q1wiLCAyMCwgZnVuY3Rpb24oZTpMYXlhLkV2ZW50KTp2b2lkIHtcclxuICAgICAgICAgICAgdGhpcy5ibGVuZFR5cGUrKzsgICBcclxuICAgICAgICAgICAgKHRoaXMuYmxlbmRUeXBlID09PSAzKSAmJiAodGhpcy5ibGVuZFR5cGUgPSAwKTtcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmJsZW5kVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIDA6IFxyXG4gICAgICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5re35ZCI5qih5byPOuWFqOi6q1wiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTogXHJcbiAgICAgICAgICAgICAgICAoZS50YXJnZXQgYXMgTGF5YS5CdXR0b24pLmxhYmVsID0gXCLmt7flkIjmqKHlvI865LiK6LqrXCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOiBcclxuICAgICAgICAgICAgICAgIChlLnRhcmdldCBhcyBMYXlhLkJ1dHRvbikubGFiZWwgPSBcIua3t+WQiOaooeW8jzrkuIvouqtcIjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5hZGRCdXR0b24oMTAwLCAyMjAsIDI2MCwgNDAsIFwi5YiH5o2i5Yqo5L2cOmF0dGFja18yXCIsIDI4LCBmdW5jdGlvbihlOkxheWEuRXZlbnQpOnZvaWQge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYmxlbmRUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDogXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb3Rpb25Dcm9zcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLmNyb3NzRmFkZSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDAuMiwgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IuY3Jvc3NGYWRlKHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMC4yLCAxKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IucGxheSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLnBsYXkodGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIDE6IFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubW90aW9uQ3Jvc3MpXHJcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IuY3Jvc3NGYWRlKHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMC4yLCAwKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBhbmltYXRvci5wbGF5KHRoaXMubW90aW9uc1t0aGlzLm1vdGlvbkluZGV4XSwgMCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAyOiBcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vdGlvbkNyb3NzKVxyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdG9yLmNyb3NzRmFkZSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDAuMiwgMSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0b3IucGxheSh0aGlzLm1vdGlvbnNbdGhpcy5tb3Rpb25JbmRleF0sIDEpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKGUudGFyZ2V0IGFzIExheWEuQnV0dG9uKS5sYWJlbCA9IFwi5YiH5o2i5Yqo5L2cOlwiICsgdGhpcy5tb3Rpb25zW3RoaXMubW90aW9uSW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLm1vdGlvbkluZGV4Kys7XHJcbiAgICAgICAgICAgICh0aGlzLm1vdGlvbkluZGV4ID09PSB0aGlzLm1vdGlvbnMubGVuZ3RoKSAmJiAodGhpcy5tb3Rpb25JbmRleCA9IDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwcml2YXRlIGFkZEJ1dHRvbih4Om51bWJlciwgeTpudW1iZXIsIHdpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlciwgdGV4dDpzdHJpbmcsIHNpemU6bnVtYmVyLCBjbGlja0Z1bjpGdW5jdGlvbik6dm9pZCB7XHJcbiAgICAgICAgdmFyIHRoaXNzID0gdGhpcztcclxuICAgICAgICBMYXlhLmxvYWRlci5sb2FkKFtcInJlcy90aHJlZURpbWVuL3VpL2J1dHRvbi5wbmdcIl0sIExheWEuSGFuZGxlci5jcmVhdGUobnVsbCwgZnVuY3Rpb24oKTp2b2lkIHtcclxuICAgICAgICB2YXIgY2hhbmdlQWN0aW9uQnV0dG9uOkxheWEuQnV0dG9uID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5CdXR0b24oXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCIsIHRleHQpKSBhcyBMYXlhLkJ1dHRvbjtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWxCb2xkID0gdHJ1ZTtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ubGFiZWxTaXplID0gc2l6ZTtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2l6ZUdyaWQgPSBcIjQsNCw0LDRcIjtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24uc2NhbGUoTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8sIExheWEuQnJvd3Nlci5waXhlbFJhdGlvKTtcclxuICAgICAgICBjaGFuZ2VBY3Rpb25CdXR0b24ucG9zKHgsIHkpO1xyXG4gICAgICAgIGNoYW5nZUFjdGlvbkJ1dHRvbi5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzcywgY2xpY2tGdW4pO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog5pWw5o2u57uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29ubm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5Db25uZWN0RmFpcnlndWkoKTtcclxuICAgICAgICB0aGlzLkNvbm5lY3RDb21wb25lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHVp5qGG5p6255qE57uR5a6aXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29ubmVjdEZhaXJ5Z3VpKCk6IHZvaWQge1xyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmdhbWVMb2FkZXJNYW5hZ2VyID0gUmVzb3VyY2VDb250cm9sLkluc3RhbmNlO1xyXG4gICAgICAgIC8v54m55pWI57uR5a6aKCB1cmwg57uR5a6a57uE5ZCN77yM5Y+q5pyJ5YWs5YWx54m55pWI6ZyA6KaB57uR5a6aICkgXCJ1aTovL2ZxcGd4cjFrbDZtdzBcIjpcImVmZmVjdDFcIlxyXG4gICAgICAgIGZhaXJ5Z3VpLlVJQ29uZmlnLmdhbWVFZmZlY3REaWN0ID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgXHJcbn0iLCJpbXBvcnQge0xvY2FsRGF0YUNvbnRyb2x9IGZyb20gXCIuL0xvY2FsRGF0YUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgVGltZVV0aWxzIH0gZnJvbSBcIi4uL1RpbWUvVGltZVV0aWxzXCI7XHJcbmltcG9ydCB7VXNlckRhdGFJbmZvfSBmcm9tIFwiLi4vRGF0YS9Vc2VyRGF0YUluZm9cIjtcclxuaW1wb3J0IHsgVGltZXNUYW1wZXIgfSBmcm9tIFwiLi4vVGltZS9UaW1lc1RhbXBlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERhdGVDb250cm9se1xyXG4gICAgcHVibGljIHN0YXRpYyBGcmVzaDpib29sZWFuO1xyXG4gICAgXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6RGF0ZUNvbnRyb2w7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIERhdGVDb250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgIEluc3RhbmNlKCk6RGF0ZUNvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggRGF0ZUNvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlQ29udHJvbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gRGF0ZUNvbnRyb2wuaW5zO1xyXG4gICAgfVxyXG5cclxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGxvYWRVSSgpOnZvaWQge1xyXG4gICAgICAgIExheWEubG9hZGVyLmxvYWQoW1wicmVzL3RocmVlRGltZW4vdWkvYnV0dG9uLnBuZ1wiXSwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBmdW5jdGlvbigpOnZvaWQge1xyXG4gICAgICAgICAgICB2YXIgYnV0dG9uID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5CdXR0b24oXCJyZXMvdGhyZWVEaW1lbi91aS9idXR0b24ucG5nXCIsIFwi5YWz6ZetSERSXCIpKSBhcyBMYXlhLkJ1dHRvbjtcclxuICAgICAgICAgICAgYnV0dG9uLnNpemUoMjAwLCA0MCk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5sYWJlbEJvbGQgPSB0cnVlO1xyXG4gICAgICAgICAgICBidXR0b24ubGFiZWxTaXplID0gMzA7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5zaXplR3JpZCA9IFwiNCw0LDQsNFwiO1xyXG4gICAgICAgICAgICBidXR0b24uc2NhbGUoTGF5YS5Ccm93c2VyLnBpeGVsUmF0aW8sIExheWEuQnJvd3Nlci5waXhlbFJhdGlvKTtcclxuICAgICAgICAgICAgYnV0dG9uLnBvcyhMYXlhLnN0YWdlLndpZHRoIC8gMiAtIGJ1dHRvbi53aWR0aCAqIExheWEuQnJvd3Nlci5waXhlbFJhdGlvIC8gMiwgTGF5YS5zdGFnZS5oZWlnaHQgLSA2MCAqIExheWEuQnJvd3Nlci5waXhlbFJhdGlvKTtcclxuICAgICAgICAgICAgYnV0dG9uLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIGZ1bmN0aW9uKCk6dm9pZCB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5hYmxlSERSOkJvb2xlYW4gPSB0aGlzLmNhbWVyYS5lbmFibGVIRFI7XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5hYmxlSERSKVxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5sYWJlbCA9IFwi5byA5ZCvSERSXCI7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmxhYmVsID0gXCLlhbPpl61IRFJcIjtcclxuXHRcdFx0XHRcdHRoaXMuY2FtZXJhLmVuYWJsZUhEUiA9ICFlbmFibGVIRFI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgU2V0U2VsZigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbGFzdGRheTpzdHJpbmcgPSBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmdldHN0ciggVXNlckRhdGFJbmZvLmxhc3REYXkgKVxyXG4gICAgICAgIHZhciBub3dkYXk6c3RyaW5nID0gVGltZVV0aWxzLmZvcm1hdFllYXJNb250aERhdGUxKCBUaW1lc1RhbXBlci5JbnN0YW5jZS5zZXJ2ZXJUaW1lICk7XHJcbiAgICAgICAgaWYoIGxhc3RkYXkgIT0gbm93ZGF5IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ubGFzdERheSxub3dkYXkgKTtcclxuICAgICAgICAgICAgRGF0ZUNvbnRyb2wuRnJlc2ggPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBEYXRlQ29udHJvbC5GcmVzaCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7IEpveXN0aWNrTW9kdWxlIH0gZnJvbSBcIi4uL0pveXN0aWNrTW9kdWxlXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7R2FtZVN0YXRlfSBmcm9tIFwiLi4vdXRpbHMvR2FtZVN0YXRlXCI7XHJcbmltcG9ydCB7U2NlbmVDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9TY2VuZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHtOcGNTY3JpcHR9IGZyb20gXCIuLi9HYW1lL05wY1NjcmlwdFwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCBHYW1lQ0ZHIGZyb20gXCIuLi9DRkcvR2FtZUNGR1wiO1xyXG5pbXBvcnQge0F1ZGlvQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvQXVkaW9Db250cm9sXCI7XHJcbmltcG9ydCB7IFd4QXBpIH0gZnJvbSBcIi4uL1dYU0RLL1Nka1wiO1xyXG5pbXBvcnQge1JvbGVEYXRhfSBmcm9tIFwiLi4vRGF0YS9Sb2xlRGF0YVwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9QYW5lbFJlc0RpY1wiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCB7QWdlbmN5VHJpYWx9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VHJpYWxcIjtcclxuaW1wb3J0IHtBZ2VuY3lTa2lufSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVNraW5cIjtcclxuaW1wb3J0IHtTa2luRGF0YX0gZnJvbSBcIi4uL0RhdGEvU2tpbkRhdGFcIjtcclxuaW1wb3J0IHsgRGlzUGF0Y2hlck9uIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc1BhdGNoZXJPblwiO1xyXG5pbXBvcnQgeyBSZWNvcmRNYW5hZ2VyIH0gZnJvbSBcIi4uL1dYU0RLL1JlY29yZE1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHYW1lU3RhdGVDb250cm9sIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuICAgIHByaXZhdGUgc3RhdGljIGluczpHYW1lU3RhdGVDb250cm9sO1xyXG5cclxuICAgIHByaXZhdGUgX2pveXN0aWNrTW9kdWxlOkpveXN0aWNrTW9kdWxlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogMDrmnKrlvIDlp4vvvIwx77ya5ri45oiP5Lit77yMMu+8muaaguWBnOS4rVxyXG4gICAgICovXHJcbiAgICBub3dHYW1lU3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF96aHVhbnhpYW5nYmVpc2h1Om51bWJlciA9IDA7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIEdhbWVTdGF0ZUNvbnRyb2wuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOkdhbWVTdGF0ZUNvbnRyb2xcclxuICAgIHtcclxuICAgICAgICBpZiggR2FtZVN0YXRlQ29udHJvbC5pbnMgPT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEdhbWVTdGF0ZUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEdhbWVTdGF0ZUNvbnRyb2wuaW5zO1xyXG4gICAgfSAgIFxyXG5cclxuICAgIHByaXZhdGUgX2h1YWRvbmdTcGVlZFg6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2h1YWRvbmdDbGltYlNwZWVkWDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBlbmRHYW1lUGxheWVyQXJyOkFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgaW5pdCggKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5faHVhZG9uZ1NwZWVkWCA9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNF0udmFsdWUpO1xyXG4gICAgICAgIHRoaXMuX2h1YWRvbmdDbGltYlNwZWVkWCA9IE51bWJlcihHYW1lQ0ZHLmRpY3RbNV0udmFsdWUpO1xyXG4gICAgICAgIGlmKCBHYW1lQ0ZHLmRpY3RbN10gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5femh1YW54aWFuZ2JlaXNodSA9IE51bWJlciggR2FtZUNGRy5kaWN0WzddLnZhbHVlICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3podWFueGlhbmdiZWlzaHUgPSAyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmluaXRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoIEdhbWVTdGF0ZS5sb3NlLHRoaXMsdGhpcy5lbmRHYW1lKTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCBHYW1lU3RhdGUuZW5kLHRoaXMsdGhpcy5lbmRHYW1lICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLm5wY2VuZCx0aGlzLHRoaXMubnBjZW5kR2FtZUhhbmRsZXIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG5wY2VuZEdhbWVIYW5kbGVyKCBzdHI6c3RyaW5nICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuZW5kR2FtZVBsYXllckFyci5wdXNoKCBzdHIgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q2xpY2tQYW5lbCggcGFuZWw6ZmFpcnlndWkuR0xvYWRlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9qb3lzdGlja01vZHVsZSA9IG5ldyBKb3lzdGlja01vZHVsZShwYW5lbCk7XHJcbiAgICAgICAgdGhpcy5fam95c3RpY2tNb2R1bGUuc2V0RXZlbnRDYWxsYmFjayggdGhpcyx0aGlzLm9uZG93bmZ1bix0aGlzLm9ubW92ZWZ1bix0aGlzLm9udXBmdW4gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pc25lZWRTaHVueWlYOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX25vd1RpbWU6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgb25kb3duZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2xhc3RBbmdsZSA9IDA7XHJcbiAgICAgICAgdGhpcy5fbm93VGltZSA9IExheWEuQnJvd3Nlci5ub3coKS8xMDAwO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfbGFzdEFuZ2xlOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIG9ubW92ZWZ1biggb2Zmc2V0WDpudW1iZXIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGRpc0FuZ2xlOm51bWJlciA9IHRoaXMuX2pveXN0aWNrTW9kdWxlLmFuZ2xlIC0gdGhpcy5fbGFzdEFuZ2xlO1xyXG4gICAgICAgICAgICB0aGlzLl9sYXN0QW5nbGUgPSB0aGlzLl9qb3lzdGlja01vZHVsZS5hbmdsZTtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmlzY2FybWFucGMgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAoUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdFtcIm5wY18wXCJdIGFzIE5wY1NjcmlwdCkuSm95KG9mZnNldFggPiAwID8gdGhpcy5faHVhZG9uZ1NwZWVkWDotdGhpcy5faHVhZG9uZ1NwZWVkWCxkaXNBbmdsZSp0aGlzLl96aHVhbnhpYW5nYmVpc2h1KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFNjZW5lQ29udHJvbC5JbnN0YW5jZS5QbGF5ZXJTY3JpcHQuSm95KCBvZmZzZXRYID4gMCA/IHRoaXMuX2h1YWRvbmdTcGVlZFg6LXRoaXMuX2h1YWRvbmdTcGVlZFgsb2Zmc2V0WCA+IDAgPyB0aGlzLl9odWFkb25nQ2xpbWJTcGVlZFg6LXRoaXMuX2h1YWRvbmdDbGltYlNwZWVkWCxkaXNBbmdsZSp0aGlzLl96aHVhbnhpYW5nYmVpc2h1ICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbnVwZnVuKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBQcm9wTWFuYWdlci5pc2Nhcm1hbnBjIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIChQcm9wTWFuYWdlci5ucGNzY3JpcHREaWN0W1wibnBjXzBcIl0gYXMgTnBjU2NyaXB0KS5Kb3koMCwwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMubm93R2FtZVN0YXRlID09IDEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBTY2VuZUNvbnRyb2wuSW5zdGFuY2UuUGxheWVyU2NyaXB0LkpveSggMCwwLDAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90aW1lOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbm93TWluZ0NpOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9udW1zOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9hbGw6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dHYW1lU3RhdGUgPT0gMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lID0gMDtcclxuICAgICAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdDtcclxuICAgICAgICAgICAgdGhpcy5fbnVtcyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX2FsbCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgbnBjc3A6TnBjU2NyaXB0O1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5wY3NwID0gbnBjZGljdFtzXTtcclxuICAgICAgICAgICAgICAgIGlmKCBucGNzcC5nZXRBY3Rpb24oKSA9PSAxIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnogPCBucGNzcC5nZXRQb3N0aW9uKCkueiApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9udW1zKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FsbCArKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLm5vd01pbmdDaSA9IHRoaXMuZW5kR2FtZVBsYXllckFyci5sZW5ndGggKyAoKCB0aGlzLl9hbGwgKyAxICkgLSB0aGlzLl9udW1zKTtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIudHh0X21pbmdjaS50ZXh0ID0gXCLnrKxcIiArIHRoaXMubm93TWluZ0NpICsgXCLlkI1cIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXJ0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlKS5Sb2xlRGF0YTtcclxuICAgICAgICB2YXIgYWdlbmN5c2tpbjpBZ2VuY3lTa2luID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lTa2luICk7XHJcbiAgICAgICAgdmFyIG5vaGFzc2tpbkFycjpBcnJheTxTa2luRGF0YT4gPSBhZ2VuY3lza2luLkdhaW5Ob0hhdmVTa2luKCk7XHJcbiAgICAgICAgaWYoIG5vaGFzc2tpbkFyci5sZW5ndGggPT0gMCAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5lbnRlcmdhbWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgKCBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVRyaWFsICkgYXMgQWdlbmN5VHJpYWwgKS5vcGVudmlldyhub2hhc3NraW5BcnIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZW50ZXJnYW1lKGppYXN1Pyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFJlY29yZE1hbmFnZXIuSW5zdGFuY2UuUmVjb3JkU3RhcnQoKTtcclxuICAgICAgICB0aGlzLm5vd01pbmdDaSA9IDA7XHJcbiAgICAgICAgdGhpcy5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5ub3dHYW1lU3RhdGUgPSAxO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZSggNTAwICk7XHJcbiAgICAgICAgaWYoamlhc3Upe1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUuc3RhcnQsamlhc3UgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLnN0YXJ0ICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5YmdTb3VuZChcImJnbVwiKTtcclxuICAgICAgICBXeEFwaS5yZWNvcmRBbGRFdmVudChcIuS4u+eVjOmdoueCueWHu+W8gOWni+a4uOaIjy4uLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RvcEdhbWUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5ub3dHYW1lU3RhdGUgPSAyO1xyXG4gICAgICAgIHRoaXMub251cGZ1bigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlbmRHYW1lKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBQcm9wTWFuYWdlci5qaWFudG91QXJyICYmIFByb3BNYW5hZ2VyLmppYW50b3VBcnIubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PExheWEuTWVzaFNwcml0ZTNEPiA9IFByb3BNYW5hZ2VyLmppYW50b3VBcnI7XHJcbiAgICAgICAgICAgIGZvciggdmFyIGk6bnVtYmVyID1hcnIubGVuZ3RoLTE7aSA+PTA7aS0tICApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGFycltpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKCBpLDEgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBQcm9wTWFuYWdlci5qaWFudG91QXJyLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5ub3dHYW1lU3RhdGUgPSAwO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICB2YXIgbnBjZGljdDphbnkgPSBQcm9wTWFuYWdlci5ucGNzY3JpcHREaWN0O1xyXG4gICAgICAgIGlmKCBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciggdmFyIHMgaW4gbnBjZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIChucGNkaWN0W3NdIGFzIE5wY1NjcmlwdCkuc3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub251cGZ1bigpO1xyXG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5zdG9wYmdTb3VuZCgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQgeyBMYXlPVVQgfSBmcm9tIFwiLi4vdXRpbHMvTGF5T1VUXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBMYXlvdXRDb250cm9sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXJcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOkxheW91dENvbnRyb2w7XHJcbiAgICBwcml2YXRlIF91aWxheWVyWm9yZGVyOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF91cHVpbGF5ZXJab3JkZXI6bnVtYmVyID0gMjAwO1xyXG4gICAgcHJpdmF0ZSBfdGlwc2xheWVyWm9yZGVyOm51bWJlciA9IDEwMDA7XHJcbiAgICBwcml2YXRlIF9ndWlkZWxheWVyWm9yZGVyOm51bWJlciA9IDYwMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIHVp5bGCXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdWlMYXllcjpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcclxuICAgIFxyXG4gICAgIC8qKlxyXG4gICAgICAqIOacgOWumuWxglxyXG4gICAgICAqL1xyXG4gICAgcHVibGljIHRvcExheWVyOmZhaXJ5Z3VpLkdDb21wb25lbnQgPSBuZXcgZmFpcnlndWkuR0NvbXBvbmVudCgpO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOiDjOaZr+Wxgigg5oiW6ICFM0TlnLrmma/lsYIgKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYmFja2dyb3VuZDpmYWlyeWd1aS5HQ29tcG9uZW50ID0gbmV3IGZhaXJ5Z3VpLkdDb21wb25lbnQoKTtcclxuXHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBMYXlvdXRDb250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpMYXlvdXRDb250cm9sXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIExheW91dENvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRDb250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBMYXlvdXRDb250cm9sLmlucztcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBBZGRMYXllckJ5TmFtZSggaXRlbXZpZXc6ZmFpcnlndWkuR09iamVjdCxsYXllcjpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYobGF5ZXIgPT0gTGF5T1VULkJHIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UuYmFja2dyb3VuZC5hZGRDaGlsZCggaXRlbXZpZXcgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZihsYXllciA9PSBMYXlPVVQuVUkpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91aWxheWVyWm9yZGVyKys7XHJcbiAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UudWlMYXllci5hZGRDaGlsZChpdGVtdmlldyk7XHJcbiAgICAgICAgICAgIGl0ZW12aWV3LnNvcnRpbmdPcmRlciA9IHRoaXMuX3VpbGF5ZXJab3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIGxheWVyID09IExheU9VVC5VSVRvcCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl91cHVpbGF5ZXJab3JkZXIrKztcclxuICAgICAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS51aUxheWVyLmFkZENoaWxkKCBpdGVtdmlldyApO1xyXG4gICAgICAgICAgICBpdGVtdmlldy5zb3J0aW5nT3JkZXIgID0gdGhpcy5fdXB1aWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKGxheWVyID09IExheU9VVC5USVApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBHYW1lTGF5ZXJNYW5hZ2VyLkluc3RhbmNlLnRpcHNMYXllci5hZGRDaGlsZChpdGVtdmlldyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpcHNsYXllclpvcmRlcisrO1xyXG4gICAgICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLnVpTGF5ZXIuYWRkQ2hpbGQoIGl0ZW12aWV3ICk7XHJcbiAgICAgICAgICAgIGl0ZW12aWV3LnNvcnRpbmdPcmRlciAgPSB0aGlzLl90aXBzbGF5ZXJab3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIGxheWVyID09IExheU9VVC5HVUlERSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9ndWlkZWxheWVyWm9yZGVyKys7XHJcbiAgICAgICAgICAgIExheW91dENvbnRyb2wuSW5zdGFuY2UudWlMYXllci5hZGRDaGlsZChpdGVtdmlldyk7XHJcbiAgICAgICAgICAgIGl0ZW12aWV3LnNvcnRpbmdPcmRlciAgPSB0aGlzLl9ndWlkZWxheWVyWm9yZGVyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLy/liJ3lp4vljJblsYLnuqdcclxuXHRwdWJsaWMgaW5pdGxheWVyKCk6dm9pZFxyXG5cdHtcclxuXHRcdEdsb2JhbC5zdGFnZS5hZGRDaGlsZCggZmFpcnlndWkuR1Jvb3QuaW5zdC5kaXNwbGF5T2JqZWN0ICk7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5hZGRDaGlsZCggdGhpcy5iYWNrZ3JvdW5kICk7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5hZGRDaGlsZCggdGhpcy51aUxheWVyICk7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5hZGRDaGlsZCggdGhpcy50b3BMYXllciApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgc2NlbmU6TGF5YS5TY2VuZTNEO1xyXG4gICAgcHJpdmF0ZSB0bXBWZWN0b3I6TGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBtYXQxOkxheWEuQmxpbm5QaG9uZ01hdGVyaWFsOyBcclxuICAgIHByaXZhdGUgbWVzaDE6TGF5YS5NZXNoO1xyXG4gICAgcHJpdmF0ZSBtZXNoMjpMYXlhLk1lc2g7XHJcbiAgICBwdWJsaWMgYWRkSG9yaXpvbnRhbEJveCh4Om51bWJlciwgeTpudW1iZXIsIHo6bnVtYmVyKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGJveDpMYXlhLk1lc2hTcHJpdGUzRCA9IHRoaXMuc2NlbmUuYWRkQ2hpbGQobmV3IExheWEuTWVzaFNwcml0ZTNEKHRoaXMubWVzaDIpKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICBib3gubWVzaFJlbmRlcmVyLm1hdGVyaWFsID0gdGhpcy5tYXQxO1xyXG4gICAgICAgIGJveC5tZXNoUmVuZGVyZXIuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAgICAgICAgYm94Lm1lc2hSZW5kZXJlci5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnRtcFZlY3Rvci5zZXRWYWx1ZSh4LCB5LCB6KTtcclxuICAgICAgICBib3gudHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy50bXBWZWN0b3I7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdmFyIHJpZ2lkQm9keTpMYXlhLlJpZ2lkYm9keTNEID0gYm94LmFkZENvbXBvbmVudChMYXlhLlJpZ2lkYm9keTNEKSBhcyBMYXlhLlJpZ2lkYm9keTNEO1xyXG4gICAgICAgIHJpZ2lkQm9keS5tYXNzID0gMTA7XHJcbiAgICAgICAgcmlnaWRCb2R5LmZyaWN0aW9uID0gMS4wO1xyXG4gICAgICAgIHJpZ2lkQm9keS5yZXN0aXR1dGlvbiA9IDAuMjtcclxuICAgICAgICB2YXIgYm94U2hhcGU6TGF5YS5Cb3hDb2xsaWRlclNoYXBlID0gbmV3IExheWEuQm94Q29sbGlkZXJTaGFwZSgyLCAwLjMzLCAwLjUpO1xyXG4gICAgICAgIHJpZ2lkQm9keS5jb2xsaWRlclNoYXBlID0gYm94U2hhcGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHB1YmxpYyBDbGVhckxheWVyQnlOYW1lKCBsYXllcjpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBsYXllciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIExheU9VVC5VSTpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VpbGF5ZXJab3JkZXItLTtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl91aWxheWVyWm9yZGVyIDwgMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdWlsYXllclpvcmRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIExheU9VVC5VSVRvcDpcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwdWlsYXllclpvcmRlci0tO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3VwdWlsYXllclpvcmRlciA8IDIwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXB1aWxheWVyWm9yZGVyID0gMjAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBMYXlPVVQuVElQOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdGlwc2xheWVyWm9yZGVyIDwgMTAwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyID0gMTAwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgTGF5T1VULkdVSURFOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGlwc2xheWVyWm9yZGVyLS07XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fdGlwc2xheWVyWm9yZGVyIDwgNjAwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aXBzbGF5ZXJab3JkZXIgPSA2MDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGNhbWVyYTpMYXlhLkNhbWVyYTtcclxuICAgIHByaXZhdGUgbGF5YU1vbmtleTNEOkxheWEuU3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIGxheWFNb25rZXkyRDpMYXlhLkltYWdlO1xyXG4gICAgcHJpdmF0ZSBfcG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICBwcml2YXRlIF9vdXRQb3MgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICBwcml2YXRlIHNjYWxlRGVsdGE6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIG9uQ29tcGxldGUoKSB7XHJcbiAgICAgICAgLy/liqDovb3kuInnu7TlnLDpnaJcclxuICAgICAgICB2YXIgZ3JpZCA9IHRoaXMuc2NlbmUuYWRkQ2hpbGQoTGF5YS5Mb2FkZXIuZ2V0UmVzKFwicmVzL3RocmVlRGltZW4vc3RhdGljTW9kZWwvZ3JpZC9wbGFuZS5saFwiKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAvL+WKoOi9veS6jOe7tOeMtOWtkFxyXG4gICAgICAgIHRoaXMubGF5YU1vbmtleTJEID0gTGF5YS5zdGFnZS5hZGRDaGlsZChuZXcgTGF5YS5JbWFnZShcInJlcy90aHJlZURpbWVuL21vbmtleS5wbmdcIikpIGFzIExheWEuSW1hZ2U7XHJcbiAgICAgICAgLy/lvIDlkK/lrprml7blmajlvqrnjq9cclxuICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCB0aGlzLmFuaW1hdGUpO1xyXG4gICAgfVxyXG5cdFx0XHJcblx0cHJpdmF0ZSBhbmltYXRlKCkge1xyXG4gICAgICAgIC8v5Y+Y5o2i5L2N572uXHJcbiAgICAgICAgdGhpcy5fcG9zaXRpb24ueCA9IE1hdGguc2luKHRoaXMuc2NhbGVEZWx0YSArPSAwLjAxKTtcclxuICAgICAgICAvL+iuoeeul+S9jee9rlxyXG4gICAgICAgIHRoaXMuY2FtZXJhLnZpZXdwb3J0LnByb2plY3QodGhpcy5fcG9zaXRpb24sIHRoaXMuY2FtZXJhLnByb2plY3Rpb25WaWV3TWF0cml4LCB0aGlzLl9vdXRQb3MpO1xyXG4gICAgICAgIHRoaXMubGF5YU1vbmtleTJELnBvcyh0aGlzLl9vdXRQb3MueCAvIExheWEuc3RhZ2UuY2xpZW50U2NhbGVYLCB0aGlzLl9vdXRQb3MueSAvIExheWEuc3RhZ2UuY2xpZW50U2NhbGVZKTtcclxuICAgIH1cdFxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxufSIsImltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi4vV1hTREsvcGluZ3RhaXV0aWxzXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHtQbGF0ZnJvbVR5cGV9IGZyb20gXCIuLi9XWFNESy9QbGF0ZnJvbVR5cGVcIjtcclxuXHJcbi8qXHJcbiog5pys5Zyw5pWw5o2u57yT5a2Y566h55CG5ZmoXHJcbiovXHJcbmV4cG9ydCBjbGFzcyBMb2NhbERhdGFDb250cm9sIGV4dGVuZHMgTGF5YS5FdmVudERpc3BhdGNoZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOiBMb2NhbERhdGFDb250cm9sO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgTG9jYWxEYXRhQ29udHJvbC5pbnMgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IExvY2FsRGF0YUNvbnRyb2wge1xyXG4gICAgICAgIGlmIChMb2NhbERhdGFDb250cm9sLmlucyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxEYXRhQ29udHJvbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTG9jYWxEYXRhQ29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5pys5Zyw57yT5a2Y5pWw5o2uIG9iamVjdFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZERhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuQWRkTG9jYWxEYXRhKGtleSwgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw57yT5a2Y5pWw5o2uIG9iamVjdFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9iaihrZXk6IHN0cmluZyk6IGFueSBcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5HZXRMb2NhbENhQ2hlRGF0YShrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5pys5Zyw57yT5a2Y5pWw5o2uIHN0cmluZ1xyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEBwYXJhbSB2YWx1ZSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkZHN0cihrZXk6IHN0cmluZywgdmFsdWU6c3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hZGRDYWNoZVN0cihrZXksIHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkbnVtKCBrZXk6c3RyaW5nLHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmFkZENhY2hlU3RyKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmnKzlnLDnvJPlrZjmlbDmja4gc3RyaW5nXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0c3RyKGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDYWNoZXN0cihrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6I635Y+W5pys5Zyw57yT5a2Y5pWw5o2uIG51bWJlclxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldG51bSgga2V5OnN0cmluZyApOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXRDYWNoZXN0cihrZXkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhuaMh+WumuacrOWcsOe8k+WtmOaVsOaNrlxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlbW92ZUNhY2hlKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVzZWxlY3RDYWNoZShrZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5riF55CG5omA5pyJ5pys5Zyw57yT5a2Y5pWw5o2uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsZWFyQWxsQ2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgQWRkTG9jYWxEYXRhKGtleSwgdmFsdWUpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9yYWdlU3luY1dYKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEpTT04oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgR2V0TG9jYWxDYUNoZURhdGEoa2V5OiBzdHJpbmcpOiBhbnkgXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIG9iajphbnk7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICBvYmogPSB0aGlzLmdldFN0b3JhZ2VTeW5jV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBvYmogPSBMYXlhLkxvY2FsU3RvcmFnZS5nZXRKU09OKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiggIW9iaiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBvYmogPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkQ2FjaGVTdHIoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdG9yYWdlU3luY1dYKGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2FjaGVzdHIoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiMFwiO1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmdldFN0b3JhZ2VTeW5jV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHN0ciA9IExheWEuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdHIgPT0gbnVsbCB8fCBzdHIgPT0gXCJcIikgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzdHIgPSBcIjBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3Zlc2VsZWN0Q2FjaGUoa2V5OiBzdHJpbmcpOiB2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHN3aXRjaCggR2xvYmFsLm5vd3BsYXRmcm9tIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgUGxhdGZyb21UeXBlLnd4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTdG9yYWdlV1goa2V5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLkxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGNsZWFyQWxsQ2FjaGUoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCBHbG9iYWwubm93cGxhdGZyb20gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2FzZSBQbGF0ZnJvbVR5cGUud3g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU3RvcmFnZVdYKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Mb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5pys5Zyw5a2Y5YKoXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHBhcmFtIGRhdGEgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRTdG9yYWdlU3luY1dYKGtleTpzdHJpbmcsIGRhdGE6YW55KSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB3eC5zZXRTdG9yYWdlU3luYyhrZXksIGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDojrflj5bmnKzlnLDlrZjlgqhcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdG9yYWdlU3luY1dYKGtleTpzdHJpbmcpOmFueSBcclxuICAgIHtcclxuICAgICAgICB2YXIgd3ggPSBMYXlhLkJyb3dzZXIud2luZG93Lnd4O1xyXG4gICAgICAgIGlmKCB3eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gd3guZ2V0U3RvcmFnZVN5bmMoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDku47mnKzlnLDnvJPlrZjkuK3np7vpmaTmjIflrpoga2V5XHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlU3RvcmFnZVdYKGtleTpzdHJpbmcpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggTGF5YS5Ccm93c2VyLndpbmRvdy53eCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLkJyb3dzZXIud2luZG93Lnd4LnJlbW92ZVN0b3JhZ2Uoa2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIblrZjlgqjmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyU3RvcmFnZVdYKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBMYXlhLkJyb3dzZXIud2luZG93Lnd4IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIExheWEuQnJvd3Nlci53aW5kb3cud3guY2xlYXJTdG9yYWdlU3luYygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc0RhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7UmVzb3VyY2VDb250cm9sfSBmcm9tIFwiLi4vQ29udHJvbC9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcclxuaW1wb3J0IHtWaWV3QWN0aW9ufSBmcm9tIFwiLi4vdXRpbHMvVmlld0FjdGlvblwiO1xyXG5pbXBvcnQgeyBWaWV3TWFuYWdlciB9IGZyb20gXCIuLi9WaWV3L1ZpZXdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHtDb21wb25lbnRFdmVudERhdGF9IGZyb20gXCIuLi9EYXRhL0NvbXBvbmVudEV2ZW50RGF0YVwiO1xyXG5pbXBvcnQge0dhbWVQb29sfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9HYW1lUG9vbFwiO1xyXG5pbXBvcnQge0dsb2JhbFdhaXRpbmd9IGZyb20gXCIuLi9HbG9iYWxXYWl0aW5nXCI7XHJcblxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBQYW5lbEJhc2VDb250cm9sIGV4dGVuZHMgZmFpcnlndWkuV2luZG93IHtcclxuICAgIHN0YXRpYyB2aWV3YmdVcmw6c3RyaW5nID0gXCJcIjtcclxuICAgIGlzZ3VpZGVpbmc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHByaXZhdGUgUGFja2FnZU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIFJlc291cmNlc05hbWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIF9pc0FkZHBhY2thZ2U6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9pc2NhY2hlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX0FjdGlvblR5cGU6c3RyaW5nID0gVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmU7XHJcblxyXG4gICAgaXRlbV9wYW5lbDogZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgIGl0ZW1fYmc6IGZhaXJ5Z3VpLkdDb21wb25lbnQ7XHJcbiAgICBwcml2YXRlIF9jbGlja0JnOiBmYWlyeWd1aS5HTG9hZGVyO1xyXG5cclxuICAgIHByaXZhdGUgX2NsaWNrQmdJc0NvbHNlOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHB1YmxpYyB2aWV3S2V5OiBhbnk7XHJcbiAgICBwdWJsaWMgZ2FtZUxheWVyOnN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIOS6i+S7tuWuueWZqFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIEV2ZW50UmVzRGljOmFueSA9IHt9O1xyXG4gICAgLyoqXHJcbiAgICAgKiDlhajlsYDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBFdmVudEdsb2JhbDphbnkgPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOeVjOmdouWIneWni+WMllxyXG4gICAgICogQHBhcmFtIHBrZ05hbWUg5YyF5ZCNXHJcbiAgICAgKiBAcGFyYW0gcmVzTmFtZSDnlYzpnaLlkI1cclxuICAgICAqIEBwYXJhbSBpc0FkZHBhY2thZ2Ug5piv5ZCm5re75Yqg5YyFIFxyXG4gICAgICogQHBhcmFtIEFjdGlvblR5cGUg55WM6Z2i5omT5byA5Yqo55S757G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2xpY2tCZ0lzQ29sc2Ug6buR6Imy6IOM5pmvIDA65peg6IOM5pmvIDE66IOM5pmv5peg5YWz6Zet5LqL5Lu2IDI66IOM5pmv5pyJ5YWz6Zet5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gaXNjYWNoZSDmmK/lkKbmt7vliqDliLDnvJPlrZjmsaDvvIjlpoLmmK/kuLp0cnVlLOWImeWKoOWFpei/m+e8k+WtmOaxoOWumuaXtuagueaNruaYr+WQpuW8leeUqOa4heeQhuOAgiDoi6XmmK/kuLpmYWxzZe+8jOWImeS4jea4heeQhuW9k+WJjee8k+WtmO+8jOWmguiLpea4heeQhu+8jOivt+aJi+WKqOa4heeQhiDvvIlcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocGtnTmFtZTogc3RyaW5nID0gXCJcIiwgcmVzTmFtZTogc3RyaW5nID0gXCJcIiwgaXNBZGRwYWNrYWdlOiBib29sZWFuID0gZmFsc2UsIFxyXG4gICAgICAgICAgICAgICAgQWN0aW9uVHlwZTpzdHJpbmc9Vmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmUsIGNsaWNrQmdJc0NvbHNlOm51bWJlcj0wLCBpc2NhY2hlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5faXNjYWNoZSA9IGlzY2FjaGU7XHJcbiAgICAgICAgdGhpcy5QYWNrYWdlTmFtZSA9IHBrZ05hbWU7XHJcbiAgICAgICAgdGhpcy5SZXNvdXJjZXNOYW1lID0gcmVzTmFtZTtcclxuICAgICAgICB0aGlzLl9pc0FkZHBhY2thZ2UgPSBpc0FkZHBhY2thZ2U7XHJcbiAgICAgICAgdGhpcy5fQWN0aW9uVHlwZSA9IEFjdGlvblR5cGU7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tCZ0lzQ29sc2UgPSBjbGlja0JnSXNDb2xzZTtcclxuICAgICAgICB0aGlzLnNob3dNb2RhbFdhaXQoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIFJlc29sdmVVSShwa2duYW1lOiBzdHJpbmcsIHJlc25hbWU6IHN0cmluZywgaXNhZGRwYWNrYWdlOiBib29sZWFuLEFjdGlvblR5cGU6c3RyaW5nPVZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lLCBjbGlja0JnSXNDb2xzZTpudW1iZXI9MCwgaXNjYWNoZTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLlBhY2thZ2VOYW1lID0gcGtnbmFtZTtcclxuICAgICAgICB0aGlzLlJlc291cmNlc05hbWUgPSByZXNuYW1lO1xyXG4gICAgICAgIHRoaXMuX0FjdGlvblR5cGUgPSBBY3Rpb25UeXBlO1xyXG4gICAgICAgIHRoaXMuX2NsaWNrQmdJc0NvbHNlID0gY2xpY2tCZ0lzQ29sc2U7XHJcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkVmlld1BhY2tCeU5hbWUocGtnbmFtZSwgaXNhZGRwYWNrYWdlLCBpc2NhY2hlKTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRQYW5lID0gZmFpcnlndWkuVUlQYWNrYWdlLmNyZWF0ZU9iamVjdChwa2duYW1lLCByZXNuYW1lKS5hc0NvbTtcclxuICAgICAgICBmb3IgKHZhciBzdHIgaW4gdGhpcy5jb250ZW50UGFuZS5fY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW06IGZhaXJ5Z3VpLkdPYmplY3QgPSB0aGlzLmNvbnRlbnRQYW5lLl9jaGlsZHJlbltzdHJdO1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09IFwiaXRlbV9wYW5lbFwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbXBhbmVsOiBmYWlyeWd1aS5HQ29tcG9uZW50ID0gaXRlbSBhcyBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1wYW5lbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN0cjEgaW4gaXRlbXBhbmVsLl9jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXBhbmVsSXRlbTogZmFpcnlndWkuR09iamVjdCA9IGl0ZW1wYW5lbC5fY2hpbGRyZW5bc3RyMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbaXRlbXBhbmVsSXRlbS5uYW1lXSA9IGl0ZW1wYW5lbEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdGhpc1tpdGVtLm5hbWVdID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbV9wYW5lbCA9IGl0ZW0gYXMgZmFpcnlndWkuR0NvbXBvbmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGgsIGZhaXJ5Z3VpLkdSb290Lmluc3QuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnNldFBpdm90KDAuNSwwLjUpO1xyXG4gICAgICAgIHRoaXMuc2V0UGl2b3QoMC41LCAwLjUpO1xyXG4gICAgICAgIHRoaXMuc2V0Y2xpY2tCZ0lzQ29sc2UoKTtcclxuICAgICAgICB0aGlzLmluaXRWaWV3KCk7XHJcbiAgICAgICAgdGhpcy5pbml0RXZlbnQoKTtcclxuICAgICAgICB0aGlzLlNob3dWaWV3QUNUSU9OKCk7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIF9sb2FkVGFyZ2V0OmFueTtcclxuICAgIHByaXZhdGUgX29uTG9hZGVkSGFuZGxlcjpGdW5jdGlvbjtcclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L29dWlcclxuICAgICAqIEBwYXJhbSBncm91cE5hbWUg57uE5ZCNXHJcbiAgICAgKiBAcGFyYW0gdGFyZ2V0ICAgIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIG9uTG9hZGVkSGFuZGxlciDliqDovb3lrozmiJDlm57osIPlh73mlbBcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIExvYWRWaWV3VUkoZ3JvdXBOYW1lOiBzdHJpbmcsIHRhcmdldDogYW55LCBvbkxvYWRlZEhhbmRsZXI6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fbG9hZFRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLl9vbkxvYWRlZEhhbmRsZXIgPSBvbkxvYWRlZEhhbmRsZXI7XHJcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRHcm91cChncm91cE5hbWUsIHRoaXMsIHRoaXMuTG9hZENvbXBsZXRlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlTGFiZWwoY29sb3I6IHN0cmluZywgc3Ryb2tlQ29sb3I6IHN0cmluZyk6TGF5YS5MYWJlbCB7XHJcbiAgICAgICAgY29uc3QgU1RST0tFX1dJRFRIOiBudW1iZXIgPSA0O1xyXG4gICAgICAgIHZhciBsYWJlbDpMYXlhLkxhYmVsID0gbmV3IExheWEuTGFiZWwoKTtcclxuICAgICAgICBsYWJlbC5mb250ID0gXCJNaWNyb3NvZnQgWWFIZWlcIjtcclxuICAgICAgICBsYWJlbC50ZXh0ID0gXCJTQU1QTEUgREVNT1wiO1xyXG4gICAgICAgIGxhYmVsLmZvbnRTaXplID0gMzA7XHJcbiAgICAgICAgbGFiZWwuY29sb3IgPSBjb2xvcjtcclxuICAgICAgICBpZiAoc3Ryb2tlQ29sb3IpIHtcclxuICAgICAgICAgICAgbGFiZWwuc3Ryb2tlID0gU1RST0tFX1dJRFRIO1xyXG4gICAgICAgICAgICBsYWJlbC5zdHJva2VDb2xvciA9IHN0cm9rZUNvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGxhYmVsKTtcclxuICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3otYTmupDmlbDnu4RcclxuICAgICAqIEBwYXJhbSB1cmxzIOi1hOa6kOaVsOe7hFxyXG4gICAgICogQHBhcmFtIHRhcmdldCDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBvbkxvYWRlZEhhbmRsZXIg5Yqg6L295a6M5oiQ5Zue6LCD5Ye95pWwXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBsb2FkVWlieUFycih1cmxzOiBBcnJheTxhbnk+LCB0YXJnZXQ6IGFueSwgb25Mb2FkZWRIYW5kbGVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIC8vIHRoaXMuc2hvd01vZGFsV2FpdCgpO1xyXG4gICAgICAgIHRoaXMuX2xvYWRUYXJnZXQgPSB0YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyID0gb25Mb2FkZWRIYW5kbGVyO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5Mb2FkZXJzKHVybHMsIHRoaXMsIHRoaXMuTG9hZENvbXBsZXRlKTsgICAgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVSYWRpb0dyb3VwKHNraW46IHN0cmluZyk6TGF5YS4gUmFkaW9Hcm91cCB7XHJcbiAgICAgICAgdmFyIHJnOkxheWEuIFJhZGlvR3JvdXAgPSBuZXcgTGF5YS5SYWRpb0dyb3VwKCk7XHJcbiAgICAgICAgcmcuc2tpbiA9IHNraW47XHJcblxyXG4gICAgICAgIHJnLnNwYWNlID0gNzA7XHJcbiAgICAgICAgcmcuZGlyZWN0aW9uID0gXCJ2XCI7XHJcblxyXG4gICAgICAgIHJnLmxhYmVscyA9IFwiSXRlbTEsIEl0ZW0yLCBJdGVtM1wiO1xyXG4gICAgICAgIHJnLmxhYmVsQ29sb3JzID0gXCIjNzg3ODc4LCNkM2QzZDMsI0ZGRkZGRlwiO1xyXG4gICAgICAgIHJnLmxhYmVsU2l6ZSA9IDIwO1xyXG4gICAgICAgIHJnLmxhYmVsQm9sZCA9IHRydWU7XHJcbiAgICAgICAgcmcubGFiZWxQYWRkaW5nID0gXCI1LDAsMCw1XCI7XHJcblxyXG4gICAgICAgIHJnLnNlbGVjdEhhbmRsZXIgPSBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIHRoaXMub25TZWxlY3RDaGFuZ2UpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQocmcpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmc7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG9uU2VsZWN0Q2hhbmdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS9oOmAieaLqeS6huesrCBcIiArIChpbmRleCArIDEpICsgXCIg6aG5XCIpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICBwcml2YXRlIExvYWRDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fbG9hZFRhcmdldCAmJiB0aGlzLl9vbkxvYWRlZEhhbmRsZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyLmNhbGwoIHRoaXMuX2xvYWRUYXJnZXQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlbW92ZUVmZmVjdFBhY2thZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkNsZWFyUGFja0J5TmFtZShwYWNrYWdlTmFtZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldHBhbmVsQ29udHJvbGxlcihuYW1lOiBzdHJpbmcpOiBmYWlyeWd1aS5Db250cm9sbGVyIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtX3BhbmVsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1fcGFuZWwuZ2V0Q29udHJvbGxlcihuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiI0ZGRkZGRlwiLCBudWxsKS5wb3MoMzAsIDUwKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiIzAwRkZGRlwiLCBudWxsKS5wb3MoMjkwLCA1MCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVMYWJlbChcIiNGRkZGMDBcIiwgXCIjRkZGRkZGXCIpLnBvcygzMCwgMTAwKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiIzAwMDAwMFwiLCBcIiNGRkZGRkZcIikucG9zKDI5MCwgMTAwKTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUxhYmVsKFwiI0ZGRkZGRlwiLCBcIiMwMEZGRkZcIikucG9zKDMwLCAxNTApO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlTGFiZWwoXCIjMDA4MEZGXCIsIFwiIzAwRkZGRlwiKS5wb3MoMjkwLCAxNTApO1xyXG4gICAgfVxyXG4gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICBcclxuICAgIHByb3RlY3RlZCBnZXRwYW5lbFRyYW5zaXRpb24obmFtZTogc3RyaW5nKTogZmFpcnlndWkuVHJhbnNpdGlvbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbV9wYW5lbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtX3BhbmVsLmdldFRyYW5zaXRpb24obmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRDaGlsZGZvcm1Db250ZW50UGFuZWwoIG5hbWU6c3RyaW5nICk6ZmFpcnlndWkuR09iamVjdFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuY29udGVudFBhbmUpe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDaGlsZChuYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyrnlYzpnaLliJ3lp4vljJYqL1xyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5vbkluaXQoKTtcclxuICAgICAgICBpZiAodGhpcy5QYWNrYWdlTmFtZSAhPSBcIlwiICYmIHRoaXMuUmVzb3VyY2VzTmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuUmVzb2x2ZVVJKHRoaXMuUGFja2FnZU5hbWUsIHRoaXMuUmVzb3VyY2VzTmFtZSwgdGhpcy5faXNBZGRwYWNrYWdlLHRoaXMuX0FjdGlvblR5cGUsdGhpcy5fY2xpY2tCZ0lzQ29sc2UsIHRoaXMuX2lzY2FjaGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL+ino+aekHVpXHJcbiAgICBcclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0RXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBTaG93Vmlld0FDVElPTigpOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgc3dpdGNoKCB0aGlzLl9BY3Rpb25UeXBlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX25vbmU6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvd2FubW9lbmQoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX2FkZG1vdmVUb01pZGRsZTpcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFBhbmUueCA9IGZhaXJ5Z3VpLkdSb290Lmluc3Qud2lkdGg7XHJcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMuY29udGVudFBhbmUsIHsgeDowIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMud2luZG93YW5tb2VuZCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkbW92ZUZyb21Cb3R0b206XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLnkgPSBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodDtcclxuICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcy5jb250ZW50UGFuZSwgeyB5OjAgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy53aW5kb3dhbm1vZW5kKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9hZGRzY2FsZU1pblRvTWF4OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50UGFuZS5zY2FsZVggPSB0aGlzLmNvbnRlbnRQYW5lLnNjYWxlWSA9IDAuMDE7XHJcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMuY29udGVudFBhbmUsIHsgc2NhbGVYOjEsc2NhbGVZOjEgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy53aW5kb3dhbm1vZW5kKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ2hlY2tCb3goc2tpbjogc3RyaW5nKTpMYXlhLkNoZWNrQm94IHtcclxuICAgICAgICB2YXIgY2I6TGF5YS4gQ2hlY2tCb3ggPSBuZXcgTGF5YS5DaGVja0JveChza2luKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGNiKTtcclxuXHJcbiAgICAgICAgY2IubGFiZWxDb2xvcnMgPSBcIndoaXRlXCI7XHJcbiAgICAgICAgY2IubGFiZWxTaXplID0gMjA7XHJcbiAgICAgICAgY2IubGFiZWxGb250ID0gXCJNaWNyb3NvZnQgWWFIZWlcIjtcclxuICAgICAgICBjYi5sYWJlbFBhZGRpbmcgPSBcIjMsMCwwLDVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNiO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSB1cGRhdGVMYWJlbChjaGVja0JveDpMYXlhLkNoZWNrQm94KTogdm9pZCB7XHJcbiAgICAgICAgY2hlY2tCb3gubGFiZWwgPSBjaGVja0JveC5zZWxlY3RlZCA/IFwi5bey6YCJ5LitXCIgOiBcIuacqumAieS4rVwiO1xyXG4gICAgfVxyXG4gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgcHJpdmF0ZSB3aW5kb3dhbm1vZW5kKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIExheWEudGltZXIuY2FsbExhdGVyKCB0aGlzLHRoaXMub25TaG93VmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvblNob3dWaWV3KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbFdhaXQoKTtcclxuICAgICAgICB0aGlzLnNob3dDbGlja0JnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzaG93Q2xpY2tCZygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fY2xpY2tCZyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnLmFscGhhID0gMC41NTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmdJc0NvbHNlPT0yICYmICF0aGlzLmhhc0NsaWNrTGlzdGVuZXIoKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcub25DbGljayh0aGlzLCB0aGlzLkNsaWNrRXhpdFZpZXcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKueCueWHu+WFs+mXremhtemdouaMiemSriAqL1xyXG4gICAgcHVibGljIENsaWNrRXhpdFZpZXcoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVmlld01hbmFnZXIuSW5zdGFuY2UuY2xvc2UoIHRoaXMudmlld0tleSx0cnVlICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8q6I635Y+W566h55CG5pWw5o2u5qih5Z2XKi9cclxuICAgIHB1YmxpYyBnZXRQcm94eShkOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnlYzpnaLlhbPpl63kuovku7ZcclxuICAgICAqL1xyXG4gICAgcHVibGljIEV4aXRWaWV3KCBBY3Rpb25UeXBlOnN0cmluZyA9IFwiXCIgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX2NsaWNrQmcgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBBY3Rpb25UeXBlID09IFwiXCIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9BY3Rpb25UeXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfbm9uZTpcclxuICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfYWRkbW92ZVRvTWlkZGxlOlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHg6ZmFpcnlndWkuR1Jvb3QuaW5zdC53aWR0aCB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVmlld0FjdGlvbi5BY3Rpb25UeXBlX2FkZG1vdmVGcm9tQm90dG9tOlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHk6ZmFpcnlndWkuR1Jvb3QuaW5zdC5oZWlnaHQgfSwzMDAsIGxheWEudXRpbHMuRWFzZS5xdWFkSW5PdXQsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5kZXN0b3J5KSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9hZGRzY2FsZU1pblRvTWF4OlxyXG4gICAgICAgICAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLCB7IHNjYWxlWDowLjAxLHNjYWxlWTowLjAxIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBzd2l0Y2goIEFjdGlvblR5cGUgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9ub25lOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQWN0aW9uVHlwZV9yZW1vdmVzY2FsZU1heFRvTWluOlxyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVHdlZW4udG8odGhpcywgeyBzY2FsZVg6MC4wMSxzY2FsZVk6MC4wMSB9LDMwMCwgbGF5YS51dGlscy5FYXNlLnF1YWRJbk91dCwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLmRlc3RvcnkpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBWaWV3QWN0aW9uLkFjdGlvblR5cGVfcmVtb3ZlbW92ZVRvUmlnaHQ6XHJcbiAgICAgICAgICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMsIHsgeDpmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoIH0sMzAwLCBsYXlhLnV0aWxzLkVhc2UucXVhZEluT3V0LCBMYXlhLkhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMuZGVzdG9yeSkpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIFxyXG5cclxuICAgIHB1YmxpYyBnZXRUcmFuc2l0aW9uQnlOYW1lKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5UcmFuc2l0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRUcmFuc2l0aW9uKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICAvKirms6jlhozkuovku7YgKi9cclxuICAgIHB1YmxpYyBkaXNwYWNoZURhdGF0cmlnZ2VyKHR5cGU6IHN0cmluZywgZGF0YTogYW55ID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQodHlwZSwgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhozlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhZGREYXRhRXZlbnQodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCAhdGhpcy5FdmVudEdsb2JhbC5oYXNPd25Qcm9wZXJ0eSggdHlwZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IEdhbWVQb29sLkdldEl0ZW0oIENvbXBvbmVudEV2ZW50RGF0YS5SZXNEaWNWYWx1ZSApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmVudEdsb2JhbFt0eXBlXSA9IHZvO1xyXG4gICAgICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgICAgICB2by50aGlzT2JqZWN0ID0gdGhpc09iamVjdDtcclxuICAgICAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBDbGVhckV2ZW50RGF0YSh0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgaWYoIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IHRoaXMuRXZlbnRHbG9iYWxbdHlwZV07XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgdGhpc09iamVjdCwgbGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5FdmVudEdsb2JhbFt0eXBlXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTnu4Tku7bkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIOaXtumXtOexu+Wei1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrb2JqIOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrSGFuZGxlciDkuovku7blm57osIMgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBDbGVhckV2ZW50QnlUeXBlKCB0YXJnZXQ6YW55LCB0eXBlOiBzdHJpbmcsIHRoaXNPYmplY3Q6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQgJiYgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+ID0gdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV07XHJcbiAgICAgICAgICAgIHZhciBpOm51bWJlcj0wO1xyXG4gICAgICAgICAgICB2YXIgbnVtczpudW1iZXIgPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhO1xyXG4gICAgICAgICAgICBmb3IoaTtpPG51bXM7aSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2byA9IGFycltpXTtcclxuICAgICAgICAgICAgICAgIGlmKCB2byAmJiB2by50eXBlPT10eXBlICYmIHZvLnRoaXNPYmplY3QgPT0gdGhpc09iamVjdCAmJiB2by5saXN0ZW5lciA9PSBsaXN0ZW5lciApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lm9mZiggdHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKCBpLDEgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOazqOWGjOe7hOS7tuS6i+S7tu+8jOiwg+eUqOatpOaWueazle+8jOeVjOmdouWFs+mXreS8muiHquWKqOenu+mZpFxyXG4gICAgICogQHBhcmFtIHR5cGUg5pe26Ze057G75Z6LXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tvYmog5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2tIYW5kbGVyIOS6i+S7tuWbnuiwg1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkRXZlbnRCeVR5cGUoIHRhcmdldDphbnksIHR5cGU6IHN0cmluZywgdGhpc09iamVjdDogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sYXJnczphbnk9bnVsbCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IG51bGwgfHwgdGFyZ2V0Lm5hbWUgPT0gXCJcIiApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRocm93IFwiYmFzZXZpZXcgYWRkTGlzdGVuZXIgdGFyZ2V0Lm5hbWUgaXMgbnVsbFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBHYW1lUG9vbC5HZXRJdGVtKCBDb21wb25lbnRFdmVudERhdGEuUmVzRGljVmFsdWUgKTtcclxuICAgICAgICAgICAgdm8udGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgICB2by50eXBlID0gdHlwZTtcclxuICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgIGlmKCAhdGhpcy5FdmVudFJlc0RpYy5oYXNPd25Qcm9wZXJ0eSggdGFyZ2V0Lm5hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGJvOmJvb2xlYW4gPSB0aGlzLkp1ZGdlSXNIYXZlRXZlbnQoIHRhcmdldCx0eXBlICk7XHJcbiAgICAgICAgICAgIGlmKCAhYm8gKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQub24oIHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lcixhcmdzICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXS5wdXNoKCB2byApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKuWIpOaWreaYr+WQpuWQq+acieS6i+S7tiAqL1xyXG4gICAgcHVibGljIEp1ZGdlSXNIYXZlRXZlbnQoIHRhcmdldDphbnksdHlwZTogc3RyaW5nICk6Ym9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIHZhciBldmVudEFycjpBcnJheTxDb21wb25lbnRFdmVudERhdGE+O1xyXG4gICAgICAgIGV2ZW50QXJyID0gdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV07XHJcbiAgICAgICAgdmFyIGNoaWxkdm86Q29tcG9uZW50RXZlbnREYXRhO1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gZXZlbnRBcnIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpbGR2byA9IGV2ZW50QXJyW3NdO1xyXG4gICAgICAgICAgICBpZiggY2hpbGR2byAmJiBjaGlsZHZvLnR5cGUgPT0gdHlwZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHB1YmxpYyBnZXRDb21CeUlkKGlkOiBzdHJpbmcpOiBmYWlyeWd1aS5HQ29tcG9uZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZS5nZXRDaGlsZChpZCkuYXNDb207XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRyb2xsZXJCeUJhbWUoaWQ6IHN0cmluZyk6IGZhaXJ5Z3VpLkNvbnRyb2xsZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRQYW5lLmdldENvbnRyb2xsZXIoaWQpO1xyXG4gICAgfVxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTmiYDmnInnu4Tku7bkuovku7ZcclxuICAgICAqL1xyXG4gICAgcHVibGljIENsZWFyRXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy5FdmVudFJlc0RpYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLkV2ZW50UmVzRGljO1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbXBvbmVudEV2ZW50RGF0YT47XHJcbiAgICAgICAgICAgIHZhciBpOm51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gMDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcclxuICAgICAgICAgICAgZm9yKCBzIGluIGRpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcnIgPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIGFyciAmJiBhcnIubGVuZ3RoID4gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaT0wO1xyXG4gICAgICAgICAgICAgICAgICAgIG51bXMgPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciggaT1udW1zLTE7aT49MDtpLS0gKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm8gPSBhcnJbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2by50YXJnZXQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvLnRhcmdldC5vZmYoIHZvLnR5cGUsdm8udGhpc09iamVjdCx2by5saXN0ZW5lciApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKCBpLDEgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5FdmVudFJlc0RpY1tzXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkV2ZW50UmVzRGljID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyRXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qIOmUgOavgSovXHJcbiAgICBwdWJsaWMgZGVzdG9yeSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsZWFyRXZlbnQoKTtcclxuICAgICAgICB0aGlzLmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgdGhpcy5DbGVhckdsb2JhbEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5DbGVhckV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5fbG9hZFRhcmdldCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fb25Mb2FkZWRIYW5kbGVyID0gbnVsbDtcclxuICAgICAgICBMYXlhLlR3ZWVuLmNsZWFyVHdlZW4oIHRoaXMgKTtcclxuICAgICAgICBSZXNEYXRhQ29udHJvbC5JbnN0YW5jZS5DbGVhclBhY2tCeU5hbWUodGhpcy5QYWNrYWdlTmFtZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuUGFja2FnZU5hbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuUmVzb3VyY2VzTmFtZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NsaWNrQmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5vZmZDbGljayh0aGlzLCB0aGlzLkNsaWNrRXhpdFZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLl9jbGlja0JnLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tCZyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld0tleSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBzZXRjbGlja0JnSXNDb2xzZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Nob3dpbmcgJiYgdGhpcy5fY2xpY2tCZ0lzQ29sc2UgPiAwICYmIHRoaXMuY29udGVudFBhbmUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jbGlja0JnICYmIFBhbmVsQmFzZUNvbnRyb2wudmlld2JnVXJsICE9IFwiXCIgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnID0gbmV3IGZhaXJ5Z3VpLkdMb2FkZXIoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcudG91Y2hhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NsaWNrQmcuc2V0U2l6ZShmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoLCBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja0JnLnVybCA9IFBhbmVsQmFzZUNvbnRyb2wudmlld2JnVXJsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5maWxsID0gZmFpcnlndWkuTG9hZGVyRmlsbFR5cGUuU2NhbGVGcmVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xpY2tCZy5hbHBoYSA9IDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRQYW5lLmFkZENoaWxkQXQodGhpcy5fY2xpY2tCZywgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk5omA5pyJ5YWo5bGA5LqL5Lu2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBDbGVhckdsb2JhbEV2ZW50KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLkV2ZW50R2xvYmFsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLkV2ZW50R2xvYmFsO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gZGljdCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNsZWFyRXZlbnREYXRhKCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkV2ZW50R2xvYmFsPXt9O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtQYW5lbFJlc0RpY30gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUGFuZWxSZXNEaWNcIjtcclxuaW1wb3J0IHtDb21wb25lbnRFdmVudERhdGF9IGZyb20gXCIuLi9EYXRhL0NvbXBvbmVudEV2ZW50RGF0YVwiO1xyXG5pbXBvcnQge0dhbWVQb29sfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9HYW1lUG9vbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBhbmVsQ2hpbGRDb250cm9sIGV4dGVuZHMgZmFpcnlndWkuR0NvbXBvbmVudCBcclxue1xyXG4gICAgLyoqXHJcbiAgICAgKiDkuovku7blrrnlmahcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBFdmVudFJlc0RpYzphbnkgPSB7fTtcclxuICAgIC8qKlxyXG4gICAgICog5YWo5bGA5LqL5Lu25a655ZmoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgRXZlbnRHbG9iYWw6YW55ID0ge307XHJcblxyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTmiYDmnInnu4Tku7bkuovku7ZcclxuICAgICAqL1xyXG4gICAgcHVibGljIENsZWFyRXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy5FdmVudFJlc0RpYylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzO1xyXG4gICAgICAgICAgICB2YXIgZGljdDphbnkgPSB0aGlzLkV2ZW50UmVzRGljO1xyXG4gICAgICAgICAgICB2YXIgYXJyOkFycmF5PENvbXBvbmVudEV2ZW50RGF0YT47XHJcbiAgICAgICAgICAgIHZhciBpOm51bWJlcjtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gMDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcclxuICAgICAgICAgICAgZm9yKCBzIGluIGRpY3QgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBhcnIgPSBkaWN0W3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIGFyciAmJiBhcnIubGVuZ3RoID4gMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaT0wO1xyXG4gICAgICAgICAgICAgICAgICAgIG51bXMgPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciggaT1udW1zLTE7aT49MDtpLS0gKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdm8gPSBhcnJbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2byApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2by50YXJnZXQgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvLnRhcmdldC5vZmYoIHZvLnR5cGUsdm8udGhpc09iamVjdCx2by5saXN0ZW5lciApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKCBpLDEgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5FdmVudFJlc0RpY1tzXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkV2ZW50UmVzRGljID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc3Bvc2UoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5DbGVhckdsb2JhbEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5DbGVhckV2ZW50KCk7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb25zdHJ1Y3RGcm9tWE1MKHhtbDogYW55KTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuY29uc3RydWN0RnJvbVhNTCh4bWwpO1xyXG4gICAgICAgIGZvciAodmFyIHN0ciBpbiB0aGlzLl9jaGlsZHJlbikge1xyXG4gICAgICAgICAgICB2YXIgaXRlbTogZmFpcnlndWkuR09iamVjdCA9IHRoaXMuX2NoaWxkcmVuW3N0cl07XHJcbiAgICAgICAgICAgIHRoaXNbaXRlbS5uYW1lXSA9IGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25Jbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uSW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyrojrflj5bnrqHnkIbmlbDmja7mqKHlnZcqL1xyXG4gICAgcHVibGljIGdldFByb3h5KGQ6IGFueSk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbihkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZGlzcGFjaGVEYXRhdHJpZ2dlcih0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KHR5cGUsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBoYXNEYXRhRXZlbnQodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIERpc3BhdGNoZXJNYW5hZ2VyLmhhc0V2ZW50TGlzdGVuZXIodHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDms6jlhozlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBBZGRFdmVudERhdGEodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCAhdGhpcy5FdmVudEdsb2JhbC5oYXNPd25Qcm9wZXJ0eSggdHlwZSApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSBHYW1lUG9vbC5HZXRJdGVtKCBDb21wb25lbnRFdmVudERhdGEuUmVzRGljVmFsdWUgKTtcclxuICAgICAgICAgICAgdGhpcy5FdmVudEdsb2JhbFt0eXBlXSA9IHZvO1xyXG4gICAgICAgICAgICB2by50eXBlID0gdHlwZTtcclxuICAgICAgICAgICAgdm8udGhpc09iamVjdCA9IHRoaXNPYmplY3Q7XHJcbiAgICAgICAgICAgIHZvLmxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSx0aGlzT2JqZWN0LGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICAgICAgcHJpdmF0ZSBESUFMT0dfV0lEVEg6IG51bWJlciA9IDIyMDtcclxuICAgICAgICBwcml2YXRlIERJQUxPR19IRUlHSFQ6IG51bWJlciA9IDI3NTtcclxuICAgICAgICBwcml2YXRlIENMT1NFX0JUTl9XSURUSDogbnVtYmVyID0gNDM7XHJcbiAgICAgICAgcHJpdmF0ZSBDTE9TRV9CVE5fUEFERElORzogbnVtYmVyID0gNTtcclxuICAgICAgICBwcml2YXRlIGFzc2V0czogQXJyYXk8c3RyaW5nPjtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSBvblNraW5Mb2FkQ29tcGxldGUoKTogdm9pZCB7XHJcbiAgICAgICAgICAgIHZhciBkaWFsb2c6TGF5YS4gRGlhbG9nID0gbmV3IExheWEuRGlhbG9nKCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgYmc6TGF5YS5JbWFnZSA9IG5ldyBMYXlhLkltYWdlKHRoaXMuYXNzZXRzWzBdKTtcclxuICAgICAgICAgICAgZGlhbG9nLmFkZENoaWxkKGJnKTtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvbjpMYXlhLkJ1dHRvbiA9IG5ldyBMYXlhLkJ1dHRvbih0aGlzLmFzc2V0c1sxXSk7XHJcbiAgICAgICAgICAgIC8vIGJ1dHRvbi5uYW1lID0gRGlhbG9nLkNMT1NFO1xyXG4gICAgICAgICAgICBidXR0b24ucG9zKHRoaXMuRElBTE9HX1dJRFRIIC0gdGhpcy5DTE9TRV9CVE5fV0lEVEggLSB0aGlzLkNMT1NFX0JUTl9QQURESU5HLCB0aGlzLkNMT1NFX0JUTl9QQURESU5HKTtcclxuICAgICAgICAgICAgZGlhbG9nLmFkZENoaWxkKGJ1dHRvbik7XHJcblxyXG4gICAgICAgICAgICBkaWFsb2cuZHJhZ0FyZWEgPSBcIjAsMCxcIiArIHRoaXMuRElBTE9HX1dJRFRIICsgXCIsXCIgKyB0aGlzLkRJQUxPR19IRUlHSFQ7XHJcbiAgICAgICAgICAgIGRpYWxvZy5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTlhajlsYDkuovku7ZcclxuICAgICAqIEBwYXJhbSB0eXBlIFxyXG4gICAgICogQHBhcmFtIHRoaXNPYmplY3QgXHJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZW1vdmVEYXRhRXZlbnQodHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgICAgIGlmKCB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciB2bzpDb21wb25lbnRFdmVudERhdGEgPSB0aGlzLkV2ZW50R2xvYmFsW3R5cGVdO1xyXG4gICAgICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNPYmplY3QsIGxpc3RlbmVyKTtcclxuICAgICAgICAgICAgdm8uY2xlYXIoKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuRXZlbnRHbG9iYWxbdHlwZV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5rOo5YaM57uE5Lu25LqL5Lu277yM6LCD55So5q2k5pa55rOV77yM55WM6Z2i5YWz6Zet5Lya6Ieq5Yqo56e76ZmkXHJcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIg5LqL5Lu25Zue6LCDXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBBZGRFdmVudEJ5VHlwZSggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbixhcmdzOmFueT1udWxsKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGFyZ2V0Lm5hbWUgPT0gbnVsbCB8fCB0YXJnZXQubmFtZSA9PSBcIlwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJjaGlsZGJhc2V2aWV3IGFkZExpc3RlbmVyIHRhcmdldC5uYW1lIGlzIG51bGxcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgdm86Q29tcG9uZW50RXZlbnREYXRhID0gR2FtZVBvb2wuR2V0SXRlbSggQ29tcG9uZW50RXZlbnREYXRhLlJlc0RpY1ZhbHVlICk7XHJcbiAgICAgICAgICAgIHZvLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICAgICAgdm8udHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICAgIHZvLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0O1xyXG4gICAgICAgICAgICB2by5saXN0ZW5lciA9IGxpc3RlbmVyO1xyXG4gICAgICAgICAgICBpZiggIXRoaXMuRXZlbnRSZXNEaWMuaGFzT3duUHJvcGVydHkoIHRhcmdldC5uYW1lICkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBibzpib29sZWFuID0gdGhpcy5KdWRnZUlzSGF2ZUV2ZW50KCB0YXJnZXQsdHlwZSApO1xyXG4gICAgICAgICAgICBpZiggIWJvIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Lm9uKCB0eXBlLHRoaXNPYmplY3QsbGlzdGVuZXIsYXJncyApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5FdmVudFJlc0RpY1t0YXJnZXQubmFtZV0ucHVzaCggdm8gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgSnVkZ2VJc0hhdmVFdmVudCggdGFyZ2V0OmFueSx0eXBlOiBzdHJpbmcgKTpib29sZWFuXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGV2ZW50QXJyOkFycmF5PENvbXBvbmVudEV2ZW50RGF0YT47XHJcbiAgICAgICAgZXZlbnRBcnIgPSB0aGlzLkV2ZW50UmVzRGljW3RhcmdldC5uYW1lXTtcclxuICAgICAgICB2YXIgY2hpbGR2bzpDb21wb25lbnRFdmVudERhdGE7XHJcbiAgICAgICAgZm9yKCB2YXIgcyBpbiBldmVudEFyciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjaGlsZHZvID0gZXZlbnRBcnJbc107XHJcbiAgICAgICAgICAgIGlmKCBjaGlsZHZvICYmIGNoaWxkdm8udHlwZSA9PSB0eXBlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog56e76Zmk57uE5Lu25LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gdHlwZSDml7bpl7TnsbvlnotcclxuICAgICAqIEBwYXJhbSBjYWxsYmFja29iaiDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0hhbmRsZXIg5LqL5Lu25Zue6LCDIFxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgQ2xlYXJFdmVudEJ5VHlwZSggdGFyZ2V0OmFueSwgdHlwZTogc3RyaW5nLCB0aGlzT2JqZWN0OiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGFyZ2V0ICYmIHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8Q29tcG9uZW50RXZlbnREYXRhPiA9IHRoaXMuRXZlbnRSZXNEaWNbdGFyZ2V0Lm5hbWVdO1xyXG4gICAgICAgICAgICB2YXIgaTpudW1iZXI9MDtcclxuICAgICAgICAgICAgdmFyIG51bXM6bnVtYmVyID0gYXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YTtcclxuICAgICAgICAgICAgZm9yKGk7aTxudW1zO2krKylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSBhcnJbaV07XHJcbiAgICAgICAgICAgICAgICBpZiggdm8gJiYgdm8udHlwZT09dHlwZSAmJiB2by50aGlzT2JqZWN0ID09IHRoaXNPYmplY3QgJiYgdm8ubGlzdGVuZXIgPT0gbGlzdGVuZXIgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5vZmYoIHR5cGUsdGhpc09iamVjdCxsaXN0ZW5lciApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZvLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZSggaSwxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTmiYDmnInlhajlsYDkuovku7ZcclxuICAgICAqL1xyXG4gICAgcHVibGljIENsZWFyR2xvYmFsRXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuRXZlbnRHbG9iYWwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHM7XHJcbiAgICAgICAgICAgIHZhciBkaWN0OmFueSA9IHRoaXMuRXZlbnRHbG9iYWw7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiBkaWN0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOkNvbXBvbmVudEV2ZW50RGF0YSA9IGRpY3Rbc107XHJcbiAgICAgICAgICAgICAgICBpZiggdm8gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRGF0YUV2ZW50KCB2by50eXBlLHZvLnRoaXNPYmplY3Qsdm8ubGlzdGVuZXIgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkV2ZW50R2xvYmFsPXt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBwbGFjZUhTY3JvbGxlcigpOiB2b2lkIHtcclxuICAgICAgICB2YXIgaHM6TGF5YS5IU2Nyb2xsQmFyID0gbmV3IExheWEuSFNjcm9sbEJhcigpO1xyXG4gICAgICAgIGhzLnNraW4gPSBcInJlcy91aS9oc2Nyb2xsLnBuZ1wiO1xyXG4gICAgICAgIGhzLndpZHRoID0gMzAwO1xyXG4gICAgICAgIGhzLnBvcyg1MCwgMTcwKTtcclxuXHJcbiAgICAgICAgaHMubWluID0gMDtcclxuICAgICAgICBocy5tYXggPSAxMDA7XHJcblxyXG4gICAgICAgIGhzLmNoYW5nZUhhbmRsZXIgPSBuZXcgTGF5YS5IYW5kbGVyKHRoaXMsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoaHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGxhY2VWU2Nyb2xsZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHZzOkxheWEuVlNjcm9sbEJhciA9IG5ldyBMYXlhLlZTY3JvbGxCYXIoKTtcclxuICAgICAgICB2cy5za2luID0gXCJyZXMvdWkvdnNjcm9sbC5wbmdcIjtcclxuICAgICAgICB2cy5oZWlnaHQgPSAzMDA7XHJcbiAgICAgICAgdnMucG9zKDQwMCwgNTApO1xyXG5cclxuICAgICAgICB2cy5taW4gPSAwO1xyXG4gICAgICAgIHZzLm1heCA9IDEwMDtcclxuICAgICAgICB2cy5jaGFuZ2VIYW5kbGVyID0gbmV3IExheWEuSGFuZGxlcih0aGlzLCB0aGlzLm9uQ2hhbmdlKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHZzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ2hhbmdlKHZhbHVlOiBOdW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIua7muWKqOadoeeahOS9jee9ru+8miB2YWx1ZT1cIiArIHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIFxyXG59IiwiXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb29sTWFuYWdlclxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBQb29sTWFuYWdlckluc3RhbmNlOlBvb2xNYW5hZ2VyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBQb29sTWFuYWdlci5Qb29sTWFuYWdlckluc3RhbmNlID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpXHJcbiAgICB7XHJcbiAgICAgICAgaWYoUG9vbE1hbmFnZXIuUG9vbE1hbmFnZXJJbnN0YW5jZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybiBQb29sTWFuYWdlci5Qb29sTWFuYWdlckluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgUG9vbE1hbmFnZXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBQb29sU2l6ZSA9IDgwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgU3ByaXRlM0REaWM6e1trZXk6c3RyaW5nXTpBcnJheTxMYXlhLlNwcml0ZTNEPn0gPSB7fTtcclxuXHJcblxyXG4gICAgc3RhdGljIEdldFNwcml0ZTNEKF9vYmo6TGF5YS5TcHJpdGUzRCk6TGF5YS5TcHJpdGUzRFxyXG4gICAge1xyXG4gICAgICAgIHZhciBvYmpOYW1lID0gX29iai5uYW1lO1xyXG4gICAgICAgIGlmKHRoaXMuU3ByaXRlM0REaWNbb2JqTmFtZV0gIT0gbnVsbCAmJiB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdICE9IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuU3ByaXRlM0REaWNbb2JqTmFtZV0ubGVuZ3RoPjApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBvYmogPSB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdWzBdO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCFvYmogfHwgb2JqLmRlc3Ryb3llZClvYmogPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKF9vYmopO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuU3ByaXRlM0REaWNbb2JqTmFtZV0uc3BsaWNlKDAsMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gb2JqLnRyYW5zZm9ybS5wb3NpdGlvbiA9IF9vYmoudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBvYmoudHJhbnNmb3JtLnJvdGF0aW9uID0gX29iai50cmFuc2Zvcm0ucm90YXRpb24uY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIG9iai50cmFuc2Zvcm0uc2NhbGU9X29iai50cmFuc2Zvcm0uc2NhbGUuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIG9iai5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBuZXdvYmogPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKF9vYmopO1xyXG4gICAgICAgICAgICAgICAgbmV3b2JqLmFjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3b2JqO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBuZXdvYmogPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKF9vYmopO1xyXG4gICAgICAgICAgICBuZXdvYmouYWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ld29iajtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIFJlY292ZXJTcHJpdGUzRChfb2JqOkxheWEuU3ByaXRlM0QsX2FjdGl2ZSA9IGZhbHNlKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCFfb2JqKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiUG9vbE1hbmFnZXIgUmVjb3ZlciBFcnJvciFcIixudWxsKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoX29iai5kZXN0cm95ZWQpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJQb29sTWFuYWdlciBSZWNvdmVyIEVycm9yIVwiLFwiZGVzdHJveWVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZighX2FjdGl2ZSAmJiBfb2JqLmFjdGl2ZSA9PSBmYWxzZSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlBvb2xNYW5hZ2VyIFJlY292ZXIgRXJyb3IhXCIsX29iai5uYW1lKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIG9iak5hbWUgPSBfb2JqLm5hbWU7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuU3ByaXRlM0REaWNbb2JqTmFtZV0gIT0gbnVsbCAmJiB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdICE9IHVuZGVmaW5lZClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBhcnJheSA9IHRoaXMuU3ByaXRlM0REaWNbb2JqTmFtZV07XHJcbiAgICAgICAgICAgIGlmKGFycmF5Lmxlbmd0aCA+IHRoaXMuUG9vbFNpemUpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIF9vYmouZGVzdHJveSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgYXJyYXkucHVzaChfb2JqKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBhcnJheSA9IFtdO1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKF9vYmopO1xyXG4gICAgICAgICAgICB0aGlzLlNwcml0ZTNERGljW29iak5hbWVdID0gYXJyYXk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cob2JqTmFtZSxhcnJheS5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX29iai50cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKDAsMCwtMTAwKTtcclxuICAgICAgICBfb2JqLnJlbW92ZVNlbGYoKTtcclxuICAgICAgICBfb2JqLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgQ2xlYXJQb29sKClcclxuICAgIHtcclxuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLlNwcml0ZTNERGljKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG9ianMgPSB0aGlzLlNwcml0ZTNERGljW2tleV07XHJcbiAgICAgICAgICAgIGZvcih2YXIgaSA9IDA7aTwgb2Jqcy5sZW5ndGg7aSsrKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBvYmpzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlNwcml0ZTNERGljID0ge307XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vUmVzb3VyY2VDb250cm9sXCI7XHJcbmltcG9ydCB7TG9jYWxEYXRhfSBmcm9tIFwiLi4vRGF0YS9Mb2NhbERhdGFcIjtcclxuaW1wb3J0IHsgR2xvYmFsIH0gZnJvbSBcIi4uL0dsb2JhbFwiO1xyXG5pbXBvcnQge0dhbWVQb29sfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9HYW1lUG9vbFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCBUYWIgPSBMYXlhLlRhYjtcclxuLypcclxuKiDotYTmupDnrqHnkIblmag7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBSZXNEYXRhQ29udHJvbCBpbXBsZW1lbnRzIFRpbWVyQ29udHJvbFxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6UmVzRGF0YUNvbnRyb2w7XHJcblxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOS4jee8k+WtmOeahOWMheaVsOaNru+8iCDpooTpmLLnlYzpnaLkuIrnmoTnirbmgIHorr7nva7plJnor68g77yJXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgTm9MaXZlRGF0YTphbnk7XHJcblxyXG4gICBcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIFJlc0RhdGFDb250cm9sLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTpSZXNEYXRhQ29udHJvbFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBSZXNEYXRhQ29udHJvbC5pbnMgPT0gbnVsbCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc0RhdGFDb250cm9sKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBSZXNEYXRhQ29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmt7vliqDljIVcclxuICAgICAqIEBwYXJhbSBwYXRoIOi3r+W+hO+8iCDkuovkvovvvJpyZXMvdWkvIO+8iVxyXG4gICAgICogQHBhcmFtIHBrZ25hbWUg5YyF5ZCNXHJcbiAgICAgKiBAcGFyYW0gaXNhZGRwYWNrYWdlIOaYr+WQpua3u+WKoCBcclxuICAgICAqIEBwYXJhbSBpc0NhY2hlIOaYr+WQpue8k+WtmFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkUGFja0J5TmFtZShwYXRoOnN0cmluZyxwa2duYW1lOnN0cmluZyxpc2FkZHBhY2thZ2U6Ym9vbGVhbiA9IHRydWUsaXNDYWNoZTpib29sZWFuID0gdHJ1ZSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpc2FkZHBhY2thZ2UgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UocGF0aCArIHBrZ25hbWUscGtnbmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWRkTG9jYWxMaXZlRGF0YSggcGtnbmFtZSxpc0NhY2hlICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZVBvb2wuTWFyayggTG9jYWxEYXRhLlJlc0RpY1ZhbHVlLExvY2FsRGF0YSApO1xyXG4gICAgICAgIHRoaXMudXJsUmVzID0ge307XHJcbiAgICAgICAgdGhpcy5wYWNrYWdlUmVzID0ge307XHJcbiAgICAgICAgdGhpcy5Ob0xpdmVEYXRhID0geyBcImxvYWRpbmdcIjp0cnVlLFwibWFpblwiOnRydWUsXCJ1aWNvbXBvbmVudFwiOnRydWV9O1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5hZGRVcGRhdGVUYXJnZXQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgIC8qKlxyXG4gICAgICog5riF55CG6LWE5rqQ57yT5a2YKEFycmF5KVxyXG4gICAgICogQHBhcmFtIHVybHMg6LWE5rqQ5pWw57uEXHJcbiAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUg5YyF5ZCNXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZW1vdmVSZXNvdXJjZXMoIHVybHM6QXJyYXk8YW55PixwYWNrYWdlTmFtZTpzdHJpbmcgPSBcIlwiICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBwYWNrYWdlTmFtZSAhPSBcIlwiIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5yZW1vdmVQYWNrYWdlKCBwYWNrYWdlTmFtZSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IoIHZhciBzIGluIHVybHMgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5SZW1vdmVSZXNvdXJjZXNCeXVybCggdXJsc1tzXS51cmwsdHJ1ZSApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHBsYWNlSFNsaWRlcigpOiB2b2lkIHtcclxuICAgICAgICB2YXIgaHM6TGF5YS5IU2xpZGVyID0gbmV3IExheWEuSFNsaWRlcigpO1xyXG4gICAgICAgIGhzLnNraW4gPSBcInJlcy91aS9oc2xpZGVyLnBuZ1wiO1xyXG5cclxuICAgICAgICBocy53aWR0aCA9IDMwMDtcclxuICAgICAgICBocy5wb3MoNTAsIDE3MCk7XHJcbiAgICAgICAgaHMubWluID0gMDtcclxuICAgICAgICBocy5tYXggPSAxMDA7XHJcbiAgICAgICAgaHMudmFsdWUgPSA1MDtcclxuICAgICAgICBocy50aWNrID0gMTtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChocyk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHBsYWNlVlNsaWRlcigpOiB2b2lkIHtcclxuICAgICAgICB2YXIgdnM6TGF5YS5WU2xpZGVyID0gbmV3IExheWEuVlNsaWRlcigpO1xyXG5cclxuICAgICAgICB2cy5za2luID0gXCJyZXMvdWkvdnNsaWRlci5wbmdcIjtcclxuXHJcbiAgICAgICAgdnMuaGVpZ2h0ID0gMzAwO1xyXG4gICAgICAgIHZzLnBvcyg0MDAsIDUwKTtcclxuICAgICAgICB2cy5taW4gPSAwO1xyXG4gICAgICAgIHZzLm1heCA9IDEwMDtcclxuICAgICAgICB2cy52YWx1ZSA9IDUwO1xyXG4gICAgICAgIHZzLnRpY2sgPSAxO1xyXG4gICAgICAgXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh2cyk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gICAgcHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIHVwZGF0ZSggZHQ6bnVtYmVyICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgKz0gZHQ7XHJcbiAgICAgICAgaWYoIHRoaXMuX3RpbWUgPiB0aGlzLkNoZWNrSW50ZXJ2YWwgKSAvLzHliIbpkp/mo4Dmn6XkuIDmrKFcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UucnVubmluZyApIC8v5aaC5p6c5b2T5YmN5Zyo5Yqg6L295Lit77yM5bu25pe2MeenkuajgOa1i1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90aW1lLT0xMDAwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuUmVmcmVzaEdyb3VwUmVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa4heeQhui1hOa6kOe8k+WtmCh1cmwpXHJcbiAgICAgKiBAcGFyYW0gdXJsIOimgea4heeQhueahOi1hOa6kHVybFxyXG4gICAgICogQHBhcmFtIGlzQ2xlYXIg5a+55LqO57yT5a2Y5rGg5Lit55qE5pWw5o2u77yM5b2T5byV55So5Li6MOaXtu+8jOaYr+WQpuebtOaOpeW8uuWItua4hemZpO+8iCDlpoLmnpzkuLpmYWxzZSzliJnnrYnlvoXnvJPlrZjlrprml7bliLfmlrDml7blgJnlho3ljrvliKTmlq0g77yJXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZW1vdmVSZXNvdXJjZXNCeXVybCggdXJsOnN0cmluZyxpc0NsZWFyOmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZih0aGlzLnVybFJlcy5oYXNPd25Qcm9wZXJ0eSh1cmwpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIGlzQ2xlYXIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmNsZWFyUmVzKHVybCk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51cmxSZXNbdXJsXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXJsUmVzW3VybF0tLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLmxvYWRlci5jbGVhclJlcyh1cmwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWMhei1hOa6kOaxoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhY2thZ2VSZXM6YW55O1xyXG5cclxuXHJcbiAgICBcclxuXHJcbiAgICBwcml2YXRlIENsZWFyTGl2ZURhdGFCeVBhY2tOYW1lKCBwa2dOYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5wYWNrYWdlUmVzWyBwa2dOYW1lIF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YSA9IHRoaXMucGFja2FnZVJlc1sgcGtnTmFtZSBdO1xyXG4gICAgICAgICAgICB2by5jbGVhcigpO1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wYWNrYWdlUmVzWyBwa2dOYW1lIF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuIFxyXG4gICAgcHJpdmF0ZSBDbGVhckludGVydmFsOm51bWJlciA9IDUwMDAwO1xyXG5cclxuICAgIHByaXZhdGUgQ2hlY2tJbnRlcnZhbDpudW1iZXIgPSAyMDAwMDtcclxuICAgICAvKipcclxuICAgICAqIHVybOi1hOa6kOaxoFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVybFJlczphbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmt7vliqB1aeWMhVxyXG4gICAgICogQHBhcmFtIHBrZ25hbWUg5YyF5ZCNXHJcbiAgICAgKiBAcGFyYW0gaXNhZGRwYWNrYWdlIOaYr+WQpuWIm+W7unVpcGFja2FnZVxyXG4gICAgICogQHBhcmFtIGlzQ2FjaGUg5piv5ZCm5re75Yqg5Yiw57uE57yT5a2Y5Lit77yIIOWmguaenOa3u+WKoO+8jOWImeWPguS4juWumuaXtua4heeQhueahOmAu+i+kSzluLjpqbvotYTmupDor7fli7/orr7nva7kuLp0dXJlIO+8iVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQWRkVmlld1BhY2tCeU5hbWUocGtnbmFtZTpzdHJpbmcsaXNhZGRwYWNrYWdlOmJvb2xlYW4gPSB0cnVlLGlzQ2FjaGU6Ym9vbGVhbiA9IHRydWUpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggaXNhZGRwYWNrYWdlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCBwa2duYW1lID09IFwibWFpblwiIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UoQXNzZXRQYXRoLnJlcyArIEFzc2V0UGF0aC5zdWJwYWNrc2dldWkgKyBwa2duYW1lLHBrZ25hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgZmFpcnlndWkuVUlQYWNrYWdlLmFkZFBhY2thZ2UoQXNzZXRQYXRoLnJlc291cmNlcyArIEFzc2V0UGF0aC51aSArIHBrZ25hbWUscGtnbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuQWRkTG9jYWxMaXZlRGF0YSggcGtnbmFtZSxpc0NhY2hlICk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnp7vpmaTljIVcclxuICAgICAqIEBwYXJhbSBwa2duYW1lIOWMheWQjVxyXG4gICAgICogQHBhcmFtIGlzY2xlYXIg5piv5ZCm5by65Yi25riF6Zmk77yIIOWmguaenOS4umZhbHNl5YiZ562J5b6F5a6a5pe25Zmo5Yik5pat5riF55CG77yM5aaC5p6c5Li6dHJ1ZeWImeW8uuWItua4hemZpCDvvIlcclxuICAgICAqL1xyXG4gICAgcHVibGljIENsZWFyUGFja0J5TmFtZShwa2duYW1lOnN0cmluZyxpc2NsZWFyOmJvb2xlYW4gPSBmYWxzZSk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBwa2duYW1lID09IFwiXCIgfHwgcGtnbmFtZSA9PSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIGlzY2xlYXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZhaXJ5Z3VpLlVJUGFja2FnZS5yZW1vdmVQYWNrYWdlKCBwa2duYW1lICk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLnBhY2thZ2VSZXMuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBhY2thZ2VSZXNbcGtnbmFtZV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMucGFja2FnZVJlcy5oYXNPd25Qcm9wZXJ0eSggcGtnbmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZvOkxvY2FsRGF0YSA9IHRoaXMucGFja2FnZVJlc1sgcGtnbmFtZSBdO1xyXG4gICAgICAgICAgICAgICAgaWYoIHZvIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB2by5yZWYtLTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFJlZnJlc2hHcm91cFJlcygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbm93VGltZTpudW1iZXIgPSBMYXlhLkJyb3dzZXIubm93KCk7XHJcbiAgICAgICAgdmFyIHM7XHJcbiAgICAgICAgaWYoIHRoaXMucGFja2FnZVJlcyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86TG9jYWxEYXRhO1xyXG4gICAgICAgICAgICBmb3IoIHMgaW4gdGhpcy5wYWNrYWdlUmVzIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSB0aGlzLnBhY2thZ2VSZXNbc107XHJcbiAgICAgICAgICAgICAgICBpZiggdm8ucmVmIDw9IDAgJiYgKG5vd1RpbWUgLSB2by50aW1lKSA+IHRoaXMuQ2xlYXJJbnRlcnZhbCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5DbGVhclBhY2tCeU5hbWUoIHZvLnBhY2thZ2VOYW1lLHRydWUgKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNsZWFyTGl2ZURhdGFCeVBhY2tOYW1lKCB2by5wYWNrYWdlTmFtZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8v5riF55CG5Zu+54mH57yT5a2YXHJcbiAgICAgICAgaWYoIHRoaXMudXJsUmVzIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciByZXNvdXJjZXVybFBvb2w6YW55ID0gdGhpcy51cmxSZXM7XHJcbiAgICAgICAgICAgIGZvciggcyBpbiByZXNvdXJjZXVybFBvb2wgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggcmVzb3VyY2V1cmxQb29sW3NdIDw9IDAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUmVtb3ZlUmVzb3VyY2VzQnl1cmwoIHMsdHJ1ZSApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHNraW5zOiBBcnJheTxzdHJpbmc+ID0gW1wicmVzL3VpL3RhYjEucG5nXCIsIFwicmVzL3VpL3RhYjIucG5nXCJdO1xyXG4gICAgcHJpdmF0ZSBvblNraW5Mb2FkZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHRhYkE6IFRhYiA9IHRoaXMuY3JlYXRlVGFiKHRoaXMuc2tpbnNbMF0pO1xyXG4gICAgICAgIHRhYkEucG9zKDQwLCAxMjApO1xyXG4gICAgICAgIHRhYkEubGFiZWxDb2xvcnMgPSBcIiMwMDAwMDAsI2QzZDNkMywjMzMzMzMzXCI7XHJcblxyXG4gICAgICAgIHZhciB0YWJCOiBUYWIgPSB0aGlzLmNyZWF0ZVRhYih0aGlzLnNraW5zWzFdKTtcclxuICAgICAgICB0YWJCLnBvcyg0MCwgMjIwKTtcclxuICAgICAgICB0YWJCLmxhYmVsQ29sb3JzID0gXCIjRkZGRkZGLCM4RkIyOTksI0ZGRkZGRlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlVGFiKHNraW46IHN0cmluZyk6IFRhYiB7XHJcbiAgICAgICAgdmFyIHRhYjogVGFiID0gbmV3IFRhYigpO1xyXG4gICAgICAgIHRhYi5za2luID0gc2tpbjtcclxuXHJcbiAgICAgICAgdGFiLmxhYmVsQm9sZCA9IHRydWU7XHJcbiAgICAgICAgdGFiLmxhYmVsU2l6ZSA9IDIwO1xyXG4gICAgICAgIHRhYi5sYWJlbFN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XHJcblxyXG4gICAgICAgIHRhYi5sYWJlbHMgPSBcIlRhYiBDb250cm9sIDEsVGFiIENvbnRyb2wgMixUYWIgQ29udHJvbCAzXCI7XHJcbiAgICAgICAgdGFiLmxhYmVsUGFkZGluZyA9IFwiMCwwLDAsMFwiO1xyXG5cclxuICAgICAgICB0YWIuc2VsZWN0ZWRJbmRleCA9IDE7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0YWIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFiO1xyXG4gICAgfVxyXG4gICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIOiOt+WPluW3sue7j+WKoOi9vei/h+eahOaVsOaNrlxyXG4gICAgICogQHBhcmFtIHVybCDotYTmupB1cmxcclxuICAgICAqIEBwYXJhbSBpc0NhY2hlIOaYr+WQpuWtmOWCqOWcqOe8k+WtmOaxoOS4re+8jOm7mOiupOS4unRydWVcclxuICAgICAqL1xyXG4gICAgcHVibGljIEdhaW5SZXNvdXJjZXMoIHVybDpzdHJpbmcsaXNDYWNoZTpib29sZWFuID0gdHJ1ZSApOmFueVxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpc0NhY2hlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMudXJsUmVzW3VybF0gPT0gbnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cmxSZXNbdXJsXSA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy51cmxSZXNbdXJsXSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTGF5YS5sb2FkZXIuZ2V0UmVzKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG5cclxuICAgIHByaXZhdGUgQWRkTG9jYWxMaXZlRGF0YSggcGtnbmFtZTpzdHJpbmcsaXNDYWNoZTpib29sZWFuICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBpc0NhY2hlICYmICF0aGlzLk5vTGl2ZURhdGEuaGFzT3duUHJvcGVydHkoIHBrZ25hbWUgKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgdm86TG9jYWxEYXRhO1xyXG4gICAgICAgICAgICBpZiggIXRoaXMucGFja2FnZVJlcy5oYXNPd25Qcm9wZXJ0eSggcGtnbmFtZSApIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdm8gPSBHYW1lUG9vbC5HZXRJdGVtKCBMb2NhbERhdGEuUmVzRGljVmFsdWUgKTtcclxuICAgICAgICAgICAgICAgIHZvLnBhY2thZ2VOYW1lID0gcGtnbmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFja2FnZVJlc1sgcGtnbmFtZSBdID0gdm87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2byA9IHRoaXMucGFja2FnZVJlc1twa2duYW1lXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2by5yZWYrKztcclxuICAgICAgICAgICAgdm8udGltZSA9IExheWEuQnJvd3Nlci5ub3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICBcclxufSIsIi8qXHJcbiogbmFtZTtcclxuKi9cclxuaW1wb3J0IEhhbmRsZXIgPSBMYXlhLkhhbmRsZXI7XHJcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuL1Jlc0RhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuLi9HbG9iYWxcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtSZWNDb25maWdzfSBmcm9tIFwiLi4vQ29uZmlnL1JlY0NvbmZpZ3NcIjtcclxuZXhwb3J0IGNsYXNzIFJlc291cmNlQ29udHJvbCBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIHByaXZhdGUgX2NvbmZpZ3M6IEFycmF5PGFueT47XHJcbiAgICBwcml2YXRlIF9vbkNvbmZpZ0NvbXBsZXRlOiBGdW5jdGlvbjtcclxuICAgIHByaXZhdGUgX29uQ29uZmlnUHJvZ3Jlc3M6IEZ1bmN0aW9uOyBcclxuICAgIHByaXZhdGUgX29uQ29uZmlnQ29tcGxldGVUYXJnZXQ6IGFueTtcclxuICAgIHByaXZhdGUgX2dyb3VwczogYW55O1xyXG4gICAgcHJpdmF0ZSBfZ3JvdXBJbmRleDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBydW5uaW5nOkJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX25vd0xvYWREYXRhOmFueTtcclxuICAgIFxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluczpSZXNvdXJjZUNvbnRyb2w7XHJcblxyXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcigpIFxyXG5cdHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5pbnMgPSB0aGlzO1xyXG5cdH1cclxuXHRcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFJlc291cmNlQ29udHJvbFxyXG5cdHtcclxuICAgICAgICBpZihSZXNvdXJjZUNvbnRyb2wuaW5zID09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29udHJvbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUmVzb3VyY2VDb250cm9sLmlucztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9jb25maWdzID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgICB0aGlzLl9ncm91cHMgPSB7fTtcclxuICAgICAgICBMYXlhLmxvYWRlci5yZXRyeU51bSA9IDQ7XHJcbiAgICAgICAgTGF5YS5sb2FkZXIub24oTGF5YS5FdmVudC5FUlJPUiwgdGhpcywgdGhpcy5vbkVycm9yKTtcclxuICAgICAgICBMYXlhLmxvYWRlci5vbihcImVycm9yc01zZ1wiLCB0aGlzLCB0aGlzLmVycm9yc01zZ2hhbmRsZXIpO1xyXG4gICAgICAgIExheWEubG9hZGVyLm9uKFwiZ2FtZWVycm9yc01zZ1wiLCB0aGlzLCB0aGlzLmdhbWVlcnJvcnNNc2doYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTG9hZENvbmZpZ0NvbXBsZXRlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLl9vbkNvbmZpZ0NvbXBsZXRlVGFyZ2V0ICE9IG51bGwgJiYgdGhpcy5fb25Db25maWdDb21wbGV0ZSAhPSBudWxsIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ29uZmlnQ29tcGxldGUuY2FsbCggdGhpcy5fb25Db25maWdDb21wbGV0ZVRhcmdldCApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVycm9yc01zZ2hhbmRsZXIoIG1zZzpzdHJpbmcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggXCJsb2FkZmFpbEV2ZW50XCIsbXNnICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnYW1lZXJyb3JzTXNnaGFuZGxlciggbXNnOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBcImdhbWVzZXJyb3NFdmVudFwiLG1zZyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ57uEXHJcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOe7hOWQjVxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IOS9nOeUqOWfn1xyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIOWujOaIkOS6i+S7tlxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyAgIOWKoOi9vei/m+W6puS6i+S7tlxyXG4gICAgICogQHBhcmFtIGlzU2hvdyAgICAgICAgICAgICAgIOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEdyb3VwKGdyb3VwTmFtZTpzdHJpbmcsb25SZXNvdXJjZUxvYWRUYXJnZXQ6YW55LFJlc291cmNlTG9hZENvbXBsZXRlOkZ1bmN0aW9uLG9uUmVzb3VyY2VQcm9ncmVzczpGdW5jdGlvbiA9IG51bGwsaXNTaG93OkJvb2xlYW4gPSB0cnVlLGFyZ3M6YW55PW51bGwpXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coZ3JvdXBOYW1lKTtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gUmVjQ29uZmlncy5JbnN0YW5jZS5SZXNEaWNbIGdyb3VwTmFtZSBdO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xyXG4gICAgICAgIGRhdGEuYXJncz1hcmdzO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwiZ3JvdXBcIjtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliqDovb3ljZXkuKrotYTmupBcclxuICAgICAqIEBwYXJhbSB1cmwg6LWE5rqQdXJsXHJcbiAgICAgKiBAcGFyYW0gdHlwZSDotYTmupDnsbvlnotcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSDlrozmiJDkuovku7ZcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3Mg5Yqg6L296L+b5bqm5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gaXNTaG93IOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9hZGVyKCB1cmw6YW55LCB0eXBlOnN0cmluZyxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUsYXJnczphbnk9bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gW3t1cmw6dXJsLHR5cGU6dHlwZX1dO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xyXG4gICAgICAgIGRhdGEuYXJncz1hcmdzO1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwic2luZ2xlXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiMkRcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L295pWw57uE6LWE5rqQXHJcbiAgICAgKiBAcGFyYW0gdXJscyBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCBcclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3MgXHJcbiAgICAgKiBAcGFyYW0gaXNTaG93IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9hZGVycyggdXJsczpBcnJheTxhbnk+LCBvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc1Nob3c6Qm9vbGVhbiA9IHRydWUsYXJnczphbnk9bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gdXJscztcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzU2hvdztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImFyclwiO1xyXG4gICAgICAgIGRhdGEuYXJncz1hcmdzO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjJEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOimgeWKoOi9veeahOaAu+aVsOmHj1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2FkTnVtOm51bWJlciA9IDA7XHJcbiAgICAvKipcclxuICAgICAqIOW3sue7j+WKoOi9veeahOaVsOmHj1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9sb2FkZWROdW06bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9wcmVsb2FkTnVtOm51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfY3V0Om51bWJlciA9IDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93TG9hZEFycjpBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L296LWE5rqQ5pWw57uE77yM5q2k5Yqg6L295pa55rOV5Lya5Y2V5Liq5Yqg6L295pWw57uE5YaF55qE6LWE5rqQ77yM55So5LqO5pi+56S65Lik5Liq6L+b5bqm5p2h77yIIOS4gOS4quaAu+i/m+W6puadoe+8jOS4gOS4quWNleS4qui1hOa6kOi/m+W6puadoSDvvIlcclxuICAgICAqIEBwYXJhbSB1cmxzIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VMb2FkVGFyZ2V0IFxyXG4gICAgICogQHBhcmFtIFJlc291cmNlTG9hZENvbXBsZXRlIFxyXG4gICAgICogQHBhcmFtIG9uUmVzb3VyY2VQcm9ncmVzcyBcclxuICAgICAqIEBwYXJhbSBpc1Nob3cgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkZXJBcnIodXJsczpBcnJheTxhbnk+LCBvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxjdXQ6bnVtYmVyID0gMyk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSB1cmxzO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJsb2FkZXJBcnJcIjtcclxuICAgICAgICBkYXRhLmN1dCA9IGN1dDtcclxuICAgICAgICBkYXRhLnJlc291c2VUeXBlID0gXCIyRFwiO1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3MucHVzaCggZGF0YSApO1xyXG4gICAgICAgIHRoaXMuc3RhcnRMb2FkMSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhcnRMb2FkMSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggIXRoaXMucnVubmluZyAmJiB0aGlzLl9jb25maWdzLmxlbmd0aCA+IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSB0aGlzLl9jb25maWdzLnNoaWZ0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0xvYWRBcnIgPSAodGhpcy5fbm93TG9hZERhdGEudXJscyBhcyBBcnJheTxhbnk+KS5jb25jYXQoKS5yZXZlcnNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWROdW0gPSB0aGlzLl9ub3dMb2FkQXJyLmxlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZGVkTnVtID0wO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmVsb2FkTnVtID0gdGhpcy5fbG9hZGVkTnVtO1xyXG4gICAgICAgICAgICB0aGlzLl9jdXQgPSBOdW1iZXIodGhpcy5fbm93TG9hZERhdGEuY3V0KTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkU3RhcnQxKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZFN0YXJ0MSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ydW5uaW5nIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0xvYWRBcnIgJiYgdGhpcy5fbm93TG9hZEFyci5sZW5ndGggPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhciBuZWVkQXJyOkFycmF5PGFueT47XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkQXJyLmxlbmd0aCA+IHRoaXMuX2N1dCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5lZWRBcnIgPSB0aGlzLl9ub3dMb2FkQXJyLnNwbGljZSggMCx0aGlzLl9jdXQgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5lZWRBcnIgPSB0aGlzLl9ub3dMb2FkQXJyLnNwbGljZSggMCApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2N1dCA9IG5lZWRBcnIubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLl9wcmVsb2FkTnVtID0gdGhpcy5fbG9hZGVkTnVtO1xyXG4gICAgICAgICAgICB0aGlzLm9uTG9hZGluZ0FyciggMCApO1xyXG4gICAgICAgICAgICB2YXIgcmVzb3VzZVR5cGU6c3RyaW5nID0gdGhpcy5fbm93TG9hZERhdGEucmVzb3VzZVR5cGU7XHJcbiAgICAgICAgICAgIGlmKHJlc291c2VUeXBlID09IFwiMkRcInx8cmVzb3VzZVR5cGU9PW51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmxvYWQobmVlZEFyciwgSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRDb21wbGV0ZUFyciksSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRpbmdBcnIsbnVsbCwgZmFsc2UpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIExheWEubG9hZGVyLmNyZWF0ZShuZWVkQXJyLCBIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZENvbXBsZXRlQXJyKSxIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uTG9hZGluZ0FycixudWxsLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vd0xvYWREYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zdGFydExvYWQxKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Mb2FkaW5nQXJyKHZhbHVlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sb2FkZWROdW0gPSB0aGlzLl9wcmVsb2FkTnVtICsgdmFsdWUqdGhpcy5fY3V0O1xyXG4gICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgYWxsdmFsdWU6bnVtYmVyID0gTWF0aC5jZWlsKCh0aGlzLl9sb2FkZWROdW0gLyB0aGlzLl9sb2FkTnVtICkqMTAwKTtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhLnByb2dyZXNzICE9IG51bGwgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcy5jYWxsKCB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCxhbGx2YWx1ZSxNYXRoLmZsb29yKHZhbHVlKjEwMCkgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTG9hZENvbXBsZXRlQXJyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMub25Mb2FkaW5nQXJyKCAxICk7XHJcbiAgICAgICAgdGhpcy5fbG9hZGVkTnVtID0gdGhpcy5fcHJlbG9hZE51bSArIHRoaXMuX2N1dDtcclxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiggdGhpcy5fbG9hZGVkTnVtID09IHRoaXMuX2xvYWROdW0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhICYmIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUuY2FsbCh0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgTGF5YS50aW1lci5jYWxsTGF0ZXIoIHRoaXMsIHRoaXMubG9hZFN0YXJ0MSApO1xyXG4gICAgICAgIC8vIHRoaXMubG9hZFN0YXJ0MSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZFN0YXJ0KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0aGlzLnJ1bm5pbmcgfHwgdGhpcy5fY29uZmlncy5sZW5ndGggPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fbm93TG9hZERhdGEgPSB0aGlzLl9jb25maWdzWzBdO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IHRoaXMuX25vd0xvYWREYXRhLnVybHM7XHJcbiAgICAgICAgdmFyIGlzU2hvdzpib29sZWFuID0gdGhpcy5fbm93TG9hZERhdGEuaXNTaG93O1xyXG4gICAgICAgIGlmKCBpc1Nob3cgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5zaG93TW9kYWxXYWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZXNvdXNlVHlwZTpzdHJpbmcgPSB0aGlzLl9ub3dMb2FkRGF0YS5yZXNvdXNlVHlwZTtcclxuICAgICAgICBpZiggYXJyICE9IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYocmVzb3VzZVR5cGUgPT0gXCIyRFwifHxyZXNvdXNlVHlwZT09bnVsbClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgTGF5YS5sb2FkZXIubG9hZChhcnIsSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRDb21wbGV0ZSksSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkxvYWRpbmcsIG51bGwsIGZhbHNlKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBMYXlhLmxvYWRlci5jcmVhdGUoYXJyLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkQ29tcGxldGUpLEhhbmRsZXIuY3JlYXRlKHRoaXMsIHRoaXMub25Mb2FkaW5nLCBudWxsLCBmYWxzZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWKoOi9vei/m+W6puS+puWQrOWZqFxyXG4gICAgcHJpdmF0ZSBvbkxvYWRpbmcocHJvZ3Jlc3M6IG51bWJlcik6IHZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHByb2dyZXNzID0gTWF0aC5jZWlsKCBOdW1iZXIocHJvZ3Jlc3MgKiAxMDApICk7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dMb2FkRGF0YS5wcm9ncmVzcyAhPSBudWxsIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEucHJvZ3Jlc3MuY2FsbCggdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGVUYXJnZXQscHJvZ3Jlc3MgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTG9hZENvbXBsZXRlKGFyZ3M6YW55PW51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBmYWlyeWd1aS5HUm9vdC5pbnN0LmNsb3NlTW9kYWxXYWl0KCk7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd0xvYWREYXRhICYmIHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuX25vd0xvYWREYXRhLmFyZ3Mpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93TG9hZERhdGEuY29tcGxldGUuY2FsbCh0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZVRhcmdldCx0aGlzLl9ub3dMb2FkRGF0YS5hcmdzKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YS5jb21wbGV0ZS5jYWxsKHRoaXMuX25vd0xvYWREYXRhLmNvbXBsZXRlVGFyZ2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9ub3dMb2FkRGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5zaGlmdCgpO1xyXG4gICAgICAgIHRoaXMubG9hZFN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkVycm9yKGVycjogU3RyaW5nKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgZmFpcnlndWkuR1Jvb3QuaW5zdC5jbG9zZU1vZGFsV2FpdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L29M0TljZXkuKrotYTmupBcclxuICAgICAqIEBwYXJhbSB1cmwg6LWE5rqQdXJsXHJcbiAgICAgKiBAcGFyYW0gdHlwZSDotYTmupDnsbvlnotcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCDkvZznlKjln59cclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSDlrozmiJDkuovku7ZcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3Mg5Yqg6L296L+b5bqm5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gaXNTaG93IOaYr+WQpuaYvuekuuWKoOi9veeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgTG9hZGVyM0QoIHVybDphbnksIHR5cGU6YW55LG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gW3t1cmw6dXJsLHR5cGU6dHlwZX1dO1xyXG4gICAgICAgIGRhdGEuaXNTaG93ID0gaXNTaG93O1xyXG4gICAgICAgIGRhdGEudHlwZSA9IFwic2luZ2xlXCI7XHJcbiAgICAgICAgZGF0YS5yZXNvdXNlVHlwZSA9IFwiM0RcIjtcclxuICAgICAgICB0aGlzLl9jb25maWdzLnB1c2goIGRhdGEgKTtcclxuICAgICAgICB0aGlzLmxvYWRTdGFydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yqg6L29M0TotYTmupDnu4RcclxuICAgICAqIEBwYXJhbSBncm91cE5hbWUg57uE5ZCNXHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZUxvYWRUYXJnZXQg5L2c55So5Z+fXHJcbiAgICAgKiBAcGFyYW0gUmVzb3VyY2VMb2FkQ29tcGxldGUg5a6M5oiQ5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gb25SZXNvdXJjZVByb2dyZXNzICAg5Yqg6L296L+b5bqm5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0gaXNTaG93ICAgICAgICAgICAgICAg5piv5ZCm5pi+56S65Yqg6L2954q25oCBXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsb2FkR3JvdXAzRChncm91cE5hbWU6c3RyaW5nLG9uUmVzb3VyY2VMb2FkVGFyZ2V0OmFueSxSZXNvdXJjZUxvYWRDb21wbGV0ZTpGdW5jdGlvbixvblJlc291cmNlUHJvZ3Jlc3M6RnVuY3Rpb24gPSBudWxsLGlzU2hvdzpCb29sZWFuID0gdHJ1ZSxhcmdzOmFueT1udWxsKVxyXG4gICAge1xyXG4gICAgICAgIHZhciBkYXRhOmFueSA9IHt9O1xyXG4gICAgICAgIGRhdGEuY29tcGxldGUgPSBSZXNvdXJjZUxvYWRDb21wbGV0ZTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlVGFyZ2V0ID0gb25SZXNvdXJjZUxvYWRUYXJnZXQ7XHJcbiAgICAgICAgZGF0YS5wcm9ncmVzcyA9IG9uUmVzb3VyY2VQcm9ncmVzcztcclxuICAgICAgICBkYXRhLnVybHMgPSBSZWNDb25maWdzLkluc3RhbmNlLlJlc0RpY1sgZ3JvdXBOYW1lIF07XHJcbiAgICAgICAgZGF0YS5pc1Nob3cgPSBpc1Nob3c7XHJcbiAgICAgICAgZGF0YS5hcmdzPWFyZ3M7XHJcbiAgICAgICAgZGF0YS50eXBlID0gXCJncm91cFwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjNEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9vei1hOa6kOaVsOe7hO+8jOatpOWKoOi9veaWueazleS8muWNleS4quWKoOi9veaVsOe7hOWGheeahOi1hOa6kO+8jOeUqOS6juaYvuekuuS4pOS4qui/m+W6puadoe+8iCDkuIDkuKrmgLvov5vluqbmnaHvvIzkuIDkuKrljZXkuKrotYTmupDov5vluqbmnaEg77yJXHJcbiAgICAgKiBAcGFyYW0gdXJscyBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCBcclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlUHJvZ3Jlc3MgXHJcbiAgICAgKiBAcGFyYW0gaXNTaG93IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZGVyM0RBcnIodXJsczpBcnJheTxhbnk+LCBvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sb25SZXNvdXJjZVByb2dyZXNzOkZ1bmN0aW9uID0gbnVsbCxpc3Nob3c6Ym9vbGVhbiA9IGZhbHNlLGFyZ3M6YW55PW51bGwpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZGF0YTphbnkgPSB7fTtcclxuICAgICAgICBkYXRhLmNvbXBsZXRlID0gUmVzb3VyY2VMb2FkQ29tcGxldGU7XHJcbiAgICAgICAgZGF0YS5jb21wbGV0ZVRhcmdldCA9IG9uUmVzb3VyY2VMb2FkVGFyZ2V0O1xyXG4gICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBvblJlc291cmNlUHJvZ3Jlc3M7XHJcbiAgICAgICAgZGF0YS51cmxzID0gdXJscztcclxuICAgICAgICBkYXRhLmlzU2hvdyA9IGlzc2hvdztcclxuICAgICAgICBkYXRhLmFyZ3M9YXJncztcclxuICAgICAgICBkYXRhLnR5cGUgPSBcImxvYWRlckFyclwiO1xyXG4gICAgICAgIGRhdGEucmVzb3VzZVR5cGUgPSBcIjNEXCI7XHJcbiAgICAgICAgdGhpcy5fY29uZmlncy5wdXNoKCBkYXRhICk7XHJcbiAgICAgICAgdGhpcy5sb2FkU3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOi9veeJueaViFxyXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSBcclxuICAgICAqIEBwYXJhbSBvblJlc291cmNlTG9hZFRhcmdldCBcclxuICAgICAqIEBwYXJhbSBSZXNvdXJjZUxvYWRDb21wbGV0ZSBcclxuICAgICAqIEBwYXJhbSBhcmdzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEVmZmVjdCggZ3JvdXBOYW1lOnN0cmluZyxvblJlc291cmNlTG9hZFRhcmdldDphbnksUmVzb3VyY2VMb2FkQ29tcGxldGU6RnVuY3Rpb24sYXJnczphbnk9bnVsbCApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdXJsczpBcnJheTxhbnk+ID0gUmVjQ29uZmlncy5JbnN0YW5jZS5SZXNEaWNbIGdyb3VwTmFtZSBdO1xyXG4gICAgICAgIGlmKCB1cmxzICYmIHVybHMubGVuZ3RoID4gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHVybHMsSGFuZGxlci5jcmVhdGUoIG9uUmVzb3VyY2VMb2FkVGFyZ2V0LFJlc291cmNlTG9hZENvbXBsZXRlLFthcmdzXSApKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBMYXlvdXRDb250cm9sIH0gZnJvbSBcIi4vTGF5b3V0Q29udHJvbFwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi4vQ29uZmlnL0Fzc2V0UGF0aFwiO1xyXG5pbXBvcnQge0NhbWVyYU1hbmFnZXJ9IGZyb20gXCIuLi9HYW1lL0NhbWVyYU1hbmFnZXJcIjtcclxuaW1wb3J0IHtQcm9wTWFuYWdlcn0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvUHJvcE1hbmFnZXJcIjtcclxuaW1wb3J0IHtQbGF5ZXJ9IGZyb20gXCIuLi9HYW1lL1BsYXllclwiO1xyXG5pbXBvcnQgeyBEaXNwYXRjaGVyTWFuYWdlciB9IGZyb20gXCIuLi91dGlscy9EaXNwYXRjaGVyTWFuYWdlclwiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZX0gZnJvbSBcIi4uL3V0aWxzL0dhbWVTdGF0ZVwiO1xyXG5pbXBvcnQgTGV2ZWxDRkcgZnJvbSBcIi4uL0NGRy9MZXZlbENGR1wiO1xyXG5pbXBvcnQge0FnZW5jeVVzZXJNZXNzYWdlfSBmcm9tIFwiLi4vQWdlbmN5L0FnZW5jeVVzZXJNZXNzYWdlXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IE5wY0NGRyBmcm9tIFwiLi4vQ0ZHL05wY0NGR1wiO1xyXG5pbXBvcnQge05wY1NjcmlwdH0gZnJvbSBcIi4uL0dhbWUvTnBjU2NyaXB0XCI7XHJcbmltcG9ydCB7UmVzb3VyY2VDb250cm9sfSBmcm9tIFwiLi9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uL0NGRy9HYW1lQ0ZHXCI7XHJcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XHJcbmltcG9ydCB7VXNlckluZm9FdmVudH0gZnJvbSBcIi4uL0RhdGEvVXNlckluZm9FdmVudFwiO1xyXG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tIFwiLi4vR2xvYmFsXCI7XHJcbmltcG9ydCB7Q2hhcmFjdGVyUG9vbH0gZnJvbSBcIi4uL1ByZWZhYkNvbnRyb2wvQ2hhcmFjdGVyUG9vbFwiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vQ0ZHL1JvbGVDRkdcIjtcclxuaW1wb3J0IHsgVmlld01hbmFnZXIgfSBmcm9tIFwiLi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBMYXlPVVQgfSBmcm9tIFwiLi4vdXRpbHMvTGF5T1VUXCI7XHJcblxyXG5cclxuaW1wb3J0IFNwcml0ZSA9IExheWEuU3ByaXRlO1xyXG5pbXBvcnQgU3RhZ2UgPSBMYXlhLlN0YWdlO1xyXG5pbXBvcnQgRXZlbnQgPSBMYXlhLkV2ZW50O1xyXG5pbXBvcnQgQnJvd3NlciA9IExheWEuQnJvd3NlcjtcclxuaW1wb3J0IFdlYkdMID0gTGF5YS5XZWJHTDtcclxuZXhwb3J0IGNsYXNzIFNjZW5lQ29udHJvbFxyXG57XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnM6U2NlbmVDb250cm9sO1xyXG5cclxuICAgIHByaXZhdGUgX2luaXRQb3NZOm51bWJlciA9IDE7XHJcblxyXG4gICAgcHVibGljIGNhbWVyYVNjcmlwdDpDYW1lcmFNYW5hZ2VyO1xyXG4gICAgcHVibGljIFBsYXllclNjcmlwdDpQbGF5ZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBTY2VuZUNvbnRyb2wuaW5zID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKuS9v+eUqOeVjOmdouaYvuekuu+8jDDvvJrnoLjom4ssMTrlrp3nrrEqL1xyXG4gICAgc3RhdGljIEVnZ0dHcm91cDpudW1iZXI9MDtcclxuXHJcbiAgICAvKirnrb7liLDmmK/lkKbmraPlnKjmmL7npLogKi9cclxuICAgIHN0YXRpYyBJc1Nob3dTaWduOmJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpOlNjZW5lQ29udHJvbFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBTY2VuZUNvbnRyb2wuaW5zID09IG51bGwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTY2VuZUNvbnRyb2woKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFNjZW5lQ29udHJvbC5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgLy/liJvlu7rkuLvop5JcclxuICAgIHB1YmxpYyBDcmVhdGVQbGF5ZXIoIHJvbGVjZmc6Um9sZUNGRyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgaXNjcmVhdGU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCAhUHJvcE1hbmFnZXIubWFpblJvbGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXNjcmVhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCBQcm9wTWFuYWdlci5tYWluUm9sZS5uYW1lICE9IFwiQ2hhcmFjdGVyXCIgKyByb2xlY2ZnLm5hbWUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXNjcmVhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLkNsZWFyTW9tZW50Q2hhcmFjdGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCBpc2NyZWF0ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAvLyB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RSb2xlTW9kZWwoUm9sZURhdGEucm9sZUNmZy5uYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgLy8gUHJvcE1hbmFnZXIubWFpblJvbGUgPSBMYXlhLlNwcml0ZTNELmluc3RhbnRpYXRlKHNwLCBQcm9wTWFuYWdlci5zY2VuZTNELCBmYWxzZSxuZXcgTGF5YS5WZWN0b3IzKCAwLDAsMCApKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5tYWluUm9sZSA9IENoYXJhY3RlclBvb2wuQWRkQ2hhcmFjdGVyKCByb2xlY2ZnLm5hbWUsUGxheWVyLFByb3BNYW5hZ2VyLnNjZW5lM0QgKTtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIubWFpblJvbGUubmFtZSA9IFwiQ2hhcmFjdGVyXCIgKyByb2xlY2ZnLm5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuUGxheWVyU2NyaXB0ID0gUHJvcE1hbmFnZXIubWFpblJvbGUuZ2V0Q29tcG9uZW50KCBQbGF5ZXIgKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIHRoaXMubWFpblJvbGVTY3JpcHQucmVzb3VzZU5hbWUgPSBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWU7XHJcbiAgICAgICAgICAgIC8vIGlmKCAgKVxyXG4gICAgICAgICAgICAvLyB0aGlzLm1haW5Sb2xlU2NyaXB0ID0gUHJvcE1hbmFnZXIubWFpblJvbGUuYWRkQ29tcG9uZW50KCBNYWluUkFvbGVTY3JpcHQgKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB2YXIgaW5mbzphbnkgPSBSb2xlRGF0YS5sZXZlbGNmZy5yb2xlaW5pdHBvcztcclxuICAgICAgICB2YXIgY2hpZGFycjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKGluZm8ub2Zmc2V0UG9zKTtcclxuICAgICAgICB2YXIgb2Zmc2V0UG9zOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjMoIE51bWJlciggY2hpZGFyclswXSksTnVtYmVyKCBjaGlkYXJyWzFdKSxOdW1iZXIoIGNoaWRhcnJbMl0pICk7XHJcbiAgICAgICAgdmFyIHBvc1ZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIHZhciBzZWxlY3RWZWM6TGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIGlmKCBpbmZvLmluaXRidWlsZCA9PSBcInN0YXJ0cGFuZWxcIiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwb3NWZWMueCA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnggKyBvZmZzZXRQb3MueDtcclxuICAgICAgICAgICAgcG9zVmVjLnkgPSBQcm9wTWFuYWdlci5zdGFydFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbi55ICsgb2Zmc2V0UG9zLnk7XHJcbiAgICAgICAgICAgIHBvc1ZlYy56ID0gUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueiArIG9mZnNldFBvcy56O1xyXG4gICAgICAgICAgICBzZWxlY3RWZWMgPSAoIFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUuZ2V0Q2hpbGRCeU5hbWUoIFwiY2hpbGRfcG9zXCIgKSBhcyBMYXlhLlNwcml0ZTNEICkudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY2hpbGRwb3M6TGF5YS5WZWN0b3IzID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggUm9sZURhdGEubGV2ZWxtYXBBcnJbMF0saW5mby5pbml0YnVpbGQgKTtcclxuICAgICAgICAgICAgcG9zVmVjLnggPSBjaGlsZHBvcy54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgIHBvc1ZlYy55ID0gY2hpbGRwb3MueSArIG9mZnNldFBvcy55O1xyXG4gICAgICAgICAgICBwb3NWZWMueiA9IGNoaWxkcG9zLnogKyBvZmZzZXRQb3MuejtcclxuICAgICAgICAgICAgc2VsZWN0VmVjID0gY2hpbGRwb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvc1ZlYztcclxuICAgICAgICB0aGlzLmNhbWVyYVNjcmlwdC5TZXRDYW1lcmFQb3NpdGlvbihQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24pO1xyXG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0LnNldG5vd1NlbGVjdFZlYyggc2VsZWN0VmVjICk7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXJTY3JpcHQubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc3RhbmQ7XHJcbiAgICAgICAgdGhpcy5QbGF5ZXJTY3JpcHQuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xyXG5cclxuICAgICAgICAvLyB2YXIgVUlQb3MgPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgLy8gdmFyIE5BTUVVSSA9IG5ldyBMYXlhLlRleHQoKTtcclxuXHJcbiAgICAgICAgLy8gTkFNRVVJLnRleHQgPSBcIuiHquW3sVwiO1xyXG4gICAgICAgIC8vIE5BTUVVSS5mb250U2l6ZSA9IDYwO1xyXG4gICAgICAgIC8vIE5BTUVVSS5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG4gICAgICAgIC8vIE5BTUVVSS5zY2FsZVggPSAwLjU7XHJcbiAgICAgICAgLy8gTkFNRVVJLnNjYWxlWSA9IDAuNTtcclxuICAgICAgICAvLyBOQU1FVUkuYWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIC8vIE5BTUVVSS52YWxpZ24gPSBcIm1pZGRsZVwiO1xyXG4gICAgICAgIC8vIExheWEuc3RhZ2UuYWRkQ2hpbGQoTkFNRVVJKTtcclxuICAgICAgICAvLyBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGxldCBTY3JlZW5Qb3MgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICAgICAgLy8gICAgIFByb3BNYW5hZ2VyLmNhcm1hLndvcmxkVG9WaWV3cG9ydFBvaW50KFVJUG9zLCBTY3JlZW5Qb3MpO1xyXG4gICAgICAgIC8vICAgICBOQU1FVUkucG9zKFNjcmVlblBvcy54LCBTY3JlZW5Qb3MueSk7XHJcbiAgICAgICAgLy8gfSlcclxuICAgIH1cclxuICAgIC8v5Yib5bu6bnBjXHJcbiAgICBwcml2YXRlIGNyZWF0ZU5wYyggKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJDcmVhdE5wYy0tLVwiKTtcclxuICAgICAgICB0aGlzLkNsZWFyTnBjKCk7XHJcbiAgICAgICAgdmFyIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xyXG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IGFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhO1xyXG4gICAgICAgIHZhciBhcnI6QXJyYXk8YW55PiA9IFJvbGVEYXRhLmxldmVsY2ZnLm5wYztcclxuICAgICAgICB2YXIgY2hpbGRkaWN0OmFueTtcclxuICAgICAgICB2YXIgaW5kZXg6bnVtYmVyID0gMDtcclxuICAgICAgICBQcm9wTWFuYWdlci5ucGNudW0gPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgIGZvciggdmFyIHMgaW4gYXJyIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWxkZGljdCA9IGFycltzXTtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdFZlYzpMYXlhLlZlY3RvcjMgPSBudWxsO1xyXG4gICAgICAgICAgICB2YXIgbnBjY2ZnOk5wY0NGRyA9IE5wY0NGRy5kaWN0WyBjaGlsZGRpY3QuaWQgXTtcclxuICAgICAgICAgICAgdmFyIHNwOkxheWEuU3ByaXRlM0QgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKG5wY2NmZy5uYW1lKSkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgdmFyIGNoaWRhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FycihjaGlsZGRpY3Qub2Zmc2V0UG9zKTtcclxuICAgICAgICAgICAgdmFyIG9mZnNldFBvczpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCBOdW1iZXIoIGNoaWRhcnJbMF0pLE51bWJlciggY2hpZGFyclsxXSksTnVtYmVyKCBjaGlkYXJyWzJdKSApO1xyXG4gICAgICAgICAgICB2YXIgcG9zVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICAgICAgICAgIGlmKCBjaGlsZGRpY3Quc2NlbmUgPT0gXCJzdGFydHBhbmVsXCIgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueCA9IFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUudHJhbnNmb3JtLnBvc2l0aW9uLnggKyBvZmZzZXRQb3MueDtcclxuICAgICAgICAgICAgICAgIHBvc1ZlYy55ID0gUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueSArIDEgKyBvZmZzZXRQb3MueTtcclxuICAgICAgICAgICAgICAgIHBvc1ZlYy56ID0gUHJvcE1hbmFnZXIuc3RhcnRQbGFuZS50cmFuc2Zvcm0ucG9zaXRpb24ueiArIG9mZnNldFBvcy56O1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0VmVjID0gKCBQcm9wTWFuYWdlci5zdGFydFBsYW5lLmdldENoaWxkQnlOYW1lKCBcImNoaWxkX3Bvc1wiICkgYXMgTGF5YS5TcHJpdGUzRCApLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBjaGlsZHBvczpMYXlhLlZlY3RvcjMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKGNoaWxkZGljdC5zY2VuZSAsY2hpbGRkaWN0LmluaXRidWlsZCApO1xyXG4gICAgICAgICAgICAgICAgcG9zVmVjLnggPSBjaGlsZHBvcy54ICsgb2Zmc2V0UG9zLng7XHJcbiAgICAgICAgICAgICAgICBwb3NWZWMueSA9IGNoaWxkcG9zLnkgKyBvZmZzZXRQb3MueTtcclxuICAgICAgICAgICAgICAgIHBvc1ZlYy56ID0gY2hpbGRwb3MueiArIG9mZnNldFBvcy56O1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0VmVjID0gY2hpbGRwb3M7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBucGNzcDpMYXlhLlNwcml0ZTNEID0gQ2hhcmFjdGVyUG9vbC5BZGRDaGFyYWN0ZXIoIG5wY2NmZy5uYW1lLE5wY1NjcmlwdCxQcm9wTWFuYWdlci5zY2VuZTNEICk7XHJcbiAgICAgICAgICAgIG5wY3NwLm5hbWUgPSBcIm5wY19cIiArIGluZGV4O1xyXG4gICAgICAgICAgICBucGNzcC50cmFuc2Zvcm0ucG9zaXRpb24gPSBwb3NWZWM7XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gbnBjc3AuZ2V0Q29tcG9uZW50KCBOcGNTY3JpcHQgKTtcclxuICAgICAgICAgICAgbnBjc2NyaXB0LnNldG5vd1NlbGVjdFZlYyggc2VsZWN0VmVjICk7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5ucGNpbmZvKCBucGNjZmcgKTtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIubnBjRGljdFsgbnBjc3AubmFtZSBdID0gbnBjc3A7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3RbbnBjc3AubmFtZV0gPSBucGNzY3JpcHQ7XHJcbiAgICAgICAgICAgIG5wY3NjcmlwdC5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuU2hvd1VJKG5wY3NwKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXROcGMyLS0tXCIpO1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGluZGV4ID0gMDtcclxuICAgIFNob3dVSShfc3ByaXRlOkxheWEuU3ByaXRlM0Qpe1xyXG4gICAgICAgIHZhciBVSVBvcyA9IF9zcHJpdGUudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgIHZhciBOQU1FVUkgPSBuZXcgTGF5YS5UZXh0KCk7XHJcbiAgICAgICAgbGV0IHJhbmRvbSA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMSwzMCk7XHJcbiAgICAgICBcclxuICAgICAgICBOQU1FVUkudGV4dCA9IFwibnBjX1wiKyB0aGlzLmluZGV4O1xyXG4gICAgICAgIE5BTUVVSS5mb250U2l6ZSA9IDYwO1xyXG4gICAgICAgIE5BTUVVSS5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG4gICAgICAgIE5BTUVVSS5zY2FsZVggPSAwLjU7XHJcbiAgICAgICAgTkFNRVVJLnNjYWxlWSA9IDAuNTtcclxuICAgICAgICBOQU1FVUkuYWxpZ24gPSBcImNlbnRlclwiO1xyXG4gICAgICAgIE5BTUVVSS52YWxpZ24gPSBcIm1pZGRsZVwiO1xyXG4gICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoTkFNRVVJKTtcclxuICAgICAgICBMYXlhLnRpbWVyLmZyYW1lTG9vcCgxLCB0aGlzLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBTY3JlZW5Qb3MgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLmNhcm1hLndvcmxkVG9WaWV3cG9ydFBvaW50KFVJUG9zLCBTY3JlZW5Qb3MpO1xyXG4gICAgICAgICAgICBOQU1FVUkucG9zKFNjcmVlblBvcy54LCBTY3JlZW5Qb3MueSsyMCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmluZGV4Kys7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgU2hvd1RoZUdhbWVTY2VuZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgdmFyIHVybEFycjpBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgICAgICAgdGhpcy5jYW1lcmFTY3JpcHQuaXNjYW5mb2xsb3cgPSB0cnVlO1xyXG4gICAgICAgIHZhciByb2xlRGF0YTpSb2xlRGF0YSA9ICggUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlICkuUm9sZURhdGE7XHJcbiAgICAgICAgdmFyIGFycjpBcnJheTxzdHJpbmc+ID0gcm9sZURhdGEubGV2ZWxtYXBBcnI7XHJcbiAgICAgICAgdmFyIGk6bnVtYmVyID0gMDtcclxuICAgICAgICBmb3IoIGkgPSAwO2kgPCBhcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdXJsQXJyLmluZGV4T2YoIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBhcnJbaV0gKSApID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdXJsQXJyLnB1c2goIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBhcnJbaV0gKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG5wY0FycjpBcnJheTxhbnk+ID0gcm9sZURhdGEubGV2ZWxjZmcubnBjO1xyXG4gICAgICAgIGZvciggaSA9IDA7aSA8IG5wY0Fyci5sZW5ndGg7aSsrIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB1cmxBcnIuaW5kZXhPZiggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICkgPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB1cmxBcnIucHVzaCggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBOcGNDRkcuZGljdFsgbnBjQXJyW2ldLmlkIF0ubmFtZSApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKCBpID0gMDtpIDwgdXJsQXJyLmxlbmd0aDtpKysgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF0aEFyci5wdXNoKCB7IHVybDp1cmxBcnJbaV0gfSApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UubG9hZGVyM0RBcnIoIHBhdGhBcnIsdGhpcyx0aGlzLlNjZW5lQ3JlYXRDb21wbGV0ZSxudWxsLHRydWUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFNjZW5lQ3JlYXRDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlJlZnJlc2hUZXJyYWluKCk7XHJcbiAgICAgICAgdmFyIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xyXG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IGFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhO1xyXG4gICAgICAgIHRoaXMuQ3JlYXRlUGxheWVyKCBSb2xlRGF0YS5yb2xlQ2ZnICk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVOcGMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIExpc3Rlbk9uRXZlbnQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLnN0YXJ0LHRoaXMsdGhpcy5FbnRlckdhbWUgKTsgXHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lciggR2FtZVN0YXRlLmp1bXAsdGhpcyx0aGlzLkp1bXAgKTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5hZGRFdmVudExpc3RlbmVyKCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkLHRoaXMsdGhpcy5SZWZyZXNoQ2hhcmFjdGVyTW9kZWwgKTtcclxuICAgIH1cclxuXHJcbiAgIFxyXG5cclxuICAgIHByaXZhdGUgQ2hhcmFjdGVyTG9hZEVuZCggdXJsOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgYWdlbmN5dXNlcm1lc3NhZ2U6QWdlbmN5VXNlck1lc3NhZ2UgPSBQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICk7XHJcbiAgICAgICAgdmFyIFJvbGVEYXRhOlJvbGVEYXRhID0gYWdlbmN5dXNlcm1lc3NhZ2UuUm9sZURhdGE7XHJcbiAgICAgICAgaWYoIEFzc2V0UGF0aC5nZXQzRE1vZGVsKCBSb2xlRGF0YS5yb2xlQ2ZnLm5hbWUgKSA9PSB1cmwgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5DcmVhdGVQbGF5ZXIoIFJvbGVEYXRhLnJvbGVDZmcgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBKdW1wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuUGxheWVyU2NyaXB0LlRlc3RKdW1wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIHNldHVwKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ByaXRlKCk7XHJcblxyXG4gICAgICAgIExheWEuc3RhZ2Uub24oRXZlbnQuTU9VU0VfVVAsIHRoaXMsIHRoaXMub25Nb3VzZVVwKTtcclxuICAgICAgICBMYXlhLnN0YWdlLm9uKEV2ZW50Lk1PVVNFX09VVCwgdGhpcywgdGhpcy5vbk1vdXNlVXApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3A6IFNwcml0ZTtcclxuICAgIHByaXZhdGUgcHJlUmFkaWFuOiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTcHJpdGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zcCA9IG5ldyBTcHJpdGUoKTtcclxuICAgICAgICB2YXIgdzogbnVtYmVyID0gMjAwLCBoOiBudW1iZXIgPSAzMDA7XHJcbiAgICAgICAgdGhpcy5zcC5ncmFwaGljcy5kcmF3UmVjdCgwLCAwLCB3LCBoLCBcIiNGRjdGNTBcIik7XHJcbiAgICAgICAgdGhpcy5zcC5zaXplKHcsIGgpO1xyXG4gICAgICAgIHRoaXMuc3AucGl2b3QodyAvIDIsIGggLyAyKTtcclxuICAgICAgICB0aGlzLnNwLnBvcyhMYXlhLnN0YWdlLndpZHRoIC8gMiwgTGF5YS5zdGFnZS5oZWlnaHQgLyAyKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKHRoaXMuc3ApO1xyXG5cclxuICAgICAgICB0aGlzLnNwLm9uKEV2ZW50Lk1PVVNFX0RPV04sIHRoaXMsIHRoaXMub25Nb3VzZURvd24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Nb3VzZURvd24oZTogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB2YXIgdG91Y2hlczogQXJyYXk8YW55PiA9IGUudG91Y2hlcztcclxuXHJcbiAgICAgICAgaWYgKHRvdWNoZXMgJiYgdG91Y2hlcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICB0aGlzLnByZVJhZGlhbiA9IE1hdGguYXRhbjIoXHJcbiAgICAgICAgICAgICAgICB0b3VjaGVzWzBdLnN0YWdlWSAtIHRvdWNoZXNbMV0uc3RhZ2VZLFxyXG4gICAgICAgICAgICAgICAgdG91Y2hlc1swXS5zdGFnZVggLSB0b3VjaGVzWzFdLnN0YWdlWCk7XHJcblxyXG4gICAgICAgICAgICBMYXlhLnN0YWdlLm9uKEV2ZW50Lk1PVVNFX01PVkUsIHRoaXMsIHRoaXMub25Nb3VzZU1vdmUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uTW91c2VNb3ZlKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdmFyIHRvdWNoZXM6IEFycmF5PGFueT4gPSBlLnRvdWNoZXM7XHJcbiAgICAgICAgaWYgKHRvdWNoZXMgJiYgdG91Y2hlcy5sZW5ndGggPT0gMilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBub3dSYWRpYW46IG51bWJlciA9IE1hdGguYXRhbjIoXHJcbiAgICAgICAgICAgICAgICB0b3VjaGVzWzBdLnN0YWdlWSAtIHRvdWNoZXNbMV0uc3RhZ2VZLFxyXG4gICAgICAgICAgICAgICAgdG91Y2hlc1swXS5zdGFnZVggLSB0b3VjaGVzWzFdLnN0YWdlWCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNwLnJvdGF0aW9uICs9IDE4MCAvIE1hdGguUEkgKiAobm93UmFkaWFuIC0gdGhpcy5wcmVSYWRpYW4pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcmVSYWRpYW4gPSBub3dSYWRpYW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Nb3VzZVVwKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5vZmYoRXZlbnQuTU9VU0VfTU9WRSwgdGhpcywgdGhpcy5vbk1vdXNlTW92ZSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICBwcml2YXRlIEVudGVyR2FtZShqaWFzdT8pOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLlBsYXllclNjcmlwdC5zdGFydFJ1bihqaWFzdSk7XHJcbiAgICAgICAgdmFyIG5wY2RpY3Q6YW55ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdDtcclxuICAgICAgICBmb3IoIHZhciBzIGluIG5wY2RpY3QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIG5wY3NjcmlwdDpOcGNTY3JpcHQgPSBucGNkaWN0W3NdO1xyXG4gICAgICAgICAgICBucGNzY3JpcHQuc3RhcnRSdW4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBDbGVhck1vbWVudENoYXJhY3RlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggUHJvcE1hbmFnZXIubWFpblJvbGUgJiYgdGhpcy5QbGF5ZXJTY3JpcHQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgQ2hhcmFjdGVyUG9vbC5DbGVhckNoYXJhY3RlciggUHJvcE1hbmFnZXIubWFpblJvbGUsdGhpcy5QbGF5ZXJTY3JpcHQucmVzb3VzZU5hbWUsdGhpcy5QbGF5ZXJTY3JpcHQgKTtcclxuICAgICAgICAgICAgdGhpcy5QbGF5ZXJTY3JpcHQgPSBudWxsO1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5tYWluUm9sZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBTZXRTY2VuZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgYmFja2dyb3VuZFBhcmVudDpMYXlhLlNwcml0ZSA9IExheW91dENvbnRyb2wuSW5zdGFuY2UuYmFja2dyb3VuZC5kaXNwbGF5T2JqZWN0O1xyXG4gICAgICAgIHZhciBzY2VuZWJnOmZhaXJ5Z3VpLkdDb21wb25lbnQgPSBmYWlyeWd1aS5VSVBhY2thZ2UuY3JlYXRlT2JqZWN0KCBcIm1haW5cIixcImdhbWJnXCIgKSBhcyBmYWlyeWd1aS5HQ29tcG9uZW50O1xyXG4gICAgICAgIHNjZW5lYmcuc2V0U2l6ZShmYWlyeWd1aS5HUm9vdC5pbnN0LndpZHRoLCBmYWlyeWd1aS5HUm9vdC5pbnN0LmhlaWdodCk7XHJcbiAgICAgICAgTGF5b3V0Q29udHJvbC5JbnN0YW5jZS5iYWNrZ3JvdW5kLmFkZENoaWxkKCBzY2VuZWJnICk7XHJcbiAgICAgICAgLy8gVWlNYW5hZ2VyLmluc3RhbmNlLmFkZCggR2FtZUJnVmlldyxudWxsLExheWVyTm90aWZ5LkxBWUVSX0JBQ0tHUk9VTkQgKTtcclxuXHJcbiAgICAgICAgLy/mt7vliqAzROWcuuaZr1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QgPSBiYWNrZ3JvdW5kUGFyZW50LmFkZENoaWxkKG5ldyBMYXlhLlNjZW5lM0QoKSkgYXMgTGF5YS5TY2VuZTNEO1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QucGh5c2ljc1NpbXVsYXRpb24uY29udGludW91c0NvbGxpc2lvbkRldGVjdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAgIC8v5re75Yqg54Wn55u45py6XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuY2FybWEgPSAoUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZChuZXcgTGF5YS5DYW1lcmEoMCwgMC4xLCA3MCkpKSBhcyBMYXlhLkNhbWVyYTtcclxuICAgICAgICB0aGlzLmNhbWVyYVNjcmlwdCA9IFByb3BNYW5hZ2VyLmNhcm1hLmFkZENvbXBvbmVudCggQ2FtZXJhTWFuYWdlciApO1xyXG5cclxuICAgICAgICBQcm9wTWFuYWdlci5jYXJtYS5jbGVhckZsYWcgPSBMYXlhLkJhc2VDYW1lcmEuQ0xFQVJGTEFHX0RFUFRIT05MWTtcclxuICAgICAgICBcclxuICAgICAgICAvL+a3u+WKoOaWueWQkeWFiVxyXG4gICAgICAgIHZhciBkaXJlY3Rpb25MaWdodDogTGF5YS5EaXJlY3Rpb25MaWdodCA9IExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RNb2RlbChcIkRpcmVjdGlvbmFsTGlnaHRcIikpIGFzIExheWEuRGlyZWN0aW9uTGlnaHQ7Ly9Qcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKG5ldyBMYXlhLkRpcmVjdGlvbkxpZ2h0KCkpIGFzIExheWEuRGlyZWN0aW9uTGlnaHQ7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5hZGRDaGlsZCggZGlyZWN0aW9uTGlnaHQgKTtcclxuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC50cmFuc2Zvcm0ud29ybGRNYXRyaXguc2V0Rm9yd2FyZChuZXcgTGF5YS5WZWN0b3IzKDEsIC0xLCAwKSk7XHJcblxyXG4gICAgICAgIC8vIHZhciBkaXJlY3Rpb25MaWdodDogTGF5YS5EaXJlY3Rpb25MaWdodCA9IFByb3BNYW5hZ2VyLnNjZW5lM0QuYWRkQ2hpbGQobmV3IExheWEuRGlyZWN0aW9uTGlnaHQoKSkgYXMgTGF5YS5EaXJlY3Rpb25MaWdodDtcclxuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC5jb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoMSwxLDEpO1xyXG4gICAgICAgIC8vIGRpcmVjdGlvbkxpZ2h0LmludGVuc2l0eSA9IDAuNTtcclxuICAgICAgICAvLyBkaXJlY3Rpb25MaWdodC50cmFuc2Zvcm0ud29ybGRNYXRyaXguc2V0Rm9yd2FyZChuZXcgTGF5YS5WZWN0b3IzKDEsIC0xLCAwKSk7XHJcblxyXG4gICAgICAgIFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUgPSBMYXlhLkxvYWRlci5nZXRSZXMoQXNzZXRQYXRoLmdldDNETW9kZWwoXCJzdGFydHBhbmVsXCIpKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKFByb3BNYW5hZ2VyLnN0YXJ0UGxhbmUpO1xyXG5cclxuICAgICAgICBQcm9wTWFuYWdlci5lbmRQbGFuZSA9IExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RNb2RlbChcImVuZHBhbmVsXCIpKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKFByb3BNYW5hZ2VyLmVuZFBsYW5lKTtcclxuXHJcbiAgICAgICAgLy8gUHJvcE1hbmFnZXIuYmdzcHJpdGUzZCA9IExheWEuTG9hZGVyLmdldFJlcyhBc3NldFBhdGguZ2V0M0RNb2RlbChcImRpc3RhbnR2aWV3XCIpKTtcclxuICAgICAgICAvLyBQcm9wTWFuYWdlci5zY2VuZTNELmFkZENoaWxkKFByb3BNYW5hZ2VyLmJnc3ByaXRlM2QpO1xyXG5cclxuICAgICAgICAvL+mbvuWMluS7o+eggVxyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZW5hYmxlRm9nID0gdHJ1ZTtcclxuICAgICAgICAvL+iuvue9rumbvuWMlueahOminOiJslxyXG4gICAgICAgIHZhciBmb2dBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzJdLnZhbHVlICk7XHJcbiAgICAgICAgaWYoIEdhbWVDRkcuZGljdFs4XSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgd3Vjb2xvcjpBcnJheTxzdHJpbmc+ID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKCBHYW1lQ0ZHLmRpY3RbOF0udmFsdWUgKTtcclxuICAgICAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5mb2dDb2xvciA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKHd1Y29sb3JbMF0pLE51bWJlcih3dWNvbG9yWzFdKSxOdW1iZXIod3Vjb2xvclsyXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5zY2VuZTNELmZvZ0NvbG9yID0gbmV3IExheWEuVmVjdG9yMygwLDAsMC42KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy/orr7nva7pm77ljJbnmoTotbflp4vkvY3nva7vvIznm7jlr7nkuo7nm7jmnLrnmoTot53nprtcclxuICAgICAgICB2YXIgdmFsdWVBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzNdLnZhbHVlICk7XHJcbiAgICAgICAgUHJvcE1hbmFnZXIuc2NlbmUzRC5mb2dTdGFydCA9IE51bWJlciggdmFsdWVBcnJbMF0gKTtcclxuICAgICAgICAvL+iuvue9rumbvuWMluacgOa1k+WkhOeahOi3neemu+OAglxyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNjZW5lM0QuZm9nUmFuZ2UgPSBOdW1iZXIoIHZhbHVlQXJyWzFdICk7XHJcbiAgICAgICAgdGhpcy5TaG93VGhlR2FtZVNjZW5lKCk7XHJcbiAgICAgICAgdGhpcy5MaXN0ZW5PbkV2ZW50KCk7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKua4hemZpOaJgOaciU5QQyAqL1xyXG4gICAgcHJpdmF0ZSBDbGVhck5wYygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbnBjZGljdDphbnkgPSBQcm9wTWFuYWdlci5ucGNEaWN0O1xyXG4gICAgICAgIHZhciBzO1xyXG4gICAgICAgIGZvciggcyBpbiBucGNkaWN0IClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHZhciBzcDpMYXlhLk1lc2hTcHJpdGUzRCA9IG5wY2RpY3Rbc107XHJcbiAgICAgICAgICAgIHZhciBucGNzY3JpcHQ6TnBjU2NyaXB0ID0gUHJvcE1hbmFnZXIubnBjc2NyaXB0RGljdFtzXTtcclxuICAgICAgICAgICAgdmFyIHJlc291c2VuYW1lOnN0cmluZyA9IG5wY3NjcmlwdC5yZXNvdXNlTmFtZTtcclxuICAgICAgICAgICAgQ2hhcmFjdGVyUG9vbC5DbGVhckNoYXJhY3Rlciggc3AscmVzb3VzZW5hbWUsbnBjc2NyaXB0KTtcclxuICAgICAgICAgICAgZGVsZXRlIFByb3BNYW5hZ2VyLm5wY3NjcmlwdERpY3Rbc107XHJcbiAgICAgICAgICAgIGRlbGV0ZSBucGNkaWN0W3NdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIFBhdHRlcm4oIG1hcFNwcml0ZTNEOkxheWEuU3ByaXRlM0QgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJQYXR0ZXJuMS0tLS1cIik7XHJcbiAgICAgICAgaWYoIFByb3BNYW5hZ2VyLnBhdHRlcm5EaWN0WyBtYXBTcHJpdGUzRC5uYW1lIF0gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZGVsZXRlIFByb3BNYW5hZ2VyLnBhdHRlcm5EaWN0WyBtYXBTcHJpdGUzRC5uYW1lIF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBCbG9ja3NTcHJpdGU6TGF5YS5TcHJpdGUzRCA9IG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkJsb2Nrc1wiICkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICBcclxuICAgICAgICB2YXIgY2hpZGRpY3Q6YW55ID0ge307XHJcbiAgICAgICAgdmFyIGNoaWRzcDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBidWlsZFNwOkxheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBpbmRleDpudW1iZXIgPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfYWxsX1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2FsbF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiYnVpbGRfYWxsX1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250X1wiICsgaW5kZXggKSBhcyBMYXlhLk1lc2hTcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZHNwID0gYnVpbGRTcC5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJidWlsZF9mcm9udF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9sZWZ0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2xlZnRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfcmlnaHRfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGJ1aWxkU3AgPSBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfcmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX3JpZ2h0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB3aGlsZSggQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250bGVmdF9cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgYnVpbGRTcCA9IEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udGxlZnRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2Zyb250bGVmdF9cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuZGllUG9zWSA+IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnkgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5kaWVQb3NZID0gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleCA9IDA7XHJcbiAgICAgICAgd2hpbGUoIEJsb2Nrc1Nwcml0ZS5nZXRDaGlsZEJ5TmFtZSggXCJidWlsZF9mcm9udHJpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2Zyb250cmlnaHRfXCIgKyBpbmRleCApIGFzIExheWEuTWVzaFNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkc3AgPSBidWlsZFNwLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImJ1aWxkX2Zyb250cmlnaHRfXCIgKyBpbmRleCBdID0gY2hpZHNwLnRyYW5zZm9ybS5wb3NpdGlvbjtcclxuICAgICAgICAgICAgaWYoIFByb3BNYW5hZ2VyLmRpZVBvc1kgPiBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuZGllUG9zWSA9IGJ1aWxkU3AudHJhbnNmb3JtLnBvc2l0aW9uLnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIHdoaWxlKCBCbG9ja3NTcHJpdGUuZ2V0Q2hpbGRCeU5hbWUoIFwiYnVpbGRfbGVmdHJpZ2h0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBidWlsZFNwID0gQmxvY2tzU3ByaXRlLmdldENoaWxkQnlOYW1lKCBcImJ1aWxkX2xlZnRyaWdodF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IGJ1aWxkU3AuZ2V0Q2hpbGRCeU5hbWUoXCJjaGlsZF9wb3NcIikgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgY2hpZGRpY3RbIFwiYnVpbGRfbGVmdHJpZ2h0X1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5kaWVQb3NZID4gYnVpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24ueSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLmRpZVBvc1kgPSBidWlsZFNwLnRyYW5zZm9ybS5wb3NpdGlvbi55O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4PTA7XHJcbiAgICAgICAgdmFyIFByb3BzOkxheWEuU3ByaXRlM0QgPSBtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJQcm9wc1wiICkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB3aGlsZSggUHJvcHMuZ2V0Q2hpbGRCeU5hbWUoIFwiU2NhZmZvbGRpbmdfXCIgKyBpbmRleCApIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNoaWRzcCA9IFByb3BzLmdldENoaWxkQnlOYW1lKCBcIlNjYWZmb2xkaW5nX1wiICsgaW5kZXggKS5nZXRDaGlsZEJ5TmFtZShcImNoaWxkX3Bvc1wiKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICBjaGlkZGljdFsgXCJTY2FmZm9sZGluZ19cIiArIGluZGV4IF0gPSBjaGlkc3AudHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpbmRleD0wO1xyXG4gICAgICAgIHdoaWxlKCBQcm9wcy5nZXRDaGlsZEJ5TmFtZSggXCJncmlsbGluZ19cIiArIGluZGV4ICkgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY2hpZHNwID0gUHJvcHMuZ2V0Q2hpbGRCeU5hbWUoIFwiZ3JpbGxpbmdfXCIgKyBpbmRleCApLmdldENoaWxkQnlOYW1lKFwiY2hpbGRfcG9zXCIpIGFzIExheWEuU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGNoaWRkaWN0WyBcImdyaWxsaW5nX1wiICsgaW5kZXggXSA9IGNoaWRzcC50cmFuc2Zvcm0ucG9zaXRpb247XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICB2YXIganVtcGNoaWxkU3A6TGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgdmFyIGlzY3JlYXRlanQ6Ym9vbGVhbiA9IChQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeVVzZXJNZXNzYWdlICkgYXMgQWdlbmN5VXNlck1lc3NhZ2UpLlJvbGVEYXRhLkxldmVsSUQgPCAzID8gdHJ1ZTpmYWxzZTtcclxuICAgICAgICB3aGlsZSggUHJvcHMuZ2V0Q2hpbGRCeU5hbWUoIFwiSnVtcEJvb3N0X1wiICsgaW5kZXggKSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBqdW1wY2hpbGRTcCA9IFByb3BzLmdldENoaWxkQnlOYW1lKCBcIkp1bXBCb29zdF9cIiArIGluZGV4ICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIGlmKCBpc2NyZWF0ZWp0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBvczpMYXlhLlZlY3RvcjMgPSBqdW1wY2hpbGRTcC50cmFuc2Zvcm0ucG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgIHBvcy55ICs9IDM7XHJcbiAgICAgICAgICAgICAgICB2YXIgamlhbnRvdTpMYXlhLk1lc2hTcHJpdGUzRCA9IExheWEuU3ByaXRlM0QuaW5zdGFudGlhdGUoIExheWEubG9hZGVyLmdldFJlcyggQXNzZXRQYXRoLmdldDNEUm9sZU1vZGVsKCBcIkFycm93XCIgKSApLFByb3BNYW5hZ2VyLnNjZW5lM0QsZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBwb3MgICkgYXMgTGF5YS5NZXNoU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5qaWFudG91QXJyLnB1c2goIGppYW50b3UgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBQcm9wTWFuYWdlci5wYXR0ZXJuRGljdFsgbWFwU3ByaXRlM0QubmFtZSBdID0gY2hpZGRpY3Q7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUGF0dGVybjItLS0tXCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIHByaXZhdGUgb25TcHJpdGVDbGljayhlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHZhciByYW5kb21BbmdsZTogbnVtYmVyID0gTWF0aC5yYW5kb20oKSAqIDE4MDtcclxuICAgICAgICAvL+WPkemAgeiHquWumuS5ieS6i+S7tlxyXG4gICAgICAgIC8vIHRoaXMuc3AuZXZlbnQoSW50ZXJhY3Rpb25fQ3VzdG9tRXZlbnQuUk9UQVRFLCBbcmFuZG9tQW5nbGVdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDop6blj5Hoh6rlrprkuYnnmoRyb3RhdGXkuovku7ZcclxuICAgIHByaXZhdGUgb25Sb3RhdGUobmV3QW5nbGU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLnNwLCB7IFwicm90YXRpb25cIjogbmV3QW5nbGUgfSwgMTAwMCxMYXlhLkVhc2UuZWxhc3RpY091dCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovIFxyXG5cclxuICAgIHByaXZhdGUgUmVmcmVzaENoYXJhY3Rlck1vZGVsKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBhZ2VuY3l1c2VybWVzc2FnZTpBZ2VuY3lVc2VyTWVzc2FnZSA9IFBhbmVsUmVzRGljLkluc3RhbmNlLmdldFNpbmdsZVRvbiggQWdlbmN5VXNlck1lc3NhZ2UgKTtcclxuICAgICAgICB2YXIgUm9sZURhdGE6Um9sZURhdGEgPSBhZ2VuY3l1c2VybWVzc2FnZS5Sb2xlRGF0YTtcclxuICAgICAgICB2YXIgcGF0aEFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgcGF0aEFyci5wdXNoKCB7dXJsOkFzc2V0UGF0aC5nZXQzRFJvbGVNb2RlbCggUm9sZURhdGEucm9sZUNmZy5uYW1lICkgfSApO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5sb2FkZXIzREFyciggcGF0aEFycix0aGlzLHRoaXMuQ2hhcmFjdGVyTG9hZEVuZCxudWxsLHRydWUsQXNzZXRQYXRoLmdldDNETW9kZWwoIFJvbGVEYXRhLnJvbGVDZmcubmFtZSApICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKuabtOaWsOWcsOW9oiAqL1xyXG4gICAgcHVibGljIFJlZnJlc2hUZXJyYWluKCAgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdmFyIGFnZW5jeXVzZXJtZXNzYWdlOkFnZW5jeVVzZXJNZXNzYWdlID0gUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApO1xyXG4gICAgICAgIHZhciBSb2xlRGF0YTpSb2xlRGF0YSA9IGFnZW5jeXVzZXJtZXNzYWdlLlJvbGVEYXRhO1xyXG4gICAgICAgIHZhciBub3dsZXZlbGNmZzpMZXZlbENGRyA9IFJvbGVEYXRhLmxldmVsY2ZnO1xyXG4gICAgICAgIHZhciBtYXBBcnI6QXJyYXk8c3RyaW5nPiA9IFJvbGVEYXRhLmxldmVsbWFwQXJyO1xyXG4gICAgICAgIHZhciBtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBtYXBuYW1lOnN0cmluZztcclxuICAgICAgICB2YXIgX2xhc3RtYXBTcHJpdGUzRDpMYXlhLlNwcml0ZTNEO1xyXG5cclxuICAgICAgICBmb3IoIHZhciBzIGluIFByb3BNYW5hZ2VyLm5vd21hcERpY3QgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgKFByb3BNYW5hZ2VyLm5vd21hcERpY3Rbc10gYXMgTGF5YS5NZXNoU3ByaXRlM0QpLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yKCB2YXIgaTpudW1iZXIgPSAwO2kgPCBtYXBBcnIubGVuZ3RoO2krKyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBtYXBuYW1lID0gbWFwQXJyW2ldO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIm1hcG5hbWUxLS0tLVwiLG1hcG5hbWUpO1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIubm93bWFwRGljdFsgbWFwbmFtZSBdIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QgPSBQcm9wTWFuYWdlci5ub3dtYXBEaWN0WyBtYXBuYW1lIF07XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRC5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJtYXBuYW1lMi0tLS1cIixtYXBuYW1lKTtcclxuICAgICAgICAgICAgICAgIHZhciBzcDpMYXlhLlNwcml0ZTNEID0gTGF5YS5Mb2FkZXIuZ2V0UmVzKEFzc2V0UGF0aC5nZXQzRE1vZGVsKG1hcG5hbWUpKSBhcyBMYXlhLlNwcml0ZTNEO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJtYXBuYW1lMy0tLS1cIixtYXBuYW1lKTtcclxuICAgICAgICAgICAgICAgIG1hcFNwcml0ZTNEID0gTGF5YS5TcHJpdGUzRC5pbnN0YW50aWF0ZShzcCwgUHJvcE1hbmFnZXIuc2NlbmUzRCwgZmFsc2UsbnVsbCkgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTQtLS0tXCIsbWFwbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5ub3dtYXBEaWN0WyBtYXBuYW1lIF0gPSBtYXBTcHJpdGUzRDtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwibWFwbmFtZTUtLS0tXCIsbWFwbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIGkgPT0gMCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBhcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0Fyciggbm93bGV2ZWxjZmcuZmlyc3RTY2VuZXBvcyApO1xyXG4gICAgICAgICAgICAgICAgbWFwU3ByaXRlM0QudHJhbnNmb3JtLnBvc2l0aW9uID0gbmV3IExheWEuVmVjdG9yMyggTnVtYmVyKCBhcnJbMF0pLE51bWJlciggYXJyWzFdKSxOdW1iZXIoIGFyclsyXSApICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZW5kUG9zOkxheWEuVmVjdG9yMyA9IChfbGFzdG1hcFNwcml0ZTNELmdldENoaWxkQnlOYW1lKCBcIkVORFwiICkgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLnBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICBlbmRQb3MueCA9IDA7XHJcbiAgICAgICAgICAgICAgICBlbmRQb3MueSA9IDA7XHJcbiAgICAgICAgICAgICAgICBtYXBTcHJpdGUzRC50cmFuc2Zvcm0ucG9zaXRpb24gPSBlbmRQb3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5QYXR0ZXJuKCBtYXBTcHJpdGUzRCApO1xyXG4gICAgICAgICAgICBfbGFzdG1hcFNwcml0ZTNEID0gbWFwU3ByaXRlM0Q7XHJcbiAgICAgICAgICAgIHZhciBlbmRQb3MxOkxheWEuVmVjdG9yMyA9IChtYXBTcHJpdGUzRC5nZXRDaGlsZEJ5TmFtZSggXCJFTkRcIiApIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5wb3NpdGlvbi5jbG9uZSgpO1xyXG4gICAgICAgICAgICBlbmRQb3MxLnogKz0gTnVtYmVyKEdhbWVDRkcuZGljdFs2XS52YWx1ZSk7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLmVuZFBsYW5lLnRyYW5zZm9ybS5wb3NpdGlvbiA9IGVuZFBvczE7XHJcbiAgICAgICAgICAgIFByb3BNYW5hZ2VyLmdhbWV3aW5Qb3NaID0gZW5kUG9zMS56O1xyXG4gICAgICAgICAgICBQcm9wTWFuYWdlci5nYW1ld2luUG9zWiAtPSAyO1xyXG4gICAgICAgICAgICAvLyBQcm9wTWFuYWdlci5iZ3Nwcml0ZTNkLnRyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIDAsLTIwLC00MCApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgIFxyXG5cclxuXHJcbn0iLCJpbXBvcnQge0dhbWVQb29sfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9HYW1lUG9vbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEV2ZW50RGF0YVxyXG57XHJcbiAgICBzdGF0aWMgUmVzRGljVmFsdWU6c3RyaW5nID0gXCJDb21wb25lbnRFdmVudERhdGFcIjtcclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIGxvZ2dlcjogVGV4dDtcclxuICAgIHByaXZhdGUga2V5RG93bkxpc3Q6IEFycmF5PGJvb2xlYW4+O1xyXG5cclxuXHJcbiAgICB0YXJnZXQ6YW55O1xyXG4gICAgdHlwZTpzdHJpbmc7XHJcbiAgICB0aGlzT2JqZWN0OmFueTtcclxuICAgIGxpc3RlbmVyOkZ1bmN0aW9uO1xyXG5cclxuICAgIHByaXZhdGUgbGlzdGVuS2V5Ym9hcmQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5rZXlEb3duTGlzdCA9IFtdO1xyXG5cclxuICAgICAgICAvL+a3u+WKoOmUruebmOaMieS4i+S6i+S7tizkuIDnm7TmjInnnYDmn5DmjInplK7liJnkvJrkuI3mlq3op6blj5FcclxuICAgICAgICBMYXlhLnN0YWdlLm9uKExheWEuRXZlbnQuS0VZX0RPV04sIHRoaXMsIHRoaXMub25LZXlEb3duKTtcclxuICAgICAgICAvL+a3u+WKoOmUruebmOaKrOi1t+S6i+S7tlxyXG4gICAgICAgIExheWEuc3RhZ2Uub24oTGF5YS5FdmVudC5LRVlfVVAsIHRoaXMsIHRoaXMub25LZXlVcCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6ZSu55uY5oyJ5LiL5aSE55CGKi9cclxuICAgIHByaXZhdGUgb25LZXlEb3duKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGtleUNvZGU6IG51bWJlciA9IGVbXCJrZXlDb2RlXCJdO1xyXG4gICAgICAgIHRoaXMua2V5RG93bkxpc3Rba2V5Q29kZV0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgcHVibGljIGNsZWFyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnR5cGU9bnVsbDtcclxuICAgICAgICB0aGlzLnRoaXNPYmplY3Q9bnVsbDtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyPW51bGw7XHJcbiAgICAgICAgR2FtZVBvb2wuUmVtb3ZlSXRlbSggQ29tcG9uZW50RXZlbnREYXRhLlJlc0RpY1ZhbHVlLHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKirplK7nm5jmiqzotbflpITnkIYqL1xyXG4gICAgcHJpdmF0ZSBvbktleVVwKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMua2V5RG93bkxpc3RbZVtcImtleUNvZGVcIl1dO1xyXG4gICAgfVxyXG5cclxufSIsIlxyXG4vKlxyXG4qIG5hbWU7XHJcbiovXHJcbmV4cG9ydCBjbGFzcyBEYXRhSW5mb0Jhc2UgZXh0ZW5kcyBMYXlhLkV2ZW50RGlzcGF0Y2hlclxyXG57XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKirmt7fmt4YqKioqKioqKiogKi9cclxuICAgIHNob3dBcGUoKSB7XHJcblx0XHRjb25zdCBcclxuXHRcdFx0bW9ua2V5MVBhdGggPSBcIi4vcmVzL2FwZXMvbW9ua2V5MS5wbmdcIixcclxuXHRcdFx0bW9ua2V5MlBhdGggPSBcIi4vcmVzL2FwZXMvbW9ua2V5Mi5wbmdcIjtcclxuXHJcblx0XHQvLyDmlrnms5Ux77ya5L2/55SobG9hZEltYWdlXHJcblx0XHRsZXQgYXBlID0gbmV3IExheWEuU3ByaXRlKCk7XHJcblx0XHRMYXlhLnN0YWdlLmFkZENoaWxkKGFwZSk7XHJcblx0XHRhcGUubG9hZEltYWdlKG1vbmtleTFQYXRoKTtcclxuXHJcblx0XHQvLyDmlrnms5Uy77ya5L2/55SoZHJhd1RleHR1cmVcclxuXHRcdExheWEubG9hZGVyLmxvYWQobW9ua2V5MlBhdGgsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgZnVuY3Rpb24oKSB7XHJcblx0XHRcdGxldCBtb25rZXkyID0gTGF5YS5sb2FkZXIuZ2V0UmVzKG1vbmtleTJQYXRoKTtcclxuXHRcdFx0bGV0IGFwZTIgPSBuZXcgTGF5YS5TcHJpdGUoKTtcclxuXHRcdFx0TGF5YS5zdGFnZS5hZGRDaGlsZChhcGUyKTtcclxuXHRcdFx0YXBlMi5ncmFwaGljcy5kcmF3VGV4dHVyZShtb25rZXkyLCAxMDAsIDApO1xyXG5cdFx0fSkpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgRGF0YUluZm8oIGRhdGE6YW55ICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCBkYXRhIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGZvciggdmFyIHMgaW4gZGF0YSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtZDphbnkgPSB0aGlzW3NdO1xyXG4gICAgICAgICAgICAgICAgaWYoIGl0ZW1kICE9IG51bGwgKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzW3NdID0gZGF0YVtzXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGVsc2VcclxuICAgICAgICAgICAgICAgIC8vIHtcclxuICAgICAgICAgICAgICAgIC8vICAgICBEZWJ1Z2VyLmxvZyggXCJWTzrmnKrlrprkuYnlsZ7mgKctXCIgKyBzICk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqKioqKioqKua3t+a3hiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oc2tpbjogc3RyaW5nLG5hbWU6c3RyaW5nLGNiOkZ1bmN0aW9uLGluZGV4Om51bWJlcik6TGF5YS5CdXR0b24ge1xyXG4gICAgICAgIHZhciBidG46TGF5YS5CdXR0b24gPSBuZXcgTGF5YS5CdXR0b24oc2tpbixuYW1lKTtcclxuICAgICAgIExheWEuc3RhZ2UuYWRkQ2hpbGQoYnRuKTtcclxuICAgICAgICBidG4ub24oTGF5YS5FdmVudC5DTElDSyx0aGlzLGNiKTtcclxuICAgICAgICBidG4uc2l6ZSgxNDcsNTUpO1xyXG4gICAgICAgIGJ0bi5uYW1lID0gbmFtZTtcclxuICAgICAgICBidG4ucmlnaHQgPSAxMDtcclxuICAgICAgICBidG4udG9wID0gaW5kZXggKiAoYnRuLmhlaWdodCArIDEwKTtcclxuXHRcdHJldHVybiBidG47XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwdWJsaWMgZGlzcGF0Y2hFdmVudCh0eXBlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmV2ZW50KHR5cGUsIGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgXHJcbn0iLCJpbXBvcnQge0dhbWVQb29sfSBmcm9tIFwiLi4vUHJlZmFiQ29udHJvbC9HYW1lUG9vbFwiO1xyXG5pbXBvcnQgU3ByaXRlID0gTGF5YS5TcHJpdGU7XHJcbmltcG9ydCBFdmVudCA9IExheWEuRXZlbnQ7XHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIExvY2FsRGF0YSBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbnsgICBcclxuICAgIHN0YXRpYyBSZXNEaWNWYWx1ZTpzdHJpbmcgPSBcIkxvY2FsRGF0YVwiO1xyXG5cclxuICAgIHByaXZhdGUgbG9nZ2VyOkxheWEuVGV4dDtcclxuICAgIC8qKlxyXG4gICAgICog5byV55So5qyh5pWwXHJcbiAgICAgKi9cclxuICAgIHJlZjpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlQ29yYWxSZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBjb3JhbFJlY3Q6IFNwcml0ZSA9IG5ldyBTcHJpdGUoKTtcclxuICAgICAgICBjb3JhbFJlY3QuZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgTGF5YS5zdGFnZS53aWR0aCwgTGF5YS5zdGFnZS5oZWlnaHQgLyAyLCBcIiNGRjdGNTBcIik7XHJcblxyXG4gICAgICAgIC8v6K6+572u5ZCN56ewXHJcbiAgICAgICAgY29yYWxSZWN0Lm5hbWUgPSBcIuePiueRmuiJsuWuueWZqFwiO1xyXG4gICAgICAgIGNvcmFsUmVjdC5zaXplKExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0IC8gMik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZChjb3JhbFJlY3QpO1xyXG5cclxuICAgICAgICBjb3JhbFJlY3Qub24oRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5vbkRvd24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlRGVlcFNreWJsdWVSZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciBkZWVwU2t5Ymx1ZVJlY3Q6IFNwcml0ZSA9IG5ldyBTcHJpdGUoKTtcclxuICAgICAgICBkZWVwU2t5Ymx1ZVJlY3QuZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgMTAwLCAxMDAsIFwiIzAwQkZGRlwiKTtcclxuICAgICAgICAvL+iuvue9ruWQjeensFxyXG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5uYW1lID0gXCLlpKnok53oibLnn6nlvaJcIjtcclxuICAgICAgICAvL+iuvue9ruWuvemrmO+8iOimgeaOpeaUtum8oOagh+S6i+S7tuW/hemhu+iuvue9ruWuvemrmO+8jOWQpuWImeS4jeS8muiiq+WRveS4re+8iSAgXHJcbiAgICAgICAgZGVlcFNreWJsdWVSZWN0LnNpemUoMTAwLCAxMDApO1xyXG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5wb3MoMTAsIDEwKTtcclxuICAgICAgICBMYXlhLnN0YWdlLmFkZENoaWxkKGRlZXBTa3libHVlUmVjdCk7XHJcblxyXG4gICAgICAgIGRlZXBTa3libHVlUmVjdC5vbihFdmVudC5NT1VTRV9ET1dOLCB0aGlzLCB0aGlzLm9uRG93bik7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog5pyA5ZCO5LiA5qyh6KKr5byV55So55qE5pe26Ze0XHJcbiAgICAgKi9cclxuICAgIHRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWMheWQjVxyXG4gICAgICovXHJcbiAgICBwYWNrYWdlTmFtZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBjbGVhcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlZiA9IDA7XHJcbiAgICAgICAgdGhpcy50aW1lID0gMDtcclxuICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gXCJcIjtcclxuICAgICAgICBHYW1lUG9vbC5SZW1vdmVJdGVtKCBMb2NhbERhdGEuUmVzRGljVmFsdWUsdGhpcyApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKuS+puWQrOWkhOeQhuaWueazlSovXHJcblx0XHRwcml2YXRlIG9uRG93bihlOiBFdmVudCk6IHZvaWQge1xyXG5cdFx0XHR0aGlzLmxvZ2dlci50ZXh0ICs9IFwi54K55Ye7IC0gXCIgKyBlLnRhcmdldC5uYW1lICsgXCJcXG5cIjtcclxuXHRcdH1cclxufSIsImltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4uL3V0aWxzL0Rpc3BhdGNoZXJNYW5hZ2VyXCI7XHJcbmltcG9ydCB7VXNlckluZm9FdmVudH0gZnJvbSBcIi4uL0RhdGEvVXNlckluZm9FdmVudFwiO1xyXG5pbXBvcnQge0xvY2FsRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0xvY2FsRGF0YUNvbnRyb2xcIjtcclxuaW1wb3J0IHtVc2VyRGF0YUluZm99IGZyb20gXCIuLi9EYXRhL1VzZXJEYXRhSW5mb1wiO1xyXG5pbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vQ0ZHL1JvbGVDRkdcIjtcclxuaW1wb3J0IExldmVsQ0ZHIGZyb20gXCIuLi9DRkcvTGV2ZWxDRkdcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgeyBQbGF5ZXJBY2NvdW50LCBBY2NvdW50VXNlciB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IERhdGFJbmZvQmFzZSB9IGZyb20gXCIuL0RhdGFJbmZvQmFzZVwiO1xyXG5cclxuXHJcbmltcG9ydCBFdmVudERhdGEgPSBMYXlhLkV2ZW50RGF0YTtcclxuXHRpbXBvcnQgU2tlbGV0b24gID0gTGF5YS5Ta2VsZXRvbjtcclxuXHRpbXBvcnQgVGVtcGxldCAgID0gTGF5YS5UZW1wbGV0O1xyXG5cdGltcG9ydCBTcHJpdGUgICAgPSBMYXlhLlNwcml0ZTtcclxuXHRpbXBvcnQgRXZlbnQgICAgID0gTGF5YS5FdmVudDtcclxuXHRpbXBvcnQgQnJvd3NlciAgID0gTGF5YS5Ccm93c2VyO1xyXG5cdGltcG9ydCBIYW5kbGVyICAgPSBMYXlhLkhhbmRsZXI7XHJcblx0aW1wb3J0IFN0YXQgICAgICA9IExheWEuU3RhdDtcclxuXHRpbXBvcnQgVHdlZW4gICAgID0gTGF5YS5Ud2VlbjtcclxuICAgIGltcG9ydCBXZWJHTCAgICAgPSBMYXlhLldlYkdMO1xyXG4gICAgXHJcbmV4cG9ydCBjbGFzcyBSb2xlRGF0YSBleHRlbmRzIERhdGFJbmZvQmFzZSBcclxue1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlJvbGVEYXRhO1xyXG4gICAgLyoqXHJcbiAgICAgKiDph5HluIFcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfR29sZDpudW1iZXI9MDtcclxuXHJcbiAgICBwcml2YXRlIF9yb2xlaWQ6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyByb2xlQ2ZnOlJvbGVDRkc7XHJcblxyXG4gICAgcHJpdmF0ZSBfbGV2ZWlkOm51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbGV2ZWxjZmc6TGV2ZWxDRkc7XHJcbiAgICBwdWJsaWMgbGV2ZWxtYXBBcnI6QXJyYXk8c3RyaW5nPjtcclxuXHJcbiAgICBcclxuICAgIGNvbnN0cnVjdG9yKCkgXHJcbiAgICB7IFxyXG4gICAgICAgIHN1cGVyKCk7IFxyXG4gICAgICAgIFJvbGVEYXRhLmlucyA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogUm9sZURhdGEge1xyXG4gICAgICAgIGlmIChSb2xlRGF0YS5pbnMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJvbGVEYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBSb2xlRGF0YS5pbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgbGV0IGxvY2FsZGF0YWNvbnRyb2w6TG9jYWxEYXRhQ29udHJvbCA9IExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2U7XHJcbiAgICAgICAgLy8gdmFyIG5vd0dvbGQ6bnVtYmVyID0gTnVtYmVyKFBsYXllckFjY291bnQuQ3VycmVudEFjY291bnQuQ3VyQWNjb3VudERhdGEuR2V0VXNlcihBY2NvdW50VXNlci5tb25leSkpO1xyXG4gICAgICAgIC8vIHRoaXMuR29sZCA9IG5vd0dvbGQ7XHJcbiAgICAgICAgdGhpcy5Nb25leSA9IGxvY2FsZGF0YWNvbnRyb2wuZ2V0bnVtKCBVc2VyRGF0YUluZm8uZ29sZCApO1xyXG4gICAgICAgIHRoaXMuX3JvbGVpZCA9IGxvY2FsZGF0YWNvbnRyb2wuZ2V0bnVtKCBVc2VyRGF0YUluZm8ucm9sZWlkICk7XHJcbiAgICAgICAgaWYoIHRoaXMuQ2hhcmFjdGVySUQgPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkNoYXJhY3RlcklEID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5Jbml0Q2hhcmFjdGVySW5mbygpO1xyXG4gICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2xldmVpZCA9IGxvY2FsZGF0YWNvbnRyb2wuZ2V0bnVtKCBVc2VyRGF0YUluZm8ubGV2ZWxpZCApO1xyXG4gICAgICAgIGlmKCB0aGlzLl9sZXZlaWQgPT0gMCApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9sZXZlaWQgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLlJlZnJlc2hMZXZlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbm93bGV2ZWwoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGV2ZWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROb3dTZXJ2ZXJMZXZlbCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgTGV2ZWxVcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9sZXZlaWQrKztcclxuICAgICAgICBMb2NhbERhdGFDb250cm9sLkluc3RhbmNlLmFkZHN0ciggVXNlckRhdGFJbmZvLmxldmVsaWQsdGhpcy5fbGV2ZWlkLnRvU3RyaW5nKCkgKTtcclxuICAgICAgICB0aGlzLlJlZnJlc2hMZXZlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHVibGljIHN0YXJ0RnVuKCk6dm9pZFxyXG5cdFx0e1xyXG5cdFx0XHR0aGlzLm1BbmlQYXRoID0gXCJyZXMvc3BpbmUvc3BpbmVSZXM2L2FsaWVuLnNrXCI7XHJcblx0XHRcdHRoaXMubUZhY3RvcnkgPSBuZXcgVGVtcGxldCgpO1xyXG5cdFx0XHR0aGlzLm1GYWN0b3J5Lm9uKEV2ZW50LkNPTVBMRVRFLCB0aGlzLCB0aGlzLnBhcnNlQ29tcGxldGUpO1xyXG5cdFx0XHR0aGlzLm1GYWN0b3J5Lm9uKEV2ZW50LkVSUk9SLCB0aGlzLCB0aGlzLm9uRXJyb3IpO1xyXG5cdFx0XHR0aGlzLm1GYWN0b3J5LmxvYWRBbmkodGhpcy5tQW5pUGF0aCk7XHJcblx0XHR9XHJcblx0XHRwcml2YXRlIG9uRXJyb3IoKTp2b2lkXHJcblx0XHR7XHJcblx0XHRcdGNvbnNvbGUubG9nKFwiZXJyb3JcIik7XHJcblx0XHR9XHJcblx0XHRcclxuXHRcdHByaXZhdGUgcGFyc2VDb21wbGV0ZSgpOnZvaWQge1xyXG5cdFx0XHQvL+WIm+W7uuaooeW8j+S4ujHvvIzlj6/ku6XlkK/nlKjmjaLoo4VcclxuXHRcdFx0dGhpcy5tQXJtYXR1cmUgPSB0aGlzLm1GYWN0b3J5LmJ1aWxkQXJtYXR1cmUoMSk7XHJcblx0XHRcdHRoaXMubUFybWF0dXJlLnggPSB0aGlzLm1TdGFydFg7XHJcblx0XHRcdHRoaXMubUFybWF0dXJlLnkgPSB0aGlzLm1TdGFydFk7XHJcblx0XHRcdHRoaXMubUFybWF0dXJlLnNjYWxlKDAuNSwgMC41KTtcclxuXHRcdFx0TGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLm1Bcm1hdHVyZSk7XHJcblx0XHRcdHRoaXMubUFybWF0dXJlLm9uKEV2ZW50LkxBQkVMLCB0aGlzLCB0aGlzLm9uRXZlbnQpO1xyXG5cdFx0XHR0aGlzLnBsYXkoKTtcclxuICAgICAgICB9XHJcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHByaXZhdGUgUmVmcmVzaExldmVsKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBsdiA9IHRoaXMuX2xldmVpZDtcclxuICAgICAgICB2YXIgbm93Y2ZnbHY6bnVtYmVyID0gMDtcclxuICAgICAgICB2YXIgYWxsbnVtczpudW1iZXIgPSBMZXZlbENGRy52ZWMubGVuZ3RoO1xyXG4gICAgICAgIGlmKCBsdiA+IGFsbG51bXMgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlOm51bWJlciA9IChsdi1hbGxudW1zKSUoIGFsbG51bXMtMiApO1xyXG4gICAgICAgICAgICBpZiggIHZhbHVlID09IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBub3djZmdsdiA9IGFsbG51bXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBub3djZmdsdiA9IHZhbHVlICsgMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBub3djZmdsdiA9IGx2O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxldmVsY2ZnID0gTGV2ZWxDRkcuZGljdFsgbm93Y2ZnbHYgXTtcclxuICAgICAgICB0aGlzLmxldmVsbWFwQXJyID0gR2FtZVV0aWxzLmN1dHN0cnRvQXJyKHRoaXMubGV2ZWxjZmcucm9hZCk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggVXNlckluZm9FdmVudC51c2VyaW5mb0V2ZW50X2xldmVsaWQgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICAgICAgcHJpdmF0ZSBtQW5pUGF0aDpzdHJpbmc7XHJcblx0XHRwcml2YXRlIG1TdGFydFg6bnVtYmVyID0gNDAwO1xyXG5cdFx0cHJpdmF0ZSBtU3RhcnRZOm51bWJlciA9IDUwMDtcclxuXHRcdHByaXZhdGUgbUZhY3Rvcnk6VGVtcGxldDtcclxuXHRcdHByaXZhdGUgbUFjdGlvbkluZGV4Om51bWJlciA9IDA7XHJcblx0XHRwcml2YXRlIG1DdXJySW5kZXg6bnVtYmVyID0gMDtcclxuXHRcdHByaXZhdGUgbUFybWF0dXJlOlNrZWxldG9uO1xyXG5cdFx0cHJpdmF0ZSBtQ3VyclNraW5JbmRleDpudW1iZXIgPSAwO1xyXG5cdFx0cHJpdmF0ZSBtRmFjdG9yeTI6VGVtcGxldDtcclxuXHRcdHByaXZhdGUgbUxhYmVsU3ByaXRlOlNwcml0ZTtcclxuXHJcbiAgICBwcml2YXRlIHBsYXkoKTp2b2lkXHJcblx0XHR7XHJcblx0XHRcdHRoaXMubUN1cnJJbmRleCsrO1xyXG5cdFx0XHRpZiAodGhpcy5tQ3VyckluZGV4ID49IHRoaXMubUFybWF0dXJlLmdldEFuaW1OdW0oKSlcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHRoaXMubUN1cnJJbmRleCA9IDA7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5tQXJtYXR1cmUucGxheSh0aGlzLm1DdXJySW5kZXgsZmFsc2UpO1xyXG5cdFx0XHRcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0cHJpdmF0ZSBvbkV2ZW50KGUpOnZvaWRcclxuXHRcdHtcclxuXHRcdFx0TGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLm1MYWJlbFNwcml0ZSk7XHJcblx0XHRcdHRoaXMubUxhYmVsU3ByaXRlLnggPSB0aGlzLm1TdGFydFg7XHJcblx0XHRcdHRoaXMubUxhYmVsU3ByaXRlLnkgPSB0aGlzLm1TdGFydFk7XHJcblx0XHRcdHRoaXMubUxhYmVsU3ByaXRlLmdyYXBoaWNzLmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuXHJcbiAgICBtb3Zlc3BlZWQ6bnVtYmVyID0gMDtcclxuICAgIGZyb250anVtcDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgbGVmdGp1bXA6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHJpZ2h0anVtcDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgdXBjbGltYjpudW1iZXIgPSAwO1xyXG4gICAgc2xpZGVjbGltYjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBJbml0Q2hhcmFjdGVySW5mbygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJvbGVDZmcgPSBSb2xlQ0ZHLmRpY3RbIHRoaXMuX3JvbGVpZCBdO1xyXG4gICAgICAgIHRoaXMubW92ZXNwZWVkID0gdGhpcy5yb2xlQ2ZnLnNwZWVkO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuZnJvbnRqdW1wID0gdGhpcy5yb2xlQ2ZnLmZyb250anVtcDtcclxuICAgICAgICB0aGlzLmxlZnRqdW1wID0gdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wO1xyXG4gICAgICAgIHRoaXMucmlnaHRqdW1wID0gdGhpcy5yb2xlQ2ZnLnJpZ2h0anVtcDtcclxuICAgICAgICB0aGlzLnVwY2xpbWIgPSBOdW1iZXIoIHRoaXMucm9sZUNmZy51cGNsaW1iICk7XHJcbiAgICAgICAgdGhpcy5zbGlkZWNsaW1iID0gdGhpcy5yb2xlQ2ZnLnNsaWRlY2xpbWI7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueCApO1xyXG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueSApO1xyXG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnogPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5mcm9udGp1bXAueiApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueCA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLmxlZnRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLmxlZnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5sZWZ0anVtcC55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5sZWZ0anVtcC56ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcubGVmdGp1bXAueiApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnggPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5yaWdodGp1bXAueCApO1xyXG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnkgPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5yaWdodGp1bXAueSApO1xyXG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnogPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5yaWdodGp1bXAueiApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnNsaWRlY2xpbWIueCA9IE51bWJlciggdGhpcy5yb2xlQ2ZnLnNsaWRlY2xpbWIueCApO1xyXG4gICAgICAgIC8vIHRoaXMuc2xpZGVjbGltYi55ID0gTnVtYmVyKCB0aGlzLnJvbGVDZmcuc2xpZGVjbGltYi55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5zbGlkZWNsaW1iLnogPSBOdW1iZXIoIHRoaXMucm9sZUNmZy5zbGlkZWNsaW1iLnogKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc2V0IGxldmVpZCggdmFsdWU6bnVtYmVyIClcclxuICAgIC8vIHtcclxuICAgIC8vICAgICBpZiggdGhpcy5fbGV2ZWlkICE9IHZhbHVlIClcclxuICAgIC8vICAgICB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuX2xldmVpZCA9IHZhbHVlO1xyXG4gICAgLy8gICAgICAgICB0aGlzLmxldmVsY2ZnID0gTGV2ZWxDRkcuZGljdFsgdGhpcy5fbGV2ZWlkIF07XHJcbiAgICAvLyAgICAgICAgIHRoaXMubGV2ZWxtYXBBcnIgPSBHYW1lVXRpbHMuY3V0c3RydG9BcnIodGhpcy5sZXZlbGNmZy5yb2FkKTtcclxuICAgIC8vICAgICAgICAgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkc3RyKCBVc2VyRGF0YUluZm8ubGV2ZWxpZCx0aGlzLl9sZXZlaWQudG9TdHJpbmcoKSApO1xyXG4gICAgLy8gICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBVc2VySW5mb0V2ZW50LnVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkICk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgTGV2ZWxJRCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBDaGFyYWN0ZXJJRCggdmFsdWU6bnVtYmVyIClcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fcm9sZWlkICE9IHZhbHVlIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JvbGVpZCA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLkluaXRDaGFyYWN0ZXJJbmZvKCk7XHJcbiAgICAgICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8ucm9sZWlkLHRoaXMuX3JvbGVpZC50b1N0cmluZygpICk7XHJcbiAgICAgICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIFVzZXJJbmZvRXZlbnQudXNlcmluZm9FdmVudF91cGRhdGVyb2xlaWQgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBDaGFyYWN0ZXJJRCgpOm51bWJlclxyXG4gICAge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yb2xlaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBNb25leSggdmFsdWU6bnVtYmVyIClcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fR29sZCAhPSB2YWx1ZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLl9Hb2xkID0gdmFsdWU7XHJcbiAgICAgICAgICAgIExvY2FsRGF0YUNvbnRyb2wuSW5zdGFuY2UuYWRkc3RyKCBVc2VyRGF0YUluZm8uZ29sZCx0aGlzLl9Hb2xkLnRvU3RyaW5nKCkgKTtcclxuICAgICAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggVXNlckluZm9FdmVudC5Vc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgTW9uZXkoKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fR29sZDtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgUm9sZUNGRyBmcm9tIFwiLi4vQ0ZHL1JvbGVDRkdcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTa2luRGF0YVxyXG57XHJcbiAgICByb2xlQ0ZHOlJvbGVDRkc7XHJcbiAgICAvKipcclxuICAgICAqIDA65pyq5oul5pyJ77yMMe+8muW3sue7j+aLpeaciVxyXG4gICAgICovXHJcbiAgICBzdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIGhhc251bTpudW1iZXIgPSAwO1xyXG4gICAgXHJcblxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVUZXh0KCk6IHZvaWQge1xyXG4gICAgICAgIHZhciB0eHQ6TGF5YS5UZXh0ID0gbmV3IExheWEuVGV4dCgpO1xyXG5cclxuICAgICAgICB0eHQudGV4dCA9IFwiTGF5YWJveOaYr0hUTUw15byV5pOO5oqA5pyv5o+Q5L6b5ZWG5LiO5LyY56eA55qE5ri45oiP5Y+R6KGM5ZWG77yM6Z2i5ZCRQVMvSlMvVFPlvIDlj5HogIXmj5DkvptIVE1MNeW8gOWPkeaKgOacr+aWueahiO+8gVwiO1xyXG5cclxuICAgICAgICB0eHQud2lkdGggPSAzMDA7XHJcblxyXG4gICAgICAgIHR4dC5mb250U2l6ZSA9IDQwO1xyXG4gICAgICAgIHR4dC5jb2xvciA9IFwiI2ZmZmZmZlwiO1xyXG5cclxuICAgICAgICAvL+iuvue9ruaWh+acrOS4uuWkmuihjOaWh+acrFxyXG4gICAgICAgIHR4dC53b3JkV3JhcCA9IHRydWU7XHJcblxyXG4gICAgICAgIHR4dC54ID0gTGF5YS5zdGFnZS53aWR0aCAtIHR4dC50ZXh0V2lkdGggPj4gMTtcclxuICAgICAgICB0eHQueSA9IExheWEuc3RhZ2UuaGVpZ2h0IC0gdHh0LnRleHRIZWlnaHQgPj4gMTtcclxuXHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0eHQpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuXHJcbiAgICBcclxufSIsImltcG9ydCBFdmVudCA9IExheWEuRXZlbnQ7XHJcbmV4cG9ydCBjbGFzcyBVc2VyRGF0YUluZm9cclxueyAgIFxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOiusOW9leS4iuasoeemu+W8gOaXtumXtFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbGFzdHRpbWU6c3RyaW5nID0gXCJsYXN0dGltZVwiO1xyXG5cclxuICAgIFxyXG4gICAgc3RhdGljIGNhcGxhc3RmbHVzaHRpbWU6c3RyaW5nID0gXCJjYXB0aW1lXCI7XHJcbiAgICBzdGF0aWMgY2Fwc3RvcmFnZWFwcGlkczpzdHJpbmcgPSBcImNhcGFwcGlkc1wiO1xyXG4gICAgc3RhdGljIGhhc2dldGFwcGlkczpzdHJpbmcgPSBcImhhc2dldGFwcGlkc1wiO1xyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbiAgICBwcml2YXRlIG9uQ2FsbExhdGVyKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwib25DYWxsTGF0ZXIgdHJpZ2dlcmVkXCIpO1xyXG5cclxuICAgICAgICB2YXIgdGV4dDpMYXlhLlRleHQgPSBuZXcgTGF5YS5UZXh0KCk7XHJcbiAgICAgICAgdGV4dC5mb250ID0gXCJTaW1IZWlcIjtcclxuICAgICAgICB0ZXh0LmZvbnRTaXplID0gMzA7XHJcbiAgICAgICAgdGV4dC5jb2xvciA9IFwiI0ZGRkZGRlwiO1xyXG4gICAgICAgIHRleHQudGV4dCA9IFwi5omT5byA5o6n5Yi25Y+w5Y+v6KeB6K+l5Ye95pWw5LuF6Kem5Y+R5LqG5LiA5qyhXCI7XHJcbiAgICAgICAgdGV4dC5zaXplKExheWEuc3RhZ2Uud2lkdGgsIExheWEuc3RhZ2UuaGVpZ2h0KTtcclxuICAgICAgICB0ZXh0LndvcmRXcmFwID0gdHJ1ZTtcclxuICAgICAgICB0ZXh0LnZhbGlnbiA9IFwibWlkZGxlXCI7XHJcbiAgICAgICAgdGV4dC5hbGlnbiA9IFwiY2VudGVyXCI7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0ZXh0KTtcclxuICAgIH1cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6KeS6Imy5L+h5oGvXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByb2xlRGF0YTpzdHJpbmcgPSBcInJvbGVEYXRhXCI7XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIHN0YXRpYyBnb2xkOnN0cmluZyA9IFwiZ29sZFwiO1xyXG4gICAgc3RhdGljIHJvbGVpZDpzdHJpbmcgPSBcInJvbGVpZFwiO1xyXG4gICAgc3RhdGljIGxldmVsaWQ6c3RyaW5nID0gXCJsZXZlbGlkXCI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDnmq7ogqRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNraW46c3RyaW5nID0gXCJza2luXCI7XHJcblxyXG4gICAgc3RhdGljIGxhc3REYXk6c3RyaW5nID0gXCJsYXN0RGF5XCI7XHJcblxyXG4gICAgc3RhdGljIG5vd2RheVNoYXJlOnN0cmluZyA9IFwiZGF5c2hhcmVcIjtcclxuXHJcbiAgICBzdGF0aWMgbm93ZGF5VmlkZW86c3RyaW5nID0gXCJkYXl2aWRlb1wiO1xyXG5cclxuICAgIFxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSBidXR0b24xOkxheWEuU3ByaXRlO1xyXG4gICAgcHJpdmF0ZSBidXR0b24yOkxheWEuU3ByaXRlO1xyXG4gICAgcHJpdmF0ZSBvbkRlY3JlYXNlQWxwaGExKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgLy/np7vpmaTpvKDmoIfljZXlh7vkuovku7ZcclxuICAgICAgICB0aGlzLmJ1dHRvbjEub2ZmKEV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9uRGVjcmVhc2VBbHBoYTEpO1xyXG4gICAgICAgIC8v5a6a5pe25omn6KGM5LiA5qyhKOmXtOmalOaXtumXtClcclxuICAgICAgICBMYXlhLnRpbWVyLm9uY2UoMzAwMCwgdGhpcywgdGhpcy5vbkNvbXBsZXRlMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkRlY3JlYXNlQWxwaGEyKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgLy/np7vpmaTpvKDmoIfljZXlh7vkuovku7ZcclxuICAgICAgICB0aGlzLmJ1dHRvbjIub2ZmKEV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLm9uRGVjcmVhc2VBbHBoYTIpO1xyXG4gICAgICAgIC8v5a6a5pe25omn6KGM5LiA5qyhKOWfuuS6juW4p+eOhylcclxuICAgICAgICBMYXlhLnRpbWVyLmZyYW1lT25jZSg2MCwgdGhpcywgdGhpcy5vbkNvbXBsZXRlMik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNvbXBsZXRlMSgpOiB2b2lkIHtcclxuICAgICAgICAvL3NwQnRuMeeahOmAj+aYjuW6puWHj+WwkTAuNVxyXG4gICAgICAgIHRoaXMuYnV0dG9uMS5hbHBoYSAtPSAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNvbXBsZXRlMigpOiB2b2lkIHtcclxuICAgICAgICAvL3NwQnRuMueahOmAj+aYjuW6puWHj+WwkTAuNVxyXG4gICAgICAgIHRoaXMuYnV0dG9uMi5hbHBoYSAtPSAwLjU7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgVXNlckluZm9FdmVudCBcclxue1xyXG4gICAgc3RhdGljIFVzZXJJbmZvRXZlbnRfdXBkYXRlVXNlckRhdGE6c3RyaW5nID0gXCJVc2VySW5mb0V2ZW50X3VwZGF0ZVVzZXJEYXRhXCI7XHJcblxyXG4gICAgc3RhdGljIHVzZXJpbmZvRXZlbnRfdXBkYXRlcm9sZWlkOnN0cmluZyA9IFwidXNlcmluZm9FdmVudF91cGRhdGVyb2xlaWRcIjtcclxuXHJcbiAgICBzdGF0aWMgdXNlcmluZm9FdmVudF9sZXZlbGlkOnN0cmluZyA9IFwidXNlcmluZm9FdmVudF9sZXZlbGlkXCI7XHJcblxyXG4gICAgc3RhdGljIHVwZGF0ZVBsYXllckluZm86c3RyaW5nID0gXCJVc2VySW5mb0V2ZW50X3VwZGF0ZVBsYXllckluZm9cIjtcclxufSIsImltcG9ydCB7IEdsb2JhbCB9IGZyb20gXCIuL0dsb2JhbFwiO1xyXG5pbXBvcnQge1BhbmVsUmVzRGljfSBmcm9tIFwiLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7IERpc3BhdGNoZXJNYW5hZ2VyIH0gZnJvbSBcIi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuXHJcbmltcG9ydCB7Q29tcG9uZW50RXZlbnREYXRhfSBmcm9tIFwiLi9EYXRhL0NvbXBvbmVudEV2ZW50RGF0YVwiO1xyXG5pbXBvcnQge1JlY0NvbmZpZ3N9IGZyb20gXCIuL0NvbmZpZy9SZWNDb25maWdzXCI7XHJcbmltcG9ydCB7IFRpbWVzVGFtcGVyIH0gZnJvbSBcIi4vVGltZS9UaW1lc1RhbXBlclwiO1xyXG5pbXBvcnQgeyBBc3NldFBhdGggfSBmcm9tIFwiLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tIFwiLi9UaW1lL1RpbWVyU2VydmljZVwiO1xyXG5pbXBvcnQge0dsb2JhbFdhaXRpbmd9IGZyb20gXCIuL0dsb2JhbFdhaXRpbmdcIjtcclxuaW1wb3J0IHtQYW5lbEJhc2VDb250cm9sfSBmcm9tIFwiLi9Db250cm9sL1BhbmVsQmFzZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtHYW1lUG9vbH0gZnJvbSBcIi4vUHJlZmFiQ29udHJvbC9HYW1lUG9vbFwiO1xyXG5pbXBvcnQgeyBMYXlvdXRDb250cm9sIH0gZnJvbSBcIi4vQ29udHJvbC9MYXlvdXRDb250cm9sXCI7XHJcbmltcG9ydCB7IFZpZXdNYW5hZ2VyIH0gZnJvbSBcIi4vVmlldy9WaWV3TWFuYWdlclwiO1xyXG5pbXBvcnQge1Jlc291cmNlQ29udHJvbH0gZnJvbSBcIi4vQ29udHJvbC9SZXNvdXJjZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtSZXNEYXRhQ29udHJvbH0gZnJvbSBcIi4vQ29udHJvbC9SZXNEYXRhQ29udHJvbFwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udHJvbH0gZnJvbSBcIi4vQ29udHJvbC9BdWRpb0NvbnRyb2xcIjtcclxuaW1wb3J0IHsgQ29ubmVjdENvbnRyb2wgfSBmcm9tIFwiLi9Db250cm9sL0Nvbm5lY3RDb250cm9sXCI7XHJcbmltcG9ydCB7cGluZ3RhaXV0aWxzfSBmcm9tIFwiLi9XWFNESy9waW5ndGFpdXRpbHNcIjtcclxuaW1wb3J0IHtBZ2VuY3lMb2dpbn0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeUxvZ2luXCI7XHJcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lVc2VyTWVzc2FnZVwiO1xyXG5pbXBvcnQge0FnZW5jeU1haW59IGZyb20gXCIuL0FnZW5jeS9BZ2VuY3lNYWluXCI7XHJcbmltcG9ydCB7QWdlbmN5SW5HYW1lfSBmcm9tIFwiLi9BZ2VuY3kvQWdlbmN5SW5HYW1lXCI7XHJcbmltcG9ydCB7QWdlbmN5U2tpbn0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeVNraW5cIjtcclxuaW1wb3J0IHtBZ2VuY3lUcmlhbH0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeVRyaWFsXCI7XHJcbmltcG9ydCB7QWdlbmN5TG90dGVyeX0gZnJvbSBcIi4vQWdlbmN5L0FnZW5jeUxvdHRlcnlcIjtcclxuXHJcbi8qXHJcbiogbmFtZTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIEdhbWVDb250ZW50cyBleHRlbmRzIExheWEuRXZlbnREaXNwYXRjaGVyXHJcbntcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5ri45oiPXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0R2FtZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICBSZWNDb25maWdzLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5pbml0KCk7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBMYXlvdXRDb250cm9sLkluc3RhbmNlLmluaXRsYXllcigpO1xyXG4gICAgICAgIFZpZXdNYW5hZ2VyLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBSZXNvdXJjZUNvbnRyb2wuSW5zdGFuY2UuaW5pdCgpO1xyXG4gICAgICAgIFJlc0RhdGFDb250cm9sLkluc3RhbmNlLmluaXQoKTtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UuaW5pdCgpO1xyXG4gICAgICAgIENvbm5lY3RDb250cm9sLkNvbm5uZWN0KCk7XHJcbiAgICAgICAgVGltZXNUYW1wZXIuSW5zdGFuY2UuaW5pdCgpO1xyXG4gICAgICAgIHBpbmd0YWl1dGlscy5JbnN0YW5jZS5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5pbml0UG9vbE9iamVjdCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFByb3h5KCk7XHJcbiAgICAgICAgdGhpcy5pbml0bWFwVmlldygpO1xyXG4gICAgICAgIHRoaXMuYmVnaW5Mb2FkSGFuZGxlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5a+56LGh5rGgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdFBvb2xPYmplY3QoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgR2FtZVBvb2wuTWFyayggQ29tcG9uZW50RXZlbnREYXRhLlJlc0RpY1ZhbHVlLENvbXBvbmVudEV2ZW50RGF0YSApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yid5aeL5YyW5qih5Z2X5Luj55CG57G7XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaW5pdFByb3h5KCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHZhciBtdmNwb29sOlBhbmVsUmVzRGljID0gUGFuZWxSZXNEaWMuSW5zdGFuY2U7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeUxvZ2luICk7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeVVzZXJNZXNzYWdlICk7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeU1haW4gKTtcclxuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZCggQWdlbmN5SW5HYW1lICk7XHJcbiAgICAgICAgbXZjcG9vbC5BZ2VuY3lBZGQoIEFnZW5jeVNraW4gKTtcclxuICAgICAgICBtdmNwb29sLkFnZW5jeUFkZChBZ2VuY3lUcmlhbCApO1xyXG4gICAgICAgIG12Y3Bvb2wuQWdlbmN5QWRkKCBBZ2VuY3lMb3R0ZXJ5ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0bWFwVmlldygpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgbXZjcG9vbDpQYW5lbFJlc0RpYyA9IFBhbmVsUmVzRGljLkluc3RhbmNlO1xyXG4gICAgICAgIC8vIG12Y3Bvb2wubWFwVmlldyggTWFwVmlld1R5cGUuRGFpbHlyZXdhcmRWaWV3LERhaWx5cmV3YXJkVmlldyApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYmVnaW5Mb2FkSGFuZGxlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgcGF0aGFycjpBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgcGF0aGFyci5wdXNoKCB7IHVybDpBc3NldFBhdGguZ2V0UmVzQ29uZmlnKCksIHR5cGU6IExheWEuTG9hZGVyLkpTT04gfSApO1xyXG4gICAgICAgIHBhdGhhcnIucHVzaCggeyB1cmw6QXNzZXRQYXRoLmdldEdhbWVWZXJzaW9uKCksIHR5cGU6IExheWEuTG9hZGVyLkpTT04gfSApO1xyXG4gICAgICAgIFJlc291cmNlQ29udHJvbC5JbnN0YW5jZS5Mb2FkZXJzKCBwYXRoYXJyLHRoaXMsdGhpcy5yZWNsb2FkQ29tcGxldGUgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlY2xvYWRDb21wbGV0ZSgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgZ2FtZXZlcnNpb246YW55ID0gUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuR2FpblJlc291cmNlcyggQXNzZXRQYXRoLmdldEdhbWVWZXJzaW9uKCksZmFsc2UgKTtcclxuICAgICAgICBpZiggZ2FtZXZlcnNpb24gKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmdhbWVWZXJzaW9uID0gZ2FtZXZlcnNpb24udmVyc2lvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgR2xvYmFsLmdhbWVWZXJzaW9uID0gXCIxLjAuMFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29uZmlncmVzOmFueSA9IFJlc0RhdGFDb250cm9sLkluc3RhbmNlLkdhaW5SZXNvdXJjZXMoIEFzc2V0UGF0aC5nZXRSZXNDb25maWcoKSxmYWxzZSApO1xyXG4gICAgICAgIFJlY0NvbmZpZ3MuSW5zdGFuY2UuaW5pdFJlYyggY29uZmlncmVzICk7XHJcbiAgICAgICAgUmVzb3VyY2VDb250cm9sLkluc3RhbmNlLmxvYWRHcm91cChcImxvYWRpbmdcIix0aGlzLHRoaXMub25QcmVMb2FkZWQsdGhpcy5vblByZXByb2dyZXNzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblByZXByb2dyZXNzKHZhbHVlOm51bWJlcik6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25QcmVMb2FkZWQoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgUmVzRGF0YUNvbnRyb2wuSW5zdGFuY2UuQWRkVmlld1BhY2tCeU5hbWUoIFwibG9hZGluZ1wiLHRydWUsZmFsc2UgKTtcclxuICAgICAgICB2YXIgZ2xvYmFsd2FpdHVybDpzdHJpbmcgPSBmYWlyeWd1aS5VSVBhY2thZ2UuZ2V0SXRlbVVSTChcImxvYWRpbmdcIixcImdsb2JhbFdhaXRpbmdcIik7XHJcbiAgICAgICAgUGFuZWxCYXNlQ29udHJvbC52aWV3YmdVcmwgPSBmYWlyeWd1aS5VSVBhY2thZ2UuZ2V0SXRlbVVSTChcImxvYWRpbmdcIixcImltZ19ibGFja1wiKTtcclxuICAgICAgICBmYWlyeWd1aS5VSU9iamVjdEZhY3Rvcnkuc2V0UGFja2FnZUl0ZW1FeHRlbnNpb24oZ2xvYmFsd2FpdHVybCwgR2xvYmFsV2FpdGluZyk7XHJcbiAgICAgICAgZmFpcnlndWkuVUlDb25maWcuZ2xvYmFsTW9kYWxXYWl0aW5nID0gZ2xvYmFsd2FpdHVybDtcclxuICAgICAgICBmYWlyeWd1aS5VSUNvbmZpZy53aW5kb3dNb2RhbFdhaXRpbmcgPSBnbG9iYWx3YWl0dXJsO1xyXG4gICAgICAgIC8vIENQQVV0aWxzLmluaXQoKTtcclxuICAgICAgICB0aGlzLkxvZ2luKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIExvZ2luKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIChQYW5lbFJlc0RpYy5JbnN0YW5jZS5nZXRTaW5nbGVUb24oIEFnZW5jeUxvZ2luICkgYXMgQWdlbmN5TG9naW4pLkxvZ2luKCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge1NjZW5lQ29udHJvbH0gZnJvbSBcIi4uL0NvbnRyb2wvU2NlbmVDb250cm9sXCI7XHJcbmltcG9ydCB7IEFzc2V0UGF0aCB9IGZyb20gXCIuLi9Db25maWcvQXNzZXRQYXRoXCI7XHJcbmltcG9ydCB7UmVzRGF0YUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL1Jlc0RhdGFDb250cm9sXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEdhbWVVdGlscyB9IGZyb20gXCIuLi91dGlscy9HYW1lVXRpbHNcIjtcclxuaW1wb3J0IEdhbWVDRkcgZnJvbSBcIi4uL0NGRy9HYW1lQ0ZHXCI7XHJcblxyXG5pbXBvcnQgU3ByaXRlID0gTGF5YS5TcHJpdGU7XHJcblx0aW1wb3J0IFN0YWdlID0gTGF5YS5TdGFnZTtcclxuXHRpbXBvcnQgTWFwTGF5ZXIgPSBMYXlhLk1hcExheWVyO1xyXG5cdGltcG9ydCBUaWxlZE1hcCA9IExheWEuVGlsZWRNYXA7XHJcblx0aW1wb3J0IFBvaW50ID0gTGF5YS5Qb2ludDtcclxuXHRpbXBvcnQgUmVjdGFuZ2xlID0gTGF5YS5SZWN0YW5nbGU7XHJcblx0aW1wb3J0IEhhbmRsZXIgPSBMYXlhLkhhbmRsZXI7XHJcbiAgICBpbXBvcnQgV2ViR0wgPSBMYXlhLldlYkdMO1xyXG4gICAgXHJcblxyXG5leHBvcnQgY2xhc3MgQ2FtZXJhTWFuYWdlciBleHRlbmRzIExheWEuU2NyaXB0M0Rcclxue1xyXG4gICAgcHJvdGVjdGVkIGNhbWVyYTogTGF5YS5DYW1lcmE7XHJcbiAgICBwcml2YXRlIF90cmFuc2Zvcm06TGF5YS5UcmFuc2Zvcm0zRDtcclxuICAgIHByaXZhdGUgX2Rpc1ZlY3RvcjpMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIF90b1ZlYzpMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgaXNjYW5mb2xsb3c6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Bd2FrZSgpOnZvaWR7XHJcbiAgICAgICAgLy/ojrflj5bohJrmnKzmiYDlsZ7lr7nosaFcclxuICAgICAgICB0aGlzLmNhbWVyYSA9IHRoaXMub3duZXIgYXMgTGF5YS5DYW1lcmE7XHJcbiAgICAgICAgdGhpcy5fdG9WZWMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICAgICAgdGhpcy5jYW1lcmEuZmllbGRPZlZpZXcgPSA5MDtcclxuICAgIH1cclxuXHJcbiAgICBcclxuXHJcbiAgICBwdWJsaWMgb25TdGFydCgpOnZvaWR7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5jYW1lcmEudHJhbnNmb3JtO1xyXG4gICAgICAgIC8v5peL6L2s5pGE5YOP5py66KeS5bqmXHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnJvdGF0ZShuZXcgTGF5YS5WZWN0b3IzKCAwLCAwLCAwKSwgdHJ1ZSwgZmFsc2UpO1xyXG4gICAgICAgIC8vIHRoaXMuY2FtZXJhLmNsZWFyQ29sb3IgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgcHJpdmF0ZSB0aWxlZE1hcDogVGlsZWRNYXA7XHJcblx0XHRwcml2YXRlIGxheWVyOiBNYXBMYXllcjtcclxuXHRcdHByaXZhdGUgc3ByaXRlOiBTcHJpdGU7XHJcbiAgICBwcml2YXRlIGNyZWF0ZU1hcCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRpbGVkTWFwID0gbmV3IFRpbGVkTWFwKCk7XHJcbiAgICAgICAgdGhpcy50aWxlZE1hcC5jcmVhdGVNYXAoXCJyZXMvdGlsZWRNYXAvaXNvbWV0cmljX2dyYXNzX2FuZF93YXRlci5qc29uXCIsIG5ldyBSZWN0YW5nbGUoMCwgMCwgTGF5YS5zdGFnZS53aWR0aCwgTGF5YS5zdGFnZS5oZWlnaHQpLCBIYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm1hcExvYWRlZCksIG51bGwsIG5ldyBQb2ludCgxNjAwLCA4MDApKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU3RhZ2VDbGljaygpOiB2b2lkIHtcclxuICAgICAgICB2YXIgcDogUG9pbnQgPSBuZXcgUG9pbnQoMCwgMCk7XHJcbiAgICAgICAgdGhpcy5sYXllci5nZXRUaWxlUG9zaXRpb25CeVNjcmVlblBvcyhMYXlhLnN0YWdlLm1vdXNlWCwgTGF5YS5zdGFnZS5tb3VzZVksIHApO1xyXG4gICAgICAgIHRoaXMubGF5ZXIuZ2V0U2NyZWVuUG9zaXRpb25CeVRpbGVQb3MoTWF0aC5mbG9vcihwLngpLCBNYXRoLmZsb29yKHAueSksIHApO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLnBvcyhwLngsIHAueSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXBMb2FkZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXllciA9IHRoaXMudGlsZWRNYXAuZ2V0TGF5ZXJCeUluZGV4KDApO1xyXG5cclxuICAgICAgICB2YXIgcmFkaXVzWDogbnVtYmVyID0gMzI7XHJcbiAgICAgICAgdmFyIHJhZGl1c1k6IG51bWJlciA9IE1hdGgudGFuKDE4MCAvIE1hdGguUEkgKiAzMCkgKiByYWRpdXNYO1xyXG4gICAgICAgIHZhciBjb2xvcjogc3RyaW5nID0gXCIjRkY3RjUwXCI7XHJcblxyXG4gICAgICAgIHRoaXMuc3ByaXRlID0gbmV3IFNwcml0ZSgpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKDAsIDAsIC1yYWRpdXNYLCByYWRpdXNZLCBjb2xvcik7XHJcbiAgICAgICAgdGhpcy5zcHJpdGUuZ3JhcGhpY3MuZHJhd0xpbmUoMCwgMCwgcmFkaXVzWCwgcmFkaXVzWSwgY29sb3IpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKC1yYWRpdXNYLCByYWRpdXNZLCAwLCByYWRpdXNZICogMiwgY29sb3IpO1xyXG4gICAgICAgIHRoaXMuc3ByaXRlLmdyYXBoaWNzLmRyYXdMaW5lKHJhZGl1c1gsIHJhZGl1c1ksIDAsIHJhZGl1c1kgKiAyLCBjb2xvcik7XHJcbiAgICAgICAgTGF5YS5zdGFnZS5hZGRDaGlsZCh0aGlzLnNwcml0ZSk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICBwcml2YXRlIF91cHZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApO1xyXG4gICAgcHJpdmF0ZSBfaW5kZXg6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX3NsZXJwVmFsdWU6bnVtYmVyID0gODtcclxuICAgIHByaXZhdGUgX2xvb2thdFZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHVibGljIG9uVXBkYXRlKCk6IHZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5pc2NhbmZvbGxvdyApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuaXNjYXJtYW5wYyApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5ucGNEaWN0W1wibnBjXzBcIl0gKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIExheWEuVmVjdG9yMy5hZGQoIFByb3BNYW5hZ2VyLm5wY0RpY3RbXCJucGNfMFwiXS50cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fZGlzVmVjdG9yLHRoaXMuX3RvVmVjICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gdGhpcy5fdG9WZWM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnggPSBQcm9wTWFuYWdlci5ucGNEaWN0W1wibnBjXzBcIl0udHJhbnNmb3JtLnBvc2l0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5sb29rQXQoIFByb3BNYW5hZ2VyLm5wY0RpY3RbXCJucGNfMFwiXS50cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fdXB2ZWMgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCBQcm9wTWFuYWdlci5tYWluUm9sZSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5WZWN0b3IzLmFkZCggUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLHRoaXMuX2Rpc1ZlY3Rvcix0aGlzLl90b1ZlYyApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuX3RvVmVjLnggPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24ueDtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24sdGhpcy5fdXB2ZWMgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgTGF5YS5WZWN0b3IzLmxlcnAoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbix0aGlzLl90b1ZlYywxNi8xMDAwICogdGhpcy5fc2xlcnBWYWx1ZSx0aGlzLl90b1ZlYyApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuX3RvVmVjLnogPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24ueit0aGlzLl9kaXNWZWN0b3IuejtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90b1ZlYy55ID0gUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnkgKyB0aGlzLl9kaXNWZWN0b3IueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSB0aGlzLl90b1ZlYztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rYXRWZWMueCA9IHRoaXMuX3RvVmVjLng7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9va2F0VmVjLnkgPSBQcm9wTWFuYWdlci5tYWluUm9sZS50cmFuc2Zvcm0ucG9zaXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb29rYXRWZWMueiA9IFByb3BNYW5hZ2VyLm1haW5Sb2xlLnRyYW5zZm9ybS5wb3NpdGlvbi56O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5sb29rQXQoIHRoaXMuX2xvb2thdFZlYyx0aGlzLl91cHZlYyApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBHYW1lRW5kUm90YXRlKHRhcmdldFBvczpMYXlhLlZlY3RvcjMsIHNwZWVkOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLmlzY2FuZm9sbG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSggc3BlZWQsZmFsc2UgKTtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0ubG9va0F0KCB0YXJnZXRQb3MsdGhpcy5fdXB2ZWMgKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHB1YmxpYyBTZXRDYW1lcmFQb3NpdGlvbiggdmVjOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB2YXIgdmFsdWVBcnI6QXJyYXk8c3RyaW5nPiA9IEdhbWVVdGlscy5jdXRzdHJ0b0FyciggR2FtZUNGRy5kaWN0WzFdLnZhbHVlICk7XHJcbiAgICAgICAgdGhpcy5fZGlzVmVjdG9yID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIoIHZhbHVlQXJyWzBdICksTnVtYmVyKCB2YWx1ZUFyclsxXSApLE51bWJlciggdmFsdWVBcnJbMl0gKSk7XHJcbiAgICAgICAgTGF5YS5WZWN0b3IzLmFkZCh2ZWMgLHRoaXMuX2Rpc1ZlY3Rvcix0aGlzLl90b1ZlYyApO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3RvVmVjO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhLnRyYW5zZm9ybS5wb3NpdGlvbi54ID0gdmVjLng7XHJcbiAgICAgICAgLy8gdGhpcy5jYW1lcmEudHJhbnNmb3JtLmxvb2tBdCggdmVjLG5ldyBMYXlhLlZlY3RvcjMoIDAsMSwwICkgKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IEJ1aWxkQ0ZHIGZyb20gXCIuLi9DRkcvQnVpbGRDRkdcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQge0NhbWVyYU1hbmFnZXJ9IGZyb20gXCIuL0NhbWVyYU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQgTnBjQ0ZHIGZyb20gXCIuLi9DRkcvTnBjQ0ZHXCI7XHJcbmltcG9ydCB7IEFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9Db250cm9sL0Fzc2V0TWFuYWdlclwiO1xyXG5pbXBvcnQgUG9vbE1hbmFnZXIgZnJvbSBcIi4uL0NvbnRyb2wvUG9vbE1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBOcGNTY3JpcHQgZXh0ZW5kcyBMYXlhLlNjcmlwdDNEIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuICAgIHByaXZhdGUgX3RyYW5zZm9ybTpMYXlhLlRyYW5zZm9ybTNEO1xyXG4gICAgcHJpdmF0ZSBfaXNjYW5Nb3ZlOmJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9zcGVlZE1vdmVWMzpMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93QWN0aW9uOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBfYW5pbWF0b3I6TGF5YS5BbmltYXRvcjtcclxuXHJcbiAgICByZXNvdXNlTmFtZTpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHByaXZhdGUgX3NoYW5ncGFWZWM6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuXHJcbiAgICAvKirmmK/lkKblj5HnlJ/norDmkp4gKi9cclxuICAgIHByaXZhdGUgaGF2ZUNvbGxpc2lvbjpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9UYXJnZXRDb2xsaXNpb246c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX25vcm1hbGl6ZVZlYzpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgXHJcbiAgICBwcml2YXRlIF9ub3dzZWxlY3RWZWM6TGF5YS5WZWN0b3IzO1xyXG5cclxuICAgIHByaXZhdGUgc3RheWJ1aWxkOnN0cmluZyA9IFwiXCI7XHJcbiAgICBcclxuICAgIHByaXZhdGUgc3RheXNjZW5lOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIDA65pyq6ZSB77yMMe+8mumUgeW3pui+ue+8jDLvvJrplIHlj7PovrlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9ja3hzdGF0ZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKClcclxuICAgIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF3YWtlKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9hbmltYXRvciA9ICh0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0QpLmdldENvbXBvbmVudCggTGF5YS5BbmltYXRvciApO1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNldEFuaW1hdG9yKCB0aGlzLl9hbmltYXRvciApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgTGVmdFRyaWFsOkxheWEuU3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIFJpZ2h0VHJpYWw6TGF5YS5TcHJpdGUzRDtcclxuXHJcbiAgICBwdWJsaWMgb25TdGFydCgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMgPSBuZXcgTGF5YS5WZWN0b3IzKCAwLDAsMCApO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybSA9ICh0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybTtcclxuICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IHRoaXMub3duZXIgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICAvLyAoc3AuZ2V0Q2hpbGRCeU5hbWUoXCJsZWZ0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEKS5hY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAvLyAoc3AuZ2V0Q2hpbGRCeU5hbWUoXCJyaWdodHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRCApLmFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBMZWZ0VHJpYWwxID0gc3AuZ2V0Q2hpbGRCeU5hbWUoXCJsZWZ0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEO1xyXG4gICAgICAgIHZhciBSaWdodFRyaWFsMSA9IHNwLmdldENoaWxkQnlOYW1lKFwicmlnaHR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICAgICAgY29uc29sZS5sb2coKVxyXG5cclxuICAgICAgICBcclxuXHJcblxyXG4gICAgICAgIHZhciBzY2FsZT0wLjAwMTtcclxuICAgICAgICB2YXIgaW5kZXg9R2FtZVV0aWxzLnJhbmRSYW5nZWludCgwLEFzc2V0TWFuYWdlci5BbGxNYXBEaWMubGVuZ3RoLTEpO1xyXG4gICAgICAgIGluZGV4PWluZGV4JUFzc2V0TWFuYWdlci5BbGxNYXBEaWMubGVuZ3RoO1xyXG4gICAgICAgIHZhciBwcmVmYWJzPUFzc2V0TWFuYWdlci5BbGxNYXBEaWNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMuTGVmdFRyaWFsPVBvb2xNYW5hZ2VyLkdldFNwcml0ZTNEKHByZWZhYnMpO1xyXG4gICAgICAgIExlZnRUcmlhbDEucGFyZW50LmFkZENoaWxkKCB0aGlzLkxlZnRUcmlhbCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsUG9zaXRpb249KExlZnRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbC50cmFuc2Zvcm0ubG9jYWxSb3RhdGlvbkV1bGVyPShMZWZ0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFJvdGF0aW9uRXVsZXIuY2xvbmUoKTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbC50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgTGF5YS5WZWN0b3IzKHNjYWxlLHNjYWxlLHNjYWxlKTtcclxuXHJcbiAgICAgICAgdGhpcy5SaWdodFRyaWFsPVBvb2xNYW5hZ2VyLkdldFNwcml0ZTNEKHByZWZhYnMpO1xyXG4gICAgICAgIFJpZ2h0VHJpYWwxLnBhcmVudC5hZGRDaGlsZCh0aGlzLlJpZ2h0VHJpYWwpO1xyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbC50cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbj0oUmlnaHRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlcj0oUmlnaHRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlci5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbC50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgTGF5YS5WZWN0b3IzKHNjYWxlLHNjYWxlLHNjYWxlKTtcclxuICAgICAgICBSaWdodFRyaWFsMS5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgICAgTGVmdFRyaWFsMS5hY3RpdmU9ZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKHNwLm5hbWUpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfaW5pdFBvc1ZlYzpMYXlhLlZlY3RvcjM7XHJcbiAgICAvKipcclxuICAgICAqIOeKtuaAge+8jDDvvJrnrYnlvoXnirbmgIHvvIwx77ya5byA5aeL54q25oCB77yMMu+8muWujOaIkOeKtuaAgVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9ub3dSb2xlU3RhdGU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwdWJsaWMgc3RhcnRSdW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd05wY2luZm8uZ3Jhdml0eSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLkdyYXZpdHlfZyA9IHRoaXMuX25vd05wY2luZm8uZ3Jhdml0eTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5HcmF2aXR5X2cgPSAxMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hlY2t0aW1lID0gNTAwO1xyXG4gICAgICAgIHRoaXMuX25vd1JvbGVTdGF0ZSA9IDE7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSAwO1xyXG4gICAgICAgIHRoaXMuX2luaXRQb3NWZWMgPSB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICB0aGlzLnN0YXlidWlsZCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zdGF5c2NlbmUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuX25vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnN0YW5kO1xyXG4gICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnggPSAwO1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnkgPSAwO1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzLnogPSAtdGhpcy5tb3Zlc3BlZWQ7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gdHJ1ZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UuYWRkVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93TnBjaW5mbzpOcGNDRkc7XHJcblxyXG4gICAgbW92ZXNwZWVkOm51bWJlciA9IDA7XHJcbiAgICBmcm9udGp1bXBzcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgbGVmdGp1bXBzcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcmlnaHRqdW1wc3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIGNsaW1ic3BlZWQ6bnVtYmVyID0gMDtcclxuICAgIHNpZGVjbGltYnNwZWVkOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHVibGljIG5wY2luZm8oIGNmZzpOcGNDRkcgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fbm93TnBjaW5mbyA9IGNmZztcclxuICAgICAgICB0aGlzLm1vdmVzcGVlZCA9IHRoaXMuX25vd05wY2luZm8uc3BlZWQ7XHJcbiAgICAgICAgdGhpcy5jbGltYnNwZWVkID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnVwY2xpbWIgKTtcclxuICAgICAgICB0aGlzLmZyb250anVtcHNwZWVkID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIodGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueCksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC55KSxOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLnopKVxyXG4gICAgICAgIHRoaXMubGVmdGp1bXBzcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoTnVtYmVyKHRoaXMuX25vd05wY2luZm8ubGVmdGp1bXAueCksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmxlZnRqdW1wLnkpLE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC56KSlcclxuICAgICAgICB0aGlzLnJpZ2h0anVtcHNwZWVkID0gbmV3IExheWEuVmVjdG9yMyhOdW1iZXIodGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueCksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC55KSxOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLnopKVxyXG4gICAgICAgIHRoaXMuc2lkZWNsaW1ic3BlZWQgPSBuZXcgTGF5YS5WZWN0b3IzKE51bWJlcih0aGlzLl9ub3dOcGNpbmZvLnNsaWRlY2xpbWIueCksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnNsaWRlY2xpbWIueSksTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnNsaWRlY2xpbWIueikpXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gdGhpcy5mcm9udGp1bXAueCA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5mcm9udGp1bXAueCApO1xyXG4gICAgICAgIC8vIHRoaXMuZnJvbnRqdW1wLnkgPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8uZnJvbnRqdW1wLnkgKTtcclxuICAgICAgICAvLyB0aGlzLmZyb250anVtcC56ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmZyb250anVtcC56ICk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMubGVmdGp1bXAueCA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5sZWZ0anVtcC54ICk7XHJcbiAgICAgICAgLy8gdGhpcy5sZWZ0anVtcC55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLmxlZnRqdW1wLnkgKTtcclxuICAgICAgICAvLyB0aGlzLmxlZnRqdW1wLnogPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ubGVmdGp1bXAueiApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHRoaXMucmlnaHRqdW1wLnggPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8ucmlnaHRqdW1wLnggKTtcclxuICAgICAgICAvLyB0aGlzLnJpZ2h0anVtcC55ID0gTnVtYmVyKCB0aGlzLl9ub3dOcGNpbmZvLnJpZ2h0anVtcC55ICk7XHJcbiAgICAgICAgLy8gdGhpcy5yaWdodGp1bXAueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5yaWdodGp1bXAueiApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnVwY2xpbWIgPSBOdW1iZXIoIHRoaXMuX25vd05wY2luZm8udXBjbGltYiApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnNsaWRlY2xpbWIueCA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnggKTtcclxuICAgICAgICAvLyB0aGlzLnNsaWRlY2xpbWIueSA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnkgKTtcclxuICAgICAgICAvLyB0aGlzLnNsaWRlY2xpbWIueiA9IE51bWJlciggdGhpcy5fbm93TnBjaW5mby5zbGlkZWNsaW1iLnogKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiDlvIDlp4vnorDmkp7ml7bmiafooYxcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29sbGlzaW9uRW50ZXIoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIHtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdGhpcy5DYWxjdWxhdGUoIGNvbnRhY3RQb2ludC5ub3JtYWwsY29sbGlzaW9uLm90aGVyLm93bmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgcHVibGljIHNldG5vd1NlbGVjdFZlYyggcG9zOkxheWEuVmVjdG9yMyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBwb3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbG9ja2J5QnVpbGRuYW1lOnN0cmluZyA9IFwiXCI7XHJcbiAgICAvKipcclxuICAgICAqIDA65pyq6KKr6ZSB77yMMe+8mumUgeWumuW3pui+ue+8jDLvvJrplIHlrprlj7PovrnvvIxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbG9ja3N0YXRlOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIENhbGN1bGF0ZSggbm9ybWFsOkxheWEuVmVjdG9yMyx0YXJnZXQ6TGF5YS5Ob2RlICk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZSA9PSBcIlNsaWRlckJvb3N0XCIgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJucGNcIiApICE9IC0xIHx8IHRhcmdldC5uYW1lLmluZGV4T2YoIFwicm9sZVwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9UYXJnZXRDb2xsaXNpb24gPSB0YXJnZXQubmFtZTtcclxuICAgICAgICB2YXIgbjpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgICAgIExheWEuVmVjdG9yMy5ub3JtYWxpemUobm9ybWFsLHRoaXMuX25vcm1hbGl6ZVZlYyk7XHJcbiAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSB8fCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJTY2FmZm9sZGluZ1wiICkgIT0gLTEgfHxcclxuICAgICAgICB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xICkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXlidWlsZCA9IHRoaXMuX1RhcmdldENvbGxpc2lvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RheXNjZW5lID0gdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vd3NlbGVjdFZlYyA9IFByb3BNYW5hZ2VyLmdldFBvc1ZlY2J5U2NlbmUoIHRhcmdldC5wYXJlbnQucGFyZW50LnBhcmVudC5uYW1lLHRhcmdldC5wYXJlbnQubmFtZSApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93c2VsZWN0VmVjID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGFyZ2V0LnBhcmVudC5wYXJlbnQubmFtZSx0aGlzLl9UYXJnZXRDb2xsaXNpb24gKTtcclxuICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ID09IC0xICkgLy/kuIrniKxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyAmJiB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA+ICh0aGlzLl9ub3dzZWxlY3RWZWMueSAtIDAuMSkgIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gPSBuZXcgTGF5YS5WZWN0b3IzKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCx0aGlzLl9ub3dzZWxlY3RWZWMueSx0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUucnVuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGFuZ3BhVmVjID0gdGhpcy5fbm93c2VsZWN0VmVjLmNsb25lKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnkgPT0gMSB8fHRoaXMuX25vcm1hbGl6ZVZlYy55ID09IC0xIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnggPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1idXAgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2t4c3RhdGUgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OyAgICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9ub3JtYWxpemVWZWMueCA9PSAxIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnJ1biApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NreHN0YXRlID0gMjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ7ICBcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm9ybWFsaXplVmVjLnogIT0gMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcInBhbmVsX2p1bXBcIiApICE9IC0xICkgLy/liqDpgJ/mnb/ot7Pot4NcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXA7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dBY3Rpb24gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoXCJwYW5lbF9kb3duc2xpcFwiKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJveF9Cb2FyZFwiICkgIT0gLTEgJiYgdGhpcy5ub3dBY3Rpb24gIT0gQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIHRoaXMuX25vcm1hbGl6ZVZlYy56ID09IC0xICkgLy/kuIrniKxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hhbmdwYVZlYyA9IHRoaXMuX25vd3NlbGVjdFZlYy5jbG9uZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJveF9zaWRlanVtcFwiICkgIT0gLTEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5zaWRlc3BlZWR1cDtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRKdW1wKCB0aGlzLm5vd0FjdGlvbiApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJib3hfU3VybW91bnRcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuY3Jvc3M7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2V0SnVtcCggdGhpcy5ub3dBY3Rpb24gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiaXJvbmdhdXplXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmNsaW1idXA7XHJcbiAgICAgICAgICAgIHRoaXMuX3NoYW5ncGFWZWMgPSB0aGlzLl9ub3dzZWxlY3RWZWMuY2xvbmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIOaMgee7reeisOaSnuaXtuaJp+ihjFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgIG9uQ29sbGlzaW9uU3RheShjb2xsaXNpb246TGF5YS5Db2xsaXNpb24pOnZvaWQgXHJcbiAgICB7XHJcbiAgICAgICAgLy8gRGVidWdlci5sb2coIFwi56Kw5pKe5LitXCIgKTtcclxuICAgICAgICBpZiggY29sbGlzaW9uICYmIGNvbGxpc2lvbi5jb250YWN0cyAmJiBjb2xsaXNpb24uY29udGFjdHMubGVuZ3RoID4gMCAmJiBjb2xsaXNpb24ub3RoZXIgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5oYXZlQ29sbGlzaW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RQb2ludDpMYXlhLkNvbnRhY3RQb2ludCA9IGNvbGxpc2lvbi5jb250YWN0c1swXTtcclxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGNvbGxpc2lvbi5vdGhlci5vd25lcjtcclxuICAgICAgICAgICAgdmFyIHRhcmdldG5hbWU6c3RyaW5nID0gdGFyZ2V0Lm5hbWU7XHJcbiAgICAgICAgICAgIGlmKCB0YXJnZXRuYW1lICE9IFwiU2xpZGVyQm9vc3RcIiAmJiB0YXJnZXRuYW1lLmluZGV4T2YoIFwibnBjXCIgKSA9PSAtMSAmJiB0YXJnZXRuYW1lLmluZGV4T2YoIFwicm9sZVwiICkgPT0gLTEgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9UYXJnZXRDb2xsaXNpb24gPSB0YXJnZXRuYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJidWlsZFwiICkgIT0gLTEgfHwgdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwiU2NhZmZvbGRpbmdcIiApICE9IC0xIHx8XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xICkgLy/norDliLDlu7rnrZHvvIzliKTmlq3mmK/kuIrniKzvvIzlt6bniKzov5jmmK/lj7PniKxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF5YnVpbGQgPSB0aGlzLl9UYXJnZXRDb2xsaXNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF5c2NlbmUgPSB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJpcm9uZ2F1emVcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5wYXJlbnQubmFtZSx0YXJnZXQucGFyZW50Lm5hbWUgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3dzZWxlY3RWZWMgPSBQcm9wTWFuYWdlci5nZXRQb3NWZWNieVNjZW5lKCB0YXJnZXQucGFyZW50LnBhcmVudC5uYW1lLHRoaXMuX1RhcmdldENvbGxpc2lvbiApO1xyXG4gICAgICAgICAgICAgICAgfSBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICog57uT5p2f56Kw5pKe5pe25omn6KGMXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbGxpc2lvbkV4aXQoY29sbGlzaW9uOkxheWEuQ29sbGlzaW9uKTp2b2lkIFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuaGF2ZUNvbGxpc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmKCBjb2xsaXNpb24gJiYgY29sbGlzaW9uLmNvbnRhY3RzICYmIGNvbGxpc2lvbi5jb250YWN0cy5sZW5ndGggPiAwICYmIGNvbGxpc2lvbi5vdGhlciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB2YXIgY29udGFjdFBvaW50OkxheWEuQ29udGFjdFBvaW50ID0gY29sbGlzaW9uLmNvbnRhY3RzWzBdO1xyXG4gICAgICAgICAgICB0aGlzLkNoZWNrRW5kKCBjb250YWN0UG9pbnQubm9ybWFsLGNvbGxpc2lvbi5vdGhlci5vd25lciApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIENoZWNrRW5kKCBub3JtYWw6TGF5YS5WZWN0b3IzLHRhcmdldDpMYXlhLk5vZGUgKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRhcmdldC5uYW1lID09IFwiU2xpZGVyQm9vc3RcIiB8fCB0YXJnZXQubmFtZS5pbmRleE9mKCBcIm5wY1wiICkgIT0gLTEgfHwgdGFyZ2V0Lm5hbWUuaW5kZXhPZiggXCJyb2xlXCIgKSAhPSAtMSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLkhhdmVGb3JjZUp1bXAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5IYXZlRm9yY2VKdW1wID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9ja3hzdGF0ZSA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbiAhPSB0YXJnZXQubmFtZSApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0YXJnZXQubmFtZS5pbmRleE9mKCBcInBhbmVsX2p1bXBcIiApICE9IC0xIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3dpdGNoKCB0aGlzLm5vd0FjdGlvbiApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1idXA6XHJcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrOlxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJveF9Cb2FyZFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuSnVtcEFjdGlvbiggdGhpcy5fY2hhbmdlTW92ZVggKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hhbmdlTW92ZVggPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ6XHJcbiAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5KdW1wQWN0aW9uKCB0aGlzLl9jaGFuZ2VNb3ZlWCApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5ydW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX2NoYW5nZU1vdmVYICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLk1vdmVYOlxyXG4gICAgICAgICAgICB0aGlzLkp1bXBBY3Rpb24oIHRoaXMuX3NwZWVkTW92ZVYzLnggKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgSnVtcEFjdGlvbiggdmFsdWU6bnVtYmVyLGlzcXVhbnpob25nOmJvb2xlYW4gPSBmYWxzZSApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdmFsdWUgPiAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmKCB2YWx1ZSA8IDAgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaWYoIGlzcXVhbnpob25nIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImJ1aWxkXCIgKSAhPSAtMSApIFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Om51bWJlciA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsMTAwICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbHZhbHVlOm51bWJlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RkaXI6c3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwibGVmdHJpZ2h0XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGx2YWx1ZSA9IHRoaXMuX25vd05wY2luZm8uanVtcF9sZWZ0ICsgdGhpcy5fbm93TnBjaW5mby5qdW1wX3JpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCxhbGx2YWx1ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8PSB0aGlzLl9ub3dOcGNpbmZvLmp1bXBfbGVmdCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwibGVmdFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJyaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImZyb250cmlnaHRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbHZhbHVlID0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY2luZm8uanVtcF9yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydCA9IEdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoIDAsYWxsdmFsdWUgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwiZnJvbnRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9UYXJnZXRDb2xsaXNpb24uaW5kZXhPZiggXCJmcm9udGxlZnRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbHZhbHVlID0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY2luZm8uanVtcF9sZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCxhbGx2YWx1ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8PSB0aGlzLl9ub3dOcGNpbmZvLnN0YXJ0X2FoZWFkIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJsZWZ0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwicmlnaHRcIiApICE9IC0xIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGRpciA9IFwicmlnaHRcIjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fVGFyZ2V0Q29sbGlzaW9uLmluZGV4T2YoIFwibGVmdFwiICkgIT0gLTEgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJsZWZ0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX1RhcmdldENvbGxpc2lvbi5pbmRleE9mKCBcImZyb250XCIgKSAhPSAtMSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcImZyb250XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbHZhbHVlID0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY2luZm8uanVtcF9sZWZ0ICsgdGhpcy5fbm93TnBjaW5mby5qdW1wX3JpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCxhbGx2YWx1ZSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggc29ydCA8PSB0aGlzLl9ub3dOcGNpbmZvLnN0YXJ0X2FoZWFkIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJmcm9udFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHNvcnQgPD0gdGhpcy5fbm93TnBjaW5mby5zdGFydF9haGVhZCArIHRoaXMuX25vd05wY2luZm8uanVtcF9sZWZ0IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZGlyID0gXCJsZWZ0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RkaXIgPSBcInJpZ2h0XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBzZWxlY3RkaXIgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZyb250XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIExhc3RBY3Rpb246c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgX21vdmVUaW1lOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9jaGl4dVRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICBwcml2YXRlIF9pc0FjdGlvbk51bXM6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaXNuZWVkYWN0aW9ubnVtOm51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIF9uZWVkYWN0aW9udGltZTpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgTm93TGFzdEFjdGlvblN0YXRlOnN0cmluZz1cIlwiO1xyXG4gICAgcHVibGljIHNldCBub3dBY3Rpb24oIHZhbHVlOnN0cmluZyApXHJcbiAgICB7XHJcbiAgICAgICAgaWYoIHRoaXMuX25vd1JvbGVTdGF0ZSA9PSAxIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLl9ub3dBY3Rpb24gIT0gdmFsdWUgfHwgdGhpcy5MYXN0QWN0aW9uID09IENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wfHx0aGlzLkxhc3RBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0IClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5MYXN0QWN0aW9uID0gdGhpcy5fbm93QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm93QWN0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2goIHRoaXMuX25vd0FjdGlvbiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5zdGFuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5zdGFuZCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUucnVuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5MYXN0QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXAgfHwgdGhpcy5MYXN0QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0IHx8dGhpcy5MYXN0QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXByaWdodCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0IDwgNTAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5sYW5kMSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5sYW5kMiApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUucnVuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5qdW1wICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLmZyb250anVtcHNwZWVkLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLmZyb250anVtcHNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLmZyb250anVtcHNwZWVkLno7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQgPSB0aGlzLmxlZnRqdW1wc3BlZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLmxlZnRqdW1wc3BlZWQueDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMubGVmdGp1bXBzcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5sZWZ0anVtcHNwZWVkLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5sZWZ0anVtcCApO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuanVtcHJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZCA9IHRoaXMucmlnaHRqdW1wc3BlZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnggPSB0aGlzLnJpZ2h0anVtcHNwZWVkLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLnJpZ2h0anVtcHNwZWVkLnk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLnJpZ2h0anVtcHNwZWVkLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5yaWdodGp1bXAgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNwZWVkdXBqdW1wOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRjZmc6QnVpbGRDRkcgPSBCdWlsZENGRy5kaWN0WyBcInBhbmVsX2p1bXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLmp1bXBTcGVlZC56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuTm93TGFzdEFjdGlvblN0YXRlPT12YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IGJ1aWxkY2ZnLmJ1ZmZ5KjI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNuZWVkYWN0aW9ubnVtID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvcnQ6bnVtYmVyID0gR2FtZVV0aWxzLnJhbmRSYW5nZWludCggMCwxMDAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNvcnQgPCA1MCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDEgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5oaWdoanVtcDIgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuZG93bm1vdmU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGNmZzpCdWlsZENGRyA9IEJ1aWxkQ0ZHLmRpY3RbIFwicGFuZWxfZG93bnNsaXBcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuX3NwZWVkTW92ZVYzLnoqYnVpbGRjZmcuYnVmZno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoaXh1VGltZSA9IGJ1aWxkY2ZnLnRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzbmVlZGFjdGlvbm51bSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5odWFjaGFuICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jcm9zczpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkY2ZnOkJ1aWxkQ0ZHID0gQnVpbGRDRkcuZGljdFsgXCJib3hfU3VybW91bnRcIiBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gYnVpbGRjZmcuYnVmZng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSBidWlsZGNmZy5idWZmeSswLjU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnogPSB0aGlzLl9zcGVlZE1vdmVWMy56KmJ1aWxkY2ZnLmJ1ZmZ6O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGl4dVRpbWUgPSBidWlsZGNmZy50aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuaHVyZGxlICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cGJsb2NrOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuY2xpbWJzcGVlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aW9uTnVtcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuY2xpbWJ3YWxsICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmxlZnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkID0gbmV3IExheWEuVmVjdG9yMygwLHRoaXMuc2lkZWNsaW1ic3BlZWQueSx0aGlzLnNpZGVjbGltYnNwZWVkLnopXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuanVtcFNwZWVkLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5zaWRlY2xpbWJzcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC56ID0gdGhpcy5zaWRlY2xpbWJzcGVlZC56O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1bndhbGxsZWZ0ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZCA9IG5ldyBMYXlhLlZlY3RvcjMoMCx0aGlzLnNpZGVjbGltYnNwZWVkLnksdGhpcy5zaWRlY2xpbWJzcGVlZC56KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmp1bXBTcGVlZC54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuc2lkZWNsaW1ic3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5qdW1wU3BlZWQueiA9IHRoaXMuc2lkZWNsaW1ic3BlZWQuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW53YWxscmlnaHQgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc25lZWRhY3Rpb25udW0gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZWVkYWN0aW9udGltZSA9IDAuMztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBsYXlBbmltYXRvciggQ2hhcmFjdGVyU3RhdGUuY2xpbWJlbmQgKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuTm93TGFzdEFjdGlvblN0YXRlPXZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgbm93QWN0aW9uKCk6c3RyaW5nXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vd0FjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tb3ZlVmVjOkxheWEuVmVjdG9yMyA9IG5ldyBMYXlhLlZlY3RvcjM7XHJcbiAgICBwcml2YXRlIGp1bXBTcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBqdW1wSGlnaHQ6bnVtYmVyID0gMDtcclxuICAgIHByaXZhdGUgX2Rpc3k6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBHcmF2aXR5X2c6bnVtYmVyPTEwOy8v6YeN5Yqb5Yqg6YCf5bqmXHJcbiAgICBwcml2YXRlIF9jaGVja3RpbWU6bnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyB1cGRhdGUoIGR0Om51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5fbm93Um9sZVN0YXRlID09IDEgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgZHQgPSAxNjtcclxuICAgICAgICAgICAgdGhpcy5fY2hlY2t0aW1lICs9IGR0O1xyXG4gICAgICAgICAgICBpZiggUHJvcE1hbmFnZXIuaXNjYXJtYW5wYyApXHJcbiAgICAgICAgICAgIHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fY2hlY2t0aW1lID49IDUwMCApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2t0aW1lID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbm93TnBjaW5mbyAmJiBQcm9wTWFuYWdlci5tYWluUm9sZSApXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnogKyB0aGlzLl9ub3dOcGNpbmZvLmRpc3RhbmNlIDwgUHJvcE1hbmFnZXIubWFpblJvbGUudHJhbnNmb3JtLnBvc2l0aW9uLnogKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzY2FuTW92ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIHRoaXMuX2lzY2FuTW92ZSApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVGltZSArPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLm5vd0FjdGlvbiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5ydW46Ly/ot5HliqhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gZGlzdGltZSAqIHRoaXMuX3NwZWVkTW92ZVYzLno7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9sb2NreHN0YXRlID09IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAxIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYIDwgMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdGhpcy5fbG9ja3hzdGF0ZSA9PSAyIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuY2xpbWJ1cDovL+eIrOWNh1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSBkaXN0aW1lICogdGhpcy5qdW1wU3BlZWQueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2xvY2t4c3RhdGUgPT0gMSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fY2hhbmdlTW92ZVggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX2xvY2tzdGF0ZSA9PSAyIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX2NoYW5nZU1vdmVYID4gMCApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLl9jaGFuZ2VNb3ZlWCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fc2hhbmdwYVZlYyApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fc2hhbmdwYVZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuQ2xpbWJNb3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnVwYmxvY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3NoYW5ncGFWZWMgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkrMSA+IHRoaXMuX3NoYW5ncGFWZWMueSApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5DbGltYk1vdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSsxID4gdGhpcy5fbm93c2VsZWN0VmVjLnkgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wOi8v6Lez6LeDXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5qdW1wbGVmdDpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXByaWdodDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzeSA9IHRoaXMuanVtcFNwZWVkLnkgLSB0aGlzLkdyYXZpdHlfZypkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmp1bXBTcGVlZC55ID0gdGhpcy5fZGlzeTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5qdW1wU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9IHRoaXMuX2Rpc3kqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy56ID0gdGhpcy5qdW1wU3BlZWQueiAqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnRyYW5zbGF0ZSh0aGlzLl9tb3ZlVmVjLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyU3RhdGUuc3BlZWR1cGp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3kgPSB0aGlzLmp1bXBTcGVlZC55IC0gdGhpcy5HcmF2aXR5X2cqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdW1wU3BlZWQueSA9IHRoaXMuX2Rpc3k7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IHRoaXMuanVtcFNwZWVkLnggKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLl9kaXN5KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IHRoaXMuanVtcFNwZWVkLnogKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdDpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueiA9IGRpc3RpbWUgKiB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLmp1bXBTcGVlZC55KmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLk1vdmVYOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSBkaXN0aW1lICogdGhpcy5fc3BlZWRNb3ZlVjMuejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy54ID0gdGhpcy5fc3BlZWRNb3ZlVjMueCpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID4gMC4xIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmRvd25tb3ZlOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSB0aGlzLmp1bXBTcGVlZC54O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC55O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID4gdGhpcy5fY2hpeHVUaW1lIClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnNpZGVzcGVlZHVwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX21vdmVUaW1lID4gdGhpcy5fY2hpeHVUaW1lICYmIHRoaXMuTGFzdEFjdGlvbj09Q2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0IHx8IHRoaXMuTGFzdEFjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYnJpZ2h0IClcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSB0aGlzLkxhc3RBY3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnNldEp1bXAoIHRoaXMubm93QWN0aW9uICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmNyb3NzOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXN5ID0gdGhpcy5qdW1wU3BlZWQueSAtIHRoaXMuR3Jhdml0eV9nKmRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVtcFNwZWVkLnkgPSB0aGlzLl9kaXN5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSB0aGlzLmp1bXBTcGVlZC54ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVZlYy55ID0gdGhpcy5fZGlzeSpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSB0aGlzLmp1bXBTcGVlZC56ICpkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2Zvcm0udHJhbnNsYXRlKHRoaXMuX21vdmVWZWMsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLkNsaW1iTW90aW9uOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9ub3dzZWxlY3RWZWMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueSA8IHRoaXMuX25vd3NlbGVjdFZlYy55IClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdmVWZWMueSA9ICgxLzAuMykqZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3ZlVmVjLnogPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS50cmFuc2xhdGUodGhpcy5fbW92ZVZlYywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX25vd3NlbGVjdFZlYyAmJiAodGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIHx8IHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmRvd25tb3ZlICkgJiYgIXRoaXMuaGF2ZUNvbGxpc2lvbiApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IDw9IHRoaXMuX25vd3NlbGVjdFZlYy56IClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXByaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9jaGFuZ2VNb3ZlWCA8IDAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi55IDwgUHJvcE1hbmFnZXIuZGllUG9zWSApLy/op5LoibLmrbvkuqFcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5zdGF5c2NlbmUgPT0gXCJcIiB8fCB0aGlzLnN0YXlidWlsZCA9PSBcIlwiIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX2luaXRQb3NWZWMuY2xvbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uID0gUHJvcE1hbmFnZXIuZ2V0UG9zVmVjYnlTY2VuZSggdGhpcy5zdGF5c2NlbmUsdGhpcy5zdGF5YnVpbGQgKS5jbG9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLnJ1bjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueiA8IFByb3BNYW5hZ2VyLmdhbWV3aW5Qb3NaIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLldpbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuX2lzQWN0aW9uTnVtcyApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy/lpoLmnpzlvZPliY3mkq3mlL5zdGF0ZeW3sue7j+aSreaUvuWujOS6huS4gOasoVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9pc25lZWRhY3Rpb25udW0gPiAwIClcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuX2FuaW1hdG9yLmdldEN1cnJlbnRBbmltYXRvclBsYXlTdGF0ZSgpLm5vcm1hbGl6ZWRUaW1lID49IHRoaXMuX2lzbmVlZGFjdGlvbm51bSlcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9ub3dBY3Rpb25OYW1lIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sZWZ0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJpZ2h0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1cmRsZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1YWNoYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sYW5kMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmxhbmQyOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FjdGlvbk51bXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnJ1biApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB0aGlzLl9uZWVkYWN0aW9udGltZSAhPSAwICYmIHRoaXMuX21vdmVUaW1lID4gdGhpcy5fbmVlZGFjdGlvbnRpbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCB0aGlzLl9ub3dBY3Rpb25OYW1lIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmp1bXA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5sZWZ0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLnJpZ2h0anVtcDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmhpZ2hqdW1wMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1cmRsZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENoYXJhY3RlclN0YXRlLmh1YWNoYW46XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBY3Rpb25OdW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5ydW4gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5ydW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBMYXlhLlZlY3RvcjMoIHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi54LHRoaXMuX25vd3NlbGVjdFZlYy55LHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56ICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlmKCB0aGlzLl9lbmRpbmcgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0aW1lOm51bWJlciA9IGR0LzEwMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW92ZVRpbWUgKz0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPj0gdGhpcy5fZW5kYW5tb3RpbWUgKVxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HYW1lT3ZlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnggPSB0aGlzLl9lbmRBbm1vU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueSA9IHRoaXMuX2VuZEFubW9TcGVlZC55ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS56ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnogKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoIFByb3BNYW5hZ2VyLmNhcm1hLmdldENvbXBvbmVudCggQ2FtZXJhTWFuYWdlciApIGFzIENhbWVyYU1hbmFnZXIgKS5HYW1lRW5kUm90YXRlKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sIHRoaXMuX2VuZEFubW9TcGVlZDEgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBHYW1lT3ZlcigpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICBUaW1lclNlcnZpY2UuSW5zdGFuY2UucmVtb3ZlVXBkYXRlVGFyZ2V0KCB0aGlzICk7XHJcbiAgICAgICAgRGlzcGF0Y2hlck1hbmFnZXIuZGlzcGF0Y2hFdmVudCggR2FtZVN0YXRlLmVuZCApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VuZGluZzpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIF9lbmRBbm1vU3BlZWQ6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMygpO1xyXG4gICAgcHJpdmF0ZSBfZW5kYW5tb3RpbWU6bnVtYmVyID0gMTtcclxuICAgIHByaXZhdGUgX2VuZEFubW9TcGVlZDE6TGF5YS5WZWN0b3IzID0gbmV3IExheWEuVmVjdG9yMztcclxuICAgIHByaXZhdGUgV2luKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgICAgICB0aGlzLl9ub3dSb2xlU3RhdGUgPSAyO1xyXG4gICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUubnBjZW5kLHRoaXMub3duZXIubmFtZSApO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN0b3AoKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGRlc3Ryb3koKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jaGFuZ2VNb3ZlWDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgSGF2ZUZvcmNlSnVtcDpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBxdWF0ZXJuaW9uOkxheWEuUXVhdGVybmlvbiA9IG5ldyBMYXlhLlF1YXRlcm5pb247IFxyXG4gICAgcHVibGljIEpveSggdmFsdWU6bnVtYmVyLGFuZ2xlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIHx8IHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1idXAgfHwgQ2hhcmFjdGVyU3RhdGUuY2xpbWJsZWZ0IHx8IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQgKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlTW92ZVggPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1ibGVmdCAmJiB0aGlzLl9jaGFuZ2VNb3ZlWCA+IDAgKSAvL+W8uuWItui3s+i3g1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5IYXZlRm9yY2VKdW1wID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ub3dBY3Rpb24gPSBDaGFyYWN0ZXJTdGF0ZS5qdW1wcmlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYoIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmNsaW1icmlnaHQgJiYgdGhpcy5fY2hhbmdlTW92ZVggPCAwIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuSGF2ZUZvcmNlSnVtcCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcGxlZnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5qdW1wIHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXBsZWZ0IHx8XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID09IENoYXJhY3RlclN0YXRlLmp1bXByaWdodCB8fFxyXG4gICAgICAgICAgICB0aGlzLm5vd0FjdGlvbiA9PSBDaGFyYWN0ZXJTdGF0ZS5zcGVlZHVwanVtcCApXHJcbiAgICAgICAgICAgIGFuZ2xlID0gLWFuZ2xlICogTWF0aC5QSS8xODA7XHJcbiAgICAgICAgICAgIExheWEuUXVhdGVybmlvbi5jcmVhdGVGcm9tQXhpc0FuZ2xlKCBuZXcgTGF5YS5WZWN0b3IzKCAwLDEsMCApLGFuZ2xlLHRoaXMucXVhdGVybmlvbiApO1xyXG4gICAgICAgICAgICBMYXlhLlZlY3RvcjMudHJhbnNmb3JtUXVhdCggdGhpcy5qdW1wU3BlZWQsdGhpcy5xdWF0ZXJuaW9uLHRoaXMuanVtcFNwZWVkICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbm93QWN0aW9uTmFtZTpzdHJpbmc7XHJcbiAgICBwdWJsaWMgUGxheUFuaW1hdG9yKCBhY3Rpb25OYW1lOnN0cmluZyApOnZvaWRcclxuICAgIHtcclxuICAgICAgICAvLyB0aGlzLl9ub3dBY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcclxuICAgICAgICB2YXIgX2FjdGlvbm5hbWUgPSB0aGlzLlRyYW5zaXRpb25BY3Rpb25OYW1lKGFjdGlvbk5hbWUpO1xyXG4gICAgICAgIHRoaXMuX25vd0FjdGlvbk5hbWUgPSBhY3Rpb25OYW1lO1xyXG4gICAgICAgIGlmKCB0aGlzLl9hbmltYXRvciApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fbm93QWN0aW9uTmFtZSA9PSBDaGFyYWN0ZXJTdGF0ZS5jbGltYmVuZCApXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnNwZWVkID0gMS41O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3Iuc3BlZWQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLnBsYXkoX2FjdGlvbm5hbWUsMCwwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoq6L2s5o2i5Yqo5L2c5ZCN56ewICovXHJcbiAgICBUcmFuc2l0aW9uQWN0aW9uTmFtZShfYWN0aW9ubmFtZTpzdHJpbmcpOnN0cmluZ3tcclxuICAgICAgICBzd2l0Y2ggKF9hY3Rpb25uYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyb2xsb3ZlcjFcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2VmYW4xXCJcclxuICAgICAgICAgICAgY2FzZSBcInJvbGxvdmVyMlwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJjZWZhbjJcIlxyXG4gICAgICAgICAgICBjYXNlIFwicnVud2FsbGxlZnRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicGFvcWlhbmdsZWZ0XCJcclxuICAgICAgICAgICAgY2FzZSBcInJpZ2h0anVtcFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJyaWdodGp1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwicnVud2FsbHJpZ2h0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInBhb3FpYW5ncmlnaHRcIlxyXG4gICAgICAgICAgICBjYXNlIFwibGVmdGp1bXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibGVmdGp1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJ3YWxsXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInBhcWlhbmdcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJlbmRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiY2xpbWJlbmRcIlxyXG4gICAgICAgICAgICBjYXNlIFwic3RhbmRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwic3RhbmRcIlxyXG4gICAgICAgICAgICBjYXNlIFwic2t5XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImtvbmd6aG9uZ1wiXHJcbiAgICAgICAgICAgIGNhc2UgXCJsYW5kMVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsdW9kaTFcIlxyXG4gICAgICAgICAgICBjYXNlIFwibGFuZDJcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwibHVvZGkyXCJcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hqdW1wMVwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkYXRpYW8xXCJcclxuICAgICAgICAgICAgY2FzZSBcImhpZ2hqdW1wMlwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJkYXRpYW8yXCJcclxuICAgICAgICAgICAgY2FzZSBcInJ1blwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJydW5cIlxyXG4gICAgICAgICAgICBjYXNlIFwianVtcFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJqdW1wXCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1idXBcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiQ2xpbWJcIlxyXG4gICAgICAgICAgICBjYXNlIFwiZmFsbGRvd25cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiRnJlZWZhbGxpbmdcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJsZWZ0XCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImxlZnRfY2xpbWJcIlxyXG4gICAgICAgICAgICBjYXNlIFwiY2xpbWJyaWdodFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJyaWdodF9jbGltYlwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJqdW1wcmlnaHRcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwicmlnaHRfanVtcFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJqdW1wbGVmdFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsZWZ0X2p1bXBcIlxyXG4gICAgICAgICAgICBjYXNlIFwiQ2xpbWJNb3Rpb25cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiUGxheVBhbG91QWN0aW9uXCJcclxuICAgICAgICAgICAgY2FzZSBcImh1YWNoYW5cIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwiaHVhY2hhblwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJodXJkbGVcIjpcclxuICAgICAgICAgICAgcmV0dXJuIFwia3VhbGFuXCJcclxuICAgICAgICAgICAgY2FzZSBcInNwZWVkdXBqdW1wXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImppYXN1SnVtcFwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJNb3ZlWFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJ4c2h1bnlpXCJcclxuICAgICAgICAgICAgY2FzZSBcImRvd25tb3ZlXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcImRvd25TbGlkZVwiXHJcbiAgICAgICAgICAgIGNhc2UgXCJzaWRlc3BlZWR1cFwiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJzbGlkZWppYXN1XCJcclxuICAgICAgICAgICAgY2FzZSBcImNyb3NzXCI6XHJcbiAgICAgICAgICAgIHJldHVybiBcInN1cm1vdW50XCJcclxuICAgICAgICAgICAgY2FzZSBcImNsaW1idXBibG9ja1wiOlxyXG4gICAgICAgICAgICByZXR1cm4gXCJsb2NrY2xpbWJcIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIFRlc3RKdW1wKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuanVtcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldFBvc3Rpb24oKTpMYXlhLlZlY3RvcjNcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBY3Rpb24oKTpudW1iZXJcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbm93Um9sZVN0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGVzdHJveSgpXHJcbiAgICB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLmi5blsL7lm57mlLbmiJDlip8tLS0tXCIpO1xyXG4gICAgICAgIFBvb2xNYW5hZ2VyLlJlY292ZXJTcHJpdGUzRCh0aGlzLkxlZnRUcmlhbClcclxuICAgICAgICBQb29sTWFuYWdlci5SZWNvdmVyU3ByaXRlM0QodGhpcy5SaWdodFRyaWFsKVxyXG4gICAgfVxyXG5cclxuICAgXHJcbn0iLCJpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSBcIi4uL1RpbWUvVGltZXJTZXJ2aWNlXCI7XHJcbmltcG9ydCB7UHJvcE1hbmFnZXJ9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1Byb3BNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q2hhcmFjdGVyU3RhdGV9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL0NoYXJhY3RlclN0YXRlXCI7XHJcbmltcG9ydCB7Um9sZURhdGF9IGZyb20gXCIuLi9EYXRhL1JvbGVEYXRhXCI7XHJcbmltcG9ydCB7UGFuZWxSZXNEaWN9IGZyb20gXCIuLi9QcmVmYWJDb250cm9sL1BhbmVsUmVzRGljXCI7XHJcbmltcG9ydCB7QWdlbmN5VXNlck1lc3NhZ2V9IGZyb20gXCIuLi9BZ2VuY3kvQWdlbmN5VXNlck1lc3NhZ2VcIjtcclxuaW1wb3J0IEJ1aWxkQ0ZHIGZyb20gXCIuLi9DRkcvQnVpbGRDRkdcIjtcclxuaW1wb3J0IHsgR2xvYmFsVGlwIH0gZnJvbSBcIi4uL3V0aWxzL0dsb2JhbFRpcFwiO1xyXG5pbXBvcnQge0NhbWVyYU1hbmFnZXJ9IGZyb20gXCIuL0NhbWVyYU1hbmFnZXJcIjtcclxuaW1wb3J0IHsgRGlzcGF0Y2hlck1hbmFnZXIgfSBmcm9tIFwiLi4vdXRpbHMvRGlzcGF0Y2hlck1hbmFnZXJcIjtcclxuaW1wb3J0IHtHYW1lU3RhdGV9IGZyb20gXCIuLi91dGlscy9HYW1lU3RhdGVcIjtcclxuaW1wb3J0IHsgR2FtZVV0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL0dhbWVVdGlsc1wiO1xyXG5pbXBvcnQge0dhbWVTdGF0ZUNvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0dhbWVTdGF0ZUNvbnRyb2xcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRyb2x9IGZyb20gXCIuLi9Db250cm9sL0F1ZGlvQ29udHJvbFwiO1xyXG5pbXBvcnQge1dYR2FtZVBsYXRmb3JtfSBmcm9tIFwiLi4vV1hTREsvV1hHYW1lUGxhdGZvcm1cIjtcclxuaW1wb3J0IHsgUGxheWVyQWNjb3VudCB9IGZyb20gXCIuLi9XWFNESy9QbGF5ZXJBY2NvdW50XCI7XHJcbmltcG9ydCB7IEFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9Db250cm9sL0Fzc2V0TWFuYWdlclwiO1xyXG5pbXBvcnQgUG9vbE1hbmFnZXIgZnJvbSBcIi4uL0NvbnRyb2wvUG9vbE1hbmFnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBMYXlhLlNjcmlwdDNEIGltcGxlbWVudHMgVGltZXJDb250cm9sXHJcbntcclxuICAgIHB1YmxpYyBfdHJhbnNmb3JtOkxheWEuVHJhbnNmb3JtM0Q7XHJcbiAgICBwdWJsaWMgX2lzY2FuTW92ZTpib29sZWFuO1xyXG4gICAgcHVibGljIF9zcGVlZE1vdmVWMzpMYXlhLlZlY3RvcjM7XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNBY3Rpb25OdW1zOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2lzbmVlZGFjdGlvbm51bTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBfbmVlZGFjdGlvbnRpbWU6bnVtYmVyID0gMDtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbm93QWN0aW9uU3RhdGU6c3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgX1JvbGVEYXRhOlJvbGVEYXRhO1xyXG5cclxuICAgIHByaXZhdGUgX2FuaW1hdG9yOkxheWEuQW5pbWF0b3I7XHJcbiAgICBwcml2YXRlIF9tdWx0aXBsZTpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCAxLDEsMSApO1xyXG5cclxuICAgIHByaXZhdGUgTGVmdFRyaWFsOkxheWEuU3ByaXRlM0Q7XHJcbiAgICBwcml2YXRlIFJpZ2h0VHJpYWw6TGF5YS5TcHJpdGUzRDtcclxuXHJcbiAgICBwcml2YXRlIExhc3RBY3Rpb25TdGF0ZTpzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBfbW92ZVRpbWU6bnVtYmVyID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIOWKoOmAn2J1ZmZ2ZWNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfbGFzdGppYXN1U3RhdGU6c3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgYnVmZl9zcGVlZHVwdGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBjYW5zaGFrZTpib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHNoYWtldGltZTpudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIGRvdWJsZXNwZWVkdXA6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHJlc291c2VOYW1lOnN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zOlBsYXllcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpXHJcbiAgICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBQbGF5ZXIuaW5zID0gdGhpcztcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6UGxheWVye1xyXG4gICAgICAgIGlmKFBsYXllci5pbnMgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQbGF5ZXIuaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkF3YWtlKClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl9hbmltYXRvciA9ICh0aGlzLm93bmVyIGFzIExheWEuU3ByaXRlM0QpLmdldENvbXBvbmVudCggTGF5YS5BbmltYXRvciApO1xyXG4gICAgICAgIFByb3BNYW5hZ2VyLnNldEFuaW1hdG9yKCB0aGlzLl9hbmltYXRvciApO1xyXG4gICAgICAgIHRoaXMuX3NwZWVkTW92ZVYzID0gbmV3IExheWEuVmVjdG9yMyggMCwwLDAgKTtcclxuICAgICAgICB2YXIgc3A6TGF5YS5TcHJpdGUzRCA9IHRoaXMub3duZXIgYXMgTGF5YS5TcHJpdGUzRDtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBzcC50cmFuc2Zvcm07XHJcbiAgICAgICAgdGhpcy5fUm9sZURhdGEgPSAoUGFuZWxSZXNEaWMuSW5zdGFuY2UuZ2V0U2luZ2xlVG9uKCBBZ2VuY3lVc2VyTWVzc2FnZSApIGFzIEFnZW5jeVVzZXJNZXNzYWdlKS5Sb2xlRGF0YTtcclxuICAgICAgICAoIHNwLmdldENvbXBvbmVudCggTGF5YS5SaWdpZGJvZHkzRCApIGFzIExheWEuUmlnaWRib2R5M0QgKS5jY2RNb3Rpb25UaHJlc2hvbGQgPSAwLjAwMTtcclxuXHJcbiAgICAgICAgdmFyIExlZnRUcmlhbDEgPSBzcC5nZXRDaGlsZEJ5TmFtZShcImxlZnR0cmFpbFwiKSBhcyBMYXlhLlRyYWlsU3ByaXRlM0Q7XHJcbiAgICAgICAgdmFyIFJpZ2h0VHJpYWwxID0gc3AuZ2V0Q2hpbGRCeU5hbWUoXCJyaWdodHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcclxuICAgICAgICAvLyB0aGlzLkxlZnRUcmlhbCA9IHNwLmdldENoaWxkQnlOYW1lKFwibGVmdHRyYWlsXCIpIGFzIExheWEuVHJhaWxTcHJpdGUzRDtcclxuICAgICAgICAvLyB0aGlzLlJpZ2h0VHJpYWwgPSBzcC5nZXRDaGlsZEJ5TmFtZShcInJpZ2h0dHJhaWxcIikgYXMgTGF5YS5UcmFpbFNwcml0ZTNEO1xyXG5cclxuICAgICAgICB2YXIgc2NhbGU9MC4wMDE7XHJcbiAgICAgICAgdmFyIGluZGV4PUdhbWVVdGlscy5yYW5kUmFuZ2VpbnQoMCxBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aC0xKTtcclxuICAgICAgICBpbmRleD1pbmRleCVBc3NldE1hbmFnZXIuQWxsTWFwRGljLmxlbmd0aDtcclxuICAgICAgICB2YXIgcHJlZmFicz1Bc3NldE1hbmFnZXIuQWxsTWFwRGljW2luZGV4XTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbD1Qb29sTWFuYWdlci5HZXRTcHJpdGUzRChwcmVmYWJzKTtcclxuICAgICAgICBMZWZ0VHJpYWwxLnBhcmVudC5hZGRDaGlsZCggdGhpcy5MZWZ0VHJpYWwpO1xyXG4gICAgICAgIHRoaXMuTGVmdFRyaWFsLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uPShMZWZ0VHJpYWwxIGFzIExheWEuU3ByaXRlM0QpLnRyYW5zZm9ybS5sb2NhbFBvc2l0aW9uLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlcj0oTGVmdFRyaWFsMSBhcyBMYXlhLlNwcml0ZTNEKS50cmFuc2Zvcm0ubG9jYWxSb3RhdGlvbkV1bGVyLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5MZWZ0VHJpYWwudHJhbnNmb3JtLmxvY2FsU2NhbGU9KExlZnRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsU2NhbGUuY2xvbmUoKTtcclxuICAgICAgICB0aGlzLkxlZnRUcmlhbC50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgTGF5YS5WZWN0b3IzKHNjYWxlLHNjYWxlLHNjYWxlKTtcclxuXHJcbiAgICAgICAgdGhpcy5SaWdodFRyaWFsPVBvb2xNYW5hZ2VyLkdldFNwcml0ZTNEKHByZWZhYnMpO1xyXG4gICAgICAgIFJpZ2h0VHJpYWwxLnBhcmVudC5hZGRDaGlsZCh0aGlzLlJpZ2h0VHJpYWwpO1xyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbC50cmFuc2Zvcm0ubG9jYWxQb3NpdGlvbj0oUmlnaHRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUG9zaXRpb24uY2xvbmUoKTtcclxuICAgICAgICB0aGlzLlJpZ2h0VHJpYWwudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlcj0oUmlnaHRUcmlhbDEgYXMgTGF5YS5TcHJpdGUzRCkudHJhbnNmb3JtLmxvY2FsUm90YXRpb25FdWxlci5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuUmlnaHRUcmlhbC50cmFuc2Zvcm0ubG9jYWxTY2FsZT1uZXcgTGF5YS5WZWN0b3IzKHNjYWxlLHNjYWxlLHNjYWxlKTtcclxuICAgICAgICBSaWdodFRyaWFsMS5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgICAgTGVmdFRyaWFsMS5hY3RpdmU9ZmFsc2U7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHB1YmxpYyBfaW5pdFBvc1ZlYzpMYXlhLlZlY3RvcjM7XHJcbiAgICBwdWJsaWMgc3RhcnRSdW4oamlhc3U/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+IDAgKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZfc3BlZWR1cHRpbWUgLT0gZGlzdGltZTtcclxuICAgICAgICAgICAgICAgIFByb3BNYW5hZ2VyLkluc3RhbmNlLlNwZWVkVXBFZmZlY3QoIFwiamlhc3VsaXppXCIsdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uICk7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5kb3VibGVzcGVlZHVwIClcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5TcGVlZFVwRWZmZWN0MSggXCJqaWFzdWxpemlcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX211bHRpcGxlLnggPSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUueSA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tdWx0aXBsZS56ID0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZG91Ymxlc3BlZWR1cCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuQ2xvc2VTcGVlZFVwRWZmZWN0KCApO1xyXG4gICAgICAgICAgICAgICAgUHJvcE1hbmFnZXIuSW5zdGFuY2UuQ2xvc2VTcGVlZFVwRWZmZWN0MSggKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLmNhbnNoYWtlIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFrZXRpbWUrPSBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgaWYoIHRoaXMuc2hha2V0aW1lID49IDAuNSApXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFrZXRpbWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIFdYR2FtZVBsYXRmb3JtLkluc3RhbmNlLnZpYnJhdGVTaG9ydCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpZiggdGhpcy5fZW5kaW5nIClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRpc3RpbWU6bnVtYmVyID0gZHQvMTAwMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lICs9IGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICBpZiggdGhpcy5fbW92ZVRpbWUgPj0gdGhpcy5fZW5kYW5tb3RpbWUgKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR2FtZU92ZXIoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbm1vU3BlZWQxLnggPSB0aGlzLl9lbmRBbm1vU3BlZWQueCAqIGRpc3RpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkMS55ID0gdGhpcy5fZW5kQW5tb1NwZWVkLnkgKiBkaXN0aW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZDEueiA9IHRoaXMuX2VuZEFubW9TcGVlZC56ICogZGlzdGltZTtcclxuICAgICAgICAgICAgICAgICAgICAoIFByb3BNYW5hZ2VyLmNhcm1hLmdldENvbXBvbmVudCggQ2FtZXJhTWFuYWdlciApIGFzIENhbWVyYU1hbmFnZXIgKS5HYW1lRW5kUm90YXRlKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sIHRoaXMuX2VuZEFubW9TcGVlZDEgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgIFxyXG4gICAgcHJpdmF0ZSBfZW5kaW5nOmJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2VuZEFubW9TcGVlZDpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzKCk7XHJcbiAgICBwcml2YXRlIF9lbmRhbm1vdGltZTpudW1iZXIgPSAxO1xyXG4gICAgcHJpdmF0ZSBfZW5kQW5tb1NwZWVkMTpMYXlhLlZlY3RvcjMgPSBuZXcgTGF5YS5WZWN0b3IzO1xyXG4gICAgcHJpdmF0ZSBXaW4oKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgQXVkaW9Db250cm9sLkluc3RhbmNlLnBsYXlHYW1lU291bmQoXCJvdmVyXCIpO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5lbmQgKTtcclxuICAgICAgICB2YXIgY2FybWFUcmFuczpMYXlhLlRyYW5zZm9ybTNEID0gUHJvcE1hbmFnZXIuY2FybWEudHJhbnNmb3JtO1xyXG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC56ID0gKHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbi56IC0gMiAtIGNhcm1hVHJhbnMucG9zaXRpb24ueikvdGhpcy5fZW5kYW5tb3RpbWU7XHJcbiAgICAgICAgdGhpcy5fZW5kQW5tb1NwZWVkLnkgPSAodGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnkpL3RoaXMuX2VuZGFubW90aW1lO1xyXG4gICAgICAgIHRoaXMuX2VuZEFubW9TcGVlZC54ID0gKCB0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24ueCArIDMgLSBjYXJtYVRyYW5zLnBvc2l0aW9uLnggKSAvIHRoaXMuX2VuZGFubW90aW1lO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICB0aGlzLl9pc2Nhbk1vdmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9lbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuUGxheUFuaW1hdG9yKCBDaGFyYWN0ZXJTdGF0ZS5za3kgKTtcclxuICAgICAgICBQcm9wTWFuYWdlci5JbnN0YW5jZS5HYW1lT3ZlckVmZmVjZiggXCJ5YW5odWFcIix0aGlzLl90cmFuc2Zvcm0ucG9zaXRpb24sR2FtZVN0YXRlQ29udHJvbC5JbnN0YW5jZS5lbmRHYW1lUGxheWVyQXJyLmxlbmd0aCA9PSAwP3RydWU6ZmFsc2UgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKirlh7rnjrDlpI3mtLvnlYzpnaIgKi9cclxuICAgIHByaXZhdGUgUmV2aXZlKCk6dm9pZHtcclxuICAgICAgICBBdWRpb0NvbnRyb2wuSW5zdGFuY2UucGxheUdhbWVTb3VuZChcIm92ZXJcIik7XHJcbiAgICAgICAgR2FtZVN0YXRlLmlzZGllID0gdHJ1ZTtcclxuICAgICAgICBEaXNwYXRjaGVyTWFuYWdlci5kaXNwYXRjaEV2ZW50KCBHYW1lU3RhdGUucmV2aXZlICk7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XHJcbiAgICAgICAgLy8gdGhpcy5fZW5kaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIExvc2UoKTp2b2lke1xyXG4gICAgICAgIEF1ZGlvQ29udHJvbC5JbnN0YW5jZS5wbGF5R2FtZVNvdW5kKFwib3ZlclwiKTtcclxuICAgICAgICBHYW1lU3RhdGUuaXNkaWUgPSB0cnVlO1xyXG4gICAgICAgIERpc3BhdGNoZXJNYW5hZ2VyLmRpc3BhdGNoRXZlbnQoIEdhbWVTdGF0ZS5sb3NlICk7XHJcbiAgICAgICAgdGhpcy5faXNjYW5Nb3ZlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5QbGF5QW5pbWF0b3IoIENoYXJhY3RlclN0YXRlLnN0YW5kICk7XHJcbiAgICAgICAgdGhpcy5fZW5kaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdhbWVPdmVyKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuX2VuZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jaGFuZ2VNb3ZlWDpudW1iZXIgPSAwO1xyXG5cclxuICAgIHByaXZhdGUgaXNmb3JjZUp1bXA6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgcXVhdGVybmlvbjpMYXlhLlF1YXRlcm5pb24gPSBuZXcgTGF5YS5RdWF0ZXJuaW9uOyBcclxuICAgIFxyXG5cclxuICAgIHB1YmxpYyBUZXN0SnVtcCgpOnZvaWRcclxuICAgIHtcclxuICAgICAgICB0aGlzLm5vd0FjdGlvbiA9IENoYXJhY3RlclN0YXRlLmp1bXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlc3Ryb3koKTp2b2lkXHJcbiAgICB7XHJcbiAgICAgICAgVGltZXJTZXJ2aWNlLkluc3RhbmNlLnJlbW92ZVVwZGF0ZVRhcmdldCggdGhpcyApO1xyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgWE1vdmUoIHN0YXRlOm51bWJlciApOnZvaWRcclxuICAgIHtcclxuICAgICAgICBpZiggdGhpcy5ub3dBY3Rpb24gPT0gQ2hhcmFjdGVyU3RhdGUucnVuIClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMuX21vdmVUaW1lID0gMDtcclxuICAgICAgICAgICAgdGhpcy5fc3BlZWRNb3ZlVjMueCA9IHN0YXRlICogMjA7XHJcbiAgICAgICAgICAgIHRoaXMubm93QWN0aW9uID0gQ2hhcmFjdGVyU3RhdGUuTW92ZVg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxyXG4gICAge1xyXG4gICAgICAgIFRpbWVyU2VydmljZS5JbnN0YW5jZS5yZW1vdmVVcGRhdGVUYXJnZXQoIHRoaXMgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlc3Ryb3koKVxyXG4gICAge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi5ouW5bC+5Zue5pS25oiQ5YqfMjIyMjIyMi0tLS1cIik7XHJcbiAgICAgICAgUG9vbE1hbmFnZXIuUmVjb3ZlclNwcml0ZTNEKHRoaXMuTGVmdFRyaWFsKVxyXG4gICAgICAgIFBvb2xNYW5hZ2VyLlJlY292ZXJTcHJpdGUzRCh0aGlzLlJpZ2h0VHJpYWwpXHJcbiAgICB9XHJcblxyXG4gICAgXHJcblxyXG4gICAgXHJcbn0iLCJcclxuZXhwb3J0IGNsYXNzIEdsb2JhbCB7XHJcbiAgICBzdGF0aWMgIHN0YWdlOiBMYXlhLlN0YWdlO1xyXG4gICAgc3RhdGljICBodHRwdXJsID0gXCJcIjtcclxuICAgIHN0YXRpYyAgcmVzb3VyY2VodHR0cDpzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIHN0YXRpYyAgY2RudXJsOnN0cmluZyA9IFwiaHR0cHM6Ly93eGdhbWUuNTF5b3lveW8uY29tL1wiO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIOi1hOa6kOWQjue8gOeJiOacrOWPt1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIHZlcnNpb25zOnN0cmluZyA9IFwiXCI7Ly9cIj92PTEuMC43XCI7XHJcblxyXG4gICAgc3RhdGljICBpbml0V2lkdGg6bnVtYmVyID0gNzIwOyBcclxuXHJcbiAgICBzdGF0aWMgIGluaXRIZWlnaHQ6bnVtYmVyID0gMTI4MDsgXHJcbiAgICAvKipcclxuICAgICAqIOi1hOa6kOeJiOacrOWPt1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgIHJlc2NvbmZpZ1ZlcnNpb246c3RyaW5nID0gXCJcIjtcclxuICAgIC8qKlxyXG4gICAgICog5b2T5YmN5bmz5Y+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
|