import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ fun Ġcmd ( var arg Ġargs : ĠString , Ġdirectory : ĠFile , Ġprint To Stdout : ĠBoolean Ġ= Ġfalse ): ĠPair < Int , ĠString ?> Ġ{ Ċ // ĠĠĠ ĠMy Project . logger . info (" running Ġ" Ġ+ Ġargs . join ToString (" Ġ")) ĊĠĠĠ Ġval Ġp Ġ= ĠProcess Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. command (* args ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. redirect Error Stream ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. directory ( directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠ Ġval Ġoutput Ġ= Ġp . inputStream . buffered Reader (). use Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠLinkedList < String >() ĊĠĠĠĠĠĠĠ Ġit . lines (). peek ( lines :: add ). forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( print To Stdout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( line ) Ġ// ĠTODO Ġuse Ġa Ġlogger Ġhere Ġprint To Stdout = true Ġ-> Ġlifecycle , Ġelse Ġinfo Ġ( or Ġlower ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlines . join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġexit Ġ= Ġp . waitFor () ĊĠĠĠ Ġreturn Ġexit Ġto Ġoutput Ċ } Ċ Ċ fun Ġensure Success ( cmd : ĠPair < Int , ĠString ?> ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġ( exit , Ġoutput ) Ġ= Ġcmd ĊĠĠĠ Ġif Ġ( exit Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( output ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Failed Ġto Ġrun Ġcommand , Ġexit Ġcode Ġis Ġ$ exit ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġoutput Ċ } Ċ Ċ fun Ġbytes To Hex ( bytes : ĠByteArray ): ĠString Ġ{ ĊĠĠĠ Ġval Ġout Ġ= ĠStringBuilder () ĊĠĠĠ Ġbytes . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġout . append ( String . format ("% 0 2 X ", Ġit )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġout . toString () Ċ } Ċ