// ĠCopyright Ġ 2 0 2 1 Ġy u ye zh ong @ gmail . com Ċ // Ċ // ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ // Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ċ // ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ // ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ // ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ // Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ċ package Ġc fig . pack able Ċ Ċ import Ġc fig . utils . Sparse Img Parser Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . create Instance Ċ import Ġkotlin . reflect . full . declared Functions Ċ import Ġkotlin . system . exit Process Ċ Ċ class ĠPack able Launcher Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Pack able Launcher :: class . java ) ĊĠĠĠ Ġval Ġpack able Pool Ġ= Ġmutable Map Of < List < String >, ĠK Class < IP ack able >>() ĊĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠD t bo Parser (), ĠVB Meta Parser (), ĠBoot Img Parser (), ĠSparse Img Parser (), ĠVendor Boot Parser (), ĠPayload Bin Parser (), ĊĠĠĠĠĠĠĠ ĠMisc Img Parser () ĊĠĠĠ Ġ). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġpack able Pool . put ( it . capabilities (), Ġit :: class Ġas ĠK Class < IP ack able >) ĊĠĠĠ Ġ} ĊĠĠĠ Ġpack able Pool . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug ("" Ġ+ Ġit . key Ġ+ Ġ"/" Ġ+ Ġit . value ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġtarget File : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġtarget Handler : ĠK Class < IP ack able >? Ġ= Ġnull ĊĠĠĠ Ġrun Ġfound @{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( current Loop No Ġin Ġ 0 .. 1 ) Ġ{ Ġ// currently Ġwe Ġhave Ġonly Ġ 2 Ġloops ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile (". "). list Files () !!. forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpack able Pool ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . create Instance (). loop No Ġ== Ġcurrent Loop No Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġp . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Pattern . compile ( item ). matcher ( file . name ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Found : Ġ" Ġ+ Ġfile . name Ġ+ Ġ", Ġ" Ġ+ Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget File Ġ= Ġfile . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Handler Ġ= Ġp . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ found ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}// end - of - file - tra ver sing ĊĠĠĠĠĠĠĠ Ġ}// end - of - range - loop ĊĠĠĠ Ġ}// end - of - found @ ĊĊĠĠĠ Ġ// Ġ/* Ġ 1 Ġ*/ Ġno - args Ġ& Ġno - handler : Ġhelp Ġfor ĠIP ack able ĊĠĠĠ Ġ// Ġ/* Ġ 2 Ġ*/ Ġno - args Ġ& Ġhandler ĠĠ Ġ: Ġhelp Ġfor ĠHandler ĊĠĠĠ Ġ// Ġ/* Ġ 3 Ġ*/ Ġargs ĠĠĠ Ġ& Ġno - handler : Ġdo Ġnothing ĊĠĠĠ Ġ// Ġ/* Ġ 4 Ġ*/ Ġargs ĠĠĠ Ġ& Ġhandler ĠĠ Ġ: Ġwork ĊĠĠĠ Ġwhen Ġ( listOf ( args . isEmpty (), Ġtarget Handler Ġ== Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( true , Ġtrue ) Ġ-> Ġ{ Ġ/* Ġ 1 Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" help :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" available ĠIP ack able Ġsub commands Ġare :") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIP ack able :: class . declared Functions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ("\ t " Ġ+ Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf ( true , Ġfalse ) Ġ-> Ġ{/* Ġ 2 Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" available Ġ${ target Handler !!. simple Name } Ġsub commands Ġare :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Handler !!. declared Functions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ("\ t " Ġ+ Ġit . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf ( false , Ġtrue ) Ġ-> Ġ{/* Ġ 3 Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" No Ġhandler Ġis Ġactivated , ĠDO ĠNOT H ING !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠlistOf ( false , Ġfalse ) Ġ-> Ġ{/* Ġ 4 Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" continue Ġ... ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtarget Handler ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . warn (" [$ target File ] Ġwill Ġbe Ġhandled Ġby Ġ[ ${ it . simple Name }] ") ĊĠĠĠĠĠĠĠ Ġval Ġfunctions Ġ= Ġit . declared Functions . filter Ġ{ Ġfunc Item Ġ-> Ġfunc Item . name Ġ== Ġargs [ 0 ] Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( functions . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" command Ġ'${ args [ 0 ]} ' Ġcan Ġnot Ġbe Ġrecognized ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" available Ġ${ it . simple Name } Ġsub commands Ġare :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . declared Functions . forEach Ġ{ Ġthe Func Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ("\ t " Ġ+ Ġthe Func . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . warn ("' ${ args [ 0 ]} ' Ġsequence Ġinitialized ") ĊĠĠĠĠĠĠĠ Ġval Ġreflect Ret Ġ= Ġwhen Ġ( functions [ 0 ]. parameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions [ 0 ]. call ( it . create Instance ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions [ 0 ]. call ( it . create Instance (), Ġtarget File !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( args . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" invoke : Ġ${ it . qualified Name }, Ġ$ target File , Ġ" Ġ+ Ġtarget File !!. remove Suffix (". img ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions [ 0 ]. call ( it . create Instance (), Ġtarget File !! , Ġtarget File !!. remove Suffix (". img ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" invoke : Ġ${ it . qualified Name }, Ġ$ target File , Ġ" Ġ+ Ġargs [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions [ 0 ]. call ( it . create Instance (), Ġtarget File !! , Ġargs [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunctions [ 0 ]. parameters . forEach Ġ{ Ġkp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Param : Ġ" Ġ+ Ġkp . index Ġ+ Ġ" Ġ" Ġ+ Ġkp . type Ġ+ Ġ" Ġ" Ġ+ Ġkp . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" I Ġam Ġconfused Ġby Ġso Ġmany Ġparameters ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( functions [ 0 ]. returnType . toString () Ġ!= ĠUnit . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" ret : Ġ$ reflect Ret ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . warn ("' ${ args [ 0 ]} ' Ġsequence Ġcompleted ") ĊĠĠĠ Ġ} Ċ } Ċ