From 58a603b9ced83917c612fac200ee99705418246f Mon Sep 17 00:00:00 2001 From: Ulf Date: Sun, 16 Jun 2013 17:26:40 +0200 Subject: [PATCH] preview overlay which shows window title for now preivew zoom on hover option --- Preview.Designer.cs | 6 +- Preview.cs | 96 ++++++++++++++++++++++++- Preview.resx | 4 +- PreviewHandler.Designer.cs | 34 +++++++++ PreviewHandler.cs | 25 ++++++- PreviewHandler.resx | 8 +-- PreviewOverlay.Designer.cs | 92 ++++++++++++++++++++++++ PreviewOverlay.cs | 39 +++++++++++ PreviewOverlay.resx | 120 ++++++++++++++++++++++++++++++++ Properties/Settings.Designer.cs | 36 ++++++++++ Properties/Settings.settings | 9 +++ app.config | 9 +++ preview toy.csproj | 12 +++- preview toy.v11.suo | Bin 99840 -> 99840 bytes 14 files changed, 476 insertions(+), 14 deletions(-) create mode 100644 PreviewOverlay.Designer.cs create mode 100644 PreviewOverlay.cs create mode 100644 PreviewOverlay.resx diff --git a/Preview.Designer.cs b/Preview.Designer.cs index f542a91..114f6c4 100644 --- a/Preview.Designer.cs +++ b/Preview.Designer.cs @@ -27,7 +27,8 @@ namespace PreviewToy this.render_area.Location = new System.Drawing.Point(0, 0); this.render_area.Margin = new System.Windows.Forms.Padding(0); this.render_area.Name = "render_area"; - this.render_area.Size = new System.Drawing.Size(48, 30); + this.render_area.Size = new System.Drawing.Size(153, 89); + this.render_area.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; this.render_area.TabIndex = 0; this.render_area.TabStop = false; this.render_area.Click += new System.EventHandler(this.render_area_Click); @@ -36,7 +37,7 @@ namespace PreviewToy // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(48, 30); + this.ClientSize = new System.Drawing.Size(153, 89); this.ControlBox = false; this.Controls.Add(this.render_area); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; @@ -51,6 +52,7 @@ namespace PreviewToy this.Load += new System.EventHandler(this.Preview_Load); ((System.ComponentModel.ISupportInitialize)(this.render_area)).EndInit(); this.ResumeLayout(false); + this.PerformLayout(); } diff --git a/Preview.cs b/Preview.cs index 911a17b..8b509a6 100644 --- a/Preview.cs +++ b/Preview.cs @@ -5,17 +5,27 @@ using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; +using System.Diagnostics; namespace PreviewToy { public partial class Preview : Form { + public bool show_overlay = true; + public bool hover_zoom = true; + public float hover_zoom_factor = 3.0f; + + private bool mouse_over_lock = false; + private Size old_size; + private IntPtr m_hThumbnail; public IntPtr sourceWindow; private DwmApi.DWM_THUMBNAIL_PROPERTIES m_ThumbnailProperties; private bool has_been_set_up = false; private PreviewToyHandler spawner; + public PreviewOverlay overlay; + public Preview(IntPtr sourceWindow, String title, PreviewToyHandler spawner, Size size) { has_been_set_up = false; @@ -28,10 +38,54 @@ namespace PreviewToy this.Text = title; + this.overlay = new PreviewOverlay(this); + + this.MouseHover += new System.EventHandler(this.preview_MouseHover); + this.render_area.MouseHover += new System.EventHandler(this.preview_MouseHover); + this.overlay.MouseHover += new System.EventHandler(this.preview_MouseHover); + this.overlay.overlay_area.MouseHover += new System.EventHandler(this.preview_MouseHover); + + this.MouseLeave += new System.EventHandler(this.preview_MouseLeave); + this.render_area.MouseLeave += new System.EventHandler(this.preview_MouseLeave); + this.overlay.MouseLeave += new System.EventHandler(this.preview_MouseLeave); + this.overlay.overlay_area.MouseLeave += new System.EventHandler(this.preview_MouseLeave); + + old_size = this.Size; + has_been_set_up = true; } + public void preview_MouseHover(object sender, System.EventArgs e) + { + if (!mouse_over_lock) + { + if (hover_zoom) + { + old_size = Size; + Size = new Size((int)(hover_zoom_factor * (float)Size.Width), + (int)(hover_zoom_factor * (float)Size.Height)); + } + TopMost = true; + overlay.TopMost = true; + mouse_over_lock = true; + } + RefreshPreview(); + } + + public void preview_MouseLeave(object sender, System.EventArgs e) + { + if (mouse_over_lock) + { + if (hover_zoom) + { + Size = old_size; + } + mouse_over_lock = false; + } + RefreshPreview(); + } + protected override void OnResize(EventArgs e) { RefreshPreview(); @@ -46,17 +100,55 @@ namespace PreviewToy { base.OnMove(e); this.spawner.register_preview_position(this.Text, this.Location); + RefreshPreview(); } - protected void RefreshPreview() + public void SetLabel(String label) + { + this.Text = "-> " + label + " <-"; + this.overlay.client_label.Text = label; + } + + public void RefreshPreview() { if (has_been_set_up) { m_ThumbnailProperties.rcDestination = new DwmApi.RECT(0, 0, ClientRectangle.Right, ClientRectangle.Bottom); DwmApi.DwmUpdateThumbnailProperties(m_hThumbnail, m_ThumbnailProperties); + + Size overlay_size = this.render_area.Size; + overlay_size.Width -= 2*5; + overlay_size.Height -= 2*5; + + Point overlay_location = this.Location; + overlay_location.X += 5 + (this.Size.Width - this.render_area.Size.Width)/2; + overlay_location.Y += 5 + (this.Size.Height - this.render_area.Size.Height) - (this.Size.Width - this.render_area.Size.Width)/2; + + this.overlay.Size = overlay_size; + this.overlay.Location = overlay_location; + this.overlay.TopMost = this.TopMost; } } + public void Show() + { + base.Show(); + if (show_overlay) + { + this.overlay.Show(); + } + else + { + this.overlay.Hide(); + } + } + + public void Hide() + { + base.Hide(); + this.overlay.Hide(); + } + public void SetUp() { m_hThumbnail = DwmApi.DwmRegisterThumbnail(this.Handle, sourceWindow); @@ -94,7 +186,7 @@ namespace PreviewToy } } - private void render_area_Click(object sender, EventArgs e) + public void render_area_Click(object sender, EventArgs e) { bring_client_to_foreground(); spawner.preview_did_switch(); diff --git a/Preview.resx b/Preview.resx index ff31a6d..c7e0d4b 100644 --- a/Preview.resx +++ b/Preview.resx @@ -112,9 +112,9 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/PreviewHandler.Designer.cs b/PreviewHandler.Designer.cs index 245664d..8dacebe 100644 --- a/PreviewHandler.Designer.cs +++ b/PreviewHandler.Designer.cs @@ -48,6 +48,8 @@ namespace PreviewToy this.previewToyMainBindingSource = new System.Windows.Forms.BindingSource(this.components); this.option_sync_size_x = new System.Windows.Forms.TextBox(); this.option_sync_size_y = new System.Windows.Forms.TextBox(); + this.option_zoom_on_hover = new System.Windows.Forms.CheckBox(); + this.option_show_overlay = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.previewToyMainBindingSource)).BeginInit(); this.SuspendLayout(); // @@ -163,11 +165,41 @@ namespace PreviewToy this.option_sync_size_y.TabIndex = 12; this.option_sync_size_y.TextChanged += new System.EventHandler(this.option_sync_size_y_TextChanged); // + // option_zoom_on_hover + // + this.option_zoom_on_hover.AutoSize = true; + this.option_zoom_on_hover.Checked = true; + this.option_zoom_on_hover.CheckState = System.Windows.Forms.CheckState.Checked; + this.option_zoom_on_hover.Location = new System.Drawing.Point(12, 150); + this.option_zoom_on_hover.Name = "option_zoom_on_hover"; + this.option_zoom_on_hover.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.option_zoom_on_hover.Size = new System.Drawing.Size(98, 17); + this.option_zoom_on_hover.TabIndex = 13; + this.option_zoom_on_hover.Text = "Zoom on hover"; + this.option_zoom_on_hover.UseVisualStyleBackColor = true; + this.option_zoom_on_hover.CheckedChanged += new System.EventHandler(this.option_zoom_on_hover_CheckedChanged); + // + // option_show_overlay + // + this.option_show_overlay.AutoSize = true; + this.option_show_overlay.Checked = true; + this.option_show_overlay.CheckState = System.Windows.Forms.CheckState.Checked; + this.option_show_overlay.Location = new System.Drawing.Point(12, 173); + this.option_show_overlay.Name = "option_show_overlay"; + this.option_show_overlay.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.option_show_overlay.Size = new System.Drawing.Size(90, 17); + this.option_show_overlay.TabIndex = 14; + this.option_show_overlay.Text = "Show overlay"; + this.option_show_overlay.UseVisualStyleBackColor = true; + this.option_show_overlay.CheckedChanged += new System.EventHandler(this.option_show_overlay_CheckedChanged); + // // PreviewToyHandler // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(246, 232); + this.Controls.Add(this.option_show_overlay); + this.Controls.Add(this.option_zoom_on_hover); this.Controls.Add(this.option_sync_size_y); this.Controls.Add(this.option_sync_size_x); this.Controls.Add(this.forum_url); @@ -204,6 +236,8 @@ namespace PreviewToy private LinkLabel forum_url; private TextBox option_sync_size_x; private TextBox option_sync_size_y; + private CheckBox option_zoom_on_hover; + private CheckBox option_show_overlay; } diff --git a/PreviewHandler.cs b/PreviewHandler.cs index d9a5fa8..75c6ead 100644 --- a/PreviewHandler.cs +++ b/PreviewHandler.cs @@ -27,7 +27,7 @@ namespace PreviewToy private bool is_initialized; private Stopwatch ignoring_size_sync; - + public PreviewToyHandler() { is_initialized = false; @@ -68,6 +68,8 @@ namespace PreviewToy option_sync_size_x.Text = Properties.Settings.Default.sync_resize_x.ToString(); option_sync_size_y.Text = Properties.Settings.Default.sync_resize_y.ToString(); option_show_thumbnail_frames.Checked = Properties.Settings.Default.show_thumb_frames; + option_zoom_on_hover.Checked = Properties.Settings.Default.zoom_on_hover; + option_show_overlay.Checked = Properties.Settings.Default.show_overlay; load_layout(); } @@ -103,7 +105,7 @@ namespace PreviewToy else if (previews.ContainsKey(process.MainWindowHandle)) //or update the preview titles { - previews[process.MainWindowHandle].Text = "-> " + process.MainWindowTitle + " <-"; + previews[process.MainWindowHandle].SetLabel(process.MainWindowTitle); } if (process.MainWindowHandle == DwmApi.GetForegroundWindow()) @@ -229,7 +231,7 @@ namespace PreviewToy bool active_window_is_right_type = false; foreach (KeyValuePair entry in previews) { - if (entry.Key == window || entry.Value.Handle == window || this.Handle == window) + if (entry.Key == window || entry.Value.Handle == window || this.Handle == window || entry.Value.overlay.Handle == window) { active_window_is_right_type = true; } @@ -259,6 +261,9 @@ namespace PreviewToy entry.Value.Show(); handle_unique_layout(entry.Value, active_client_title); } + + entry.Value.hover_zoom = Properties.Settings.Default.zoom_on_hover; + entry.Value.show_overlay = Properties.Settings.Default.show_overlay; } } @@ -440,6 +445,20 @@ namespace PreviewToy } + private void option_zoom_on_hover_CheckedChanged(object sender, EventArgs e) + { + Properties.Settings.Default.zoom_on_hover = option_zoom_on_hover.Checked; + Properties.Settings.Default.Save(); + refresh_thumbnails(); + } + + private void option_show_overlay_CheckedChanged(object sender, EventArgs e) + { + Properties.Settings.Default.show_overlay = option_show_overlay.Checked; + Properties.Settings.Default.Save(); + refresh_thumbnails(); + } + } } \ No newline at end of file diff --git a/PreviewHandler.resx b/PreviewHandler.resx index 0265f10..c73ced0 100644 --- a/PreviewHandler.resx +++ b/PreviewHandler.resx @@ -112,15 +112,15 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - + AAABAAUAEBAAAAAAIABoBAAAVgAAABgYAAAAACAAiAkAAL4EAAAgIAAAAAAgAKgQAABGDgAAMDAAAAAA diff --git a/PreviewOverlay.Designer.cs b/PreviewOverlay.Designer.cs new file mode 100644 index 0000000..359c503 --- /dev/null +++ b/PreviewOverlay.Designer.cs @@ -0,0 +1,92 @@ +namespace PreviewToy +{ + partial class PreviewOverlay + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.overlay_area = new System.Windows.Forms.PictureBox(); + this.client_label = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.overlay_area)).BeginInit(); + this.SuspendLayout(); + // + // overlay_area + // + this.overlay_area.Cursor = System.Windows.Forms.Cursors.Hand; + this.overlay_area.Dock = System.Windows.Forms.DockStyle.Fill; + this.overlay_area.Location = new System.Drawing.Point(0, 0); + this.overlay_area.Name = "overlay_area"; + this.overlay_area.Size = new System.Drawing.Size(284, 262); + this.overlay_area.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.overlay_area.TabIndex = 0; + this.overlay_area.TabStop = false; + this.overlay_area.Click += new System.EventHandler(this.pictureBox1_Click); + // + // client_label + // + this.client_label.AutoSize = true; + this.client_label.Dock = System.Windows.Forms.DockStyle.Top; + this.client_label.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.client_label.ForeColor = System.Drawing.Color.DarkGray; + this.client_label.Location = new System.Drawing.Point(0, 0); + this.client_label.Name = "client_label"; + this.client_label.Size = new System.Drawing.Size(25, 13); + this.client_label.TabIndex = 1; + this.client_label.Text = "..."; + this.client_label.Click += new System.EventHandler(this.client_label_Click); + // + // PreviewOverlay + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Black; + this.ClientSize = new System.Drawing.Size(284, 262); + this.ControlBox = false; + this.Controls.Add(this.client_label); + this.Controls.Add(this.overlay_area); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PreviewOverlay"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "PreviewOverlay"; + this.TransparencyKey = System.Drawing.Color.Black; + this.Load += new System.EventHandler(this.PreviewOverlay_Load); + ((System.ComponentModel.ISupportInitialize)(this.overlay_area)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + public System.Windows.Forms.PictureBox overlay_area; + public System.Windows.Forms.Label client_label; + + } +} \ No newline at end of file diff --git a/PreviewOverlay.cs b/PreviewOverlay.cs new file mode 100644 index 0000000..adf027d --- /dev/null +++ b/PreviewOverlay.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PreviewToy +{ + public partial class PreviewOverlay : Form + { + private Preview parent; + + public PreviewOverlay(Preview parent) + { + this.parent = parent; + InitializeComponent(); + } + + private void PreviewOverlay_Load(object sender, EventArgs e) + { + + } + + private void pictureBox1_Click(object sender, EventArgs e) + { + this.parent.render_area_Click(sender, e); + } + + private void client_label_Click(object sender, EventArgs e) + { + + } + + } +} diff --git a/PreviewOverlay.resx b/PreviewOverlay.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/PreviewOverlay.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs index e97e9f9..02bd8b8 100644 --- a/Properties/Settings.Designer.cs +++ b/Properties/Settings.Designer.cs @@ -130,5 +130,41 @@ namespace PreviewToy.Properties { this["sync_resize_y"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool show_overlay { + get { + return ((bool)(this["show_overlay"])); + } + set { + this["show_overlay"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool zoom_on_hover { + get { + return ((bool)(this["zoom_on_hover"])); + } + set { + this["zoom_on_hover"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("3")] + public float zoom_amount { + get { + return ((float)(this["zoom_amount"])); + } + set { + this["zoom_amount"] = value; + } + } } } diff --git a/Properties/Settings.settings b/Properties/Settings.settings index ba6595d..b696bbd 100644 --- a/Properties/Settings.settings +++ b/Properties/Settings.settings @@ -29,5 +29,14 @@ 128 + + False + + + False + + + 3 + \ No newline at end of file diff --git a/app.config b/app.config index 1831c9b..9f5a8f1 100644 --- a/app.config +++ b/app.config @@ -34,6 +34,15 @@ 128 + + False + + + False + + + 3 + diff --git a/preview toy.csproj b/preview toy.csproj index ea9a111..e02a8dd 100644 --- a/preview toy.csproj +++ b/preview toy.csproj @@ -28,7 +28,7 @@ false true 0 - 1.6.0.0 + 1.7.0.0 false true true @@ -83,6 +83,7 @@ + @@ -99,12 +100,21 @@ PreviewHandler.cs + + Form + + + PreviewOverlay.cs + Designer PreviewHandler.cs + + PreviewOverlay.cs + ResXFileCodeGenerator Resources.Designer.cs diff --git a/preview toy.v11.suo b/preview toy.v11.suo index bb4d403e3f8cedcbb2f88d7a009b81b0850b4242..3f932acae82b51326c6679b5f83b161a728b06fd 100644 GIT binary patch delta 3525 zcmc(hdr*|u6~Mpq?ZaJIaF_53F0klos4OpmWJ!E1FN+2jiD;~CQ|JOdN`L?xi!j;M z;FuI`Vb8>CGBjg12_~70qh0HErfSxZX|2YB7d%t_`J?HZu*830Zhl?_0Db~!Aw3@ma;#M>oWv%A)rfk_b+^omE zJy)O#y|PcfAmOaM$q1XszLLNXwq|3IY=k$^tMU0xkjg@E%OGx&E48s(Zd%emLc|fP zh!+S0kw};bp7%USc7L8oCfH9d$z?=3!G3Z`CJ`=zRxd4=q#cTZjoeB|xs(_pB18f) zLd;vE(Rk`#B%DMcaX(Q&{m@pDHqH?6+KA)XBO9*zbg`_^#R~;6`#*0Wc5;eqn z;_E~$v4Pk~JWA9Nyoqk2p4dz@5b7?KQ-3S*IKlq6OOh--InuD@{;rsYwFhJU9+Kau zC0h5z6#XOzh-YHs{Uq@-c*<}jVL>!6-g`9p-?*t!<#lo-S*J#m`)V|~pB1zJdo)7zRCQBHivz!#m5{q5XQj5CRDBX9sX5vY0{-=hZXTYM;( zBnM2>P>nMtAL!AW;Kp&eSf@M?noC)v4P;%?@@-Kc#px_RyouiIp}^X4BXFAF*#FDi z;)g->t{Vyrj$_rbVw^VD8-ZV)|MT{=UQ4}Exs_`dXmwd2Nw0+FvM*EG`x+TIX{nFE z>o~KtUb~G|7aJYeyUd?nNrTB)qUE{txYC3v4N47vui_jdN#bTMIH4W)=dBAz_JIq6 zE96>U(I6RFa^rnH6dNy&Nsf6caU?dj#-#E9{ct|UTKDRat}aLk&A8(sxKhTPoK#G8 zUBl+leDnFAygC4VU6JokbUj#4}Uc|T=3pUN2i7l;BZA( zu;6a7D5h8>_rekMCMz+*>14moMJw2jeJPLPyK<3<_mZ-i(t=KHU~n2P;Eb6L0I&F7 z_aEmnC%z!$_`B!6{M|&v2Y&RMtRZXVpW^@58y%W)2=n&TO3RR2%ko)+^`#0a8AV zbDjOL9KBspFrxRVA@uJmz=B=B)N^*$N}(Gk^$^%&MXTMRj zORNa3c;*if7)UqqHgR51l8Sv`mznD@4_2tk(E)oCD;Ta5EXznfNIXPvh3A6$Fu}!& zzjW03>tg+in5-gMP1F!-@mAj7=6V0816D0s%_r`fGBz8yjxWp@@k+)ZB{ht`R-;6l zZ@s!pum-(jJ}AYRu`Bb}fG@Xd-OlxqzbClSoBh`rAwYik%L?nWvyR158!2tlHZt@`UI|^F zG~$7v45s zD}I{-sTMvT^UWT4j5-Cv77yLxZ>?YuR};W4+FD`K@|Ie6BzxrN)HjO1#KX@tC!jj` znT*Xhdhp0xiQ+JPZYNa3tDqJ8cfe9sEyY6FAnJC*=@gIpU*x8b`dn_RmDg1!3ZDmz zqAdY3#`F}2k?W0N{~jm?(cc6Wig$4}9_-;rI_LrAA6mt!cF0=9$%>jdln&*>WryvU zz9Dxk5#+~t)oe8r?NYPUCv{S|dMRl0m3JHI+DX&;1>;t!gJyTrb9Xcp{VT&z0zMc^ z0{QHN5P@(cm&)$Za)?-r{App~A3EDof+jvZ*#m_jq7PGOYf|CUu?&!fD-B%2wHhMA zp9W>|EuDKEwr#E5J-a)F|5;cq2KK_>SQhBdt|jl5f8>v~KYy^UcIeV4p37~&I2|V@ YQ=!oGC0_*pQG>(7`=ATPa^Z=80x0O74*&oF delta 4181 zcmdUy3s98T7018xvAgUdC@2f4E3Sx&3i1#TF~pUJnnV-?t5Hx%5Wxo|4wzUmY^w1| zqU^DLF&fmxki?`$*)$ld$@*xTzOXhOXVS45tB%b$PMuLSY9jQ1)?J5G&1k06nS9KT zbME_b&OP_8z20E2H*8AaeP>Of!HSZhD2gBG=E0-W_rv2mw*xW8emn;5UjgSh+2&@pVJS5zq_7 zgWg~S7!G0^^21Gip^O4SNa)Q_3L5gK)TKg60e3p-?6h{#4bYoG5hw<;!5lCblz?Zz zv!E2r17%=7Ctlc8_Q)wxz|}A38Kkc#|%;6&XgQhKAiO)oheoDnpfI=CW8bB<6QkAHseN}NeL=Tz01 zru$zG*JCTImLqyk^yDLjvD|LSGX`O167qd}K=oYHZv(d+4r>j2iKY`Tj_bwA6MM2F zuF{zqIPMpyi#2qvgk0^_CB4?G*LTU2{MWqcjgXtbu7>;`WE*%{fy zuKV{M(!U130(-#+KsJ0oXaO$pA&|BoLG}O#Ko~d(EZ`704Eh6^kbFb2UcaHYfBK7Y zV^QA4IHv|%aWFl5;qfx8Q|@Nb<)nBV-CA4Z3GfnlrC=arG>}VlFc<=20Q&S?#1b=n zoyi?3dIDr3NCG24GLVZg6^sJD`srPC@i005W3lny)&@mnL6-=S10+aH0Md@F%g;D0 z$4s8UFPDJNE#a$nnl7$chiaXxP$W{mSD>%)rq_9;oKETQb#J#voC~il|7-SDCnL;RXzV5wnV-C zfH;JB8S0(?}jd>L4$AvAwi+r&kit!aFX=R~DJB~(9+Wltf zUM=$S=t;_74t``O8?i0Vrnv)YJYSre-coDPxh$*C(|ux5EXjqSm&^DSK3N#gX9_Jm zcG@^dE9ejXF~@;W(`H=N6EX|3()i@re(c^H%6YF@c)@{a(@^t<)A4vZX8d=F%lL6A zQ3N-f>g`{mJcqv#Ts)w+>&1gbNErEoLs3g>^7PtzpFQSxP$IX4CQ3s>BwVQ1QH53stCzxyKHn4MFQ zm6KJF$BmowD8)tV`|GHZX4f$8~Rrr-q#3xRLvvd1-)~ye9)Tivy$Fv#3(DFQ8Ku;oXunm#!oF&33Qn*bSKXcwR5PEPjRPdP#dYO;R#YsD*Qn}>GvQ7$K8&JArzMxnOGzw=OMWIP zF)lfI-l({=q@-u#N=sAbB_yY&jUG9#j00{gr*7K*02fq{YhR|&5Z-ik7O%U0r>@o*KxW#0cS4wCmUfXSOta3Um7eZ`E@oKa>-3I zs!a@&x3=$-n@n!lY)uBP;M}Y6GE@|<4x=_nN99_dZnUt~IE-!(x15V@y|jqlATIeP zy}1vm+T}5nuYDOyVXpa8w^DN?8H_q_*Bo1rrrCpN27fRpMsp`oEbku_s=2FZoHlMH ajn&-2WZ$xi?3yivY_0B9@Pg(Tn*ATO{APOq