package Ġbit co ink it Ċ Ċ import Ġbit co ink it . Utils . double Digest Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠProvides ĠBase - 5 8 Ġencoding Ġand Ġdecoding Ċ Ġ*/ Ċ object ĠBase 5 8 Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAl phabet Ġused Ġfor Ġencoding Ġand Ġdecoding ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠAL PH AB ET Ġ= Ġ" 1 2 3 4 5 6 7 8 9 ABCDEF GH J KLM NP Q RST UV W XYZ abcdefgh ijk mnopqrst uvw xyz ". toCharArray () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLookup Ġindex Ġfor ĠUS - ASCII Ġcharacters Ġ( code Ġpoints Ġ 0 - 1 2 7 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠINDEX ES Ġ= ĠInt Array ( 1 2 8 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn codes Ġa Ġbyte Ġarray Ġas Ġa ĠBase 5 8 Ġstring ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbytes ĠArray Ġto Ġbe Ġencoded ĊĠĠĠĠ Ġ* Ġ@ return ĠEn coded Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġencode ( bytes : ĠByteArray ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġdo Ġfor Ġan Ġempty Ġarray ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġif Ġ( bytes . isEmpty ()) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġa Ġcopy Ġof Ġthe Ġinput Ġsince Ġwe Ġwill Ġbe Ġmodifying Ġit Ġas Ġwe Ġgo Ġalong ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġbytes . copyOf ( bytes . size ) ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠCount Ġthe Ġnumber Ġof Ġleading Ġzero es Ġ( we Ġwill Ġneed Ġto Ġprefix Ġthe Ġencoded Ġresult ĊĠĠĠĠĠĠĠ Ġ// Ġwith Ġthis Ġmany Ġzero Ġcharacters ) ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġvar Ġzero Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( zero Count Ġ< Ġinput . size Ġ&& Ġinput [ zero Count ] Ġ== Ġ 0 . to Byte ()) Ġzero Count ++ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠEncode Ġthe Ġinput Ġstarting Ġwith Ġthe Ġfirst Ġnon - zero Ġbyte ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġzero Count ĊĠĠĠĠĠĠĠ Ġval Ġencoded Ġ= ĠByteArray ( input . size Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġvar Ġencoded Offset Ġ= Ġencoded . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( offset Ġ< Ġinput . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmod Ġ= Ġdiv Mod 5 8 ( input , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ offset ] Ġ== Ġ 0 . to Byte ()) Ġoffset ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoded [ -- encoded Offset ] Ġ= ĠAL PH AB ET [ mod . toInt ()]. to Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠStrip Ġany Ġleading Ġzero Ġvalues Ġin Ġthe Ġencoded Ġresult ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġwhile Ġ( encoded Offset Ġ< Ġencoded . size Ġ&& Ġencoded [ encoded Offset ] Ġ== ĠAL PH AB ET [ 0 ]. to Byte ()) Ġencoded Offset ++ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġadd Ġthe Ġnumber Ġof Ġleading Ġzero es Ġthat Ġwe Ġfound Ġin Ġthe Ġinput Ġarray ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġzero Count ) Ġencoded [ -- encoded Offset ] Ġ= ĠAL PH AB ET [ 0 ]. to Byte () ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġreturn Ġstring Ġfrom Ġthe Ġencoded Ġbytes ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġval Ġencoded Result : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġstring Bytes Ġ= Ġencoded . copyOf Range ( encoded Offset , Ġencoded . size ) ĊĠĠĠĠĠĠĠ Ġencoded Result Ġ= ĠString ( string Bytes , ĠStandard Charsets . US _ ASCII ) ĊĠĠĠĠĠĠĠ Ġreturn Ġencoded Result ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDe codes Ġa ĠBase 5 8 Ġstring ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstring ĠEn coded Ġstring ĊĠĠĠĠ Ġ* Ġ@ return ĠDe coded Ġbytes ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException ĠInvalid ĠBase - 5 8 Ġencoded Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġdecode ( string : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġdo Ġif Ġwe Ġhave Ġan Ġempty Ġstring ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġif Ġ( string . isEmpty ()) Ġreturn ĠByteArray ( 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠConvert Ġthe Ġinput Ġstring Ġto Ġa Ġbyte Ġsequence ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠByteArray ( string . length ) ĊĠĠĠĠĠĠĠ Ġstring . indices . forEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Point Ġ= Ġstring . code Point At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdigit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( code Point Ġ>= Ġ 0 Ġ&& Ġcode Point Ġ< ĠINDEX ES . size ) Ġdigit Ġ= ĠINDEX ES [ code Point ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( digit Ġ>= Ġ 0 ) Ġ{ ĠString . format (" Illegal Ġcharacter Ġ% c Ġat Ġindex Ġ% d ", Ġstring [ i ], Ġi ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput [ i ] Ġ= Ġdigit . to Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠCount Ġthe Ġnumber Ġof Ġleading Ġzero Ġcharacters ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġvar Ġzero Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( zero Count Ġ< Ġinput . size Ġ&& Ġinput [ zero Count ] Ġ== Ġ 0 . to Byte ()) Ġzero Count ++ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠConvert Ġfrom ĠBase 5 8 Ġencoding Ġstarting Ġwith Ġthe Ġfirst Ġnon - zero Ġcharacter ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġval Ġdecoded Ġ= ĠByteArray ( input . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġdecoded Offset Ġ= Ġdecoded . size ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġzero Count ĊĠĠĠĠĠĠĠ Ġwhile Ġ( offset Ġ< Ġinput . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmod Ġ= Ġdiv Mod 2 5 6 ( input , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input [ offset ] Ġ== Ġ 0 . to Byte ()) Ġoffset ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecoded [ -- decoded Offset ] Ġ= Ġmod ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠStrip Ġleading Ġzero es Ġfrom Ġthe Ġdecoded Ġresult ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġwhile Ġ( decoded Offset Ġ< Ġdecoded . size Ġ&& Ġdecoded [ decoded Offset ] Ġ== Ġ 0 . to Byte ()) Ġdecoded Offset ++ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġdecoded Ġresult Ġprefixed Ġwith Ġthe Ġnumber Ġof Ġleading Ġzero es ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġwere Ġin Ġthe Ġoriginal Ġstring ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġreturn ĠArrays . copyOf Range ( decoded , Ġdecoded Offset Ġ- Ġzero Count , Ġdecoded . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDecode Ġa ĠBase 5 8 - encoded Ġchecksum med Ġstring Ġand Ġverify Ġthe Ġchecksum . Ġ ĠThe ĊĠĠĠĠ Ġ* Ġchecksum Ġwill Ġthen Ġbe Ġremoved Ġfrom Ġthe Ġdecoded Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstring ĠBase - 5 8 Ġencoded Ġchecksum med Ġstring ĊĠĠĠĠ Ġ* Ġ@ return ĠDe coded Ġvalue ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException ĠThe Ġstring Ġis Ġnot Ġvalid Ġor Ġthe Ġchecksum Ġis Ġincorrect ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġdecode Checked ( string : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠDecode Ġthe Ġstring ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġval Ġdecoded Ġ= Ġdecode ( string ) ĊĠĠĠĠĠĠĠ Ġrequire ( decoded . size Ġ>= Ġ 4 ) Ġ{ Ġ" Decoded Ġstring Ġis Ġtoo Ġshort " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthe Ġchecksum Ġcontained Ġin Ġthe Ġlast Ġ 4 Ġbytes ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġdecoded . copyOf Range ( 0 , Ġdecoded . size Ġ- Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġchecksum Ġ= Ġdecoded . copyOf Range ( decoded . size Ġ- Ġ 4 , Ġdecoded . size ) ĊĠĠĠĠĠĠĠ Ġval Ġhash : ĠByteArray Ġ= Ġdouble Digest ( bytes ). copyOf Range ( 0 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġrequire ( hash . content Equals ( checksum )) Ġ{ Ġ" Checksum Ġis Ġnot Ġcorrect " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġresult Ġwithout Ġthe Ġchecksum Ġbytes ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġreturn Ġbytes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDiv ide Ġthe Ġcurrent Ġnumber Ġby Ġ 5 8 Ġand Ġreturn Ġthe Ġremainder . Ġ ĠThe Ġinput Ġarray ĊĠĠĠĠ Ġ* Ġis Ġupdated Ġfor Ġthe Ġnext Ġround . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnumber ĠNumber Ġarray ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset ĠOffset Ġwithin Ġthe Ġarray ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġremainder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdiv Mod 5 8 ( number : ĠByteArray , Ġoffset : ĠInt ): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġremainder Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġoffset Ġuntil Ġnumber . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigit Ġ= Ġnumber [ i ]. toInt () Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġremainder Ġ* Ġ 2 5 6 Ġ+ Ġdigit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber [ i ] Ġ= Ġ( temp Ġ/ Ġ 5 8 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremainder Ġ= Ġtemp Ġ% Ġ 5 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġremainder . to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDiv ide Ġthe Ġcurrent Ġnumber Ġby Ġ 2 5 6 Ġand Ġreturn Ġthe Ġremainder . Ġ ĠThe Ġinput Ġarray ĊĠĠĠĠ Ġ* Ġis Ġupdated Ġfor Ġthe Ġnext Ġround . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnumber ĠNumber Ġarray ĊĠĠĠĠ Ġ* Ġ@ param Ġoffset ĠOffset Ġwithin Ġthe Ġarray ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġremainder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdiv Mod 2 5 6 ( number : ĠByteArray , Ġoffset : ĠInt ): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġremainder Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġoffset Ġuntil Ġnumber . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigit Ġ= Ġnumber [ i ]. toInt () Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġremainder Ġ* Ġ 5 8 Ġ+ Ġdigit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber [ i ] Ġ= Ġ( temp Ġ/ Ġ 2 5 6 ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremainder Ġ= Ġtemp Ġ% Ġ 2 5 6 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġremainder . to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠArrays . fill ( INDEX ES , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin ĠAL PH AB ET . indices ) ĠINDEX ES [ ALPH AB ET [ i ]. toInt ()] Ġ= Ġi ĊĠĠĠ Ġ} Ċ }