package Ġcom . j ere k sel . lib res ub str atum lib Ċ Ċ import Ġjava . io . File Ċ import Ġjava . util . zip . Zip File Ċ Ċ class ĠTheme Reader Ġ{ ĊĊĠĠĠ Ġfun Ġread Theme Pack ( location : ĠFile ): ĠTheme Pack Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġoverlay s Location Ġ= ĠFile ( location , Ġ" overlay s ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! overlay s Location . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Overlay s Ġdirectory Ġdoesn 't Ġexists : Ġ$ overlay s Location ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġthe med Packages Ġ= Ġoverlay s Location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isDirectory Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġread Theme ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTheme Pack ( the med Packages , Ġread Type 3 Data ( overlay s Location )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Theme ( location : ĠFile ) Ġ= ĠTheme ( location . name , Ġread Type 1 Data ( location ), Ġread Type 2 Data ( location )) ĊĊĠĠĠ Ġfun Ġread Type 1 Data ( location : ĠFile ): ĠList < Type 1 Data > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Map Ġ= Ġmutable Map Of < String , ĠMutable List < Type 1 Extension >>() ĊĊĠĠĠĠĠĠĠ Ġlocation . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name . startsWith (" type 1 ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : ĠRefactor Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġ"${ it . name [ 5 ]}" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name . length Ġ== Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Map . get Or Put ( type , Ġ{ Ġmutable ListOf () Ġ}). add ( Type 1 Extension ( it . read Text (), Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . name . substring ( 7 ). remove Suffix (". xml ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Map . get Or Put ( type , Ġ{ Ġmutable ListOf () Ġ}). add ( Type 1 Extension ( name , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtype Map . map Ġ{ ĠType 1 Data ( it . value , Ġit . key ) Ġ}. sorted By Ġ{ Ġit . suffix Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Type 2 Data ( dir : ĠFile ): ĠType 2 Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype 2 File Ġ= ĠFile ( dir , Ġ" type 2 ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! type 2 File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Type Ġ= ĠType 2 Extension ( type 2 File . read Text (). trim (), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġdir . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isDirectory Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name . startsWith (" type 2 ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . name . remove Prefix (" type 2 _ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠType 2 Extension ( it , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠType 2 Data ( listOf ( first Type , Ġ* rest )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Type 3 Data ( location : ĠFile ): ĠType 3 Data ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġlocation . list Files ()[ 0 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġtype 3 File Ġ= ĠFile ( dir , Ġ" type 3 ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! type 3 File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Type Ġ= ĠType 3 Extension ( type 3 File . read Text (). trim (), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġrest Ġ= Ġdir . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isDirectory Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . name . startsWith (" type 3 ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . name . remove Prefix (" type 3 _ ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠType 3 Extension ( it , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠType 3 Data ( listOf ( first Type , Ġ* rest )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck If Encrypted ( apk : ĠFile ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠZip File ( apk ). use Ġ{ Ġzip File Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Ġ= Ġzip File . entries (). as Sequence (). first OrNull Ġ{ Ġit . name . endsWith (". enc ") Ġ} ?. name ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enc Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// No Ġencrypted Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnon Enc Ġ= Ġenc . remove Suffix (". enc ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip File . getEntry ( non Enc ) Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }