/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 8 ĠSee ĠAUTHORS Ġfile . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . kot cr ab . f ate . nano ha . patch er Ċ Ċ import Ġcom . kot cr ab . f ate . nano ha . file . Pac File Entry Ċ import Ġcom . kot cr ab . f ate . util . write Dat String Ċ import Ġk io . K io OutputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ Ċ /** Ġ@ author ĠK ot cr ab Ġ*/ Ċ class ĠPac Writer ( private Ġval Ġpac Entries : ĠList < Pac File Entry >) Ġ{ ĊĠĠĠ Ġfun Ġwrite ToFile ( out : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġpac Entries . map Ġ{ ĠEntry Intermediate ( it , Ġ- 1 , Ġ- 1 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġname Bytes Ġ= Ġwith ( K io OutputStream ( ByteArray OutputStream ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Local Ptr Ġ= Ġpos () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Dat String ( it . entry . fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalign ( 0 x 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget As ByteArray OutputStream (). toByteArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġdata Bytes Ġ= Ġwith ( K io OutputStream ( ByteArray OutputStream ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data Local Ptr Ġ= Ġpos () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bytes ( it . entry . bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalign ( 0 x 1 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget As ByteArray OutputStream (). toByteArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbs Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġwith ( K io OutputStream ( bs )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Size Ġ= Ġ 0 x 2 0 Ġ+ Ġ 0 x 2 0 Ġ* Ġpac Entries . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite String (" add ", Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 4 ) Ġ// version ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 x 2 0 ) Ġ// offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 x 2 0 ) Ġ// offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( pac Entries . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( header Size Ġ+ Ġname Bytes . size Ġ+ Ġdata Bytes . size ) Ġ// file Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 ) Ġ// dummy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 ) Ġ// dummy ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġentries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( header Size Ġ+ Ġname Bytes . size Ġ+ Ġit . data Local Ptr ) Ġ// file Ġdata Ġptr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( it . entry . file Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 ) Ġ// dummy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( it . entry . time t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( header Size Ġ+ Ġit . name Local Ptr ) Ġ// file Ġname Ġptr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 ) Ġ// dummy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 ) Ġ// dummy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( 0 ) Ġ// dummy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bytes ( name Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Bytes ( data Bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġout . write Bytes ( bs . toByteArray ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠEntry Intermediate ( val Ġentry : ĠPac File Entry , Ġvar Ġname Local Ptr : ĠInt , Ġvar Ġdata Local Ptr : ĠInt ) Ċ