From 8d19db9f0e579bebd0eda3bd595e7693be9b4a3c Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 4 Jun 2020 10:41:09 +1200 Subject: [PATCH] Test bmp display --- Cargo.lock | 20 ++++ aura/Cargo.toml | 4 + aura/examples/animatrix.rs | 45 ++++---- aura/examples/rust.bmp | Bin 0 -> 7754 bytes aura/examples/test-skinny-45deg.bmp | Bin 0 -> 2714 bytes aura/examples/test.bmp | Bin 0 -> 3162 bytes aura/src/anime_matrix.rs | 173 +++++++++++++++++++++++++--- 7 files changed, 208 insertions(+), 34 deletions(-) create mode 100644 aura/examples/rust.bmp create mode 100644 aura/examples/test-skinny-45deg.bmp create mode 100644 aura/examples/test.bmp diff --git a/Cargo.lock b/Cargo.lock index 31989d87..8b72a25e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -680,6 +680,8 @@ dependencies = [ "serde", "serde_derive", "thiserror", + "tinybmp", + "yansi-term", ] [[package]] @@ -885,6 +887,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "tinybmp" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781e52493917138f60c3b98b95e39967eafd28d3c470d0d35ae020b47f011b5d" +dependencies = [ + "nom", +] + [[package]] name = "tokio" version = "0.2.20" @@ -1042,3 +1053,12 @@ checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" dependencies = [ "libc", ] + +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi 0.3.8", +] diff --git a/aura/Cargo.toml b/aura/Cargo.toml index 95f418e8..cc8dedd5 100644 --- a/aura/Cargo.toml +++ b/aura/Cargo.toml @@ -15,3 +15,7 @@ dbus = { version = "^0.8.2" } serde = "1.0" serde_derive = "1.0" thiserror = "^1.0.15" +yansi-term = "0.1.2" + +[dev-dependencies] +tinybmp = "0.2.3" \ No newline at end of file diff --git a/aura/examples/animatrix.rs b/aura/examples/animatrix.rs index daa15451..fdcac245 100644 --- a/aura/examples/animatrix.rs +++ b/aura/examples/animatrix.rs @@ -1,34 +1,39 @@ -use rog_aura::{AniMeDbusWriter, AniMeMatrix, AniMePacketType}; +use rog_aura::{AniMeDbusWriter, AniMeMatrix, AniMePacketType, HEIGHT, WIDTH}; +use tinybmp::{Bmp, Pixel}; fn main() { let mut writer = AniMeDbusWriter::new().unwrap(); - // loop { - // for brightness in 0xFE..0xFF { - // let mut matrix = AniMeMatrix::new(); - // matrix.fill_with(brightness); - - // let mut matrix: AniMePacketType = AniMePacketType::from(matrix); - // // println!("{:?}", matrix[0].to_vec()); - // // println!("{:?}", matrix[1].to_vec()); - - // writer.write_image(&mut matrix).unwrap(); - // } - // break; - // } + let bmp = Bmp::from_slice(include_bytes!("test.bmp")).expect("Failed to parse BMP image"); + let pixels: Vec = bmp.into_iter().collect(); + //assert_eq!(pixels.len(), 56 * 56); // Try an outline, top and right let mut matrix = AniMeMatrix::new(); - { - let tmp = matrix.get_mut(); - for row in tmp.iter_mut() { - row[row.len() - 1] = 0xff; + + // Aligned left + for px in pixels { + if (px.x as usize) < WIDTH { + matrix.get_mut()[px.y as usize][px.x as usize] = px.color as u8; } } + // Throw an alignment border up + // { + // let tmp = matrix.get_mut(); + // for x in tmp[0].iter_mut() { + // *x = 0xff; + // } + // for row in tmp.iter_mut() { + // row[row.len() - 1] = 0xff; + // } + // } + + matrix.debug_print(); + let mut matrix: AniMePacketType = AniMePacketType::from(matrix); - println!("{:?}", matrix[0].to_vec()); - println!("{:?}", matrix[1].to_vec()); + // println!("{:?}", matrix[0].to_vec()); + // println!("{:?}", matrix[1].to_vec()); writer.write_image(&mut matrix).unwrap(); } diff --git a/aura/examples/rust.bmp b/aura/examples/rust.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a079736bb99239231c0a7b86a2821c9586061e04 GIT binary patch literal 7754 zcmeHLM@Xef5PrLR_Ug%977rdh2*O?j84zK?gDYM{(37aBs0(Ajcu)+CA_!*1fS@9R z;$T(;F(G0WvoM%Z%-P=e^=$pr-|v4(oxQBZ`(LL@U0vN(-Jb&f{LLhx!2F+P{@l&q zALj2T)9=9G#r5^I@b>l=i;Ii$LmhoVK|w$KoN8}x7pbYK;>(vW z0`T?gS8;cDCqL8yMMXs-EiFv|_ea@fZf;JToScZ!(NQVW=nrGS0q%S25gQvTd2VcM z7>PFQ11|I++V{{2>)zYjD^5>OHJJ|&58~UmZ(3We0JpENPx{Pz=l~v9S68YSxi-GO zzT)NO#bS(ifcCxgxVX6BtYy8ct4s2~zrPm;2M6Nz_SOOi9iV-y9{c$Up8FH|@>I+Ews)6+_AT~UTU*muJwHFodGk4ymzRr_loSoeRt3B`ts`~p z(Y?JronH(M4H@!TU0v0QhrbLC4hrZEA0~jGI3kopuB9=7@-A|f!UhIIWZFSVVRm?-$VVEt7bYOk-aYciCFD)&V zXD;G0(K%A8XJbRWP@KxEnjSMVGZwV)mxYA|t$$}{N5ehXq)ZtM<>&&vTaI=H^DYySr=jJf?y-=%b>dbTqsH8$?G( zOT5m`PK}Q$S8W3q0NY}|$TJHH3M4(*g5LY}MlJZm!4-bd+K<jTECwvn2S8V}3ii?XSZ`_^ifwQ@C zTwI*Ii-0fY3wu{rR|_?!k}WVN*vuZ}=jS_R5A1agh+{^!!1)Lr5IZO@<8*4BY-evR zXq@YTz2fQVY2g=;fxU@%s@ei)IQcr)B{w(MDSPmBfsYv3g7_o0a9bQ69!j4|NJtch(MsWu4Gl*<&tE7FaW8^>swm{AU-U9;z zI*RS>ZKrKvw6;2?RvKgr_ze7tLq|u4)PwZ2Wd|Bl&vnkvS{?Z($)L9f!o}M9`T0pb z)I5!38kK6CBYrqz5xb3m_KuM)utp>&FE3B4Q=hGp$99t6Iy1;YtCfpWyufv<>?Ch-5 zdO#+>M`7*NT-%mS$QI$@;TCxbpN}JT^;AiuR*_~pSp)35dMNV%-=B4PkuqX)6>(X?5e6NS-$2ShIpy(QdlqK zD74;?4^V9Zdi70$a&O}8OsT%p(OsVBKhQ(91>TNSztaL!1u7W0OWymCXpPz mM?ynG1@6@xKnosku?OkI&sg{e2jsMvKXQ82PQU{#@%aau0~{>? literal 0 HcmV?d00001 diff --git a/aura/examples/test-skinny-45deg.bmp b/aura/examples/test-skinny-45deg.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4e6cf9f3850e6414e1ad9f4d77d8e9e98122f513 GIT binary patch literal 2714 zcmeH{e^69a6vsaXQ{-f`W!78q7t2hFKaeFFSqz&N90amPG?gDh3AO23CM(L1tme6v z22U$DF(EJ%O+joz%3w*$uo)UjP_#+S9Cai5u{DZjx{vO{48pEEQ~!5n?wfnh_nvdl z`JQv0apso6^hmxxED^gAVnvEIh=3mbnA;&Zw08-m8^9QsWa$C_!{;`yyMq|Dx&cj0 z21W1HVVp6SDNTQ4mbWo1a{~doFshGUM~Z!&_-6|kxBW+gf+u1v`;?8fr${jEC3E$0 z#$@ehvN4$;TN|2)R6?g)nY^!yj~ZGydGQ)j_BNJVD+maWBQs|gL1D8o&R@r47gYl8 z9Yt35D{TMj0-D(?2usRAsqCQPqKiojZN#mpMsGccMQKMfXAKeJ4c+qnBDN@^wmZnT z?O@}+t3=LTi!^*RBaKfpE4zeX{R~257IUDzi)rmDx;5Wn+;@d{c78$J`~}D#{7mkq z(`e_cL%;kJ;-A~hokPbHm{rcC%0Ee3^dW{h@1u!YKwQS#3=N*jSX&1=%TX+AJ|?&L zPs-~4KyUA2vEBj+l)Tk!09fPq>McD z;vH*MClf5Yhm1Th(6+?_Oy$=htHx^Un2PB&&acV z#ep+7Sd?GF^o(8HewUW9CEsCv?-;{Vi?}Z+jEa3H2pS(l?7Up=k9v*J>hqY_|3G9) z9s$}(jGg)d<~5CEt~!GAN;gNG-GpS-vAVpCn&xX5XJs=yDUZbVZl1W%%~Pfvl2`2I z)bBTlu69x)`b62?G0D7*iFtc? zxb#P?JCCuau>)iBRSuCqcF|R#A z%gIZ`Jek4hC3ZBauXD%vN3k{h#r@-B8CUuXW%euR4bvGGqUQtqDT;Pn#j?HwtF4N+ zcO6IGb`9$mr|@|UYw?$8?viNy#!2PjztO~J^48XR0)(w5xq$GZ!$g#{^XM6sSP_T* z<^9ZEx?9w*jge`)8Ifo~llTJh>G^~#X+TOTz}Tds-+lqZbTLb!FEm3(U|6_boU@Rk z(n)&e4GfQG6C!-KoVki-cqj=qP7E{GiX1BmQBGrBUxV>Cm4qYRJbtE|M6tJ4-JtHc z3+bU8QnI&jS#T9(ZT9*b{IBrMfWP=R`;ewq-&8i)?M*(+C~uZ^zAzkGr%#M#HP9#M zaB6*G1ggj3B~Lspuu-U*S`{SEOs1?4_XPVt!*qcDH zYU&t>>Eu8p#jUIN%3sn3U~*$a6ltIpIQ_tE7g|60*MV3$N+BpULaTTt@4$pe`&InW z+6J0AO#UJ?w@XRqS)^v!oskkPX192t6%M<32y}|r3l-1$^=8y5pTkdabJ|ZL?5(lx zqp~txF}W%2CpuX?QdogmRlHo<-5EK}f-JeEpNV@LtD2!pEdyPBng@m?m*K028f#5{ zYNx22r;#`xHOaDY>+q|%1*ntNbTHKl0{Tl+y*R~6g0pE_Q+9tugr;=}g-(`44|&p6 ztoHO&>4H4(azEc{cN?CQ?Ov4hO-_yK?gtNX*f+X02UU-9_gri4c~R#XNDt<4iq4aK zj9s95cdpi}CwuI~APeVNVc& literal 0 HcmV?d00001 diff --git a/aura/examples/test.bmp b/aura/examples/test.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1d5824d6f8619dc5d9cf33a6ec389aa10fd76a62 GIT binary patch literal 3162 zcmeH{dr*{B7>6GlC%49$EiWx3>cULAD9CO!vY0t7FbJzQE_h){DcN##y^O3lT(oI) zQLF_sH*XN4fQFzp3S|Lld1;0QGZ1wW(iycVr^rz>m0db4%Voq5wy8hcne(0Vo%cDv z-}|0(zST`P4#xFM8wg9p$XB!w(FP!M&0iS=et{iLOtuHmMH(!w;6Hdg){7m$$aNLS z!xFIVC`UJSHWN?X$Go_o0AMQuHfC958JYzD!?!*}ITky|LCg+G&K z-^-S=yM)AKqVOJtkM0d-CgtF#o=RZYVvg0f@JhWC-;9gs%I@&tzORX#JCC)ye<<#BUN~>`nMu&SJ?pOv<*K zyA3S<82I82C=8?JWBsC!snzgJoH@xORr+i{)rG{Dl)GC z#!Om@IirfiH8nKfX``mO4V9^!b-QXgSbY!O%p|-Gsp#w5m~pL*SqqbiTXl#_f3z~W zw3!@nPqOlVK$G=7G0Trr{fh%lR2)J24fv#$l4je3Dg7`{dyN)*@*~N%D#~kbpwP_2 zxZ-^VKKT^SEwY38$BwXa7UVW6=%lC`( ztHtN_{fy9Ckn5KcH9rm2k_r^Ybabbjs0**5jS%0GxEJyvBhW6$7Vjn$q4P1kxdH98 zBveBCOygbT-ho6PY(_ghQ`A_5Dyso&_Ca*NJBhAoV_IVydNH<^v{HV~f#Stvj7dAW zE%r)jt?u=2@c)E|JK*e}b9%(|4>|v9p*}6$ZXPiGq~#KlWI6)vj3go=t}H|+$#jM~ z`$wHhmq%YRxbu*7>WI6-l1z7067fWa_OiRR9#xYI>4)i7_*dC@EaOT?(#jnWoh0I} zr@eMb#uaFPNFyD4*9AUu`&^8qN!OA-66wi^v7}bVhty{_?zQcmv`jbT0V9dDJ9K8$ z(RbC+W6;g?n0$EXhWfDTH0u*_Lmn{wATA+~n1?Ir_1;;3uRxE9ew_sC0pkJUiHsEU EH`uRYFaQ7m literal 0 HcmV?d00001 diff --git a/aura/src/anime_matrix.rs b/aura/src/anime_matrix.rs index 5f34359c..de4ecabf 100644 --- a/aura/src/anime_matrix.rs +++ b/aura/src/anime_matrix.rs @@ -4,6 +4,7 @@ pub type AniMeBufferType = [[u8; WIDTH]; HEIGHT]; pub type AniMePacketType = [[u8; 640]; 2]; const BLOCK_START: usize = 7; const BLOCK_END: usize = 634; +use yansi_term::Colour::RGB; pub struct AniMeMatrix(AniMeBufferType); @@ -27,6 +28,60 @@ impl AniMeMatrix { } } } + + pub fn debug_print(&self) { + // this is the index from right. It is used to progressively shorten rows + let mut prog_row_len = WIDTH - 2; + + for (count, row) in self.0.iter().enumerate() { + // Write the top block of LEDs (first 7 rows) + if count < 6 { + if count % 2 != 0 { + print!(" "); + } else if count == 0 { + print!(" "); + } else { + print!(" "); + } + let tmp = if count == 0 || count == 1 || count == 3 || count == 5 { + row[1..].iter() + } else { + row.iter() + }; + for x in tmp { + print!(" {}", RGB(*x, *x, *x).paint(&format!("{:#04X}", x))); + } + + print!("\n"); + } else { + // Switch to next block (looks like ) + if count % 2 != 0 { + // Row after 6 is only 1 less, then rows after 7 follow pattern + if count == 7 { + prog_row_len -= 1; + } else { + prog_row_len -= 2; + } + } else { + prog_row_len += 1; // if count 6, 0 + } + + let index = row.len() - prog_row_len; + + if count % 2 == 0 { + print!(" "); + } + for (i, x) in row.iter().enumerate() { + if i >= index { + print!(" {}", RGB(*x, *x, *x).paint(&format!("{:#04X}", x))); + } else { + print!(" "); + } + } + print!("\n"); + } + } + } } impl From for AniMePacketType { @@ -39,32 +94,38 @@ impl From for AniMePacketType { let mut write_index = BLOCK_START; let mut write_block = &mut buffers[0]; let mut block1_done = false; - let mut phys_row_len = WIDTH - 1; // not taking in to account starting at 0 + + // this is the index from right. It is used to progressively shorten rows + let mut prog_row_len = WIDTH - 2; for (count, row) in anime.0.iter().enumerate() { // Write the top block of LEDs (first 7 rows) if count < 6 { - for x in row.iter() { - write_block[write_index] = *x; + for (i, x) in row.iter().enumerate() { + // Rows 0, 1, 3, 5 are short and misaligned + if count == 0 || count == 1 || count == 3 || count == 5 { + if i > 0 { + write_block[write_index - 1] = *x; + } + } else { + write_block[write_index] = *x; + } write_index += 1; } } else { - // Two offsets to correct the below with - if count == 6 { - phys_row_len -= 1; - } - if count == 7 { - phys_row_len += 1; - } - // Switch to next block (looks like ) if count % 2 != 0 { - phys_row_len -= 2; // if count 7, -= 1 + // Row after 6 is only 1 less, then rows after 7 follow pattern + if count == 7 { + prog_row_len -= 1; + } else { + prog_row_len -= 2; + } } else { - phys_row_len += 1; // if count 6, 0 + prog_row_len += 1; // if count 6, 0 } - let index = row.len() - phys_row_len; + let index = row.len() - prog_row_len; for n in index..row.len() { // Require a special case to catch the correct end-of-packet which is // 6 bytes from the end @@ -83,3 +144,87 @@ impl From for AniMePacketType { buffers } } + +#[cfg(test)] +mod tests { + use crate::{AniMeMatrix, AniMePacketType}; + + #[test] + fn check_data_alignment() { + let mut matrix = AniMeMatrix::new(); + { + let tmp = matrix.get_mut(); + for row in tmp.iter_mut() { + row[row.len() - 1] = 0xff; + } + } + + let matrix: AniMePacketType = AniMePacketType::from(matrix); + + // The bytes at the right of the initial AniMeMatrix should always end up aligned in the + // same place after conversion to data packets + + // Check against manually worked out right align + assert_eq!( + matrix[0].to_vec(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ] + .to_vec() + ); + assert_eq!( + matrix[1].to_vec(), + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, + 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, + 0, 0, 0, 0 + ] + .to_vec() + ); + } +}