diff --git a/.vs/ToggleSwitch/v16/.suo b/.vs/ToggleSwitch/v16/.suo new file mode 100644 index 0000000..df54d0d Binary files /dev/null and b/.vs/ToggleSwitch/v16/.suo differ diff --git a/Image70.png b/Image70.png new file mode 100644 index 0000000..1fc785a Binary files /dev/null and b/Image70.png differ diff --git a/Images/060511_Switches.jpg b/Images/060511_Switches.jpg new file mode 100644 index 0000000..dd37baf Binary files /dev/null and b/Images/060511_Switches.jpg differ diff --git a/Images/060511_Switches.psd b/Images/060511_Switches.psd new file mode 100644 index 0000000..4499898 Binary files /dev/null and b/Images/060511_Switches.psd differ diff --git a/Images/checkbox.psd b/Images/checkbox.psd new file mode 100644 index 0000000..0bba2f8 Binary files /dev/null and b/Images/checkbox.psd differ diff --git a/Images/checkbox2.psd b/Images/checkbox2.psd new file mode 100644 index 0000000..944d903 Binary files /dev/null and b/Images/checkbox2.psd differ diff --git a/Images/checkbox3.psd b/Images/checkbox3.psd new file mode 100644 index 0000000..5fd3aef Binary files /dev/null and b/Images/checkbox3.psd differ diff --git a/Images/checkbox3b.psd b/Images/checkbox3b.psd new file mode 100644 index 0000000..b925842 Binary files /dev/null and b/Images/checkbox3b.psd differ diff --git a/Images/checkbox_off.png b/Images/checkbox_off.png new file mode 100644 index 0000000..0fd118a Binary files /dev/null and b/Images/checkbox_off.png differ diff --git a/Images/checkbox_off3.png b/Images/checkbox_off3.png new file mode 100644 index 0000000..bd02011 Binary files /dev/null and b/Images/checkbox_off3.png differ diff --git a/Images/checkbox_on.png b/Images/checkbox_on.png new file mode 100644 index 0000000..c523c14 Binary files /dev/null and b/Images/checkbox_on.png differ diff --git a/Images/checkbox_on2.png b/Images/checkbox_on2.png new file mode 100644 index 0000000..22e42ef Binary files /dev/null and b/Images/checkbox_on2.png differ diff --git a/Images/checkbox_on3.png b/Images/checkbox_on3.png new file mode 100644 index 0000000..00cf3b3 Binary files /dev/null and b/Images/checkbox_on3.png differ diff --git a/ToggleSwitch.bmp b/ToggleSwitch.bmp new file mode 100644 index 0000000..748d55c Binary files /dev/null and b/ToggleSwitch.bmp differ diff --git a/ToggleSwitch.png b/ToggleSwitch.png new file mode 100644 index 0000000..f303603 Binary files /dev/null and b/ToggleSwitch.png differ diff --git a/ToggleSwitch.sln b/ToggleSwitch.sln new file mode 100644 index 0000000..87b2aad --- /dev/null +++ b/ToggleSwitch.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToggleSwitch", "ToggleSwitch\ToggleSwitch.csproj", "{49B88FFA-F02C-4709-BA65-9F8996444ECD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToggleSwitchDemo", "ToggleSwitchDemo\ToggleSwitchDemo.csproj", "{2F7ADBD8-EC70-4407-8B09-474E8F2043AC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Release|Any CPU.Build.0 = Release|Any CPU + {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ToggleSwitch/GraphicsExtensionMethods.cs b/ToggleSwitch/GraphicsExtensionMethods.cs new file mode 100644 index 0000000..90df29a --- /dev/null +++ b/ToggleSwitch/GraphicsExtensionMethods.cs @@ -0,0 +1,16 @@ +using System.Drawing; + +namespace JCS +{ + public static class GraphicsExtensionMethods + { + public static Color ToGrayScale(this Color originalColor) + { + if (originalColor.Equals(Color.Transparent)) + return originalColor; + + int grayScale = (int)((originalColor.R * .299) + (originalColor.G * .587) + (originalColor.B * .114)); + return Color.FromArgb(grayScale, grayScale, grayScale); + } + } +} diff --git a/ToggleSwitch/ImageHelper.cs b/ToggleSwitch/ImageHelper.cs new file mode 100644 index 0000000..3b6d98e --- /dev/null +++ b/ToggleSwitch/ImageHelper.cs @@ -0,0 +1,52 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; + +namespace ToggleSwitch +{ + public static class ImageHelper + { + private static float[][] _colorMatrixElements = { + new float[] {(float)0.299, (float)0.299, (float)0.299, 0, 0}, + new float[] {(float)0.587, (float)0.587, (float)0.587, 0, 0}, + new float[] {(float)0.114, (float)0.114, (float)0.114, 0, 0}, + new float[] {0, 0, 0, 1, 0}, + new float[] {0, 0, 0, 0, 1} + }; + + private static ColorMatrix _grayscaleColorMatrix = new ColorMatrix(_colorMatrixElements); + + public static ImageAttributes GetGrayscaleAttributes() + { + ImageAttributes attr = new ImageAttributes(); + attr.SetColorMatrix(_grayscaleColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); + return attr; + } + + public static Size RescaleImageToFit(Size imageSize, Size canvasSize) + { + //Code "borrowed" from http://stackoverflow.com/questions/1940581/c-sharp-image-resizing-to-different-size-while-preserving-aspect-ratio + // and the Math.Min improvement from http://stackoverflow.com/questions/6501797/resize-image-proportionally-with-maxheight-and-maxwidth-constraints + + // Figure out the ratio + double ratioX = (double)canvasSize.Width / (double)imageSize.Width; + double ratioY = (double)canvasSize.Height / (double)imageSize.Height; + + // use whichever multiplier is smaller + double ratio = Math.Min(ratioX, ratioY); + + // now we can get the new height and width + int newHeight = Convert.ToInt32(imageSize.Height * ratio); + int newWidth = Convert.ToInt32(imageSize.Width * ratio); + + Size resizedSize = new Size(newWidth, newHeight); + + if (resizedSize.Width > canvasSize.Width || resizedSize.Height > canvasSize.Height) + { + throw new Exception("ImageHelper.RescaleImageToFit - Resize failed!"); + } + + return resizedSize; + } + } +} diff --git a/ToggleSwitch/Properties/AssemblyInfo.cs b/ToggleSwitch/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a18243e --- /dev/null +++ b/ToggleSwitch/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ToggleSwitch")] +[assembly: AssemblyDescription("JCS ToggleSwitch Control Library")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("JC Software Solutions")] +[assembly: AssemblyProduct("JCS ToggleSwitch")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f1b1489e-7d6c-47ae-b71c-bb97ba895d96")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.1.0.0")] +[assembly: AssemblyFileVersion("1.1.0.0")] diff --git a/ToggleSwitch/RendererChangedEventArgs.cs b/ToggleSwitch/RendererChangedEventArgs.cs new file mode 100644 index 0000000..20550ce --- /dev/null +++ b/ToggleSwitch/RendererChangedEventArgs.cs @@ -0,0 +1,14 @@ +using JCS; + +namespace ToggleSwitch +{ + public class BeforeRenderingEventArgs + { + public ToggleSwitchRendererBase Renderer { get; set; } + + public BeforeRenderingEventArgs(ToggleSwitchRendererBase renderer) + { + Renderer = renderer; + } + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchAndroidRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchAndroidRenderer.cs new file mode 100644 index 0000000..acb1547 --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchAndroidRenderer.cs @@ -0,0 +1,295 @@ +using System; +using System.Drawing; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchAndroidRenderer : ToggleSwitchRendererBase + { + #region Constructor + + public ToggleSwitchAndroidRenderer() + { + BorderColor = Color.FromArgb(255, 166, 166, 166); + BackColor = Color.FromArgb(255, 32, 32, 32); + LeftSideColor = Color.FromArgb(255, 32, 32, 32); + RightSideColor = Color.FromArgb(255, 32, 32, 32); + OffButtonColor = Color.FromArgb(255, 70, 70, 70); + OnButtonColor = Color.FromArgb(255, 27, 161, 226); + OffButtonBorderColor = Color.FromArgb(255, 70, 70, 70); + OnButtonBorderColor = Color.FromArgb(255, 27, 161, 226); + SlantAngle = 8; + } + + #endregion Constructor + + #region Public Properties + + public Color BorderColor { get; set; } + public Color BackColor { get; set; } + public Color LeftSideColor { get; set; } + public Color RightSideColor { get; set; } + public Color OffButtonColor { get; set; } + public Color OnButtonColor { get; set; } + public Color OffButtonBorderColor { get; set; } + public Color OnButtonBorderColor { get; set; } + public int SlantAngle { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + Color borderColor = !ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled ? BorderColor.ToGrayScale() : BorderColor; + + g.SetClip(borderRectangle); + + using (Pen borderPen = new Pen(borderColor)) + { + g.DrawRectangle(borderPen, borderRectangle.X, borderRectangle.Y, borderRectangle.Width - 1, borderRectangle.Height - 1); + } + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + Color leftColor = LeftSideColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + leftColor = leftColor.ToGrayScale(); + + Rectangle controlRectangle = GetInnerControlRectangle(); + + g.SetClip(controlRectangle); + + int halfCathetusLength = GetHalfCathetusLengthBasedOnAngle(); + + Rectangle adjustedLeftRect = new Rectangle(leftRectangle.X, leftRectangle.Y, leftRectangle.Width + halfCathetusLength, leftRectangle.Height); + + g.IntersectClip(adjustedLeftRect); + + using (Brush leftBrush = new SolidBrush(leftColor)) + { + g.FillRectangle(leftBrush, adjustedLeftRect); + } + + g.ResetClip(); + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + Color rightColor = RightSideColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + rightColor = rightColor.ToGrayScale(); + + Rectangle controlRectangle = GetInnerControlRectangle(); + + g.SetClip(controlRectangle); + + int halfCathetusLength = GetHalfCathetusLengthBasedOnAngle(); + + Rectangle adjustedRightRect = new Rectangle(rightRectangle.X - halfCathetusLength, rightRectangle.Y, rightRectangle.Width + halfCathetusLength, rightRectangle.Height); + + g.IntersectClip(adjustedRightRect); + + using (Brush rightBrush = new SolidBrush(rightColor)) + { + g.FillRectangle(rightBrush, adjustedRightRect); + } + + g.ResetClip(); + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + Rectangle controlRectangle = GetInnerControlRectangle(); + + g.SetClip(controlRectangle); + + int fullCathetusLength = GetCathetusLengthBasedOnAngle(); + int dblFullCathetusLength = 2*fullCathetusLength; + + Point[] polygonPoints = new Point[4]; + + Rectangle adjustedButtonRect = new Rectangle(buttonRectangle.X - fullCathetusLength, controlRectangle.Y, buttonRectangle.Width + dblFullCathetusLength, controlRectangle.Height); + + if (SlantAngle > 0) + { + polygonPoints[0] = new Point(adjustedButtonRect.X + fullCathetusLength, adjustedButtonRect.Y); + polygonPoints[1] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - 1, adjustedButtonRect.Y); + polygonPoints[2] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - fullCathetusLength - 1, adjustedButtonRect.Y + adjustedButtonRect.Height - 1); + polygonPoints[3] = new Point(adjustedButtonRect.X, adjustedButtonRect.Y + adjustedButtonRect.Height - 1); + } + else + { + polygonPoints[0] = new Point(adjustedButtonRect.X, adjustedButtonRect.Y); + polygonPoints[1] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - fullCathetusLength - 1, adjustedButtonRect.Y); + polygonPoints[2] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - 1, adjustedButtonRect.Y + adjustedButtonRect.Height - 1); + polygonPoints[3] = new Point(adjustedButtonRect.X + fullCathetusLength, adjustedButtonRect.Y + adjustedButtonRect.Height - 1); + } + + g.IntersectClip(adjustedButtonRect); + + Color buttonColor = ToggleSwitch.Checked ? OnButtonColor : OffButtonColor; + Color buttonBorderColor = ToggleSwitch.Checked ? OnButtonBorderColor : OffButtonBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonColor = buttonColor.ToGrayScale(); + buttonBorderColor = buttonBorderColor.ToGrayScale(); + } + + using (Pen buttonPen = new Pen(buttonBorderColor)) + { + g.DrawPolygon(buttonPen, polygonPoints); + } + + using (Brush buttonBrush = new SolidBrush(buttonColor)) + { + g.FillPolygon(buttonBrush, polygonPoints); + } + + Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage); + string buttonText = ToggleSwitch.Checked ? ToggleSwitch.OnText : ToggleSwitch.OffText; + + if (buttonImage != null || !string.IsNullOrEmpty(buttonText)) + { + ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment); + + if (buttonImage != null) + { + Size imageSize = buttonImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)adjustedButtonRect.X; + + bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit); + + if (scaleImage) + { + Size canvasSize = adjustedButtonRect.Size; + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)resizedImageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(buttonImage, imageRectangle); + } + else + { + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)imageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(buttonImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(buttonText)) + { + Font buttonFont = ToggleSwitch.Checked ? ToggleSwitch.OnFont : ToggleSwitch.OffFont; + Color buttonForeColor = ToggleSwitch.Checked ? ToggleSwitch.OnForeColor : ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonForeColor = buttonForeColor.ToGrayScale(); + + SizeF textSize = g.MeasureString(buttonText, buttonFont); + + float textXPos = adjustedButtonRect.X; + + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + textXPos = (float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)textSize.Width) / 2); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + textXPos = (float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + using (Brush textBrush = new SolidBrush(buttonForeColor)) + { + g.DrawString(buttonText, buttonFont, textBrush, textRectangle); + } + } + } + + g.ResetClip(); + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public Rectangle GetInnerControlRectangle() + { + return new Rectangle(1, 1, ToggleSwitch.Width - 2, ToggleSwitch.Height - 2); + } + + public int GetCathetusLengthBasedOnAngle() + { + if (SlantAngle == 0) + return 0; + + double degrees = Math.Abs(SlantAngle); + double radians = degrees * (Math.PI / 180); + double length = Math.Tan(radians)*ToggleSwitch.Height; + + return (int)length; + } + + public int GetHalfCathetusLengthBasedOnAngle() + { + if (SlantAngle == 0) + return 0; + + double degrees = Math.Abs(SlantAngle); + double radians = degrees * (Math.PI / 180); + double length = (Math.Tan(radians) * ToggleSwitch.Height) / 2; + + return (int)length; + } + + public override int GetButtonWidth() + { + double buttonWidth = (double)ToggleSwitch.Width / 2; + return (int) buttonWidth; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchBrushedMetalRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchBrushedMetalRenderer.cs new file mode 100644 index 0000000..1f4a994 --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchBrushedMetalRenderer.cs @@ -0,0 +1,483 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchBrushedMetalRenderer : ToggleSwitchRendererBase + { + #region Constructor + + public ToggleSwitchBrushedMetalRenderer() + { + BorderColor1 = Color.FromArgb(255, 145, 146, 149); + BorderColor2 = Color.FromArgb(255, 227, 229, 232); + BackColor1 = Color.FromArgb(255, 125, 126, 128); + BackColor2 = Color.FromArgb(255, 224, 226, 228); + UpperShadowColor1 = Color.FromArgb(150, 0, 0, 0); + UpperShadowColor2 = Color.FromArgb(5, 0, 0, 0); + ButtonNormalBorderColor = Color.FromArgb(255, 144, 144, 145); + ButtonNormalSurfaceColor = Color.FromArgb(255, 251, 251, 251); + ButtonHoverBorderColor = Color.FromArgb(255, 166, 167, 168); + ButtonHoverSurfaceColor = Color.FromArgb(255, 238, 238, 238); + ButtonPressedBorderColor = Color.FromArgb(255, 123, 123, 123); + ButtonPressedSurfaceColor = Color.FromArgb(255, 184, 184, 184); + + UpperShadowHeight = 8; + } + + #endregion Constructor + + #region Public Properties + + public Color BorderColor1 { get; set; } + public Color BorderColor2 { get; set; } + public Color BackColor1 { get; set; } + public Color BackColor2 { get; set; } + public Color UpperShadowColor1 { get; set; } + public Color UpperShadowColor2 { get; set; } + public Color ButtonNormalBorderColor { get; set; } + public Color ButtonNormalSurfaceColor { get; set; } + public Color ButtonHoverBorderColor { get; set; } + public Color ButtonHoverSurfaceColor { get; set; } + public Color ButtonPressedBorderColor { get; set; } + public Color ButtonPressedSurfaceColor { get; set; } + + public int UpperShadowHeight { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + //Draw outer border + using (GraphicsPath outerControlPath = GetRectangleClipPath(borderRectangle)) + { + g.SetClip(outerControlPath); + + Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BorderColor1.ToGrayScale() : BorderColor1; + Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BorderColor2.ToGrayScale() : BorderColor2; + + using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical)) + { + g.FillPath(borderBrush, outerControlPath); + } + + g.ResetClip(); + } + + //Draw inner background + Rectangle innercontrolRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 1, borderRectangle.Height - 2); + + using (GraphicsPath innerControlPath = GetRectangleClipPath(innercontrolRectangle)) + { + g.SetClip(innerControlPath); + + Color backColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor1.ToGrayScale() : BackColor1; + Color backColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor2.ToGrayScale() : BackColor2; + + using (Brush backgroundBrush = new LinearGradientBrush(borderRectangle, backColor1, backColor2, LinearGradientMode.Horizontal)) + { + g.FillPath(backgroundBrush, innerControlPath); + } + + //Draw inner top shadow + Rectangle upperShadowRectangle = new Rectangle(innercontrolRectangle.X, innercontrolRectangle.Y, innercontrolRectangle.Width, UpperShadowHeight); + + g.IntersectClip(upperShadowRectangle); + + using (Brush shadowBrush = new LinearGradientBrush(upperShadowRectangle, UpperShadowColor1, UpperShadowColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(shadowBrush, upperShadowRectangle); + } + + g.ResetClip(); + } + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + Rectangle innercontrolRectangle = new Rectangle(1, 1, ToggleSwitch.Width - 1, ToggleSwitch.Height - 2); + + using (GraphicsPath innerControlPath = GetRectangleClipPath(innercontrolRectangle)) + { + g.SetClip(innerControlPath); + + //Draw image or text + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 2 - (totalToggleFieldWidth - leftRectangle.Width), 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4); + + g.IntersectClip(fullRectangle); + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + } + + g.ResetClip(); + } + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + Rectangle innercontrolRectangle = new Rectangle(1, 1, ToggleSwitch.Width - 1, ToggleSwitch.Height - 2); + + using (GraphicsPath innerControlPath = GetRectangleClipPath(innercontrolRectangle)) + { + g.SetClip(innerControlPath); + + //Draw image or text + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4); + + g.IntersectClip(fullRectangle); + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + } + + g.ResetClip(); + } + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + g.SetClip(buttonRectangle); + + //Draw button surface + Color buttonSurfaceColor = ButtonNormalSurfaceColor; + + if (ToggleSwitch.IsButtonPressed) + buttonSurfaceColor = ButtonPressedSurfaceColor; + else if (ToggleSwitch.IsButtonHovered) + buttonSurfaceColor = ButtonHoverSurfaceColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonSurfaceColor = buttonSurfaceColor.ToGrayScale(); + + using (Brush buttonSurfaceBrush = new SolidBrush(buttonSurfaceColor)) + { + g.FillEllipse(buttonSurfaceBrush, buttonRectangle); + } + + //Draw "metal" surface + PointF centerPoint1 = new PointF(buttonRectangle.X + (buttonRectangle.Width / 2f), buttonRectangle.Y + 1.2f*(buttonRectangle.Height / 2f)); + + using (PathGradientBrush firstMetalBrush = GetBrush(new Color[] + { + Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, + Color.Transparent, Color.Transparent, Color.Transparent, Color.FromArgb(255, 110, 110, 110), Color.Transparent, Color.Transparent, + Color.Transparent + }, buttonRectangle, centerPoint1)) + { + g.FillEllipse(firstMetalBrush, buttonRectangle); + } + + PointF centerPoint2 = new PointF(buttonRectangle.X + 0.8f*(buttonRectangle.Width / 2f), buttonRectangle.Y + (buttonRectangle.Height / 2f)); + + using (PathGradientBrush secondMetalBrush = GetBrush(new Color[] + { + Color.FromArgb(255, 110, 110, 110), Color.Transparent, Color.Transparent, Color.Transparent, + Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, + Color.FromArgb(255, 110, 110, 110) + }, buttonRectangle, centerPoint2)) + { + g.FillEllipse(secondMetalBrush, buttonRectangle); + } + + PointF centerPoint3 = new PointF(buttonRectangle.X + 1.2f*(buttonRectangle.Width / 2f), buttonRectangle.Y + (buttonRectangle.Height / 2f)); + + using (PathGradientBrush thirdMetalBrush = GetBrush(new Color[] + { + Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, + Color.FromArgb(255, 98, 98, 98), Color.Transparent, Color.Transparent, Color.Transparent, + Color.Transparent + }, buttonRectangle, centerPoint3)) + { + g.FillEllipse(thirdMetalBrush, buttonRectangle); + } + + PointF centerPoint4 = new PointF(buttonRectangle.X + 0.9f*(buttonRectangle.Width / 2f), buttonRectangle.Y + 0.9f*(buttonRectangle.Height / 2f)); + + using (PathGradientBrush fourthMetalBrush = GetBrush(new Color[] + { + Color.Transparent, Color.FromArgb(255, 188, 188, 188), Color.FromArgb(255, 110, 110, 110), Color.Transparent, Color.Transparent, Color.Transparent, + Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, + Color.Transparent + }, buttonRectangle, centerPoint4)) + { + g.FillEllipse(fourthMetalBrush, buttonRectangle); + } + + //Draw button border + Color buttonBorderColor = ButtonNormalBorderColor; + + if (ToggleSwitch.IsButtonPressed) + buttonBorderColor = ButtonPressedBorderColor; + else if (ToggleSwitch.IsButtonHovered) + buttonBorderColor = ButtonHoverBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonBorderColor = buttonBorderColor.ToGrayScale(); + + using (Pen buttonBorderPen = new Pen(buttonBorderColor)) + { + g.DrawEllipse(buttonBorderPen, buttonRectangle); + } + + g.ResetClip(); + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetRectangleClipPath(Rectangle rect) + { + GraphicsPath borderPath = new GraphicsPath(); + borderPath.AddArc(rect.X, rect.Y, rect.Height, rect.Height, 90, 180); + borderPath.AddArc(rect.Width - rect.Height, rect.Y, rect.Height, rect.Height, 270, 180); + borderPath.CloseFigure(); + + return borderPath; + } + + public GraphicsPath GetButtonClipPath() + { + Rectangle buttonRectangle = GetButtonRectangle(); + + GraphicsPath buttonPath = new GraphicsPath(); + + buttonPath.AddArc(buttonRectangle.X, buttonRectangle.Y, buttonRectangle.Height, buttonRectangle.Height, 0, 360); + + return buttonPath; + } + + public override int GetButtonWidth() + { + return ToggleSwitch.Height - 2; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 1, buttonWidth, buttonWidth); + return buttonRect; + } + + private PathGradientBrush GetBrush(Color[] Colors, RectangleF r, PointF centerPoint) + { + int i = Colors.Length - 1; + PointF[] points = new PointF[i + 1]; + + float a = 0f; + int n = 0; + float cx = r.Width / 2f; + float cy = r.Height / 2f; + + int w = (int)(Math.Floor((180.0 * (i - 2.0) / i) / 2.0)); + double wi = w * Math.PI / 180.0; + double faktor = 1.0 / Math.Sin(wi); + + float radx = (float)(cx * faktor); + float rady = (float)(cy * faktor); + + while (a <= Math.PI * 2) + { + points[n] = new PointF((float)((cx + (Math.Cos(a) * radx))) + r.Left, (float)((cy + (Math.Sin(a) * rady))) + r.Top); + n += 1; + a += (float)(Math.PI * 2 / i); + } + + points[i] = points[0]; + GraphicsPath graphicsPath = new GraphicsPath(); + graphicsPath.AddLines(points); + + PathGradientBrush fBrush = new PathGradientBrush(graphicsPath); + fBrush.CenterPoint = centerPoint; + fBrush.CenterColor = Color.Transparent; + fBrush.SurroundColors = new Color[] { Color.White }; + + try + { + fBrush.SurroundColors = Colors; + } + catch (Exception ex) + { + throw new Exception("Too may colors!", ex); + } + + return fBrush; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchCarbonRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchCarbonRenderer.cs new file mode 100644 index 0000000..44dbfd0 --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchCarbonRenderer.cs @@ -0,0 +1,597 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchCarbonRenderer : ToggleSwitchRendererBase, IDisposable + { + #region Constructor + + private GraphicsPath _innerControlPath = null; + + public ToggleSwitchCarbonRenderer() + { + OuterBorderColor = Color.FromArgb(255, 106, 106, 106); + InnerBorderColor1 = Color.FromArgb(255, 141, 151, 158); + InnerBorderColor2 = Color.FromArgb(255, 138, 139, 140); + LeftSideBackColor1 = Color.FromArgb(255, 61, 99, 119); + LeftSideBackColor2 = Color.FromArgb(255, 108, 148, 179); + RightSideBackColor1 = Color.FromArgb(255, 72, 72, 72); + RightSideBackColor2 = Color.FromArgb(255, 85, 85, 85); + ButtonNormalBorderColor1 = Color.FromArgb(255, 165, 167, 169); + ButtonNormalBorderColor2 = Color.FromArgb(255, 106, 106, 106); + ButtonNormalSurfaceColor1 = Color.FromArgb(255, 235, 235, 235); + ButtonNormalSurfaceColor2 = Color.FromArgb(255, 178, 180, 182); + ButtonHoverBorderColor1 = Color.FromArgb(255, 166, 168, 169); + ButtonHoverBorderColor2 = Color.FromArgb(255, 169, 171, 173); + ButtonHoverSurfaceColor1 = Color.FromArgb(255, 223, 224, 224); + ButtonHoverSurfaceColor2 = Color.FromArgb(255, 169, 171, 173); + ButtonPressedBorderColor1 = Color.FromArgb(255, 159, 159, 162); + ButtonPressedBorderColor2 = Color.FromArgb(255, 106, 106, 106); + ButtonPressedSurfaceColor1 = Color.FromArgb(255, 176, 177, 177); + ButtonPressedSurfaceColor2 = Color.FromArgb(255, 133, 135, 136); + ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0); + ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0); + + ButtonShadowWidth = 7; + CornerRadius = 6; + } + + public void Dispose() + { + if (_innerControlPath != null) + _innerControlPath.Dispose(); + } + + #endregion Constructor + + #region Public Properties + + public Color OuterBorderColor { get; set; } + public Color InnerBorderColor1 { get; set; } + public Color InnerBorderColor2 { get; set; } + public Color LeftSideBackColor1 { get; set; } + public Color LeftSideBackColor2 { get; set; } + public Color RightSideBackColor1 { get; set; } + public Color RightSideBackColor2 { get; set; } + public Color ButtonNormalBorderColor1 { get; set; } + public Color ButtonNormalBorderColor2 { get; set; } + public Color ButtonNormalSurfaceColor1 { get; set; } + public Color ButtonNormalSurfaceColor2 { get; set; } + public Color ButtonHoverBorderColor1 { get; set; } + public Color ButtonHoverBorderColor2 { get; set; } + public Color ButtonHoverSurfaceColor1 { get; set; } + public Color ButtonHoverSurfaceColor2 { get; set; } + public Color ButtonPressedBorderColor1 { get; set; } + public Color ButtonPressedBorderColor2 { get; set; } + public Color ButtonPressedSurfaceColor1 { get; set; } + public Color ButtonPressedSurfaceColor2 { get; set; } + public Color ButtonShadowColor1 { get; set; } + public Color ButtonShadowColor2 { get; set; } + + public int ButtonShadowWidth { get; set; } + public int CornerRadius { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + //Draw outer border + using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius)) + { + g.SetClip(outerBorderPath); + + Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor; + + using (Brush outerBorderBrush = new SolidBrush(outerBorderColor)) + { + g.FillPath(outerBorderBrush, outerBorderPath); + } + + g.ResetClip(); + } + + //Draw inner border + Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2); + + using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius)) + { + g.SetClip(innerBorderPath); + + Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1; + Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2; + + using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical)) + { + g.FillPath(borderBrush, innerBorderPath); + } + + g.ResetClip(); + } + + Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4); + _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius); + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = leftRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height); + + Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1; + Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle leftShadowRectangle = new Rectangle(); + leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth; + leftShadowRectangle.Y = leftRectangle.Y; + leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + leftShadowRectangle.Height = leftRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(leftShadowRectangle); + } + else + { + g.SetClip(leftShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, leftShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = rightRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height); + + Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1; + Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle rightShadowRectangle = new Rectangle(); + rightShadowRectangle.X = rightRectangle.X - CornerRadius; + rightShadowRectangle.Y = rightRectangle.Y; + rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + rightShadowRectangle.Height = rightRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(rightShadowRectangle); + } + else + { + g.SetClip(rightShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, rightShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + buttonRectangle.Inflate(-1, -1); + + using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, CornerRadius)) + { + g.SetClip(buttonPath); + + //Draw button surface + Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1; + Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonSurfaceColor1 = ButtonPressedSurfaceColor1; + buttonSurfaceColor2 = ButtonPressedSurfaceColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonSurfaceColor1 = ButtonHoverSurfaceColor1; + buttonSurfaceColor2 = ButtonHoverSurfaceColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale(); + buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale(); + } + + using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical)) + { + g.FillPath(buttonSurfaceBrush, buttonPath); + } + + //Draw button border + Color buttonBorderColor1 = ButtonNormalBorderColor1; + Color buttonBorderColor2 = ButtonNormalBorderColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonBorderColor1 = ButtonPressedBorderColor1; + buttonBorderColor2 = ButtonPressedBorderColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonBorderColor1 = ButtonHoverBorderColor1; + buttonBorderColor2 = ButtonHoverBorderColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonBorderColor1 = buttonBorderColor1.ToGrayScale(); + buttonBorderColor2 = buttonBorderColor2.ToGrayScale(); + } + + using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical)) + { + using (Pen buttonBorderPen = new Pen(buttonBorderBrush)) + { + g.DrawPath(buttonBorderPen, buttonPath); + } + } + + g.ResetClip(); + + //Draw button image + Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage); + + if (buttonImage != null) + { + g.SetClip(buttonPath); + + ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment); + + Size imageSize = buttonImage.Size; + + Rectangle imageRectangle; + + int imageXPos = buttonRectangle.X; + + bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit); + + if (scaleImage) + { + Size canvasSize = buttonRectangle.Size; + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(buttonImage, imageRectangle); + } + else + { + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(buttonImage, imageRectangle); + } + + g.ResetClip(); + } + } + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius) + { + GraphicsPath gp = new GraphicsPath(); + int diameter = 2*radius; + + if (diameter > ToggleSwitch.Height) + diameter = ToggleSwitch.Height; + + if (diameter > ToggleSwitch.Width) + diameter = ToggleSwitch.Width; + + gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90); + gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90); + gp.CloseFigure(); + + return gp; + } + + public override int GetButtonWidth() + { + float buttonWidth = 1.61f*(ToggleSwitch.Height - 2); + return (int) buttonWidth; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchFancyRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchFancyRenderer.cs new file mode 100644 index 0000000..57d985d --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchFancyRenderer.cs @@ -0,0 +1,642 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchFancyRenderer : ToggleSwitchRendererBase, IDisposable + { + #region Constructor + + private GraphicsPath _innerControlPath = null; + + public ToggleSwitchFancyRenderer() + { + OuterBorderColor1 = Color.FromArgb(255, 197, 199, 201); + OuterBorderColor2 = Color.FromArgb(255, 207, 209, 212); + InnerBorderColor1 = Color.FromArgb(200, 205, 208, 207); + InnerBorderColor2 = Color.FromArgb(255, 207, 209, 212); + LeftSideBackColor1 = Color.FromArgb(255, 61, 110, 6); + LeftSideBackColor2 = Color.FromArgb(255, 93, 170, 9); + RightSideBackColor1 = Color.FromArgb(255, 149, 0, 0); + RightSideBackColor2 = Color.FromArgb(255, 198, 0, 0); + ButtonNormalBorderColor1 = Color.FromArgb(255, 212, 209, 211); + ButtonNormalBorderColor2 = Color.FromArgb(255, 197, 199, 201); + ButtonNormalUpperSurfaceColor1 = Color.FromArgb(255, 252, 251, 252); + ButtonNormalUpperSurfaceColor2 = Color.FromArgb(255, 247, 247, 247); + ButtonNormalLowerSurfaceColor1 = Color.FromArgb(255, 233, 233, 233); + ButtonNormalLowerSurfaceColor2 = Color.FromArgb(255, 225, 225, 225); + ButtonHoverBorderColor1 = Color.FromArgb(255, 212, 207, 209); + ButtonHoverBorderColor2 = Color.FromArgb(255, 223, 223, 223); + ButtonHoverUpperSurfaceColor1 = Color.FromArgb(255, 240, 239, 240); + ButtonHoverUpperSurfaceColor2 = Color.FromArgb(255, 235, 235, 235); + ButtonHoverLowerSurfaceColor1 = Color.FromArgb(255, 221, 221, 221); + ButtonHoverLowerSurfaceColor2 = Color.FromArgb(255, 214, 214, 214); + ButtonPressedBorderColor1 = Color.FromArgb(255, 176, 176, 176); + ButtonPressedBorderColor2 = Color.FromArgb(255, 176, 176, 176); + ButtonPressedUpperSurfaceColor1 = Color.FromArgb(255, 189, 188, 189); + ButtonPressedUpperSurfaceColor2 = Color.FromArgb(255, 185, 185, 185); + ButtonPressedLowerSurfaceColor1 = Color.FromArgb(255, 175, 175, 175); + ButtonPressedLowerSurfaceColor2 = Color.FromArgb(255, 169, 169, 169); + ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0); + ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0); + + ButtonShadowWidth = 7; + CornerRadius = 6; + } + + public void Dispose() + { + if (_innerControlPath != null) + _innerControlPath.Dispose(); + } + + #endregion Constructor + + #region Public Properties + + public Color OuterBorderColor1 { get; set; } + public Color OuterBorderColor2 { get; set; } + public Color InnerBorderColor1 { get; set; } + public Color InnerBorderColor2 { get; set; } + public Color LeftSideBackColor1 { get; set; } + public Color LeftSideBackColor2 { get; set; } + public Color RightSideBackColor1 { get; set; } + public Color RightSideBackColor2 { get; set; } + public Color ButtonNormalBorderColor1 { get; set; } + public Color ButtonNormalBorderColor2 { get; set; } + public Color ButtonNormalUpperSurfaceColor1 { get; set; } + public Color ButtonNormalUpperSurfaceColor2 { get; set; } + public Color ButtonNormalLowerSurfaceColor1 { get; set; } + public Color ButtonNormalLowerSurfaceColor2 { get; set; } + public Color ButtonHoverBorderColor1 { get; set; } + public Color ButtonHoverBorderColor2 { get; set; } + public Color ButtonHoverUpperSurfaceColor1 { get; set; } + public Color ButtonHoverUpperSurfaceColor2 { get; set; } + public Color ButtonHoverLowerSurfaceColor1 { get; set; } + public Color ButtonHoverLowerSurfaceColor2 { get; set; } + public Color ButtonPressedBorderColor1 { get; set; } + public Color ButtonPressedBorderColor2 { get; set; } + public Color ButtonPressedUpperSurfaceColor1 { get; set; } + public Color ButtonPressedUpperSurfaceColor2 { get; set; } + public Color ButtonPressedLowerSurfaceColor1 { get; set; } + public Color ButtonPressedLowerSurfaceColor2 { get; set; } + public Color ButtonShadowColor1 { get; set; } + public Color ButtonShadowColor2 { get; set; } + + public int ButtonShadowWidth { get; set; } + public int CornerRadius { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + //Draw outer border + using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius)) + { + g.SetClip(outerBorderPath); + + Color outerBorderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor1.ToGrayScale() : OuterBorderColor1; + Color outerBorderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor2.ToGrayScale() : OuterBorderColor2; + + using (Brush outerBorderBrush = new LinearGradientBrush(borderRectangle, outerBorderColor1, outerBorderColor2, LinearGradientMode.Vertical)) + { + g.FillPath(outerBorderBrush, outerBorderPath); + } + + g.ResetClip(); + } + + //Draw inner border + Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2); + + using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius)) + { + g.SetClip(innerBorderPath); + + Color innerBorderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1; + Color innerBorderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2; + + using (Brush borderBrush = new LinearGradientBrush(borderRectangle, innerBorderColor1, innerBorderColor2, LinearGradientMode.Vertical)) + { + g.FillPath(borderBrush, innerBorderPath); + } + + g.ResetClip(); + } + + Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4); + _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius); + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = leftRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height); + + Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1; + Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle leftShadowRectangle = new Rectangle(); + leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth; + leftShadowRectangle.Y = leftRectangle.Y; + leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + leftShadowRectangle.Height = leftRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(leftShadowRectangle); + } + else + { + g.SetClip(leftShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, leftShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = rightRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height); + + Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1; + Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle rightShadowRectangle = new Rectangle(); + rightShadowRectangle.X = rightRectangle.X - CornerRadius; + rightShadowRectangle.Y = rightRectangle.Y; + rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + rightShadowRectangle.Height = rightRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(rightShadowRectangle); + } + else + { + g.SetClip(rightShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, rightShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + //Draw button surface + Color buttonUpperSurfaceColor1 = ButtonNormalUpperSurfaceColor1; + Color buttonUpperSurfaceColor2 = ButtonNormalUpperSurfaceColor2; + Color buttonLowerSurfaceColor1 = ButtonNormalLowerSurfaceColor1; + Color buttonLowerSurfaceColor2 = ButtonNormalLowerSurfaceColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonUpperSurfaceColor1 = ButtonPressedUpperSurfaceColor1; + buttonUpperSurfaceColor2 = ButtonPressedUpperSurfaceColor2; + buttonLowerSurfaceColor1 = ButtonPressedLowerSurfaceColor1; + buttonLowerSurfaceColor2 = ButtonPressedLowerSurfaceColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonUpperSurfaceColor1 = ButtonHoverUpperSurfaceColor1; + buttonUpperSurfaceColor2 = ButtonHoverUpperSurfaceColor2; + buttonLowerSurfaceColor1 = ButtonHoverLowerSurfaceColor1; + buttonLowerSurfaceColor2 = ButtonHoverLowerSurfaceColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonUpperSurfaceColor1 = buttonUpperSurfaceColor1.ToGrayScale(); + buttonUpperSurfaceColor2 = buttonUpperSurfaceColor2.ToGrayScale(); + buttonLowerSurfaceColor1 = buttonLowerSurfaceColor1.ToGrayScale(); + buttonLowerSurfaceColor2 = buttonLowerSurfaceColor2.ToGrayScale(); + } + + buttonRectangle.Inflate(-1, -1); + + int upperHeight = buttonRectangle.Height/2; + + Rectangle upperGradientRect = new Rectangle(buttonRectangle.X, buttonRectangle.Y, buttonRectangle.Width, upperHeight); + Rectangle lowerGradientRect = new Rectangle(buttonRectangle.X, buttonRectangle.Y + upperHeight, buttonRectangle.Width, buttonRectangle.Height - upperHeight); + + using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, CornerRadius)) + { + g.SetClip(buttonPath); + g.IntersectClip(upperGradientRect); + + //Draw upper button surface gradient + using (Brush buttonUpperSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonUpperSurfaceColor1, buttonUpperSurfaceColor2, LinearGradientMode.Vertical)) + { + g.FillPath(buttonUpperSurfaceBrush, buttonPath); + } + + g.ResetClip(); + + g.SetClip(buttonPath); + g.IntersectClip(lowerGradientRect); + + //Draw lower button surface gradient + using (Brush buttonLowerSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonLowerSurfaceColor1, buttonLowerSurfaceColor2, LinearGradientMode.Vertical)) + { + g.FillPath(buttonLowerSurfaceBrush, buttonPath); + } + + g.ResetClip(); + + g.SetClip(buttonPath); + + //Draw button border + Color buttonBorderColor1 = ButtonNormalBorderColor1; + Color buttonBorderColor2 = ButtonNormalBorderColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonBorderColor1 = ButtonPressedBorderColor1; + buttonBorderColor2 = ButtonPressedBorderColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonBorderColor1 = ButtonHoverBorderColor1; + buttonBorderColor2 = ButtonHoverBorderColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonBorderColor1 = buttonBorderColor1.ToGrayScale(); + buttonBorderColor2 = buttonBorderColor2.ToGrayScale(); + } + + using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical)) + { + using (Pen buttonBorderPen = new Pen(buttonBorderBrush)) + { + g.DrawPath(buttonBorderPen, buttonPath); + } + } + + g.ResetClip(); + + //Draw button image + Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage); + + if (buttonImage != null) + { + g.SetClip(buttonPath); + + ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment); + + Size imageSize = buttonImage.Size; + + Rectangle imageRectangle; + + int imageXPos = buttonRectangle.X; + + bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit); + + if (scaleImage) + { + Size canvasSize = buttonRectangle.Size; + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(buttonImage, imageRectangle); + } + else + { + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(buttonImage, imageRectangle); + } + + g.ResetClip(); + } + } + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius) + { + GraphicsPath gp = new GraphicsPath(); + int diameter = 2*radius; + + if (diameter > ToggleSwitch.Height) + diameter = ToggleSwitch.Height; + + if (diameter > ToggleSwitch.Width) + diameter = ToggleSwitch.Width; + + gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90); + gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90); + gp.CloseFigure(); + + return gp; + } + + public override int GetButtonWidth() + { + float buttonWidth = 1.61f*ToggleSwitch.Height; + return (int) buttonWidth; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchIOS5Renderer.cs b/ToggleSwitch/Renderers/ToggleSwitchIOS5Renderer.cs new file mode 100644 index 0000000..edf378c --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchIOS5Renderer.cs @@ -0,0 +1,660 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchIOS5Renderer : ToggleSwitchRendererBase + { + #region Constructor + + public ToggleSwitchIOS5Renderer() + { + BorderColor = Color.FromArgb(255, 202, 202, 202); + LeftSideUpperColor1 = Color.FromArgb(255, 48, 115, 189); + LeftSideUpperColor2 = Color.FromArgb(255, 17, 123, 220); + LeftSideLowerColor1 = Color.FromArgb(255, 65, 143, 218); + LeftSideLowerColor2 = Color.FromArgb(255, 130, 190, 243); + LeftSideUpperBorderColor = Color.FromArgb(150, 123, 157, 196); + LeftSideLowerBorderColor = Color.FromArgb(150, 174, 208, 241); + RightSideUpperColor1 = Color.FromArgb(255, 191, 191, 191); + RightSideUpperColor2 = Color.FromArgb(255, 229, 229, 229); + RightSideLowerColor1 = Color.FromArgb(255, 232, 232, 232); + RightSideLowerColor2 = Color.FromArgb(255, 251, 251, 251); + RightSideUpperBorderColor = Color.FromArgb(150, 175, 175, 175); + RightSideLowerBorderColor = Color.FromArgb(150, 229, 230, 233); + ButtonShadowColor = Color.Transparent; + ButtonNormalOuterBorderColor = Color.FromArgb(255, 149, 172, 194); + ButtonNormalInnerBorderColor = Color.FromArgb(255, 235, 235, 235); + ButtonNormalSurfaceColor1 = Color.FromArgb(255, 216, 215, 216); + ButtonNormalSurfaceColor2 = Color.FromArgb(255, 251, 250, 251); + ButtonHoverOuterBorderColor = Color.FromArgb(255, 141, 163, 184); + ButtonHoverInnerBorderColor = Color.FromArgb(255, 223, 223, 223); + ButtonHoverSurfaceColor1 = Color.FromArgb(255, 205, 204, 205); + ButtonHoverSurfaceColor2 = Color.FromArgb(255, 239, 238, 239); + ButtonPressedOuterBorderColor = Color.FromArgb(255, 111, 128, 145); + ButtonPressedInnerBorderColor = Color.FromArgb(255, 176, 176, 176); + ButtonPressedSurfaceColor1 = Color.FromArgb(255, 162, 161, 162); + ButtonPressedSurfaceColor2 = Color.FromArgb(255, 187, 187, 187); + } + + #endregion Constructor + + #region Public Properties + + public Color BorderColor { get; set; } + public Color LeftSideUpperColor1 { get; set; } + public Color LeftSideUpperColor2 { get; set; } + public Color LeftSideLowerColor1 { get; set; } + public Color LeftSideLowerColor2 { get; set; } + public Color LeftSideUpperBorderColor { get; set; } + public Color LeftSideLowerBorderColor { get; set; } + public Color RightSideUpperColor1 { get; set; } + public Color RightSideUpperColor2 { get; set; } + public Color RightSideLowerColor1 { get; set; } + public Color RightSideLowerColor2 { get; set; } + public Color RightSideUpperBorderColor { get; set; } + public Color RightSideLowerBorderColor { get; set; } + public Color ButtonShadowColor { get; set; } + public Color ButtonNormalOuterBorderColor { get; set; } + public Color ButtonNormalInnerBorderColor { get; set; } + public Color ButtonNormalSurfaceColor1 { get; set; } + public Color ButtonNormalSurfaceColor2 { get; set; } + public Color ButtonHoverOuterBorderColor { get; set; } + public Color ButtonHoverInnerBorderColor { get; set; } + public Color ButtonHoverSurfaceColor1 { get; set; } + public Color ButtonHoverSurfaceColor2 { get; set; } + public Color ButtonPressedOuterBorderColor { get; set; } + public Color ButtonPressedInnerBorderColor { get; set; } + public Color ButtonPressedSurfaceColor1 { get; set; } + public Color ButtonPressedSurfaceColor2 { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + //Draw this one AFTER the button is drawn in the RenderButton method + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + + int buttonWidth = GetButtonWidth(); + + //Draw upper gradient field + int gradientRectWidth = leftRectangle.Width + buttonWidth / 2; + int upperGradientRectHeight = (int)((double)0.8*(double)(leftRectangle.Height - 2)); + + Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + GraphicsPath controlClipPath = GetControlClipPath(controlRectangle); + + Rectangle upperGradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y + 1, gradientRectWidth, upperGradientRectHeight - 1); + + g.SetClip(controlClipPath); + g.IntersectClip(upperGradientRectangle); + + using (GraphicsPath upperGradientPath = new GraphicsPath()) + { + upperGradientPath.AddArc(upperGradientRectangle.X, upperGradientRectangle.Y, ToggleSwitch.Height, ToggleSwitch.Height, 135, 135); + upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y); + upperGradientPath.AddLine(upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y + upperGradientRectangle.Height); + upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y + upperGradientRectangle.Height, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y + upperGradientRectangle.Height); + + Color upperColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideUpperColor1.ToGrayScale() : LeftSideUpperColor1; + Color upperColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideUpperColor2.ToGrayScale() : LeftSideUpperColor2; + + using (Brush upperGradientBrush = new LinearGradientBrush(upperGradientRectangle, upperColor1, upperColor2, LinearGradientMode.Vertical)) + { + g.FillPath(upperGradientBrush, upperGradientPath); + } + } + + g.ResetClip(); + + //Draw lower gradient field + int lowerGradientRectHeight = (int)Math.Ceiling((double)0.5 * (double)(leftRectangle.Height - 2)); + + Rectangle lowerGradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y + (leftRectangle.Height / 2), gradientRectWidth, lowerGradientRectHeight); + + g.SetClip(controlClipPath); + g.IntersectClip(lowerGradientRectangle); + + using (GraphicsPath lowerGradientPath = new GraphicsPath()) + { + lowerGradientPath.AddArc(1, lowerGradientRectangle.Y, (int) (0.75*(ToggleSwitch.Height - 1)), ToggleSwitch.Height - 1, 215, 45); //Arc from side to top + lowerGradientPath.AddLine(lowerGradientRectangle.X + buttonWidth/2, lowerGradientRectangle.Y, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y); + lowerGradientPath.AddLine(lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y + lowerGradientRectangle.Height); + lowerGradientPath.AddLine(lowerGradientRectangle.X + buttonWidth/4, lowerGradientRectangle.Y + lowerGradientRectangle.Height, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y + lowerGradientRectangle.Height); + lowerGradientPath.AddArc(1, 1, ToggleSwitch.Height - 1, ToggleSwitch.Height - 1, 90, 70); //Arc from side to bottom + + Color lowerColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideLowerColor1.ToGrayScale() : LeftSideLowerColor1; + Color lowerColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideLowerColor2.ToGrayScale() : LeftSideLowerColor2; + + using (Brush lowerGradientBrush = new LinearGradientBrush(lowerGradientRectangle, lowerColor1, lowerColor2, LinearGradientMode.Vertical)) + { + g.FillPath(lowerGradientBrush, lowerGradientPath); + } + } + + g.ResetClip(); + + controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + controlClipPath = GetControlClipPath(controlRectangle); + + g.SetClip(controlClipPath); + + //Draw upper inside border + Color upperBordercolor = LeftSideUpperBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + upperBordercolor = upperBordercolor.ToGrayScale(); + + using (Pen upperBorderPen = new Pen(upperBordercolor)) + { + g.DrawLine(upperBorderPen, leftRectangle.X, leftRectangle.Y + 1, leftRectangle.X + leftRectangle.Width + (buttonWidth / 2), leftRectangle.Y + 1); + } + + //Draw lower inside border + Color lowerBordercolor = LeftSideLowerBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + lowerBordercolor = lowerBordercolor.ToGrayScale(); + + using (Pen lowerBorderPen = new Pen(lowerBordercolor)) + { + g.DrawLine(lowerBorderPen, leftRectangle.X, leftRectangle.Y + leftRectangle.Height - 1, leftRectangle.X + leftRectangle.Width + (buttonWidth / 2), leftRectangle.Y + leftRectangle.Height - 1); + } + + //Draw image or text + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 2 - (totalToggleFieldWidth - leftRectangle.Width), 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4); + + g.IntersectClip(fullRectangle); + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + } + + g.ResetClip(); + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + + Rectangle buttonRectangle = GetButtonRectangle(); + + Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + GraphicsPath controlClipPath = GetControlClipPath(controlRectangle); + + //Draw upper gradient field + int gradientRectWidth = rightRectangle.Width + buttonRectangle.Width / 2; + int upperGradientRectHeight = (int)((double)0.8 * (double)(rightRectangle.Height - 2)); + + Rectangle upperGradientRectangle = new Rectangle(rightRectangle.X - buttonRectangle.Width / 2, rightRectangle.Y + 1, gradientRectWidth - 1, upperGradientRectHeight - 1); + + g.SetClip(controlClipPath); + g.IntersectClip(upperGradientRectangle); + + using (GraphicsPath upperGradientPath = new GraphicsPath()) + { + upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y); + upperGradientPath.AddArc(upperGradientRectangle.X + upperGradientRectangle.Width - ToggleSwitch.Height + 1, upperGradientRectangle.Y - 1, ToggleSwitch.Height, ToggleSwitch.Height, 270, 115); + upperGradientPath.AddLine(upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y + upperGradientRectangle.Height, upperGradientRectangle.X, upperGradientRectangle.Y + upperGradientRectangle.Height); + upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y + upperGradientRectangle.Height, upperGradientRectangle.X, upperGradientRectangle.Y); + + Color upperColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideUpperColor1.ToGrayScale() : RightSideUpperColor1; + Color upperColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideUpperColor2.ToGrayScale() : RightSideUpperColor2; + + using (Brush upperGradientBrush = new LinearGradientBrush(upperGradientRectangle, upperColor1, upperColor2, LinearGradientMode.Vertical)) + { + g.FillPath(upperGradientBrush, upperGradientPath); + } + } + + g.ResetClip(); + + //Draw lower gradient field + int lowerGradientRectHeight = (int)Math.Ceiling((double)0.5 * (double)(rightRectangle.Height - 2)); + + Rectangle lowerGradientRectangle = new Rectangle(rightRectangle.X - buttonRectangle.Width / 2, rightRectangle.Y + (rightRectangle.Height / 2), gradientRectWidth - 1, lowerGradientRectHeight); + + g.SetClip(controlClipPath); + g.IntersectClip(lowerGradientRectangle); + + using (GraphicsPath lowerGradientPath = new GraphicsPath()) + { + lowerGradientPath.AddLine(lowerGradientRectangle.X, lowerGradientRectangle.Y, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y); + lowerGradientPath.AddArc(lowerGradientRectangle.X + lowerGradientRectangle.Width - (int)(0.75 * (ToggleSwitch.Height - 1)), lowerGradientRectangle.Y, (int)(0.75 * (ToggleSwitch.Height - 1)), ToggleSwitch.Height - 1, 270, 45); //Arc from top to side + lowerGradientPath.AddArc(ToggleSwitch.Width - ToggleSwitch.Height, 0, ToggleSwitch.Height, ToggleSwitch.Height, 20, 70); //Arc from side to bottom + lowerGradientPath.AddLine(lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y + lowerGradientRectangle.Height, lowerGradientRectangle.X, lowerGradientRectangle.Y + lowerGradientRectangle.Height); + lowerGradientPath.AddLine(lowerGradientRectangle.X, lowerGradientRectangle.Y + lowerGradientRectangle.Height, lowerGradientRectangle.X, lowerGradientRectangle.Y); + + Color lowerColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideLowerColor1.ToGrayScale() : RightSideLowerColor1; + Color lowerColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideLowerColor2.ToGrayScale() : RightSideLowerColor2; + + using (Brush lowerGradientBrush = new LinearGradientBrush(lowerGradientRectangle, lowerColor1, lowerColor2, LinearGradientMode.Vertical)) + { + g.FillPath(lowerGradientBrush, lowerGradientPath); + } + } + + g.ResetClip(); + + controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + controlClipPath = GetControlClipPath(controlRectangle); + + g.SetClip(controlClipPath); + + //Draw upper inside border + Color upperBordercolor = RightSideUpperBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + upperBordercolor = upperBordercolor.ToGrayScale(); + + using (Pen upperBorderPen = new Pen(upperBordercolor)) + { + g.DrawLine(upperBorderPen, rightRectangle.X - (buttonRectangle.Width / 2), rightRectangle.Y + 1, rightRectangle.X + rightRectangle.Width, rightRectangle.Y + 1); + } + + //Draw lower inside border + Color lowerBordercolor = RightSideLowerBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + lowerBordercolor = lowerBordercolor.ToGrayScale(); + + using (Pen lowerBorderPen = new Pen(lowerBordercolor)) + { + g.DrawLine(lowerBorderPen, rightRectangle.X - (buttonRectangle.Width / 2), rightRectangle.Y + rightRectangle.Height - 1, rightRectangle.X + rightRectangle.Width, rightRectangle.Y + rightRectangle.Height - 1); + } + + //Draw image or text + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4); + + g.IntersectClip(fullRectangle); + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + } + + g.ResetClip(); + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + if (ToggleSwitch.IsButtonOnLeftSide) + buttonRectangle.X += 1; + else if (ToggleSwitch.IsButtonOnRightSide) + buttonRectangle.X -= 1; + + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + + //Draw button shadow + buttonRectangle.Inflate(1, 1); + + Rectangle shadowClipRectangle = new Rectangle(buttonRectangle.Location, buttonRectangle.Size); + shadowClipRectangle.Inflate(0, -1); + + if (ToggleSwitch.IsButtonOnLeftSide) + { + shadowClipRectangle.X += shadowClipRectangle.Width / 2; + shadowClipRectangle.Width = shadowClipRectangle.Width / 2; + } + else if (ToggleSwitch.IsButtonOnRightSide) + { + shadowClipRectangle.Width = shadowClipRectangle.Width / 2; + } + + g.SetClip(shadowClipRectangle); + + Color buttonShadowColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? ButtonShadowColor.ToGrayScale() : ButtonShadowColor; + + using (Pen buttonShadowPen = new Pen(buttonShadowColor)) + { + g.DrawEllipse(buttonShadowPen, buttonRectangle); + } + + g.ResetClip(); + + buttonRectangle.Inflate(-1, -1); + + //Draw outer button border + Color buttonOuterBorderColor = ButtonNormalOuterBorderColor; + + if (ToggleSwitch.IsButtonPressed) + buttonOuterBorderColor = ButtonPressedOuterBorderColor; + else if (ToggleSwitch.IsButtonHovered) + buttonOuterBorderColor = ButtonHoverOuterBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonOuterBorderColor = buttonOuterBorderColor.ToGrayScale(); + + using (Brush outerBorderBrush = new SolidBrush(buttonOuterBorderColor)) + { + g.FillEllipse(outerBorderBrush, buttonRectangle); + } + + //Draw inner button border + buttonRectangle.Inflate(-1, -1); + + Color buttonInnerBorderColor = ButtonNormalInnerBorderColor; + + if (ToggleSwitch.IsButtonPressed) + buttonInnerBorderColor = ButtonPressedInnerBorderColor; + else if (ToggleSwitch.IsButtonHovered) + buttonInnerBorderColor = ButtonHoverInnerBorderColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonInnerBorderColor = buttonInnerBorderColor.ToGrayScale(); + + using (Brush innerBorderBrush = new SolidBrush(buttonInnerBorderColor)) + { + g.FillEllipse(innerBorderBrush, buttonRectangle); + } + + //Draw button surface + buttonRectangle.Inflate(-1, -1); + + Color buttonUpperSurfaceColor = ButtonNormalSurfaceColor1; + + if (ToggleSwitch.IsButtonPressed) + buttonUpperSurfaceColor = ButtonPressedSurfaceColor1; + else if (ToggleSwitch.IsButtonHovered) + buttonUpperSurfaceColor = ButtonHoverSurfaceColor1; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonUpperSurfaceColor = buttonUpperSurfaceColor.ToGrayScale(); + + Color buttonLowerSurfaceColor = ButtonNormalSurfaceColor2; + + if (ToggleSwitch.IsButtonPressed) + buttonLowerSurfaceColor = ButtonPressedSurfaceColor2; + else if (ToggleSwitch.IsButtonHovered) + buttonLowerSurfaceColor = ButtonHoverSurfaceColor2; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonLowerSurfaceColor = buttonLowerSurfaceColor.ToGrayScale(); + + using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonUpperSurfaceColor, buttonLowerSurfaceColor, LinearGradientMode.Vertical)) + { + g.FillEllipse(buttonSurfaceBrush, buttonRectangle); + } + + g.CompositingMode = CompositingMode.SourceOver; + g.CompositingQuality = CompositingQuality.HighQuality; + + //Draw outer control border + Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + + using (GraphicsPath borderPath = GetControlClipPath(controlRectangle)) + { + Color controlBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BorderColor.ToGrayScale() : BorderColor; + + using (Pen borderPen = new Pen(controlBorderColor)) + { + g.DrawPath(borderPen, borderPath); + } + } + + g.ResetClip(); + + //Draw button image + Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage); + + if (buttonImage != null) + { + g.SetClip(GetButtonClipPath()); + + ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment); + + Size imageSize = buttonImage.Size; + + Rectangle imageRectangle; + + int imageXPos = buttonRectangle.X; + + bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit); + + if (scaleImage) + { + Size canvasSize = buttonRectangle.Size; + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0,0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(buttonImage, imageRectangle); + } + else + { + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(buttonImage, imageRectangle); + } + + g.ResetClip(); + } + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetControlClipPath(Rectangle controlRectangle) + { + GraphicsPath borderPath = new GraphicsPath(); + borderPath.AddArc(controlRectangle.X, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 90, 180); + borderPath.AddArc(controlRectangle.X + controlRectangle.Width - controlRectangle.Height, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 270, 180); + borderPath.CloseFigure(); + + return borderPath; + } + + public GraphicsPath GetButtonClipPath() + { + Rectangle buttonRectangle = GetButtonRectangle(); + + GraphicsPath buttonPath = new GraphicsPath(); + + buttonPath.AddArc(buttonRectangle.X, buttonRectangle.Y, buttonRectangle.Height, buttonRectangle.Height, 0, 360); + + return buttonPath; + } + + public override int GetButtonWidth() + { + return ToggleSwitch.Height - 2; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 1, buttonWidth, buttonWidth); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchIphoneRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchIphoneRenderer.cs new file mode 100644 index 0000000..e3ad9b2 --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchIphoneRenderer.cs @@ -0,0 +1,605 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchIphoneRenderer : ToggleSwitchRendererBase, IDisposable + { + #region Constructor + + private GraphicsPath _innerControlPath = null; + + public ToggleSwitchIphoneRenderer() + { + OuterBorderColor = Color.FromArgb(255, 205, 205, 207); + InnerBorderColor1 = Color.FromArgb(200, 205, 205, 207); + InnerBorderColor2 = Color.FromArgb(200, 205, 205, 207); + LeftSideBackColor1 = Color.FromArgb(255, 50, 101, 161); + LeftSideBackColor2 = Color.FromArgb(255, 123, 174, 229); + RightSideBackColor1 = Color.FromArgb(255, 161, 161, 161); + RightSideBackColor2 = Color.FromArgb(255, 250, 250, 250); + ButtonNormalBorderColor1 = Color.FromArgb(255, 172, 172, 172); + ButtonNormalBorderColor2 = Color.FromArgb(255, 196, 196, 196); + ButtonNormalSurfaceColor1 = Color.FromArgb(255, 216, 215, 216); + ButtonNormalSurfaceColor2 = Color.FromArgb(255, 251, 250, 251); + ButtonHoverBorderColor1 = Color.FromArgb(255, 163, 163, 163); + ButtonHoverBorderColor2 = Color.FromArgb(255, 185, 185, 185); + ButtonHoverSurfaceColor1 = Color.FromArgb(255, 205, 204, 205); + ButtonHoverSurfaceColor2 = Color.FromArgb(255, 239, 238, 239); + ButtonPressedBorderColor1 = Color.FromArgb(255, 129, 129, 129); + ButtonPressedBorderColor2 = Color.FromArgb(255, 146, 146, 146); + ButtonPressedSurfaceColor1 = Color.FromArgb(255, 162, 161, 162); + ButtonPressedSurfaceColor2 = Color.FromArgb(255, 188, 187, 188); + ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0); + ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0); + + ButtonShadowWidth = 7; + CornerRadius = 6; + ButtonCornerRadius = 9; + } + + public void Dispose() + { + if (_innerControlPath != null) + _innerControlPath.Dispose(); + } + + #endregion Constructor + + #region Public Properties + + public Color OuterBorderColor { get; set; } + public Color InnerBorderColor1 { get; set; } + public Color InnerBorderColor2 { get; set; } + public Color LeftSideBackColor1 { get; set; } + public Color LeftSideBackColor2 { get; set; } + public Color RightSideBackColor1 { get; set; } + public Color RightSideBackColor2 { get; set; } + public Color ButtonNormalBorderColor1 { get; set; } + public Color ButtonNormalBorderColor2 { get; set; } + public Color ButtonNormalSurfaceColor1 { get; set; } + public Color ButtonNormalSurfaceColor2 { get; set; } + public Color ButtonHoverBorderColor1 { get; set; } + public Color ButtonHoverBorderColor2 { get; set; } + public Color ButtonHoverSurfaceColor1 { get; set; } + public Color ButtonHoverSurfaceColor2 { get; set; } + public Color ButtonPressedBorderColor1 { get; set; } + public Color ButtonPressedBorderColor2 { get; set; } + public Color ButtonPressedSurfaceColor1 { get; set; } + public Color ButtonPressedSurfaceColor2 { get; set; } + public Color ButtonShadowColor1 { get; set; } + public Color ButtonShadowColor2 { get; set; } + + public int ButtonShadowWidth { get; set; } + public int CornerRadius { get; set; } + public int ButtonCornerRadius { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + //Draw outer border + using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius)) + { + g.SetClip(outerBorderPath); + + Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor; + + using (Brush outerBorderBrush = new SolidBrush(outerBorderColor)) + { + g.FillPath(outerBorderBrush, outerBorderPath); + } + + g.ResetClip(); + } + + //Draw inner border + Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2); + + using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius)) + { + g.SetClip(innerBorderPath); + + Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1; + Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2; + + using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical)) + { + g.FillPath(borderBrush, innerBorderPath); + } + + g.ResetClip(); + } + + Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4); + _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius); + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = leftRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height); + + Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1; + Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle leftShadowRectangle = new Rectangle(); + leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth; + leftShadowRectangle.Y = leftRectangle.Y; + leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + leftShadowRectangle.Height = leftRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(leftShadowRectangle); + } + else + { + g.SetClip(leftShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, leftShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = rightRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height); + + Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1; + Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle rightShadowRectangle = new Rectangle(); + rightShadowRectangle.X = rightRectangle.X - CornerRadius; + rightShadowRectangle.Y = rightRectangle.Y; + rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + rightShadowRectangle.Height = rightRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(rightShadowRectangle); + } + else + { + g.SetClip(rightShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, rightShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, ButtonCornerRadius)) + { + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(buttonRectangle); + } + else + { + g.SetClip(buttonRectangle); + } + + //Draw button surface + Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1; + Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonSurfaceColor1 = ButtonPressedSurfaceColor1; + buttonSurfaceColor2 = ButtonPressedSurfaceColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonSurfaceColor1 = ButtonHoverSurfaceColor1; + buttonSurfaceColor2 = ButtonHoverSurfaceColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale(); + buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale(); + } + + using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical)) + { + g.FillPath(buttonSurfaceBrush, buttonPath); + } + + //Draw button border + Color buttonBorderColor1 = ButtonNormalBorderColor1; + Color buttonBorderColor2 = ButtonNormalBorderColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonBorderColor1 = ButtonPressedBorderColor1; + buttonBorderColor2 = ButtonPressedBorderColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonBorderColor1 = ButtonHoverBorderColor1; + buttonBorderColor2 = ButtonHoverBorderColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonBorderColor1 = buttonBorderColor1.ToGrayScale(); + buttonBorderColor2 = buttonBorderColor2.ToGrayScale(); + } + + using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical)) + { + using (Pen buttonBorderPen = new Pen(buttonBorderBrush)) + { + g.DrawPath(buttonBorderPen, buttonPath); + } + } + + g.ResetClip(); + + //Draw button image + Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage); + + if (buttonImage != null) + { + g.SetClip(buttonPath); + + ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment); + + Size imageSize = buttonImage.Size; + + Rectangle imageRectangle; + + int imageXPos = buttonRectangle.X; + + bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit); + + if (scaleImage) + { + Size canvasSize = buttonRectangle.Size; + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(buttonImage, imageRectangle); + } + else + { + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(buttonImage, imageRectangle); + } + + g.ResetClip(); + } + } + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius) + { + GraphicsPath gp = new GraphicsPath(); + int diameter = 2*radius; + + if (diameter > ToggleSwitch.Height) + diameter = ToggleSwitch.Height; + + if (diameter > ToggleSwitch.Width) + diameter = ToggleSwitch.Width; + + gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90); + gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90); + gp.CloseFigure(); + + return gp; + } + + public override int GetButtonWidth() + { + float buttonWidth = 1.57f*ToggleSwitch.Height; + return (int) buttonWidth; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchMetroRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchMetroRenderer.cs new file mode 100644 index 0000000..2566f8e --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchMetroRenderer.cs @@ -0,0 +1,324 @@ +using System.Drawing; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchMetroRenderer : ToggleSwitchRendererBase + { + #region Constructor + + public ToggleSwitchMetroRenderer() + { + BackColor = Color.White; + LeftSideColor = Color.FromArgb(255, 23, 153, 0); + LeftSideColorHovered = Color.FromArgb(255, 36, 182, 9); + LeftSideColorPressed = Color.FromArgb(255, 121, 245, 100); + RightSideColor = Color.FromArgb(255, 166, 166, 166); + RightSideColorHovered = Color.FromArgb(255, 181, 181, 181); + RightSideColorPressed = Color.FromArgb(255, 189, 189, 189); + BorderColor = Color.FromArgb(255, 166, 166, 166); + ButtonColor = Color.Black; + ButtonColorHovered = Color.Black; + ButtonColorPressed = Color.Black; + } + + #endregion Constructor + + #region Public Properties + + public Color BackColor { get; set; } + public Color LeftSideColor { get; set; } + public Color LeftSideColorHovered { get; set; } + public Color LeftSideColorPressed { get; set; } + public Color RightSideColor { get; set; } + public Color RightSideColorHovered { get; set; } + public Color RightSideColorPressed { get; set; } + public Color BorderColor { get; set; } + public Color ButtonColor { get; set; } + public Color ButtonColorHovered { get; set; } + public Color ButtonColorPressed { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + Color borderColor = !ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled ? BorderColor.ToGrayScale() : BorderColor; + + g.SetClip(borderRectangle); + + using (Pen borderPen = new Pen(borderColor)) + { + g.DrawRectangle(borderPen, borderRectangle.X, borderRectangle.Y, borderRectangle.Width - 1, borderRectangle.Height - 1); + } + + g.ResetClip(); + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + Rectangle adjustedLeftRect = new Rectangle(leftRectangle.X + 2, 2, leftRectangle.Width - 2, leftRectangle.Height - 4); + + if (adjustedLeftRect.Width > 0) + { + Color leftColor = LeftSideColor; + + if (ToggleSwitch.IsLeftSidePressed) + leftColor = LeftSideColorPressed; + else if (ToggleSwitch.IsLeftSideHovered) + leftColor = LeftSideColorHovered; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + leftColor = leftColor.ToGrayScale(); + + g.SetClip(adjustedLeftRect); + + using (Brush leftBrush = new SolidBrush(leftColor)) + { + g.FillRectangle(leftBrush, adjustedLeftRect); + } + + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 2 - (totalToggleFieldWidth - leftRectangle.Width), 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4); + + g.IntersectClip(fullRectangle); + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float) fullRectangle.X + (((float) fullRectangle.Width - (float) textSize.Width)/2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float) fullRectangle.X + (float)fullRectangle.Width - (float) textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + } + + g.ResetClip(); + } + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + Rectangle adjustedRightRect = new Rectangle(rightRectangle.X, 2, rightRectangle.Width - 2, rightRectangle.Height - 4); + + if (adjustedRightRect.Width > 0) + { + Color rightColor = RightSideColor; + + if (ToggleSwitch.IsRightSidePressed) + rightColor = RightSideColorPressed; + else if (ToggleSwitch.IsRightSideHovered) + rightColor = RightSideColorHovered; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + rightColor = rightColor.ToGrayScale(); + + g.SetClip(adjustedRightRect); + + using (Brush rightBrush = new SolidBrush(rightColor)) + { + g.FillRectangle(rightBrush, adjustedRightRect); + } + + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4); + + g.IntersectClip(fullRectangle); + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + } + } + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + Color buttonColor = ButtonColor; + + if (ToggleSwitch.IsButtonPressed) + { + buttonColor = ButtonColorPressed; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonColor = ButtonColorHovered; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + buttonColor = buttonColor.ToGrayScale(); + + g.SetClip(buttonRectangle); + + using (Brush backBrush = new SolidBrush(buttonColor)) + { + g.FillRectangle(backBrush, buttonRectangle); + } + + g.ResetClip(); + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public override int GetButtonWidth() + { + return (int)((double)ToggleSwitch.Height / 3 * 2); + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} \ No newline at end of file diff --git a/ToggleSwitch/Renderers/ToggleSwitchModernRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchModernRenderer.cs new file mode 100644 index 0000000..a5f2f1f --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchModernRenderer.cs @@ -0,0 +1,611 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchModernRenderer : ToggleSwitchRendererBase, IDisposable + { + #region Constructor + + private GraphicsPath _innerControlPath = null; + + public ToggleSwitchModernRenderer() + { + OuterBorderColor = Color.FromArgb(255, 31, 31, 31); + InnerBorderColor1 = Color.FromArgb(255, 80, 80, 82); + InnerBorderColor2 = Color.FromArgb(255, 109, 110, 112); + LeftSideBackColor1 = Color.FromArgb(255, 57, 166, 222); + LeftSideBackColor2 = Color.FromArgb(255, 53, 155, 229); + RightSideBackColor1 = Color.FromArgb(255, 48, 49, 45); + RightSideBackColor2 = Color.FromArgb(255, 51, 52, 48); + ButtonNormalBorderColor1 = Color.FromArgb(255, 31, 31, 31); + ButtonNormalBorderColor2 = Color.FromArgb(255, 31, 31, 31); + ButtonNormalSurfaceColor1 = Color.FromArgb(255, 51, 52, 48); + ButtonNormalSurfaceColor2 = Color.FromArgb(255, 51, 52, 48); + ArrowNormalColor = Color.FromArgb(255, 53, 156, 230); + ButtonHoverBorderColor1 = Color.FromArgb(255, 29, 29, 29); + ButtonHoverBorderColor2 = Color.FromArgb(255, 29, 29, 29); + ButtonHoverSurfaceColor1 = Color.FromArgb(255, 48, 49, 45); + ButtonHoverSurfaceColor2 = Color.FromArgb(255, 48, 49, 45); + ArrowHoverColor = Color.FromArgb(255, 50, 148, 219); + ButtonPressedBorderColor1 = Color.FromArgb(255, 23, 23, 23); + ButtonPressedBorderColor2 = Color.FromArgb(255, 23, 23, 23); + ButtonPressedSurfaceColor1 = Color.FromArgb(255, 38, 39, 36); + ButtonPressedSurfaceColor2 = Color.FromArgb(255, 38, 39, 36); + ArrowPressedColor = Color.FromArgb(255, 39, 117, 172); + ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0); + ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0); + + ButtonShadowWidth = 7; + CornerRadius = 6; + ButtonCornerRadius = 6; + } + + public void Dispose() + { + if (_innerControlPath != null) + _innerControlPath.Dispose(); + } + + #endregion Constructor + + #region Public Properties + + public Color OuterBorderColor { get; set; } + public Color InnerBorderColor1 { get; set; } + public Color InnerBorderColor2 { get; set; } + public Color LeftSideBackColor1 { get; set; } + public Color LeftSideBackColor2 { get; set; } + public Color RightSideBackColor1 { get; set; } + public Color RightSideBackColor2 { get; set; } + public Color ButtonNormalBorderColor1 { get; set; } + public Color ButtonNormalBorderColor2 { get; set; } + public Color ButtonNormalSurfaceColor1 { get; set; } + public Color ButtonNormalSurfaceColor2 { get; set; } + public Color ArrowNormalColor { get; set; } + public Color ButtonHoverBorderColor1 { get; set; } + public Color ButtonHoverBorderColor2 { get; set; } + public Color ButtonHoverSurfaceColor1 { get; set; } + public Color ButtonHoverSurfaceColor2 { get; set; } + public Color ArrowHoverColor { get; set; } + public Color ButtonPressedBorderColor1 { get; set; } + public Color ButtonPressedBorderColor2 { get; set; } + public Color ButtonPressedSurfaceColor1 { get; set; } + public Color ButtonPressedSurfaceColor2 { get; set; } + public Color ArrowPressedColor { get; set; } + public Color ButtonShadowColor1 { get; set; } + public Color ButtonShadowColor2 { get; set; } + + public int ButtonShadowWidth { get; set; } + public int CornerRadius { get; set; } + public int ButtonCornerRadius { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + //Draw outer border + using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius)) + { + g.SetClip(outerBorderPath); + + Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor; + + using (Brush outerBorderBrush = new SolidBrush(outerBorderColor)) + { + g.FillPath(outerBorderBrush, outerBorderPath); + } + + g.ResetClip(); + } + + //Draw inner border + Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2); + + using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius)) + { + g.SetClip(innerBorderPath); + + Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1; + Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2; + + using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical)) + { + g.FillPath(borderBrush, innerBorderPath); + } + + g.ResetClip(); + } + + Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4); + _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius); + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = leftRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height); + + Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1; + Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle leftShadowRectangle = new Rectangle(); + leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth; + leftShadowRectangle.Y = leftRectangle.Y; + leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + leftShadowRectangle.Height = leftRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(leftShadowRectangle); + } + else + { + g.SetClip(leftShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, leftShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + int buttonWidth = GetButtonWidth(); + + //Draw inner background + int gradientRectWidth = rightRectangle.Width + buttonWidth / 2; + Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height); + + Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1; + Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(gradientRectangle); + } + else + { + g.SetClip(gradientRectangle); + } + + using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical)) + { + g.FillRectangle(backgroundBrush, gradientRectangle); + } + + g.ResetClip(); + + Rectangle rightShadowRectangle = new Rectangle(); + rightShadowRectangle.X = rightRectangle.X - CornerRadius; + rightShadowRectangle.Y = rightRectangle.Y; + rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + rightShadowRectangle.Height = rightRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(rightShadowRectangle); + } + else + { + g.SetClip(rightShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, rightShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(buttonRectangle); + } + else + { + g.SetClip(buttonRectangle); + } + + using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, ButtonCornerRadius)) + { + //Draw button surface + Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1; + Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonSurfaceColor1 = ButtonPressedSurfaceColor1; + buttonSurfaceColor2 = ButtonPressedSurfaceColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonSurfaceColor1 = ButtonHoverSurfaceColor1; + buttonSurfaceColor2 = ButtonHoverSurfaceColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale(); + buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale(); + } + + using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical)) + { + g.FillPath(buttonSurfaceBrush, buttonPath); + } + + //Draw button border + Color buttonBorderColor1 = ButtonNormalBorderColor1; + Color buttonBorderColor2 = ButtonNormalBorderColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonBorderColor1 = ButtonPressedBorderColor1; + buttonBorderColor2 = ButtonPressedBorderColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonBorderColor1 = ButtonHoverBorderColor1; + buttonBorderColor2 = ButtonHoverBorderColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonBorderColor1 = buttonBorderColor1.ToGrayScale(); + buttonBorderColor2 = buttonBorderColor2.ToGrayScale(); + } + + using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical)) + { + using (Pen buttonBorderPen = new Pen(buttonBorderBrush)) + { + g.DrawPath(buttonBorderPen, buttonPath); + } + } + } + + g.ResetClip(); + + //Draw button arrows + Color arrowColor = ArrowNormalColor; + + if (ToggleSwitch.IsButtonPressed) + arrowColor = ArrowPressedColor; + else if (ToggleSwitch.IsButtonHovered) + arrowColor = ArrowHoverColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + arrowColor = arrowColor.ToGrayScale(); + + Rectangle arrowRectangle = new Rectangle(); + arrowRectangle.Height = 9; + arrowRectangle.Width = 22; + arrowRectangle.X = buttonRectangle.X + (int)(((double)buttonRectangle.Width - (double)arrowRectangle.Width) / 2); + arrowRectangle.Y = buttonRectangle.Y + (int)(((double)buttonRectangle.Height - (double)arrowRectangle.Height) / 2); + + using (Brush arrowBrush = new SolidBrush(arrowColor)) + { + using (GraphicsPath arrowLeftPath = GetArrowLeftPath(arrowRectangle)) + { + g.FillPath(arrowBrush, arrowLeftPath); + } + + using (GraphicsPath arrowRightPath = GetArrowRightPath(arrowRectangle)) + { + g.FillPath(arrowBrush, arrowRightPath); + } + } + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius) + { + GraphicsPath gp = new GraphicsPath(); + int diameter = 2*radius; + + if (diameter > ToggleSwitch.Height) + diameter = ToggleSwitch.Height; + + if (diameter > ToggleSwitch.Width) + diameter = ToggleSwitch.Width; + + gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90); + gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90); + gp.CloseFigure(); + + return gp; + } + + public GraphicsPath GetArrowLeftPath(Rectangle arrowRectangle) + { + GraphicsPath gp = new GraphicsPath(); + + Point top = new Point(arrowRectangle.X + 8, arrowRectangle.Y); + Point bottom = new Point(arrowRectangle.X + 8, arrowRectangle.Y + arrowRectangle.Height); + Point tip = new Point(arrowRectangle.X, arrowRectangle.Y + (arrowRectangle.Height/2)); + + gp.AddLine(top, bottom); + gp.AddLine(bottom, tip); + gp.AddLine(tip, top); + + return gp; + } + + public GraphicsPath GetArrowRightPath(Rectangle arrowRectangle) + { + GraphicsPath gp = new GraphicsPath(); + + Point top = new Point(arrowRectangle.X + 14, arrowRectangle.Y); + Point bottom = new Point(arrowRectangle.X + 14, arrowRectangle.Y + arrowRectangle.Height); + Point tip = new Point(arrowRectangle.X + arrowRectangle.Width, arrowRectangle.Y + (arrowRectangle.Height / 2)); + + gp.AddLine(top, bottom); + gp.AddLine(bottom, tip); + gp.AddLine(tip, top); + + return gp; + } + + public override int GetButtonWidth() + { + float buttonWidth = 1.41f*ToggleSwitch.Height; + return (int) buttonWidth; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchOSXRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchOSXRenderer.cs new file mode 100644 index 0000000..f02e908 --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchOSXRenderer.cs @@ -0,0 +1,556 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using ToggleSwitch; + +namespace JCS +{ + public class ToggleSwitchOSXRenderer : ToggleSwitchRendererBase, IDisposable + { + #region Constructor + + private GraphicsPath _innerControlPath = null; + + public ToggleSwitchOSXRenderer() + { + OuterBorderColor = Color.FromArgb(255, 108, 108, 108); + InnerBorderColor1 = Color.FromArgb(255, 137, 138, 139); + InnerBorderColor2 = Color.FromArgb(255, 167, 168, 169); + BackColor1 = Color.FromArgb(255, 108, 108, 108); + BackColor2 = Color.FromArgb(255, 163, 163, 163); + ButtonNormalBorderColor1 = Color.FromArgb(255, 147, 147, 148); + ButtonNormalBorderColor2 = Color.FromArgb(255, 167, 168, 169); + ButtonNormalSurfaceColor1 = Color.FromArgb(255, 250, 250, 250); + ButtonNormalSurfaceColor2 = Color.FromArgb(255, 224, 224, 224); + ButtonHoverBorderColor1 = Color.FromArgb(255, 145, 146, 147); + ButtonHoverBorderColor2 = Color.FromArgb(255, 164, 165, 166); + ButtonHoverSurfaceColor1 = Color.FromArgb(255, 238, 238, 238); + ButtonHoverSurfaceColor2 = Color.FromArgb(255, 213, 213, 213); + ButtonPressedBorderColor1 = Color.FromArgb(255, 138, 138, 140); + ButtonPressedBorderColor2 = Color.FromArgb(255, 158, 158, 160); + ButtonPressedSurfaceColor1 = Color.FromArgb(255, 187, 187, 187); + ButtonPressedSurfaceColor2 = Color.FromArgb(255, 168, 168, 168); + ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0); + ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0); + + ButtonShadowWidth = 7; + CornerRadius = 4; + } + + public void Dispose() + { + if (_innerControlPath != null) + _innerControlPath.Dispose(); + } + + #endregion Constructor + + #region Public Properties + + public Color OuterBorderColor { get; set; } + public Color InnerBorderColor1 { get; set; } + public Color InnerBorderColor2 { get; set; } + public Color BackColor1 { get; set; } + public Color BackColor2 { get; set; } + public Color ButtonNormalBorderColor1 { get; set; } + public Color ButtonNormalBorderColor2 { get; set; } + public Color ButtonNormalSurfaceColor1 { get; set; } + public Color ButtonNormalSurfaceColor2 { get; set; } + public Color ButtonHoverBorderColor1 { get; set; } + public Color ButtonHoverBorderColor2 { get; set; } + public Color ButtonHoverSurfaceColor1 { get; set; } + public Color ButtonHoverSurfaceColor2 { get; set; } + public Color ButtonPressedBorderColor1 { get; set; } + public Color ButtonPressedBorderColor2 { get; set; } + public Color ButtonPressedSurfaceColor1 { get; set; } + public Color ButtonPressedSurfaceColor2 { get; set; } + public Color ButtonShadowColor1 { get; set; } + public Color ButtonShadowColor2 { get; set; } + + public int ButtonShadowWidth { get; set; } + public int CornerRadius { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + //Draw outer border + using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius)) + { + g.SetClip(outerBorderPath); + + Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor; + + using (Brush outerBorderBrush = new SolidBrush(outerBorderColor)) + { + g.FillPath(outerBorderBrush, outerBorderPath); + } + + g.ResetClip(); + } + + //Draw inner border + Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y +1 , borderRectangle.Width - 2, borderRectangle.Height - 2); + + using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius)) + { + g.SetClip(innerBorderPath); + + Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1; + Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2; + + using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical)) + { + g.FillPath(borderBrush, innerBorderPath); + } + + g.ResetClip(); + } + + //Draw inner background + Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4); + + _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius); + + g.SetClip(_innerControlPath); + + Color backColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor1.ToGrayScale() : BackColor1; + Color backColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor2.ToGrayScale() : BackColor2; + + using (Brush backgroundBrush = new LinearGradientBrush(borderRectangle, backColor1, backColor2, LinearGradientMode.Vertical)) + { + g.FillPath(backgroundBrush, _innerControlPath); + } + + g.ResetClip(); + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + Rectangle leftShadowRectangle = new Rectangle(); + leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth; + leftShadowRectangle.Y = leftRectangle.Y; + leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + leftShadowRectangle.Height = leftRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(leftShadowRectangle); + } + else + { + g.SetClip(leftShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, leftShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OnSideImage != null) + { + Size imageSize = ToggleSwitch.OnSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OnSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OnText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OnForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + Rectangle rightShadowRectangle = new Rectangle(); + rightShadowRectangle.X = rightRectangle.X - CornerRadius; + rightShadowRectangle.Y = rightRectangle.Y; + rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius; + rightShadowRectangle.Height = rightRectangle.Height; + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(rightShadowRectangle); + } + else + { + g.SetClip(rightShadowRectangle); + } + + using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal)) + { + g.FillRectangle(buttonShadowBrush, rightShadowRectangle); + } + + g.ResetClip(); + + //Draw image or text + if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2); + + if (_innerControlPath != null) + { + g.SetClip(_innerControlPath); + g.IntersectClip(fullRectangle); + } + else + { + g.SetClip(fullRectangle); + } + + if (ToggleSwitch.OffSideImage != null) + { + Size imageSize = ToggleSwitch.OffSideImage.Size; + Rectangle imageRectangle; + + int imageXPos = (int)fullRectangle.X; + + if (ToggleSwitch.OffSideScaleImageToFit) + { + Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height); + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle); + } + else + { + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle); + } + } + else if (!string.IsNullOrEmpty(ToggleSwitch.OffText)) + { + SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont); + + float textXPos = fullRectangle.X; + + if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center) + { + textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2); + } + else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far) + { + textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width; + } + + RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height); + + Color textForeColor = ToggleSwitch.OffForeColor; + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + textForeColor = textForeColor.ToGrayScale(); + + using (Brush textBrush = new SolidBrush(textForeColor)) + { + g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle); + } + } + + g.ResetClip(); + } + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + + buttonRectangle.Inflate(-1, -1); + + using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, CornerRadius)) + { + g.SetClip(buttonPath); + + //Draw button surface + Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1; + Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonSurfaceColor1 = ButtonPressedSurfaceColor1; + buttonSurfaceColor2 = ButtonPressedSurfaceColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonSurfaceColor1 = ButtonHoverSurfaceColor1; + buttonSurfaceColor2 = ButtonHoverSurfaceColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale(); + buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale(); + } + + using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical)) + { + g.FillPath(buttonSurfaceBrush, buttonPath); + } + + //Draw button border + Color buttonBorderColor1 = ButtonNormalBorderColor1; + Color buttonBorderColor2 = ButtonNormalBorderColor2; + + if (ToggleSwitch.IsButtonPressed) + { + buttonBorderColor1 = ButtonPressedBorderColor1; + buttonBorderColor2 = ButtonPressedBorderColor2; + } + else if (ToggleSwitch.IsButtonHovered) + { + buttonBorderColor1 = ButtonHoverBorderColor1; + buttonBorderColor2 = ButtonHoverBorderColor2; + } + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + { + buttonBorderColor1 = buttonBorderColor1.ToGrayScale(); + buttonBorderColor2 = buttonBorderColor2.ToGrayScale(); + } + + using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical)) + { + using (Pen buttonBorderPen = new Pen(buttonBorderBrush)) + { + g.DrawPath(buttonBorderPen, buttonPath); + } + } + + g.ResetClip(); + + //Draw button image + Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage); + + if (buttonImage != null) + { + g.SetClip(buttonPath); + + ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment); + + Size imageSize = buttonImage.Size; + + Rectangle imageRectangle; + + int imageXPos = buttonRectangle.X; + + bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit); + + if (scaleImage) + { + Size canvasSize = buttonRectangle.Size; + Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize); + + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImage(buttonImage, imageRectangle); + } + else + { + if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center) + { + imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2)); + } + else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right) + { + imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width); + } + + imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height); + + if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) + g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes()); + else + g.DrawImageUnscaled(buttonImage, imageRectangle); + } + + g.ResetClip(); + } + } + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius) + { + GraphicsPath gp = new GraphicsPath(); + int diameter = 2*radius; + + if (diameter > ToggleSwitch.Height) + diameter = ToggleSwitch.Height; + + if (diameter > ToggleSwitch.Width) + diameter = ToggleSwitch.Width; + + gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90); + gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90); + gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90); + gp.CloseFigure(); + + return gp; + } + + public override int GetButtonWidth() + { + float buttonWidth = 1.53f*(ToggleSwitch.Height - 2); + return (int) buttonWidth; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height); + return buttonRect; + } + + #endregion Helper Method Implementations + } +} + diff --git a/ToggleSwitch/Renderers/ToggleSwitchPlainAndSimpleRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchPlainAndSimpleRenderer.cs new file mode 100644 index 0000000..9199ec9 --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchPlainAndSimpleRenderer.cs @@ -0,0 +1,204 @@ +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace JCS +{ + public class ToggleSwitchPlainAndSimpleRenderer : ToggleSwitchRendererBase + { + #region Constructor + + public ToggleSwitchPlainAndSimpleRenderer() + { + BorderColorChecked = Color.Black; + BorderColorUnchecked = Color.Black; + BorderWidth = 2; + ButtonMargin = 1; + InnerBackgroundColor = Color.White; + ButtonColor = Color.Black; + } + + #endregion Constructor + + #region Public Properties + + public Color BorderColorChecked { get; set; } + public Color BorderColorUnchecked { get; set; } + public int BorderWidth { get; set; } + public int ButtonMargin { get; set; } + public Color InnerBackgroundColor { get; set; } + public Color ButtonColor { get; set; } + + #endregion Public Properties + + #region Render Method Implementations + + public override void RenderBorder(Graphics g, Rectangle borderRectangle) + { + //Draw this one AFTER the button is drawn in the RenderButton method + } + + public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + + int buttonWidth = GetButtonWidth(); + + Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + GraphicsPath innerBorderClipPath = GetInnerBorderClipPath(controlRectangle); + + g.SetClip(innerBorderClipPath); + g.IntersectClip(leftRectangle); + + using (Brush innerBackgroundBrush = new SolidBrush(InnerBackgroundColor)) + { + g.FillPath(innerBackgroundBrush, innerBorderClipPath); + } + + g.ResetClip(); + } + + public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + + int buttonWidth = GetButtonWidth(); + + Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + GraphicsPath innerBorderClipPath = GetInnerBorderClipPath(controlRectangle); + + g.SetClip(innerBorderClipPath); + g.IntersectClip(rightRectangle); + + using (Brush innerBackgroundBrush = new SolidBrush(InnerBackgroundColor)) + { + g.FillPath(innerBackgroundBrush, innerBorderClipPath); + } + + g.ResetClip(); + } + + public override void RenderButton(Graphics g, Rectangle buttonRectangle) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + + GraphicsPath buttonClipPath = GetButtonClipPath(); + + Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height); + GraphicsPath outerBorderClipPath = GetControlClipPath(controlRectangle); + GraphicsPath innerBorderClipPath = GetInnerBorderClipPath(controlRectangle); + + g.SetClip(innerBorderClipPath); + g.IntersectClip(buttonRectangle); + + //Fill the button surface with the background color + + using (Brush innerBackgroundBrush = new SolidBrush(InnerBackgroundColor)) + { + g.FillRectangle(innerBackgroundBrush, buttonRectangle); + } + + g.ResetClip(); + + g.SetClip(GetButtonClipPath()); + g.IntersectClip(controlRectangle); + + //Render the button + + using (Brush buttonBrush = new SolidBrush(ButtonColor)) + { + g.FillPath(buttonBrush, buttonClipPath); + } + + g.ResetClip(); + + //Render the border + + g.SetClip(outerBorderClipPath); + g.ExcludeClip(new Region(innerBorderClipPath)); + + Color borderColor = ToggleSwitch.Checked ? BorderColorChecked : BorderColorUnchecked; + + using (Brush borderBrush = new SolidBrush(borderColor)) + { + g.FillPath(borderBrush, outerBorderClipPath); + } + + g.ResetClip(); + } + + #endregion Render Method Implementations + + #region Helper Method Implementations + + public GraphicsPath GetControlClipPath(Rectangle controlRectangle) + { + GraphicsPath borderPath = new GraphicsPath(); + borderPath.AddArc(controlRectangle.X, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 90, 180); + borderPath.AddArc(controlRectangle.X + controlRectangle.Width - controlRectangle.Height, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 270, 180); + borderPath.CloseFigure(); + + return borderPath; + } + + public GraphicsPath GetInnerBorderClipPath(Rectangle controlRectangle) + { + Rectangle innerBorderRectangle = new Rectangle(controlRectangle.X + BorderWidth, + controlRectangle.Y + BorderWidth, + controlRectangle.Width - (2 * BorderWidth), + controlRectangle.Height - (2 * BorderWidth)); + + GraphicsPath borderPath = new GraphicsPath(); + borderPath.AddArc(innerBorderRectangle.X, innerBorderRectangle.Y, innerBorderRectangle.Height, innerBorderRectangle.Height, 90, 180); + borderPath.AddArc(innerBorderRectangle.X + innerBorderRectangle.Width - innerBorderRectangle.Height, innerBorderRectangle.Y, innerBorderRectangle.Height, innerBorderRectangle.Height, 270, 180); + borderPath.CloseFigure(); + + return borderPath; + } + + public GraphicsPath GetButtonClipPath() + { + Rectangle buttonRectangle = GetButtonRectangle(); + + GraphicsPath buttonPath = new GraphicsPath(); + + buttonPath.AddArc(buttonRectangle.X + ButtonMargin, buttonRectangle.Y + ButtonMargin, buttonRectangle.Height - (2 * ButtonMargin), buttonRectangle.Height - (2 * ButtonMargin), 0, 360); + + return buttonPath; + } + + public override int GetButtonWidth() + { + int buttonWidth = ToggleSwitch.Height - (2 * BorderWidth); + return buttonWidth > 0 ? buttonWidth : 0; + } + + public override Rectangle GetButtonRectangle() + { + int buttonWidth = GetButtonWidth(); + return GetButtonRectangle(buttonWidth); + } + + public override Rectangle GetButtonRectangle(int buttonWidth) + { + if (buttonWidth <= 0) + { + return Rectangle.Empty; + } + + Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, BorderWidth, buttonWidth, buttonWidth); + + if (buttonRect.X < BorderWidth + ButtonMargin - 1) + buttonRect.X = BorderWidth + ButtonMargin - 1; + + if (buttonRect.X + buttonRect.Width > ToggleSwitch.Width - BorderWidth - ButtonMargin + 1) + buttonRect.X = ToggleSwitch.Width - buttonRect.Width - BorderWidth - ButtonMargin + 1; + + return buttonRect; + } + + #endregion Helper Method Implementations + } +} diff --git a/ToggleSwitch/Renderers/ToggleSwitchRendererBase.cs b/ToggleSwitch/Renderers/ToggleSwitchRendererBase.cs new file mode 100644 index 0000000..b24c6f2 --- /dev/null +++ b/ToggleSwitch/Renderers/ToggleSwitchRendererBase.cs @@ -0,0 +1,101 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace JCS +{ + public abstract class ToggleSwitchRendererBase + { + #region Private Members + + private ToggleSwitch _toggleSwitch; + + #endregion Private Members + + #region Constructor + + protected ToggleSwitchRendererBase() + {} + + internal void SetToggleSwitch(ToggleSwitch toggleSwitch) + { + _toggleSwitch = toggleSwitch; + } + + internal ToggleSwitch ToggleSwitch + { + get { return _toggleSwitch; } + } + + #endregion Constructor + + #region Render Methods + + public void RenderBackground(PaintEventArgs e) + { + if (_toggleSwitch == null) + return; + + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + Rectangle controlRectangle = new Rectangle(0, 0, _toggleSwitch.Width, _toggleSwitch.Height); + + FillBackground(e.Graphics, controlRectangle); + + RenderBorder(e.Graphics, controlRectangle); + } + + public void RenderControl(PaintEventArgs e) + { + if (_toggleSwitch == null) + return; + + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + + Rectangle buttonRectangle = GetButtonRectangle(); + int totalToggleFieldWidth = ToggleSwitch.Width - buttonRectangle.Width; + + if (buttonRectangle.X > 0) + { + Rectangle leftRectangle = new Rectangle(0, 0, buttonRectangle.X, ToggleSwitch.Height); + + if (leftRectangle.Width > 0) + RenderLeftToggleField(e.Graphics, leftRectangle, totalToggleFieldWidth); + } + + if (buttonRectangle.X + buttonRectangle.Width < e.ClipRectangle.Width) + { + Rectangle rightRectangle = new Rectangle(buttonRectangle.X + buttonRectangle.Width, 0, ToggleSwitch.Width - buttonRectangle.X - buttonRectangle.Width, ToggleSwitch.Height); + + if (rightRectangle.Width > 0) + RenderRightToggleField(e.Graphics, rightRectangle, totalToggleFieldWidth); + } + + RenderButton(e.Graphics, buttonRectangle); + } + + public void FillBackground(Graphics g, Rectangle controlRectangle) + { + Color backColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? ToggleSwitch.BackColor.ToGrayScale() : ToggleSwitch.BackColor; + + using (Brush backBrush = new SolidBrush(backColor)) + { + g.FillRectangle(backBrush, controlRectangle); + } + } + + public abstract void RenderBorder(Graphics g, Rectangle borderRectangle); + public abstract void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth); + public abstract void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth); + public abstract void RenderButton(Graphics g, Rectangle buttonRectangle); + + #endregion Render Methods + + #region Helper Methods + + public abstract int GetButtonWidth(); + public abstract Rectangle GetButtonRectangle(); + public abstract Rectangle GetButtonRectangle(int buttonWidth); + + #endregion Helper Methods + } +} diff --git a/ToggleSwitch/ToggleSwitch.cs b/ToggleSwitch/ToggleSwitch.cs new file mode 100644 index 0000000..41f7682 --- /dev/null +++ b/ToggleSwitch/ToggleSwitch.cs @@ -0,0 +1,1189 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using ToggleSwitch; + +/**********************************************************************************/ +/* ToggleSwitch - Version 1.1 */ +/**********************************************************************************/ +/* http://www.codeproject.com/Articles/1029499/ToggleSwitch-Winforms-Control */ +/**********************************************************************************/ + + +namespace JCS +{ + [DefaultValue("Checked"), DefaultEvent("CheckedChanged"), ToolboxBitmap(typeof(CheckBox))] + public class ToggleSwitch : Control + { + #region Delegate and Event declarations + + public delegate void CheckedChangedDelegate(object sender, EventArgs e); + [Description("Raised when the ToggleSwitch has changed state")] + public event CheckedChangedDelegate CheckedChanged; + + public delegate void BeforeRenderingDelegate(object sender, BeforeRenderingEventArgs e); + [Description("Raised when the ToggleSwitch renderer is changed")] + public event BeforeRenderingDelegate BeforeRendering; + + #endregion Delegate and Event declarations + + #region Enums + + public enum ToggleSwitchStyle + { + Metro, + Android, + IOS5, + BrushedMetal, + OSX, + Carbon, + Iphone, + Fancy, + Modern, + PlainAndSimpel + } + + public enum ToggleSwitchAlignment + { + Near, + Center, + Far + } + + public enum ToggleSwitchButtonAlignment + { + Left, + Center, + Right + } + + #endregion Enums + + #region Private Members + + private readonly Timer _animationTimer = new Timer(); + private ToggleSwitchRendererBase _renderer; + + private ToggleSwitchStyle _style = ToggleSwitchStyle.Metro; + private bool _checked = false; + private bool _moving = false; + private bool _animating = false; + private bool _animationResult = false; + private int _animationTarget = 0; + private bool _useAnimation = true; + private int _animationInterval = 1; + private int _animationStep = 10; + private bool _allowUserChange = true; + + private bool _isLeftFieldHovered = false; + private bool _isButtonHovered = false; + private bool _isRightFieldHovered = false; + private bool _isLeftFieldPressed = false; + private bool _isButtonPressed = false; + private bool _isRightFieldPressed = false; + + private int _buttonValue = 0; + private int _savedButtonValue = 0; + private int _xOffset = 0; + private int _xValue = 0; + private int _thresholdPercentage = 50; + private bool _grayWhenDisabled = true; + private bool _toggleOnButtonClick = true; + private bool _toggleOnSideClick = true; + + private MouseEventArgs _lastMouseEventArgs = null; + + private bool _buttonScaleImage; + private ToggleSwitchButtonAlignment _buttonAlignment = ToggleSwitchButtonAlignment.Center; + private Image _buttonImage = null; + + private string _offText = ""; + private Color _offForeColor = Color.Black; + private Font _offFont; + private Image _offSideImage = null; + private bool _offSideScaleImage; + private ToggleSwitchAlignment _offSideAlignment = ToggleSwitchAlignment.Center; + private Image _offButtonImage = null; + private bool _offButtonScaleImage; + private ToggleSwitchButtonAlignment _offButtonAlignment = ToggleSwitchButtonAlignment.Center; + + private string _onText = ""; + private Color _onForeColor = Color.Black; + private Font _onFont; + private Image _onSideImage = null; + private bool _onSideScaleImage; + private ToggleSwitchAlignment _onSideAlignment = ToggleSwitchAlignment.Center; + private Image _onButtonImage = null; + private bool _onButtonScaleImage; + private ToggleSwitchButtonAlignment _onButtonAlignment = ToggleSwitchButtonAlignment.Center; + + #endregion Private Members + + #region Constructor Etc. + + public ToggleSwitch() + { + SetStyle(ControlStyles.ResizeRedraw | + ControlStyles.SupportsTransparentBackColor | + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.DoubleBuffer, true); + + OnFont = base.Font; + OffFont = base.Font; + + SetRenderer(new ToggleSwitchMetroRenderer()); + + _animationTimer.Enabled = false; + _animationTimer.Interval = _animationInterval; + _animationTimer.Tick += AnimationTimer_Tick; + } + + public void SetRenderer(ToggleSwitchRendererBase renderer) + { + renderer.SetToggleSwitch(this); + _renderer = renderer; + + if (_renderer != null) + Refresh(); + } + + #endregion Constructor Etc. + + #region Public Properties + + [Bindable(false)] + [DefaultValue(typeof(ToggleSwitchStyle), "Metro")] + [Category("Appearance")] + [Description("Gets or sets the style of the ToggleSwitch")] + public ToggleSwitchStyle Style + { + get { return _style; } + set + { + if (value != _style) + { + _style = value; + + switch (_style) + { + case ToggleSwitchStyle.Metro: + SetRenderer(new ToggleSwitchMetroRenderer()); + break; + case ToggleSwitchStyle.Android: + SetRenderer(new ToggleSwitchAndroidRenderer()); + break; + case ToggleSwitchStyle.IOS5: + SetRenderer(new ToggleSwitchIOS5Renderer()); + break; + case ToggleSwitchStyle.BrushedMetal: + SetRenderer(new ToggleSwitchBrushedMetalRenderer()); + break; + case ToggleSwitchStyle.OSX: + SetRenderer(new ToggleSwitchOSXRenderer()); + break; + case ToggleSwitchStyle.Carbon: + SetRenderer(new ToggleSwitchCarbonRenderer()); + break; + case ToggleSwitchStyle.Iphone: + SetRenderer(new ToggleSwitchIphoneRenderer()); + break; + case ToggleSwitchStyle.Fancy: + SetRenderer(new ToggleSwitchFancyRenderer()); + break; + case ToggleSwitchStyle.Modern: + SetRenderer(new ToggleSwitchModernRenderer()); + break; + case ToggleSwitchStyle.PlainAndSimpel: + SetRenderer(new ToggleSwitchPlainAndSimpleRenderer()); + break; + } + } + + Refresh(); + } + } + + [Bindable(true)] + [DefaultValue(false)] + [Category("Data")] + [Description("Gets or sets the Checked value of the ToggleSwitch")] + public bool Checked + { + get { return _checked; } + set + { + if (value != _checked) + { + while (_animating) + { + Application.DoEvents(); + } + + if (value == true) + { + int buttonWidth = _renderer.GetButtonWidth(); + _animationTarget = Width - buttonWidth; + BeginAnimation(true); + } + else + { + _animationTarget = 0; + BeginAnimation(false); + } + } + } + } + + [Bindable(true)] + [DefaultValue(true)] + [Category("Behavior")] + [Description("Gets or sets whether the user can change the value of the button or not")] + public bool AllowUserChange + { + get { return _allowUserChange; } + set { _allowUserChange = value; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public string CheckedString + { + get + { + return Checked ? (string.IsNullOrEmpty(OnText) ? "ON" : OnText) : (string.IsNullOrEmpty(OffText) ? "OFF" : OffText); + } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public Rectangle ButtonRectangle + { + get + { + return _renderer.GetButtonRectangle(); + } + } + + [Bindable(false)] + [DefaultValue(true)] + [Category("Appearance")] + [Description("Gets or sets if the ToggleSwitch should be grayed out when disabled")] + public bool GrayWhenDisabled + { + get { return _grayWhenDisabled; } + set + { + if (value != _grayWhenDisabled) + { + _grayWhenDisabled = value; + + if (!Enabled) + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(true)] + [Category("Behavior")] + [Description("Gets or sets if the ToggleSwitch should toggle when the button is clicked")] + public bool ToggleOnButtonClick + { + get { return _toggleOnButtonClick; } + set { _toggleOnButtonClick = value; } + } + + [Bindable(false)] + [DefaultValue(true)] + [Category("Behavior")] + [Description("Gets or sets if the ToggleSwitch should toggle when the track besides the button is clicked")] + public bool ToggleOnSideClick + { + get { return _toggleOnSideClick; } + set { _toggleOnSideClick = value; } + } + + [Bindable(false)] + [DefaultValue(50)] + [Category("Behavior")] + [Description("Gets or sets how much the button need to be on the other side (in peercept) before it snaps")] + public int ThresholdPercentage + { + get { return _thresholdPercentage; } + set { _thresholdPercentage = value; } + } + + [Bindable(false)] + [DefaultValue(typeof(Color), "Black")] + [Category("Appearance")] + [Description("Gets or sets the forecolor of the text when Checked=false")] + public Color OffForeColor + { + get { return _offForeColor; } + set + { + if (value != _offForeColor) + { + _offForeColor = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(Font), "Microsoft Sans Serif, 8.25pt")] + [Category("Appearance")] + [Description("Gets or sets the font of the text when Checked=false")] + public Font OffFont + { + get { return _offFont; } + set + { + if (!value.Equals(_offFont)) + { + _offFont = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue("")] + [Category("Appearance")] + [Description("Gets or sets the text when Checked=true")] + public string OffText + { + get { return _offText; } + set + { + if (value != _offText) + { + _offText = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(null)] + [Category("Appearance")] + [Description("Gets or sets the side image when Checked=false - Note: Settings the OffSideImage overrules the OffText property. Only the image will be shown")] + public Image OffSideImage + { + get { return _offSideImage; } + set + { + if (value != _offSideImage) + { + _offSideImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(false)] + [Category("Behavior")] + [Description("Gets or sets whether the side image visible when Checked=false should be scaled to fit")] + public bool OffSideScaleImageToFit + { + get { return _offSideScaleImage; } + set + { + if (value != _offSideScaleImage) + { + _offSideScaleImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(ToggleSwitchAlignment), "Center")] + [Category("Appearance")] + [Description("Gets or sets how the text or side image visible when Checked=false should be aligned")] + public ToggleSwitchAlignment OffSideAlignment + { + get { return _offSideAlignment; } + set + { + if (value != _offSideAlignment) + { + _offSideAlignment = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(null)] + [Category("Appearance")] + [Description("Gets or sets the button image when Checked=false and ButtonImage is not set")] + public Image OffButtonImage + { + get { return _offButtonImage; } + set + { + if (value != _offButtonImage) + { + _offButtonImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(false)] + [Category("Behavior")] + [Description("Gets or sets whether the button image visible when Checked=false should be scaled to fit")] + public bool OffButtonScaleImageToFit + { + get { return _offButtonScaleImage; } + set + { + if (value != _offButtonScaleImage) + { + _offButtonScaleImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(ToggleSwitchButtonAlignment), "Center")] + [Category("Appearance")] + [Description("Gets or sets how the button image visible when Checked=false should be aligned")] + public ToggleSwitchButtonAlignment OffButtonAlignment + { + get { return _offButtonAlignment; } + set + { + if (value != _offButtonAlignment) + { + _offButtonAlignment = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(Color), "Black")] + [Category("Appearance")] + [Description("Gets or sets the forecolor of the text when Checked=true")] + public Color OnForeColor + { + get { return _onForeColor; } + set + { + if (value != _onForeColor) + { + _onForeColor = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(Font), "Microsoft Sans Serif, 8,25pt")] + [Category("Appearance")] + [Description("Gets or sets the font of the text when Checked=true")] + public Font OnFont + { + get { return _onFont; } + set + { + if (!value.Equals(_onFont)) + { + _onFont = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue("")] + [Category("Appearance")] + [Description("Gets or sets the text when Checked=true")] + public string OnText + { + get { return _onText; } + set + { + if (value != _onText) + { + _onText = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(null)] + [Category("Appearance")] + [Description("Gets or sets the side image visible when Checked=true - Note: Settings the OnSideImage overrules the OnText property. Only the image will be shown.")] + public Image OnSideImage + { + get { return _onSideImage; } + set + { + if (value != _onSideImage) + { + _onSideImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(false)] + [Category("Behavior")] + [Description("Gets or sets whether the side image visible when Checked=true should be scaled to fit")] + public bool OnSideScaleImageToFit + { + get { return _onSideScaleImage; } + set + { + if (value != _onSideScaleImage) + { + _onSideScaleImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(null)] + [Category("Appearance")] + [Description("Gets or sets the button image")] + public Image ButtonImage + { + get { return _buttonImage; } + set + { + if (value != _buttonImage) + { + _buttonImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(false)] + [Category("Behavior")] + [Description("Gets or sets whether the button image should be scaled to fit")] + public bool ButtonScaleImageToFit + { + get { return _buttonScaleImage; } + set + { + if (value != _buttonScaleImage) + { + _buttonScaleImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(ToggleSwitchButtonAlignment), "Center")] + [Category("Appearance")] + [Description("Gets or sets how the button image should be aligned")] + public ToggleSwitchButtonAlignment ButtonAlignment + { + get { return _buttonAlignment; } + set + { + if (value != _buttonAlignment) + { + _buttonAlignment = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(ToggleSwitchAlignment), "Center")] + [Category("Appearance")] + [Description("Gets or sets how the text or side image visible when Checked=true should be aligned")] + public ToggleSwitchAlignment OnSideAlignment + { + get { return _onSideAlignment; } + set + { + if (value != _onSideAlignment) + { + _onSideAlignment = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(null)] + [Category("Appearance")] + [Description("Gets or sets the button image visible when Checked=true and ButtonImage is not set")] + public Image OnButtonImage + { + get { return _onButtonImage; } + set + { + if (value != _onButtonImage) + { + _onButtonImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(false)] + [Category("Behavior")] + [Description("Gets or sets whether the button image visible when Checked=true should be scaled to fit")] + public bool OnButtonScaleImageToFit + { + get { return _onButtonScaleImage; } + set + { + if (value != _onButtonScaleImage) + { + _onButtonScaleImage = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(typeof(ToggleSwitchButtonAlignment), "Center")] + [Category("Appearance")] + [Description("Gets or sets how the button image visible when Checked=true should be aligned")] + public ToggleSwitchButtonAlignment OnButtonAlignment + { + get { return _onButtonAlignment; } + set + { + if (value != _onButtonAlignment) + { + _onButtonAlignment = value; + Refresh(); + } + } + } + + [Bindable(false)] + [DefaultValue(true)] + [Category("Behavior")] + [Description("Gets or sets whether the toggle change should be animated or not")] + public bool UseAnimation + { + get { return _useAnimation; } + set { _useAnimation = value; } + } + + [Bindable(false)] + [DefaultValue(1)] + [Category("Behavior")] + [Description("Gets or sets the interval in ms between animation frames")] + public int AnimationInterval + { + get { return _animationInterval; } + set + { + if (value <= 0) + { + throw new ArgumentOutOfRangeException("AnimationInterval must larger than zero!"); + } + + _animationInterval = value; + } + } + + [Bindable(false)] + [DefaultValue(10)] + [Category("Behavior")] + [Description("Gets or sets the step in pixes the button shouldbe moved between each animation interval")] + public int AnimationStep + { + get { return _animationStep; } + set + { + if (value <= 0) + { + throw new ArgumentOutOfRangeException("AnimationStep must larger than zero!"); + } + + _animationStep = value; + } + } + + #region Hidden Base Properties + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new string Text + { + get { return ""; } + set { base.Text = ""; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new Color ForeColor + { + get { return Color.Black; } + set { base.ForeColor = Color.Black; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new Font Font + { + get { return base.Font; } + set { base.Font = new Font(base.Font, FontStyle.Regular); } + } + + #endregion Hidden Base Properties + + #endregion Public Properties + + #region Internal Properties + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsButtonHovered + { + get { return _isButtonHovered && !_isButtonPressed; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsButtonPressed + { + get { return _isButtonPressed; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsLeftSideHovered + { + get { return _isLeftFieldHovered && !_isLeftFieldPressed; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsLeftSidePressed + { + get { return _isLeftFieldPressed; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsRightSideHovered + { + get { return _isRightFieldHovered && !_isRightFieldPressed; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsRightSidePressed + { + get { return _isRightFieldPressed; } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal int ButtonValue + { + get + { + if (_animating || _moving) + return _buttonValue; + else if (_checked) + return Width - _renderer.GetButtonWidth(); + else + return 0; + } + set + { + if (value != _buttonValue) + { + _buttonValue = value; + Refresh(); + } + } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsButtonOnLeftSide + { + get { return (ButtonValue <= 0); } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsButtonOnRightSide + { + get { return (ButtonValue >= (Width - _renderer.GetButtonWidth())); } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsButtonMovingLeft + { + get { return (_animating && !IsButtonOnLeftSide && _animationResult == false); } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool IsButtonMovingRight + { + get { return (_animating && !IsButtonOnRightSide && _animationResult == true); } + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + internal bool AnimationResult + { + get { return _animationResult; } + } + + #endregion Private Properties + + #region Overridden Control Methods + + protected override Size DefaultSize + { + get { return new Size(50, 19); } + } + + protected override void OnPaintBackground(PaintEventArgs pevent) + { + pevent.Graphics.ResetClip(); + + base.OnPaintBackground(pevent); + + if (_renderer != null) + _renderer.RenderBackground(pevent); + } + + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.ResetClip(); + + base.OnPaint(e); + + if (_renderer != null) + { + if (BeforeRendering != null) + { + BeforeRendering(this, new BeforeRenderingEventArgs(_renderer)); + } + + _renderer.RenderControl(e); + } + } + + protected override void OnMouseMove(MouseEventArgs e) + { + _lastMouseEventArgs = e; + + int buttonWidth = _renderer.GetButtonWidth(); + Rectangle buttonRectangle = _renderer.GetButtonRectangle(buttonWidth); + + if (_moving) + { + int val = _xValue + (e.Location.X - _xOffset); + + if (val < 0) + val = 0; + + if (val > Width - buttonWidth) + val = Width - buttonWidth; + + ButtonValue = val; + Refresh(); + return; + } + + if (buttonRectangle.Contains(e.Location)) + { + _isButtonHovered = true; + _isLeftFieldHovered = false; + _isRightFieldHovered = false; + } + else + { + if (e.Location.X > buttonRectangle.X + buttonRectangle.Width) + { + _isButtonHovered = false; + _isLeftFieldHovered = false; + _isRightFieldHovered = true; + } + else if (e.Location.X < buttonRectangle.X) + { + _isButtonHovered = false; + _isLeftFieldHovered = true; + _isRightFieldHovered = false; + } + } + + Refresh(); + } + + protected override void OnMouseDown(MouseEventArgs e) + { + if (_animating || !AllowUserChange) + return; + + int buttonWidth = _renderer.GetButtonWidth(); + Rectangle buttonRectangle = _renderer.GetButtonRectangle(buttonWidth); + + _savedButtonValue = ButtonValue; + + if (buttonRectangle.Contains(e.Location)) + { + _isButtonPressed = true; + _isLeftFieldPressed = false; + _isRightFieldPressed = false; + + _moving = true; + _xOffset = e.Location.X; + _buttonValue = buttonRectangle.X; + _xValue = ButtonValue; + } + else + { + if (e.Location.X > buttonRectangle.X + buttonRectangle.Width) + { + _isButtonPressed = false; + _isLeftFieldPressed = false; + _isRightFieldPressed = true; + } + else if (e.Location.X < buttonRectangle.X) + { + _isButtonPressed = false; + _isLeftFieldPressed = true; + _isRightFieldPressed = false; + } + } + + Refresh(); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + if (_animating || !AllowUserChange) + return; + + int buttonWidth = _renderer.GetButtonWidth(); + + bool wasLeftSidePressed = IsLeftSidePressed; + bool wasRightSidePressed = IsRightSidePressed; + + _isButtonPressed = false; + _isLeftFieldPressed = false; + _isRightFieldPressed = false; + + if (_moving) + { + int percentage = (int)((100*(double)ButtonValue)/((double) Width - (double) buttonWidth)); + + if (_checked) + { + if (percentage <= (100 - _thresholdPercentage)) + { + _animationTarget = 0; + BeginAnimation(false); + } + else if (ToggleOnButtonClick && _savedButtonValue == ButtonValue) + { + _animationTarget = 0; + BeginAnimation(false); + } + else + { + _animationTarget = Width - buttonWidth; + BeginAnimation(true); + } + } + else + { + if (percentage >= _thresholdPercentage) + { + _animationTarget = Width - buttonWidth; + BeginAnimation(true); + } + else if (ToggleOnButtonClick && _savedButtonValue == ButtonValue) + { + _animationTarget = Width - buttonWidth; + BeginAnimation(true); + } + else + { + _animationTarget = 0; + BeginAnimation(false); + } + } + + _moving = false; + return; + } + + if (IsButtonOnRightSide) + { + _buttonValue = Width - buttonWidth; + _animationTarget = 0; + } + else + { + _buttonValue = 0; + _animationTarget = Width - buttonWidth; + } + + if (wasLeftSidePressed && ToggleOnSideClick) + { + SetValueInternal(false); + } + else if (wasRightSidePressed && ToggleOnSideClick) + { + SetValueInternal(true); + } + + Refresh(); + } + + protected override void OnMouseLeave(EventArgs e) + { + _isButtonHovered = false; + _isLeftFieldHovered = false; + _isRightFieldHovered = false; + _isButtonPressed = false; + _isLeftFieldPressed = false; + _isRightFieldPressed = false; + + Refresh(); + } + + protected override void OnEnabledChanged(EventArgs e) + { + base.OnEnabledChanged(e); + Refresh(); + } + + protected override void OnRegionChanged(EventArgs e) + { + base.OnRegionChanged(e); + Refresh(); + } + + protected override void OnSizeChanged(EventArgs e) + { + if (_animationTarget > 0) + { + int buttonWidth = _renderer.GetButtonWidth(); + _animationTarget = Width - buttonWidth; + } + + base.OnSizeChanged(e); + } + + #endregion Overridden Control Methods + + #region Private Methods + + private void SetValueInternal(bool checkedValue) + { + if (checkedValue == _checked) + return; + + while (_animating) + { + Application.DoEvents(); + } + + BeginAnimation(checkedValue); + } + + private void BeginAnimation(bool checkedValue) + { + _animating = true; + _animationResult = checkedValue; + + if (_animationTimer != null && _useAnimation) + { + _animationTimer.Interval = _animationInterval; + _animationTimer.Enabled = true; + } + else + { + AnimationComplete(); + } + } + + private void AnimationTimer_Tick(object sender, EventArgs e) + { + _animationTimer.Enabled = false; + + bool animationDone = false; + int newButtonValue; + + if (IsButtonMovingRight) + { + newButtonValue = ButtonValue + _animationStep; + + if (newButtonValue > _animationTarget) + newButtonValue = _animationTarget; + + ButtonValue = newButtonValue; + + animationDone = ButtonValue >= _animationTarget; + } + else + { + newButtonValue = ButtonValue - _animationStep; + + if (newButtonValue < _animationTarget) + newButtonValue = _animationTarget; + + ButtonValue = newButtonValue; + + animationDone = ButtonValue <= _animationTarget; + } + + if (animationDone) + AnimationComplete(); + else + _animationTimer.Enabled = true; + } + + private void AnimationComplete() + { + _animating = false; + _moving = false; + _checked = _animationResult; + + _isButtonHovered = false; + _isButtonPressed = false; + _isLeftFieldHovered = false; + _isLeftFieldPressed = false; + _isRightFieldHovered = false; + _isRightFieldPressed = false; + + Refresh(); + + if (CheckedChanged != null) + CheckedChanged(this, new EventArgs()); + + if (_lastMouseEventArgs != null) + OnMouseMove(_lastMouseEventArgs); + + _lastMouseEventArgs = null; + } + + #endregion Private Methods + } +} diff --git a/ToggleSwitch/ToggleSwitch.csproj b/ToggleSwitch/ToggleSwitch.csproj new file mode 100644 index 0000000..503f39f --- /dev/null +++ b/ToggleSwitch/ToggleSwitch.csproj @@ -0,0 +1,71 @@ + + + + + Debug + AnyCPU + {49B88FFA-F02C-4709-BA65-9F8996444ECD} + Library + Properties + ToggleSwitch + ToggleSwitch + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + Component + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ToggleSwitch/VersionHistory.txt b/ToggleSwitch/VersionHistory.txt new file mode 100644 index 0000000..cdabfad --- /dev/null +++ b/ToggleSwitch/VersionHistory.txt @@ -0,0 +1,11 @@ + +Version 1.1 +----------- +NEW: BeforeRendering event added to make it easier to customize the renderer properties +NEW: Style and Renderer added: PlainAndSimple +UPDATED: Demo app updated with the new features + + +Version 1.0 +------------ +Initial Release \ No newline at end of file diff --git a/ToggleSwitch/bin/Debug/ToggleSwitch.dll b/ToggleSwitch/bin/Debug/ToggleSwitch.dll new file mode 100644 index 0000000..6672741 Binary files /dev/null and b/ToggleSwitch/bin/Debug/ToggleSwitch.dll differ diff --git a/ToggleSwitch/bin/Debug/ToggleSwitch.pdb b/ToggleSwitch/bin/Debug/ToggleSwitch.pdb new file mode 100644 index 0000000..7075212 Binary files /dev/null and b/ToggleSwitch/bin/Debug/ToggleSwitch.pdb differ diff --git a/ToggleSwitch/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs b/ToggleSwitch/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs new file mode 100644 index 0000000..5d01041 --- /dev/null +++ b/ToggleSwitch/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")] diff --git a/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..57b3309 Binary files /dev/null and b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..740216d Binary files /dev/null and b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/ToggleSwitch/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/ToggleSwitch/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll new file mode 100644 index 0000000..aafc425 Binary files /dev/null and b/ToggleSwitch/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.CoreCompileInputs.cache b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..6bfab28 --- /dev/null +++ b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +b9f63ef76dca6d00d7314d042b5bc449c6f8367e diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.FileListAbsolute.txt b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..ec70b4b --- /dev/null +++ b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.FileListAbsolute.txt @@ -0,0 +1,16 @@ +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.dll +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.pdb +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.dll +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.pdb +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csprojResolveAssemblyReference.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.dll +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csproj.CoreCompileInputs.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.dll +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.pdb +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.dll +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.pdb +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csprojAssemblyReference.cache +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csproj.CoreCompileInputs.cache +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.dll +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.pdb diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csprojAssemblyReference.cache b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojAssemblyReference.cache new file mode 100644 index 0000000..4562619 Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojAssemblyReference.cache differ diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csprojResolveAssemblyReference.cache b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..d79bc16 Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojResolveAssemblyReference.cache differ diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.dll b/ToggleSwitch/obj/Debug/ToggleSwitch.dll new file mode 100644 index 0000000..6672741 Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.dll differ diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.pdb b/ToggleSwitch/obj/Debug/ToggleSwitch.pdb new file mode 100644 index 0000000..7075212 Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.pdb differ diff --git a/ToggleSwitch/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitch/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..d8f3461 Binary files /dev/null and b/ToggleSwitch/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.csproj.CoreCompileInputs.cache b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..87aca2b --- /dev/null +++ b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +1f5b776f29663f5f08aa19abd20108ea10358598 diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.csproj.FileListAbsolute.txt b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..340aaf1 --- /dev/null +++ b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.FileListAbsolute.txt @@ -0,0 +1,9 @@ +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.dll +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.pdb +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.dll +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.dll +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.csproj.CoreCompileInputs.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.dll +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.pdb diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.dll b/ToggleSwitch/obj/Release/ToggleSwitch.dll new file mode 100644 index 0000000..c67609f Binary files /dev/null and b/ToggleSwitch/obj/Release/ToggleSwitch.dll differ diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.pdb b/ToggleSwitch/obj/Release/ToggleSwitch.pdb new file mode 100644 index 0000000..9210e58 Binary files /dev/null and b/ToggleSwitch/obj/Release/ToggleSwitch.pdb differ diff --git a/ToggleSwitchDemo/DemoForm.Designer.cs b/ToggleSwitchDemo/DemoForm.Designer.cs new file mode 100644 index 0000000..5f052ac --- /dev/null +++ b/ToggleSwitchDemo/DemoForm.Designer.cs @@ -0,0 +1,1176 @@ +namespace ToggleSwitchDemo +{ + partial class DemoForm + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DemoForm)); + this.TopPanel = new System.Windows.Forms.Panel(); + this.InfoLabel = new System.Windows.Forms.Label(); + this.DemoTabControl = new System.Windows.Forms.TabControl(); + this.StylesTabPage = new System.Windows.Forms.TabPage(); + this.OSXStyleOnLabel = new System.Windows.Forms.Label(); + this.OSXStyleOffLabel = new System.Windows.Forms.Label(); + this.OSXStyleLabel = new System.Windows.Forms.Label(); + this.ModernStyleLabel = new System.Windows.Forms.Label(); + this.IphoneStyleLabel = new System.Windows.Forms.Label(); + this.IOS5StyleLabel = new System.Windows.Forms.Label(); + this.FancyStyleLabel = new System.Windows.Forms.Label(); + this.CarbonStyleLabel = new System.Windows.Forms.Label(); + this.BrushedMetalStyleLabel = new System.Windows.Forms.Label(); + this.AndroidStyleLabel = new System.Windows.Forms.Label(); + this.MetroStyleLabel = new System.Windows.Forms.Label(); + this.SemiImportantPropertiesTabPage = new System.Windows.Forms.TabPage(); + this.label19 = new System.Windows.Forms.Label(); + this.ToggleOnSideClickCheckBox = new System.Windows.Forms.CheckBox(); + this.ToggleOnButtonClickCheckBox = new System.Windows.Forms.CheckBox(); + this.label18 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.ThresholdPercentageTrackBar = new System.Windows.Forms.TrackBar(); + this.label11 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.GrayWhenDisabledCheckBox = new System.Windows.Forms.CheckBox(); + this.label13 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.AllowUserChangeCheckBox = new System.Windows.Forms.CheckBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.AllowUserChangeLabel = new System.Windows.Forms.Label(); + this.SpecialCustomizationsTabPage = new System.Windows.Forms.TabPage(); + this.label29 = new System.Windows.Forms.Label(); + this.AnimatedGifPictureBox = new System.Windows.Forms.PictureBox(); + this.label28 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.label27 = new System.Windows.Forms.Label(); + this.label25 = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.label24 = new System.Windows.Forms.Label(); + this.label22 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.PlaygroundTabPage = new System.Windows.Forms.TabPage(); + this.SimulateRestartBackgroundWorker = new System.ComponentModel.BackgroundWorker(); + this.PlainAndSimpleStyleToggleSwitch = new JCS.ToggleSwitch(); + this.FancyStyleToggleSwitch = new JCS.ToggleSwitch(); + this.OSXStyleToggleSwitch = new JCS.ToggleSwitch(); + this.CarbonStyleToggleSwitch = new JCS.ToggleSwitch(); + this.ModernStyleToggleSwitch = new JCS.ToggleSwitch(); + this.IphoneStyleToggleSwitch = new JCS.ToggleSwitch(); + this.BrushedMetalStyleToggleSwitch = new JCS.ToggleSwitch(); + this.AndroidStyleToggleSwitch = new JCS.ToggleSwitch(); + this.IOS5StyleToggleSwitch = new JCS.ToggleSwitch(); + this.MetroStyleToggleSwitch = new JCS.ToggleSwitch(); + this.ToggleOnClickToggleSwitch = new JCS.ToggleSwitch(); + this.ThresholdPercentageToggleSwitch = new JCS.ToggleSwitch(); + this.GrayWhenDisabledToggleSwitch2 = new JCS.ToggleSwitch(); + this.GrayWhenDisabledToggleSwitch1 = new JCS.ToggleSwitch(); + this.SlowAnimationToggleSwitch = new JCS.ToggleSwitch(); + this.FastAnimationToggleSwitch = new JCS.ToggleSwitch(); + this.NoAnimationToggleSwitch = new JCS.ToggleSwitch(); + this.AllowUserChangeToggleSwitch2 = new JCS.ToggleSwitch(); + this.AllowUserChangeToggleSwitch1 = new JCS.ToggleSwitch(); + this.AdvancedBehaviorFancyToggleSwitch = new JCS.ToggleSwitch(); + this.CustomizedFancyToggleSwitch = new JCS.ToggleSwitch(); + this.NormalFancyToggleSwitch = new JCS.ToggleSwitch(); + this.CustomizedIOS5ToggleSwitch = new JCS.ToggleSwitch(); + this.NormalIOS5ToggleSwitch = new JCS.ToggleSwitch(); + this.CustomizedMetroToggleSwitch = new JCS.ToggleSwitch(); + this.NormalMetroToggleSwitch = new JCS.ToggleSwitch(); + this.PlaygroundToggleSwitch = new JCS.ToggleSwitch(); + this.PlaygroundPropertyGrid = new System.Windows.Forms.PropertyGrid(); + this.label30 = new System.Windows.Forms.Label(); + this.NormalPlainAndSimpleToggleSwitch = new JCS.ToggleSwitch(); + this.CustomizedPlainAndSimpleToggleSwitch = new JCS.ToggleSwitch(); + this.label31 = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.TopPanel.SuspendLayout(); + this.DemoTabControl.SuspendLayout(); + this.StylesTabPage.SuspendLayout(); + this.SemiImportantPropertiesTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.ThresholdPercentageTrackBar)).BeginInit(); + this.SpecialCustomizationsTabPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.AnimatedGifPictureBox)).BeginInit(); + this.PlaygroundTabPage.SuspendLayout(); + this.SuspendLayout(); + // + // TopPanel + // + this.TopPanel.BackColor = System.Drawing.Color.White; + this.TopPanel.Controls.Add(this.InfoLabel); + this.TopPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.TopPanel.Location = new System.Drawing.Point(0, 0); + this.TopPanel.Name = "TopPanel"; + this.TopPanel.Size = new System.Drawing.Size(878, 100); + this.TopPanel.TabIndex = 0; + // + // InfoLabel + // + this.InfoLabel.Dock = System.Windows.Forms.DockStyle.Fill; + this.InfoLabel.Location = new System.Drawing.Point(0, 0); + this.InfoLabel.Name = "InfoLabel"; + this.InfoLabel.Padding = new System.Windows.Forms.Padding(5); + this.InfoLabel.Size = new System.Drawing.Size(878, 100); + this.InfoLabel.TabIndex = 0; + this.InfoLabel.Text = resources.GetString("InfoLabel.Text"); + // + // DemoTabControl + // + this.DemoTabControl.Controls.Add(this.StylesTabPage); + this.DemoTabControl.Controls.Add(this.SemiImportantPropertiesTabPage); + this.DemoTabControl.Controls.Add(this.SpecialCustomizationsTabPage); + this.DemoTabControl.Controls.Add(this.PlaygroundTabPage); + this.DemoTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.DemoTabControl.Location = new System.Drawing.Point(0, 100); + this.DemoTabControl.Name = "DemoTabControl"; + this.DemoTabControl.SelectedIndex = 0; + this.DemoTabControl.Size = new System.Drawing.Size(878, 505); + this.DemoTabControl.TabIndex = 1; + // + // StylesTabPage + // + this.StylesTabPage.Controls.Add(this.label30); + this.StylesTabPage.Controls.Add(this.PlainAndSimpleStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.OSXStyleOnLabel); + this.StylesTabPage.Controls.Add(this.OSXStyleOffLabel); + this.StylesTabPage.Controls.Add(this.FancyStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.OSXStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.CarbonStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.ModernStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.IphoneStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.BrushedMetalStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.AndroidStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.IOS5StyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.MetroStyleToggleSwitch); + this.StylesTabPage.Controls.Add(this.OSXStyleLabel); + this.StylesTabPage.Controls.Add(this.ModernStyleLabel); + this.StylesTabPage.Controls.Add(this.IphoneStyleLabel); + this.StylesTabPage.Controls.Add(this.IOS5StyleLabel); + this.StylesTabPage.Controls.Add(this.FancyStyleLabel); + this.StylesTabPage.Controls.Add(this.CarbonStyleLabel); + this.StylesTabPage.Controls.Add(this.BrushedMetalStyleLabel); + this.StylesTabPage.Controls.Add(this.AndroidStyleLabel); + this.StylesTabPage.Controls.Add(this.MetroStyleLabel); + this.StylesTabPage.Location = new System.Drawing.Point(4, 22); + this.StylesTabPage.Name = "StylesTabPage"; + this.StylesTabPage.Padding = new System.Windows.Forms.Padding(3); + this.StylesTabPage.Size = new System.Drawing.Size(870, 479); + this.StylesTabPage.TabIndex = 0; + this.StylesTabPage.Text = "Styles"; + this.StylesTabPage.UseVisualStyleBackColor = true; + // + // OSXStyleOnLabel + // + this.OSXStyleOnLabel.AutoSize = true; + this.OSXStyleOnLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.OSXStyleOnLabel.Location = new System.Drawing.Point(530, 312); + this.OSXStyleOnLabel.Name = "OSXStyleOnLabel"; + this.OSXStyleOnLabel.Size = new System.Drawing.Size(31, 17); + this.OSXStyleOnLabel.TabIndex = 19; + this.OSXStyleOnLabel.Text = "ON"; + // + // OSXStyleOffLabel + // + this.OSXStyleOffLabel.AutoSize = true; + this.OSXStyleOffLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.OSXStyleOffLabel.Location = new System.Drawing.Point(392, 312); + this.OSXStyleOffLabel.Name = "OSXStyleOffLabel"; + this.OSXStyleOffLabel.Size = new System.Drawing.Size(38, 17); + this.OSXStyleOffLabel.TabIndex = 18; + this.OSXStyleOffLabel.Text = "OFF"; + // + // OSXStyleLabel + // + this.OSXStyleLabel.AutoSize = true; + this.OSXStyleLabel.Location = new System.Drawing.Point(392, 280); + this.OSXStyleLabel.Name = "OSXStyleLabel"; + this.OSXStyleLabel.Size = new System.Drawing.Size(64, 13); + this.OSXStyleLabel.TabIndex = 8; + this.OSXStyleLabel.Text = "Style = OSX"; + // + // ModernStyleLabel + // + this.ModernStyleLabel.AutoSize = true; + this.ModernStyleLabel.Location = new System.Drawing.Point(623, 161); + this.ModernStyleLabel.Name = "ModernStyleLabel"; + this.ModernStyleLabel.Size = new System.Drawing.Size(78, 13); + this.ModernStyleLabel.TabIndex = 7; + this.ModernStyleLabel.Text = "Style = Modern"; + // + // IphoneStyleLabel + // + this.IphoneStyleLabel.AutoSize = true; + this.IphoneStyleLabel.Location = new System.Drawing.Point(392, 161); + this.IphoneStyleLabel.Name = "IphoneStyleLabel"; + this.IphoneStyleLabel.Size = new System.Drawing.Size(75, 13); + this.IphoneStyleLabel.TabIndex = 6; + this.IphoneStyleLabel.Text = "Style = Iphone"; + // + // IOS5StyleLabel + // + this.IOS5StyleLabel.AutoSize = true; + this.IOS5StyleLabel.Location = new System.Drawing.Point(392, 52); + this.IOS5StyleLabel.Name = "IOS5StyleLabel"; + this.IOS5StyleLabel.Size = new System.Drawing.Size(66, 13); + this.IOS5StyleLabel.TabIndex = 5; + this.IOS5StyleLabel.Text = "Style = IOS5"; + // + // FancyStyleLabel + // + this.FancyStyleLabel.AutoSize = true; + this.FancyStyleLabel.Location = new System.Drawing.Point(623, 280); + this.FancyStyleLabel.Name = "FancyStyleLabel"; + this.FancyStyleLabel.Size = new System.Drawing.Size(71, 13); + this.FancyStyleLabel.TabIndex = 4; + this.FancyStyleLabel.Text = "Style = Fancy"; + // + // CarbonStyleLabel + // + this.CarbonStyleLabel.AutoSize = true; + this.CarbonStyleLabel.Location = new System.Drawing.Point(161, 280); + this.CarbonStyleLabel.Name = "CarbonStyleLabel"; + this.CarbonStyleLabel.Size = new System.Drawing.Size(76, 13); + this.CarbonStyleLabel.TabIndex = 3; + this.CarbonStyleLabel.Text = "Style = Carbon"; + // + // BrushedMetalStyleLabel + // + this.BrushedMetalStyleLabel.AutoSize = true; + this.BrushedMetalStyleLabel.Location = new System.Drawing.Point(161, 161); + this.BrushedMetalStyleLabel.Name = "BrushedMetalStyleLabel"; + this.BrushedMetalStyleLabel.Size = new System.Drawing.Size(107, 13); + this.BrushedMetalStyleLabel.TabIndex = 2; + this.BrushedMetalStyleLabel.Text = "Style = BrushedMetal"; + // + // AndroidStyleLabel + // + this.AndroidStyleLabel.AutoSize = true; + this.AndroidStyleLabel.Location = new System.Drawing.Point(623, 52); + this.AndroidStyleLabel.Name = "AndroidStyleLabel"; + this.AndroidStyleLabel.Size = new System.Drawing.Size(78, 13); + this.AndroidStyleLabel.TabIndex = 1; + this.AndroidStyleLabel.Text = "Style = Android"; + // + // MetroStyleLabel + // + this.MetroStyleLabel.AutoSize = true; + this.MetroStyleLabel.Location = new System.Drawing.Point(161, 52); + this.MetroStyleLabel.Name = "MetroStyleLabel"; + this.MetroStyleLabel.Size = new System.Drawing.Size(69, 13); + this.MetroStyleLabel.TabIndex = 0; + this.MetroStyleLabel.Text = "Style = Metro"; + // + // SemiImportantPropertiesTabPage + // + this.SemiImportantPropertiesTabPage.Controls.Add(this.label19); + this.SemiImportantPropertiesTabPage.Controls.Add(this.ToggleOnSideClickCheckBox); + this.SemiImportantPropertiesTabPage.Controls.Add(this.ToggleOnButtonClickCheckBox); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label18); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label17); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label16); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label15); + this.SemiImportantPropertiesTabPage.Controls.Add(this.ThresholdPercentageTrackBar); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label11); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label12); + this.SemiImportantPropertiesTabPage.Controls.Add(this.GrayWhenDisabledCheckBox); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label13); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label14); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label10); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label9); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label8); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label7); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label6); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label5); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label4); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label3); + this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeCheckBox); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label2); + this.SemiImportantPropertiesTabPage.Controls.Add(this.label1); + this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeLabel); + this.SemiImportantPropertiesTabPage.Controls.Add(this.ToggleOnClickToggleSwitch); + this.SemiImportantPropertiesTabPage.Controls.Add(this.ThresholdPercentageToggleSwitch); + this.SemiImportantPropertiesTabPage.Controls.Add(this.GrayWhenDisabledToggleSwitch2); + this.SemiImportantPropertiesTabPage.Controls.Add(this.GrayWhenDisabledToggleSwitch1); + this.SemiImportantPropertiesTabPage.Controls.Add(this.SlowAnimationToggleSwitch); + this.SemiImportantPropertiesTabPage.Controls.Add(this.FastAnimationToggleSwitch); + this.SemiImportantPropertiesTabPage.Controls.Add(this.NoAnimationToggleSwitch); + this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeToggleSwitch2); + this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeToggleSwitch1); + this.SemiImportantPropertiesTabPage.Location = new System.Drawing.Point(4, 22); + this.SemiImportantPropertiesTabPage.Name = "SemiImportantPropertiesTabPage"; + this.SemiImportantPropertiesTabPage.Padding = new System.Windows.Forms.Padding(3); + this.SemiImportantPropertiesTabPage.Size = new System.Drawing.Size(870, 479); + this.SemiImportantPropertiesTabPage.TabIndex = 1; + this.SemiImportantPropertiesTabPage.Text = "(Semi)-Important Properties"; + this.SemiImportantPropertiesTabPage.UseVisualStyleBackColor = true; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label19.Location = new System.Drawing.Point(427, 444); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(67, 13); + this.label19.TabIndex = 42; + this.label19.Text = "both or none"; + // + // ToggleOnSideClickCheckBox + // + this.ToggleOnSideClickCheckBox.AutoSize = true; + this.ToggleOnSideClickCheckBox.Checked = true; + this.ToggleOnSideClickCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.ToggleOnSideClickCheckBox.Location = new System.Drawing.Point(205, 444); + this.ToggleOnSideClickCheckBox.Name = "ToggleOnSideClickCheckBox"; + this.ToggleOnSideClickCheckBox.Size = new System.Drawing.Size(117, 17); + this.ToggleOnSideClickCheckBox.TabIndex = 41; + this.ToggleOnSideClickCheckBox.Text = "ToggleOnSideClick"; + this.ToggleOnSideClickCheckBox.UseVisualStyleBackColor = true; + this.ToggleOnSideClickCheckBox.CheckedChanged += new System.EventHandler(this.ToggleOnSideClickCheckBox_CheckedChanged); + // + // ToggleOnButtonClickCheckBox + // + this.ToggleOnButtonClickCheckBox.AutoSize = true; + this.ToggleOnButtonClickCheckBox.Checked = true; + this.ToggleOnButtonClickCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.ToggleOnButtonClickCheckBox.Location = new System.Drawing.Point(205, 421); + this.ToggleOnButtonClickCheckBox.Name = "ToggleOnButtonClickCheckBox"; + this.ToggleOnButtonClickCheckBox.Size = new System.Drawing.Size(127, 17); + this.ToggleOnButtonClickCheckBox.TabIndex = 40; + this.ToggleOnButtonClickCheckBox.Text = "ToggleOnButtonClick"; + this.ToggleOnButtonClickCheckBox.UseVisualStyleBackColor = true; + this.ToggleOnButtonClickCheckBox.CheckedChanged += new System.EventHandler(this.ToggleOnButtonClickCheckBox_CheckedChanged); + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label18.Location = new System.Drawing.Point(427, 419); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(436, 13); + this.label18.TabIndex = 39; + this.label18.Text = "Determines where you have to click to toggle the switch, on the button, besides t" + + "he button,"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label17.ForeColor = System.Drawing.Color.Gray; + this.label17.Location = new System.Drawing.Point(8, 384); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(399, 17); + this.label17.TabIndex = 37; + this.label17.Text = "ToggleOnButtonClick (boolean), ToggleOnSideClick (boolean)"; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label16.Location = new System.Drawing.Point(427, 336); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(410, 13); + this.label16.TabIndex = 36; + this.label16.Text = "Determines how far you have to drag the slider button before it snaps to the othe" + + "r side"; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(266, 336); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(125, 13); + this.label15.TabIndex = 35; + this.label15.Text = "Value = 50 (Default = 50)"; + // + // ThresholdPercentageTrackBar + // + this.ThresholdPercentageTrackBar.BackColor = System.Drawing.Color.White; + this.ThresholdPercentageTrackBar.Location = new System.Drawing.Point(145, 336); + this.ThresholdPercentageTrackBar.Maximum = 100; + this.ThresholdPercentageTrackBar.Name = "ThresholdPercentageTrackBar"; + this.ThresholdPercentageTrackBar.Size = new System.Drawing.Size(104, 45); + this.ThresholdPercentageTrackBar.TabIndex = 34; + this.ThresholdPercentageTrackBar.TickFrequency = 10; + this.ThresholdPercentageTrackBar.Value = 50; + this.ThresholdPercentageTrackBar.Scroll += new System.EventHandler(this.ThresholdPercentageTrackBar_Scroll); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label11.ForeColor = System.Drawing.Color.Gray; + this.label11.Location = new System.Drawing.Point(8, 305); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(203, 17); + this.label11.TabIndex = 32; + this.label11.Text = "ThresholdPercentage (integer)"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label12.Location = new System.Drawing.Point(427, 235); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(252, 13); + this.label12.TabIndex = 31; + this.label12.Text = "Affects the coloring of the control when it is disabled"; + // + // GrayWhenDisabledCheckBox + // + this.GrayWhenDisabledCheckBox.AutoSize = true; + this.GrayWhenDisabledCheckBox.Checked = true; + this.GrayWhenDisabledCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.GrayWhenDisabledCheckBox.Location = new System.Drawing.Point(319, 234); + this.GrayWhenDisabledCheckBox.Name = "GrayWhenDisabledCheckBox"; + this.GrayWhenDisabledCheckBox.Size = new System.Drawing.Size(65, 17); + this.GrayWhenDisabledCheckBox.TabIndex = 30; + this.GrayWhenDisabledCheckBox.Text = "Enabled"; + this.GrayWhenDisabledCheckBox.UseVisualStyleBackColor = true; + this.GrayWhenDisabledCheckBox.CheckedChanged += new System.EventHandler(this.GrayWhenDisabledCheckBox_CheckedChanged); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(116, 268); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(172, 13); + this.label13.TabIndex = 29; + this.label13.Text = "GrayWhenDisabled = true (Default)"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(116, 234); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(133, 13); + this.label14.TabIndex = 28; + this.label14.Text = "GrayWhenDisabled = false"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label10.ForeColor = System.Drawing.Color.Gray; + this.label10.Location = new System.Drawing.Point(8, 194); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(196, 17); + this.label10.TabIndex = 25; + this.label10.Text = "GrayWhenDisabled (boolean)"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label9.Location = new System.Drawing.Point(8, 168); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(681, 13); + this.label9.TabIndex = 24; + this.label9.Text = "Different values for the two integer properties will affect the animation speed. " + + "Animation is turned off completely using the UseAnimation property"; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(621, 136); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(78, 13); + this.label8.TabIndex = 23; + this.label8.Text = "Slow animation"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(360, 136); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(75, 13); + this.label7.TabIndex = 21; + this.label7.Text = "Fast animation"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(123, 136); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(69, 13); + this.label6.TabIndex = 19; + this.label6.Text = "No animation"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label5.ForeColor = System.Drawing.Color.Gray; + this.label5.Location = new System.Drawing.Point(8, 96); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(491, 17); + this.label5.TabIndex = 17; + this.label5.Text = "AnimationInterval (integer), AnimationStep (integer), UseAnimation (boolean)"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.Location = new System.Drawing.Point(427, 61); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(158, 13); + this.label4.TabIndex = 16; + this.label4.Text = "you cannot change it in the GUI"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(427, 37); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(397, 13); + this.label3.TabIndex = 15; + this.label3.Text = "Notice: You can set the Checked value from code, but if AllowUserChange = false,"; + // + // AllowUserChangeCheckBox + // + this.AllowUserChangeCheckBox.AutoSize = true; + this.AllowUserChangeCheckBox.Location = new System.Drawing.Point(288, 37); + this.AllowUserChangeCheckBox.Name = "AllowUserChangeCheckBox"; + this.AllowUserChangeCheckBox.Size = new System.Drawing.Size(69, 17); + this.AllowUserChangeCheckBox.TabIndex = 14; + this.AllowUserChangeCheckBox.Text = "Checked"; + this.AllowUserChangeCheckBox.UseVisualStyleBackColor = true; + this.AllowUserChangeCheckBox.CheckedChanged += new System.EventHandler(this.AllowUserChangeCheckBox_CheckedChanged); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(85, 62); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(164, 13); + this.label2.TabIndex = 13; + this.label2.Text = "AllowUserChange = true (Default)"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(85, 37); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(125, 13); + this.label1.TabIndex = 12; + this.label1.Text = "AllowUserChange = false"; + // + // AllowUserChangeLabel + // + this.AllowUserChangeLabel.AutoSize = true; + this.AllowUserChangeLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AllowUserChangeLabel.ForeColor = System.Drawing.Color.Gray; + this.AllowUserChangeLabel.Location = new System.Drawing.Point(8, 3); + this.AllowUserChangeLabel.Name = "AllowUserChangeLabel"; + this.AllowUserChangeLabel.Size = new System.Drawing.Size(184, 17); + this.AllowUserChangeLabel.TabIndex = 0; + this.AllowUserChangeLabel.Text = "AllowUserChange (boolean)"; + // + // SpecialCustomizationsTabPage + // + this.SpecialCustomizationsTabPage.Controls.Add(this.label31); + this.SpecialCustomizationsTabPage.Controls.Add(this.label32); + this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedPlainAndSimpleToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.NormalPlainAndSimpleToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.label29); + this.SpecialCustomizationsTabPage.Controls.Add(this.AnimatedGifPictureBox); + this.SpecialCustomizationsTabPage.Controls.Add(this.label28); + this.SpecialCustomizationsTabPage.Controls.Add(this.label26); + this.SpecialCustomizationsTabPage.Controls.Add(this.label27); + this.SpecialCustomizationsTabPage.Controls.Add(this.label25); + this.SpecialCustomizationsTabPage.Controls.Add(this.label23); + this.SpecialCustomizationsTabPage.Controls.Add(this.label24); + this.SpecialCustomizationsTabPage.Controls.Add(this.label22); + this.SpecialCustomizationsTabPage.Controls.Add(this.label21); + this.SpecialCustomizationsTabPage.Controls.Add(this.label20); + this.SpecialCustomizationsTabPage.Controls.Add(this.AdvancedBehaviorFancyToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedFancyToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.NormalFancyToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedIOS5ToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.NormalIOS5ToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedMetroToggleSwitch); + this.SpecialCustomizationsTabPage.Controls.Add(this.NormalMetroToggleSwitch); + this.SpecialCustomizationsTabPage.Location = new System.Drawing.Point(4, 22); + this.SpecialCustomizationsTabPage.Name = "SpecialCustomizationsTabPage"; + this.SpecialCustomizationsTabPage.Size = new System.Drawing.Size(870, 479); + this.SpecialCustomizationsTabPage.TabIndex = 2; + this.SpecialCustomizationsTabPage.Text = "Special Customizations"; + this.SpecialCustomizationsTabPage.UseVisualStyleBackColor = true; + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label29.ForeColor = System.Drawing.Color.Gray; + this.label29.Location = new System.Drawing.Point(19, 145); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(331, 17); + this.label29.TabIndex = 33; + this.label29.Text = "Color Customization using RendererChanged event"; + // + // AnimatedGifPictureBox + // + this.AnimatedGifPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("AnimatedGifPictureBox.Image"))); + this.AnimatedGifPictureBox.Location = new System.Drawing.Point(512, 429); + this.AnimatedGifPictureBox.Name = "AnimatedGifPictureBox"; + this.AnimatedGifPictureBox.Size = new System.Drawing.Size(36, 31); + this.AnimatedGifPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.AnimatedGifPictureBox.TabIndex = 2; + this.AnimatedGifPictureBox.TabStop = false; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label28.ForeColor = System.Drawing.Color.Gray; + this.label28.Location = new System.Drawing.Point(19, 337); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(188, 17); + this.label28.TabIndex = 31; + this.label28.Text = "Advanced Behavior Example"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(349, 291); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(61, 13); + this.label26.TabIndex = 30; + this.label26.Text = "Customized"; + // + // label27 + // + this.label27.AutoSize = true; + this.label27.Location = new System.Drawing.Point(126, 291); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(40, 13); + this.label27.TabIndex = 29; + this.label27.Text = "Normal"; + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label25.ForeColor = System.Drawing.Color.Gray; + this.label25.Location = new System.Drawing.Point(19, 248); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(255, 17); + this.label25.TabIndex = 26; + this.label25.Text = "Images in the button and the side fields"; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(349, 110); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(61, 13); + this.label23.TabIndex = 25; + this.label23.Text = "Customized"; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(126, 110); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(40, 13); + this.label24.TabIndex = 24; + this.label24.Text = "Normal"; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(349, 52); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(61, 13); + this.label22.TabIndex = 21; + this.label22.Text = "Customized"; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(126, 52); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(40, 13); + this.label21.TabIndex = 20; + this.label21.Text = "Normal"; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label20.ForeColor = System.Drawing.Color.Gray; + this.label20.Location = new System.Drawing.Point(19, 14); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(133, 17); + this.label20.TabIndex = 1; + this.label20.Text = "Color Customization"; + // + // PlaygroundTabPage + // + this.PlaygroundTabPage.Controls.Add(this.PlaygroundToggleSwitch); + this.PlaygroundTabPage.Controls.Add(this.PlaygroundPropertyGrid); + this.PlaygroundTabPage.Location = new System.Drawing.Point(4, 22); + this.PlaygroundTabPage.Name = "PlaygroundTabPage"; + this.PlaygroundTabPage.Size = new System.Drawing.Size(870, 479); + this.PlaygroundTabPage.TabIndex = 3; + this.PlaygroundTabPage.Text = "Playground"; + this.PlaygroundTabPage.UseVisualStyleBackColor = true; + // + // SimulateRestartBackgroundWorker + // + this.SimulateRestartBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.SimulateRestartBackgroundWorker_DoWork); + this.SimulateRestartBackgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.SimulateRestartBackgroundWorker_RunWorkerCompleted); + // + // PlainAndSimpleStyleToggleSwitch + // + this.PlainAndSimpleStyleToggleSwitch.BackColor = System.Drawing.Color.Transparent; + this.PlainAndSimpleStyleToggleSwitch.Location = new System.Drawing.Point(164, 403); + this.PlainAndSimpleStyleToggleSwitch.Name = "PlainAndSimpleStyleToggleSwitch"; + this.PlainAndSimpleStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.PlainAndSimpleStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.PlainAndSimpleStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.PlainAndSimpleStyleToggleSwitch.TabIndex = 21; + // + // FancyStyleToggleSwitch + // + this.FancyStyleToggleSwitch.Location = new System.Drawing.Point(626, 309); + this.FancyStyleToggleSwitch.Name = "FancyStyleToggleSwitch"; + this.FancyStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FancyStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FancyStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.FancyStyleToggleSwitch.TabIndex = 17; + // + // OSXStyleToggleSwitch + // + this.OSXStyleToggleSwitch.Location = new System.Drawing.Point(434, 309); + this.OSXStyleToggleSwitch.Name = "OSXStyleToggleSwitch"; + this.OSXStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.OSXStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.OSXStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.OSXStyleToggleSwitch.TabIndex = 16; + // + // CarbonStyleToggleSwitch + // + this.CarbonStyleToggleSwitch.Location = new System.Drawing.Point(164, 309); + this.CarbonStyleToggleSwitch.Name = "CarbonStyleToggleSwitch"; + this.CarbonStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CarbonStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CarbonStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.CarbonStyleToggleSwitch.TabIndex = 15; + // + // ModernStyleToggleSwitch + // + this.ModernStyleToggleSwitch.Location = new System.Drawing.Point(626, 188); + this.ModernStyleToggleSwitch.Name = "ModernStyleToggleSwitch"; + this.ModernStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ModernStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ModernStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.ModernStyleToggleSwitch.TabIndex = 14; + // + // IphoneStyleToggleSwitch + // + this.IphoneStyleToggleSwitch.Location = new System.Drawing.Point(395, 188); + this.IphoneStyleToggleSwitch.Name = "IphoneStyleToggleSwitch"; + this.IphoneStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.IphoneStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.IphoneStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.IphoneStyleToggleSwitch.TabIndex = 13; + // + // BrushedMetalStyleToggleSwitch + // + this.BrushedMetalStyleToggleSwitch.Location = new System.Drawing.Point(164, 188); + this.BrushedMetalStyleToggleSwitch.Name = "BrushedMetalStyleToggleSwitch"; + this.BrushedMetalStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.BrushedMetalStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.BrushedMetalStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.BrushedMetalStyleToggleSwitch.TabIndex = 12; + // + // AndroidStyleToggleSwitch + // + this.AndroidStyleToggleSwitch.Location = new System.Drawing.Point(626, 79); + this.AndroidStyleToggleSwitch.Name = "AndroidStyleToggleSwitch"; + this.AndroidStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AndroidStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AndroidStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.AndroidStyleToggleSwitch.TabIndex = 11; + // + // IOS5StyleToggleSwitch + // + this.IOS5StyleToggleSwitch.Location = new System.Drawing.Point(395, 79); + this.IOS5StyleToggleSwitch.Name = "IOS5StyleToggleSwitch"; + this.IOS5StyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.IOS5StyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.IOS5StyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.IOS5StyleToggleSwitch.TabIndex = 10; + // + // MetroStyleToggleSwitch + // + this.MetroStyleToggleSwitch.Location = new System.Drawing.Point(164, 79); + this.MetroStyleToggleSwitch.Name = "MetroStyleToggleSwitch"; + this.MetroStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MetroStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MetroStyleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.MetroStyleToggleSwitch.TabIndex = 9; + // + // ToggleOnClickToggleSwitch + // + this.ToggleOnClickToggleSwitch.Location = new System.Drawing.Point(11, 419); + this.ToggleOnClickToggleSwitch.Name = "ToggleOnClickToggleSwitch"; + this.ToggleOnClickToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ToggleOnClickToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ToggleOnClickToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.ToggleOnClickToggleSwitch.TabIndex = 38; + // + // ThresholdPercentageToggleSwitch + // + this.ThresholdPercentageToggleSwitch.Location = new System.Drawing.Point(11, 336); + this.ThresholdPercentageToggleSwitch.Name = "ThresholdPercentageToggleSwitch"; + this.ThresholdPercentageToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ThresholdPercentageToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ThresholdPercentageToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.ThresholdPercentageToggleSwitch.TabIndex = 33; + // + // GrayWhenDisabledToggleSwitch2 + // + this.GrayWhenDisabledToggleSwitch2.Location = new System.Drawing.Point(11, 262); + this.GrayWhenDisabledToggleSwitch2.Name = "GrayWhenDisabledToggleSwitch2"; + this.GrayWhenDisabledToggleSwitch2.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.GrayWhenDisabledToggleSwitch2.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.GrayWhenDisabledToggleSwitch2.Size = new System.Drawing.Size(50, 19); + this.GrayWhenDisabledToggleSwitch2.TabIndex = 27; + // + // GrayWhenDisabledToggleSwitch1 + // + this.GrayWhenDisabledToggleSwitch1.Location = new System.Drawing.Point(11, 228); + this.GrayWhenDisabledToggleSwitch1.Name = "GrayWhenDisabledToggleSwitch1"; + this.GrayWhenDisabledToggleSwitch1.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.GrayWhenDisabledToggleSwitch1.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.GrayWhenDisabledToggleSwitch1.Size = new System.Drawing.Size(50, 19); + this.GrayWhenDisabledToggleSwitch1.TabIndex = 26; + // + // SlowAnimationToggleSwitch + // + this.SlowAnimationToggleSwitch.Location = new System.Drawing.Point(510, 130); + this.SlowAnimationToggleSwitch.Name = "SlowAnimationToggleSwitch"; + this.SlowAnimationToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SlowAnimationToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SlowAnimationToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.SlowAnimationToggleSwitch.TabIndex = 22; + // + // FastAnimationToggleSwitch + // + this.FastAnimationToggleSwitch.Location = new System.Drawing.Point(252, 130); + this.FastAnimationToggleSwitch.Name = "FastAnimationToggleSwitch"; + this.FastAnimationToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FastAnimationToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FastAnimationToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.FastAnimationToggleSwitch.TabIndex = 20; + // + // NoAnimationToggleSwitch + // + this.NoAnimationToggleSwitch.Location = new System.Drawing.Point(11, 130); + this.NoAnimationToggleSwitch.Name = "NoAnimationToggleSwitch"; + this.NoAnimationToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NoAnimationToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NoAnimationToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.NoAnimationToggleSwitch.TabIndex = 18; + // + // AllowUserChangeToggleSwitch2 + // + this.AllowUserChangeToggleSwitch2.Location = new System.Drawing.Point(11, 60); + this.AllowUserChangeToggleSwitch2.Name = "AllowUserChangeToggleSwitch2"; + this.AllowUserChangeToggleSwitch2.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AllowUserChangeToggleSwitch2.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AllowUserChangeToggleSwitch2.Size = new System.Drawing.Size(50, 19); + this.AllowUserChangeToggleSwitch2.TabIndex = 11; + // + // AllowUserChangeToggleSwitch1 + // + this.AllowUserChangeToggleSwitch1.Location = new System.Drawing.Point(11, 35); + this.AllowUserChangeToggleSwitch1.Name = "AllowUserChangeToggleSwitch1"; + this.AllowUserChangeToggleSwitch1.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AllowUserChangeToggleSwitch1.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AllowUserChangeToggleSwitch1.Size = new System.Drawing.Size(50, 19); + this.AllowUserChangeToggleSwitch1.TabIndex = 10; + // + // AdvancedBehaviorFancyToggleSwitch + // + this.AdvancedBehaviorFancyToggleSwitch.Location = new System.Drawing.Point(22, 380); + this.AdvancedBehaviorFancyToggleSwitch.Name = "AdvancedBehaviorFancyToggleSwitch"; + this.AdvancedBehaviorFancyToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AdvancedBehaviorFancyToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.AdvancedBehaviorFancyToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.AdvancedBehaviorFancyToggleSwitch.TabIndex = 32; + // + // CustomizedFancyToggleSwitch + // + this.CustomizedFancyToggleSwitch.Location = new System.Drawing.Point(238, 287); + this.CustomizedFancyToggleSwitch.Name = "CustomizedFancyToggleSwitch"; + this.CustomizedFancyToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedFancyToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedFancyToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.CustomizedFancyToggleSwitch.TabIndex = 28; + // + // NormalFancyToggleSwitch + // + this.NormalFancyToggleSwitch.Location = new System.Drawing.Point(22, 287); + this.NormalFancyToggleSwitch.Name = "NormalFancyToggleSwitch"; + this.NormalFancyToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalFancyToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalFancyToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.NormalFancyToggleSwitch.TabIndex = 27; + // + // CustomizedIOS5ToggleSwitch + // + this.CustomizedIOS5ToggleSwitch.Location = new System.Drawing.Point(238, 93); + this.CustomizedIOS5ToggleSwitch.Name = "CustomizedIOS5ToggleSwitch"; + this.CustomizedIOS5ToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedIOS5ToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedIOS5ToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.CustomizedIOS5ToggleSwitch.TabIndex = 23; + // + // NormalIOS5ToggleSwitch + // + this.NormalIOS5ToggleSwitch.Location = new System.Drawing.Point(22, 93); + this.NormalIOS5ToggleSwitch.Name = "NormalIOS5ToggleSwitch"; + this.NormalIOS5ToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalIOS5ToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalIOS5ToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.NormalIOS5ToggleSwitch.TabIndex = 22; + // + // CustomizedMetroToggleSwitch + // + this.CustomizedMetroToggleSwitch.Location = new System.Drawing.Point(238, 48); + this.CustomizedMetroToggleSwitch.Name = "CustomizedMetroToggleSwitch"; + this.CustomizedMetroToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedMetroToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedMetroToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.CustomizedMetroToggleSwitch.TabIndex = 11; + // + // NormalMetroToggleSwitch + // + this.NormalMetroToggleSwitch.Location = new System.Drawing.Point(22, 48); + this.NormalMetroToggleSwitch.Name = "NormalMetroToggleSwitch"; + this.NormalMetroToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalMetroToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalMetroToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.NormalMetroToggleSwitch.TabIndex = 10; + // + // PlaygroundToggleSwitch + // + this.PlaygroundToggleSwitch.Location = new System.Drawing.Point(51, 42); + this.PlaygroundToggleSwitch.Name = "PlaygroundToggleSwitch"; + this.PlaygroundToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.PlaygroundToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.PlaygroundToggleSwitch.Size = new System.Drawing.Size(92, 33); + this.PlaygroundToggleSwitch.TabIndex = 11; + // + // PlaygroundPropertyGrid + // + this.PlaygroundPropertyGrid.Dock = System.Windows.Forms.DockStyle.Right; + this.PlaygroundPropertyGrid.Location = new System.Drawing.Point(459, 0); + this.PlaygroundPropertyGrid.Name = "PlaygroundPropertyGrid"; + this.PlaygroundPropertyGrid.SelectedObject = this.PlaygroundToggleSwitch; + this.PlaygroundPropertyGrid.Size = new System.Drawing.Size(411, 479); + this.PlaygroundPropertyGrid.TabIndex = 0; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Location = new System.Drawing.Point(161, 372); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(115, 13); + this.label30.TabIndex = 22; + this.label30.Text = "Style = PlainAndSimple"; + // + // NormalPlainAndSimpleToggleSwitch + // + this.NormalPlainAndSimpleToggleSwitch.BackColor = System.Drawing.Color.Transparent; + this.NormalPlainAndSimpleToggleSwitch.Location = new System.Drawing.Point(22, 187); + this.NormalPlainAndSimpleToggleSwitch.Name = "NormalPlainAndSimpleToggleSwitch"; + this.NormalPlainAndSimpleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalPlainAndSimpleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.NormalPlainAndSimpleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.NormalPlainAndSimpleToggleSwitch.TabIndex = 34; + // + // CustomizedPlainAndSimpleToggleSwitch + // + this.CustomizedPlainAndSimpleToggleSwitch.BackColor = System.Drawing.Color.Transparent; + this.CustomizedPlainAndSimpleToggleSwitch.Location = new System.Drawing.Point(238, 187); + this.CustomizedPlainAndSimpleToggleSwitch.Name = "CustomizedPlainAndSimpleToggleSwitch"; + this.CustomizedPlainAndSimpleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedPlainAndSimpleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.CustomizedPlainAndSimpleToggleSwitch.Size = new System.Drawing.Size(50, 19); + this.CustomizedPlainAndSimpleToggleSwitch.TabIndex = 35; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Location = new System.Drawing.Point(349, 193); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(61, 13); + this.label31.TabIndex = 37; + this.label31.Text = "Customized"; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Location = new System.Drawing.Point(126, 193); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(40, 13); + this.label32.TabIndex = 36; + this.label32.Text = "Normal"; + // + // DemoForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(878, 605); + this.Controls.Add(this.DemoTabControl); + this.Controls.Add(this.TopPanel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.Name = "DemoForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "JCS ToggleSwitch Demo Form"; + this.TopPanel.ResumeLayout(false); + this.DemoTabControl.ResumeLayout(false); + this.StylesTabPage.ResumeLayout(false); + this.StylesTabPage.PerformLayout(); + this.SemiImportantPropertiesTabPage.ResumeLayout(false); + this.SemiImportantPropertiesTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.ThresholdPercentageTrackBar)).EndInit(); + this.SpecialCustomizationsTabPage.ResumeLayout(false); + this.SpecialCustomizationsTabPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.AnimatedGifPictureBox)).EndInit(); + this.PlaygroundTabPage.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel TopPanel; + private System.Windows.Forms.Label InfoLabel; + private System.Windows.Forms.TabControl DemoTabControl; + private System.Windows.Forms.TabPage StylesTabPage; + private System.Windows.Forms.TabPage SemiImportantPropertiesTabPage; + private System.Windows.Forms.Label OSXStyleLabel; + private System.Windows.Forms.Label ModernStyleLabel; + private System.Windows.Forms.Label IphoneStyleLabel; + private System.Windows.Forms.Label IOS5StyleLabel; + private System.Windows.Forms.Label FancyStyleLabel; + private System.Windows.Forms.Label CarbonStyleLabel; + private System.Windows.Forms.Label BrushedMetalStyleLabel; + private System.Windows.Forms.Label AndroidStyleLabel; + private System.Windows.Forms.Label MetroStyleLabel; + private JCS.ToggleSwitch MetroStyleToggleSwitch; + private JCS.ToggleSwitch FancyStyleToggleSwitch; + private JCS.ToggleSwitch OSXStyleToggleSwitch; + private JCS.ToggleSwitch CarbonStyleToggleSwitch; + private JCS.ToggleSwitch ModernStyleToggleSwitch; + private JCS.ToggleSwitch IphoneStyleToggleSwitch; + private JCS.ToggleSwitch BrushedMetalStyleToggleSwitch; + private JCS.ToggleSwitch AndroidStyleToggleSwitch; + private JCS.ToggleSwitch IOS5StyleToggleSwitch; + private System.Windows.Forms.Label OSXStyleOffLabel; + private System.Windows.Forms.Label OSXStyleOnLabel; + private System.Windows.Forms.Label AllowUserChangeLabel; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private JCS.ToggleSwitch AllowUserChangeToggleSwitch2; + private JCS.ToggleSwitch AllowUserChangeToggleSwitch1; + private System.Windows.Forms.CheckBox AllowUserChangeCheckBox; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label5; + private JCS.ToggleSwitch NoAnimationToggleSwitch; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label8; + private JCS.ToggleSwitch SlowAnimationToggleSwitch; + private System.Windows.Forms.Label label7; + private JCS.ToggleSwitch FastAnimationToggleSwitch; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.CheckBox GrayWhenDisabledCheckBox; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.Label label14; + private JCS.ToggleSwitch GrayWhenDisabledToggleSwitch2; + private JCS.ToggleSwitch GrayWhenDisabledToggleSwitch1; + private System.Windows.Forms.Label label11; + private JCS.ToggleSwitch ThresholdPercentageToggleSwitch; + private System.Windows.Forms.TrackBar ThresholdPercentageTrackBar; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label17; + private JCS.ToggleSwitch ToggleOnClickToggleSwitch; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.CheckBox ToggleOnButtonClickCheckBox; + private System.Windows.Forms.CheckBox ToggleOnSideClickCheckBox; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.TabPage SpecialCustomizationsTabPage; + private System.Windows.Forms.TabPage PlaygroundTabPage; + private JCS.ToggleSwitch PlaygroundToggleSwitch; + private System.Windows.Forms.PropertyGrid PlaygroundPropertyGrid; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label label21; + private JCS.ToggleSwitch CustomizedMetroToggleSwitch; + private JCS.ToggleSwitch NormalMetroToggleSwitch; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label label24; + private JCS.ToggleSwitch CustomizedIOS5ToggleSwitch; + private JCS.ToggleSwitch NormalIOS5ToggleSwitch; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label label27; + private JCS.ToggleSwitch CustomizedFancyToggleSwitch; + private JCS.ToggleSwitch NormalFancyToggleSwitch; + private System.Windows.Forms.Label label25; + private JCS.ToggleSwitch AdvancedBehaviorFancyToggleSwitch; + private System.Windows.Forms.Label label28; + private System.ComponentModel.BackgroundWorker SimulateRestartBackgroundWorker; + private System.Windows.Forms.PictureBox AnimatedGifPictureBox; + private System.Windows.Forms.Label label29; + private JCS.ToggleSwitch PlainAndSimpleStyleToggleSwitch; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label label32; + private JCS.ToggleSwitch CustomizedPlainAndSimpleToggleSwitch; + private JCS.ToggleSwitch NormalPlainAndSimpleToggleSwitch; + } +} \ No newline at end of file diff --git a/ToggleSwitchDemo/DemoForm.cs b/ToggleSwitchDemo/DemoForm.cs new file mode 100644 index 0000000..8fe4b6c --- /dev/null +++ b/ToggleSwitchDemo/DemoForm.cs @@ -0,0 +1,407 @@ +using System.Drawing; +using System.Threading; +using System.Windows.Forms; +using JCS; +using ToggleSwitchDemo.Properties; + +namespace ToggleSwitchDemo +{ + public partial class DemoForm : Form + { + public DemoForm() + { + InitializeComponent(); + SetPropertiesForStylesTabSwitches(); + SetPropertiesForPropertiesTabSwitches(); + SetPropertiesForCustomizationsTabSwitches(); + } + + public void SetPropertiesForStylesTabSwitches() + { + //Set the properties for the ToggleSwitches on the "Styles" tab + + MetroStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Metro; //Default + MetroStyleToggleSwitch.Size = new Size(75, 23); + + IOS5StyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5; + IOS5StyleToggleSwitch.Size = new Size(98, 42); + IOS5StyleToggleSwitch.OnText = "ON"; + IOS5StyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); + IOS5StyleToggleSwitch.OnForeColor = Color.White; + IOS5StyleToggleSwitch.OffText = "OFF"; + IOS5StyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); + IOS5StyleToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141); + + AndroidStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Android; + AndroidStyleToggleSwitch.Size = new Size(78, 23); + AndroidStyleToggleSwitch.OnText = "ON"; + AndroidStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 8, FontStyle.Bold); + AndroidStyleToggleSwitch.OnForeColor = Color.White; + AndroidStyleToggleSwitch.OffText = "OFF"; + AndroidStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 8, FontStyle.Bold); + AndroidStyleToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141); + + BrushedMetalStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.BrushedMetal; + BrushedMetalStyleToggleSwitch.Size = new Size(93, 30); + BrushedMetalStyleToggleSwitch.OnText = "ON"; + BrushedMetalStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + BrushedMetalStyleToggleSwitch.OnForeColor = Color.White; + BrushedMetalStyleToggleSwitch.OffText = "OFF"; + BrushedMetalStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + BrushedMetalStyleToggleSwitch.OffForeColor = Color.White; + + IphoneStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Iphone; + IphoneStyleToggleSwitch.Size = new Size(93, 30); + IphoneStyleToggleSwitch.OnText = "ON"; + IphoneStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + IphoneStyleToggleSwitch.OnForeColor = Color.White; + IphoneStyleToggleSwitch.OffText = "OFF"; + IphoneStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + IphoneStyleToggleSwitch.OffForeColor = Color.FromArgb(92, 92, 92); + + ModernStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Modern; + ModernStyleToggleSwitch.Size = new Size(85, 32); + ModernStyleToggleSwitch.OnText = "ON"; + ModernStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + ModernStyleToggleSwitch.OnForeColor = Color.White; + ModernStyleToggleSwitch.OffText = "OFF"; + ModernStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + ModernStyleToggleSwitch.OffForeColor = Color.FromArgb(153, 153, 153); + + CarbonStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon; + CarbonStyleToggleSwitch.Size = new Size(93, 30); + CarbonStyleToggleSwitch.OnText = "On"; + CarbonStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + CarbonStyleToggleSwitch.OnForeColor = Color.White; + CarbonStyleToggleSwitch.OffText = "Off"; + CarbonStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + CarbonStyleToggleSwitch.OffForeColor = Color.White; + + OSXStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.OSX; + OSXStyleToggleSwitch.Size = new Size(93, 25); + + FancyStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; + FancyStyleToggleSwitch.Size = new Size(100, 30); + FancyStyleToggleSwitch.OnText = "ON"; + FancyStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + FancyStyleToggleSwitch.OnForeColor = Color.White; + FancyStyleToggleSwitch.OffText = "OFF"; + FancyStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + FancyStyleToggleSwitch.OffForeColor = Color.White; + FancyStyleToggleSwitch.ButtonImage = Resources.handle; + + PlainAndSimpleStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.PlainAndSimpel; + PlainAndSimpleStyleToggleSwitch.Size = new Size(44, 22); + } + + public void SetPropertiesForPropertiesTabSwitches() + { + //Set the properties for the ToggleSwitches on the "(Semi)-Important Properties" tab + + //AllowUserChange example: + + AllowUserChangeToggleSwitch1.AllowUserChange = false; + AllowUserChangeToggleSwitch2.AllowUserChange = true; + + //Animation example: + + NoAnimationToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon; //Only to provide an interesting look + NoAnimationToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look + NoAnimationToggleSwitch.OnText = "On"; //Only to provide an interesting look + NoAnimationToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + NoAnimationToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look + NoAnimationToggleSwitch.OffText = "Off"; //Only to provide an interesting look + NoAnimationToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + NoAnimationToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look + NoAnimationToggleSwitch.UseAnimation = false; + + FastAnimationToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon; //Only to provide an interesting look + FastAnimationToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look + FastAnimationToggleSwitch.OnText = "On"; //Only to provide an interesting look + FastAnimationToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + FastAnimationToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look + FastAnimationToggleSwitch.OffText = "Off"; //Only to provide an interesting look + FastAnimationToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + FastAnimationToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look + FastAnimationToggleSwitch.UseAnimation = true; //Default + FastAnimationToggleSwitch.AnimationInterval = 1; //Default + FastAnimationToggleSwitch.AnimationStep = 10; //Default + + SlowAnimationToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon; //Only to provide an interesting look + SlowAnimationToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look + SlowAnimationToggleSwitch.OnText = "On"; //Only to provide an interesting look + SlowAnimationToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + SlowAnimationToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look + SlowAnimationToggleSwitch.OffText = "Off"; //Only to provide an interesting look + SlowAnimationToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + SlowAnimationToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look + SlowAnimationToggleSwitch.UseAnimation = true; //Default + SlowAnimationToggleSwitch.AnimationInterval = 10; + SlowAnimationToggleSwitch.AnimationStep = 1; + + //GrayWhenDisabled example: + + GrayWhenDisabledToggleSwitch1.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.Size = new Size(100, 30); //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.OnText = "ON"; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.OnForeColor = Color.White; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.OffText = "OFF"; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.OffForeColor = Color.White; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.ButtonImage = Resources.arrowright; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch1.GrayWhenDisabled = false; + + GrayWhenDisabledToggleSwitch2.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.Size = new Size(100, 30); //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.OnText = "ON"; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.OnForeColor = Color.White; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.OffText = "OFF"; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.OffForeColor = Color.White; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.ButtonImage = Resources.arrowright; //Only to provide an interesting look + GrayWhenDisabledToggleSwitch2.GrayWhenDisabled = true; //Default + + //ThresholdPercentage example: + + ThresholdPercentageToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5; //Only to provide an interesting look + ThresholdPercentageToggleSwitch.Size = new Size(98, 42); //Only to provide an interesting look + ThresholdPercentageToggleSwitch.OnText = "ON"; //Only to provide an interesting look + ThresholdPercentageToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); //Only to provide an interesting look + ThresholdPercentageToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look + ThresholdPercentageToggleSwitch.OffText = "OFF"; //Only to provide an interesting look + ThresholdPercentageToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); //Only to provide an interesting look + ThresholdPercentageToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141); //Only to provide an interesting look + ThresholdPercentageToggleSwitch.ThresholdPercentage = 50; //Default + + //ToggleOnButtonClick & ToggleOnSideClick example: + + ToggleOnClickToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.BrushedMetal; //Only to provide an interesting look + ToggleOnClickToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look + ToggleOnClickToggleSwitch.OnText = "ON"; //Only to provide an interesting look + ToggleOnClickToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + ToggleOnClickToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look + ToggleOnClickToggleSwitch.OffText = "OFF"; //Only to provide an interesting look + ToggleOnClickToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look + ToggleOnClickToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look + ToggleOnClickToggleSwitch.ToggleOnButtonClick = true; //Default + ToggleOnClickToggleSwitch.ToggleOnSideClick = true; //Default + } + + public void SetPropertiesForCustomizationsTabSwitches() + { + //Set the properties for the ToggleSwitches on the "Special Customizations" tab + + //Color customization example, Metro Style ToggleSwitch: + + NormalMetroToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Metro; //Default + NormalMetroToggleSwitch.Size = new Size(75, 23); + + ToggleSwitchMetroRenderer customizedMetroRenderer = new ToggleSwitchMetroRenderer(); + customizedMetroRenderer.LeftSideColor = Color.Red; + customizedMetroRenderer.LeftSideColorHovered = Color.FromArgb(210, 0, 0); + customizedMetroRenderer.LeftSideColorPressed = Color.FromArgb(190, 0, 0); + customizedMetroRenderer.RightSideColor = Color.Yellow; + customizedMetroRenderer.RightSideColorHovered = Color.FromArgb(245, 245, 0); + customizedMetroRenderer.RightSideColorPressed = Color.FromArgb(235, 235, 0); + + CustomizedMetroToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Metro; //Default + CustomizedMetroToggleSwitch.Size = new Size(75, 23); + CustomizedMetroToggleSwitch.SetRenderer(customizedMetroRenderer); + + //Color customization example, IOS5 Style ToggleSwitch: + + NormalIOS5ToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5; + NormalIOS5ToggleSwitch.Size = new Size(98, 42); + NormalIOS5ToggleSwitch.OnText = "ON"; + NormalIOS5ToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); + NormalIOS5ToggleSwitch.OnForeColor = Color.White; + NormalIOS5ToggleSwitch.OffText = "OFF"; + NormalIOS5ToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); + NormalIOS5ToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141); + + //Maybe not the prettiest color scheme in the world - It's just for demonstration :-) + ToggleSwitchIOS5Renderer customizedIos5Renderer = new ToggleSwitchIOS5Renderer(); + customizedIos5Renderer.LeftSideUpperColor1 = Color.FromArgb(128, 0, 64); + customizedIos5Renderer.LeftSideUpperColor2 = Color.FromArgb(180, 0, 90); + customizedIos5Renderer.LeftSideLowerColor1 = Color.FromArgb(250, 0, 125); + customizedIos5Renderer.LeftSideLowerColor2 = Color.FromArgb(255, 120, 190); + customizedIos5Renderer.RightSideUpperColor1 = Color.FromArgb(0, 64, 128); + customizedIos5Renderer.RightSideUpperColor2 = Color.FromArgb(0, 90, 180); + customizedIos5Renderer.RightSideLowerColor1 = Color.FromArgb(0, 125, 250); + customizedIos5Renderer.RightSideLowerColor2 = Color.FromArgb(120, 190, 255); + customizedIos5Renderer.ButtonNormalOuterBorderColor = Color.Green; + customizedIos5Renderer.ButtonNormalInnerBorderColor = Color.Green; + customizedIos5Renderer.ButtonNormalSurfaceColor1 = Color.Red; + customizedIos5Renderer.ButtonNormalSurfaceColor2 = Color.Red; + customizedIos5Renderer.ButtonHoverOuterBorderColor = Color.Green; + customizedIos5Renderer.ButtonHoverInnerBorderColor = Color.Green; + customizedIos5Renderer.ButtonHoverSurfaceColor1 = Color.Red; + customizedIos5Renderer.ButtonHoverSurfaceColor2 = Color.Red; + customizedIos5Renderer.ButtonPressedOuterBorderColor = Color.Green; + customizedIos5Renderer.ButtonPressedInnerBorderColor = Color.Green; + customizedIos5Renderer.ButtonPressedSurfaceColor1 = Color.Red; + customizedIos5Renderer.ButtonPressedSurfaceColor2 = Color.Red; + + CustomizedIOS5ToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5; + CustomizedIOS5ToggleSwitch.Size = new Size(98, 42); + CustomizedIOS5ToggleSwitch.OnText = "ON"; + CustomizedIOS5ToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); + CustomizedIOS5ToggleSwitch.OnForeColor = Color.White; + CustomizedIOS5ToggleSwitch.OffText = "OFF"; + CustomizedIOS5ToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); + CustomizedIOS5ToggleSwitch.OffForeColor = Color.White; //OBS: Need to change this for text visibility + CustomizedIOS5ToggleSwitch.SetRenderer(customizedIos5Renderer); + + //Color customization example using RendererChanged event + + NormalPlainAndSimpleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.PlainAndSimpel; + NormalPlainAndSimpleToggleSwitch.Size = new Size(44, 22); + + CustomizedPlainAndSimpleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.PlainAndSimpel; + CustomizedPlainAndSimpleToggleSwitch.Size = new Size(44, 22); + CustomizedPlainAndSimpleToggleSwitch.BeforeRendering += CustomizedPlainAndSimpleToggleSwitch_BeforeRendering; + + //Image customization example, Fancy Style ToggleSwitch: + + NormalFancyToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; + NormalFancyToggleSwitch.Size = new Size(100, 30); + NormalFancyToggleSwitch.OnText = "ON"; + NormalFancyToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + NormalFancyToggleSwitch.OnForeColor = Color.White; + NormalFancyToggleSwitch.OffText = "OFF"; + NormalFancyToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + NormalFancyToggleSwitch.OffForeColor = Color.White; + + CustomizedFancyToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; + CustomizedFancyToggleSwitch.Size = new Size(100, 30); + CustomizedFancyToggleSwitch.OffButtonImage = Resources.arrowright; + CustomizedFancyToggleSwitch.OffSideImage = Resources.cross; + CustomizedFancyToggleSwitch.OnButtonImage = Resources.arrowleft; + CustomizedFancyToggleSwitch.OnSideImage = Resources.check; + + //Advanced behavior example, Fancy Style ToggleSwitch: + + Color tempColor; + + ToggleSwitchFancyRenderer customizedFancyRenderer = new ToggleSwitchFancyRenderer(); + tempColor = customizedFancyRenderer.LeftSideBackColor1; + customizedFancyRenderer.LeftSideBackColor1 = customizedFancyRenderer.RightSideBackColor1; + customizedFancyRenderer.RightSideBackColor1 = tempColor; + tempColor = customizedFancyRenderer.LeftSideBackColor2; + customizedFancyRenderer.LeftSideBackColor2 = customizedFancyRenderer.RightSideBackColor2; + customizedFancyRenderer.RightSideBackColor2 = tempColor; + + AdvancedBehaviorFancyToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; + AdvancedBehaviorFancyToggleSwitch.Size = new Size(150, 30); + AdvancedBehaviorFancyToggleSwitch.OnText = "Restart"; + AdvancedBehaviorFancyToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + AdvancedBehaviorFancyToggleSwitch.OnForeColor = Color.White; + AdvancedBehaviorFancyToggleSwitch.OffText = "Online"; + AdvancedBehaviorFancyToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); + AdvancedBehaviorFancyToggleSwitch.OffForeColor = Color.White; + AdvancedBehaviorFancyToggleSwitch.OffButtonImage = Resources.arrowright; + AdvancedBehaviorFancyToggleSwitch.UseAnimation = false; + AdvancedBehaviorFancyToggleSwitch.SetRenderer(customizedFancyRenderer); + AdvancedBehaviorFancyToggleSwitch.CheckedChanged += AdvancedBehaviorFancyToggleSwitch_CheckedChanged; + + AnimatedGifPictureBox.Parent = AdvancedBehaviorFancyToggleSwitch; //Necessary to get the ToggleSwitch button to show through the picture box' transparent background + } + + private void CustomizedPlainAndSimpleToggleSwitch_BeforeRendering(object sender, ToggleSwitch.BeforeRenderingEventArgs e) + { + if (e.Renderer is ToggleSwitchPlainAndSimpleRenderer) + { + ToggleSwitchPlainAndSimpleRenderer renderer = e.Renderer as ToggleSwitchPlainAndSimpleRenderer; + + renderer.BorderColorChecked = Color.Green; + renderer.BorderColorUnchecked = Color.Red; + + //Observe: in the BeforeRendering event, the Checked property will not yet have changed to the final state + if (!CustomizedPlainAndSimpleToggleSwitch.Checked) + { + renderer.ButtonColor = Color.DarkGray; + renderer.InnerBackgroundColor = Color.LightGray; + } + else + { + renderer.ButtonColor = Color.DarkBlue; + renderer.InnerBackgroundColor = Color.LightBlue; + } + } + } + + private void AllowUserChangeCheckBox_CheckedChanged(object sender, System.EventArgs e) + { + AllowUserChangeToggleSwitch1.Checked = AllowUserChangeCheckBox.Checked; + AllowUserChangeToggleSwitch2.Checked = AllowUserChangeCheckBox.Checked; + } + + private void GrayWhenDisabledCheckBox_CheckedChanged(object sender, System.EventArgs e) + { + GrayWhenDisabledToggleSwitch1.Enabled = GrayWhenDisabledCheckBox.Checked; + GrayWhenDisabledToggleSwitch2.Enabled = GrayWhenDisabledCheckBox.Checked; + } + + private void ThresholdPercentageTrackBar_Scroll(object sender, System.EventArgs e) + { + label15.Text = string.Format("Value = {0} (Default = 50)", ThresholdPercentageTrackBar.Value); + ThresholdPercentageToggleSwitch.ThresholdPercentage = ThresholdPercentageTrackBar.Value; + } + + private void ToggleOnButtonClickCheckBox_CheckedChanged(object sender, System.EventArgs e) + { + ToggleOnClickToggleSwitch.ToggleOnButtonClick = ToggleOnButtonClickCheckBox.Checked; + } + + private void ToggleOnSideClickCheckBox_CheckedChanged(object sender, System.EventArgs e) + { + ToggleOnClickToggleSwitch.ToggleOnSideClick = ToggleOnSideClickCheckBox.Checked; + } + + private void AdvancedBehaviorFancyToggleSwitch_CheckedChanged(object sender, System.EventArgs e) + { + if (AdvancedBehaviorFancyToggleSwitch.Checked) + { + AdvancedBehaviorFancyToggleSwitch.AllowUserChange = false; + AdvancedBehaviorFancyToggleSwitch.OnText = "Restarting..."; + + PositionAniGifPictureBox(); + AnimatedGifPictureBox.Visible = true; + + if (!SimulateRestartBackgroundWorker.IsBusy) + SimulateRestartBackgroundWorker.RunWorkerAsync(); + } + else + { + AdvancedBehaviorFancyToggleSwitch.AllowUserChange = true; + AdvancedBehaviorFancyToggleSwitch.OnText = "Restart"; + } + } + + private void PositionAniGifPictureBox() + { + //Position anigif picturebox + + Rectangle buttonRectangle = AdvancedBehaviorFancyToggleSwitch.ButtonRectangle; + + AnimatedGifPictureBox.Height = buttonRectangle.Height - 2; + AnimatedGifPictureBox.Width = AnimatedGifPictureBox.Height; + AnimatedGifPictureBox.Left = buttonRectangle.X + ((buttonRectangle.Width - AnimatedGifPictureBox.Width) / 2); + AnimatedGifPictureBox.Top = buttonRectangle.Y + ((buttonRectangle.Height - AnimatedGifPictureBox.Height) / 2); + } + + private void SimulateRestartBackgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) + { + //Simulate restart delay + Thread.Sleep(1500); + } + + private void SimulateRestartBackgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) + { + AnimatedGifPictureBox.Visible = false; + AdvancedBehaviorFancyToggleSwitch.Checked = false; + } + } +} diff --git a/ToggleSwitchDemo/DemoForm.resx b/ToggleSwitchDemo/DemoForm.resx new file mode 100644 index 0000000..336682d --- /dev/null +++ b/ToggleSwitchDemo/DemoForm.resx @@ -0,0 +1,1880 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + PLEASE NOTE! + +ALL ToggleSwitch controls on the demo form are default control instances. All other properties are set in code behind, and all event handlers have been added in code behind. + +This is done so that you don't have to go through and test all properties on a specific control to see exactly what has been done to make it look and behave as it does. You can get all the necessary information directly from the code. + + + + + R0lGODlhKwArAMQTAKmqrI+Pkefn6NfY2fr6+mxsbMfHyczNz5mZm7a3ueLi49zd3u3t7tLS1Hh5esDA + wvPz9KGipISEhf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBF + Mi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6 + cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9 + IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAg + ICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1z + eW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wUmlnaHRzPSJo + dHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvcmlnaHRzLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5h + ZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8x + LjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu + MC8iIHhtcFJpZ2h0czpNYXJrZWQ9IkZhbHNlIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InV1aWQ6 + M0I4QjcyREFCRDYxREYxMTlCRTZEMTI4QkIxRDIzN0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6 + Nzg1MDlCNzBCMTU1MTFFMEJFNjZFRkYzMzg1MEFDRkIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6 + Nzg1MDlCNkZCMTU1MTFFMEJFNjZFRkYzMzg1MEFDRkIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhv + dG9zaG9wIENTNSBNYWNpbnRvc2giPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0i + eG1wLmlpZDpGODdGMTE3NDA3MjA2ODExOTQ1N0NBNTQ4MkQyMTVGNCIgc3RSZWY6ZG9jdW1lbnRJRD0i + dXVpZDozQjhCNzJEQUJENjFERjExOUJFNkQxMjhCQjFEMjM3RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4g + PC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw + 7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0 + s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4 + d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08 + Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEA + ACH5BAkAABMALAAAAAArACsAAAX/4CSOZGmeaKqmzOq+ggEEUm1Hj/DuxBEFQKCt5pA4Ag/CLuULOmlD + o6P4WJYgAAQisA1KoLbidBpQWCeKiFbLdQLeYOnY0VguEOr1NjGAlHoAcmMFBy9pankID34qDAlzBQ4F + dY0AEZdqCTo7AgiDU2YpCZiXCUpWEJ5TBQUSKQOWlhEJZySekaxVJgRvb7OntRMQAZKsDowksL0ALcEj + AristCUJvgAGziURxZElDMsAyNkTDKzmoSINy9jjJBHmBdMiD7EA6O0TBvCuI+DA+OXgkQCHrwS3AgN7 + 6SooIoBAEd8UMhzh0NymCdXeLGRYkdXAagnkMWxgLgCJkCD/uxVUAGBjPpQJ7k00MQBmoZkoIMBMIA4n + CQMwKfksseCBUaM9hxI4avSAyjMQIDwtoYDpA6G1GAgQwGAqiQYPDIQ1MMBrCgJbtzJIesWA27cN2KJA + m5bBWhcM3h4wcODAArMiCDBQoEDtWsAjGPRdvFhB1z8QBBAubBgxCQYN+mZuwJnzgMkLQk+u+xjVgM6d + B6hWHXrBaLVSnTE43WA169avuVpeIXjB6tauXx+eKFgAbsJcYw+FaHf58hAAIfkECQAAEwAsAAAAACsA + KwAABf/gJI5kaZ5oqqbM6r7MkURIjQQIYAhvTzSACI1WwwWOuAehlxoAgkKiDYmUBAzMEiTxjEZtt9vR + KpEgeFnBcw2NJt7iark8YC7Y64hhAdEOEgFkcxIHLwp4TwZ9KluBZQ4SDnUqDIgJLT0CCHMOkJgoXGxK + WRMEEYMOASl3oqQkp52dDycEoU8JS64iEJuxDrkkTrafuhMCvg4JJg8AoYXFJAC+ElpvXAmL0CIMvgVo + In/WWNqvnQXJJDLWCuTpsQWqIw/WuO0jBA7n5yTzb7P2I8wVKMDvwbxnACcg0Edwm0GDCAEuzFfg08MH + Ee0tHNhQhIGH4xJSHEjCgMmPwNq6cePYccKAkwaIkTPAMp4IBQdOLki4caCyERAO5MyZEhoDlgV2kmgg + VKhSchFYOjAhoKnQbMWOsvxJ4gdTpgOKkhqAFOsIBg3SpmVndOuqAWobKBDL5MHACCoIDNjLdwHdhBMg + 8B0s4C9ACAsGLEi8eIEACEUJQIDAwPALxI0zK1igQIBnAZ09V9ZGQMDizQpSq+4cWgCD0eQgrFYN+rPo + 15aZSPbcWrTr17ATSmbg+vdryLnJAQfM/EQIACH5BAkAABMALAAAAAArACsAAAX/4CSOZGmeaKqmzOq+ + TPMANB0BydG+L9EkteAtQkQADgReagAMOolQhLShLDFmTiEAGpF6AZDqRABsZh/obdQbQCyUioTc+Vgk + SYRFwotoBwJULmRyc0dhKhAPbH8BbyoED4Q4DzswAIyMhygGkYQGd0oEl4wSESkKaJ5iJKMSARIGJwSc + qZ+rIwQRfxKuoCOoaJGat2OvvBIPJge0DwPEJQnGriUQBsy+zwzHvAIkAtbWgc+sxw7JIwPL1t3jJA3l + piMH89bY4wQSDvkSJPPLB+1M8HJA0J0/ZwFJRMhXUESMBvMQJhSBgCDBSg0yNpA4MYJFByQGaBQ3kWFD + EQNExGa094zAR5C/UmasFPCAxQIISDBIKZJdQo8FHBRIgGcBzwEsVzEgGLSATxEKFhgd8PQZgKYF+FmR + KhVpOwVChQ41QSAqVwVJX0AIUKBt0GEjICgwu6BqFbZuC5w7IWDugqgC0qKAgCBv1kd9584NDEeC4QI0 + T0AQkFgxA8Eirj4mmYIA5b6VGUBImuCx3lAMPqumHFkE3rwAqxBgkHo1ZXsR8jqwy2M2bdoCaMOdsLQt + 0Xu+f1+euIIAAQijmSv5Lb36iRAAIfkECQAAEwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM6r7QYiQADdxP + 074vsTyJIM12KyYGBF5K8AAKg8VodKAsQQ5NJ7Qm7SZ2SobBkNUGs9FIGqAIj8nagyJJ8hnSkfzixTi8 + swMQKxAGanl5CG0qEA1+Yw8HgjwMCYcRCBGSKAMHjgYNdEoElZeXACyNnQZUVSSVCLAIDScEA6kHoK11 + ALGwoSMMDcKdmroiDL0BsyULto2KxiQPCAHUESW1zrnRJBDU1AECJAwDztDcIwkB6wEGJALltmDoIgPs + AacjC83lv/QQ9wKQ2BePnglwEgSK8EHwnMEJABJKkABMwb4FDg1GDDBxBwEFFjE+JBFxIsURIC+2jhzB + 0eQ7kBb9oSNgcuI4mAuK0RtQ89oICAJgihtZ0oGDB3UEBAUp0xgDCQ6gSnDIQCnIedwiGnWgsFvVpU2r + CNhq1B22r0oFhIWBgKyEpgTQKuXWlixSFBAYfFWAtUfdrV1p6UWrc4WAAFsLGM14drCAwigYAFBM2UGB + ZSviDl57rBDlzwUOiIIAoWkDdpYLqAbtADM9Batjyy4goW/W2bPvrjSAW/VRyAYDyMbHeOXXlchThAAA + IfkECQAAEwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM6r6QMBjGY9vHAL08ITQHWu2WKBYfAwKPNTg4hbeH + 0QhILJYlwqIBfA5t0wSgOn60sJDBgOsVOg9S6niuWKbX7OCCoSQRFAZkc2NXLhALalxAC30pEAeDdCt/ + iHg6SwxikTspAguVDQqNPQ+RCY6flXVYJKWDAyc+qQOirH6ac6MiEAoKn0m2JQyDEQ0mAr2fAsEmgQAR + EQBZyL6MzCUQ0Npnu9QLy9clBtoRByQM3pzhIwvaCKcj6L216yME0AjQ5wLU9SURCAIisIcOGTh/IhII + HCiCQUEFBxEqFMjNIb+I/gAIDHCuIMZ6AQMEYNjQo65wEBCtiBxJAoJFAerqDVgZQBrBgtzqJaBpwI9L + dDFR0gyAkYBDPhIDSFBK0g+Bk8wESFi6tCdCFARUTl0K9eqECFunWvXqB2zYpi4YDMi5QgCCsFM/pjBQ + oG4EtiaGSXCwl68DWEvqCi6AwABbAgciOFjMeK85LIMjOxiJgLHlxoCxRIg82EEBxp8vB8DLAwDn054b + P1gHwfTpz7D5JggaTgGAAJwnJ1hFNp7D3sBHhAAAIfkECQAAEwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM + 6r4EoyxDYx/NIEBvH8+DoK1xKB4MhoOC0EtBZjThzYhEPgyKZokggEZr02P1QX4ceFquAhoEN6JiQ3ku + aKq9QQGDSeIOygmBgXUuXF1sAnwpBA1kgoMrMYczS00QBo+BLU4ChwuJWhMEmIEACQ+LnYeEoSIGpgCx + CycxDJ0KoK0iBA+wpoojkofAugyxxw0mELZdm7okB8emWwzMlc8kENIAzqLVnd3YIr3I2d874iUL0qgj + y8zE4gSxEbF93+HpE9tbEPH65OyJyKePREBuBV0kkJbQBYAIECM0VEEgYr2JKRZYTIARRQKLB0wwiBCA + Y0EICCKrpESQz0GBlwAKPkBAE0FMEy9zZhHHoCbNZDhzFgiARtc8nxH+JRA6FBsABAECQAV6wqVQBEV9 + AIgKNcBNFAqYDt35QgDJqFyznjDA1CVCFQwSSECLlqyKB2IdOIhwZksDABLmCo5K1cWBtgX0OpBAM0Lg + x5CjztLCQIJQxZglLIb8OALBFw+sJk6cWW9kA+kgyH2JufTcB/+eCUgQwGVmBA9YdZxQ7fPugiEAACH5 + BAkAABMALAAAAAArACsAAAX/4CSOZGmeaKqiBEOsMExAjKDc9yK4cT/XNtxiuBgUF7weiwHEKYjFgXTQ + GDCUpV8zR5xKG2DwAIKdtJiC4HPh/IYbB3jj6mNuFQLIi9RSwA+AgXQrZ0A2SSkECoAGB40Ggyk0hgJ7 + MRANBpqbZCqTaYg+A5uaB4RAkWUND6ysAoQQnWUjBAetrJazShC3Dwu6sw0JwwkPwGUQxMOyxzEHyr/N + PQrKBiUPCQrSJgQJAMQkCAXjptskwwDfJOPjAeYkD9/pIwzsBe7vIvHpALL2+Pn2zRthz0E+EfwGirBX + IFUzAgkBkJBgz9q7BQmNjQBgD0E+AwkbkFBQ0KEuCBFTqDmwJ3EbSH4JTCQoqK0Zg4gDuLFbGSBXmW4R + EvrUt9OBR2AJIgQNmhNFgKIIhhJKqlRpzBQKVjrY6iDAqx43qyrtt2JA0a0ATJLghaAtgqo1VxjgylWC + BAANfEIYkCCA27/RYjSgW9dugKAAAij269dthLjTAtC1S9nwYsV/yep6IGFyZQmXFyMQ+fCB5M6VA4Be + HOGAVGAKHkT4DBqAga8HSdjJzbtECAAh+QQJAAATACwAAAAAKwArAAAF/+AkjmRpnmiqpszqvgQBMTQj + 1BDx7iI01zeBcCjI8VQEoG2oECieUMgRlVwyodiFYiHQTUlJomK53S7OaIX0O5IxjGCIAE1frNkwwWDP + H9zxLgQLfXteKBEFBQaABAoNDQOQCykJiYktgI6Pj5glEJaJA4ATBJEHjwOGI5WgnXgQB7GnAiagBRGj + IwuypyUKtrS5pAYHxAd/AKAIwroGzgbBIgGgi8wTAs8GoiO2rrkEBg/PJKAO1iPh4tUiyuciBw/xDyMM + 7e7w8pifBQ4Fy/cPEsQjl8iBOXcBEwgk0Y+fA1W5IChUOG9EAIMG1wlTMDHBARKV+jnAZc1Ax0kjFLmI + NOjtVQIALxP8mSABowMAzA4A2LmwRAKbDqLhYbATJoBtYIAigHiEwMuiCZhOeIBRggSSbB4U3YnyxEUH + Na9KRaJ1awIVDMJalYBA6AoGT7fONDHA4FqrMldAMLC1qIIXB9RKCEA4QYOZEBY8iNCXK48Bd60SJowA + ZoIICCJoZrz17xEBCNZOpoygdObNnCPkZWOA8ODRpkujZowUD4EHCGAHiL0ZQIOxbLABKL1btseW7mq4 + W34iBAAh+QQJAAATACwAAAAAKwArAAAF/+AkjmRpnmiqpszqvigBQQQB3zGj67SNm4lCQdIqQXZIhu83 + UUiEQoSJIKhWGYLdEnaAQgMnrHWc3a4MXiggdlQoBG+rGdVNF9YrAsPthgvmJQx2Ego3VHx9gCNPXgEQ + P1QLiAIpD2lgTCICC5xujyYQDo2KLwQKnJ1zQVAOhZkjBAOoC0UkjAUOeK8jAgOykiUKQg7EtbsTsb6y + W0HEBRHHwcoDxgiixAfRJAwNyq4i18SkTAQN5r4kxMQS2iXm5yS4xFLtIwsH7yMM6g7Q9SIDDuBrUIsf + vX8BBTZIt47dvwkHDAjMtsiBBIvjIBnYiI+ENQkgKbYTsFHiABIPLsCC1KVtwIOSlHhZBCnhUzQCD15u + tCkiAE0JCdq5zCnRREqaAWLugpAgZ85vIyD4nBohowoCBh40fQnIAMgAYFn+MJCg7NMUCKaGtVoCa1mz + BlQIAEs3AABjKxhofduU54kBdQMgQPDAL6gDABIDeKtURQO6gyM/GGCGwIIHihe/hbpiQVrBkRFEiLA4 + Z+bTixu/gAAg9OjXqFEXfnXANezYiRMsuIlYNGzSpxM0YAuDwYEEAEZnfkDwoYkdzqOXCAEAIfkECQAA + EwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM6r4KEBQ0jbw4CSVO7dOPHO7xKxYSwpVCYiwOkqlGr1kISAKH + EwECIeQMtJ64EDFAVgSGmuF1NQrjHqD1ggjWbKVjzw8IhHYCd2ptKAFxCIU5DIKDZygPfHs3UCIMCo15 + JhASkgGKSQQCmIKaJAaSDn+VIwQKpAKgE4d7EgCsJZekdCMCtZ2PuCKur4KKkZ22wiWjxcETERLSEk/L + IxALrwq8E8nSsrgEC9mYJNNX1iXj5ObTEekkCuOvIwzTAbfwIgoD87zSVvLp4zev0JUrlPQNWDiORICH + D58tI9CA4QISMiBWS8eg4sJVIh5ADIAEnoIGHrm5CYCIIIBEVgQOoFwIKkKAlgiCWFMgE+XFEgdwIkDA + rRKEAz0bFJ1AYKhTAOBwUEQqcwC4Bk4RRChZaYABA0iVpgDgNMLWqCkofgV7YOMJCGbjbl2a4uiDtTJf + llCgVS4AMysgNHhA+C5YuiYWxAXAmLGBBaBcHUiQoPBaxCdimG3MGUBhyqAfVDaMGQWDBJ1TMwZNufAB + vS8GqOaMmjVhBRMHoFbNurICtFA6PqANIMFj2PDW6FueIgQAIfkECQAAEwAsAAAAACsAKwAABf/gJI5k + aZ5oqqbM6r5KEjhFbQeJ8u5QIhU0m9DmABB2KYNjSVsCh8MEssSYMZnPILQWmYoGkqvYgShrod7DeBk5 + HEmMAwKNHDgk+LAE0FIxIjYGSAJ5d2QCSAwNiEgIeXgRb15IBo8SXZNTBAGPCJKZLw8SnJyMoCQEqSeO + pFKnqAyxECUCAba2fa8iEAKxDJ8Gtzi6cAK9vyQAwg3EI7zHsyMIwtHNBArGsSS20wjNJMbHJN0Irt8T + DNi9IwxlZQDnIgLq2iLu5fET89nj7pjnCgIaIxEBQcFI5wgsEJhrQgKDESIMOAchILaGByJGFPRNwEJs + 1dBpjBjylMKPAj6yTQAQgSUAjro8LlhoakQDlwD46CIwYGbAkhMI5ByaQKWmBT0/Gp0wYGjOB6cUDEi6 + AOiIBE4BPFiq4lqDqTNrmoCQFUCChisgDGjwNSnXEQpythx6wCqqBQcOsAVrt8SCsjkPKChJgMECA3n1 + tu1rQkBWrAkiJ0hs4IGBy4kXe2GANSdkyQ8SPBh9GbHiBW9XLIhsVnLk0aRN60U7iafr17BL601J8TBs + 2LsZE/OVr3iJEAAh+QQFAAATACwAAAAAKwArAAAF/+AkjmRpnmiqpszqvsKDSE5tI4ny7sQT0DSbozAc + ShKQXcrwkzgdQWGtQHU8lCVBxMnlQoXEMFXSwi5+za4TEZnZxNTCQdkIoCVNQCNJIhwiRXFUVy5ndnZ4 + SCsMAEOCcisQCId2EQJKCgGPBWUoAJQBAARYE5KPEil1CJMIAKQkmoIJJwSrtqKvIwQSjycHtquXuSMK + vSYAwITDIwBxDiYMbNJ8yyMJEgidI3/SytUuCRHiEQPfOwDjEaPmLumu7O0A8t7wJ4zyEfT1Ip3o8/si + CEBYxwzfu3oMBDBgQHCCvIcNvxEQoJABtQkP/AFYUA8CxYUXGzwEoG9ZwooN77Y9vLiMgIKPDEskGDnH + HIOXFU2IHKktl0ucMUsQmPnwQUQsExW8XHh0wgB5MxMYWCZA6UeWJB5EBSC1qYqJC6wqVMEggdmzBrCm + cLkg7FKvIwScPfugAdyAAga0VfryLrG5Wh/UFRCRQMIBiPe+VIsiRmDBgg0YOIB4QIPLlRUTJkXAAOQH + kkMfGH25Qeawm3Mp8AxaNGnMicMyVuLygOTRr00nVhCUnUfLB0oj5u3328KeAJOHAAA7 + + + + 17, 17 + + + + AAABAA0AMDAQAAEABABoBgAA1gAAACAgEAABAAQA6AIAAD4HAAAYGBAAAQAEAOgBAAAmCgAAEBAQAAEA + BAAoAQAADgwAADAwAAABAAgAqA4AADYNAAAgIAAAAQAIAKgIAADeGwAAGBgAAAEACADIBgAAhiQAABAQ + AAABAAgAaAUAAE4rAACAgAAAAQAgACgIAQC2MAAAMDAAAAEAIACoJQAA3jgBACAgAAABACAAqBAAAIZe + AQAYGAAAAQAgAIgJAAAubwEAEBAAAAEAIABoBAAAtngBACgAAAAwAAAAYAAAAAEABAAAAAAAAAAAAAAA + AAAAAAAAEAAAAAAAAAD///8AAACAAACAAAAAgIAAgAAAAIAAgA2AgAANwMDAAICAgAAAAP8AAP8AAAD/ + /wD/AAAA/wD/Df//AA0AAAAA//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + GTERER//////////////////////////EZk5ERkRH///////////////////////kZO5m5ORERn///// + ////////////////GTmbuTm5kZEZH//////////////////xE5m5m5Obm5kRGf/////////////////x + GZubmbk5ubmZgRkf///////////////5GTm5m5ubk5ubmZMRH/////////////8RmZubmbk5ObkzOTmR + H/////////////8RmTk5k5mTm5m5m5mJER////////////EZOZmRmTuZubmbk7mYmRH///////////E5 + kZk5m5mbmTk5OZm5OJEf/////////xGRmTmbmbk5uZOTm5uTmYkR////////8ZGZOZm5k5OTmbm5uTk5 + m5iRH///////ERmZm5OTOTk5OZOZOTmbmbl5Ef//////EZk5OTk5k5ObmTOTk5M5k5OYkf/////xGRmT + mZOTmTmZOZk5OTmbmTk4kx////8RGZk5OTk5k5OTk5OTk5k5k5OZeRH///8ZkTmZk5mTmTk5mTmZOTmT + mTk5OJH///GRGZk5OZk5OZmZOZOTmZk5k5OZiYEf/xkZkZmZmTmZk5OZk5mZOZOYmZk5N5Wf/xEZGTmT + k5mTmRmTmTk5k5mXt5OZmYMf/xkZmZOZGZOZOZk5GZmTmTmId3mTmXkf8RGRk5kZmTmRmZOZmZOZGZmH + eHeJk5gf8ZGZGRmTmZGZk5kZk5kZk5h4d4d5mXOf8RkRmZGZGRmTmRmTmRmTmZeHh3d3k5gf8RmRkZkZ + mZkZGZGZGZGZGYd3d3d5GYif8RkZGRmRkZGRmRmRkZkZmZh3d3d5mTgf8ZEZmZGZGRmZGZGZmRmZd5mA + d3eRmXif8RmZGRmRmZGRmRmRkZiHd4mZd3eZmIMf8ZEZkZGZGZkZkZGZGRd3d3iZl4kZOHkf8RGZGRmR + kZGZGZEZmZh3d3d4GRmZmHEf8RkZmZGZmRmRmRkYiZN3cHB4mZGVe1n//xkZGRmRkZkZkZmZN5mZiYmR + mRmbeBH//xGRkZkZGRmRmRmJGXeZkZGZGZuHiR///xEZmZGZmZGZGZiBERl3mZmZmYd3Ef////8RGRkZ + GRkZmHiR/xGYd3uIe3eRH/////8RkZmRkZmZl4Ef//ERmDeHeIkR///////xGRkZmRmHeRH////xEZEZ + EREf////////ERGRkZmJER//////8RERER////////////ERERERH/////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////RBX///////////////////////////// + ////8Af////////wAH/////w//AAD/////D/8AAB////8P/gAAD////w/+AAAB///+D/4AAAB///4P/A + AAAH///g/8AAAAH//8D/gAAAAP//wP+AAAAAf/+A/wAAAAA//4D+AAAAAB//APwAAAAAD/4A/AAAAAAP + /AD4AAAAAAf8APAAAAAAA/gA8AAAAAAD8ADgAAAAAAHwAMAAAAAAAeAAwAAAAAABwADAAAAAAAHAAIAA + AAAAAcAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAAB + gACAAAAAAAGAAIAAAAAAA4AAwAAAAAADgADAAAAAAAfAAMAAAAAAD8AA8AAAwAAfwADwAAHgAD/wAPgA + A/gAf/AA/AAH/gH/+AD/gB/////8AP////////+A////////////////////////////////KAAAACAA + AABAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAP////8AAIAAAIAAAACAgACAAACAgACAgICA + AIDAwMDAgICAgAAA/wAA/wAAAP//AP8AAP//AP////8A/wAAAAD///////////////////////////// + ////////////////////////////////////////GRERH////////////////5Obk5ERH/////////// + //8Zmbm5k5Gf///////////xE5uTM7mTkR//////////8Zm5uTmbOTlRH/////////k5OZmZuZObmRH/ + //////8RmZObm5uZubmTH//////xGZOZOTk5m5OZiZH/////8ZmZuTk5OTk5uTOJH////xGTk5OTk5OT + k5OZORH///EZmTk5mTk5OTk5OTiR//8RmTmZk5OZk5OZk5OZiR//GRmTk5mZOZmZOTmZOTif8RGTmTmZ + OZk5k5mXeJmJH/GZGRmZOZOZk5k5l3eTmJ/xEZmZkZGZk5kZmYeHCZg/8ZGRkZkZGZkZkZgHd3mYn/kZ + GRkZmZGRmZmJl3d5mB/xkZmZkZGZGRmHeJh3kZef8RkZGRkZGRmZh3d5kZm4H/GZkZGRmZGYmYh3eJmX + eR/xERmZmRkZkReZmRmZh5H//xmRkZGZmXkRh7mZN3kf///xGRkZmYcR8RGYh3iR/////xGZmYiRH//x + ERERH//////xERERH/////////////////////////////////////////////////////////////// + //////////////////////////////8B////AB///wAH//4AAf/+AAB//gAAP/wAAB/4AAAP+AAAB/AA + AAPgAAADwAAAAcAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAPAAAAH4ACAD/AB + 4B/4B///////////////////KAAAABgAAAAwAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAP// + //8AAIAAAIAAAACAgACAAACAgACAgICAAIDAwMDAgICAgAAA/wAA/wAAAP//AP8AAP//AP////8A/wAA + AAD///////////////////////////////////EZkREf//////////GTm5GZGf////////EZubmzkRH/ + //////Gbk5uZuZUf/////xk5mTmbObkZH///8RmRm5uZm5OTkf//8Zmbk5k5uZm5gR//GRk5OTmTk5OT + mR/xGZOZk5k5OTk5mDHxkZk5mTmZk5OZOZMRmTmTk5k5OZl4mXkZGZGZGZGZkYh3iZgRmRkZmRmRmZd3 + eYkZGZmRkZkZmJcHeZiRmRkZGZGZd3mXmYkZGZGZkZk5AHeRm3ERkZkZGZiYmZk5lxHxmRmZmXEZg5eQ + iR/xEZkZiJHxGYmJEf//8RGRER//8RER//////////////////////////////////////8A//////gH + ///4AP/4+AA/+PgAH/jwAAf44AAD8OAAAeDAAAHggAAAwIAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAgAABAIAIA4DgHg+A////4P////8oAAAAEAAAACAAAAABAAQAAAAAAAAAAAAAAAAAAAAAABAA + AAAAAAAA/////wAAgAAAgAAAAICAAIAAAICAAICAgIAAgMDAwMCAgICAAAD/AAD/AAAA//8A/wAA//8A + /////wD/AAAAAP////////////GTkZH/////+Tm5ORH////xk5Obkx///xOZObm5kf//GZuTk5M5P/GZ + OZk5k5iRGRmTk5k5k5iRmTmZk5l5ORkZkZkZl3eYkZkZGZmJB5kZkZmRlwiTmBkZkZOXmJlxEZGZiRmJ + eR/xGRkR8RER//////////////8MsuA////gD+A/4AfgD8AD4AfAAcADgADAAQAAgAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAABAACAgwAB//+AgygAAAAwAAAAYAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA + AAACApL/aoLiADpGugACAs0ARka2gAYq0oC2tvKAHiaqwI6O3oACAq8ARkbiAAIS1QAiItr/Akbi/yJC + 6v9iYuYAjq78/wJe+v8CAp7/AiLikQIatP9+m/I5TmLu/xYaypsCAtb/AkXyuQ4Sof8CMuqTo6ry8Sou + +jkeSvIZAgLAmYSG6pEqNs6TCAqeGWJ68hkCUvaRRlbymf7+/hnCxvaXAhLeGSZK/JcCCtYRZoL2GWJy + 7vEiIqjxnp7u/w4q4v8SEtb/FjLm4K6u8uACCs3gAgKpwFZq1sACDq6AIirfAJK2/gACKuYAVm7uAAIK + vgAGUv4AEhraALm+9oCGpvYAAg7eACcytg1GWuYNEhK2DQI67ZEqNOJ3Rl7yEQIa3xk+Rv6ZCgrX8XJy + 5pkCAraXIirS8QJK8oiqsvaJBgqm/3KO+RGiovIRCg7K/2Ji0v8aGtn/cIrq/woGsv8CGtr/Okbi/56q + 9P8Cav74Bgae+E5m9vgSEqb4qqzy8BIavuA2Nt7gcnLrwAICloACOtKAjo7uAAQGrgACE9oAYm7qAAIm + 5AADBtcAAjbyAAIDxoB6lu6AAlr24MvM9v8uRv4AAg7ZACYuvg2vtvYNAg3SDQQGqf9YbNqRAi7uEQIK + xjcCWvr/v8D2GYqu/PFEXvx4Ah7i/wJO+pkeHt7/PFrqEQIC0v8CJr4RHibO/0pazv8+PsL/Albu/05e + 3v82Qs7/NlLy/xYarv9abv7/GEr+/xo+7v9+ft7/Kj7+/wJC7v+OmvL/bn7u/0JO3v8CIt7/Ynj+/0JQ + /v8mLq7+Dg6y/j5W/v4WHrb8GjLy+Iai9vg+Ssbwaobu4A4y5sAuOtrALi7egA4OqoBWavqAbGzmgE5c + /oCGlvKAmprugFZq7oBshP6ALjq6wCkq2uB6eurwVlrm+A5C7v+avv7/Ai7GABJS/gCKiu4NDg6eDW6G + +g2bpvKZClT8k4io/pguOuR5FhbG8SpO+pEyOvqTAmb+mX6e+pcWFtJ3Agq28Zq6/plecu4ZEhqmGV52 + /odCUuZ5Hh668UZGvhkWKuKRAnL+kS4uvphuhuZ5ubr18Y+y/pFSZvKZEhaimQJW9pkiTvqRFBbY8Vhu + 1BkCDsKRAlb6kXaS+omlpvOZZmbO8Rwe2pF2duoZBgaaGQIGynhKSuIZAhbW8SQm2hlmZuaZAmL9mQMC + oncCNuqZpa7y8QIGwpEKCqKRZn7yicbK9nACFt6VAgra/xIy6hmwsvIZAg7KN5a6/okCLuabBArC/xYe + 2plCWuqRAj7uGQoO1pEmLtKHAk70/wIOppEODs6Zco7qEThG5pkEBqJ3Smb6/xIWqhk6Ot4ZAj7W/5KS + 7nsAAACR//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////AAAAAAAAAAAA//////////////////////////// + ////////////////////////AAkNY68UFAkAAAAAAP////////////////////////////////////// + ////////ADsRWlpaWhERYxQAAAAAA///////////////////////////////////////////ADtqWhFa + WhFaWloRG687AAA7Cf////////////////////////////////////8AAAsTWlpaEVoRWhFaWhEREzsA + AAn///////////////////////////////////8AABgTWloRWlpaEVpaWlpaWhkxMAAAAAD///////// + //////////////////////8ACXxqERFaERERWloREREREVpaGR0XCQAAAP////////////////////// + /////wAAC3wbWloRWhERGRkRERERERERWhEeHRcAAP///////////////////////////wAJC3wZGWoZ + ExMTExsbGRERERFaGRFaHroFCQAA////////////////////////AAADE3x8fAsLfBMZEREREREZERkR + EREZERlIjkMAAP//////////////////////ADt8GAt8CxNqDRERGRkRGRkRGREZERkRGRERKUgMAAD/ + //////////////////8AAHwLfAsLGxEZGRkZERkZERkZERkZGRENERkRGSmIDAAA//////////////// + /wAAAwsLCxMZGRkZGRkNGRkZGRkZGRkZERkZGRkZGRkpJQwAAP//////////////AAAUCxgLGxkNahlq + GRkZag0ZGWoZDRkZahkZGRkZGRkZKVyfAAD/////////////AAADCwsbDRtqDRsNGw0bDWoNag1qag1q + DRlqGWoNahlqGSUlQwD///////////8AAAMLCxsbGxsbGxsbGxsbGxsbDRsNGxsNGxsNag1qDWoNag1c + JQkA/////////wAAAwsYExsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGw0bGxseiiEAAP///////wAU + AwMFExsTGxsTGxsbGxsbGxsbGxMbGxsbGxsbGxsbGxsbGxsbXFxDAP//////AAADAwMTExMTExMTExMT + ExMTExMTExsTGxMbExsTGxMTExMbE2oTHiNYCQD///8AADsDAwt8fBN8fBMTExN8ExMTExMTExMTExMT + ExMTEw0jWBsTExMTE1wjGgD///8AADsDAwt8fHx8fBN8C3x8fHx8fHx8fBN8fHx8E3x8fEIuEJBCE3wT + fIgrcQD///8AOwM7A3wLfBh8fBh8fAt8fAt8fHx8fAsTfHx8fHx8C4pZWVlOVXwLfMYrhwD//wAAOzsD + GAt8GHx8GHx8GHx8GHwLfBh8GBMYfHwTGHx8xi4cHBxOTkJ8fHwjFgD//wAJOwM7GAsLCwsLCwsLfBgL + fBh8C3wLfBh8GHwYfAsYLBwcHE4GBidYC3xcIwD//wAAAzs7GBgYGBgYGBgYGAsYCxgLGAsYCwsLCwsL + CxhgHBwcBgYGJycsGBglUAD//wAJOzsDAxgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBisBgYGBgYnJydY + GBhcFQn//wAJOzsDGBgYGAMYAxgYGBgDGBgDGBgYGBgYGBgYDAwwICcGBicnJyAYGHwrAQD//wAJOzsD + GAMYGBgYGAMYAxgYGBgYGBgYGAMYGAySHC4YGCAGJwYnBmAYAwwQFgD//wAJAzsDGBgYGBgDGBgYGBgY + AxgYAwMYAxgwIBwGBgYuAxhgBicnShgYGEIQgwD//wAJOzsDGAMYGBgYAxgYGAMYGBgDAAMYGBgYLgYG + BicGIAwDDA9KMBgDGBUQLQD//wAJOzsDGBgYGAMYGBgYAxgYGBgDAwBYGBgDDycnBgYnJwYPMAMYAxgY + OjgQCQD//wAAOzsDAxgDGBgDGAMYGBgDGAMYGAktLAwYDC4nJwYnJxwPMBgYGANYOMtBAP////8ACTsD + GBgYGBgYGBgYGAMYGBgYGAwJAhWfGBgMCpKSDBgDGBgYA1jLODUAAP////8ACTs7AxgYGAMYAxgYGBgY + AxgYYEoEAHFsUEUYAxgYGBgYAxgwwjg4bBoA//////8AAAA7AxgDGBgYGBgDGAMYGBiSIFMJAAAaNcsj + fwwwGBgLRQoQODgBXQD//////////wAJOxgYAxgYGBgYGBgDGA8cCAAA//8AAF0BODjLEBUQEDg4OIMA + AP///////////wAACTsYGBgYGBgYGBgMShzWCQD/////AAAAcTUBbBAQEFU1QQAA//////////////8A + AAkJMBgYGDAYDA8cCC0AAP////////8AAAAJAAkACQAAAAD/////////////////AAAAAAlDQ10MBARx + AAAA/////////////wAAAAAAAAAA////////////////////////AAAAAAAAAAAAAP////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////8Af////////wAH/////w//AAD/////D/8AAB////8P/gAAD////w/+AAAB///+D/4AAAB///4P/A + AAAH///g/8AAAAH//8D/gAAAAP//wP+AAAAAf/+A/wAAAAA//4D+AAAAAB//APwAAAAAD/4A/AAAAAAP + /AD4AAAAAAf8APAAAAAAA/gA8AAAAAAD8ADgAAAAAAHwAMAAAAAAAeAAwAAAAAABwADAAAAAAAHAAIAA + AAAAAcAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAAB + gACAAAAAAAGAAIAAAAAAA4AAwAAAAAADgADAAAAAAAfAAMAAAAAAD8AA8AAAwAAfwADwAAHgAD/wAPgA + A/gAf/AA/AAH/gH/+AD/gB/////8AP////////+A////////////////////////////////KAAAACAA + AABAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAICkgJuhuZqAkbeOgICwgIGIsZGQkK2Bh4i + qrYCAqoeAgLWjgJC4gImJtZGtrr2AiZC5iKOlu4CQkLeIgIi4mICEtaOAlr2AmZm5gISEp4CAjLqAg4S + qn6Orv5OAgKeFgJC8gICEtICEhLWDnJy3gICArajHkL+KgIC0h4SIt4CoqryhH6e7ioCCtYIAhreYlZq + 7gIGCp5GMjrS/jJS6sICKuYCFj7qJgJO8gICZv5mWnL2YgIKyiJCXvqeAgq2DrK29hJ6lvIWDgqurv7+ + /gI2QuYCnp7uVkJS6gICEt4iAjrqkgJW+gIGCppWHiLaAkpaygbCwvYSAibiuQJi+oYWGqYCsrLyJwoK + 1kYKCp4SNkLyAgICmioCAspGAibaAgIGqj4CBtYKNjLecpKi8gISFqYiEhaqAgIGnqoWGtoGanrucgIC + vqJSZvoKLjbqYgJW9hpWVuZwamrSCmaC8gI+SsI6NjK+niYu3gKWku4GDhLaTgZa/hISFqKqAjLuEpq+ + /jYSEtJyAga2AhpO+gICCs6OqqryBIqq+gICDtZiAhriAlZu7gMCLuYCAlL2AmJ69no+SuoCVmrSywoK + pi4aGtoCBgaWJgIGxq8iKrICAlbuBL7C9lgCIuYCAhbaAgJe+gIKMua/Ah62io6y+kQCAqICAkryAn6a + /h4+Xv48Hj7uAoqK6gJ2jvoeJlL6Sj4+5j5KWuICOkbSThYazjYCMso2XnLeFg4q2loOTv4YcnLqGjY2 + 3n4ODsYqAkLuAkpK2o56etpupqbyQj5K9gLKyvZiAi7SQhoeqiYuPuIOboryPhom4hY+RuIaTl7qhh4e + 0j6+vvZqgp72DgoKti6amu4uAm7+Dl528lYeHt5sJi62Tqau8oYCHtqaAgqiVhI+7mwCDsYuCgqyKTpG + 5noCFt5WAj7uDsbG9poCJuYCrrL2EgoOnooGBpoOBgaubgIG2psSGt4KWlrmiD5Oxi4mMuIWGk7+KgIO + 0jJabvICkrL+fnZ26hYCApYCAgLGmgICrl4CAtoSJibaXgYi4kICEtoeAlr6RhISohYCNuoCDhKuLgJG + 8m4CArq5AgbSjwIK2lJWavISAirqAgJO9iICav4UAgq6WLK69gICOu4CSl7KdgYm4qUCYv5mCg7WHAIG + ynYGBqoGBgbWAgYGnkqWlu4CFhaiJAYGtmaqrvICAg7aAwIe4gICLuqlBlL2AlZq1goGAqJmioruxl52 + 9gICFuICDg6eEh5O/rAAAAACAAAAlgAAAAIAAAAEAAAAFgAAAEIAAAACAAAACgAAACYAAAACAAAAAgAA + AA4AAAByAAAAOAAAAAQAAABKAAAAEgAAADoAAAACAAAAkgAAAAD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////wAHAAAAAAD/////////////////////////////////AEcrdAKI + BAAAABz///////////////////////////8ARysrKysrKwIDFQAc////////////////////////AAcP + KysrKysrKysRHxwAAP////////////////////8AHBQrKysrESsRKysrEZkcAAD///////////////// + /wAQFBgUFBQUGBErEREREVMfAAD///////////////8AHBAPaGgUGBEYERgRERERER1TBwD///////// + ////AAcQaBAUERgRGBEYEREYERgRER0uBwD///////////8AA2gPGAkYGBgYGBgYGBgYGBgYGBEuBwD/ + ////////AHoIDwkUGBQJGBQYCRQYCRgYCRgYGIMnAAD//////wAHEEcUFBQUFBQUFBQUFBQUFBQUFAkU + FH8KAP////8ABwMQDxQPFA8UFA8UFBQUFBQUFBQUDxQUHVJAAP///wAcCBAPDw8PDw8PDw8PDw8PDw8P + FCcJDw8Pf1gA//8AAAMQEGhoaGgQaGgPEGhoD2gPD2g0S0skD2gMUgD//wAcAwNoEGgQaGhoaBBoaBBo + aGhoEDYgIAtQEA8sQP//ABwDCBAICBAIEAgQCGgQaBAQEAgQNSALC3WEaCxz//8AAwMICAgICAgICAgI + CAgICBAICA4LCws9CwoIbHP//wADAwgICAgICAgICAgICAgICAgSChI9PT2BCGgxBv//BxwDCAgICAgD + CAgIAwMICAgSCws1CIQgCwoINDEH//8AHAMDCAgICAgICAgIB4cICDU9CwsgJhoaCBAxbgD//wAcAwgI + AwgICAgDCAgDBiQQDjUgIDVVCAgILHtAAP//AAAcCAgICAgICAgICA4mAFAnGggIAwgIGldgWAD///// + AAcDCAgIAwgICAhVG0AAADxXUjQpJlJ7e1gA////////AAcDCAgICAgKjBtAAP8AAEA8AQ0WFm4GAP// + ////////AAcch4cKDlYFAAD/////AAAABwAAAAD/////////////AAAABwBAAAD///////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////wH///8A + H///AAf//gAB//4AAH/+AAA//AAAH/gAAA/4AAAH8AAAA+AAAAPAAAABwAAAAYAAAAGAAAABgAAAAYAA + AAGAAAABgAAAAYAAAAGAAAABgAAAA8AAAAfgAIAP8AHgH/gH//////////////////8oAAAAGAAAADAA + AAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAgKOAmqC4m42Qr4CAgLGAgom0gZCUsJCAiq+HgIC + rgICAtYCAkLuAiYuwiY6RuK2trbyJgIS1o5KSuJCAlr6AgIi4gICErYCcnLiZhoephKWlu4CEhLWDgIy + 5o4CAp4CHkLqAk5i7gICArYSAhrico6W8gICAs4eAlLqAh4i2hJWVuKiAgrWfv7+/gICGt4CAmb+VhYy + 5gYCCqIygoLqMhoiqgLGxvYWAk72AjIy4gIKCqpaDhLaAhYu4kIuOrYCAgKWsmpq0no6WvoOtr72/gIS + 3jZGWuaeAmL6QgIq5gISErICAjrqAgICpgYKCrYeAg7SSiYu4sImJqYCAgrGAkpeyhYCBtayIk76Cqau + 8goCBs42Alb2Ar6+9gJ2iu4CBgauAgIW2gICXvo2YnLukhoa3hIGBp4SGkb6Alpu7hYqKtpqWl7mAgoO + 2lKKkvIuHiaqAgYKmlZCXvJqAgrKZjpKwj4CNs42AkryJjIywpYyQuoOAhLaBgJa/hICJuICAhq2mpqm + 8hICNuoCAgKiGgICvgICHuKqhqb2igJO8gIeJt4CWlriVgIO2gICbv4CFj7mYgoKoj6Kiu5WGiKuCgpS + +hoKCrIGAgKaAgIu5iIWHroCAj7uvgIKvgJOXtYCAgbaAgYG0gq+wvYCFk76jlpy8gJKWu4CAgKSfnaS + 6j42QsYeHibSih4eqnYyTvImsrb2Pg4i3koqKrI6Qk7OFkJS5gJ2eupepqbyDs7O9g5ievZyKjbmNlJi + zg5yjvYCgqL+SjJK7noWPu6mNjbePh4e2soCRvICAg6mGoaG6i4OCq5uAg7CGgIGsj4GUvJOVlrmHgIC + sr4GAtaCHh6mChIS2poCMuoCAgK6XgIC0h4iItomAgrapgIe3gICav4CHiKqEgJS9gK6vvYKAhbeOgJi + /gICOu4CAgamxgYG1gIGBs6uAlb6Clpu8gYCDsoGBhLaAgZa/hICJuZaAh62PgYCoiYCHuYaBgKaAgIu + 6loCDr6SwsL2dhZO/gJKXu4CAAAAAgAAAAIAAAAmAAAABgAAAAIAAAACAAAAEgAAAAIAAAAOAAAAAgAA + AAIAAAACAAAAAgAAAFYAAAACAAAAAgAAAAIAAAACAAAAsgAAAAIAAABKAAAABgAAAAIAAAAKAAAAAgAA + AAYAAAAGAAAABgAAAJYAAAAWAAAABgAAAKoAAAACAAAAAgAAAAIAAAAGAAAAVgAAAAYAAACKAAAAXgAA + AAIAAAAOAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////////////////////////// + ////////////////////////////////////FxcGBgcXAAD/////////////////////ABEkJCQeWREH + Fxr/////////////////FwMPJCQkJCQPBAcXF///////////////FwQPJA8PDw8PJA8uBwD///////// + //8XAxsWEBAWKg8PDw8PTh8XAP///////xcXDRsQFioPKioqKg8qKk4rBwD//////xcIGxYWKioWKhYq + DxYqKioqDgcA////FxoEFhYqFhYqFioWFioWKhYWDw4X//8XGg0QFhYQFhYWFhYWFhYWEBYWFjIKAP8X + Aw0QEBAQEBAQEBAQFhAQGBgWEE41FxcaAw0bGxsbEA0bEBsQGxsbfGEBJRsZOBcaCA0NDQ0bDRsNDRsN + Gw0QFAwMHA2DWBcDAwgICAgICAgICAgICAggegwpDAiDhwcaCAgICAgIAwgICAgIUCArJykpRwg1WBca + CAgDCAgICAgDCAgODCkUFSAnFQiPExcaAwgICAMICAgDOB8VQwwpFFAIA7IBABcHAwgICAgICAgVAgI1 + jVAVAwgIT2YoF/8XBwgICAgICJMxExcTBUsZGYxmfygA//8XFxoDCAgVIDETF/8AFygFjgUvFxf///// + /xcXBxOGPhcX/////xcAFwAX//////////////////////////////////////////////////////// + /////////////////wv/////+Af///gA//j4AD/4+AAf+PAAB/jgAAPw4AAB4MAAAeCAAADAgAAAgAAA + AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAgAgDgOAeD4D////g/////ygAAAAQAAAAIAAAAAEA + CAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAACApICaoLuagJK5jYCAsYCBiLKCj5OzkICIrYCAgKqAgIC + 1gIqLsYCNkbSJgJa+joOEp62AibiAgIW2kpmZuYCAgKeAhIm4gICTvZyWm7WGj5W5pa+wvYSAjbqAhIO + 1gICGrYeAgrWTgIOogJOTuICEh7Gjiou3gICLuYCEhreHgJS9lYGCpoClpbu/gICzgICZv4CAgKaFgJC + 7gIqKq6CAga6GgIa3sYGCsICAgbaMgICpgpCVu4O/v7+FgoO2i4KCp4CTlrqajo63joOLuq2Clb+AgJK + 8kYqNrYCAgaSAoKG6hICMsoCUlLeAgYGsgouOsYCAmL6JgIq5iYOEtoCZn7iShI65gISRvYiRlrqpsrK + 9gICPu4CGh6uvgIO2nYuPtoGAlb2Apqm8gICbv5iCkbuGgoOngYCApYaAgbKWgIq1ipCVtpaBgKuCgIC + 2oomSvIeGhqiBgIm5kICFt4CCgaiOgpO+gJCVuoCwsL2MgI66jICCtoCUlbmAgIy6gIaGtoCAgLSmgJq + /gIGBpoCAkbyAi4utgICCrqGAh7iAgIOyh4GBtpaBgamAkpe5gIKMuYWMj66CoqS7oouOsoaAmL+CnZ2 + 6goeMuICFha6AiY+5hYCVvoCqq7yAg4Onk4AAAACAAAABgAAAL4AAAAWAAAAWgAAAEoAAAACAAAAdgAA + ADYAAAAeAAAAHgAAADIAAACyAAAADgAAACoAAABCAAAAQgAAAHYAAACmAAAAzgAAAGIAAAAqAAAAUgAA + AHIAAACCAAAAMgAAABYAAAA2AAAAHgAAAAIAAAACAAAAhgAAAA4AAAACAAAAAgAAAAYAAABWAAAAAgAA + AAYAAAAeAAAAEgAAAAIAAAACAAAAAgAAACIAAAACAAAAAgAAAAIAAAAeAAAAAgAAALoAAAACAAAAAgAA + AAIAAAACAAAABgAAAAYAAAACAAAAWgAAAAIAAAAGAAAABgAAAAIAAAACAAAABgAAAAIAAAAGAAAAAgAA + AAIAAADCAAAAFgAAAEoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////wAHOQYAACj///// + //////8AFiQkJAIEBwD/////////AA0LEhIkJBYEAP//////AChnDRYSEhILEh0H/////wcOFhISEgIS + EhISdAf//wcDDRYWFhYWFhYWFkIKAAAoZw0NDQ0NDQ0NFgINVHMHAw4ODQ5nDg0NDi0iLQ08BwMICAgI + DggICAhuFXYRCgcICAgICAgICB06D0Q4HwUHAwgICAgDAx8iRHEyFy1tAAMIAwgICAk8Xl4yDi0BAAAH + CAgIHzonADZRLQETDP//AAAoc2VGAP8AAEYAAP//////////////////////////RAjgP///4A/gP+AH + 4A/AA+AHwAHAA4AAwAEAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgIMAAf//gIMoAAAAgAAAAAAB + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAJcQAACXrwAAl78AAJevAACXgAAAl4AAAJdAAACXMAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl4AAAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl98AAJe/AACXjwAAl3AAAJdAAACXEAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACXgAAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/AACX3wAAl68AAJeAAACXQAAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJdAAACX/wAA + l/8AHbr/ADPK/wAzyv8AGbH/ABmx/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl98AAJefAACXcAAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJf/AACX/wASv/8AZf3/AGX9/wBl/f8AZf3/AGX9/wBf + 9/8ATOT/ADnQ/wAsxP8AGbH/AAad/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA + l+8AAJevAACXYAAAlyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXgAAA + l/8AAJf/AA/C/wBJ9P8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AFjw/wBF + 3f8AM8r/ABmx/wAGnf8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl98AAJePAACXUAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJeAAACX/wAAl/8AFNH/ADft/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBS6v8AP9f/ACa9/wAN + pP8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX7wAAl58AAJdgAACXEAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + l68AAJf/AACX/wAU0f8AIOb/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBY8P8BOtf/Aha3/wECnv8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/AACXrwAAl2AUGf8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXzwAAl/8AAJf/ABnf/wAb5P8AV/j/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/A1z9/wQ+5P8HFcT/BAWr/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wEC + nv8CAqCvBAWsUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJf/AACX/wACnP8AG+T/ABvk/wBO9f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8EV/3/CzTx/wsV0f8EBar/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AgKe7wMDoo8ICrkwAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQAAAl/8AAJf/AAiv/wAb5P8AG+T/AEDx/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AmH9/wlK/f8SI/H/DhHR/wUG + qv8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8EBai/CQu5YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJeAAACX/wAAl/8ADr7/ABvk/wAb5P8AQPH/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8IT/3/EzL+/xUb6/8MDsT/AgKd/wAAl/8AAJf/AACX/wAA + l/8AAJf/AgKe3wQFpnAcIv4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl88AAJf/AACX/wAW1v8AG+T/ABvk/wAu + 6v8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/B1T9/xUz/v8cI/7/EhbX/wcJsf8AAJf/AACX/wAAl/8AAJf/AACX/wICnu8AAJeAAACXEAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJcgAACX/wAAl/8AApz/ABvk/wAb5P8AG+T/AC7q/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wdV/f8WNf7/HiX+/xoh + 8f8MDr7/AgKd/wAAl/8AAJf/AACX/wAAl/8AAJfvAACXgAAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJf/AACX/wAKtP8AG+T/ABvk/wAb + 5P8ALer/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8IVf3/GDb+/yAn/v8eJfj/EBTL/wQFpP8AAJf/AACX/wAA + l/8AAJf/AACX7wAAl4AAAJcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACX3wAAl/8AAJf/ABTQ/wAa4/8AGuP/ABrj/wA67v8AZPz/AGT8/wBk/P8AZP3/AGT9/wBk + /f8AZP3/AGT9/wBk/f8AZP3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/DE79/x0w/v8iKf7/Iir+/xUa1/8EBaT/AACX/wAAl/8AAJf/AACX/wAAl+8AAJdgAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl0AAAJf/AACX/wADoP8AGuL/ABri/wAa + 4/8AGuP/AD7v/wBi/P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBj/P8AY/z/AGP8/wBj + /P8AY/z/AGP8/wBj/P8AY/z/AGP8/wBk/P8AZPz/AGT9/wBk/f8AZP3/AGT9/wBk/f8AZP3/AGT9/wBl + /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AmH9/xFI/v8hL/7/Iyz+/yMs + /v8WG9f/BQak/wAAl/8AAJf/AACX/wAAl/8AAJffAACXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACXrwAAl/8AAJf/AA7B/wAZ4v8AGeL/ABni/wAa4v8ARfH/AGD7/wBg+/8AYPv/AGD7/wBg + +/8AYPv/AGD7/wBh+/8AYfv/AGH7/wBh+/8AYfv/AGH7/wBh+/8AYfv/AGH8/wBh/P8AYvz/AGL8/wBi + /P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBi/P8AY/z/AGP8/wBj/P8AY/z/AGP8/wBj/P8AY/z/AGP8/wBj + /P8AY/z/AGT8/wBk/P8AZP3/AGT9/wVd/f8cO/7/JS7+/yUu/v8lLv7/Fx3X/wUGpP8AAJf/AACX/wAA + l/8AAJf/AACXvwAAlyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJf/AACX/wAAl/8AF9z/ABnh/wAZ + 4f8AGeH/ABnh/wBM9P8AXvr/AF76/wBe+v8AXvr/AF76/wBe+v8AX/r/AF/6/wBf+v8AX/r/AF/7/wBf + +/8AX/v/AF/7/wBf+/8AX/v/AGD7/wBg+/8AYPv/AGD7/wBg+/8AYPv/AGD7/wBg+/8AYPv/AGH7/wBh + +/8AYfv/AGH7/wBh+/8AYfv/AGH7/wBh+/8AYfz/AGL8/wBi/P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBi + /P8MUv3/JDP+/ycw/v8nMP7/JzD+/xQYy/8DA53/AACX/wAAl/8AAJf/AACX/wAAl4AAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACXnwAAl/8AAJf/AAmz/wAY4f8AGOH/ABnh/wAZ4f8AGeH/AFz5/wBc+f8AXPn/AFz5/wBc + +f8AXPr/AF36/wBd+v8AXfr/AF36/wBd+v8AXfr/AF36/wBd+v8AXfr/AF36/wBe+v8AXvr/AF76/wBe + +v8AXvr/AF76/wBe+v8AXvr/AF76/wBf+v8AX/r/AF/6/wBf+/8AX/v/AF/7/wBf+/8AX/v/AF/7/wBg + +/8AYPv/AGD7/wBg+/8AYPv/AGD7/wBg+/8AYPv/AGD7/wBg+/8DXvv/HED9/yky/v8pMv7/KTL+/yYv + +P8PE77/AACX/wAAl/8AAJf/AACX/wAAl88AAJcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJf/AACX/wAAl/8AFdf/ABjg/wAY + 4P8AGOD/ABjg/wAo5/8AWvn/AFr5/wBa+f8AWvn/AFr5/wBb+f8AW/n/AFv5/wBb+f8AW/n/AFv5/wBb + +f8AW/n/AFv5/wBc+f8AV/j/AEvz/wBL8/8APu//ADvt/wA77f8AO+3/ADvt/wA77v8AP+//AEz0/wBd + +v8AXfr/AF36/wBd+v8AXfr/AF36/wBd+v8AXvr/AF76/wBe+v8AXvr/AF76/wBe+v8AXvr/AF76/wBe + +v8AXvr/AF/6/wBf+v8AX/r/EE78/yc3/v8qNP7/KjT+/yo1/v8jK+v/Cw2x/wAAl/8AAJf/AACX/wAA + l/8AAJeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACXnwAAl/8AAJf/AAmy/wAX4P8AF+D/ABfg/wAX4P8AF+D/ADzt/wBY+P8AWPj/AFj4/wBY + +P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBN9P8AQe//ADns/wAo5v8AJOX/ABjg/wAY4P8AGOD/ABjh/wAY + 4f8AGOH/ABjh/wAY4f8AIOT/ADHq/wBB8P8ATvT/AFv5/wBb+f8AW/n/AFv5/wBb+f8AW/n/AFz5/wBc + +f8AXPn/AFz5/wBc+f8AXPn/AFz5/wBc+f8AXPr/AFz6/wBd+v8AXfr/AF36/wBd+v8AXfr/BVj6/yQ9 + /f8sNv7/LDf+/yw3/v8sN/7/GR/R/wMEnf8AAJf/AACX/wAAl/8AAJfPAACXIAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlzAAAJf/AACX/wAAl/8AFNb/ABff/wAX + 3/8AF9//ABff/wAX3/8ATvT/AFb3/wBW9/8AVvf/AFf3/wBP9P8AP+7/ADPq/wAn5f8AF9//ABff/wAX + 3/8AF9//ABfg/wAX4P8AF+D/ABfg/wAX4P8AF+D/ABfg/wAr5/8APO7/AFD1/wBZ+P8AWfj/AFn4/wBZ + +P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBa+P8AWvj/AFr4/wBa+P8AWvn/AFr5/wBa+f8AWvn/AFr5/wBb + +f8AW/n/AFv5/wBb+f8AW/n/AFv5/wBb+f8AW/n/AFv5/xdJ/P8uOf7/Ljn+/y45/v8uOf7/KDLx/wwO + sf8AAJf/AACX/wAAl/8AAJfvAACXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACXvwAAl/8AAJf/AAiy/wAW3v8AFt7/ABbe/wAW3v8AFt7/ACbk/wBU9v8ATPP/AD3t/wAu + 5/8AHuH/ABfe/wAX3v8AF9//ABff/wAX3/8AF9//ABff/wAX3/8AF9//ABff/wAX3/8AG+H/AC7o/wBC + 8P8AUvb/AFb3/wBX9/8AV/f/AFf3/wBX9/8AV/f/AFf3/wBX9/8AV/f/AFf3/wBX+P8AWPj/AFj4/wBY + +P8AWPj/AFj4/wBY+P8AWPj/AFj4/wBY+P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBZ + +P8AWfj/AFr4/wxS+v8sPP7/MDv+/zA7/v8wO/7/MDv+/xsh0f8DBJ3/AACX/wAAl/8AAJf/AACXjwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl1AAAJf/AACX/wABm/8AFdn/ABbd/wAW + 3f8AFt3/ABbd/wAW3f8AIeL/AB7g/wAW3f8AFt7/ABbe/wAW3v8AFt7/ABbe/wAW3v8AFt7/ABbe/wAW + 3v8AFt7/ABbe/wAW3v8AKeb/AD3t/wBU9v8AVPb/AFT2/wBU9v8AVfb/AFX2/wBV9v8AVfb/AFX2/wBV + 9/8AVff/AFX3/wBV9/8AVff/AFb3/wBW9/8AVvf/AFb3/wBW9/8AVvf/AFb3/wBW9/8AVvf/AFf3/wBX + 9/8AV/f/AFf3/wBX9/8AV/f/AFf3/wBX9/8AV/f/AFj4/wBY+P8AWPj/AFj4/wZU+f8oQf3/MT3+/zE9 + /v8xPf7/MT3+/ygy6/8JDKr/AACX/wAAl/8AAJf/AACXnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJcQAACX3wAAl/8AAJf/AAu6/wAV3P8AFdz/ABXc/wAV3f8AFd3/ABXd/wAV3f8AFt3/ABbd/wAW + 3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAd4P8AN+v/AE70/wBS9f8AUvX/AFL1/wBS + 9f8AUvX/AFP2/wBT9v8AU/b/AFP2/wBT9v8AU/b/AFP2/wBT9v8AU/b/AFP2/wBU9v8AVPb/AFT2/wBU + 9v8AVPb/AFT2/wBU9v8AVPb/AFT2/wBV9v8AVfb/AFX2/wBV9v8AVfb/AFX3/wBV9/8AVff/AFX3/wBW + 9/8AVvf/AFb3/wBW9/8AVvf/AFb3/wBW9/8gR/v/Mz/+/zM//v8zP/7/Mz/+/zA7+P8QFLf/AACX/wAA + l/8AAJf/AACXvwAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl48AAJf/AACX/wADoP8AFdz/ABXc/wAV + 3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAk + 4v8AQe7/AFD0/wBQ9P8AUPT/AFD1/wBQ9f8AUPX/AFD1/wBR9f8AUfX/AFH1/wBR9f8AUfX/AFH1/wBR + 9f8AUfX/AFH1/wBS9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBS9f8AU/b/AFP2/wBT + 9v8AU/b/AFP2/wBT9v8AU/b/AFP2/wBT9v8AVPb/AFT2/wBU9v8AVPb/AFT2/wBU9v8AVPb/AFT2/wBU + 9v8UTfn/NUH+/zVB/v81Qf7/NUH+/zVC/v8bIcv/AACX/wAAl/8AAJf/AACXzwAAlxAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJcwAACX/wAAl/8AAJf/AA/K/wAU2/8AFNv/ABTb/wAU2/8AFNv/ABTb/wAV2/8AFdv/ABXb/wAV + 2/8AFdv/ABXb/wAV2/8AFdv/ABXb/wAq5P8ARvH/AE70/wBO9P8ATvT/AE70/wBO9P8ATvT/AE70/wBO + 9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBP9P8AUPT/AFD0/wBQ9P8AUPT/AFD0/wBQ + 9P8AUPX/AFD1/wBQ9f8AUPX/AFH1/wBR9f8AUfX/AFH1/wBR9f8AUfX/AFH1/wBR9f8AUfX/AFL1/wBS + 9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBT9v8NTvj/M0T9/zZD/v83Q/7/N0T+/zdE + /v8iKtf/AACX/wAAl/8AAJf/AACX7wAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl88AAJf/AACX/wAGrP8AFNr/ABTa/wAU + 2v8AFNr/ABTa/wAU2v8AFNr/ABTa/wAU2v8AFNr/ABTa/wAU2v8AFNv/ABTb/wAp5P8ARfD/AEzz/wBM + 8/8ATPP/AEzz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN + 8/8ATfP/AE7z/wBO9P8ATvT/AE70/wBO9P8ATvT/AE70/wBO9P8ATvT/AE/0/wBP9P8AT/T/AE/0/wBP + 9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBQ9P8AUPT/AFD0/wBQ9P8AUPT/AFD1/wBQ9f8AUPX/AFD1/wBQ + 9f8AUfX/AFH1/wBR9f8KTvf/MUb9/zhF/v84Rv7/OEb+/zhG/v8jLNf/AACX/wAAl/8AAJf/AACX7wAA + lzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJeAAACX/wAAl/8AAZv/ABLV/wAT2f8AE9n/ABPZ/wAT2f8AE9n/ABPZ/wAT2v8AE9r/ABPa/wAT + 2v8AE9r/ABPa/wAk4f8AQ+//AEry/wBK8v8ASvL/AEry/wBK8v8ASvL/AEry/wBK8v8ASvL/AEry/wBL + 8v8AS/L/AEvy/wBL8v8AS/L/AEvz/wBL8/8AS/P/AEvz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AEzz/wBM + 8/8ATPP/AEzz/wBN8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ATvP/AE70/wBO + 9P8ATvT/AE70/wBO9P8ATvT/AE70/wBO9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBP9P8ETvX/L0j8/zpI + /v86SP7/Okj+/zpI/v8vO+v/BAWd/wAAl/8AAJf/AACX7wAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXMAAAl/8AAJf/AACX/wAMwP8AE9j/ABPY/wAT + 2f8AE9n/ABPZ/wAT2f8AE9n/ABPZ/wAT2f8AE9n/ABPZ/wAd3v8AOuv/AEfx/wBI8f8ASPH/AEjx/wBI + 8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBJ8f8ASfH/AEny/wBJ8v8ASfL/AEny/wBJ8v8ASfL/AEny/wBJ + 8v8ASvL/AEry/wBK8v8ASvL/AEry/wBK8v8ASvL/AEry/wBK8v8AS/L/AEvy/wBL8v8AS/L/AEvy/wBL + 8v8AS/P/AEvz/wBL8/8AS/P/AEzz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AE3z/wBN + 8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ETfT/MEr8/zxK/v88Sv7/PEr+/zxK/v8xPOv/BAWd/wAA + l/8AAJf/AACX7wAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + lxAAAJffAACX/wAAl/8ABqv/ABLY/wAS2P8AEtj/ABLY/wAS2P8AEtj/ABLY/wAS2P8AEtj/ABLY/wAV + 2v8AL+b/AEXw/wBF8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG8P8ARvD/AEbx/wBG8f8AR/H/AEfx/wBH + 8f8AR/H/AEfx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEjx/wBI8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBI + 8f8ASPH/AEnx/wBJ8f8ASfL/AEny/wBJ8v8ASfL/AEny/wBJ8v8ASfL/AEny/wBK8v8ASvL/AEry/wBK + 8v8ASvL/AEry/wBK8v8ASvL/AEry/wBL8v8AS/L/AEvy/wBL8v8AS/L/AEvy/wBL8/8AS/P/AEvz/wBM + 8/8ATPP/Jkv6/z1M/v89TP7/PUz+/z1M/v8yPuv/BAWd/wAAl/8AAJf/AACX7wAAlzAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXnwAAl/8AAJf/AAGb/wAR1P8AEtj/ABLY/wAS + 2P8AEtj/ABLY/wAS2P8AEtj/ABLY/wAS2P8AHt7/AD3s/wBD7/8AQ+//AETv/wBE7/8ARPD/AETw/wBE + 8P8ARPD/AETw/wBE8P8ARPD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBG + 8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG8f8ARvH/AEbx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEfx/wBH + 8f8AR/H/AEfx/wBI8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBI8f8ASfH/AEnx/wBJ + 8v8ASfL/AEny/wBJ8v8ASfL/AEny/wBJ8v8ASvL/AEry/wBK8v8ASvL/J0z6/z9O/v8/Tv7/P07+/z9O + /v8zQOv/BAWd/wAAl/8AAJf/AACX3wAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + l1AAAJf/AACX/wAAl/8ADMP/ABHX/wAR1/8AEdf/ABHX/wAR1/8AEdf/ABHX/wAR1/8AEdf/ACzk/wBB + 7/8AQe//AEHv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBD7/8AQ+//AEPv/wBD + 7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBE7/8ARO//AETv/wBE8P8ARPD/AETw/wBE8P8ARPD/AETw/wBE + 8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG + 8P8ARvD/AEbx/wBG8f8ARvH/AEfx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEjx/wBI + 8f8ASPH/AEjx/wBI8f8ASPH/KEz5/0FQ/v9BUP7/QVD+/0FQ/v81Qev/BAWd/wAAl/8AAJf/AACXzwAA + lxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcwAACX7wAAl/8AAJf/AAez/wAR1v8AEdb/ABHW/wAR + 1v8AEdb/ABHW/wAR1/8AEdf/ABfZ/wA26f8AP+7/AD/u/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA + 7v8AQO7/AEDu/wBA7v8AQe7/AEHu/wBB7v8AQe7/AEHu/wBB7v8AQe7/AEHv/wBB7/8AQu//AELv/wBC + 7/8AQu//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AEPv/wBD7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBD + 7/8AQ+//AETv/wBE7/8ARPD/AETw/wBE8P8ARPD/AETw/wBE8P8ARPD/AEXw/wBF8P8ARfD/AEXw/wBF + 8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBG8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG8P8ARvH/KU35/0JS + /v9CUv7/Q1L+/0NS/v8yPuT/AACX/wAAl/8AAJf/AACXnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXEAAA + l88AAJf/AACX/wADo/8AD9H/ABDW/wAQ1v8AENb/ABDW/wAQ1v8AENb/ABDW/wAb3P8AOuv/AD3t/wA9 + 7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD/t/wA/7f8AP+3/AD/u/wA/ + 7v8AP+7/AD/u/wA/7v8AP+7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBB + 7v8AQe7/AEHu/wBB7v8AQe7/AEHu/wBB7v8AQe//AEHv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBC + 7/8AQu//AELv/wBD7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBD7/8ARO//AETv/wBE + 8P8ARPD/AETw/wBE8P8ARPD/AETw/wBE8P8ARfD/N1H7/0RU/v9EVP7/RFT+/0RV/v8rNdf/AACX/wAA + l/8AAJf/AACXcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJefAACX/wAAl/8AAZv/AAzJ/wAP1f8AD9X/ABDV/wAQ + 1f8AENX/ABDV/wAQ1f8AIN7/ADvs/wA77P8AO+z/ADzs/wA87P8APOz/ADzs/wA87P8APOz/ADzs/wA8 + 7P8APO3/ADzt/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA+7f8APu3/AD7t/wA+ + 7f8APu3/AD7t/wA+7f8APu3/AD7t/wA/7f8AP+3/AD/t/wA/7v8AP+7/AD/u/wA/7v8AP+7/AD/u/wA/ + 7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQe7/AEHu/wBB7v8AQe7/AEHu/wBB + 7v8AQe7/AEHu/wBB7/8AQe//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AEPv/wBD + 7/8ERPD/QVX9/0ZW/v9GVv7/Rlf9/0ZX/f8fJsT/AACX/wAAl/8AAJf/AACXMAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXYAAA + l/8AAJf/AACX/wAJvf8AD9T/AA/U/wAP1P8AD9T/AA/U/wAP1P8AD9T/ACTg/wA56/8AOev/ADnr/wA6 + 6/8AOuv/ADrr/wA66/8AOuz/ADrs/wA67P8AOuz/ADrs/wA77P8AO+z/ADvs/wA77P8AO+z/ADvs/wA7 + 7P8AO+z/ADvs/wA77P8APOz/ADzs/wA87P8APOz/ADzs/wA87P8APOz/ADzs/wA87f8APe3/AD3t/wA9 + 7f8APe3/AD3t/wA97f8APe3/AD3t/wA97f8APe3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+ + 7f8APu3/AD/t/wA/7f8AP+3/AD/u/wA/7v8AP+7/AD/u/wA/7v8AP+7/AD/u/wBA7v8AQO7/AEDu/wBA + 7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBB7v8AQe7/AEHu/wBB7v8NRfH/R1j9/0dY/f9IWf3/SFn9/0hZ + /f8OEar/AACX/wAAl/8AAJffAACXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl0AAAJf/AACX/wAAl/8ABrH/AA7T/wAP0/8AD9P/AA/T/wAP + 0/8AD9P/AA/T/wAo4v8AN+r/ADfq/wA36/8AOOv/ADjr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA4 + 6/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADrr/wA66/8AOuv/ADrs/wA6 + 7P8AOuz/ADrs/wA67P8AOuz/ADvs/wA77P8AO+z/ADvs/wA77P8AO+z/ADvs/wA77P8AO+z/ADzs/wA8 + 7P8APOz/ADzs/wA87P8APOz/ADzs/wA87P8APOz/ADzt/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA9 + 7f8APe3/AD3t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8AP+3/AD/t/wA/ + 7f8AP+7/AD/u/wA/7v8gS/T/SVr9/0la/f9JW/3/SVv9/0BP8P8FBp3/AACX/wAAl/8AAJePAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcgAACX7wAA + l/8AAJf/AASm/wAO0v8ADtL/AA7S/wAO0v8ADtL/AA7S/wAO0/8AId7/ADXq/wA16v8ANer/ADbq/wA2 + 6v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADfq/wA36v8AN+r/ADfq/wA36v8AN+r/ADfq/wA3 + 6v8AN+r/ADfr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA56/8AOev/ADnr/wA5 + 6/8AOev/ADnr/wA56/8AOev/ADnr/wA66/8AOuv/ADrr/wA66/8AOuz/ADrs/wA67P8AOuz/ADrs/wA6 + 7P8AO+z/ADvs/wA77P8AO+z/ADvs/wA77P8AO+z/ADvs/wA77P8APOz/ADzs/wA87P8APOz/ADzs/wA8 + 7P8APOz/ADzs/wA87f8APO3/AD3t/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA97f8zUvj/S139/0td + /f9LXf3/S139/zRA3f8AAJf/AACX/wAAl/8AAJdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACXEAAAl88AAJf/AACX/wACnv8ADM7/AA7S/wAO0v8ADtL/AA7S/wAO + 0v8ADtL/ABza/wAz6f8AM+n/ADPp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA1 + 6f8ANen/ADXp/wA16f8ANer/ADXq/wA16v8ANer/ADXq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA2 + 6v8ANur/ADbq/wA26v8AN+r/ADfq/wA36v8AN+r/ADfq/wA36v8AN+r/ADfq/wA36v8AOOv/ADjr/wA4 + 6/8AOOv/ADjr/wA46/8AOOv/ADjr/wA46/8AOOv/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA5 + 6/8AOev/ADrr/wA66/8AOuv/ADrr/wA67P8AOuz/ADrs/wA67P8AOuz/ADvs/wA77P8AO+z/ADvs/wA7 + 7P8AO+z/ADvs/wA77P8AO+z/ADvs/wU+7f9HXPz/TF/9/01f/f9NX/3/TV/9/xget/8AAJf/AACX/wAA + l88AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJfPAACX/wAA + l/8AAZv/AAvG/wAN0f8ADdH/AA3R/wAN0f8ADdH/AA3R/wAW1/8AMej/ADHo/wAy6P8AMuj/ADLo/wAy + 6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz + 6f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADXp/wA16f8ANen/ADXp/wA1 + 6v8ANer/ADXq/wA16v8ANer/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA3 + 6v8AN+r/ADfq/wA36v8AN+r/ADfq/wA36v8AN+r/ADfr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA4 + 6/8AOOv/ADjr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOuv/ADrr/xhG + 8f9OYf3/TmH9/05h/f9OYf3/SVv3/wUGnf8AAJf/AACX/wAAl3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACXgAAAl/8AAJf/AACX/wAIu/8ADdD/AA3Q/wAN0P8ADdD/AA3Q/wAN + 0P8AEdP/AC3m/wAv5/8AMOf/ADDn/wAw5/8AMOf/ADDn/wAw6P8AMOj/ADDo/wAw6P8AMOj/ADHo/wAx + 6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADLo/wAy6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy + 6P8AMuj/ADLp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wA06f8ANOn/ADTp/wA0 + 6f8ANOn/ADTp/wA06f8ANOn/ADTp/wA16f8ANen/ADXp/wA16f8ANen/ADXq/wA16v8ANer/ADXq/wA1 + 6v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8AN+r/ADfq/wA36v8AN+r/ADfq/wA3 + 6v8AN+r/ADfq/wA36v8AN+v/ADjr/wA46/8AOOv/ADjr/zdV9/9QY/3/UGP9/1Bj/f9QY/3/Mj7X/wAA + l/8AAJf/AACX7wAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJfvAACX/wAA + l/8AB7f/AAzP/wAMz/8ADM//AAzP/wAMz/8ADM//AAzP/wAl4f8ALeb/AC7m/wAu5/8ALuf/AC7n/wAu + 5/8ALuf/AC7n/wAu5/8ALuf/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAw + 5/8AMOf/ADDn/wAw5/8AMOf/ADDo/wAw6P8AMOj/ADDo/wAx6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx + 6P8AMej/ADHo/wAx6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AM+n/ADPp/wAz + 6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA0 + 6f8ANOn/ADXp/wA16f8ANen/ADXp/wA16v8ANer/ADXq/wA16v8ANer/ADXq/wA26v8ANur/ADbq/wA2 + 6v8ANur/BTnr/0xi/P9RZf3/UmX9/1Jl/f9SZf3/FBmx/wAAl/8AAJf/AACXgAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACXvwAAl/8AAJf/AAOl/wALz/8AC8//AAvP/wALz/8AC8//AAvP/wAL + z/8AGdn/ACvm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAt5v8ALeb/AC3m/wAt + 5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALub/AC7n/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu + 5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/ADDn/wAw5/8AMOf/ADDn/wAw + 5/8AMOj/ADDo/wAw6P8AMOj/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADLo/wAy + 6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz + 6f8AM+n/ADPp/wAz6f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/H0fx/1Nn/f9TZ/3/U2f9/1Nn + /f8/TeT/AACX/wAAl/8AAJfvAACXEAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl1AAAJf/AACX/wAA + l/8ACsj/AAvP/wALz/8AC8//AAvP/wALz/8AC8//AA/S/wAn4/8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq + 5f8AKuX/ACrl/wAq5f8AK+X/ACvl/wAr5f8AK+X/ACvl/wAr5f8AK+b/ACvm/wAr5v8AK+b/ACzm/wAs + 5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt + 5v8ALeb/AC3m/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAv5/8AL+f/AC/n/wAv + 5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAw5/8AMOf/ADDn/wAw5/8AMOf/ADDn/wAw6P8AMOj/ADDo/wAw + 6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy + 6P8AMuj/ADLo/wAy6P8AMuj/P1v4/1Vp/f9Vaf3/VWn9/1Vp/f8VGrH/AACX/wAAl/8AAJeAAAAAAAAA + AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACX3wAAl/8AAJf/AAWy/wAKzv8ACs7/AArO/wAKzv8ACs7/AArO/wAK + zv8AHdz/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACnk/wAp5f8AKeX/ACnl/wAp + 5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAr + 5f8AK+X/ACvl/wAr5f8AK+X/ACvl/wAr5v8AK+b/ACvm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs + 5v8ALOb/ACzm/wAs5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALub/AC7n/wAu + 5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv + 5/8AL+f/ADDn/wAw5/8AMOf/ADDn/wAw5/8AMOj/ADDo/wAw6P8AMOj/ADDo/wAx6P8WP+3/Vmv9/1dr + /f9Xa/3/V2v9/0FQ5P8AAJf/AACX/wAAl+8AAJcQAAAAAAAAAAAAAAAA////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJf/AACX/wAB + nv8ACcr/AArN/wAKzf8ACs3/AArN/wAKzf8ACs3/AA3Q/wAm4/8AJuP/ACbj/wAm4/8AJuP/ACbj/wAm + 5P8AJuT/ACbk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAo5P8AKOT/ACjk/wAo + 5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKeT/ACnl/wAp5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp + 5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACvl/wAr5f8AK+X/ACvl/wAr + 5f8AK+b/ACvm/wAr5v8AK+b/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAt + 5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAu5v8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu + 5/8ALuf/AC7n/wAv5/8AL+f/AC/n/wAv5/9CXfj/WG39/1ht/f9Ybf3/WG39/xYbsf8AAJf/AACX/wAA + l2AAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAJcQAACX7wAAl/8AAJf/AAa4/wAJzP8ACcz/AAnM/wAJzP8ACcz/AAnM/wAK + zP8AGtr/ACTj/wAk4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAk4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl + 4/8AJeP/ACXj/wAl4/8AJuP/ACbj/wAm4/8AJuP/ACbj/wAm4/8AJuP/ACbk/wAm5P8AJuT/ACfk/wAn + 5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo + 5P8AKOT/ACjk/wAp5P8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAq5f8AKuX/ACrl/wAq + 5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAr5f8AK+X/ACvl/wAr5f8AK+X/ACvl/wAr5v8AK+b/ACvm/wAr + 5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALeb/AC3m/wAt5v8ALeb/AC3m/xY9 + 7P9ab/3/Wm/9/1pv/f9ab/3/OEbX/wAAl/8AAJf/AACXzwAAAAAAAAAAAAAAAP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl4AAAJf/AACX/wAB + nv8ACcv/AAnL/wAJy/8ACcv/AAnM/wAJzP8ACcz/AAzO/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi + 4v8AIuL/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACTi/wAk4v8AJOP/ACTj/wAk + 4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAm + 4/8AJuP/ACbj/wAm4/8AJuP/ACbj/wAm4/8AJuT/ACbk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn + 5P8AJ+T/ACfk/wAn5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKeT/ACnk/wAp + 5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp5f8AKeX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq + 5f8AKuX/ACvl/wAr5f8AK+X/ACvl/wAr5f8AK+X/ACvm/0Rf9/9bcf3/XHH9/1xx/f9ccf3/Bged/wAA + l/8AAJf/AACXIAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + AAAAAAAAAAAAAAAAAAAAAJcQAACX7wAAl/8AAJf/AAa6/wAIy/8ACMv/AAjL/wAIy/8ACMv/AAnL/wAJ + y/8AFNb/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAh4f8AIeH/ACHh/wAh4f8AIeH/ACHh/wAh + 4f8AIeL/ACHi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAj4v8AI+L/ACPi/wAj + 4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AJOL/ACTi/wAk4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAk + 4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACbj/wAm4/8AJuP/ACbj/wAm + 4/8AJuP/ACbk/wAm5P8AJuT/ACfk/wAn5P8AJ+T/ACfk/wAn5P8wUOn/SWXs/0Jf6/8yUun/GT3n/wAo + 5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAp5P8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp + 5f8AKeX/Fzvr/11z/f9dc/3/XXP9/11z/f8pM8T/AACX/wAAl/8AAJePAAAAAAAAAAD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAl2AAAJf/AACX/wAB + of8ACMr/AAjK/wAIyv8ACMr/AAjK/wAIyv8ACMr/AAjK/wAc3/8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe + 4P8AH+D/AB/g/wAf4f8AH+H/AB/h/wAf4f8AH+H/AB/h/wAf4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg + 4f8AIOH/ACDh/wAg4f8AIeH/ACHh/wAh4f8AIeH/ACHh/wAh4f8AIeH/ACHi/wAh4v8AIeL/ACLi/wAi + 4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj + 4v8AI+L/ACPi/wAk4v8AJOL/ACTj/wAk4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAl4/8AJeP/ACXj/wAl + 4/8AJeP/ACXj/0Fd6v+ElvL/hpjy/4iZ8v+Jm/L/gpXy/1hx7f8kROf/ACbj/wAm4/8AJuT/ACbk/wAm + 5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AKOT/U2v6/191/f9fdf3/X3X9/01g + 6v8AAJf/AACX/wAAl88AAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAACX3wAAl/8AAJf/AAS2/wAHyf8AB8n/AAfJ/wAHyf8AB8n/AAfJ/wAH + yf8AD9L/ABzf/wAc3/8AHN//ABzf/wAc4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd + 4P8AHeD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AHuD/AB/g/wAf4P8AH+D/AB/h/wAf + 4f8AH+H/AB/h/wAf4f8AH+H/AB/h/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAh + 4f8AIeH/ACHh/wAh4f8AIeH/ACHh/wAh4f8AIeL/ACHi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi + 4v8AIuL/ACLi/wAi4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ZHnu/4eY8v+JmfL/ipvy/4yc + 8/+OnvP/kJ/z/5Gh8/9ug+//JUTn/wAk4/8AJOP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl + 4/8AJeP/ACbj/wAm4/8qSe//YHf9/2B3/f9hd/3/YXj9/wwPpP8AAJf/AACX/wAAlyAAAAAA////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAl1AAAJf/AACX/wAB + nf8AB8j/AAfI/wAHyP8AB8j/AAfI/wAHyP8AB8j/AAfJ/wAV2f8AGt//ABrf/wAa3/8AGt//ABvf/wAb + 3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc + 3/8AHOD/ABzg/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAe4P8AHuD/AB7g/wAe + 4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AH+D/AB/g/wAf4P8AH+H/AB/h/wAf4f8AH+H/AB/h/wAf + 4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACHh/wAh4f8AIeH/ACHh/wAh + 4f8AIeH/ACHh/wAh4v9vgu//ipny/4yb8v+NnPL/j57y/5Gf8v+SofL/lKLz/5ak8/+XpfP/aX7u/wor + 4/8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAk4v8AJOL/ACTj/wwu5v9ief3/Ynn9/2J5 + /f9iev3/KzXE/wAAl/8AAJf/AACXYAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAAAAAAAAAAAAAAAAAACXrwAAl/8AAJf/AAOy/wAGx/8ABsf/AAbI/wAGyP8ABsj/AAbI/wAG + yP8ACMv/ABje/wAY3v8AGN7/ABje/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAa + 3v8AGt7/ABre/wAa3v8AGt//ABrf/wAa3/8AGt//ABrf/wAa3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb + 3/8AG9//ABvf/wAb3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc4P8AHOD/AB3g/wAd + 4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe + 4P8AHuD/AB7g/wAf4P8AH+D/AB/h/wAf4f8AH+H/AB/h/wAf4f8AH+H/AB/h/4ua8f+Nm/H/j53y/5Ce + 8v+Sn/L/k6Hy/5Wi8/+XpPP/maXz/5qn8/+cqfT/lKHz/x475f8AIeH/ACHh/wAh4f8AIeH/ACHi/wAh + 4v8AIuL/ACLi/wAi4v8AIuL/ACLi/1Fq+P9ke/3/ZHv9/2R8/f9FVd3/AACX/wAAl/8AAJefAAAAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAlxAAAJf/AACX/wAA + l/8ABcT/AAbH/wAGx/8ABsf/AAbH/wAGx/8ABsf/AAbH/wAN0f8AFt3/ABbd/wAW3f8AF93/ABfd/wAX + 3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY + 3v8AGN7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABre/wAa3v8AGt7/ABre/wAa + 3/8AGt//ABrf/wAa3/8AGt//ABrf/wAb3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABvf/wAc + 3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzg/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd + 4P8AHeD/AB3g/wAd4P8jPeT/jpvx/5Cc8v+RnvL/k6Dy/5Wh8v+Wo/P/mKTz/5qm8/+bp/P/nanz/5+r + 8/+hrPT/oq30/z5V6P8AH+H/AB/h/wAf4f8AH+H/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/LEnt/2V9 + /f9lff3/ZX79/1929/8AAJf/AACX/wAAl98AAAAA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAAAAAAAAAAACXcAAAl/8AAJf/AAKp/wAFxv8ABcb/AAXG/wAFxv8ABcb/AAXG/wAF + xv8ABcb/ABLZ/wAU3P8AFNz/ABXc/wAV3P8AFdz/ABXc/wAV3f8AFd3/ABXd/wAV3f8AFd3/ABbd/wAW + 3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAX3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX + 3f8AF93/ABfe/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAZ3v8AGd7/ABne/wAZ + 3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGt7/ABre/wAa3v8AGt//ABrf/wAa3/8AGt//ABrf/wAa + 3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABzf/1Fj6f+RnfL/kp7y/5Sg + 8v+WofL/mKPy/5mk8/+bpvP/najz/56p8/+gq/P/oqz0/6Ou9P+lr/T/p7H0/z9V6P8AHeD/AB7g/wAe + 4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe4P8TMOb/Z3/9/2d//f9ngP3/Z4D9/w0QpP8AAJf/AACX/wAA + lxD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAJfPAACX/wAA + l/8AA7f/AAXG/wAFxv8ABcb/AAXG/wAFxv8ABcb/AAXG/wAHyv8AEtv/ABPc/wAT3P8AE9z/ABPc/wAT + 3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU + 3P8AFdz/ABXc/wAV3P8AFdz/ABXd/wAV3f8AFd3/ABXd/wAV3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW + 3f8AFt3/ABbd/wAW3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3f8AF97/ABje/wAY + 3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY3v8AGN7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ + 3v8AGd7/ABne/wAa3v8AGt7/gI3v/5Se8v+VoPL/l6Ly/5mj8v+apfL/nKby/56o8/+fqfP/oavz/6Os + 9P+lrvT/pq/0/6ix9P+psvT/oavz/yA54/8AHN//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzg/wAc + 4P9ogf3/aYH9/2mC/f9pgv3/ISm3/wAAl/8AAJf/AACXQP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAAAAAACXEAAAl/8AAJf/AACa/wAExf8ABMX/AATF/wAExf8ABMX/AATG/wAE + xv8ABMb/AAvR/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEtv/ABLb/wAS + 2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS2/8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT + 3P8AE9z/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABXc/wAV3P8AFdz/ABXc/wAV + 3f8AFd3/ABXd/wAV3f8AFd3/ABXd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAX + 3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3f8AF93/ABfd/wAY3v8AGN7/ABje/xwx4f+Vn/H/lqDx/5ii + 8v+ao/L/nKXy/52n8v+fqPP/oarz/6Kr8/+krfP/pq7z/6ew8/+psfT/q7P0/6y09P+utvT/mqTy/wsk + 4P8AGt7/ABrf/wAa3/8AGt//ABrf/wAa3/8AGt//ABvf/1Bp9f9qg/3/aoT9/2qE/f81Qsr/AACX/wAA + l/8AAJdg////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAJdgAACX/wAA + l/8AAaj/AATF/wAExf8ABMX/AATF/wAExf8ABMX/AATF/wAExf8ADdb/AA/a/wAP2v8AD9r/AA/a/wAP + 2v8AD9r/AA/a/wAP2v8AD9r/ABDa/wAQ2v8AENr/ABDa/wAQ2v8AENv/ABDb/wAQ2/8AENv/ABHb/wAR + 2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAS2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS + 2/8AEtv/ABLb/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAU3P8AFNz/ABTc/wAU + 3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFdz/ABXc/wAV3P8AFdz/ABXd/wAV3f8AFd3/ABXd/wAV + 3f8AFt3/ABbd/wAW3f8AFt3/Xmzq/5ih8f+ZovL/m6Ty/52m8v+ep/L/oKny/6Kq8v+kq/L/pa3z/6ev + 8/+psPP/qrL0/6yz9P+ttfT/r7f1/7G49f+zuvX/cX7s/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAZ + 3v8AGd7/PFXv/2yF/f9shv3/bIb9/0pc3f8AAJf/AACX/wAAl4D///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAAAAAAAAl58AAJf/AACX/wACs/8AA8T/AAPE/wADxP8AA8T/AAPE/wAD + xP8AA8T/AATH/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAO2v8ADtr/AA7a/wAO + 2v8ADtr/AA7a/wAO2v8ADtr/AA7a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAQ + 2v8AENr/ABDa/wAQ2v8AENr/ABDb/wAQ2/8AENv/ABDb/wAQ2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR + 2/8AEdv/ABHb/wAR2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS2/8AEtz/ABPc/wAT + 3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABTc/wAU3P8AFNz/ABTc/wod3f+ZofH/m6Px/5yk + 8f+epvH/oKfy/6Gp8v+jqvL/pazz/6eu8/+or/P/qrH0/6uy9P+ttPT/r7X0/7C39f+yufX/tLr1/7W8 + 9f+3vfX/LkDj/wAW3f8AFt3/ABbd/wAW3f8AF93/ABfd/wAX3f83T+3/bYf9/26I/f9uiP3/Umbk/wAA + l/8AAJf/AACXn////wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAACX3wAA + l/8AAJf/AALA/wADw/8AA8P/AAPD/wADw/8AA8P/AAPD/wADw/8ABsz/AAvY/wAL2P8AC9j/AAvZ/wAL + 2f8AC9n/AAvZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM2f8ADdn/AA3Z/wAN + 2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADtn/AA7a/wAO2v8ADtr/AA7a/wAO2v8ADtr/AA7a/wAO + 2v8ADtr/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/ABDa/wAQ2v8AENr/ABDa/wAQ + 2v8AENv/ABDb/wAQ2/8AENv/ABDb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAS + 2/8AEtv/ABLb/wAS2/8AEtv/TVrm/5yj8f+epPH/n6bx/6Go8v+jqfL/pKvy/6as8/+orvP/qbDz/6ux + 9P+ss/T/rrT0/7C29P+yt/T/s7n0/7W79P+3vfX/uL71/7q/9f+Nlu//ABTc/wAU3P8AFdz/ABXc/wAV + 3P8AFdz/ABXd/yM55/9vif3/b4r9/2+K/f9hePD/AACX/wAAl/8AAJe/////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAlxAAAJf/AACX/wAAn/8AAsL/AALC/wACwv8AAsL/AALC/wAC + wv8AAsL/AALD/wAG0f8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAJ2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK + 2P8ACtj/AArY/wAK2P8ACtj/AAvY/wAL2P8AC9j/AAvY/wAL2P8AC9n/AAvZ/wAL2f8AC9n/AAzZ/wAM + 2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN + 2f8ADdn/AA3Z/wAO2f8ADtr/AA7a/wAO2v8ADtr/AA7a/wAO2v8ADtr/AA7a/wAP2v8AD9r/AA/a/wAP + 2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAP2v8AENr/ABDa/wAQ2v8AENr/ABDa/xQi3f+do/H/n6Xx/6Cm + 8f+iqPL/pKny/6Wr8v+nrfP/qa7z/6qw8/+ssvP/rrPz/6+18/+xt/T/s7j0/7W69P+2u/X/uL31/7q+ + 9f+7wPb/vMH2/7zB9v8jM+D/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/HDHk/3GL/f9xjP3/cYz9/3GM + /f8AAJf/AACX/wAAl7////8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACXQAAA + l/8AAJf/AAGn/wACwf8AAsL/AALC/wACwv8AAsL/AALC/wACwv8AAsL/AAbV/wAH1/8AB9f/AAfX/wAH + 1/8AB9f/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAnX/wAJ1/8ACdj/AAnY/wAJ + 2P8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAK2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK + 2P8AC9j/AAvY/wAL2P8AC9j/AAvY/wAL2f8AC9n/AAvZ/wAL2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM + 2f8ADNn/AAzZ/wAM2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA7a/wAO + 2v8ADtr/AA7a/wAO2v8ADtr/d37r/6Cl8f+ip/H/o6jy/6Wq8v+nrPL/qK3y/6qv8v+ssPP/rbLz/6+0 + 8/+xtfT/srf0/7S59P+2uvX/t7z1/7m99f+7v/X/vMD2/7zA9v+8wPb/vMD2/wwc3P8AEdv/ABHb/wAR + 2/8AEdv/ABHb/wAR2/8dMOT/co39/3KO/f9yjv3/c479/wAAl/8AAJf/AACXv////wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAJeAAACX/wAAl/8AAa7/AAHB/wABwf8AAcH/AAHB/wAB + wf8AAcH/AAHB/wACxf8ABdb/AAXW/wAF1v8ABdb/AAXW/wAG1v8ABtb/AAbW/wAG1v8ABtb/AAbW/wAG + 1/8ABtf/AAbX/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH1/8ACNf/AAjX/wAI + 1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACdf/AAnY/wAJ2P8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAJ + 2P8ACdj/AArY/wAK2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK2P8ACtj/AAvY/wAL2P8AC9j/AAvY/wAL + 2P8AC9j/AAvZ/wAL2f8AC9n/AAvZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/0ZP5P+hpvH/o6fx/6Sp + 8f+mqvH/qKzy/6mt8v+rr/L/rbHz/66z8/+wtPP/srb0/7O49P+1ufT/t7r0/7m89f+6vvX/vL/1/7zA + 9f+8wPX/vMD1/7zA9f+wtfP/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/x0v4/90j/3/dJD9/3SQ + /f90kP3/AACX/wAAl/8AAJe/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + l58AAJf/AACX/wABtv8AAcD/AAHA/wABwP8AAcD/AAHA/wABwP8AAcD/AALJ/wAD1f8AA9X/AAPV/wAD + 1f8ABNX/AATV/wAE1v8ABNb/AATW/wAE1v8ABNb/AATW/wAE1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAF + 1v8ABdb/AAXW/wAF1v8ABdb/AAbW/wAG1v8ABtb/AAbW/wAG1v8ABtb/AAbX/wAG1/8ABtf/AAfX/wAH + 1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI + 1/8ACNf/AAjX/wAJ1/8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAK2P8ACtj/AArY/wAK + 2P8ACtj/AArY/wAK2P8UHdv/oqbw/6Sn8f+mqfH/p6vy/6ms8v+qrvL/rLDz/66y8/+ws/P/sbXz/7O3 + 9P+1uPT/trr0/7i79P+6vfT/u771/7y/9f+8v/X/vL/1/7y/9f+8v/X/vMD1/4GI7P8ADdn/AA3Z/wAN + 2f8ADdn/AA3Z/wAN2f8ADdn/HS7i/3WR/P92kvz/dpL8/3aS/P8AAJf/AACX/wAAl7////8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAACXvwAAl/8AAJf/AAC6/wAAv/8AAL//AAC//wAA + v/8AAL//AAC//wAAv/8AAcz/AAHV/wAB1f8AAdX/AALV/wAC1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC + 1f8AAtX/AAPV/wAD1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAE1f8ABNb/AATW/wAE + 1v8ABNb/AATW/wAE1v8ABNb/AATW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAG + 1v8ABtb/AAbW/wAG1v8ABtb/AAbW/wAG1v8ABtf/AAbX/wAG1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH + 1/8AB9f/AAfX/wAH1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/98gOv/p6rx/6ir + 8v+qrfL/rK/y/62x8v+vsvP/sbTz/7K18/+0t/P/trjz/7i69P+5vPT/u731/7y/9f+8v/X/vL/1/7y/ + 9f+8v/X/vL/1/7y/9f+8v/X/Ulnl/wAL2P8AC9j/AAvZ/wAL2f8AC9n/AAvZ/wAM2f87T+r/d5P8/3eT + /P93lPz/d5T8/wAAl/8AAJf/AACXv////wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAJe/AACX/wAAl/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAA0P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAB1P8AAdT/AAHU/wAB1P8AAdT/AAHU/wAB + 1P8AAdX/AAHV/wAB1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8AA9X/AAPV/wAD + 1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAD1f8ABNX/AATV/wAE1v8ABNb/AATW/wAE1v8ABNb/AATW/wAE + 1v8ABNb/AAXW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAbW/wAG1v8ABtb/AAbW/wAG + 1v8ABtb/AAbX/wAG1/8ABtf/AAbX/wsR2P+Ul+7/q67y/62v8v+vsfL/sLLy/7K08/+0tvP/tbfz/7e5 + 9P+5u/T/u7z1/7y+9f+8vvX/vL71/7y+9f+8vvX/vL71/7y/9f+8v/X/vL/1/7y/9f8YH9v/AAnY/wAJ + 2P8ACdj/AAnY/wAJ2P8ACtj/AArY/zxP6v95lfz/eZX8/3mW/P9qg+//AACX/wAAl/8AAJe/////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAl/8AAJf/AACX/wAAv/8AAL//AAC//wAA + v/8AAL//AAC//wAAv/8AAL//AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AAHU/wAB1P8AAdT/AAHU/wAB1P8AAdT/AAHU/wAB1f8AAdX/AALV/wAC + 1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8AAtX/AALV/wAD1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAD + 1f8AA9X/AAPV/wAE1f8ABNX/AATW/wAE1v8ABNb/AATW/wAE1v8fI9v/Ki3d/wAF1v8ABdb/AAXW/yAk + 2/+jpfD/sLHy/7Kz8/+ztPP/tbbz/7e49P+4uvT/urv0/7y99P+8vvT/vL70/7y+9P+8vvX/vL71/7y+ + 9f+8vvX/vL71/7y+9f+8vvX/jZDt/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAjX/wAI1/8ACNf/XHPz/3qX + /P96mPz/e5j8/1xy4/8AAJf/AACX/wAAl5////8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAACX/wAAl/8AAJ//AAC//wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAAwv8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AAdT/AAHU/wAB1P8AAdT/AAHU/wAB1P8AAdX/AAHV/wAB1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC + 1f8AAtX/NDbd/52d7v+Ule3/AAPV/wAD1f8AA9X/AAPV/yEk2v+nqPH/tLXz/7a38/+4ufP/ubrz/7u8 + 9P+8vfT/vL30/7y99P+8vfT/vL30/7y99P+8vfT/vL70/7y+9P+8vvT/vL70/7y+9P8vM97/AAXW/wAF + 1v8ABdb/AAXW/wAG1v8ABtb/AAbW/wAG1v90kPr/fJn8/3yZ/P98mvz/VWrc/wAAl/8AAJf/AACXgP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJf/AACX/wAAof8AAL//AAC//wAA + v/8AAL//AAC//wAAv/8AAL//AADE/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/CgvW/3Nz5/+oqPD/qqrx/6us8f9WV+P/AAHU/wAB + 1P8AAdT/AAHU/yIj2v+srPH/ubnz/7u78/+8vfT/vL30/7y99P+8vfT/vL30/7y99P+8vfT/vL30/7y9 + 9P+8vfT/vL30/7y99P+8vfT/jY7s/wAD1f8AA9X/AAPV/wAD1f8ABNX/AATW/wAE1v8ABNb/GCDd/32b + /P9+m/z/fpv8/36c/P8/Tsr/AACX/wAAl/8AAJdg////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAl/8AAJf/AACh/wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAMf/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/CgrW/1NT + 4v+dne7/qanx/6ur8f+trfH/rq7y/7Cw8v8hIdr/AADU/wAA1P8AANT/AADU/wwM1v+YmO7/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vfT/vL30/7y99P+8vfT/vL30/7y99P8vMNz/AAHV/wAB + 1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8/UOj/f538/3+d/P9/nfz/f578/ygxt/8AAJf/AACX/wAA + l0D///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACX/wAAl/8AAJz/AAC//wAA + v/8AAL//AAC//wAAv/8AAL//AAC//wAAyv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/NDTd/2ho5v+dne7/qanw/6qq8f+srPH/rq7y/6+v8v+xsfL/s7Py/5OT + 7P8LC9b/AADU/wAA1P8AANT/AADU/wAA1P9qaub/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/amrm/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/3GL + 9/+Bn/z/gZ/8/4Gf/P+BoPz/EBSk/wAAl/8AAJf/AAAAAP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAJfvAACX/wAAl/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAL//AADK/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/xQU1/9bW+P/e3vo/6Wl8P+np/D/qKjw/6qq + 8f+srPH/ra3x/6+v8v+xsfL/srLy/7S08v+2tvL/uLjz/4uL6/8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8vL9z/paXw/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/6Wl8P8MDNb/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8hKN7/gqH8/4Kh/P+Cofz/g6H8/3KN7/8AAJf/AACX/wAA + l88AAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAl78AAJf/AACX/wAA + v/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAMr/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAAyf8AAL3/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/KSnb/6Sk7/+mpvD/qKjw/6mp8f+rq/H/ra3x/6+v8v+wsPL/srLy/7Oz8v+1tfL/t7fz/7m5 + 8/+6uvP/vLz0/3Z26P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/Xl7k/7Cw8v+8vPT/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+wsPL/IyPa/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/1Jm + 7f+Eo/z/hKP8/4Sj/P+Eo/z/UmbW/wAAl/8AAJf/AACXnwAAAAD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAACXvwAAl/8AAJf/AAC1/wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAA + yv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AAND/AACX/wAAl/8AAK7/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8KCtb/p6fw/6mp8P+qqvH/rKzx/66u + 8v+wsPL/sbHy/7Oz8v+1tfL/trby/7i48/+6uvP/u7v0/7y89P+8vPT/vLz0/3Z26P8MDNb/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/DAzW/15e5P+lpfD/vLz0/7y89P+8vPT/vLz0/zs73v8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8RFdn/haX8/4Wl/P+Gpfz/hqX8/4al/P8qNLf/AACX/wAA + l/8AAJdQAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJeAAACX/wAA + l/8AALP/AAC//wAAv/8AAL//AAC//wAAv/8AAL//AADK/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAAzP8AAJf/AACX/wAAl/8AAMH/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P+Kiuv/rKzx/62t8f+vr/L/sbHy/7Oz8v+0tPL/trby/7i48/+5ufP/u7vz/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/vLz0/5mZ7v8YGNj/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P87O97/dnbo/6Wl8P9HR+D/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/2V9 + 8v+Hp/z/h6f8/4en/P+Hp/z/f532/wAAl/8AAJf/AACX/wAAlxAAAAAA////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAl2AAAJf/AACX/wAAqf8AAL//AAC//wAAv/8AAL//AAC//wAA + v/8AAMr/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAAsv8AAJf/AACX/wAA + m/8pM93/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/2Fh5f+vr/L/sLDy/7Ky + 8v+0tPL/tbXy/7e38/+5ufP/u7vz/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7Cw + 8v9HR+D/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8iKt7/ian8/4mp/P+Jqfz/ian8/4mp/P9Vatb/AACX/wAA + l/8AAJevAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACXMAAA + l/8AAJf/AACf/wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAAyv8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADQ/wAAov8AAJf/AACX/yEpsP9LXev/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/ISHa/7Ky8v+zs/L/tbXy/7e38v+4uPP/urrz/7y89P+8vPT/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+Njez/Ly/c/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/CQvX/3mV + 9/+Kq/z/iqv8/4qr/P+Kq/z/iqv8/xogqv8AAJf/AACX/wAAl2AAAAAAAAAAAP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAAAAAACX7wAAl/8AAJf/AAC9/wAAv/8AAL//AAC//wAA + v/8AAL//AADH/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADJ/wAA + l/8AAJf/AACX/0xe0P9lffL/CQvX/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/np7u/7a2 + 8v+4uPP/ubnz/7u79P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/mZnu/1JS4v8YGNj/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P9XbO3/i6z8/4us/P+LrPz/i6z8/4us/P9ogeP/AACX/wAA + l/8AAJfvAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + AAAAAJefAACX/wAAl/8AALD/AAC//wAAv/8AAL//AAC//wAAv/8AAMT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AAC2/wAAl/8AAJf/AACX/2+J6f+An/r/Iive/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P9FReD/ubnz/7u78/+8vPT/vLz0/7y89P+8vPT/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/42N + 7P8YGNj/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/NEHj/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/yMrsP8AAJf/AACX/wAAl4AAAAAAAAAAAAAAAAD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAl2AAAJf/AACX/wAAof8AAL//AAC//wAA + v/8AAL//AAC//wAAwP8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AACm/wAAl/8AAJf/CQud/3mW7/+Lq/z/RVbo/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P+kpPD/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/vLz0/4GB6v8vL9z/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/xog3P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P9ogeP/AACX/wAA + l/8AAJfvAACXEAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAAAAAACXEAAAl+8AAJf/AACX/wAAuv8AAL//AAC//wAAv/8AAL//AAC//wAA0/8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AAND/AACf/wAAl/8AAJf/GiCq/4Kh + 9v+LrPz/aIHy/xEW2f8AANT/AADU/wAA1P8AANT/AADU/yMj2v92duj/paXw/7y89P+8vPT/vLz0/7y8 + 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/jY3s/1JS4v8YGNj/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8aINz/gqH6/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/xogqv8AAJf/AACX/wAAl4AAAAAAAAAAAAAAAAAAAAAA////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAACXnwAAl/8AAJf/AACm/wAA + v/8AAL//AAC//wAAv/8AAL//AADN/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wwM1v8vL9H/BASc/wAAl/8AAJf/GiCq/4Kh9v+LrPz/gqH6/z1L5v8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/GBjY/0dH4P9eXuT/gYHq/42N7P+Njez/jY3s/42N7P+Njez/jY3s/2pq + 5v9eXuT/Ly/c/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/GiDc/4Kh+v+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P9OYdD/AACX/wAA + l/8AAJfvAACXEAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAAAAAAAAAAAAAJcgAACX/wAAl/8AAJf/AAC6/wAAv/8AAL//AAC//wAAv/8AAMj/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8FBdX/QkLf/0tL4f84OMr/AACX/wAA + l/8AAJf/GiCq/4Kh9v+LrPz/i6z8/2iB8v8aINz/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/zRB4/+Cofr/i6z8/4us + /P+LrPz/i6z8/4us/P+LrPz/cYzp/wkLnf8AAJf/AACX/wAAl3AAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAJe/AACX/wAA + l/8AAKb/AAC//wAAv/8AAL//AAC//wAAwv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/BQXV/0FB3/9UVOL/WVnj/15e5P8+Psj/AACX/wAAl/8AAJf/GiCq/4Kh9v+LrPz/i6z8/4us + /P9OYev/CQvX/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P9OYev/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4Kh9v8aIKr/AACX/wAA + l/8AAJe/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAAAAAAAAAAAAAAAAAlzAAAJf/AACX/wAAl/8AALX/AAC//wAAv/8AAL//AAC//wAA + 0P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wYG1f9ISOD/XFzk/2Fh5P9mZuX/a2vm/0xM + zv8AAJf/AACX/wAAl/8AAJf/CQud/3GM6f+LrPz/i6z8/4us/P+Cofr/Rlbo/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8aINz/cYz1/4us/P+LrPz/i6z8/4us + /P+LrPz/i6z8/4us/P+LrPz/NEG9/wAAl/8AAJf/AACX7wAAlyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA + l58AAJf/AACX/wAAnP8AAL3/AAC//wAAv/8AAL//AADI/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8GBtX/Tk7h/2Rk5f9paeb/bm7n/3Nz5/9oaN7/Bwec/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/05h + 0P+LrPz/i6z8/4us/P+LrPz/epf3/z1L5v8JC9f/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8JC9f/TmHr/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/zRBvf8AAJf/AACX/wAA + l/8AAJdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAACXEAAAl+8AAJf/AACX/wAApv8AAL//AAC//wAA + v/8AAMD/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/BwfV/1VV4v9sbOb/cXHn/3Z26P97e+n/eHjk/xgY + pv8AAJf/AACX/wAAl88AAJdQAACX7wAAl/8AAJf/AACX/yMrsP96l+//i6z8/4us/P+LrPz/i6z8/4Kh + +v9OYev/ERbZ/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8JC9f/Rlbo/4Kh+v+LrPz/i6z8/4us/P+LrPz/i6z8/4us + /P+LrPz/i6z8/4us/P80Qb3/AACX/wAAl/8AAJf/AACXjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACXUAAAl/8AAJf/AACX/wAAsP8AAL//AAC//wAAv/8AAMz/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wcH + 1f9bW+T/dHTo/3p66P9/f+n/hITq/4mJ6/80NLf/AACX/wAAl/8AAJfvAACXMAAAAAAAAJcQAACXzwAA + l/8AAJf/AACX/wkLnf9OYdD/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/cYz1/z1L5v8RFtn/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8rNuH/V2zt/4Kh + +v+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/NEG9/wAAl/8AAJf/AACX/wAA + l58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXjwAAl/8AAJf/AACX/wAA + sP8AAL//AAC//wAAwv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8ICNX/YmLl/3196f+Cgur/h4fr/4yM7P+Rkez/Nze3/wAA + l/8AAJf/AACX/wAAl2AAAAAAAAAAAAAAAAAAAAAAAACXgAAAl/8AAJf/AACX/wAAl/8jK7D/cYzp/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P96l/f/V2zt/z1L5v8jK97/GiDc/wAA1P8AANT/AADU/wAA + 1P8aINz/Iyve/0ZW6P9gdvD/gqH6/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us + /P+LrPz/gqH2/yMrsP8AAJf/AACX/wAAl/8AAJefAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACXvwAAl/8AAJf/AACX/wAAsP8AAMD/AADA/wAAyv8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/GBjY/3Fx + 5/+Fher/iorr/4+P7P+Vle3/mpru/zo6uP8AAJf/AACX/wAAl/8AAJeAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACXMAAAl98AAJf/AACX/wAAl/8AAJf/NEG9/3qX7/+LrPz/i6z8/4us/P+LrPz/i6z8/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/2iB4/8JC53/AACX/wAAl/8AAJf/AACXnwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXzwAA + l/8AAJf/AACX/wAAsf8AAMH/AADC/wAA0v8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/yoq2/+AgOr/jo7s/5OT7f+YmO7/nZ3u/6Ki7/89Pbj/AACX/wAA + l/8AAJf/AACXnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl4AAAJf/AACX/wAA + l/8AAJf/AACX/zRBvf96l+//i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/3qX + 7/80Qb3/AACX/wAAl/8AAJf/AACX/wAAl3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXzwAAl/8AAJf/AACX/wAAqv8AAML/AADI/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P9ISOD/kZHs/5aW + 7f+bm+7/oKDv/6Wl8P+fn+v/ICCo/wAAl/8AAJf/AACX/wAAl58AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJe/AACX/wAAl/8AAJf/AACX/wAAl/8rNrf/YHbc/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/3qX7/89S8P/AACX/wAAl/8AAJf/AACX/wAAl+8AAJdAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJcQAACXzwAAl/8AAJf/AACX/wAAov8AAL7/AADN/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8TE9f/eXno/5mZ7v+enu//o6Pv/6mp8P+urvH/eXnV/wsLnf8AAJf/AACX/wAA + l/8AAJefAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAJdAAACXvwAAl/8AAJf/AACX/wAAl/8AAJf/ERak/z1Lw/9gdtz/i6z8/4us/P+LrPz/i6z8/4us + /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/gqH2/1ds2v8rNrf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJefAACXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXrwAAl/8AAJf/AACX/wAA + mv8AALD/AADR/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/TU3h/5OT7f+hoe//p6fw/6ys + 8f+xsfL/qqrt/zk5tP8AAJf/AACX/wAAl/8AAJf/AACXYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQAAAl68AAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/Iyuw/0ZWyv9gdtz/aIHj/4Kh9v+LrPz/i6z8/4us/P+LrPz/i6z8/2iB + 4/9gdtz/RlbK/yMrsP8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJe/AACXQAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACXcAAAl/8AAJf/AACX/wAAl/8AAJ7/AAC9/wAA1P8ICNX/BATV/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/PDze/4yM7P+lpfD/qqrx/6+v8v+0tPL/ra3t/11dxf8MDJ3/AACX/wAAl/8AAJf/AACX3wAA + lzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJePAACX3wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA + l/8AAJe/AACXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXMAAA + l88AAJf/AACX/wAAl/8AAJf/AACf/wQEvv85Odr/Kirb/wYG1f8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8KCtb/PT3e/4+P7P+oqPD/ra3x/7Ky8v+3t/P/o6Po/15e + xf8MDJ3/AACX/wAAl/8AAJf/AACX/wAAl68AAJcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACXMAAAl48AAJfPAACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl88AAJdwAACXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJfvAACX/wAAl/8AAJf/AACX/wUF + nP8iIrT/PT3L/0ND3/8kJNr/BwfV/wAA1P8AANT/AADU/wAA1P8AANT/AADU/xQU1/88PN7/Zmbl/5yc + 7v+rq/H/sLDy/7W18v+uru3/dXXR/zs7tP8AAJf/AACX/wAAl/8AAJf/AACX/wAAl98AAJdAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXQAAA + l4AAAJevAACXvwAAl98AAJf/AACX/wAAl/8AAJf/AACX7wAAl78AAJevAACXgAAAl1AAAJcQAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAlxAAAJeAAACX7wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/x4eq/83N7v/QkLI/0VF + 0f9kZOH/cXHn/3V16P+Wlu3/pKTw/6mp8P+YmOb/hYXb/3Jy0P9RUb//IyOo/wAAl/8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl98AAJdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXcAAA + l88AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl78AAJdgAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlzAAAJeAAACXzwAAl/8AAJf/AACX/wAA + l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACXvwAA + l3AAAJcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACXEAAAl0AAAJeAAACXnwAAl78AAJfPAACX/wAAl/8AAJf/AACX/wAA + l/8AAJfPAACXvwAAl58AAJdwAACXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////8A////////////////////AAH/////////////// + ///wAAD/////////////////8AAAD/////////////////AAAAD////////////////wAAAAH/////// + ////////8AAAAAH///////////////AAAAAAP//////////////wAAAAAA//////////////8AAAAAAB + /////////////+AAAAAAAH/////////////gAAAAAAAP////////////4AAAAAAAA////////////8AA + AAAAAAD////////////AAAAAAAAAP///////////wAAAAAAAAB///////////4AAAAAAAAAH//////// + //+AAAAAAAAAAf//////////AAAAAAAAAAD//////////wAAAAAAAAAAP/////////4AAAAAAAAAAB// + ///////+AAAAAAAAAAAH/////////AAAAAAAAAAAA/////////wAAAAAAAAAAAH////////4AAAAAAAA + AAAA////////8AAAAAAAAAAAAD////////AAAAAAAAAAAAAf///////gAAAAAAAAAAAAD///////4AAA + AAAAAAAAAAf//////8AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAAf//////AAAAAAAAAAAAAAD///// + /wAAAAAAAAAAAAAAf/////4AAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAA + H/////gAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAH////4AAAAAAAAAAAAAAAB////8AAAAAAAAAA + AAAAAAP///+AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAD///4AAAAA + AAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAP//4 + AAAAAAAAAAAAAAAAAD//8AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAH//gAAAAAAAAAAAAAAAA + AB//4AAAAAAAAAAAAAAAAAAf/+AAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAA + AAAAAAAP/4AAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH/wAAAAAA + AAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/4A + AAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAA + AAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAA + AAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAP/gAAAAAA + AAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAD/4A + AAAAAAAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAA + AD//AAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAf/+AAAAAAAAAAAAAAAAAAH//gAAAAAAAAAAA + AAAAAAD//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//4AAAAAAAAAAAAAAAAAP//+AAAAAA + AAAAAAAAAAAH///wAAAAAAAAEAAAAAAAD///+AAAAAAAADwAAAAAAB////wAAAAAAAB+AAAAAAA////8 + AAAAAAAA/4AAAAAAf////gAAAAAAAf/AAAAAAP////8AAAAAAAP/8AAAAAH/////gAAAAAAH//wAAAAH + /////+AAAAAAD///AAAAH//////wAAAAAB///+AAAH///////AAAAAB////8AAP///////4AAAAB//// + ////////////gAAAB/////////////////AAAB/////////////////+AAH///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////KAAAADAA + AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAlzUAAZjdAAGX1wAAkr8AAJCqAACRlQAAk3UAAJU5AACWCf///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAlDoADaz8AETg/wA60f8ALcX/ACS8/wAbsv8AD6b+AAOa2QAA + k6EAAJNqAACWQgAAlhb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAklQACLX/AE35/wBw//8Aa///AGj//wBl + /f8AYvr/AFXt/wA+1v8BG7X/AQOc/wEAl/EAAJGwAgOfSgoMyA3///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAkocACr7/ADbx/wBn + /v8AZf3/AGb+/wBm/v8AZv//AGn//wBr//8AZv7/AVfz/wJE4v8GKtD/Bgav/wIAm+QAAJasBQarVwUH + qwP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACXBAAA + lcsAD8j/ACzu/wBk/f8AZv3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZv7/AGj//wBr//8Baf//B1H9/w0p + 4f8IB7D/AgCY/wEBmswDBKE9////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAACWMAABmPkAFNb/ACrr/wBk/P8AZv3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl + /f8AZf3/AGr+/wJm//8IVP3/ETDp/xUU0P8FA6L5AACQwgAAlFgAAJcD////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAACUagAGqv8AFuH/ADHr/wBi/P8AYfz/AGH8/wBh/P8AY/z/AGT9/wBl + /f8AZf3/AGX9/wBk/P8AY/z/AGP9/wBk/f8AaP7/AmX//xBR//8bMfL/FBTG/wUFo/8AAJS1AACWOAAA + lwH///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAJYQAACX2QAT0f8AFeL/AD7v/wBi/P8AX/v/AGH7/wBe + +v8AWvn/AFT3/wBL9P8ARvH/AEnz/wBZ+P8AX/v/AF77/wBe+/8AX/r/AGD6/wBj+/8CYf7/Gkj//ysu + +v8VGMn/AACT/wAAk4D///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJOGAAWn/wAW4P8AG+H/AEny/wBM + 8/8AQu//ADns/wAt5/8AHuL/ACDk/wAn5v8AMur/AEHw/wBW+P8AWvn/AFr5/wBa+f8AWvn/AFv5/wBb + +f8AXfn/Alz6/xdK/v8qPv//ICTZ/wcJpv8AAJK1AACWIf///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAljMAAJT6AA7D/wAX + 4P8AGt//ABzg/wAW3f8AEtz/ABHb/wAa3/8ANuv/AE30/wBT9v8AV/f/AFj3/wBU9/8AVPf/AFX3/wBV + 9/8AVff/AFb3/wBW9/8AVvf/AFf3/wBa9/8IU/n/LkT//zI6+P8TGL7/AACT4QAAljj///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA + lKsACbX/ABXd/wAU3P8AE9v/ABLa/wAT2/8AKeT/AD7t/wBK8v8AUfX/AFD1/wBP9P8AT/T/AE/0/wBQ + 9f8AUPX/AFD1/wBQ9P8AUfT/AFH1/wBQ9f8AUfX/AFL1/wBS9f8AU/X/BFH2/yZJ/f88Rf//HiXO/wAA + luoAAJVS////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAACVaAADn/8AEtf/ABTb/wAS2f8AEdj/ABjb/wA46v8ATPP/AEzz/wBK8v8ASfL/AEry/wBK + 8v8ASvL/AEvy/wBL8/8AS/P/AEvz/wBM8/8ATPP/AEzz/wBM8/8ATfP/AE3z/wBN9P8ATfT/AE/z/wFO + 9P8mS/v/Qk7//yEp0f8AAJH6AACVVP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAJYeAACV3wALv/8AE9r/ABDX/wAR1/8ALOX/AD/u/wBG8f8ARPD/AETw/wBF + 8P8ARfD/AEXw/wBF8P8ARvH/AEbx/wBG8f8AR/H/AEfx/wBH8f8AR/H/AEjx/wBI8f8ASPL/AEjy/wBJ + 8v8ASfL/AEny/wBK8v8ASvH/I0z6/0NQ/v8kLdD/AQKY7AAAlT////8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAlxgAAJS+AAey/wAR2f8ADtX/ABXZ/wAw5v8AQe//AEDu/wA+ + 7v8APu7/AD/u/wA/7v8AP+7/AEDu/wBA7v8AQO7/AEHv/wBB7/8AQe//AEHv/wBC7/8AQu//AELv/wBC + 7/8AQ+//AEPw/wBD8P8AQ/D/AETw/wBE8P8ARPD/AETw/yhO+f9MW///Ji/Q/wAAkt8AAJYi////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AAAAlKwAAp//AA7Q/wAO1P8AFdj/ADLo/wA8 + 7P8AOev/ADns/wA67P8AOuz/ADrr/wA67P8AO+z/ADvs/wA77P8AO+z/ADzt/wA87f8APO3/AD3s/wA9 + 7P8APe3/AD3t/wA+7f8APu3/AD7u/wA+7v8AP+7/AD/t/wA/7v8AP+7/AEDu/wNB7v89Vvz/Tl3//xcc + t/8AAJKf////AP///wD///8A////AP///wD///8A////AP///wD///8AAACVZQACnvoAC8b/AA7U/wAS + 1P8ALub/ADfr/wA06v8ANOr/ADXq/wA16v8ANer/ADXq/wA26v8ANur/ADbq/wA26/8AN+v/ADfr/wA3 + 6/8AOOv/ADnr/wA56/8AOOv/ADnr/wA57P8AOez/ADns/wA67P8AO+z/ADrs/wA77P8AO+z/ADvs/wA6 + 6/8OQu//R17//0dW8/8JC6L/AACUYP///wD///8A////AP///wD///8A////AP///wAAAJY8AACW/AAK + wv8ADdT/AAzQ/wAk4P8AMej/AC/n/wAv6P8AMOj/ADDo/wAw6P8AMOj/ADHo/wAx6P8AMej/ADLo/wAy + 6f8AMun/ADLp/wAz6f8AM+n/ADPp/wAz6f8ANOn/ADTp/wA06v8ANOr/ADXq/wA16v8ANer/ADbq/wA2 + 6v8ANur/ADbq/wA36v8ANOn/HUjx/1pt//8rNcz/AACR7gAAlx////8A////AP///wD///8A////AP// + /wAAAJW0AAaz/wAL0f8ACc7/ABra/wAr5v8AKuX/ACrl/wAr5v8AK+b/ACvm/wAr5f8ALOX/ACzm/wAs + 5v8ALOb/AC3m/wAt5v8ALef/AC7n/wAu5v8ALub/AC3n/wAv5/8AL+f/AC/n/wAv5/8AMOj/ADDo/wAv + 5/8AMOf/ADDo/wAx6P8AMej/ADLo/wAy6f8AMen/AzPp/0Je+v9Xafv/FRqv/wAAk2r///8A////AP// + /wD///8A////AAAAlWAAAZ7/AAnL/wAKzv8ACsz/ACDf/wAm5P8AJeP/ACbj/wAm5P8AJuT/ACbk/wAn + 5P8AJ+T/ACfk/wAn5P8AKOT/ACjk/wAo5P8AKeX/ACnl/wAp5f8AKeX/ACrl/wAq5f8AKuX/ACrl/wAr + 5f8AK+b/ACvm/wAr5v8AKub/ACfl/wAm5f8AKub/AC3m/wAt5/8ALef/ACvl/xk/7P9gdf//QE/f/wAA + lcIAAJYC////AP///wD///8AAACXFgAAlOAABK//AAnN/wAHyv8AENL/ACDh/wAg4f8AIeH/ACHi/wAh + 4v8AIeL/ACLi/wAi4v8AIuL/ACPi/wAj4v8AI+L/ACPj/wAk4/8AJOP/ACTj/wAk4/8AJeP/ACXj/wAl + 4/8AJeP/ACbk/wAm5P8AJuT/ACfk/wAj4/8hQ+j/VW/t/zta6/8NMuX/ACHj/wAm5f8AKeX/ACjl/wEo + 5P9KZPn/X3T8/xEVqf8AAJRP////AP///wD///8AAACWVAABnP8ABsP/AAfJ/wAHyf8AFtv/ABvg/wAb + 3/8AG9//ABvg/wAc4P8AHOD/ABzg/wAc4P8AHeD/AB3g/wAd4P8AHuD/AB7h/wAe4f8AHuH/AB/h/wAf + 4f8AH+H/AB/h/wAg4f8AIOH/ACDi/wAg4v8AIeL/ACHi/wAZ4P9CWun/nar0/5mm8/+GlvH/P1nq/wYn + 4/8AIeL/ACPj/wAg4f81UfH/a4H//yQsvP8AAJGS////AP///wD///8AAACVnAADsv8ABsr/AAXG/wAL + zv8AFt7/ABbd/wAW3f8AFt3/ABfe/wAX3v8AF97/ABfd/wAY3f8AGN7/ABje/wAZ3v8AGd7/ABnf/wAZ + 3/8AGt//ABre/wAa3v8AGt//ABvf/wAb3/8AG9//ABzg/wAc4P8AHOD/ABvf/wAX3/9hcuz/mqbz/5ik + 8/+gq/P/rLX1/25/7f8AF9//AB3g/wAc3/8VMuf/bIb//zZDzP8AAJG2////AP///wAAAJYZAAGa6QAE + wP8ABMb/AAPF/wAM0/8AEtz/ABHb/wAR3P8AEtz/ABLc/wAS3P8AE9z/ABPc/wAT3P8AE9z/ABTc/wAU + 3f8AFN3/ABTd/wAV3f8AFt3/ABXd/wAW3f8AFt3/ABbd/wAW3v8AF97/ABfe/wAX3v8AGN7/ABPd/xcr + 4f+OmfH/naby/5+o8/+jrPP/qbL0/6629f9GWef/ABXe/wAY3/8EHuD/YXv+/01f3/8AAJbL////AP// + /wAAAJVjAAGh/wADxP8AA8T/AAPE/wAK1f8ADNr/AAzZ/wAN2v8ADdr/AA3a/wAN2v8ADtr/AA7a/wAO + 2v8AD9r/AA/a/wAP2/8AD9v/ABDb/wAQ2/8AENv/ABHb/wAR2/8AEdv/ABHb/wAS3P8AEtz/ABLc/wAS + 3P8AEtz/AA3a/2Jt6f+nrfP/oqny/6et8/+rsfT/r7X0/7e99f+8wfb/NUbk/wAO3P8AFNz/TWb1/2V8 + 8f8EBZve////AP///wAAAJWjAAGn/wACw/8AAsH/AALE/wAH1v8AB9f/AAfX/wAI1/8ACNj/AAjY/wAI + 2P8ACdf/AAnX/wAJ2P8ACtj/AArY/wAJ2P8AC9n/AAvZ/wAL2f8AC9j/AAzY/wAM2f8ADNn/AA3Z/wAN + 2f8ADdr/AA3a/wAN2v8AB9j/Ljng/6On8f+nq/L/qq7z/66z8/+yt/T/t7v1/7u/9f/Kzvf/YWzp/wAF + 2f8AC9r/Rl3x/3ON+f8HCZ3i////AP///wAAAJTPAACq/wAAwv8AAL7/AAHG/wAC1f8AA9X/AAPV/wAD + 1f8AA9X/AATV/wAE1f8ABNb/AATW/wAF1v8ABdb/AAXW/wAG1v8ABtb/AAbW/wAG1v8AB9f/AAfX/wAH + 1/8ACNf/AAjX/wAI1/8ACNj/AAnY/wAE1/8AANX/VFrk/7i79P+sr/L/sLPz/7W49P+5vPX/vL/1/73A + 9f/Cxfb/O0Th/wAD1/8ACdj/UGfy/3aR+P8HCZ3i////AP///wAAAJXpAACt/wAAwv8AAL7/AADK/wAA + 1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AAHU/wAB1f8AAdX/AAHU/wAB1P8AAdT/AAHU/wAC + 1P8AAtX/AALV/wAC1f8AAtX/AALV/wAB1f8AANT/AADU/xse2f8mKdv/CArX/4OF6//Cw/X/urz0/7u8 + 9P+8vvX/vL71/8bI9v+Qk+3/AwnX/wAD1v8EC9j/bIb6/2uE7f8EBZra////AP///wAAAJXwAACv/wAA + wf8AAL//AADN/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1v8AANX/AADU/wAA1P8AANT/AADU/wMD1f8ZGdn/SEjh/52d7/+bm+7/GRnX/wcH + 1P9zc+f/wsH1/8LD9f+8vPT/v8D0/7m58/8vL9z/AADU/wAA0/8hKt//hqb//1Ro2v8AAJTF////AP// + /wAAAJThAACr/wAAwv8AAL//AADO/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADT/wAAyv8AANP/AADU/wAA1P8AANP/EhLX/4WF6v+mpvD/tLTz/7W1 + 8//BwfT/j4/s/wEB0v8AANH/Ojre/6ys8f/Kyvf/z8/3/3Nz6P8AANP/AADU/wAA0v9PYuz/krX//zxJ + xf8AAJCo////AP///wAAAJXAAACo/wAAwf8AAL//AADO/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANX/AADQ/wAAnv8HCMH/BAXY/wAA1P8AANP/CwvW/5qa + 7/+3t/P/trbz/7m58/+8vPT/wcH1/3t76f8gINn/AADQ/x0d2P9kZOX/dXXo/xYW1/8AANP/AADT/woM + 1v9zj/f/ja///ycxtP8AAJKA////AP///wAAAJWGAACj/wAAwP8AAL//AADN/wAA1f8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADW/wAAv/8OEqD/Lzva/wMD + 1v8AANP/AADS/2Fh5P/IyPX/vr70/7299P+9vfT/vr70/8jI9v+6uvT/bGzn/xAQ1v8AANL/AADT/wAA + 0/8AANT/AADT/1Zq7f+Wuv//fZrx/wkLnfEAAJUl////AP///wAAAJYxAACb+AAAvP8AAL//AADK/wAA + 1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1/8AAKr/Hyeq/2J58P8iKuD/AADQ/yMj2v+cnO//vLz0/8PD9f/Dw/X/wsL1/7y89P+jo/D/Z2fm/xsb + 2f8AANP/AADU/wAA1P8AANH/OUbl/5G0//+Psf7/Ljm5/wAAk4P///8A////AP///wD///8AAACVqgAA + rf8AAMH/AADG/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1f8nJ9j/EhGl/zhFuv9/nfj/Kzbj/wAA0/8BANP/KCjb/0hI4P9KSuD/R0fg/yoq + 2/8GBtX/AADS/wAA0/8AANT/AADT/wAA0v83ROT/iqv8/5i8//9YbNb/AACS+wAAljb///8A////AP// + /wD///8AAACWSgAAmP8AALX/AADD/wAA0f8AANX/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AgLU/zQ03f9wcO3/PDzD/wAAjv0kLK/+epfv/3OO+f8vO+T/AQHS/wAA + 0P8AANH/AADS/wAA0v8AANP/AADT/wAA0v8AANH/Fx3b/1xz7/+Psf7/lrr//3GN6v8PE6H/AACUcv// + /wD///8A////AP///wD///8AAACXBAAAlasAAJ//AAC9/wAAzv8AANX/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8BAdT/R0fg/4mJ7v9gYNP/CQmc7gAAlVcAAJKWDRCf/Vds + 0/+LrPr/Z4H1/zlH5f8hKd7/ERbZ/wgJ1v8JC9b/Exja/ygx4P9CUuf/f5z5/5a6//+VuP//b4ro/xEV + ov8AAJOG////AP///wD///8A////AP///wD///8A////AP///wAAAJWoAACf/wAAw/8AANb/AADV/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADT/wYG1P9iYuX/paX0/35+3f8MDJz/AACUd/// + /wD///8AAACUSQAAktsTGKX/aoPi/5a6//+Ttv//i6z+/4am/P+Fpfz/iKj8/5Cy//+Yu///mLz//4yt + +/9IWsz/BgeZ/wAAk4P///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJcjAACVxwAA + pP8AAMH/AADW/wAA1v8AANT/AADU/wAA1P8AANT/AADU/wAA0/8CAtT/IiLb/3Fx6f+oqPD/Z2fN/w0N + nP8AAJSF////AP///wD///8A////AAAAlyIAAJOcAgOW5ScwtP9WatX/bYfl/36b8f+Eo/b/haX3/36c + 8v9wi+j/WW7Y/ygytP4AAJLaAACVdv///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8AAACXAwAAlZ8AAJb/AACu/w0Nz/8ICNb/AwPX/wYG2f8JCdr/Cwva/x8f3P9ra+f/rq7x/46O + 3P8jI6j/AACT5AAAlU7///8A////AP///wD///8A////AP///wD///8AAACWEgAAk14AAJPDAgKY9wYI + nPwICp3/CAqd/wcInP0DA5n6AACT0AAAkmYAAJcF////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AAAAlwMAAJY0AACUkwYGnO0PD6n/Dw+w/xISt/8dHbv/LS29/0RE + vv9ERLf/ISGn/wUFmNgAAJRrAACXGv///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAJcEAACWHQAAljgAAJVFAACVSQAAljwAAJYmAACXB////wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAliAAAJV3AACTrwAA + ktkAAJLwAACS8AAAktIAAJKfAACVUgAAlxD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///////wAA////////AAD///////8AAP///////wAA//AH////AAD/8AB///8AAP/w + AA///wAA//AAAf//AAD/4AAA//8AAP/gAAAf/wAA/+AAAAf/AAD/wAAAB/8AAP/AAAAB/wAA/4AAAAD/ + AAD/gAAAAH8AAP8AAAAAPwAA/gAAAAAfAAD8AAAAAA8AAPwAAAAADwAA+AAAAAAHAADwAAAAAAMAAPAA + AAAAAwAA4AAAAAABAADAAAAAAAEAAMAAAAAAAQAAwAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB + AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAMAAMAA + AAAAAwAAwAAAAAAHAADAAAAAAA8AAPAAAMAAHwAA8AAB4AA/AAD4AAP4AH8AAPwAB/4B/wAA/4Af//// + AAD///////8AAP///////wAA////////AAD///////8lsCgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAllEAC6PgAAuivwACmpwAAJV0AACRRQAAkxb///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAACTZgAu0f8AZP3/AFXt/wBE3P8AMsn/ABy07gEGnrkBAJWCAQGXPwYH + tAf///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAJaIACTY/wBm//8Aaf//AGv//wBs//8AZv7/AVn0/wNB + 4P8FIMT/BQWp1gQAoH0GB64f////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8AAACVBAACoMoAI+T/AGL9/wBm/f8AZf3/AGb9/wBn + //8Aaf//AGz//wFo//8HUff/DCrZ/woJsvABAJWPAACTHv///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJJEAAm4/wAq6/8AYPz/AGX9/wBj + /f8AYPv/AF36/wBc+v8AYfz/AGP8/wBn/v8CZv//DU79/xgn4P8MCa3sAACSdAAAlQb///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAABmrMAEdP/ADPs/wBN + 9P8AO+3/ADDp/wAu6f8AOOz/AEjy/wBX+P8AW/n/AFv6/wBd+v8AYPr/B1r//x9B/P8dH9H/BASbvwAA + kyP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJNXAAq3/wAX + 4P8AF93/ABXc/wAd4P8ANOr/AEjy/wBS9v8AVPb/AFP2/wBT9v8AVPb/AFT3/wBU9/8AVvb/AVf5/xxN + //8sNer/Cgqn3wAAkjj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACVGwAD + odsAEtb/ABLa/wAa3f8ANOn/AEny/wBN9P8ATPP/AErz/wBL8/8AS/P/AEzz/wBM8/8ATPT/AE30/wBN + 9P8AT/T/AE/0/xlP/f81QvP/DhCs6wAAkj////8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAJeoAAzG/wAR2v8AIuD/AD7u/wBF8P8AQvD/AELv/wBD8P8AQ/D/AEPw/wBE8P8ARPD/AEXw/wBF + 8f8ARfH/AEbx/wBG8f8AR/H/AEjx/xhN+v88SvT/DhCp5AAAkyr///8A////AP///wD///8A////AP// + /wD///8AAACUdwAItv8AD9f/ACPg/wA77f8AO+z/ADrs/wA67P8AO+z/ADvt/wA77f8APO3/ADzt/wA9 + 7f8APe3/AD3t/wA+7v8APu7/AD/u/wA/7v8AP+7/AD/t/yZQ+/8/S+v/BQacwAAAlQf///8A////AP// + /wD///8A////AAAAlE4ABav8AAzS/wAc2/8AM+n/ADLp/wAy6f8AMun/ADPp/wAz6f8ANOn/ADTq/wA0 + 6v8ANer/ADXq/wA26v8ANur/ADbr/wA36/8AN+v/ADjr/wA46/8AOOv/ADns/z5d/v8yO9H/AACTbf// + /wD///8A////AP///wAAAJUPAAKe0wAJyv8AENT/ACjk/wAq5f8AKuX/ACrm/wAr5v8AK+b/ACzm/wAs + 5v8ALOf/AC3n/wAt5/8ALuf/AC7n/wAu5/8AL+j/AC/o/wAu6P8AKuf/AC3n/wAx6P8AL+j/Ej7u/1Jm + +f8SFanaAACTEf///wD///8A////AAAAlXAABrb/AAjO/wAX2P8AI+T/ACLi/wAi4v8AI+P/ACPj/wAk + 4/8AJOP/ACTj/wAl5P8AJeT/ACbk/wAm5P8AJuT/ACfk/wAn5f8AJ+X/CjHm/zJS6v8XPej/ACTk/wAn + 5f8AKOX/QF77/zlF0f8AAJJZ////AP///wAAAJYIAAGe0QAHxv8ACMv/ABjd/wAa4P8AGt//ABvf/wAb + 4P8AHOD/ABzg/wAd4P8AHeD/AB3g/wAe4f8AHuH/AB/h/wAf4f8AH+H/ACDh/wAa4f8nQOb/k6Hz/5Kg + 8/9Xbuz/BiTj/wAc4f8ePu3/VWnu/wQFmpz///8A////AAAAlEIAA63/AATI/wAJzv8AE93/ABLc/wAT + 3P8AE9z/ABTd/wAU3f8AFd3/ABXd/wAV3f8AFt3/ABbe/wAX3v8AF97/ABfe/wAY3v8AGN7/ABDd/05d + 6P+iq/P/pKzz/7O79v9qee3/ABff/wci4/9cdff/EhanyP///wD///8AAACXgQACt/8AAsT/AAfR/wAL + 2f8AC9j/AAvZ/wAM2f8ADNr/AAza/wAN2v8ADdr/AA3a/wAO2v8AD9v/AA/b/wAQ2/8AENv/ABDb/wAM + 2v8SIt3/jZTv/6qv8/+ssfT/trv1/7zA9v8sPOP/ABDd/1lx9v8iKbPh////AP///wAAAJnJAAC8/wAA + wv8AAtL/AAPW/wAD1f8ABNb/AATW/wAE1v8ABdb/AAXW/wAG1/8ABtf/AAfX/wAH1/8AB9f/AAjX/wAH + 1/8ABNf/AADV/z9E4f+3uvT/s7b0/7e69P++wfX/vL/2/yQu3/8ACdr/YHn2/yYuteP///8A////AAAA + m/AAAL3/AADC/wAA0/8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1f8AANf/AADU/wAB + 1f8AAdX/AADU/xgZ2f9mZ+b/HiDa/2Vm5f/Fxfb/xMX1/8jK9/+Ji+z/AADV/wwS2/90jvj/Gh+r0P// + /wD///8AAACa4QAAvP8AAMT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADR/wAA + x/8AANX/AADT/wkJ1v9ycej/paXw/8PD9f+JiOv/BQXV/0BA3/+np/H/sLDy/yYm2v8AAND/OETm/3mW + 8v8HCZyl////AP///wAAAJidAAC3/wAAxP8AANP/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA + 1f8AANL/AgKq/xYbzv8DBNj/AgLT/5qa7v/Jyfb/wMD1/8rK9v+fn+//NTXd/xAQ1/8bG9n/AADS/woM + 1v98mvz/VmrT/wAAk2P///8A////AAAAlVAAAKv/AADE/wAA0/8AANT/AADU/wAA1P8AANT/AADU/wAA + 1P8AANT/AADU/wAA1v8AAMf/ISiz/0lb4f8TGN7/NDPc/5ST7f+oqPD/pqbw/5aW7v9ZWeT/CAjV/wAA + 0f8CAtT/XnXx/46w+v8ZH6jaAACTEv///wD///8AAACWCAAAm8wAALv/AADQ/wAA1f8AANT/AADU/wAA + 1P8AANT/AADU/wAA1P8AANT/AADU/z8/5f80M73/Eheg/Vxx3/5BUev/DRDZ/wIB1P8AANP/AADS/wAA + 0P8AANL/FBja/2eA8/+YvP//PUvD/wAAkl7///8A////AP///wD///8AAACVRwAAo/kAAMf/AADX/wAA + 1P8AANT/AADU/wAA1P8AANT/AADT/wIC1P9UVOf/c3Pe/xISo9IAAJI/BwmZqUhayf9vifD/VGnx/zVC + 5/8nMeH/NEHk/1lt8P+Mrv//kLP8/z5NxP8AAJSF////AP///wD///8A////AP///wD///8AAACVYAAA + o/gAAMr/AgLZ/wAA1/8AANX/AADU/wAA1P8eHt3/d3fr/3p62P8WFqHYAACUK////wAAAJYCAACSXBQY + pNNLXMr/bYfk/4Cd9P+Jqfj/fpzv/1Zr1f8cI6vpAACTZ////wD///8A////AP///wD///8A////AP// + /wD///8AAACVPQAAm8cJCbX/Dw/H/xIS0v8lJdf/SUnZ/2tr0v9DQ7b6BQWXnwAAlRj///8A////AP// + /wD///8AAACVCAAAkkkCA5eKCQudsAkMnbkEBpuiAACTagAAkxn///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAACWBQEBlEQEBJiVBgac2wwMnfMREZ3LAwOWfQAAky3///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A/////////////////wH///8AH///AAf//gAB//4A + AH/+AAA//AAAH/gAAA/4AAAH8AAAA+AAAAPAAAABwAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA + AAGAAAABgAAAA8AAAAfgAIAP8AHgH/gH//////////////////8oAAAAGAAAADAAAAABACAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJUFAAqjtwAo + v9oAHbS2AA6llAADmWwAAJE8AACPDf///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wAAAJIPABC05ABj//8AaP//AGL6/wBT6/8BNM7+Ahm14wUG + rJMEAaNDCAm0B////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wAAAJJMAA/A/wBY/f8Aaf//AGj//wBq//8Abf//AWf//wRR8/8IJ9D/CQuzyAIAl1QAAJIH////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAp+wABzd/wBa+/8AYPv/AFn4/wBU + 9/8AV/j/AGD8/wBl/v8BZf//CFP6/xUt4f8MCa7TAACSVv///wD///8A////AP///wD///8A////AP// + /wD///8A////AAAAk0cADL/7AB/l/wAv5/8AJuT/ACzn/wA+7v8ATPP/AFb4/wBY+P8AWPj/AFz5/wRb + /v8bRvr/HyTT/gQCmZEAAJME////AP///wD///8A////AP///wD///8AAACUCQAEpckAEtf/ABLb/wAh + 4f8AO+z/AEvz/wBQ9P8ATvT/AE70/wBO9P8ATvT/AE/0/wBR9P8AU/b/F0///ys25f8HB56pAACTB/// + /wD///8A////AP///wD///8AAAGalQAMyf8AGd7/ADDm/wBD7/8ARPD/AEPv/wBD7/8AQ+//AETw/wBE + 8P8ARfD/AEXw/wBG8P8ARvH/AEfw/xVN+/8xQej/CgqhpQAAlAP///8A////AP///wAAAJZvAAi9/wAW + 2/8AMun/ADns/wA36/8AN+v/ADjr/wA56/8AOev/ADrr/wA67P8AO+z/ADvs/wA87f8APO3/AD3t/wA8 + 7P8gTvr/OETg/wEBlXn///8A////AAAAlTcABbD0AA7T/wAn4/8AL+j/AC3n/wAu5/8ALuf/AC/n/wAv + 6P8AMOj/ADDo/wAx6P8AMej/ADLo/wAz6f8AMOj/AC/o/wAy6f8AM+n/OVn6/yUswOQAAJIb////AAAB + nrIACMf/ABbY/wAk4/8AI+L/ACTj/wAk4/8AJeP/ACXj/wAm4/8AJuT/ACfk/wAo5P8AKOT/ACjl/wAo + 5f8XPOf/HkPo/wMq5f8AJOT/Fj3u/0dZ5/8CAph9AACVPAAEs/sACMv/ABXa/wAZ3/8AGd7/ABne/wAa + 3/8AG9//ABvf/wAc3/8AHOD/AB3g/wAd4P8AHuD/AB3g/wAa4P9gcez/m6fz/3aI7/8WMuT/ABzi/0Jd + 8/8bIK+9AACZlgADvv8AB8z/AA/a/wAP2v8AENv/ABDb/wAR2/8AEdv/ABLb/wAS3P8AE9z/ABPc/wAU + 3P8AFNz/ABHc/w0h3/+MlvD/p6/z/7e99f+Ik/D/ABPc/zNN8P81QMTeAAGf0gABv/8AA83/AAXX/wAF + 1v8ABtb/AAbX/wAH1/8AB9f/AAjX/wAJ2P8ACdj/AArY/wAJ2P8ABNj/AADW/1Vb5f+4vPX/srb0/73A + 9v+xtfT/BRLa/zNI7v9AT8zoAACk8AAAv/8AAM7/AADV/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAB + 1v8AAdX/AADU/wME1f8eINr/Wl3k/zY33v+Fhuv/x8f2/8/P9/92eOn/AADT/0lb7/86SMPaAACh3gAA + v/8AAM//AADV/wAA1P8AANT/AADU/wAA1P8AANT/AADW/wAAxf8EBc7/AADT/0lI4P+2tfP/x8f2/4qK + 7P8eHtn/VVXi/4GB6v8TEtb/DBDY/3OO9P8YHqeyAACZpgAAu/8AAM//AADV/wAA1P8AANT/AADU/wAA + 1P8AANT/AADW/wAAxP8XHbj/Hibf/yEh2/+mpfD/vLz0/8LC9f+VlO3/Hh7Z/wAA0v8AANL/W3Dy/2qC + 4P8AAJVlAACWPgAArPoAAM3/AADW/wAA1P8AANT/AADU/wAA1P8AANT/AADT/xkZ3v8yMsP+NEG8+0FR + 5P8mLOH/KSnb/x4c2f8FA9T/AADU/wkM2P9YbfD/haT2/xwiqcMAAJMG////AAAAl4MAALT/AADW/wAA + 1v8AANT/AADU/wAA1P8AANT/MjLh/3Bw4P8eHqnDAACRNRkfprVMX9T/WW/t/0ld7f9NYO//YXj1/4Kh + /P91ken/GyGpygAAkx3///8A////AAAAlgEAAJd/AACx/AYG0P8DA9b/BATW/xMT2P9ZWeL/aWnR/xwc + pLsAAJMd////AAAAlAYBAZRSHiWqt0FRwvRQY837S13K/C45t+MHCZp/AACTE////wD///8A////AP// + /wD///8AAACUNQUFnZEKCqrVExOw8CoqsuUmJqetAwOVVwAAlAj///8A////AP///wD///8AAACUAgAA + kRwAAJA1AACQLwAAkg7///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///4H4B///+AD///gA + P//4AB//8AAH/+AAA//gAAH/wAAB/4AAAP+AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/4AA + Af+ACAP/4B4P//////////+QKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD///8A////AP///wAAAJQJABu1yAAzyMsAILekAAyicgAAmTcGA68G////AP///wD///8A////AP// + /wD///8A////AP///wD///8AAACUHgAq1vkAb///AGv//wBh+P8CSeT7ByHJzgYEpnEAAJAL////AP// + /wD///8A////AP///wD///8A////AAABnXMALuT/AFb5/wBO9f8AVfj/AGX//wJi//8KRez/EBzEzwMA + mFD///8A////AP///wD///8A////AAAAkyAACbvpABzi/wAq5f8APe3/AE70/wBS9f8AVPb/AFj5/wtU + /v8dMuD/CAegdv///wD///8A////AP///wAAA6etABbZ/wAy6P8AQ+//AEXx/wBE8P8ARfD/AEXx/wBG + 8f8ASPH/CUz5/yU+5v8JCJ52////AP///wAAAZx+AA7L/wAs5/8ANuv/ADXq/wA06f8ANur/ADfq/wA4 + 6v8AOev/ADfr/wA16/8QRfX/Lj3a9wIBlS8AAJYnAAW5+AAZ3f8AKOX/ACbj/wAn5P8AJ+T/ACjl/wAp + 5P8AKuX/ACnl/woz5/8QOef/ACbm/ydK8v8YHK+TAAGfhwAGyP8AFdv/ABje/wAY3v8AGd7/ABnf/wAb + 3/8AG9//ABzg/wAU3v8+VOf/m6fz/0Vb6f8NLur/LTrJ0gABqNIABMv/AAnY/wAJ1/8ACdj/AArY/wAL + 2P8ADNr/AA3Z/wAF2P8BDtr/i5Lu/77D9v+orvL/Eibj/zVF0uoAAKvxAADN/wAA1f8AANT/AADU/wAA + 1P8AANT/AADU/wEB1f8rLNz/TU/i/2Zn5v/BwvX/g4Tr/xEZ3/8+Ts/gAACn2AAAzf8AANb/AADU/wAA + 1P8AANX/AADQ/wcJw/8OENr/lpTt/8rJ9v93d+n/OTjd/xEP1v9DVOr/Mj26rgAAm34AAMX/AADX/wAA + 1P8AANT/AADU/wUF2P8rLMf/LjjF+E5Y6P9TVeb/Ozvf/wsO2P9DVOz/ZHzg/wcJmUUAAJUQAAClxQEB + zv8CAtj/BgbZ/xgY2/9RUdz/KSiupAMEkjoqNbe+Q1Xa+ktf5v9ogez/WW7W6wwOnW7///8A////AAAA + lQ4CAp54Bwex0BUVue4vL7fMGRmhcAAAlAj///8AAACTAgQFmDMPE59fCw2dWAAAlCH///8A////AP// + /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP// + /wD//+n/4D/o/+AP6P/gB+n/wAPp/8AB+v+AAMDkAACSGwAA/wAAAJ6yAADH/wAA2P8AAOP/AAHi/4CD + 4////wRw + + + \ No newline at end of file diff --git a/ToggleSwitchDemo/Program.cs b/ToggleSwitchDemo/Program.cs new file mode 100644 index 0000000..702caa7 --- /dev/null +++ b/ToggleSwitchDemo/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Windows.Forms; + +namespace ToggleSwitchDemo +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new DemoForm()); + } + } +} diff --git a/ToggleSwitchDemo/Properties/AssemblyInfo.cs b/ToggleSwitchDemo/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0dfb431 --- /dev/null +++ b/ToggleSwitchDemo/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ToggleSwitchDemo")] +[assembly: AssemblyDescription("JCS ToggleSwitch Demo Application")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("JC Software Solutions")] +[assembly: AssemblyProduct("JCS ToggleSwitch")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6fd40b22-0c51-4557-af5c-879774fec629")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ToggleSwitchDemo/Properties/Resources.Designer.cs b/ToggleSwitchDemo/Properties/Resources.Designer.cs new file mode 100644 index 0000000..3b18344 --- /dev/null +++ b/ToggleSwitchDemo/Properties/Resources.Designer.cs @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ToggleSwitchDemo.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ToggleSwitchDemo.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowleft { + get { + object obj = ResourceManager.GetObject("arrowleft", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrowright { + get { + object obj = ResourceManager.GetObject("arrowright", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap check { + get { + object obj = ResourceManager.GetObject("check", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cross { + get { + object obj = ResourceManager.GetObject("cross", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap handle { + get { + object obj = ResourceManager.GetObject("handle", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ToggleSwitchDemo/Properties/Resources.resx b/ToggleSwitchDemo/Properties/Resources.resx new file mode 100644 index 0000000..a7ba297 --- /dev/null +++ b/ToggleSwitchDemo/Properties/Resources.resx @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\arrowleft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Image70.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\check.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\cross.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\handle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ToggleSwitchDemo/Properties/Settings.Designer.cs b/ToggleSwitchDemo/Properties/Settings.Designer.cs new file mode 100644 index 0000000..c13ee02 --- /dev/null +++ b/ToggleSwitchDemo/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34209 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ToggleSwitchDemo.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/ToggleSwitchDemo/Properties/Settings.settings b/ToggleSwitchDemo/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/ToggleSwitchDemo/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/ToggleSwitchDemo/Resources/Image70.png b/ToggleSwitchDemo/Resources/Image70.png new file mode 100644 index 0000000..1fc785a Binary files /dev/null and b/ToggleSwitchDemo/Resources/Image70.png differ diff --git a/ToggleSwitchDemo/Resources/arrowleft.png b/ToggleSwitchDemo/Resources/arrowleft.png new file mode 100644 index 0000000..25d1578 Binary files /dev/null and b/ToggleSwitchDemo/Resources/arrowleft.png differ diff --git a/ToggleSwitchDemo/Resources/check.png b/ToggleSwitchDemo/Resources/check.png new file mode 100644 index 0000000..5233a8f Binary files /dev/null and b/ToggleSwitchDemo/Resources/check.png differ diff --git a/ToggleSwitchDemo/Resources/cross.png b/ToggleSwitchDemo/Resources/cross.png new file mode 100644 index 0000000..25572fc Binary files /dev/null and b/ToggleSwitchDemo/Resources/cross.png differ diff --git a/ToggleSwitchDemo/Resources/handle.png b/ToggleSwitchDemo/Resources/handle.png new file mode 100644 index 0000000..33fbf6b Binary files /dev/null and b/ToggleSwitchDemo/Resources/handle.png differ diff --git a/ToggleSwitchDemo/ToggleSwitchDemo.csproj b/ToggleSwitchDemo/ToggleSwitchDemo.csproj new file mode 100644 index 0000000..2a89ba8 --- /dev/null +++ b/ToggleSwitchDemo/ToggleSwitchDemo.csproj @@ -0,0 +1,107 @@ + + + + + Debug + AnyCPU + {2F7ADBD8-EC70-4407-8B09-474E8F2043AC} + WinExe + Properties + ToggleSwitchDemo + ToggleSwitchDemo + v4.0 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Form + + + DemoForm.cs + + + + + DemoForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {49b88ffa-f02c-4709-ba65-9f8996444ecd} + ToggleSwitch + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ToggleSwitchDemo/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs b/ToggleSwitchDemo/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs new file mode 100644 index 0000000..5d01041 --- /dev/null +++ b/ToggleSwitchDemo/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")] diff --git a/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..d16ec53 Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..bff5900 Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/ToggleSwitchDemo/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/ToggleSwitchDemo/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll new file mode 100644 index 0000000..846209a Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.DemoForm.resources b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.DemoForm.resources new file mode 100644 index 0000000..360c712 Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.DemoForm.resources differ diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.Properties.Resources.resources b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.Properties.Resources.resources new file mode 100644 index 0000000..baccf3d Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.Properties.Resources.resources differ diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CopyComplete b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CopyComplete new file mode 100644 index 0000000..e69de29 diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CoreCompileInputs.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..ef32b4a --- /dev/null +++ b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +a3b23e74090a80e3128188f6cf3a320fb2c4b627 diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.FileListAbsolute.txt b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..3bfca64 --- /dev/null +++ b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.FileListAbsolute.txt @@ -0,0 +1,25 @@ +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.exe +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.pdb +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.dll +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.pdb +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csprojResolveAssemblyReference.cache +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.DemoForm.resources +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.Properties.Resources.resources +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.GenerateResource.Cache +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.exe +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.exe +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.dll +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csprojAssemblyReference.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.DemoForm.resources +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.Properties.Resources.resources +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.GenerateResource.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.CoreCompileInputs.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.CopyComplete +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.exe +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.pdb +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csprojAssemblyReference.cache +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.exe +D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.pdb diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.GenerateResource.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.GenerateResource.cache new file mode 100644 index 0000000..f390b92 Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.GenerateResource.cache differ diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojAssemblyReference.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojAssemblyReference.cache new file mode 100644 index 0000000..5ee7ea3 Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojAssemblyReference.cache differ diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojResolveAssemblyReference.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..3203e46 Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojResolveAssemblyReference.cache differ diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.exe b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.exe new file mode 100644 index 0000000..c7e9206 Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.exe differ diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.pdb b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.pdb new file mode 100644 index 0000000..779440e Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.pdb differ diff --git a/ToggleSwitchDemo/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitchDemo/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..9ed1cab Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/ToggleSwitchDemo/obj/Release/TempPE/Properties.Resources.Designer.cs.dll b/ToggleSwitchDemo/obj/Release/TempPE/Properties.Resources.Designer.cs.dll new file mode 100644 index 0000000..b56a34c Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/TempPE/Properties.Resources.Designer.cs.dll differ diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.DemoForm.resources b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.DemoForm.resources new file mode 100644 index 0000000..360c712 Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.DemoForm.resources differ diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.Properties.Resources.resources b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.Properties.Resources.resources new file mode 100644 index 0000000..baccf3d Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.Properties.Resources.resources differ diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CopyComplete b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CopyComplete new file mode 100644 index 0000000..e69de29 diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CoreCompileInputs.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..ad76e5f --- /dev/null +++ b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +fd4dbdbc4ebb23053bb7500549871212fffaf366 diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.FileListAbsolute.txt b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..de9128d --- /dev/null +++ b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.FileListAbsolute.txt @@ -0,0 +1,22 @@ +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.exe +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.pdb +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.dll +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.pdb +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csprojResolveAssemblyReference.cache +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.DemoForm.resources +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.Properties.Resources.resources +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.GenerateResource.Cache +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.exe +C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.exe +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.dll +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.pdb +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csprojAssemblyReference.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.DemoForm.resources +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.Properties.Resources.resources +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.GenerateResource.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.CoreCompileInputs.cache +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.CopyComplete +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.exe +D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.pdb diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.GenerateResource.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.GenerateResource.cache new file mode 100644 index 0000000..f390b92 Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.GenerateResource.cache differ diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojAssemblyReference.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojAssemblyReference.cache new file mode 100644 index 0000000..5a14c66 Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojAssemblyReference.cache differ diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojResolveAssemblyReference.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..e9150e5 Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojResolveAssemblyReference.cache differ diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.exe b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.exe new file mode 100644 index 0000000..035e320 Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.exe differ diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.pdb b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.pdb new file mode 100644 index 0000000..b8cc348 Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.pdb differ diff --git a/arrowleft.png b/arrowleft.png new file mode 100644 index 0000000..25d1578 Binary files /dev/null and b/arrowleft.png differ diff --git a/check.png b/check.png new file mode 100644 index 0000000..5233a8f Binary files /dev/null and b/check.png differ diff --git a/cross.png b/cross.png new file mode 100644 index 0000000..25572fc Binary files /dev/null and b/cross.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..affdba5 Binary files /dev/null and b/favicon.ico differ diff --git a/handle.png b/handle.png new file mode 100644 index 0000000..33fbf6b Binary files /dev/null and b/handle.png differ diff --git a/loading-circle.gif b/loading-circle.gif new file mode 100644 index 0000000..be46af8 Binary files /dev/null and b/loading-circle.gif differ