diff --git a/boards/waveshare-rp2040-lcd-1-28/Cargo.toml b/boards/waveshare-rp2040-lcd-1-28/Cargo.toml index 8900867..a5891b9 100644 --- a/boards/waveshare-rp2040-lcd-1-28/Cargo.toml +++ b/boards/waveshare-rp2040-lcd-1-28/Cargo.toml @@ -16,7 +16,7 @@ rp2040-boot2 = { workspace = true, optional = true } rp2040-hal.workspace = true embedded-hal = { version = "0.2" } libm = "0.2" -gc9a01a_driver = { version = "0.1.2" } +gc9a01a_driver = { version = "0.1.3" } [dev-dependencies] cortex-m.workspace = true diff --git a/boards/waveshare-rp2040-lcd-1-28/examples/frame_buffer.rs b/boards/waveshare-rp2040-lcd-1-28/examples/frame_buffer.rs deleted file mode 100644 index e7f70b4..0000000 --- a/boards/waveshare-rp2040-lcd-1-28/examples/frame_buffer.rs +++ /dev/null @@ -1,65 +0,0 @@ -#![no_std] -#![no_main] - -use embedded_graphics::{pixelcolor::Rgb565, prelude::*,}; -use core::convert::Infallible; - -pub struct FrameBuffer { - buffer: &'static mut [u8], - width: u32, - height: u32, -} - -impl FrameBuffer { - pub fn new(buffer: &'static mut [u8], width: u32, height: u32) -> Self { - Self { - buffer, - width, - height, - } - } - - pub fn get_buffer(&self) -> &[u8] { - &self.buffer - } - - pub fn get_mut_buffer(&mut self) -> &mut [u8] { - &mut self.buffer - } - - pub fn clear(&mut self, color: Rgb565) { - let raw_color = color.into_storage(); - for chunk in self.buffer.chunks_exact_mut(2) { - chunk[0] = (raw_color >> 8) as u8; - chunk[1] = raw_color as u8; - } - } -} - -impl DrawTarget for FrameBuffer { - type Color = Rgb565; - type Error = Infallible; - - fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> - where - I: IntoIterator>, - { - for Pixel(coord, color) in pixels { - if coord.x >= 0 && coord.x < self.width as i32 && coord.y >= 0 && coord.y < self.height as i32 { - let index = ((coord.y as u32 * self.width + coord.x as u32) * 2) as usize; - let raw_color = color.into_storage(); - self.buffer[index] = (raw_color >> 8) as u8; - self.buffer[index + 1] = raw_color as u8; - } - } - Ok(()) - } -} - -impl OriginDimensions for FrameBuffer { - fn size(&self) -> Size { - Size::new(self.width, self.height) - } -} - - diff --git a/boards/waveshare-rp2040-lcd-1-28/examples/rust-logo-240x240.raw b/boards/waveshare-rp2040-lcd-1-28/examples/rust-logo-240x240.raw deleted file mode 100644 index 2ddaa4a..0000000 --- a/boards/waveshare-rp2040-lcd-1-28/examples/rust-logo-240x240.raw +++ /dev/null @@ -1,20 +0,0 @@ -џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОюњцкїžџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюњЋы››ЃЊоxџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї|їџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїЋЊ›››››Hяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїžї\џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюйД ЃiЃ‰ФЯџžџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХ1›››šцšЦšцМŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпЭRЃŠЃiЋыоxџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї\ЃHšч›šчšЦД,џžџџџџџџџџџџџџџџџџџџџџџџџџџџцЙšцšч›šцšЦšЦšЦ›о6џџџџџџџџџџџџџџџџџџџџџџџџџџџџМЯ›››››цЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭR›šчšц›šцšцМnџпџџџџџџџџџџџџџџџџџџџџџџџпД šЦšц›šцšЦšЦšЦ›ЃЊї}џџџџџџџџџџџџџџџџџџџџџџџџХ››››››МŽџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџОЋЊšцšЦšЦšцšЦšч›МЏџпџџџџџџџџџџџџџџџџџџџџеД’цšІ’Ц’цšІšЅšЅ’Ц’Ц’ЦФаџџџџџџџџџџџџџџџџџџџџџџЭR››››››››Hї\џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцxšцšЦšЦšЦšЦšц››šчФёџџџџџџџџџџџџџџџџџџя;›’І’І’І’І’…’…’…’І’…’e’…ц™џџџџџџџџџџџџџџџџџџЭs’ц’ц’ч’ч’ч››››еДџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМŽšЦšЦšЦšЦšц’ц’Ц’І’Ѕ’ЅФёџџџџџџџџџџџџџџџџДNŠDŠDŠ…Š…Š…ŠeŠeŠ…Š…ŠeŠDŠDЃЋџпџџџџџџџџџџџџџџЭДŠІŠІŠІ’І’Ц’Ц’Ц’Ц’ц’чЌ џпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї}е”Ф№еДїџџџџџџџџџџџџџџџџџџџџџџџџџџї\ЃšЅ’Ѕ’Ѕ’І’І’І’Ѕ’e’dŠdŠdХ2џџџџџџџџџџџџо7Š$Š$Š$‚eŠEŠ$Š$Š$Š$ŠDŠ$Š$Š$ŠDЭSџџџџџџџџџџџџеЕŠeŠeŠ…Š…Š…Š…Š†ŠІŠІŠІŠІ’ЦцкџџџџџџџџџџџџџџџџџџџџџџџџџџџожХЭsяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяЃŠšЦšЦšЦЋЪцЙџџџџџџџџџџџџџџџџџџџџџџџџеД’…’e’…’eŠeŠ…Š…Š…ŠDŠDŠ$Š$Š$ЭSџџџџџџџџїž“)‚$‚$‚$‚E‚$‚‚‚‚‚$‚$‚‚$‚$Š†яџџџџџџџџо7ŠE‚$‚E‚e‚e‚e‚e‚eŠeŠ…Š…Š…Š…МёџџџџџџџџџџџџџџџџџџџџџџџџяЌ ››››Hц˜џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМŽ›šцšЦšц››'ЭsџпџџџџџџџџџџџџџџџџџџџџЋЋŠeŠeŠeŠEŠ$ŠE‚e‚D‚E‚$‚$‚$‚‚$ЭЕџџџџџџМё‚E‚E‚$‚‚‚%‚‚‚‚$zE‚$‚‚‚‚Ќ џџџџџџо7‚E‚‚$‚E‚E‚E‚E‚E‚e‚e‚e‚e‚e‚e“(їžџџџџџџџџџџџџџџџџџџџџеѕ›H“››››ЋЫџОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїЃi››šцšчšцšч›Д яџџџџџџџџџџџџџџџџцкŠEŠE‚e‚E‚$‚$‚$‚$‚‚‚%‚$‚‚‚‚%ЌNЌ.Ћ‹ŠEŠDŠ$‚‚‚z%z%‚z$z%z%‚‚‚‚‚‚›jЌ ДoŠЇz%z%z%zEzEzEzEzE‚E‚E‚E‚E‚E‚E‚eжџџџџџџџџџџџџџџџџї}Д’Ц’Ц’ч’ч“““›(юњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџюњ›'šцšц›šчšЦšІ’Ц’ІšчеѕџџџџџџџџџџџџџџМб‚$‚$‚E‚$‚‚‚‚‚‚z%z%‚‚‚‚‚ŠŠŠŠ$ŠŠ‚zzz%‚Š‚$‚$‚zzzzz%z%zzzzzz%z%z%zEzEzEzEzEzEzEzEzE‚EЌ џџџџџџџџџџџџџџоx›IŠ†ŠІŠІŠІ’Ц’Ц’ч’ч“оwџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоWšчšЦšЦšЦ’Ц’…’…’ІŠ…ŠeŠDДoїџџџџџџџџџО’ш‚‚‚$‚%‚‚‚zz%z%z%z%z%z%zz‚$‚$‚$‚$‚D‚‚z%z%z%zE‚Š‚D‚$‚zzzzzz%zzzzz%z%z%z%z%z%z%z%z%z%z%zEzEzE‚†я<џџџџџџџџџоН‚e‚e‚e‚eŠ…Š…ŠІŠІŠІ’Ц’цЭ“џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭ“šч’Ц’Ѕ’Ѕ’…’dŠeŠ…ŠeŠDŠ$Š$›)о™џџџџџџеі‚%‚‚z%z%z%z%z%z%z%z%zz%z%z%z‚‚‚$‚E‚E‚E‚E‚%z%z%z%z%‚%‚$‚E‚$‚zz%zzzz%zzzz%zEzEzEzEzEzEzEzEz%z%z%z%z%z%z%Нџџџџџџюћ›ЋzEzE‚E‚e‚e‚e‚e‚…Š…Š…ŠІŠІДџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМŽ’Ѕ’ІŠІŠ…ŠDŠDŠD‚e‚D‚‚‚‚%‚eНХtЃЬ‚fz%z%z%z%zzz%z%zEz%zzz%z%zz‚Š$Š$ŠeŠ…’e’e’…’e’e’e’ešЅ’І’І’ІŠІŠІŠІŠІŠ†‚f‚f‚E‚%zEzErErErErEzEzEzEzEzEzEzEzEzEz%z%zf›‹Н2Хt‚ЇzEzEzEzEzEzE‚E‚E‚e‚e‚e‚…Š…ЃЋџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃŠ’dŠeŠ…ŠDŠ$Š$‚$‚$‚%‚$‚‚z%z%z%z%z$zzzz%z%zzzzz%z%z%‚E‚†Šf’e’e’…š…š…šІš…’e’D’DŠ$Š$Š$Š$‚$zEzE‚E‚ezf‚†‚†ŠІŠІŠІ’Ч’І’Ч’ЧŠЇŠІ‚†‚fzfzErErErErEzEzEzEzEzEzEzEz%z%z%z%z%zEzEzEzEzEzEzEzE‚E‚e‚e“ї}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї}›ŠeŠe‚E‚$‚‚‚‚‚z%z%zzz%z%zzzzzz%z%z%z$‚%ŠE’e’І’Ч’ЦŠІŠf‚%zqфyфqФqфqфqФqУqФqфqфqфqфqфqфqФiФiФiфiфiфaфaфiфjjr%r%zE‚†ŠІŠІ’Ч’ЧŠІ‚†‚fzErErErErErErErEzEzEzEzEz%z%z%z%zEzEzEzEzEzEzEzE‚†цћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпя<їџџџџџџџџџџџџџџџџџџџџџџџџџџюњŠ†‚E‚$‚‚‚‚‚$‚z$z%z$zzz%zzzzzz%‚fŠ†ŠІ’І’e’eŠ%z%rqфiФiфqфyфzz$z‚z%‚$‚‚z%zEzE‚$‚z%zzzz%rErErEr%r%r%r%rjjiфaфiфjr%zfŠ†ŠІ’ЧŠЇŠ†‚fzErErErErErErEzEzEzEzEz%z%z%z%z%zEzEzEzEzEоWџџџџџџџџџџџџџџџџџџџџџџџџџџїžя;џОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцxЋыЃHЃiМаюкџџџџџџџџџџџџџџџџџџџџџџо7‚$‚%‚‚‚‚z%zzzzz%z%z%zEzz‚$ŠEŠІ’Ч’ЦŠ†zer%qфqфqфrz$z‚‚EzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEz%z%z%rErErErErErErErErEzEzEzEz%r%r%jiфaфiфjzE‚†ŠІ’ЧŠІ‚†zfrErErErErErErErEr%z%z%z%z%z%zEzEzEХSџџџџџџџџџџџџџџџџџџџџџџяХЃŠ›HЃЊеѕџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцк›(›››››'ДnоxџпџџџџџџџџџџџџџџџџХ2‚‚$‚‚‚z%z%zzzzz%zEz%zEŠešeЂ…šeŠez%jiфrz$z%zEzEzEzE‚$‚%zEzEzEzEzEzEzEzEzEzEzEzEzE‹Ќ.ДЌ›‹zfzEzErErErErErErErEzEzEzEzEzEzEzErErEr%r%rjaфiфr%zfŠІ’ЧŠЇ‚†zFrEr%rErErErErErErEr%r%z%z%z%ЌOџџџџџџџџџџџџџџџџџџц™Дo’чŠЦ’ч“““ж6џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФ№››››šч’ц’Ц’ІЃЋееїžџџџџџџџџџџџџЌ.‚z%zzzzz%z%zzz%zE‚e’eš…’ІŠDzqфqфrz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzE‚ШЭЕїžџџџџџџџџцКЃэzEzEzErErErErEzEzEzEzEzEzEzEzErEzEzEzEzEzEzEr%riфaфjzFŠІŠЧŠЇ‚†zFr%r%rErErErErErEr%r%r%“‹џџџџџџџџџџџџџпж7ЃЬ‚…‚…‚…ŠІŠІŠЦ’ч“ЌMџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМЏ››šчšЦ’Ѕ’ІŠІŠ…ŠeŠDšшХ2ї\џџџџџџї\“ z%z%z%zzzz%zEzE‚e’ІšЦ’ІŠ$ziфrz$zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzE“Jя<џџџџџџџџџџџџџџџџМђzEzErErErErEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEr%r%jaфjzfŠІ’ЧŠІzfrEr%rErErErErErEr%‚ЇцКџџџџџџїžЭЕ“JzEzEze‚e‚e‚…‚†ŠІŠЦŠЦЃЋџОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМЏ›šц’Ѕ’…’eŠ…Š…ŠeŠ$‚$‚‚ŠЇДбцкХŠ†zzzzEz%zz‚EŠ…šЦšЦ’…z%iфqфr$zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzE‚ЇцћџџџџџџџџџџџџџџџџџџџџЄ.zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzErErEr%r%iхaфj%‚†ŠЧŠЧ‚†zFr%rErErErErErEz‡ДБцњН3Šшz%z%z%zEzEzEze‚e‚e‚…‚†ŠІЃьџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМЏ’Ц’Ѕ’…ŠdŠDŠe‚e‚E‚‚‚‚z$z%z$zzzzzzz$‚E’…šЦšЦŠeriфrz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEН2џџџџџџџџџџџџџџџџџџџџџџя‚ЇzEzEzEzErErErErErErErErErEzErErEzEzEzEzEzEzEzErErErErErEr%jaфiхzFŠЇŠЧ‚†zFr%rErErErErErEzFr%r%r%r%z%z%zEzEzEzEze‚e‚e‚…ЃьџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМа’…’eŠeŠDŠD‚e‚E‚E‚$‚‚‚zzzzzz‚‚‚$’…šЦ’І‚Eiфiфz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEz†яџџџџџџџџџџџџџџџџџџџџџџџџЄ.rErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErEr%jaфr%‚І’Ч‚†zFr%rErErErErErErEr%r%r%r%z%z%z%zEzEzE‚e‚eЃЫџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФаŠdŠDŠe‚E‚E‚$‚‚‚$‚zzzzzz%‚%‚Š$’ešЦ’Іz%iфrz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzErErErE‹*џпџџџџџџџџџџџџџџџџџџџџџџџџХSrErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErEr%jaфr%‚ІŠЧ‚†zFr%rErErErErErErEr%r%r%r%z%z%zEzEzEzEЄ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМаŠDŠ$‚E‚E‚E‚‚‚zzzzzz%z%zE‚E’Eš…šez$iфrz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzErErErErErErErErErE“jџпџџџџџџџџџџџџџџџџџџџџџџџџХ•rErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErEr%jaфr%‚І’Ч‚†zFr%rErErErErErErEr%r%r%r%z%z%zEzEЌ.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџФё‚$‚$‚‚‚$zzzzzzzz%z%z%ŠEš…še‚iУrz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzErErErErErErErErErErErErErErE‹)џпџџџџџџџџџџџџџџџџџџџџџџџџНSrErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErEr%jaфr%ŠІ’Ч‚†rEr%rErErErErErErEr%r%r%r%z%z%Є.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХS‚‚‚‚zz%z%z%zzzzz‚%šeš…‚$qФqФzzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzErErErErErErErErErErErErErErErErErErEz†яџџџџџџџџџџџџџџџџџџџџџџџџœrErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErErEr%jaфrEŠІ’ЦzfrErErErErErErErEr%r%r%r%r%ЌOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХS‚‚zz$zzzzzzzz’Eš…ŠEqФqФzz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzErErErErErErErErErErErErErErErErErErErErErErErEДђџџџџџџџџџџџџџџџџџџџџџџчz‡rFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrErErErErErErErErErErErErErErErErErErErErEr%jaфzf’ЧŠІzErErErErErErErErEr%r%r%ДБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХS‚zz%zzzzzzz‚%š…’eyфiФyфz%zEzEzEzEzEzEzEzEzEzEzEzEzEzEzEzErErErErErErErErErErErErErErErErErErErErErErErErErErEz‡цКџџџџџџџџџџџџџџџџџџџџ›эrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrErErErErErErErErErErErErErEr%aхj‚†’Ч‚†rErErErErErErEzEzEzEДАџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїžџџџџџџџџџџџџџџџџџџџџџџџџџџеіz%z%zzzzzzz’eš…‚$iФqфz%z%zEzEzEzEzEzEzEzEzEzEzEzEzEzErErErErErErErErErErErErErErErEz‡“‹ЌЭецњН3rErErErFrFrFrFrFrFƒ цкџџџџџџџџџџџџџџџпЌrFrFrFrFrFrFrFrFrFrFН3цћЭіЌБ“ŒzЇrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrErErErErErErErErErEjaфrEŠЧŠЇzFrErErErErErErErEДбџџџџџџџџџџџџџџџџџџџџџџџџџџїОџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоЋыЃ‰ЋыФ№жяџпџџџџџџџџџџџџџџџџеіz%z%zzzzz‚%š…’eqфiФz%zEzEzEzEzEzEzEzEzEzEzEzEzEzErErErErErErErErErErErErErErErf‹JЌжя<џпџџџџџџџџН3rFrFrFrFrFrFrFrFrFzЇХtї}џџџџџџџпоy“ЌrFrFrFrFrFrFrFrFrFrFХ•џџџџџџџџџџя\жXДб“‹rfrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrErErErErEr%baх‚†ŠЧ‚†rErErErErErErEН3џџџџџџџџџџџџџџџџџџя<ж7НЃЬ“I›ЋЭДџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоšЦšЦšЦ’Ѕ’…Š…ŠІ“)ЌoЭ”цЙїžџџџџџџюћ“)z$z%zzzzŠ†šІ‚EiФqфz%zEz%z%zEzEzEzEzEzEzEzEzErErErErErErErErErErErErErErEzf“ЌНSцњџоџџџџџџџџџџџџџџџџџџЌБrFrFrFrFrFrFrFrFrFrFzШ“ЭЄOœ.ƒ*rFrFrFrFrFjFrFrFrFrFrFХЕџџџџџџџџџџџџџџџџџџџпяХ•›эzЇrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrErErEjaфrEŠЧŠІrFrErErErErEƒ оyџџџџџџџОцњЭеД“J‚І‚e‚e‚…Š†ŠІŠЦХSџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЋЫšЦšЦ’Ѕ’…’eŠe‚E‚Ez%‚$‚%ŠЧЃЬХSЭ•ŠЇzzzEz%z‚$’…’†qфiфr%zEzEz%zzz%zEzEzEzEzErErErErErErErErErErErErErErErF“‹НTчџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌАrFrFrFrFrFrFrFrFrFjFrFrFjFjFjFjFjFjFjFjFjFjFjFrgЭіџџџџџџџџџџџџџџџџџџџџџџџџџџџџя\Х•“ЭrgjFjFjFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFr%aхj‚†ŠЧzfrErErErErEz‡ХtХ”Є.‹ zfz%zEzEzEzE‚E‚e‚eŠ…ŠІ“(ї}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї}ЃHšЦ’Ѕ’…Š…ŠD‚D‚$z$‚‚‚zzzzzzzz%z‚%š…ŠEiФqФzz%zEzEzzzz%zEzEzErErErErErErErErErErErErErErE‚шДбоКџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌrFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFrgж7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцћЕƒ jFjFjFjFjFjFjFjFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFr%jaхzfŠЧ‚†rErErErErErErErErErEr%z%zEzEzEzE‚E‚e‚e‚…ŠЦюњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпЃЫ’Ц’…Še‚e‚D‚$‚$‚‚zzzzzzz%zzzŠEš…‚iФrz%zzzz%z%zz%zErErErErErErErErErErErErErErErE“‹ХЕїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпœ.jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFr‡ж7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїОЮ“ЬrFjFjFjFjFjFjFjFjFjFjFrFrFrFrFrFrFrFrFrFrFrFrFrFj%aхr%ŠЧ‚ІrFrErErErErErErErErEr%r%z%zEzEzEzE‚e‚e’чї}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМаŠІŠ†‚…‚E‚$‚$z$zzzzzzz‚$z%‚‚’ešeyфiФzz%zEzEzzz%zEz%rErErErErErErErErErErErErErErF›ЭжXџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпœ.jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFzШо™џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо™Є/rgjFjFjFjFjFjFjFjFjFjFjFjFjFrFrFrFrFrFrFrFrFrFr%aхb‚ЇŠЇrFr%rErErErErErErErEr%r%z%zEzEzEzE‚eЃЫџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭеŠ†Š…‚E‚$‚‚zzzzrrzz‚z$‚$še’eqФqФzzzz%zEzzzzzrErErErErErErErErErErErErFЄоЙџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп“ЭjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFzШоКџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцћЄorgjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFrFrFrFrFrFrFr%jaхz†ŠЧzfr%rFrErErErErErErErEr%r%zEzEzEzEМёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцњŠІ‚e‚$‚zzzzzzrrz‚z‚%šeŠEiФqфzzzzzzzzzz%rErErErErErErErErErErErE›Эоxџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїž“ЌjFjFjFjFjFjFjFjFjFjFjFjFjFƒ цкџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцћœ.jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFrFrFrFrFrFj%aхzfŠЧzfr&rFrFrFrErErErErErEr%r%z%zEzEж7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџО“‚Ez%zzzzzzzrz‚zŠ%š…‚%iФrzzzz%z%zzzzz%rErErErErErErErErErErF‹Kж7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїž“ЌjFjFjFjFjFjFjFjFjFjFjFƒ чџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо™“ЌjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFrFrFj%aхrFŠЧz†r&rFrFrFrFrFrErErEr%r%r%r%‚†я<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ ‚%z%zzrzzzzzzzŠEš…‚iФzz%zzzz%z%zzzr%rErErErErErErErErErFzЈНtџоџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї}ƒJjFjFjFjFjFjFjFjFjFƒJяџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЭіƒ jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj%aхj%ŠЧz†rFrFrFrFrFrFrFrEr%r%r%r%“jџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХSz$zrrrzr%rrr%zŠEš…ziФzzz%z%zz%rErEr%r%rErErErErErErErErFrFrFЄOя<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя\‹kjFjFjFjFjFjFjF‹Œя}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї}ЌбrfjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&aхj%ŠЇ‚†rFrFrFrFrFrFrFrFr%r%r%Ќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо™z$zrrr%r%z%rrr‚Eš…ziФzzzzzzrErErEr%r%rErErErErErErFrFrFƒ ж7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїžЕ{ jgjFjg{ Е3џОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо™‹kjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&aхb‚Ї‚‡jFrFrFrFrFrFrFrFr&r%ЭжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїŠШz%z%z%z%z%zzr‚Eš…ziФzzzzzzzrEr%zzrrrErErErFrFrFrFЌї}џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїОоКжyокїОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпДђrfjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&bb‚Ї‚‡jFrFrFrFrFrFrFrFrfцћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ›Ьr%r%z‚z%zzŠEš…riфzzzzzzzzr%r%rrrrr%rFrFrFrFzШЭіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџо™ƒ*jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&bb‚Ї‚‡jFjFrFrFrFrFrF‹*џОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНrrrzzzŠEš…riФzz%z%z%rErEr%r%zrr%r%rrr%rFrFrFrF“Ья<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїœOjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&bb‚Їz‡j&jFjFrFrFrFЄOџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХSrrrzEzŠ%š…ziФr%zzzr%rErErErEr%r%r%rEr%r%rFrFrFrFДёџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНtjgjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&bb‚Чz†j&rFrFrFrFЌБџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцК‚†rrz%z%‚%š…ziФzz%z%zzzrErErErErErFrFrFrFrFrFrFz‡ЭіџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоyzщjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&aхj%‚Чzfr%rFrFrFrfж7џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџц˜МЏД-Ќ ДnДДДАНМђНЭ”ЭЕЭЕ‹ zzzzz%š…‚%aФrzrEr%zzr%rErErErErFrFrFrFrFrFrFƒ цкџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя<‹ŒjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&aхjFŠЧzfr&rFrFrFzШХ”ХЕХЕН3ННДБЌoЌЌoЃэЃэЄ.жџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџж’Ц’ЅŠeŠd‚D‚$‚$zzzzzzr%zzzzz’f‚EaФrzz%r%rEr%r%r%rErErFrFrFrFrFrFrFrF“Œя\џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїОœ.jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&YхrFŠЧrfr&rFrFrFrFrFrFrFr%rrr%r%r%z%z%zEzfНџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџїЃi’ЅŠ…ŠeŠD‚$zzzzrzzrrzzzz’eŠEaФr%rEzzzr%rEr%rr%rFrFrFrFrFrFrFrFœїОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌБjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&YхzfŠЧrFrFrFrFrFrFrFrFr%rrrr%r%zzzzE‚Їюћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцк’ЦŠ…ŠeŠD‚E‚$zzz%r%rzrrrzzzŠE’eiФqфz%r%zrrrrrrrFrFrFrFrFrFrFrFЌџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj%aх‚‡‚ЇrFrFrFrFrFrFr%rrrrrr%rzzz%zeжџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя<’чŠeŠD‚D‚$‚zz%z%zzz%zrzzz%‚E’…qфiФzzr%rrrrrrr%rFrFrFrFrFrFjFЌџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџН”jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFbbŠЇ‚†rFrFrFrFr%rrrrrrrrrzz%z%оxџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌ-ŠD‚E‚$‚zzrr%rzz%z%zzz‚%š†zaфrzr%r%rrrrrrr%rFrFrFrFjFjFДђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХ•jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFbj%ŠЧzfrrrrrrrrrrrr%rrz“)џОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџоx‚D‚E‚$‚zrrr%rzzr%r%rz%’e‚%aФrrrr%r%rrrrrrrFrFrFjFjFjFЌАџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџН•jFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&aхrFŠЇrrrrrrrrrrrrrrrХ”џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпЃ‹‚Ezzzrr%r%rzzr%r%j%ŠfŠeaФqфrrrrr%r%rrr%rFrFrFjFjFjFjFЌАџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџНSjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj%aх‚†Š†r%r%r%rrrrrrrrrr‚Јїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџеіz%zzzr%r%r%r%rrrrzE’fiфiфrrrrrr%rFrFrFrFrFrFjFjFjFjF“Ќя\ї}я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]я]ї}їОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЕjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj%bŠЇz†jFrFr%rrrrrrrrr%НџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџО“)rrr%r%r%r%r%zzzz%’fzaФrrrrrrrFrFrFrFrFjFjFjFjFjFjFrfrgrgrgrgrgrgrgrgrgrgrgrgrgrgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgrЈ{*“ЭЄХЕцкїОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЄpj&jFjFjFjFjFjFjFjFjFjFjFj&j&j&rFbjŠ†zFjFrErrrr%rrrr%zЇя<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџХtzrr%r%r%rzzzzŠeŠEaФrrrr%r%rr%rFrFrFrFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&j&jFjFjFjFb&b&b&b&b&bFbFbFb&b&b&b&b&b&b&b&b&b&bFb&bFb&b&b&b&b&b&bFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbF{*œOЭїя]џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџп“юj&j&jFjFjFjFjFjFjFjFjFjjjj%r%aФz%Š†r%rrrrr%rrr%rFЌџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї}ŠЇzr%r%rzrrr‚E’fiФiхr%rrr%rFrFrFrFrFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&j&jFjFjFjFb&b&b&b&b&bFbFbFb&b&b&b&b&b&b&b&b&bFb&b&b&b&b&b&bFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFrЈœOжyџпџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџї}ƒKjFj&j&j&jFjFjFjFjFjFjjjjrEjaФŠf‚Errrrrrrr%rgцћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМђrr%r%rrrrz%’fzaФrr%rrrFrFrFrFrFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFj&j&jFjFjFb&b&b&b&b&bFbFbFb&b&b&b&b&b&b&b&bFb&b&b&b&b&b&bFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFbFƒkХжџоџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџцћrЈjFjFjFj&j&jFjFjFjFj&jjjj&rFiхiх’†z%rrrrrrr%Є.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ! { // Initialize the display let mut display = GC9A01A::new(spi, lcd_dc, lcd_cs, lcd_rst, false, LCD_WIDTH, LCD_HEIGHT); display.init(&mut delay).unwrap(); + display.set_orientation(&Orientation::Landscape).unwrap(); + + // Clear the screen before turning on the backlight + display.clear(Rgb565::BLACK).unwrap(); + _lcd_bl.set_high().unwrap(); + delay.delay_ms(1000); - // Create two frame buffers for double buffering - let mut frame_buffer_1 = unsafe { FrameBuffer::new(&mut FRAME_BUFFER_1, LCD_WIDTH, LCD_HEIGHT) }; - let mut frame_buffer_2 = unsafe { FrameBuffer::new(&mut FRAME_BUFFER_2, LCD_WIDTH, LCD_HEIGHT) }; - - // Define LCD dimensions let lcd_zero = Point::zero(); let lcd_max_corner = Point::new((LCD_WIDTH - 1) as i32, (LCD_HEIGHT - 1) as i32); - // Define a style for the rectangle let style = PrimitiveStyleBuilder::new() .fill_color(Rgb565::BLUE) .build(); - // Clear the screen before turning on the backlight - frame_buffer_1.clear(Rgb565::BLACK); - display.show(frame_buffer_1.get_buffer()).unwrap(); - delay.delay_ms(1000); - _lcd_bl.set_high().unwrap(); - delay.delay_ms(1000); - - // Draw a blue rectangle Rectangle::with_corners(lcd_zero, lcd_max_corner) .into_styled(style) - .draw(&mut frame_buffer_1) + .draw(&mut display) .unwrap(); - display.show(frame_buffer_1.get_buffer()).unwrap(); delay.delay_ms(1000); - // Draw a black rectangle inside the blue rectangle let style = PrimitiveStyleBuilder::new() .fill_color(Rgb565::BLACK) .build(); + Rectangle::with_corners( Point::new(1, 1), Point::new((LCD_WIDTH - 2) as i32, (LCD_HEIGHT - 2) as i32), ) .into_styled(style) - .draw(&mut frame_buffer_1) + .draw(&mut display) .unwrap(); - display.show(frame_buffer_1.get_buffer()).unwrap(); - delay.delay_ms(1000); - // Draw red and green lines Line::new(lcd_zero, lcd_max_corner) .into_styled(PrimitiveStyle::with_stroke(Rgb565::RED, 1)) - .draw(&mut frame_buffer_1) + .draw(&mut display) .unwrap(); + Line::new( Point::new(0, (LCD_HEIGHT - 1) as i32), Point::new((LCD_WIDTH - 1) as i32, 0), ) .into_styled(PrimitiveStyle::with_stroke(Rgb565::GREEN, 1)) - .draw(&mut frame_buffer_1) - .unwrap(); - display.show(frame_buffer_1.get_buffer()).unwrap(); - delay.delay_ms(1000); - - // Load image data - let image_data = include_bytes!("rust-logo-240x240.raw"); - - let raw_image: ImageRaw = ImageRaw::new(image_data, LCD_WIDTH); - let image = Image::new(&raw_image, Point::zero()); - - // Draw the image on both frame buffers - image.draw(&mut frame_buffer_1).unwrap(); - image.draw(&mut frame_buffer_2).unwrap(); - display.show(frame_buffer_1.get_buffer()).unwrap(); - delay.delay_ms(1000); - - // Draw a filled red triangle on the first frame buffer - let points = [ - Point::new(120, 100), - Point::new(100, 140), - Point::new(140, 140), - ]; - let style = PrimitiveStyleBuilder::new().fill_color(Rgb565::RED).build(); - Triangle::new(points[0], points[1], points[2]) - .into_styled(style) - .draw(&mut frame_buffer_1) - .unwrap(); - display.show(frame_buffer_1.get_buffer()).unwrap(); - delay.delay_ms(1000); - - // Draw a filled green triangle on the second frame buffer - let style = PrimitiveStyleBuilder::new().fill_color(Rgb565::GREEN).build(); - Triangle::new(points[0], points[1], points[2]) - .into_styled(style) - .draw(&mut frame_buffer_2) - .unwrap(); - display.show(frame_buffer_2.get_buffer()).unwrap(); - delay.delay_ms(1000); - - frame_buffer_1.clear(Rgb565::BLACK); - display.show(frame_buffer_1.get_buffer()).unwrap(); - - // Reset the frame buffers - image.draw(&mut frame_buffer_1).unwrap(); - image.draw(&mut frame_buffer_2).unwrap(); - - // Calculate the center of the image - let image_center = Point::new(240 / 2, 240 / 2); - let mut bounding_box: Rectangle; - let mut previous_bounding_box = Rectangle::new(Point::new(0, 0), Size::new(0, 0)); - // Define a rectangle at (0, 0) with width 0 and height 0 - let mut angle: f32 = 90.0; - - // Create a background buffer with frame_buffer_1 - frame_buffer_1.get_mut_buffer()[..image_data.len()].copy_from_slice(image_data); - // Create a drawing to lcd buffer with frame_buffer_2 - frame_buffer_2.get_mut_buffer()[..image_data.len()].copy_from_slice(image_data); - // Show the display to present the initial image. - display.show(frame_buffer_2.get_buffer()).unwrap(); + .draw(&mut display) + .unwrap(); + // Infinite colour wheel loop + let mut l: i32 = 0; + let mut c = Rgb565::RED; loop { - let start_time = cortex_m::peripheral::SYST::get_current(); - - // Copy the previous bounding box from the background buffer (frame_buffer_1) into the lcd buffer (frame_buffer_2) - // This prevents the whole reload of the image_data. - let previous_bounding_box_buffer = &frame_buffer_1.get_buffer()[(previous_bounding_box.top_left.y as usize * LCD_WIDTH as usize * 2) + (previous_bounding_box.top_left.x as usize * 2)..]; - let destination_buffer = &mut frame_buffer_2.get_mut_buffer()[(previous_bounding_box.top_left.y as usize * LCD_WIDTH as usize * 2) + (previous_bounding_box.top_left.x as usize * 2)..]; - - for row in 0..previous_bounding_box.size.height as usize { - let source_row_start = row * LCD_WIDTH as usize * 2; - let source_row_end = source_row_start + previous_bounding_box.size.width as usize * 2; - destination_buffer[source_row_start..source_row_end].copy_from_slice(&previous_bounding_box_buffer[source_row_start..source_row_end]); + Line::new(Point::new(0, l), Point::new((LCD_WIDTH - 1) as i32, l)) + .into_styled(PrimitiveStyle::with_stroke(c, 1)) + .draw(&mut display) + .unwrap(); + delay.delay_ms(10); + l += 1; + if l == LCD_HEIGHT as i32 { + l = 0; + c = match c { + Rgb565::RED => Rgb565::GREEN, + Rgb565::GREEN => Rgb565::BLUE, + _ => Rgb565::RED, + } } - - // Draw the arrow and return the new bounding box - bounding_box = create_arrow(&mut frame_buffer_2, angle as i32, image_center.x, image_center.y); - // Draw the center button - create_button(&mut frame_buffer_2, image_center.x, image_center.y); - - // Increment the angle - angle += 6.0; - if angle >= 360.0 { - angle = 0.0; - } - - // The bounding box has a pixel padding of 5 pixels around the arrow to prevent the need to draw the background buffer before the next arrow is drawn. - // This improves performance as only one draw operation occurs instead of 2. - display.show_region(frame_buffer_2.get_buffer(), bounding_box.top_left.x as u16, bounding_box.top_left.y as u16, bounding_box.size.width as u16, bounding_box.size.height as u16).unwrap(); - previous_bounding_box = bounding_box; - - // Delay to achieve 1 Hz - delay.delay_ms(1000); } } - -/// Create an arrow image at a specified angle and position -fn create_arrow( - framebuffer: &mut FrameBuffer, - angle: i32, - compass_center_x: i32, - compass_center_y: i32, -) -> Rectangle { - let compass_center = Point::new(compass_center_x, compass_center_y); - let north_angle = angle - 180; - let south_angle = angle; - let north_left_angle = north_angle - 2; - let north_right_angle = north_angle + 2; - let south_left_angle = south_angle + 10; - let south_right_angle = south_angle - 10; - - let circle_1 = 88; - let circle_2 = 85; - let circle_3 = 36; - let circle_4 = 32; - - let north = get_coordinates(compass_center, circle_1, north_angle); - let south = get_coordinates(compass_center, circle_4, south_angle); - let north_left = get_coordinates(compass_center, circle_2, north_left_angle); - let north_right = get_coordinates(compass_center, circle_2, north_right_angle); - let south_left = get_coordinates(compass_center, circle_3, south_left_angle); - let south_right = get_coordinates(compass_center, circle_3, south_right_angle); - - let merged_points = [ - north, - north_left, - south_left, - south, - south_right, - north_right, - ]; - - let left_points = [ - north, - north_left, - south_left, - south, - Point::zero(), // unused but needed to keep array size fixed - Point::zero(), // unused but needed to keep array size fixed - ]; - - let right_points = [ - north, - north_right, - south_right, - south, - Point::zero(), // unused but needed to keep array size fixed - Point::zero(), // unused but needed to keep array size fixed - ]; - - let red = Rgb565::new(255, 0, 0); - let red_9 = Rgb565::new(19, 1, 1); - - let style_red = PrimitiveStyleBuilder::new().fill_color(red).build(); - let style_red_9 = PrimitiveStyleBuilder::new().fill_color(red_9).build(); - - draw_polygon(framebuffer, &merged_points, style_red_9); - draw_polygon(framebuffer, &left_points[0..4], style_red); - draw_polygon(framebuffer, &right_points[0..4], style_red_9); - - // Calculate the bounding box of the arrow - let bounding_box = calculate_bounding_box(&merged_points, Some(10)); - - bounding_box -} - -/// Draw a polygon on the frame buffer -fn draw_polygon( - framebuffer: &mut FrameBuffer, - points: &[Point], - style: PrimitiveStyle, -) { - if points.len() < 3 { - return; // Not enough points to form a polygon - } - - // Use fan triangulation from the first point - let first_point = points[0]; - for i in 1..points.len() - 1 { - let triangle = Triangle::new(first_point, points[i], points[i + 1]) - .into_styled(style); - triangle.draw(framebuffer).unwrap(); - } -} - -// Helper function to calculate coordinates based on angle and radius -fn get_coordinates(center: Point, radius: i32, angle: i32) -> Point { - let angle_rad = (angle as f32).to_radians() as f64; - let x = center.x + (radius as f32 * cos(angle_rad) as f32) as i32; - let y = center.y + (radius as f32 * sin(angle_rad) as f32) as i32; - Point::new(x, y) -} - -/// Draws a circle on the frame buffer. -fn draw_circle(framebuffer: &mut FrameBuffer, color: Rgb565, center: Point, radius: i32) { - let style = PrimitiveStyleBuilder::new() - .fill_color(color) - .build(); - // Calculate the top-left corner of the circle based on the center point and radius - let top_left = Point::new(center.x - radius, center.y - radius); - let diameter = (radius * 2) as u32; - - Circle::new(top_left, diameter as u32) - .into_styled(style) - .draw(framebuffer) - .unwrap(); -} - -/// Creates a button image on the frame buffer. -fn create_button(framebuffer: &mut FrameBuffer, center_x: i32, center_y: i32) { - let circle_radius = 14; - draw_circle(framebuffer, Rgb565::BLACK, Point::new(center_x, center_y), circle_radius); -} - -/// Helper function to calculate the bounding box of a set of points with an optional padding. -fn calculate_bounding_box(points: &[Point], padding: Option) -> Rectangle { - let mut min_x = points[0].x; - let mut max_x = points[0].x; - let mut min_y = points[0].y; - let mut max_y = points[0].y; - - for point in points.iter().skip(1) { - if point.x < min_x { - min_x = point.x; - } - if point.x > max_x { - max_x = point.x; - } - if point.y < min_y { - min_y = point.y; - } - if point.y > max_y { - max_y = point.y; - } - } - - let padding = padding.unwrap_or(0) as i32; - Rectangle::new( - Point::new(min_x - padding, min_y - padding), - Size::new((max_x - min_x + 2 * padding) as u32, (max_y - min_y + 2 * padding) as u32), - ) -}