package Ġde . sk yr ising . guardian . gen . mappings Ċ Ċ import Ġcom . google . gson . JsonArray Ċ import Ġde . sk yr ising . guardian . gen .* Ċ import Ġjava . net . URI Ċ import Ġjava . nio . file . FileSystem Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ Ċ val ĠJ ARS _ MAP PED _ DIR : ĠPath Ġ= ĠJ ARS _ DIR . resolve (" mapped ") Ċ Ċ interface ĠMapping Provider Ġ{ ĊĠĠĠ Ġval Ġname : ĠString ĊĠĠĠ Ġval Ġformat : ĠM appings Parser ĊĠĠĠ Ġfun Ġget Mappings ( version : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target , Ġcache : ĠPath Ġ= ĠCACHE _ DIR . resolve (" mappings ")) : ĠCompletableFuture < Mapping Tree ?> ĊĠĠĠ Ġfun Ġsupports Version ( version : ĠVersion Info , Ġtarget : ĠMapping Target , Ġcache : ĠPath Ġ= ĠCACHE _ DIR . resolve (" mappings ")) : ĠCompletableFuture < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Latest Mappings ( version , Ġtarget , Ġcache ). then Apply Ġ{ Ġit Ġ!= Ġnull Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠgetPath ( cache : ĠPath , Ġversion : ĠVersion Info , Ġmappings : ĠString ?): ĠPath Ġ= Ġcache . resolve ( name ). resolve ( version . id ) ĊĠĠĠ Ġfun Ġget Latest Mapping Version ( version : ĠVersion Info , Ġtarget : ĠMapping Target , Ġcache : ĠPath Ġ= ĠCACHE _ DIR . resolve (" mappings ")) : ĠCompletableFuture < String ?> ĊĠĠĠ Ġfun Ġget Latest Mappings ( version : ĠVersion Info , Ġtarget : ĠMapping Target , Ġcache : ĠPath Ġ= ĠCACHE _ DIR . resolve (" mappings ")) : ĠCompletableFuture < Mapping Tree ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Latest Mapping Version ( version , Ġtarget , Ġcache ). then Compose Ġ{ Ġmv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Mappings ( version , Ġmv , Ġtarget , Ġcache ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠMO J ANG Ġ= Ġobject Ġ: ĠCommon Mapping Provider (" moj ang ", ĠPro guard Mappings , Ġ" txt ", Ġ" official ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetUrl ( cache : ĠPath , Ġversion : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target ): ĠCompletableFuture < URI ?> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ== ĠMapping Target . MER GED ) ĠCompletableFuture . completed Future ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Mo j ang Version Manifest ( version ). then Apply Ġ{ Ġmanifest Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest [" downloads "] ?. as JsonObject ?. get ( target . id Ġ+ Ġ"_ mappings ") ?. as JsonObject ?. get (" url ") ?. asString ?. let Ġ{ ĠURI ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠF AB RIC _ INTER MEDI ARY Ġ= ĠInter medi ary Mapping Provider (" fabric ", ĠURI (" https :// meta . fabric mc . net / v 2 / "), ĠURI (" https :// maven . fabric mc . net / ")) ĊĠĠĠĠĠĠĠ Ġval ĠLE G ACY _ INTER MEDI ARY Ġ= ĠInter medi ary Mapping Provider (" legacy ", ĠURI (" https :// meta . legacy fabric . net / v 2 / "), ĠURI (" https :// maven . legacy fabric . net / ")) ĊĠĠĠĠĠĠĠ Ġval ĠQU IL T _ INTER MEDI ARY Ġ= ĠInter medi ary Mapping Provider (" qu ilt ", ĠURI (" https :// meta . qu ilt mc . org / v 3 / "), ĠURI (" https :// maven . qu ilt mc . org / repository / release / ")) ĊĠĠĠĠĠĠĠ Ġval ĠY ARN Ġ= Ġobject Ġ: ĠJar Mapping Provider (" yarn ", ĠGeneric Tiny Reader ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetUrl ( cache : ĠPath , Ġversion : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target ): ĠCompletableFuture < URI ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠCommon Mapping Provider ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġformat : ĠM appings Parser , Ġprivate Ġval Ġext : ĠString , Ġprivate Ġval Ġinvert : ĠString ? Ġ= Ġnull ) Ġ: ĠMapping Provider Ġ{ ĊĠĠĠ Ġabstract Ġfun ĠgetUrl ( cache : ĠPath , Ġversion : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target ): ĠCompletableFuture < URI ?> ĊĠĠĠ Ġoverride Ġfun Ġsupports Version ( version : ĠVersion Info , Ġtarget : ĠMapping Target , Ġcache : ĠPath ): ĠCompletableFuture < Boolean > Ġ= Ġget Latest Mapping Version ( version , Ġtarget , Ġcache ). then Compose Ġ{ Ġmappings Ġ-> ĊĠĠĠĠĠĠĠ ĠgetUrl ( getPath ( cache , Ġversion , Ġmappings ), Ġversion , Ġmappings , Ġtarget ). then Apply Ġ{ Ġit Ġ!= Ġnull Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Latest Mapping Version ( version : ĠVersion Info , Ġtarget : ĠMapping Target , Ġcache : ĠPath ): ĠCompletableFuture < String ?> Ġ= ĠCompletableFuture . completed Future ( null ) ĊĠĠĠ Ġoverride Ġfun Ġget Mappings ( version : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target , Ġcache : ĠPath ): ĠCompletableFuture < Mapping Tree ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmappings File Ġ= ĠgetPath ( cache , Ġversion , Ġmappings ). resolve (" mappings -${ target . id }.${ ext }") ĊĠĠĠĠĠĠĠ Ġreturn ĠgetUrl ( getPath ( cache , Ġversion , Ġmappings ), Ġversion , Ġmappings , Ġtarget ). then Compose Ġ{ Ġurl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) ĠCompletableFuture . completed Future ( Unit ) Ġelse Ġdownload ( url , Ġmappings File ) ĊĠĠĠĠĠĠĠ Ġ}. then Apply Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( mappings File )) Ġreturn @ then Apply Async Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Ġ= ĠFiles . new BufferedReader ( mappings File ). use ( format :: parse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( invert Ġ!= Ġnull ) ĠTimer ( version . id , Ġ" mappings . invert .${ target . id } "). use Ġ{ Ġtree . invert ( invert ) Ġ} Ġelse Ġtree ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ java Class . simple Name } ($ name )" Ċ } Ċ Ċ abstract Ġclass ĠJar Mapping Provider ( override Ġval Ġname : ĠString , Ġoverride Ġval Ġformat : ĠM appings Parser ) Ġ: ĠCommon Mapping Provider ( name , Ġformat , Ġ" jar ") Ġ{ ĊĠĠĠ Ġopen Ġfun ĠgetFile ( version : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target , Ġjar : ĠFileSystem ): ĠPath Ġ= Ġjar . getPath (" mappings / mappings . tiny ") ĊĠĠĠ Ġoverride Ġfun Ġget Mappings ( version : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target , Ġcache : ĠPath ): ĠCompletableFuture < Mapping Tree ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjar File Ġ= ĠgetPath ( cache , Ġversion , Ġmappings ). resolve (" mappings -${ target . id }. jar ") ĊĠĠĠĠĠĠĠ Ġreturn ĠgetUrl ( getPath ( cache , Ġversion , Ġmappings ), Ġversion , Ġmappings , Ġtarget ). then Compose Ġ{ Ġurl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) ĠCompletableFuture . completed Future ( Unit ) Ġelse Ġdownload ( url , Ġjar File ) ĊĠĠĠĠĠĠĠ Ġ}. then Apply Async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( jar File )) Ġreturn @ then Apply Async Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Jar FileSystem ( jar File ). use Ġ{ Ġfs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . new BufferedReader ( getFile ( version , Ġmappings , Ġtarget , Ġfs )). use ( format :: parse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠInter medi ary Mapping Provider ( prefix : ĠString , Ġprivate Ġval Ġmeta : ĠURI , Ġprivate Ġval Ġmaven : ĠURI ) Ġ: ĠJar Mapping Provider ("$ prefix - inter medi ary ", ĠGeneric Tiny Reader ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetUrl ( cache : ĠPath , Ġversion : ĠVersion Info , Ġmappings : ĠString ?, Ġtarget : ĠMapping Target ): ĠCompletableFuture < URI ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( target Ġ!= ĠMapping Target . MER GED ) Ġreturn ĠCompletableFuture . completed Future ( null ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest Json < JsonArray >( meta . resolve (" versions / inter medi ary /${ version . id } ")). handle Ġ{ Ġit , Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġ!= Ġnull ) Ġnull Ġelse Ġit ĊĠĠĠĠĠĠĠ Ġ}. then Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull Ġ|| Ġit . size () Ġ== Ġ 0 ) Ġreturn @ then Apply Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspec : ĠArtifact Spec Ġ= ĠG SON . fromJson ( it [ 0 ]. as JsonObject [" maven "]) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMaven Artifact ( maven , Ġspec . copy ( classifier Ġ= Ġ" v 2 ")). get URL () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠMapping Target ( val Ġid : ĠString ) Ġ{ ĊĠĠĠ ĠCLIENT (" client "), ĠSERVER (" server "), ĠMER GED (" merged "); Ċ } Ċ Ċ fun Ġget Mappings ( provider : ĠMapping Provider , Ġversion : ĠVersion Info , Ġtarget : ĠMapping Target , Ġcache : ĠPath Ġ= ĠCACHE _ DIR . resolve (" mappings ")) : ĠCompletableFuture < Mapping Tree ?> Ġ{ ĊĠĠĠ Ġreturn Ġprovider . get Latest Mappings ( version , Ġtarget , Ġcache ). then Compose Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull Ġ|| Ġtarget Ġ!= ĠMapping Target . MER GED ) Ġreturn @ then Compose ĠCompletableFuture . completed Future ( it ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġprovider . get Latest Mappings ( version , ĠMapping Target . CLIENT , Ġcache ) ĊĠĠĠĠĠĠĠ Ġval Ġserver Ġ= Ġprovider . get Latest Mappings ( version , ĠMapping Target . SERVER , Ġcache ) ĊĠĠĠĠĠĠĠ ĠTimer ( version . id , Ġ" mappings . merge "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompletableFuture . all Of ( client , Ġserver ). then Apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġclient . get () Ġ?: Ġreturn @ then Apply Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġserver . get () Ġ?: Ġreturn @ then Apply Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . merge ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }