/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 ĠMat thew ĠN el son Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġhttps :// 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 Ġio . mat the wn el son . k mp . tor Ċ Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . FILE _ NAME _ K MPT OR _ ZIP Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . FILE _ NAME _ K MPT OR _ ZIP _ SHA 2 5 6 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ SHA 2 5 6 _ LINUX _ X 6 4 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ SHA 2 5 6 _ LINUX _ X 8 6 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ SHA 2 5 6 _ MAC OS _ X 6 4 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ SHA 2 5 6 _ M ING W _ X 6 4 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ SHA 2 5 6 _ M ING W _ X 8 6 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ MAN IFEST _ LINUX _ X 6 4 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ MAN IFEST _ LINUX _ X 8 6 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ MAN IFEST _ MAC OS _ X 6 4 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ MAN IFEST _ M ING W _ X 6 4 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Constants Bin aries . ZIP _ MAN IFEST _ M ING W _ X 8 6 Ċ import Ġio . mat the wn el son . k mp . tor . binary . extract . Zip Archive Extractor Ċ import Ġio . mat the wn el son . k mp . tor . internal . does Content Match Expected Ċ import Ġio . mat the wn el son . k mp . tor . manager . common . event . Tor Manager Event Ċ import Ġio . mat the wn el son . k mp . tor . manager . common . exceptions . Tor Manager Exception Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠChoose Ġbetween Ġthe Ġfollowing Ġsupported Ġplatforms : Ċ Ġ* Ġ Ġ- Ġ[ linux X 6 4 ] Ċ Ġ* Ġ Ġ- Ġ[ linux X 8 6 ] Ċ Ġ* Ġ Ġ- Ġ[ macos X 6 4 ] Ċ Ġ* Ġ Ġ- Ġ[ mingw X 6 4 ] Ċ Ġ* Ġ Ġ- Ġ[ mingw X 8 6 ] Ċ Ġ* Ċ Ġ* ĠThis Ġwill Ġautomatically Ġextract ĠTor ĠBin aries Ġin Ġaccordance Ġwith Ġyour Ċ Ġ* Ġchosen Ġ[ install Option ] Ġfor Ġthe Ġgiven Ġplatform Ġand Ġarchitecture . Ċ Ġ* Ċ Ġ* ĠThe Ġbinary Ġdependencies Ġfor ĠJava / Node Js Ġare Ġnot Ġautomatically Ġimported Ċ Ġ* Ġlike Ġother Ġplatforms Ġfor Ġk mp - tor , Ġand Ġmust Ġbe Ġdeclared Ġindependently Ċ Ġ* Ġfrom Ġthe Ġ` k mp - tor ` Ġdependency . Ċ Ġ* Ġ*/ Ċ class ĠPlatform Installer Ġprivate Ġconstructor ( ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġos : ĠString , ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġarch : ĠString , ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġsha 2 5 6 Sum : ĠString , ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġinstall Option : ĠInstall Option , ĊĠĠĠ Ġprivate Ġval Ġarchive Manifest Provider : Ġ() Ġ-> ĠList < String >, Ċ ) Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠInstall Option Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPerform Ġa Ġclean Ġinstall Ġof ĠTor Ġbinaries Ġevery Ġtime ĠTor Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġstarted . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ ĠClean Install On Each Start , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPerform Ġa Ġclean Ġinstall Ġof ĠTor Ġbinaries Ġon Ġfirst Ġstartup ĊĠĠĠĠĠĠĠĠ Ġ* Ġof ĠTor Ġfor Ġthe ĠApplication 's Ġruntime . ĠSub sequent Ġstart ups ĊĠĠĠĠĠĠĠĠ Ġ* Ġwill Ġonly Ġperform Ġa Ġclean Ġinstall Ġif Ġbinary Ġfiles Ġare Ġmissing . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ ĠClean Install First Start Only , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPerform Ġa Ġclean Ġinstall Ġof ĠTor Ġbinaries Ġonly Ġif Ġthey Ġare Ġmissing ĊĠĠĠĠĠĠĠĠ Ġ* Ġfrom Ġthe Ġspecified Ġdirectory . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠNote Ġthat Ġupon Ġsuccessful Ġextraction Ġof Ġbinaries , Ġthe Ġk mpt or . zip ĊĠĠĠĠĠĠĠĠ Ġ* Ġfile 's Ġsha 2 5 6 sum Ġvalue Ġis Ġalways Ġwritten Ġto Ġa Ġfile Ġin Ġthe Ġspecified ĊĠĠĠĠĠĠĠĠ Ġ* Ġinstallation Ġdirectory Ġ( ie : Ġ[ FILE _ NAME _ K MPT OR _ ZIP _ SHA 2 5 6 ]). ĠThat ĊĠĠĠĠĠĠĠĠ Ġ* Ġpersisted Ġvalue Ġis Ġchecked Ġagainst Ġ[ sha 2 5 6 Sum ] Ġsuch Ġthat Ġupon ĊĠĠĠĠĠĠĠĠ Ġ* Ġdependency Ġupdates Ġwhere Ġnew Ġbinary 's Ġare Ġpresent , Ġa Ġclean Ġinstall ĊĠĠĠĠĠĠĠĠ Ġ* Ġcan Ġbe Ġtriggered . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ ĠClean Install If Missing , ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġos ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLIN UX Ġ= Ġ" linux " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAC OS Ġ= Ġ" macos " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠM ING W Ġ= Ġ" mingw " ĊĊĠĠĠĠĠĠĠ Ġ// Ġarch ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX 6 4 Ġ= Ġ" x 6 4 " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠX 8 6 Ġ= Ġ" x 8 6 " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTOR Ġ= Ġ" tor " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġlinux X 6 4 ( option : ĠInstall Option ): ĠPlatform Installer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPlatform Installer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Ġ= ĠLIN UX , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarch Ġ= ĠX 6 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsha 2 5 6 Sum Ġ= ĠZIP _ SHA 2 5 6 _ LINUX _ X 6 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Option Ġ= Ġoption , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Manifest Provider Ġ= Ġ{ ĠZIP _ MAN IFEST _ LINUX _ X 6 4 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġlinux X 8 6 ( option : ĠInstall Option ): ĠPlatform Installer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPlatform Installer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Ġ= ĠLIN UX , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarch Ġ= ĠX 8 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsha 2 5 6 Sum Ġ= ĠZIP _ SHA 2 5 6 _ LINUX _ X 8 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Option Ġ= Ġoption , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Manifest Provider Ġ= Ġ{ ĠZIP _ MAN IFEST _ LINUX _ X 8 6 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmac os X 6 4 ( option : ĠInstall Option ): ĠPlatform Installer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPlatform Installer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Ġ= ĠMAC OS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarch Ġ= ĠX 6 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsha 2 5 6 Sum Ġ= ĠZIP _ SHA 2 5 6 _ MAC OS _ X 6 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Option Ġ= Ġoption , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Manifest Provider Ġ= Ġ{ ĠZIP _ MAN IFEST _ MAC OS _ X 6 4 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġm ing w X 6 4 ( option : ĠInstall Option ): ĠPlatform Installer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPlatform Installer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Ġ= ĠM ING W , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarch Ġ= ĠX 6 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsha 2 5 6 Sum Ġ= ĠZIP _ SHA 2 5 6 _ M ING W _ X 6 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Option Ġ= Ġoption , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Manifest Provider Ġ= Ġ{ ĠZIP _ MAN IFEST _ M ING W _ X 6 4 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġm ing w X 8 6 ( option : ĠInstall Option ): ĠPlatform Installer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPlatform Installer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġos Ġ= ĠM ING W , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarch Ġ= ĠX 8 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsha 2 5 6 Sum Ġ= ĠZIP _ SHA 2 5 6 _ M ING W _ X 8 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall Option Ġ= Ġoption , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Manifest Provider Ġ= Ġ{ ĠZIP _ MAN IFEST _ M ING W _ X 8 6 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠMutex () ĊĠĠĠ Ġprivate Ġval Ġinstallation Dirs : ĠMutable Set < String > Ġ= ĠLinked HashSet ( 1 ) ĊĊĠĠĠ Ġ@ get : Jvm Name (" is Linux ") ĊĠĠĠ Ġval Ġis Linux : ĠBoolean Ġget () Ġ= Ġos Ġ== ĠLIN UX ĊĠĠĠ Ġ@ get : Jvm Name (" is Mac os ") ĊĠĠĠ Ġval Ġis Mac os : ĠBoolean Ġget () Ġ= Ġos Ġ== ĠMAC OS ĊĠĠĠ Ġ@ get : Jvm Name (" is M ing w ") ĊĠĠĠ Ġval Ġis M ing w : ĠBoolean Ġget () Ġ= Ġos Ġ== ĠM ING W ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDe comp resses Ġarchive Ġfile Ġcontents Ġand Ġextract s Ġthem Ġto Ġspecified ĊĠĠĠĠ Ġ* Ġ[ installation Dir ] Ġif Ġneeded . ĠReturns Ġfile Ġneeded Ġfor Ġstarting ĠTor . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġ@ Jvm Synt hetic ĊĠĠĠ Ġ@ Throws ( Tor Manager Exception :: class ) ĊĠĠĠ Ġinternal Ġsuspend Ġfun Ġretrieve Tor ( ĊĠĠĠĠĠĠĠ Ġinstallation Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġnotify : Ġ( Tor Manager Event . Log . Debug ) Ġ-> ĠUnit , ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( install Option ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstall Option . Clean Install On Each Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Clean Install ( installation Dir , Ġnotify ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstall Option . Clean Install First Start Only Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanonical Path Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstallation Dir . canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTor Manager Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġretrieve Ġcanonical Ġpath Ġof Ġinstallation Ġdir ", Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( installation Dirs . contains ( canonical Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Clean Install If Missing ( installation Dir , Ġnotify ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtor Ġ= Ġdo Clean Install ( installation Dir , Ġnotify ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstallation Dirs . add ( canonical Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInstall Option . Clean Install If Missing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Clean Install If Missing ( installation Dir , Ġnotify ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Tor Manager Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdo Clean Install ( ĊĠĠĠĠĠĠĠ Ġinstallation Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġnotify : Ġ( Tor Manager Event . Log . Debug ) Ġ-> ĠUnit , ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify . invoke ( Tor Manager Event . Log . Debug ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Perform ing Ġclean Ġinstall Ġof ĠTor Ġbinaries Ġto Ġdirectory : Ġ$ installation Dir " ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtor : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġextractor Ġ= ĠZip Archive Extractor . all ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Dir Ġ= Ġinstallation Dir , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Extraction Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . name Without Extension . lowercase () Ġ== ĠTOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtor Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set Executable ( true , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlet Ġcomplete Ġto Ġthrow Ġexception . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( installation Dir , ĠFILE _ NAME _ K MPT OR _ ZIP _ SHA 2 5 6 ). write Text ( sha 2 5 6 Sum ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip FileStream Provider Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"/ k mpt or /$ os /$ arch /$ FILE _ NAME _ K MPT OR _ ZIP " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class . getResource AsStream ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIOException (" Failed Ġto Ġobtain Ġresource Ġstream Ġat Ġpath : Ġ$ path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextractor . extract () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTor Manager Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtor Ġ?: Ġthrow ĠTor Manager Exception (" Failed Ġto Ġextract Ġand Ġretrieve Ġthe ĠTor Ġexecutable ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Tor Manager Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdo Clean Install If Missing ( ĊĠĠĠĠĠĠĠ Ġinstallation Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġnotify : Ġ( Tor Manager Event . Log . Debug ) Ġ-> ĠUnit , ĊĠĠĠ Ġ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsha 2 5 6 Sum File Ġ= ĠFile ( installation Dir , ĠFILE _ NAME _ K MPT OR _ ZIP _ SHA 2 5 6 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! sha 2 5 6 Sum File . does Content Match Expected ( sha 2 5 6 Sum )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Clean Install ( installation Dir , Ġnotify ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġtor : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġexists Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġarchive Manifest Files Ġ= Ġarchive Manifest Provider . invoke (). to Manifest Files ( installation Dir ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġarchive Manifest Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexists Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . name Without Extension . lowercase () Ġ== ĠTOR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtor Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( archive Manifest Files . size Ġ== Ġexists Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify . invoke ( Tor Manager Event . Log . Debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Tor Ġbinaries Ġdetected . ĠSk ipping Ġextraction " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Clean Install ( installation Dir , Ġnotify ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġdo Clean Install ( installation Dir , Ġnotify ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < String >. to Manifest Files ( installation Dir : ĠFile ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew List : ĠMutable List < File > Ġ= ĠArrayList ( size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexclude Ġdirectories ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . endsWith ('/ ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew List . add ( File ( installation Dir , Ġentry )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew List ĊĠĠĠ Ġ} Ċ } Ċ