package Ġno . nav . ere g Ċ Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġmu . Kotlin Logging Ċ import Ġno . nav . sf . library . An Environment Ċ import Ġno . nav . sf . library . Pre stop Hook Ċ import Ġno . nav . sf . library . Shutdown Hook Ċ import Ġno . nav . sf . library . enable NA IS API Ċ Ċ private Ġconst Ġval ĠEV _ bootstrap Wait Time Ġ= Ġ" MS _ B ETWEEN _ WORK " Ġ// Ġdefault Ġto Ġ 1 0 Ġminutes Ċ private Ġval Ġbootstrap Wait Time Ġ= ĠAn Environment . get Env OrDefault ( EV _ bootstrap Wait Time , Ġ" 6 0 0 0 0 "). to Long () Ċ Ċ object ĠBootstrap Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{ Ġ} ĊĊĠĠĠ Ġfun Ġstart ( ws : ĠWork Settings Ġ= ĠWork Settings ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Starting " Ġ} ĊĠĠĠĠĠĠĠ Ġenable NA IS API Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvestigate ( ws ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop ( ws ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Finished !" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġloop ( ws : ĠWork Settings ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstop Ġ= ĠShutdown Hook . isActive () Ġ|| ĠPre stop Hook . isActive () ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! stop Ġ-> Ġloop ( work ( ws ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġprev WS Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġre - read Ġof Ġvault Ġentries Ġin Ġcase Ġof Ġchanges , Ġkeeping Ġrelevant Ġaccess Ġtokens Ġand Ġstatic Ġenv . Ġvars . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev WS . first . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsf Client Ġ= Ġprev WS . first . sf Client . copy Re levant () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġconditional Wait () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconditional Wait ( ms : ĠLong Ġ= Ġbootstrap Wait Time ) Ġ= ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Will Ġwait Ġ$ ms Ġms Ġbefore Ġstarting Ġall Ġover " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ Ġdelay ( ms ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġlog . info Ġ{ Ġ" waiting Ġcompleted " Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ Ġlog . info Ġ{ Ġ" waiting Ġinterrupted " Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtail rec Ġsuspend Ġfun Ġloop (): ĠUnit Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr . is Completed Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShutdown Hook . isActive () Ġ|| ĠPre stop Hook . isActive () Ġ-> Ġcr . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 2 5 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcr . join () ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ