package Ġcom . ur iel sal is . m cc r ash lib . parser Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . Option Ċ import Ġcom . ur iel sal is . m cc r ash lib . Crash Ċ import Ġcom . ur iel sal is . m cc r ash lib . de ob fusc ator . get De ob fusc ation Ċ import Ġjava . io . File Ċ Ċ /* ĊĠĠĠ ĠMinecraft Ġcrashes Ġare Ġseparated Ġinto Ġsections Ġstarting Ġand Ġending Ġwith Ġ-- ĊĠĠĠ Ġ" Minecraft Ġcrash Ġreport " Ġcontains Ġthe Ġexception , Ġ" System ĠDetails " Ġcontains Ġmore Ġinformation ĊĠĠĠ ĠThe Ġexception Ġstarts Ġwith Ġjava . lang Ġand Ġits Ġall Ġlines Ġuntil Ġthe Ġfirst Ġempty Ġline ĊĠĠĠ ĠSystem Ġdetails Ġcontains Ġa Ġ: Ġseparated Ġkey Ġvalue Ġpair . ĠWe Ġcare Ġabout ĠIs ĠMod ded Ċ Ġ*/ Ċ private Ġconst Ġval Ġcrash Report Section Ġ= Ġ" Minecraft ĠCrash ĠReport " Ċ private Ġconst Ġval Ġsystem Details Section Ġ= Ġ" System ĠDetails " Ċ private Ġconst Ġval Ġis Mod ded Ġ= Ġ" Is ĠMod ded " Ċ private Ġconst Ġval Ġm inecraft Version Ġ= Ġ" Minecraft ĠVersion " Ċ private Ġconst Ġval Ġm inecraft Version Id Ġ= Ġ" Minecraft ĠVersion ĠID " Ċ private Ġconst Ġval Ġtype Section Ġ= Ġ" Type " Ċ Ċ private Ġconst Ġval Ġaffected Level Section Ġ= Ġ" Affected Ġlevel " Ċ private Ġconst Ġval Ġlevel Was Mod ded Ġ= Ġ" Level Ġwas Ġmod ded " Ċ Ċ class ĠMinecraft Crash Parser Ġ: ĠCrash Parser Ġ{ ĊĠĠĠ Ġobject ĠSe ctions NotFound Ġ: ĠParser Error ĊĠĠĠ Ġobject ĠNo Exception Found Ġ: ĠParser Error ĊĊĠĠĠ Ġoverride Ġfun Ġparse ( lines : ĠList < String >, Ġmappings Directory : ĠFile ): ĠEither < Parser Error , ĠCrash > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsections Ġ= Ġparse Sections ( lines ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! sections . containsKey ( crash Report Section ) Ġ|| Ġ! sections . containsKey ( system Details Section )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEither . left ( Sections NotFound ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdetails Ġ= Ġget Details ( sections [ system Details Section ] Ġ?: Ġerror (" System Ġdetails Ġsection Ġnot Ġfound ")) ĊĠĠĠĠĠĠĠ Ġval Ġaffected Level Ġ= Ġsections [ affected Level Section ]?. let (:: get Details ) ĊĠĠĠĠĠĠĠ Ġval Ġis Mod ded Ġ= Ġis Game Mod ded ( details ) Ġ|| Ġaffected Level ?. let (:: was Level Mod ded ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= Ġget Exception ( sections [ crash Report Section ] Ġ?: Ġerror (" Crash Ġreport Ġsection Ġnot Ġfound ")) ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġget Minecraft Version ( details ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠgetType ( details ) ĊĠĠĠĠĠĠĠ Ġval Ġis Client Ġ= Ġtype . contains (" map _ client . txt ") ĊĠĠĠĠĠĠĠ Ġval Ġde ob f Ġ= Ġif Ġ( is Mod ded Ġ|| Ġversion Ġ== Ġnull ) Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget De ob fusc ation ( version , Ġlines . join ToString ("\ n "), Ġis Client , Ġmappings Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġexception Ġfor Ġmissing Ġmappings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexception . fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠEither . left ( No Exception Found ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEither . right ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrash . Minecraft ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mod ded , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Client , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde ob f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Exception ( de ob f ?. split ("\ n ") Ġ?: Ġempty List ()). or Null () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Minecraft Version ( details : ĠMap < String , ĠString >) Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠFall Ġback Ġto Ġlooking Ġup Ġ" Minecraft ĠVersion "; Ġolder Ġversions Ġdid Ġnot Ġhave Ġ" Minecraft ĠVersion ĠID " ĊĠĠĠĠĠĠĠ Ġdetails [ minecraft Version Id ] Ġ?: Ġdetails [ minecraft Version ] ĊĊĠĠĠ Ġprivate Ġfun ĠgetType ( details : ĠMap < String , ĠString >) Ġ= Ġdetails . get OrDefault ( type Section , Ġ" Client Ġ( map _ client . txt )") ĊĊĠĠĠ Ġprivate Ġfun Ġis Game Mod ded ( details : ĠMap < String , ĠString >) Ġ= ĊĠĠĠĠĠĠĠ Ġdetails . containsKey ( is Mod ded ) Ġ&& Ġwith ( details [ is Mod ded ] Ġ?: Ġerror (" Is ĠMod ded Ġnot Ġfound ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! contains (" Prob ably ĠNot ", Ġtrue ) Ġ&& Ġ! contains (" Unknown ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwas Level Mod ded ( affected Level Details : ĠMap < String , ĠString >) Ġ= ĊĠĠĠĠĠĠĠ Ġaffected Level Details [ level Was Mod ded ] Ġ== Ġ" true " ĊĊĠĠĠ Ġprivate Ġfun Ġget Exception ( lines : ĠList < String >): ĠOption < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfound Start Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġlines . map ( String :: trim ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! found Start Ġ-> Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith (" java . lang ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith (" java . util ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith (" org . lwjgl ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Start Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isBlank () Ġ-> Ġreturn ĠOption . just ( builder . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuilder . append ("\ n " Ġ+ Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠOption . empty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Details ( list : ĠList < String >) Ġ= Ġlist ĊĠĠĠĠĠĠĠ Ġ. map ( String :: trim ) ĊĠĠĠĠĠĠĠ Ġ. associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpairs Ġ= Ġit . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpairs . first () Ġto Ġpairs . getOrElse ( 1 ) Ġ{ Ġ"" Ġ}. remove Prefix (" Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Sections ( lines : ĠList < String >): ĠMap < String , ĠList < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsections Ġ= Ġmutable Map Of < String , ĠList < String >>() ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Lines Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġvar Ġsection Name Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġlines . map ( String :: trim ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . startsWith ("-- ") Ġ&& Ġit . endsWith ("-- ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsections [ section Name ] Ġ= Ġcurrent Lines . toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Lines . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsection Name Ġ= Ġit . replace ("- ", Ġ""). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Lines . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsections [ section Name ] Ġ= Ġcurrent Lines ĊĠĠĠĠĠĠĠ Ġreturn Ġsections ĊĠĠĠ Ġ} Ċ } Ċ