package Ġcom . ibm . re sc un et Ċ Ċ import Ġandroid . location . Location Ċ import Ġjava . lang . Exception Ċ import Ġjava . util .* Ċ import Ġkotlin . math . max Ċ Ċ const Ġval Ġencoding Ġ= Ġ" 0 1 2 3 4 5 6 7 8 9 abcdefgh ijkl mnopqrst uvw xyz ABCDEF GH IJ KL MN OP Q RST UV W XYZ _ -" Ċ Ċ /** Ċ Ġ* ĠDe codes Ġa Ġsingle Ġcharacter Ġinto Ġ 0 .. 6 3 Ċ Ġ*/ Ċ fun Ġdecode Char ( c : ĠChar ): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ( encoding . indexOf ( c ) Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġthrow ĠException () ĊĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġreturn Ġencoding . indexOf ( c ) Ċ } Ċ Ċ /** Ċ Ġ* ĠEn codes Ġa Ġnon - negative Ġinteger Ġin Ġbase Ġ 6 4 Ġusing Ġ< code > length </ code > Ġcharacters Ċ Ġ*/ Ċ fun Ġencode Int ( n : ĠInt , Ġlength : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġassert ( n Ġ>= Ġ 0 ) ĊĠĠĠ Ġassert ( length Ġ>= Ġ 0 ) ĊĠĠĠ Ġvar Ġresult Ġ= Ġ"" ĊĠĠĠ Ġvar Ġx Ġ= Ġn ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġencoding [ x Ġ% Ġ 6 4 ] Ġ+ Ġresult ĊĠĠĠĠĠĠĠ Ġx Ġ/= Ġ 6 4 ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ /** Ċ Ġ* ĠEn codes Ġan Ġid Ġbetween Ġ 0 Ġand Ġ 4 0 9 5 Ċ Ġ*/ Ċ fun Ġencode DeviceId ( id : ĠInt ) Ġ= Ġencode Int ( id , Ġ 2 ) Ċ Ċ /** Ċ Ġ* ĠEn codes Ġlocation Ġand Ġtime Ċ Ġ* Ġlocation Ġis Ġencoded Ġusing Ġthe Ġdigits Ġ 0 . 0 0 xxx Ġin Ġthe Ġlong Ġand Ġlat Ġaxis Ċ Ġ* Ġtime Ġis Ġencoded Ġin Ġunits Ġof Ġ 1 0 Ġseconds , Ġmod Ġ 1 8 0 Ċ Ġ* Ġaccuracy Ġis Ġencoded Ġas Ġ 0 Ġto Ġ 4 Ċ Ġ*/ Ċ fun Ġencode Location And Time ( lat : ĠInt , Ġlong : ĠInt , Ġtime : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġassert ( long Ġ< Ġ 2 0 0 0 ) ĊĠĠĠ Ġassert ( lat Ġ< Ġ 2 0 0 0 ) ĊĠĠĠ Ġassert ( time Ġ< Ġ 1 8 0 ) ĊĠĠĠ Ġreturn Ġencode Int (( time Ġ* Ġ 2 0 4 8 Ġ* Ġ 2 0 4 8 Ġ+ Ġlat Ġ* Ġ 2 0 4 8 Ġ+ Ġlong ), Ġ 5 ) Ċ } Ċ Ċ /** Ċ Ġ* ĠDe codes Ġa Ġbase Ġ 6 4 Ġinteger Ċ Ġ*/ Ċ fun Ġdecode Int ( s : ĠString ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġn Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( c Ġin Ġs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġn Ġ*= Ġ 6 4 ĊĠĠĠĠĠĠĠ Ġn Ġ+= Ġdecode Char ( c ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġn Ċ } Ċ Ċ /** Ċ Ġ* ĠExtract Ġthe Ġlocation Ġand Ġtime Ġinfo Ġout Ġof Ġa Ġ 5 - character Ġ 6 4 Ġbit Ġstring Ċ Ġ* ĠFormat : Ġlat , Ġlong , Ġaccuracy Ġ( 0 - 4 ), Ġtime Ċ Ġ*/ Ċ fun Ġdecode Location And Time ( s : ĠString ): ĠArray < Int > Ġ{ ĊĠĠĠ Ġval Ġn Ġ= Ġdecode Int ( s ) ĊĠĠĠ Ġreturn ĠarrayOf ( n Ġ/ Ġ 2 0 4 8 Ġ% Ġ 2 0 4 8 , Ġn Ġ% Ġ 2 0 4 8 Ġ% Ġ 2 0 4 8 , Ġn Ġ/ Ġ( 2 0 4 8 Ġ* Ġ 2 0 4 8 )) Ċ } Ċ Ċ fun Ġdecode DeviceInfo ( s : ĠString ): ĠDevice Info Ġ{ ĊĠĠĠ Ġval Ġl Ġ= Ġdecode Location And Time ( s . slice ( 2 .. 6 )) ĊĠĠĠ Ġreturn ĠDevice Info ( decode Int ( s . slice ( 0 .. 1 )), Ġl [ 0 ], Ġl [ 1 ], Ġl [ 2 ]. to Long ()) Ċ } Ċ Ċ fun Ġencode DeviceInfo ( id : ĠInt , Ġlat : ĠInt , Ġlong : ĠInt , Ġtime : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġencode DeviceId ( id ) Ġ+ Ġencode Location And Time ( lat , Ġlong , Ġtime ) Ċ }