package Ġcom . ste ves ol ty s . seed vault . transport . backup Ċ Ċ import Ġandroid . app . backup . Backup Data Input Ċ import Ġandroid . app . backup . Backup Transport . FLAG _ DATA _ NOT _ CHANGED Ċ import Ġandroid . app . backup . Backup Transport . FLAG _ INCREMENT AL Ċ import Ġandroid . app . backup . Backup Transport . FLAG _ NON _ INCREMENT AL Ċ import Ġandroid . app . backup . Backup Transport . TRANSPORT _ ERROR Ċ import Ġandroid . app . backup . Backup Transport . TRANSPORT _ NON _ INCREMENT AL _ BACKUP _ REQUIRED Ċ import Ġandroid . app . backup . Backup Transport . TRANSPORT _ OK Ċ import Ġandroid . content . pm . Package Info Ċ import Ġcom . ste ves ol ty s . seed vault . getRandom String Ċ import Ġcom . ste ves ol ty s . seed vault . header . MAX _ KEY _ LENGTH _ SIZE Ċ import Ġcom . ste ves ol ty s . seed vault . header . VERSION Ċ import Ġcom . ste ves ol ty s . seed vault . header . get AD For KV Ċ import Ġcom . ste ves ol ty s . seed vault . plugins . Storage Plugin Ċ import Ġio . mock k . Capt uring Slot Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertFalse Ċ import Ġorg . junit . jupiter . api . Assertions . assertTrue Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . IOException Ċ import Ġkotlin . random . Random Ċ Ċ @ Suppress (" Blocking Method In Non Blocking Context ") Ċ internal Ġclass ĠK V Backup Test Ġ: ĠBackup Test () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġplugin Ġ= Ġmock k < Storage Plugin >() ĊĠĠĠ Ġprivate Ġval Ġdata Input Ġ= Ġmock k < Backup Data Input >() ĊĠĠĠ Ġprivate Ġval Ġdb Manager Ġ= Ġmock k < Kv Db Manager >() ĊĊĠĠĠ Ġprivate Ġval Ġbackup Ġ= ĠK V Backup ( plugin , Ġsettings Manager , Ġinput Factory , Ġcrypto , Ġdb Manager ) ĊĊĠĠĠ Ġprivate Ġval Ġdb Ġ= Ġmock k < KV Db >() ĊĠĠĠ Ġprivate Ġval ĠpackageName Ġ= Ġpackage Info . packageName ĊĠĠĠ Ġprivate Ġval Ġkey Ġ= ĠgetRandom String ( MAX _ KEY _ LENGTH _ SIZE ) ĊĠĠĠ Ġprivate Ġval Ġdata Value Ġ= ĠRandom . next Bytes ( 2 3 ) ĊĠĠĠ Ġprivate Ġval Ġdb Bytes Ġ= ĠRandom . next Bytes ( 4 2 ) ĊĠĠĠ Ġprivate Ġval ĠinputStream Ġ= ĠByteArrayInputStream ( db Bytes ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` has Ġno Ġinitial Ġstate `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` simple Ġbackup Ġwith Ġone Ġrecord `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġsingle Record Backup () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . perform Backup ( package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( package Info , Ġbackup . getCurrent Package ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` incremental Ġbackup Ġwith Ġno Ġdata Ġgets Ġrejected `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( false ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTRAN SP ORT _ NON _ INCREMENT AL _ BACKUP _ REQUIRED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . perform Backup ( package Info , Ġdata , ĠFLAG _ INCREMENT AL , Ġtoken , Ġsalt ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` non - incremental Ġbackup Ġwith Ġdata Ġclears Ġold Ġdata Ġfirst `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġsingle Record Backup ( true ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġplugin . remove Data ( token , Ġname ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb Manager . delete Db ( packageName ) Ġ} Ġreturns Ġtrue ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTRAN SP ORT _ OK , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . perform Backup ( package Info , Ġdata , ĠFLAG _ NON _ INCREMENT AL , Ġtoken , Ġsalt ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ign oring Ġexception Ġwhen Ġclearing Ġdata Ġwhen Ġnon - incremental Ġbackup Ġhas Ġdata `() Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Record Backup ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġplugin . remove Data ( token , Ġname ) Ġ} Ġthrows ĠIOException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTRAN SP ORT _ OK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . perform Backup ( package Info , Ġdata , ĠFLAG _ NON _ INCREMENT AL , Ġtoken , Ġsalt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` package Ġwith Ġno Ġnew Ġdata Ġcomes Ġback Ġok Ġright Ġaway `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcrypto . getName For Package ( salt , ĠpackageName ) Ġ} Ġreturns Ġname ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb Manager . get Db ( packageName ) Ġ} Ġreturns Ġdb ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTRAN SP ORT _ OK , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup . perform Backup ( package Info , Ġdata , ĠFLAG _ DATA _ NOT _ CHANGED , Ġtoken , Ġsalt ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġdata . close () Ġ} ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` exception Ġwhile Ġreading Ġnext Ġheader `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( false ) ĊĠĠĠĠĠĠĠ Ġcreate Backup Data Input () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . read Next Header () Ġ} Ġthrows ĠIOException () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . perform Backup ( package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` exception Ġwhile Ġreading Ġvalue `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( false ) ĊĠĠĠĠĠĠĠ Ġcreate Backup Data Input () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . read Next Header () Ġ} Ġreturns Ġtrue ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . key Ġ} Ġreturns Ġkey ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . data Size Ġ} Ġreturns Ġdata Value . size ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . read Entity Data ( any (), Ġ 0 , Ġdata Value . size ) Ġ} Ġthrows ĠIOException () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . perform Backup ( package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` no Ġdata Ġrecords `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( false ) ĊĠĠĠĠĠĠĠ ĠgetData Input ( listOf ( false )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . perform Backup ( package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` null Ġdata Ġdeletes Ġkey `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( true ) ĊĠĠĠĠĠĠĠ Ġcreate Backup Data Input () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . read Next Header () Ġ} Ġreturns Ġtrue Ġand Then Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . key Ġ} Ġreturns Ġkey ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . data Size Ġ} Ġreturns Ġ- 1 Ġ// Ġjust Ġdocumented Ġby Ġexample Ġcode Ġin ĠLocal Transport ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . delete ( key ) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . perform Backup ( package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġupload Data () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` exception Ġwhile Ġwriting Ġversion `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( false ) ĊĠĠĠĠĠĠĠ ĠgetData Input ( listOf ( true , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . put ( key , Ġdata Value ) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . perform Backup ( package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . vac uum () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġplugin . get OutputStream ( token , Ġname ) Ġ} Ġreturns ĠoutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĠoutputStream . write ( ByteArray ( 1 ) Ġ{ ĠVERSION Ġ}) Ġ} Ġthrows ĠIOException () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĠoutputStream . close () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĠoutputStream . close () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` exception Ġwhile Ġwriting Ġencrypted Ġvalue Ġto Ġoutput Ġstream `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( false ) ĊĠĠĠĠĠĠĠ ĠgetData Input ( listOf ( true , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . put ( key , Ġdata Value ) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . perform Backup ( package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . vac uum () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġplugin . get OutputStream ( token , Ġname ) Ġ} Ġreturns ĠoutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĠoutputStream . write ( ByteArray ( 1 ) Ġ{ ĠVERSION Ġ}) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġval Ġad Ġ= Ġget AD For KV ( VERSION , Ġpackage Info . packageName ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcrypto . new Encrypt ing Stream ( output Stream , Ġad ) Ġ} Ġreturns Ġencrypted OutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġencrypted OutputStream . write ( any < ByteArray >()) Ġ} Ġthrows ĠIOException () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ ERROR , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted OutputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` no Ġupload Ġwhen Ġwe Ġback Ġup Ġ@ pm @ Ġwhile Ġwe Ġcan 't Ġdo Ġbackups `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb Manager . exists Db ( pm Package Info . packageName ) Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcrypto . getName For Package ( salt , Ġpm Package Info . packageName ) Ġ} Ġreturns Ġname ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb Manager . get Db ( pm Package Info . packageName ) Ġ} Ġreturns Ġdb ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsettings Manager . can Do Backup Now () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . put ( key , Ġdata Value ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ ĠgetData Input ( listOf ( true , Ġfalse )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . perform Backup ( pm Package Info , Ġdata , Ġ 0 , Ġtoken , Ġsalt )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( backup . has State ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( pm Package Info , Ġbackup . getCurrent Package ()) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( TRANSPORT _ OK , Ġbackup . finish Backup ()) ĊĠĠĠĠĠĠĠ ĠassertFalse ( backup . has State ()) ĊĊĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . get OutputStream ( token , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsingle Record Backup ( has Data For Package : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Plugin ( has Data For Package ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . put ( key , Ġdata Value ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ ĠgetData Input ( listOf ( true , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġupload Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Plugin ( has Data For Package : ĠBoolean Ġ= Ġfalse , Ġpi : ĠPackage Info Ġ= Ġpackage Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb Manager . exists Db ( pi . packageName ) Ġ} Ġreturns Ġhas Data For Package ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcrypto . getName For Package ( salt , Ġpi . packageName ) Ġ} Ġreturns Ġname ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb Manager . get Db ( pi . packageName ) Ġ} Ġreturns Ġdb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Backup Data Input () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġinput Factory . get Backup Data Input ( data ) Ġ} Ġreturns Ġdata Input ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetData Input ( return Values : ĠList < Boolean >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Backup Data Input () ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . read Next Header () Ġ} Ġreturns Many Ġreturn Values ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . key Ġ} Ġreturns Ġkey ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . data Size Ġ} Ġreturns Ġdata Value . size ĊĠĠĠĠĠĠĠ Ġval Ġslot Ġ= ĠCapt uring Slot < ByteArray >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdata Input . read Entity Data ( capture ( slot ), Ġ 0 , Ġdata Value . size ) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Value . copy Into ( slot . captured ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Value . size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupload Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . vac uum () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb . close () Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġplugin . get OutputStream ( token , Ġname ) Ġ} Ġreturns ĠoutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĠoutputStream . write ( ByteArray ( 1 ) Ġ{ ĠVERSION Ġ}) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġval Ġad Ġ= Ġget AD For KV ( VERSION , Ġpackage Info . packageName ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcrypto . new Encrypt ing Stream ( output Stream , Ġad ) Ġ} Ġreturns Ġencrypted OutputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġencrypted OutputStream . write ( any < ByteArray >()) Ġ} Ġjust ĠRuns Ġ// Ġgzip Ġheader ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġencrypted OutputStream . write ( any (), Ġany (), Ġany ()) Ġ} Ġjust ĠRuns Ġ// Ġstream Ġcopy ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġdb Manager . get Db InputStream ( packageName ) Ġ} Ġreturns ĠinputStream ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġencrypted OutputStream . close () Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ ĠoutputStream . close () Ġ} Ġjust ĠRuns ĊĠĠĠ Ġ} Ċ Ċ } Ċ