From 5c4b0a9fd470237aeb744a1379dc6d4f3510e241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sun, 8 Jun 2008 14:16:13 +0000 Subject: [PATCH] Rewritten exception handling - Debugger.Exception is now just a convenience wrapper class around the run-time value. Added "$exception" variable to the local variables pad. ExceptionForm generalized to DebuggerEventForm. Permanently removed exception history pad. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3099 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Debugger.AddIn.addin | 16 -- .../Project/Debugger.AddIn.csproj | 13 +- .../Project/Src/Pads/ExceptionHistoryPad.cs | 157 ---------------- ...igner.cs => DebuggerEventForm.Designer.cs} | 4 +- ...{ExceptionForm.cs => DebuggerEventForm.cs} | 38 +--- ...eptionForm.resx => DebuggerEventForm.resx} | 0 .../Project/Src/Service/WindowsDebugger.cs | 34 ++-- .../Adapters/TreeViewExceptionNode.cs | 52 ------ .../Project/Src/TreeModel/ExceptionNode.cs | 46 ----- .../Project/Src/TreeModel/StackFrameNode.cs | 3 + .../Project/Debugger.Core.csproj | 3 +- .../Project/Src/Control/Thread.cs | 82 ++++++++- .../Src/Debugger/DebugeeInnerException.cs | 69 ------- .../Project/Src/Debugger/Exception.cs | 168 +++++++----------- .../Project/Src/Debugger/ExceptionType.cs | 8 +- .../Project/Src/Debugger/IDebugeeException.cs | 21 --- .../Ast/CurrentExceptionExpression.cs | 46 +++++ .../Ast/ThisReferenceExpression.cs | 2 +- .../Project/Src/Internal/ManagedCallback.cs | 15 +- .../Debugger.Core/Project/Src/Values/Value.cs | 9 + .../Resources/StringResources.resources | Bin 299770 -> 299299 bytes 21 files changed, 253 insertions(+), 533 deletions(-) delete mode 100644 src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ExceptionHistoryPad.cs rename src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/{ExceptionForm.Designer.cs => DebuggerEventForm.Designer.cs} (97%) rename src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/{ExceptionForm.cs => DebuggerEventForm.cs} (69%) rename src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/{ExceptionForm.resx => DebuggerEventForm.resx} (100%) delete mode 100644 src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Adapters/TreeViewExceptionNode.cs delete mode 100644 src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ExceptionNode.cs delete mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeInnerException.cs delete mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/IDebugeeException.cs create mode 100644 src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/CurrentExceptionExpression.cs diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.addin b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.addin index e95e34555f..08060e5c91 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.addin +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.addin @@ -25,15 +25,6 @@ - - - - diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj index 11d2747c72..99eb227ce4 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Debugger.AddIn.csproj @@ -48,20 +48,19 @@ - - + Form - - ExceptionForm.cs + + DebuggerEventForm.cs - - ExceptionForm.cs + + DebuggerEventForm.cs @@ -73,11 +72,9 @@ - - diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ExceptionHistoryPad.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ExceptionHistoryPad.cs deleted file mode 100644 index 0c42834b06..0000000000 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Pads/ExceptionHistoryPad.cs +++ /dev/null @@ -1,157 +0,0 @@ -// -// -// -// $Revision$ -// -#region License -// -// Copyright (c) 2007, ic#code -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the ic#code nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// -#endregion - -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Windows.Forms; - -using Debugger; -using ICSharpCode.Core; - -namespace ICSharpCode.SharpDevelop.Gui.Pads -{ - public class ExceptionHistoryPad : DebuggerPad - { - ListView exceptionHistoryList; - Debugger.Process debuggedProcess; - - List exceptions = new List(); - - ColumnHeader time = new ColumnHeader(); - ColumnHeader exception = new ColumnHeader(); - ColumnHeader location = new ColumnHeader(); - - public override Control Control { - get { - return exceptionHistoryList; - } - } - - protected override void InitializeComponents() - { - exceptionHistoryList = new ListView(); - exceptionHistoryList.FullRowSelect = true; - exceptionHistoryList.AutoArrange = true; - exceptionHistoryList.Alignment = ListViewAlignment.Left; - exceptionHistoryList.View = View.Details; - exceptionHistoryList.Dock = DockStyle.Fill; - exceptionHistoryList.GridLines = false; - exceptionHistoryList.Activation = ItemActivation.OneClick; - exceptionHistoryList.Columns.AddRange(new ColumnHeader[] {time, exception, location} ); - exceptionHistoryList.ItemActivate += new EventHandler(ExceptionHistoryListItemActivate); - exception.Width = 300; - location.Width = 400; - time.Width = 80; - - RedrawContent(); - } - - public override void RedrawContent() - { - time.Text = ResourceService.GetString("MainWindow.Windows.Debug.ExceptionHistory.Time"); - exception.Text = ResourceService.GetString("MainWindow.Windows.Debug.ExceptionHistory.Exception"); - location.Text = ResourceService.GetString("AddIns.HtmlHelp2.Location"); - } - - protected override void SelectProcess(Debugger.Process process) - { - if (debuggedProcess != null) { - debuggedProcess.ExceptionThrown -= debuggedProcess_ExceptionThrown; - } - debuggedProcess = process; - if (debuggedProcess != null) { - debuggedProcess.ExceptionThrown += debuggedProcess_ExceptionThrown; - } - exceptions.Clear(); - RefreshPad(); - } - - void debuggedProcess_ExceptionThrown(object sender, ExceptionEventArgs e) - { - exceptions.Add(e.Exception); - RefreshPad(); - } - - void ExceptionHistoryListItemActivate(object sender, EventArgs e) - { - SourcecodeSegment nextStatement = ((Debugger.Exception)(exceptionHistoryList.SelectedItems[0].Tag)).Location; - - if (nextStatement == null) { - return; - } - - FileService.OpenFile(nextStatement.SourceFullFilename); - IViewContent content = FileService.GetOpenFile(nextStatement.SourceFullFilename); - - if (content is IPositionable) { - ((IPositionable)content).JumpTo((int)nextStatement.StartLine - 1, (int)nextStatement.StartColumn - 1); - } - } - - public override void RefreshPad() - { - exceptionHistoryList.BeginUpdate(); - exceptionHistoryList.Items.Clear(); - - foreach(Debugger.Exception exception in exceptions) { - string location; - if (exception.Location != null) { - location = exception.Location.SourceFilename + ":" + exception.Location.StartLine; - } else { - location = ResourceService.GetString("Global.NA"); - } - location += " (type=" + exception.ExceptionType.ToString() + ")"; - ListViewItem item = new ListViewItem(new string[] {"" , exception.Type + " - " + exception.Message, location}); - item.Tag = exception; - item.ForeColor = Color.Black; - if (exception.ExceptionType == ExceptionType.DEBUG_EXCEPTION_UNHANDLED) { - item.ForeColor = Color.Red; - } - if (exception.ExceptionType == ExceptionType.DEBUG_EXCEPTION_FIRST_CHANCE || - exception.ExceptionType == ExceptionType.DEBUG_EXCEPTION_USER_FIRST_CHANCE) { - item.ForeColor = Color.Blue; - } - exceptionHistoryList.Items.Add(item); - } - - exceptionHistoryList.EndUpdate(); - } - } -} diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.Designer.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.Designer.cs similarity index 97% rename from src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.Designer.cs rename to src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.Designer.cs index 29496d7913..24bb381df5 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.Designer.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.Designer.cs @@ -43,7 +43,7 @@ using System.Windows.Forms; namespace ICSharpCode.SharpDevelop.Services { - partial class ExceptionForm : System.Windows.Forms.Form + partial class DebuggerEventForm : System.Windows.Forms.Form { #region Windows Forms Designer generated code /// @@ -128,7 +128,7 @@ namespace ICSharpCode.SharpDevelop.Services this.MinimizeBox = false; this.Name = "ExceptionForm"; this.ShowInTaskbar = false; - this.Text = "${res:MainWindow.Windows.Debug.ExceptionForm.Title}"; + this.Text = ""; this.TopMost = true; ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit(); this.ResumeLayout(false); diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.cs similarity index 69% rename from src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.cs rename to src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.cs index 8eac5dd42e..121314a752 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.cs @@ -47,13 +47,13 @@ using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Services { - internal sealed partial class ExceptionForm + internal sealed partial class DebuggerEventForm { public enum Result {Break, Continue, Terminate}; private Result result = Result.Break; // Default - private ExceptionForm() + private DebuggerEventForm() { InitializeComponent(); this.Text = StringParser.Parse(this.Text); @@ -62,39 +62,18 @@ namespace ICSharpCode.SharpDevelop.Services buttonTerminate.Text = StringParser.Parse(buttonTerminate.Text); } - public static Result Show(Debugger.Exception exception) + public static Result Show(string title, string message, System.Drawing.Bitmap icon, bool canContinue) { - IDebugeeException ex = exception; - StringBuilder msg = new StringBuilder(); - msg.AppendFormat(ResourceService.GetString("MainWindow.Windows.Debug.ExceptionForm.Message"), ex.Type); - msg.AppendLine(); - msg.AppendLine("Message:"); - msg.Append("\t"); - msg.AppendLine(ex.Message); - msg.AppendLine(); - while(ex.InnerException != null) { - ex = ex.InnerException; - msg.AppendLine("Inner Exception:"); - msg.AppendFormat("Type: [{0}]", ex.Type); - msg.AppendLine(); - msg.AppendLine("Message:"); - msg.Append("\t"); - if (ex.Message != "null") { msg.AppendLine(ex.Message); } - msg.AppendLine(); - } - msg.AppendLine("StackTrace:"); - msg.AppendLine(exception.Callstack.Replace("\n","\r\n")); - - using (ExceptionForm form = new ExceptionForm()) { - form.textBox.Text = msg.ToString(); - form.pictureBox.Image = ResourceService.GetBitmap((exception.ExceptionType != ExceptionType.DEBUG_EXCEPTION_UNHANDLED)?"Icons.32x32.Warning":"Icons.32x32.Error"); - form.buttonContinue.Enabled = exception.ExceptionType != ExceptionType.DEBUG_EXCEPTION_UNHANDLED; + using (DebuggerEventForm form = new DebuggerEventForm()) { + form.Text = title; + form.textBox.Text = message; + form.pictureBox.Image = icon; + form.buttonContinue.Enabled = canContinue; form.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); return form.result; } } - #region Form Event Handlers private void buttonBreak_Click(object sender, System.EventArgs e) { result = Result.Break; @@ -112,6 +91,5 @@ namespace ICSharpCode.SharpDevelop.Services result = Result.Terminate; Close(); } - #endregion Form Event Handlers } } diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.resx b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.resx similarity index 100% rename from src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/ExceptionForm.resx rename to src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/DebuggerEventForm.resx diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs index 10867f3fad..63c220cc62 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs @@ -39,7 +39,9 @@ using System; using System.Diagnostics; +using System.Text; using System.Windows.Forms; +using Bitmap = System.Drawing.Bitmap; using Debugger; using Debugger.Expressions; @@ -476,7 +478,7 @@ namespace ICSharpCode.SharpDevelop.Services void debuggedProcess_ExceptionThrown(object sender, ExceptionEventArgs e) { - if (!e.Exception.IsUnhandled) { + if (!e.IsUnhandled) { // Ignore the exception e.Process.AsyncContinue(); return; @@ -484,23 +486,35 @@ namespace ICSharpCode.SharpDevelop.Services JumpToCurrentLine(); - ExceptionForm.Result result = ExceptionForm.Show(e.Exception); + StringBuilder msg = new StringBuilder(); + + // Need to intercept now so that we can evaluate properties + if (e.Process.SelectedThread.InterceptCurrentException()) { + msg.Append(e.Exception.ToString(StringParser.Parse("${res:MainWindow.Windows.Debug.ExceptionForm.LineFormat.EndOfInnerException}"))); + } else { + // For example, happens on stack overflow + msg.Append(e.Exception.ToString()); + msg.AppendLine(StringParser.Parse("(${res:MainWindow.Windows.Debug.ExceptionForm.Error.CannotInterceptException})")); + msg.AppendLine(e.Process.SelectedThread.GetStackTrace(StringParser.Parse("${res:MainWindow.Windows.Debug.ExceptionForm.LineFormat.Symbols}"), StringParser.Parse("${res:MainWindow.Windows.Debug.ExceptionForm.LineFormat.NoSymbols}"))); + } + + string title = e.IsUnhandled ? StringParser.Parse("${res:MainWindow.Windows.Debug.ExceptionForm.Title.Unhandled}") : StringParser.Parse("${res:MainWindow.Windows.Debug.ExceptionForm.Title.Handled}"); + string message = msg.ToString(); + Bitmap icon = ResourceService.GetBitmap(e.IsUnhandled ? "Icons.32x32.Error" : "Icons.32x32.Warning"); + bool canContinue = !e.IsUnhandled; + + DebuggerEventForm.Result result = DebuggerEventForm.Show(title, message, icon, canContinue); // If the process was killed while the exception form was shown if (e.Process.HasExpired) return; switch (result) { - case ExceptionForm.Result.Break: - // Need to intercept now so that we can evaluate properties in local variables pad - if (!e.Process.SelectedThread.CurrentException.Intercept()) { - // For example, happens on stack overflow - MessageService.ShowMessage("${res:MainWindow.Windows.Debug.ExceptionForm.Error.CannotInterceptException}", "${res:MainWindow.Windows.Debug.ExceptionForm.Title}"); - } + case DebuggerEventForm.Result.Break: break; - case ExceptionForm.Result.Continue: + case DebuggerEventForm.Result.Continue: e.Process.AsyncContinue(); break; - case ExceptionForm.Result.Terminate: + case DebuggerEventForm.Result.Terminate: e.Process.Terminate(); break; } diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Adapters/TreeViewExceptionNode.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Adapters/TreeViewExceptionNode.cs deleted file mode 100644 index daf431d605..0000000000 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/Adapters/TreeViewExceptionNode.cs +++ /dev/null @@ -1,52 +0,0 @@ -// -// -// -// $Revision: 3047 $ -// - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Drawing; -using System.Windows.Forms; - -using Aga.Controls.Tree; - -using Debugger.Util; - -using ICSharpCode.Core; -using ICSharpCode.SharpDevelop.Gui.Pads; - -namespace Debugger.AddIn.TreeModel -{ - /// - /// This TreeNodeAdv displays exception data. - /// - public class TreeViewExceptionNode: TreeNodeAdv - { - private static Dictionary expandedNodes = new Dictionary(); - - private TreeViewAdv localVarList; - - /// - /// The content of the exception - /// - private AbstractNode content; - - // TODO: I don't know if I need localVarList - private TreeViewExceptionNode(TreeViewAdv localVarList, ExceptionNode exception): base(localVarList, new object()) { - this.localVarList = localVarList; - SetContentRecursive(exception); - } - - /// - /// A simple form of SetContentRecursive that changes the current ChildViewNode to - /// display the exception parameter passed to it. If the node had any children and is expanded, - /// it will recureively set those as well. - /// - /// Contains the exception that will be stored in this particular TreeViewNode. - public static void SetContentRecursive(ExceptionNode exception) { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ExceptionNode.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ExceptionNode.cs deleted file mode 100644 index 913c237e01..0000000000 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/ExceptionNode.cs +++ /dev/null @@ -1,46 +0,0 @@ -// -// -// -// $Revision: 2813 $ -// - -using System; - - -namespace Debugger.AddIn.TreeModel -{ - /// - /// Represents a row in a TreeViewAdv that contains an IDebugeeException - /// - public class ExceptionNode : AbstractNode - { - private IDebugeeException exception; - private ExceptionNode innerException = null; - - public static ExceptionNode Create(Debugger.Exception exception) { - try { - return new ExceptionNode(exception); - } catch (GetValueException e) { - // TODO: Fix this - throw; - //return new ErrorNode(expression, e); - } - } - - private ExceptionNode(IDebugeeException exception){ - this.exception = exception; - this.Image = DebuggerIcons.ImageList.Images[0]; // Class - this.Name = "Unhandled Exception"; - this.Type = exception.Type; - this.Text = exception.Message; - if (exception.InnerException != null) { - innerException = new ExceptionNode(exception.InnerException); - } - } - - - ExceptionNode InnerException { - get { return innerException; } - } - } -} diff --git a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/StackFrameNode.cs b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/StackFrameNode.cs index c656e20325..a9f1a0c780 100644 --- a/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/StackFrameNode.cs +++ b/src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/TreeModel/StackFrameNode.cs @@ -34,6 +34,9 @@ namespace Debugger.AddIn.TreeModel foreach(Expression expr in Expression.MethodVariables(stackFrame.MethodInfo)) { yield return ValueNode.Create(expr); } + if (stackFrame.Thread.CurrentException != null) { + yield return ValueNode.Create(new CurrentExceptionExpression()); + } } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj index bba9e553c3..0a1404deab 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Debugger.Core.csproj @@ -59,13 +59,12 @@ - - + diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Thread.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Thread.cs index 214d0f2624..8701068746 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Thread.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Control/Thread.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; +using System.Text; using System.Threading; using Debugger.Wrappers.CorDebug; @@ -17,10 +18,13 @@ namespace Debugger public partial class Thread: DebuggerObject { Process process; - + ICorDebugThread corThread; - - Exception currentException; + + Exception currentException; + DebuggeeState currentException_DebuggeeState; + ExceptionType currentExceptionType; + bool currentExceptionIsUnhandled; List steppers = new List(); @@ -171,10 +175,58 @@ namespace Debugger } public Exception CurrentException { - get { return currentException; } + get { + if (currentException_DebuggeeState == this.Process.DebuggeeState) { + return currentException; + } else { + return null; + } + } internal set { currentException = value; } } + internal DebuggeeState CurrentException_DebuggeeState { + get { return currentException_DebuggeeState; } + set { currentException_DebuggeeState = value; } + } + + public ExceptionType CurrentExceptionType { + get { return currentExceptionType; } + internal set { currentExceptionType = value; } + } + + public bool CurrentExceptionIsUnhandled { + get { return currentExceptionIsUnhandled; } + internal set { currentExceptionIsUnhandled = value; } + } + + /// Tryies to intercept the current exception. + /// The intercepted expression stays available through the CurrentException property. + /// False, if the exception was already intercepted or + /// if it can not be intercepted. + public bool InterceptCurrentException() + { + if (!this.CorThread.Is()) return false; // Is the debuggee .NET 2.0? + if (this.CorThread.CurrentException == null) return false; // Is there any exception + if (this.MostRecentStackFrame == null) return false; // Is frame available? It is not at StackOverflow + + try { + // Interception will expire the CorValue so keep permanent reference + currentException.MakeValuePermanent(); + this.CorThread.CastTo().InterceptCurrentException(this.MostRecentStackFrame.CorILFrame.CastTo()); + } catch (COMException e) { + // 0x80131C02: Cannot intercept this exception + if ((uint)e.ErrorCode == 0x80131C02) { + return false; + } + throw; + } + + Process.AsyncContinue_KeepDebuggeeState(); + Process.WaitForPause(); + return true; + } + internal Stepper GetStepper(ICorDebugStepper corStepper) { foreach(Stepper stepper in steppers) { @@ -248,6 +300,28 @@ namespace Debugger } } + public string GetStackTrace() + { + return GetStackTrace("at {0} in {1}:line {2}", "at {0} in {1}"); + } + + public string GetStackTrace(string formatSymbols, string formatNoSymbols) + { + StringBuilder stackTrace = new StringBuilder(); + foreach(StackFrame stackFrame in this.GetCallstack(100)) { + SourcecodeSegment loc = stackFrame.NextStatement; + if (loc != null) { + stackTrace.Append(" "); + stackTrace.AppendFormat(formatSymbols, stackFrame.MethodInfo.FullName, loc.SourceFullFilename, loc.StartLine); + stackTrace.AppendLine(); + } else { + stackTrace.AppendFormat(formatNoSymbols, stackFrame.MethodInfo.FullName); + stackTrace.AppendLine(); + } + } + return stackTrace.ToString(); + } + public StackFrame SelectedStackFrame { get { if (selectedStackFrame != null && selectedStackFrame.HasExpired) return null; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeInnerException.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeInnerException.cs deleted file mode 100644 index bef33a7609..0000000000 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/DebugeeInnerException.cs +++ /dev/null @@ -1,69 +0,0 @@ -// -// -// -// -// $Revision: 2900 $ -// - -using System.Text; -using Debugger.Wrappers.CorDebug; - -namespace Debugger -{ - /// - /// This contains the nested InnerExceptions of a Debugger.Exception class - /// - /// - /// - public class DebugeeInnerException : IDebugeeException - { - Debugger.Value exceptionValue; - - internal DebugeeInnerException (Debugger.Value exception) - { - this.exceptionValue = exception; - } - - /// - /// The InnerException property of the exception. - /// - /// - public DebugeeInnerException InnerException { - get { - Debugger.Value exVal = this.exceptionValue.GetMemberValue("_innerException"); - return (exVal.IsNull) ? null : new DebugeeInnerException(exVal); - } - } - - /// - /// The Message property of the exception. - /// - /// - public string Message { - get { - return this.exceptionValue.GetMemberValue("_message").AsString; - } - } - - /// - /// The GetType().FullName of the exception. - /// - /// - public string Type { - get { - return this.exceptionValue.Type.FullName; - } - } - - public override string ToString() - { - StringBuilder sb = new StringBuilder(); - sb.AppendFormat("Type: {0}", this.Type); - sb.AppendLine(); - sb.AppendLine("Message:"); - sb.Append(this.Message); - - return sb.ToString(); - } - } -} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Exception.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Exception.cs index c8d8678bf8..a5bd504b74 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Exception.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/Exception.cs @@ -13,159 +13,113 @@ using Debugger.Wrappers.CorDebug; namespace Debugger { - /// - /// This class contains data from an Exception throw by an application - /// being debugged. Since the System.Exception object being thrown - /// lives in the debugged application and not in debugger, this class is - /// neccessary. - /// + /// This convenience class provides access to an exception within the debugee. /// - public class Exception: DebuggerObject, IDebugeeException + public class Exception: DebuggerObject { - Thread thread; - ExceptionType exceptionType; + Value exception; - [Debugger.Tests.Ignore] - public Process Process { - get { - return thread.Process; - } + public Value Value { + get { return exception; } } - ICorDebugValue CorValue { - get { - return thread.CorThread.CurrentException; - } - } - - internal Exception(Thread thread, ExceptionType exceptionType) + public Exception(Value exception) { - this.thread = thread; - this.exceptionType = exceptionType; - } - - public Value RuntimeValue { - get { - return new Value(Process, CorValue); - } + this.exception = exception; } - - /// - /// The GetType().FullName of the exception. - /// + /// The GetType().FullName of the exception. /// public string Type { get { - return this.RuntimeValue.Type.FullName; + return exception.Type.FullName; } } - - /// - /// The InnerException property of the exception. - /// - /// - public DebugeeInnerException InnerException { - get { - Debugger.Value exVal = this.RuntimeValue.GetMemberValue("_innerException"); - return (exVal.IsNull) ? null : new DebugeeInnerException(exVal); - } - } - - /// - /// The Message property of the exception. - /// + /// The Message property of the exception. /// public string Message { get { - return this.RuntimeValue.GetMemberValue("_message").AsString; + Value message = exception.GetMemberValue("_message"); + return message.IsNull ? string.Empty : message.AsString; } } - public ExceptionType ExceptionType { + public string StackTrace { get { - return exceptionType; + try { + Value stackTrace = exception.GetMemberValue("StackTrace"); + return stackTrace.IsNull ? string.Empty : stackTrace.AsString; + } catch (GetValueException) { + // Evaluation is not possible after a stackoverflow exception + return string.Empty; + } } } - public bool IsUnhandled { + /// The InnerException property of the exception. + /// + public Exception InnerException { get { - return ExceptionType == ExceptionType.DEBUG_EXCEPTION_UNHANDLED; + Value innerException = exception.GetMemberValue("_innerException"); + return innerException.IsNull ? null : new Exception(innerException); } } - public SourcecodeSegment Location { - get { - if (thread.MostRecentStackFrameWithLoadedSymbols != null) { - return thread.MostRecentStackFrameWithLoadedSymbols.NextStatement; - } else { - return null; - } - } + public void MakeValuePermanent() + { + exception = exception.GetPermanentReference(); } - /// - /// This is the call stack as represented by the Debugger.ThreadObject. - /// - /// - /// - public string Callstack { - get { - StringBuilder callstack = new StringBuilder(); - foreach(StackFrame stackFrame in thread.GetCallstack(100)) { - callstack.Append(stackFrame.MethodInfo.Name); - callstack.Append("()"); - SourcecodeSegment loc = stackFrame.NextStatement; - if (loc != null) { - callstack.Append(" - "); - callstack.Append(loc.SourceFullFilename); - callstack.Append(":"); - callstack.Append(loc.StartLine); - callstack.Append(","); - callstack.Append(loc.StartColumn); - } - callstack.Append("\n"); - } - return callstack.ToString(); - } + public override string ToString() + { + return ToString("--- End of inner exception stack trace ---"); } - public bool Intercept() + public string ToString(string endOfInnerExceptionFormat) { - if (!thread.CorThread.Is()) return false; // Is the debuggee .NET 2.0? - if (thread.MostRecentStackFrame == null) return false; // Is frame available? It is not at StackOverflow - - try { - thread.CorThread.CastTo().InterceptCurrentException(thread.MostRecentStackFrame.CorILFrame.CastTo()); - } catch (COMException e) { - // 0x80131C02: Cannot intercept this exception - if ((uint)e.ErrorCode == 0x80131C02) { - return false; - } - throw; + StringBuilder sb = new StringBuilder(); + sb.Append(this.Type); + if (!string.IsNullOrEmpty(this.Message)) { + sb.Append(": "); + sb.Append(this.Message); } - - thread.CurrentException = null; - Process.AsyncContinue_KeepDebuggeeState(); - Process.WaitForPause(); - return true; + if (this.InnerException != null) { + sb.Append(" ---> "); + sb.Append(this.InnerException.ToString(endOfInnerExceptionFormat)); + sb.AppendLine(); + sb.Append(" "); + sb.Append(endOfInnerExceptionFormat); + } + sb.AppendLine(); + sb.Append(this.StackTrace); + return sb.ToString(); } } public class ExceptionEventArgs: ProcessEventArgs { Exception exception; + ExceptionType exceptionType; + bool isUnhandled; public Exception Exception { - get { - return exception; - } + get { return exception; } } - public ExceptionEventArgs(Process process, Exception exception):base(process) + public ExceptionType ExceptionType { + get { return exceptionType; } + } + + public bool IsUnhandled { + get { return isUnhandled; } + } + + public ExceptionEventArgs(Process process, Exception exception, ExceptionType exceptionType, bool isUnhandled):base(process) { this.exception = exception; + this.exceptionType = exceptionType; + this.isUnhandled = isUnhandled; } } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/ExceptionType.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/ExceptionType.cs index 3db5329f65..390460a72f 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/ExceptionType.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/ExceptionType.cs @@ -11,9 +11,9 @@ namespace Debugger { public enum ExceptionType { - DEBUG_EXCEPTION_FIRST_CHANCE = 1, - DEBUG_EXCEPTION_UNHANDLED = 4, - DEBUG_EXCEPTION_USER_FIRST_CHANCE = 2, - DEBUG_EXCEPTION_CATCH_HANDLER_FOUND = 3, + FirstChance = 1, + UserFirstChance = 2, + CatchHandlerFound = 3, + Unhandled = 4, } } diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/IDebugeeException.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/IDebugeeException.cs deleted file mode 100644 index 86132edd84..0000000000 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Debugger/IDebugeeException.cs +++ /dev/null @@ -1,21 +0,0 @@ -// -// -// -// -// $Revision: 3047 $ -// - -using System; - -namespace Debugger -{ - /// - /// Interface shared by Debugger.Exception and Debugger.DebugeeInnerException. - /// - public interface IDebugeeException - { - DebugeeInnerException InnerException { get; } - string Message { get; } - string Type { get; } - } -} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/CurrentExceptionExpression.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/CurrentExceptionExpression.cs new file mode 100644 index 0000000000..fd96b30bcf --- /dev/null +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/CurrentExceptionExpression.cs @@ -0,0 +1,46 @@ +// +// +// +// +// $Revision$ +// + +using System; + +namespace Debugger.Expressions +{ + /// + /// An expression which returns the current exception on the thread + /// + public class CurrentExceptionExpression: Expression + { + public override string Code { + get { + return "$exception"; + } + } + + protected override Value EvaluateInternal(StackFrame context) + { + if (context.Thread.CurrentException != null) { + return context.Thread.CurrentException.Value; + } else { + throw new GetValueException("No current exception"); + } + } + + #region GetHashCode and Equals + + public override int GetHashCode() + { + return typeof(CurrentExceptionExpression).GetHashCode(); + } + + public override bool Equals(object obj) + { + return obj is CurrentExceptionExpression; + } + + #endregion + } +} diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ThisReferenceExpression.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ThisReferenceExpression.cs index 3c5dae495b..75e39cd977 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ThisReferenceExpression.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Expressions/Ast/ThisReferenceExpression.cs @@ -10,7 +10,7 @@ using System; namespace Debugger.Expressions { /// - /// 'this' regerence of a non-static method. + /// 'this' reference of a non-static method. /// public class ThisReferenceExpression: Expression { diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs index c9fe4c4359..e909335324 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Internal/ManagedCallback.cs @@ -119,7 +119,12 @@ namespace Debugger void RaiseEvents() { if (process.PauseSession.PausedReason == PausedReason.Exception) { - ExceptionEventArgs args = new ExceptionEventArgs(process, process.SelectedThread.CurrentException); + // Needs to be done after the debugge state is created + process.SelectedThread.CurrentException_DebuggeeState = process.DebuggeeState; + } + + if (process.PauseSession.PausedReason == PausedReason.Exception) { + ExceptionEventArgs args = new ExceptionEventArgs(process, process.SelectedThread.CurrentException, process.SelectedThread.CurrentExceptionType, process.SelectedThread.CurrentExceptionIsUnhandled); process.OnExceptionThrown(args); // The event could have resumed or killed the process } @@ -209,7 +214,7 @@ namespace Debugger if (process.DebuggeeVersion.StartsWith("v1.")) { // Forward the call to Exception2, which handles EnterCallback and ExitCallback - ExceptionType exceptionType = (unhandled != 0)?ExceptionType.DEBUG_EXCEPTION_UNHANDLED:ExceptionType.DEBUG_EXCEPTION_FIRST_CHANCE; + ExceptionType exceptionType = (unhandled != 0) ? ExceptionType.Unhandled : ExceptionType.FirstChance; Exception2(pAppDomain, pThread, null, 0, (CorDebugExceptionCallbackType)exceptionType, 0); } else { // This callback should be ignored in v2 applications @@ -462,9 +467,11 @@ namespace Debugger // Watch out for the zeros and null! // Exception -> Exception2(pAppDomain, pThread, null, 0, exceptionType, 0); - process.SelectedThread.CurrentException = new Exception(process.SelectedThread, (ExceptionType)exceptionType); + process.SelectedThread.CurrentException = new Exception(new Value(process, new Expressions.CurrentExceptionExpression(), process.SelectedThread.CorThread.CurrentException)); + process.SelectedThread.CurrentExceptionType = (ExceptionType)exceptionType; + process.SelectedThread.CurrentExceptionIsUnhandled = (ExceptionType)exceptionType == ExceptionType.Unhandled; - if (process.SelectedThread.CurrentException.IsUnhandled || + if (process.SelectedThread.CurrentExceptionIsUnhandled || process.PauseOnHandledException) { pauseOnNextExit = true; diff --git a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs index d5446491bd..a82fbc4db8 100644 --- a/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs +++ b/src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Values/Value.cs @@ -115,6 +115,15 @@ namespace Debugger } } + public Value GetPermanentReference() + { + ICorDebugValue corValue; + corValue = this.RawCorValue; + corValue = DereferenceUnbox(corValue); + corValue = corValue.CastTo().CreateHandle(CorDebugHandleType.HANDLE_STRONG).CastTo(); + return new Value(process, expression, corValue); + } + internal Value(Process process, ICorDebugValue rawCorValue) :this (process, new EmptyExpression(), rawCorValue) diff --git a/src/Main/StartUp/Project/Resources/StringResources.resources b/src/Main/StartUp/Project/Resources/StringResources.resources index f4d572ae595f98178726162727b4ae2e1419d612..01b84e1ac7eb669156c5d037e4f62fe7bf6652dd 100644 GIT binary patch delta 35727 zcmZ^s1$Q$%@Bh91geN<@JG(pbo0&c5$^CnCz{U*$3)ZVMdpERE`~Oip((m8l z(?eN*Z+n=S&G()CXMJz#{hP9MuoBbxx3NlZm8KBX<$^p8lJ@3mCCq~+fmB4_d_89zr! z=Aj}5|5fs5fF&Q^)pFr$Ewc)W9LXy3RbeINHz@JFqa|XjlB?^rY`mdmST7wf-)Ga3 zv6Geq`?P#MU(2DdMc!_$rE^9t>z656JXs`fQ6(ALSyCg`lJ|Ql88}g7VMZl6XK2X~ zsb&5yC4EMU^mtpO&>NO~5h7Cms*y3Rtq8iQBHQNH--xRiX73srP|Mu?-?y14TCWv}9y6CDFMp zd2gte+ZD7#`HNIqB=WMMB{}YE+5MeJY<^45i^zs%S}G?f$C{7{D;s#Du}GDyZ0weni4`qr=q$!hK7N|LujH<>q_xqqsjrg#T1(bY zONO?!yi9*nWX)eExh(Wa=a>XBTQ&Q`M4XJGH#lRLhGGmCQkOq1uu$U6s5$2|Ku|rQ~XnpNC*z zTa?t{wCnO&(&Ms{`ej8H6t(182Tr?(12s@`2uU2QrQ}99{T#Sn{dg_kvw?x-EU8%5 zk|qt6EI7_a9*A_QA#!1&mfTB4-bYsrvs=>WZ6$V7B|lcva_+X4f^TVwd@Azzwvybx zDarr6lJ9;{^5!0qz0>Gxq2*3aR5njZ<(gW`&lVX_QRLcnEq`F(qvC&6vhlEzvn*^P zMZV~2NxD`rjId;Kw3bhnDB0XjN%dluoNJFw;DXz6u^(X6-H4Q3ERrv`NYBoelzd&w z;Cmtm(eY(m_Sq>doAHoV|1bG+&I40>ljlZCF8;@soGOZ zYzs^NENn^ru3ExdDw+O?$gGx@+-xLr^`(-&Wki;h6B)V~w=Iq;PH1^|gvd9)A{+hm z$Ve@pmDN&Vp~&~xfo}^XA92cGwriRCr;^?nS9+}^*K{od*;H*#TDv!=D{sl0xSoyL z8fQUG#YKj+MlCC~n7dkP0!C+k!o{;I`7~6?fR(5?9sV!vwKTy>*S8S)Y`sY7Y*;H& z$ut5z_ha`TDe>d8*ea3tZectNK(&WTJ_K-15!JT{qeZLtevAIhBZUv9;co2GnW3Bk~0qz2bBzp|MQ}f z3a7z}=Sp_^DjCxp@Y~LTU$-PnBPBhGYbp8~EOskd@)#HA=TI1$Tn;-lcL4ZU^M#g+ zml-n*aD0N@y~CVuMZ&6E65m~H2s*>hC zEP1QE$nvqo7c|i>7-<3-ecKZPUbCe0IyOB+$%E@6ldFj6Hvz;dT3YOY`CiQHs+OQg zv~ZsgfqA_B24LG&qyc7k092lsUE~&rxDt;}kw z=>xof!$~=Lzs~{5&$KN3T1y91HxwItkVoVcD&O0Ju}hT{{RXv_1aM0!3B<9cVxEXh_+$+89D8lbuE4=o*wflWX{J?vxC*F^A7l)PV8 zOa5Xazm6dT$Y#Y$%ymS(5bqlV*8GUece3PCYeIxClR@B8e-d{_DQSFLF+rpj=>B#yOEM6vz6}Qek%%DnkLN3?h`zhOAS!3EWYsPV7~{PA8X<-Q z7uOiYK%o9vdOQgCt(ZwkmvTzhVjL^Z5gv%b2WygN_=|i}UQ0C}E#tA?b)*RGs}T+| zfzHiPNoCNO6GimHP+urn^)~o)13OrXVWaENCYBtC(lQ(*KhRyvlHy7h7Qmq6qb+&& zf|9PBaMwwZk2YYXKZwlzTS*9kEasU=)iEMPFsSDTv=qyZk^QdZMJzhSW3mj^vV96M zXR(r%#HC+|&cm-^L%8ljFl|76!1I)nmUviABrKnbRG+8iF|gBV3XyqY87+Tp5xD`V zP3@1UcWN0+im^W0)H|)E>Q}(~Xf2Ndl=#opvUZ@7 z_8mo<_$%4o5;v_)bpKG~83ukB+-hGP?AQj*U8N*_6u^!~`~O2;g}p|6tRy3t zSg|oSOK7`Z3BR~0@;eOHAlQMMG1uMXa`;Ob4pDsv5VHp@S3uy%>~1%N{|B zZp8CoL|TI1OIQ*HY-Q+_*sffj_@Sq?%$uoYOHXo!@=9iu)>3wqmcT!>w5g>eJAiX9 zQKZB(vgx@>ivJ9@0}N%~5*d9QCV>y3AAqAFkotHX2@(i*k$l3gr==U3?V8?_fpEl(8&SRG#q@GuqI=jpY2?ygfQ~5XkHuWAuB1`PrbME> zgi=oY7nnU7|Lpuir1)|$zKkXQI6ySPWOUiY;P9aMgTu)1`XK!rtd)~AwIzOts~0^C z{~GwpGbN?7i}-Vn7Jis9v>muaXL1mAPfJ*BONtVqKkP}Z6JW_7VOsjI_ciCpojQTa z1iF8=P~JQwB41asdMC?csXeL^-J40g+{NsNWg}cnAdDZR6ZB1ZkGciMt8Z#4GMp-| zsU>Ho5IOggE3YT%q5Z>Nq<%=tkcGrA=H>f`*p<$b^qnbZs0eO7(vmBJG~rWR2aFp% zNXgf&2#my~uhIiF0Lw&$w!ZA6WYQ#&$Tvhf4HVZhJPrFRMES`n8(LZpN07t#C@F%5zU3e{x{-SmuL_b_efkSO zm{XC?mW<MD(+P>!)RuoUcI&9Yl;Oj03e5`K~OUOWN?+ zC4j()JR#Q@0?r~FDKtdO)*d828MpxeY39Uv+wJZ@z-Q*FFcXt==w9@?hfIcAA`-G1kP@s zQSy5hOInuGvablqJ#nUPJm~`vxs=bRB-*1mwG1VNfY+@^h^5IVPv;i#C4*{#alKv0 zlE7Ue$3iUedx-UGvU9NOCdSyb05$*&et{7MkvNxbA~KRM3b~M_5BduH*Mb0Lp{E;U%2vEdcg5Y2%X0cvCbf0xAu*5%Y0^NF|Xs@uCGoNR(F) z75KS<=S=TvN!MWV&%No0I`_4-{*KsLU&#nusdZ86hq`>8RWb~>y4X)zh#uOV1fdaR+8g9*+WN%o&yvKc+v7$E$wl`pd#E7wHG;;i@TKVNRki{w^GY7V*00KYo9XqpZG?W z!a8D4ZWy2Du0u%o+5HL-Z1WL}2aH&hnM~^uB^`Pm7(#fcL(MV~|0iBw_=_tj z&~wHKCBc(W4aiuMQ~y(qg#out?FcttYH2=IB;qiaGJ#4i5Q?7HL;v@uVl0)x`Z@&6 z4@hjUu{v2ne`3RbJ<^1cq5KiXUF!j^mUJ z#%O92xj(MK^%7}7GpzYHQuf9rltl9REr@rV0(sN-BGJK0-r?tifmCcnG%Oe=KV z!jd|x0iaMN@8v{iC2_+)QAZ-MjjA$&gge29^kk*S&TCmlZiZ9H%gI`fXW}-nHdR;# zvhlJ=08|X_j~eI;J)z}y?5SdWGxDm|mi)`fP9oB6L_(pRb-9SCY{_x_`Bp`&wJRBA zQ;MPuWZ?(6^B`>);RBEi#4G;7E;w0JsxANgh#t2M1@VGNh`LvY53apv2bty(Eq{(> zL*Hr{&|4%YxD!9&L(*I7jZ6)dG$BQ;)){fOMQrG7`c{#d8ws=ilypZ#24TfJ$pwys zm{Vs1KsUgOTo~;`vP@93Wj3np3(Wb7(vhDcYjDvB_`Q#6(-Y)&5MBGCzIbrsZQ6|scOy}5cBu?OS-oLe6ixSC-UuS=gwXY@Ml%&Y*gk-S%t%s4qmxvVojX8?p4rUSj zy(-fAf;ceiu$CV<*`85a`od>*6)l;{TXLug@Qnf9#s&B0MPfU-6tAaa-r4{T^q8SD|{dco1}={EZOpdmg1#|>0Pv( z97CYMzk|!8V}NBkfVFTd>H<bXHc<&3mH|kru;J`$sZiz;7YN16`%q2*x$$ghAx528oTT)T$fQ-ohIZt} z-;*qV$|YZdlGBbzO18p+S)|$@l>1nI6@0k)4^*VY|6Ex0?^Csum;@4H@!8SatR^A~ zHN7#1`s8=4{h&y5K%hQGcDWf+6x4?u3?K?_YCtqxh70CZ^3zPBB;&ipaaYxndWKE+ zi{}pLOZ-vRl7it0`;mm~2e&IJIdv2eYRD;+mWLa;IZls3HR6t`Cw@JgLJxfpsf}2# zWAPOzFP5@-f>2KMKCrx!UWj=A6Wk3o%mOED(6sGzB@Z)mVOzl>@*<_ay&3!-ZgLj* z1bl8{p;aTOGwyP^`Y(42vtj;})GUU3qnGIHEwY{o_;d;O*@4V9jJv8;xZ?=m`8eSj zka>feWD)e|lQ|(9&zpzZg?TaEmDB|h+i(!Qk_@>c@&EG|xYs?z{Q(`gO#pGZV`dips$B7gn zfxEb`A}&KyK7A7Lu(|eu3YVkESVV>cv{tA_nzo)O ziQ7FTKyB;59c6b*s?}7orx2kWL;R^ICqITfgn{L@`IJ=4V23;PGt6QPXCBYoNb73 ztd<(U_fv-e^l$T!5L7Dpll5Id$bo41`yB+=an2Vtt z(DJg2CBMchnJ|b;@U9e%?||i;`obF`_sNL&Wx|3V5cNR2Q`}Ph*a|h|)ABbu{f8=N zNJj1_PLbX0ARyJ}5Y@O+B-WR>O;HPqjyc3*FH{q}lPoK*NHsQP#V2qZ z_608gT7_F9u=)5`T#{f9Q<1{WQEcFh$Rb345L(n0!sl~Dk6WHyK*GvN+myzI7vo~} zoScCeaYbYp)zE1l(zJ;bwK-Aq6P}~QE18=`%loJ%{ud^G42U#@$;02dnYqjl3+#m1 z=j(uG((WR-PUpv5aFYA?%0LN)iyoqS{elb6g@DSJe__>s<1qxJYrP27n<=k;rN*ZO zsF;@=f#9_Xm%I2cCq6Fn#~dXWKSHt}a$EDDKjKdhnhl_A{sJSy#S*8p_$kDS?msR` z%>EVEBfO>y;W~-xb+$i7NEBSkPmB9lJAv!Nr^F66I{XbHAL9$K_-|vlt@#U8UgTP- z3E{i|aJ(E_z>faLhWZUe6u*=0)?9(lXXU90=~l10Jo5(kX9Fbv{GcTS9jDuaziLn| zirdJUWJ!HQR_+ver?Ha1piinp;@OqQmk+h%=ueK|$CVS_bMeKHR58FH!OvQjl{>Vsr9jg}iW9Zy=bU)31xj!;i_% zy91}Mp-0@VDxc4&c(Rf?-_6dYLO15)d$QvkzT9g9T+=9c9z+6o>99*casYP@*GOuX)EB9>op&?n-+G^G zSa9g~M}XmRZoa{w`#G@jf;EP*P+BYb8 z7Gb|&QMcOQ(h;I^H%n$Pbs))W=*Qg*UwaTd?_Vv2py6GCEDmd+2=BE|fSKTwG%Be2uCsVMz zO0@rE$Qq;as)}ZQMaCumt@4@3aFs`Ai!#ldsLCGMJT*{obI>_9QP(J$aDD$8gCx;w{dYV^K<5d~6x2lRU z`6{EOIu0qy_*G_S+%=U_JIO-1OC`mU7Bf=H&uR9C@?F)!1b->az*6>26` zSFvUgVpCO}-}~9Mal$xrHA+ReV+~j5`BW3rwT7Ci-f%wpnwUsP-Oa#AwcL(p_%t&l zQgt;0YNC>5^&PWpYWCE?6uB4(QTv@q-OZRD$SGJONjBH3Im z^P(2#m{J>)3vA%%qnXFXCEIlnNAU(}xVz*)n{Ad8<@+b z;T#gFN||%@F@VVpQiL07N~hQPOqT{KP_Iwg|GjACXRb9+VfH?_PcwTPsrKeT9?WMV zJ?et9$Lad(2A=D{HpsYBMl{3(Uod5;ql!izF>_;;%gz?`&8kMQ$YGi_;oS69 z*F~Z|@uu>D>|=H}=5&>q=dGXk!MuE?Mib^nI&)Xr&FLDDW}WD!jPD6?vA5qNO;uGr z=zn;(YKCXdi%xO?XY1vfbJ`2dRG?a69yU{})mtXMxmt?}6o^ri)oD|%1$JV!P@(FY z^ZQ)=bF^6yjh@|^`C9@%85^dNg-hPl63quUbTr@56l?{sgg11oqm$X(iu=&|4b!lI z5@OcW!3AUfhtHAL$g~adaDb`ZMzu4QUPq(-8k!;Xuvd4bw_jKJ?1_vR>WwJeM&;6T zk``OphQ*dObp6pRXr`*0l5JHfy*=$ZA+ajJ9B7MsoHSS4s@eLhhG{fHZ+f#gmIDMd zO2P+6YA(6d8@OO$Q{xTQ4f|U6hKjZ8kz@=_9P&Ka%xkZjWvC~krKdD8aqZMZq&TFb zD&%&U&h1rZ6_-M2XHQ^af&*OzoB`n`vV$t87MZ6VFyk8?R4#Sd`8`2>?#vmlpEok6 zD-#s_I;mLg-`MfT-sWm2j$XQPVy!>jj{2r$XSDrVW6#{zFTmz_Pvv9Z``?~G`$vfV(hMKi8{U^|OBk2z(_3Y> zGd1NA<*O5l=zLAnjQzehA}pVl(y4*RBW==bg$0z-O-s4R@;XN3@vCH>o z-A|a?opZR98U0mN`zz-3@aDYiPl(CTjLOn&XJ{_H_^*%|JOE@YZm4ad?b38N@rM5h zSKk=v%HI0OYt6h(y*UtvtHYpJZ_xdLgoBPt2dQRyXftm&vw9FpNMKyjexD3x zi;o9kUGvin^9{oRBBX-s{x7jI;6t>o{nO7 zCt^&tIOP!PDw(w4# zJSLABJqDRoGrPv(~MNOH>q&F296>IiRBT(&_Ohl?-ex6E>m2nCH z)6(VO_8pu8SPZ4z%Nt9(l%CqkGoQQDkVEgOq;e5&vhV?h_49_g#I0`vBWGKA#+N!a z*Hld8bH=ty85?Z>kh+9B_w%Xvx7FIQ>axb2J7<~-@NJG-2gn#IZqIa*dqQ-z)}C;o zl+a^Sy8}%0bii+UD#g$E%wXRKr(*ygw08X0Jt@Q@`p?$p@(@<+=rr=b?y;m1U_O|^ zhK9eM(j8#(&%^*`m~t~!8@>8<2V2XUE;C7}PR>+8_Jp<+G>JoI)X>|sNSUWDBKsI()+{23Og8rysVLIeB8e0!8)MD-M3vnPPE_UeNw-ng{>YtK zZZU?QEJ}ST)|6SSYU|HqP26JDSU-q0#}})5WYp^t$#p6&!JJFI;h3{KZ|o9P*)C7J zrPuy?36(%I+EHG+`cg`TUf$fPOVRfr@At^X$|ut>Y0aTW<5wfh-KDCDJ)Vj6&BLWY zP9K8|7Mc-;6K;kK;AXP&nUc#8=>tQgI0vzH3bC@S+NEs=n{~@n9+lDjxC|)vH@TNn zBjjXAn2BEwX7^f-01KFL%Sm-gn+?lVxO&Ze=6qB$J}Xoms>jAFNb6oV<5xiJXm+n4 z)#+(2Ijw;vawUc5NHcIHxH!QqT1k|9(`Ei*CCtBGNr|$loq4`eRnj}!nF^~^ncVNv zAJ72j8;ruc@);%#B}$IBGhHnRU zoMD8UpVuIm$|l!Z#z&jFYdLjGGt&8JZ|0Ue&U{rXA+A z!|eJUcu~RmHG&fQ;s({m9NB=4wR3*&WA~=FgVWp0%-9HIj-ox@X;(InHiJmT%HycN zZp2_G)6*$UPp?f>z3)JD*G(FJZWEh%?>{5oie%)c{~?;q5FbEvS9hlu(a$=VtZ%8; zZOt7N*9Xon*1bhku3~n-rCQo`Ajf#*$Su^NO=(9u?P6w<)9y$+&J^512)(pL)zSky z8o#$yZ#}o8d9W4R-SM_+WG`dTAa4-u%%;*-6>gXAlrnS8R%V{=F^9r3be1h*0lin0emY3)+XsvS7Q1ZR8&^JE9L z+riGJz)scPzQdT|ro}Gkp}RoyqdS3!>|LCR$;1$9ho-w!4|^o!q27i&?j|+d^GN%e ze7gb5qx1|<>50;px|q&;R6X-(H-2!p%hElnqkint+S?dAcVDh-p6pS@>>RY4q_llZ z%f09$1mZg5zfUdCm>kK&O_qIXs~t;EFK_s&y{cFaC;1sJ_4#)M(Xxl!pubCMzZt(@ z`Pu>9oXo>r^QhAW0Y=kg_J*0aaPo>Sk)c1D>oopbDuL=JWwIQ4e)# zqx7O~X8x~u>D>dWT;|kF<8U|Q|E_w&ejna-OxKItFU1{1t)IWkKWpEm^!u)xX>pB- z$>dPorn}j5GMQ5LAW?W&ck}aEj}mUr?(Up5mDTx!s*c{=-DEqYUeg!5n_A~UiCTy8 zjxmQ+K7FUVS$_%ak2wacT|7i(@fdE0Dd_thCLxRHVf<(6yk7U*BZTQ&hryYK=ILQd zgONR)6vbW3ozH+0`e_f-;-lm>?jNN*@jXgL^iL0yaFb0ku(Fv6SqJqrSC?|%<5Ec3 z(;0P)WVvBav+z@IV3Z!!GiCkC&P}aPj=pHDx3olaPO3IccK38juH-#XqfElyI~-S8 z_4%GAA>P}2Wpna4B|$dBJ@H80yqDSiD0wT}PvG=zdO5mIW|GIeIKc%-pI&K%RpTVW z8q~{EhI`lrCpkkxFGm@T^&)p{MH7CCVe5LCm{Ua9eM!W#5bYx@5tXupj|n-23i6&t z#pipOvZqyD`^GDq@J9GHAuDzA^oL2j9-U@^Z+oT4GKo>O_f&N|p*IiS%-*LewwUI&p|^Q>9DPD< zsqdyXDwv}mkZV2tzZNZhMn!6?k2yWdlYi1uN6rwF+1!U*J(c+oFDdT)p1?KQ)epIo zY2|!$GP^!vLmm1!R#?~*lYLf|vwQY&((z;+C7pY~S$9U7@KBo4^s-aHDJ?$m0JDvIGW8CA+$7HSkebegE z?I~f0L9Cv#HFFdJjaXaYg&9rdg4+_UjSS?_I1$1-Hkgi z)*b-UH$8Pey`To@@qJCf8;qb)%&ff#;w zoIaNczRa0X?=yLYxPU=sYr9?3StcE=XvVdPq=t*e3e_&STDGZ?`V7-6vqd#?)cG>`RPDI*&V|=cmBJ-F}X@cP4TD`BREi4C0z< zt*i9+4#v1Z6LW*a_vJP0zJ7mGFh7WqN*?tYhSsvbBjY!W-*phHZ-29Jnzys0sZ*{K z9ESBzyFIrj+&sUIzQ@7zh8m;i|IftVZ(t>BVD6wu>Y8hoXdg4+Ca&?8yYLXbufM0e z2% z^50g??2rKt2>*NqU+;7W?Ave~!B-q$YW|eW!X>Las4be=*C@iE6ww_AI8MPbcT|Mk z4=%9|mpmr@T?+Wl_jRG{PPW)Xl2gr*3`x>(%w5$_Pafde0F9QW3h7G&cuJJK#P%<^56=4q9(F73K*)tOS-tBmtPpKl??rz(2bv-O5}>~S5(o<2 zfLgbG$<&IefNSQ8`_D3T6(NcA|K4L&#Pt6WnKg_{InfUEq`Fm*yrT&2M?a*ZPR5u&{ z!1^)_OIsk`3nJe8J4_SRg>*+ z-2U9KB)6|;2L6LR@n||s-yLS09McmDPhk&yc2Lq&_}8*%LxdnSV)X z9}Rbwd{g_5Fg3%Hht_;S3@K^WyiiN*AtRFDqn?2rY*xM`k}V&R%EqBCDXEL-VrP` zchHkYCL3g^neS+v;XbB%I-b~{cIHGo)T;X8$YcS#!~9GkTNl&6j7*kYs99+1a{9$c zGrt}DkNN;}InwJ6w*M&S**cltYaa1Tdffx3oMfcrUn}KW_#cN z-Je|-vyYE=wDvGuH#NyKqwK2?7rja>WzGcZKz(bxqrq5bZ>3Df9PI78@vfn{$4ll= z%Gg1=koKM6q((`Dw+HDUyVivNgK@o_Fm5>E|6+4Dr!J(LEzPA@>ZudVRopLmokAvC zZe2?+oM2ky*6-SfVElHW^(Z&I#T~R(No*WBJ3xp$y!t&*G1z^wgP&%SzAbl zn2kksE;FW>&ZVoz8@~oga_(G0*Ej2y==7#+ak@Gr&DdQ^7c%#Y>oDCX-VuMSDNs^J zI+Uzte+eC+raLPvF_%jrlkO#viTN+nyrp!oy)jeawh)-3;?oi!LUyFB8*s~ObTF6W-!_ys=kZNG_!*qCx?t=*- zkzsm^T{0m>7tVmh&Of9#gUe##uP3Cg;7-k14sY+Ckm~-f;jb&l9)~BmxX8{&+tXn9 zv3I_Y%j=2yT7o&%1AI#e2abnNax`~DKb+)cqb?AHy~cJkR{+SCO?IMogjrWv`z)=f zYng2oQ1|x99)~1qYkS{h$9)$@=uzfMMO^OCWXI*)X;EfS1dL8h_W1in5Fs$>ApOx~ zM-rR#=abEXYI>}xRhfN%mpZYV{>2?J)=aFTOWDs@;%#pU+F4C_Rb9mHGR1LZcik-c zbwK9Si>J9$9P?kJS4?rZZ_sbK?Xjl$LNb6;)zQQrx5uTVH?3>1>-Ul=`W|GIokD_*w1&2OgemAE!g}v#j%fOW>6)7Giz<^^Z67L zSzE88lDl79uT>pPd>y^j-tne$qT03fKzZ+6TCo|hv}u}Ga3zzY>^;+xOrx4Jtg7kM9O)jK=H_uGd02?K-5lwjpXQVv6-~Ad zI?zPMp#7rLlTw@493t1wF*<~V_(_ajtE*4EDBcHHZ~M_Ov>0Ns7OwWnfO*j3~ zOvl2;n#1jJg1em%*sYl!zPOuR-cjdLMNM!=z1^-b>($d;?!@U@Kumi&h{bffSt%<- znM_^K{qkAPGJEt6_cPi&-GH*!cG0c%$yr_s*t|ROa70&KUFV yO=e45GDTV2IIKd4#Y$l1`p7eX1j6AZJ5rC(fQ}Nm(t|UdCc2AbP)Gk zCwu5b-Dr+?1rpa&_tCrNc&1OIrHSr^s7}l=_j>Es%<^6s*Hw>)dC*Ijv+vAti@x4$ zwsUV>;)gljg$AA6k@rD}7kU%C{&5*})EVb`iDYtjxDK4_C6dXMJXu>)qdG5^ICmO_ z=X#guZf|^FqHg8B9HaJJ?@A<@9IV^^hmzGi=*zl;=Q*ULQJp2z`oukERdEghhJ?IUwjZa0#9+u3I!y7rXYV|ITaZu!pu zT|s}&aVD^!OGzAv>wLpl*RxW`_OqY;FR`4t7svVb57HHE|9L6*EbgK%H@CaRU{Z&& z^UTlVfTdLO?ZIfN&OFB%lGb)d^ToA1y48P17Xq%i+E}QDnVyu~n( z1hDE*9cova@4i&ww3iP>>9yuNWkq@OY$z7laK3jF$=)K(sRcTHVyR_*y7_!>S1(6k zmJ^3_mY2hr*=D{|GQY-qL*!JDOX!~S9goUqu8br`WZ@-V^UrV+vSITbWrQ1d{(=## zvu(b)G(vZ@ud|t?8!hI9yB6L^_($2|cE|1bJ zb-)5oLNQ|q+I|}d96yX=4>kMith(rer0T%q^myH5fu~nyRxn-r zlVi18kYwqOHARor<#?Hpq2XrxSZb(|?)XY3Y#fG{xWL=0Ujic7=}=ZKaAftSzO%qH z$>bg$(v8=xl{S78^jJNAp<}&on6D?G##IZAn#f;Y+U0)sG~Z5y_|ZZ~xaE!CBwfOE zh$rCRbmt7y-z@Zw1LqF<$wE(IG-{c12|7^yZH9~^hL%gfLn}`rrQp3u4EGIla1sWV zn@Y#Iux5Ou37@RP=~8 znK!1h%WWn;Ubiz>rgI_i&LZal+mHnGwYeYgSaAjiJH!5+$8>BnpP4rUr}=D=^Yo*V z>D^!ZnO_~s10*q1_t#GrnTa!XN1Y)t<;?j^;4EFAd!|#f$f>r@0zfM{zxS}C5*`0> zSL--i7t?JMJ?mIETi3TIrFIsWql>9T<2O@RHWTLn7#owgU!H>*A4~Mgc^Xv{uf+N4 zGl`xecF)!A>}#-zHGJtIG%@l-dQ)p2>)cIr9!ljk%;1gcd0^xBiQe;&WJ<7pp6Ed= zlt5EvK0cX!amtuLGh;pxvhZT($%w<-+?ucb?8>yOdTZ^up3Vd>(7rlqvFBtipEnlh z2;Mqhut3M^Zi}6#Bzbwy1sHsHA;NC35K|nIG(MS}M~`3Z9ml2QU&KykEcWiGT*~4_ zIlnuy!&U+g`hbtq{r9*(6QID4`7O_P3~TWo4A)|2#Aw&~p0 zGc{=GYMsvbE!D+L@Dg3fzR7Wu06lGQn0adnSn`nGq`UC6y|Mab>IqXhCZ1gE%gx!9 zrFyn5x+LXz-hc(mK$mSshmzsdT&%<0eIyg}n3~IQ>N-pQvrqb?b*m-rT~+Gt-C4z# z6ZAVS@$%4=&ADBRmt!Bjmw4AfDP3JwVEMJ`S?SH5WjJO26*{wyW4`muH|?P6dIt+S z&)w2e^Eijocm9v@dCbw3cu?$0F!MWebz#!cSkCP!re*0Xi{vx>xyvFt_fik0k`^h( zyEnLL=~t=sb>vbnKS>$3ZZ(N^>!qoJG70OPBzz6PUUm&$+?T#2n+!_n3)S)eJ7uji zWi3;d{_m8vtg`z*lKSYyh5taF>T8;LaQ zjp0uc4qRrs9`raBG7mNbSEHACyvx2td|t84wD>f+`|Y>b+3sbg%YkG{ zwk_PlUT{{aZf0#k**`8bd$#B@1e1GPbd+6Txq~r#-)3ty-^K~M(XOA`HtXKTHs>ri zyWZAK?bUSFaXL$xQd>#O_b+$WE@=jC)z$4Ibn?2*Hlo#!TM_*E;*v=hPJ|^(RrG50Q z-HjKW+dWb~`@K%YbNSRY$M&+Jzgdp=XOfl+R#{BgK0T2;^qu?on-~RGEcIYLhz2-??IOUNafNr}Nt8&*t9lo)hsEgcB?&CfoZ5c zc(r4xu0e3d0MqO!9(5oSNy%i^b_|bU5%ye$k!u_WK@wLx;8oHwj?CuXQEYL=>J+7C zHZM-2isr{)upI_FJk=(V4;}+T4#FzI@t)!y3wOfx++a*oUToh4xOHGUrt5~2rz@=UjK^Kn<&^DX47K{YG_p)42beo& zIdA>{yRY#%`dY6`V>+qxj+|rf-OR)D$>x*X70gSs|4R+C&tLvCs zA5+bbqusphcj2xj&r z*4W6rcHWjCR?yqldt#wc&NRPFOx>5tB+#t5OpH9S-qTIFD+J@;FH-?)n~9(3mSj;^KOqe9;?bvE+|=J-UY>A7c0(62_BE&A+Ti$U5@qZ) zqGQhuo@=;cez=BmhL{)EbQ?9v;aJL@Ydd&7-2~sHoO|{e*Q&G4-RrpipPz9j>frf$ zlW<*kP$wL6AN8TrYUUTixrg#zs`Is{o^ox2;|fVD|9peg{+`2d5KcT7zILXK?#sJQ zKuv!O^Uk}`l)uXO+PAQ$Vs!GxtkZe_7Ld907VcSQqo-sjp}OWqSA9$GaME_4qpRi{ z-IGEnXCiOw^#1ihWM?ZQ*pw62I+>2QsepZH`R{VrPn?eqSw;}WoH#a&|DKvBcX@*CV}qDn7X+1F zkRua^EX!l&e?cs1_9f5RKL3Ip45p*Ps~wqIvQ{sd^glgW)oRo6OWnpkNEdJCehJ+9 ze#LdkNmJk}-P*nexwS)%HmAPQnbmD`@hjcLegwIlIsJ`pr~ln-LZ0XvCgdAk$k+Mm zS{%{b|E&~aDLdy|&X+wI+`(-BhWsMGIrfd7Zm)wp&z$;3Pci4e#YdmKWoke57^OG) z9`SX|^jlIXS)7-72BGo5EzUPS;8x4L`-q5_n|7?%&hi}rsDv5(9SD@L%SvZD#aZbQ z7ldfLZt}RQORHO%jsBjwjiJRkb3Iz;?{WJ<(8j+)^D%e6*J1WsbnsIC4=``~18L(! z+AW=SqZCE|VJ`kaUX}4}@AUnCf?t8RophIDRx`9i&5Iw&8|p(`nnLVgFQdIIwVfec zjzDSVZo_PRjB94tD$>nscYH!jPWObMnZp!#qWjn-U+K%2B??i+;U0t0M7VkK1Z%Bo zYCXkT8<@FIftJ_JgQsA2FJ2bna%a5L7iqQ(wX)h%VAaK2Ci^cu#+pmJzSkZcX=S!I z(N5ad`@gWQovGu4e&wR)sHyQQS;{rYyPWeBHd}wybLw%zdFa# zKe+)q`8#MEXYTw?K%V5xisajmG0!Ly6StX@FOo)m^bE_`HAd16g_n$1W z;t%S_YiWjF{ez*mz4e3sWc@F_-<>C%`tde1{~w*xB>btv)L#yV2s`6;2kqRwH~ovi zo8J`t3#k?}aeu?#A!SVd-XsX(&~E%i>~6H(Jbb20C)QZxleGaj=DhMB2Nt~H(M|im z@xortggScY_SB=?{~I(Lld`5?GKzR#=bE(L6^#l02WV~ooSTK|X(@9zgA{w7!+C?l zIhP6fhiryAH?yf4PLg*9zEw@abC9>(Kiu_w<($PGmCKy?2Y`wHhwz4 z!zg?&DJxE`H8r(0+}_8q4#~s#vb5t2AEssJYg$-V9(~!}L_zaZSv+vEtU&e99Jj0i z`rDmmh_CgU>6Fg$(;>S|i|kf@GvCJwGH(Vdzr@+geN}mLBAwO9ZobPgsMG1KavADi z7K5duLys_HZ7Wds+2ykFugf?0Vp1aVFd65JsbGB4TS0o&E^|6tGIuDMP3QEMpW12S z(pybHc6a2@&d3|P%mV-9k<~L;!S>fIUe#UP%+Fx?@}5XRU-&w|o0}PsSHayW1M>S= zzIFudC~rasACB9|4Dqp|?6#0AyW}j*_;!`^t>JEv>UblIXS4z^1ef)oj8-0^ko)^_ zez$j~a?I=t$5T#UGj-KrT)}MeMSef+PIJQVd@cU`)gDJK6;1U_R@U@+_V6e~nbX<1 zAgewYO=roBHr8db!tJ7T4SKbwvRx5k7t{5TVvzIXe|%;uEPZW=Gn5&UjYYr8jP*pj zQ@wT;^fo<}VAYRC_urXJ}yjvRNHeTQlDu zh0>GR?9PU2czf3m!n16MBEk7R#$LeRit6F49&Y~iv%=LnQ_kP&qz*b$TiR#o?U2&T zw*&&LLiR0)e3dq73OP#v?0#_OMVLZla^9(ZbC{UyY_E`6 zo84+>zqZf4f62kYR|i^!OzS}O9{mb2T=g;hIn5?&hRL79YGa?Gm-il>rMKm<>gXp) zD-{m1f_26H=4v3zjt;`)+U|EuzoI!4WaZKW_dC+7XaaLu#q2ltJKsBVc^uDWW#&(e zOw4Ju*1PsQx~^y(T6QPFNZs}oW^_uK;b;2g!V+#JEx`C(cEAD0<5PH=T)8o*a;8jf zs}31lTyB)n*<8$RMeC6V%#ifB!o1v;Ut+O&S##7yHqI-uy;*W7k#riY>X`Dmtx{%T z9$3$(J;-a{%wt8VnXTgB8?6B5iBFPRC!R;2xcA(hRfV08LLFuDjoWEK{-avT0nhccT21*`x&>W~xf z-4VM+;_}@JU_ul5t`4(z(AUKHhghNJ#{yOee`F*}2;^swBR%r?5ZpSunIB@+QhbrG zpjFH~3$e1Q`VOg>DP0inZhzQ8w@HQA!+?S)V~8`Zf;|B;TXV>F3R*$-G}`<%2B)37 zkQHJtrp+I$aN1o8S^4;D0S^1@US8`}0e$2sgTkCa#mt>TmXG?t+e4iVi;e-@GptS z6gz587H5$%B{A+9B?(Ry(^AeuQMJv3l2(1bw8ux)ENQ>O-rfuig`Rw7Rw*p- zaw#iVtv8QLS+Vw$qs|{BC?9GyGs{a``D}H}`MPFu+t1_*g?m<0Ce#{WhtL=8^hKC! zp%`%(?fPyzM`~u}eLb%VU5&h<1IoaGKXX=wWT83aS}r-wwHdF6hN0%Z$4p!?j(NE( zTkIAF|DlX7=Lr;IF8fW|EmPX4APnzVWK>y##v1zg&by-?#_|ZZtX0I`3b9!VF~UAX zJ36JE$5bzebDlkB2A5*p!Q}w8OUKOo%3dSD94TjI)z^=i1V{RG`I9Nu>A4$VHmnRDn6H|dbIKP`y<*~|~$DOLe-CYXNln%#>3#S=6KAfRd z85-^l-5rh}*QT8$1ZN8wlW%IH&C77Bs%~~X&Gve|2FJEeN2r^xI^Vl@Qk&7z?YL({ zS6&0G`kKf}RvlBNf)%7jJL|W$r?N_t_?#i;+X^hb0AeF=D-JPBn53$Ct!YsagnXAF z{ZfaRgi2Ocb0q=|`b4mo4@^RY)rJ3?p8;~k`LzcbKWjUGeZ>3r`ZrE9R{wh35qp{c zSJst>MRg=`<~8Fj83`dID83kj!~hO_#2`UHBZ`Ux8WBYl1{egv0bxW%k;4$~cgV@XT+iS3je)Uv3+*+WbV0aX+WC}(Yj;*)%`2K5fj5;)>?jxA080)1| z+F^XQV*BhppK?a9WX)Q-GJ>UPYrwN^^9(@4If5k_u_2Kvz~m`*3-e4ztn+)go?4W=JPGk@)uC@0fo z1M{LQk+6-JH<%uen@Zkb(=-!l?HD9n<}ny1MZ*6RPEx;2_ADjGV;vUcs8cnIIbDjf z;t#dnkys|HPI8B~N$?k(kOb63!kF7n(za>r1VK608$-vHtn4LPkdF*C*_l>Pg?rr* z+{Jv`z(6@izgyeZ#9@x=F|&%>Svdtjyp^!CQlnwhpwWM%p*rR)84OSx5O-yZmG;Cm z*5AR(c2e~;He31VEd7)s4ZJ^TF;s2iSstu3@k~!k<1u01o#p0*qpo<&=R;gv1%IfV zfo1tnJpRd@1(M$9cz0f;5!10VRL{{BF1%zqbR9(}XCOWtn~t^#=WK0#l+tq)lMS&E zv(V?58O&E(d5$M3V)!Q#pc8=Z_K<~5(hTh2E|M+*Y26)O@}WAWQvU#`ZMRHDS{!M{?0^vd4+b&L@GG)yv=J#)OjVs4kz+DABx3@$drh1 z6W@iZo2>abk$d=gX?SQXU{%P&=GMl+M>%j_8iyF+wpmDN|4Nr;AzQr4iSQ-)Ec7XI zHpJZR6my@eqjEMRC>Nyl2}GX+O&6!4j~oV z1hBU@=pv8mf~;>E_L$=@(&0!O1rQ(7n_*-t9pT0_h}lNJrLhUhpD*&5Xytg_1ZhIh z$%|Y`LkNhk=10<`<9tD(6Zf5|Jsn;i0SzgIja>7Bod>ne zK`&qBKDDxu+juAJp?uP4mm4H$&Ngz9;j}pe+Xdy4y&6W9iRA221}4d!beRa+8!p+U zxYF88?51~JvI`K1J3Y?C`tNj^M-!nPzqtsn9+&M6bp*tl^r=vPI-Q&g4|$7pSy&nH z&^-%6KEBK&gHXrKktv+61zb^!ISf@9WLV0(M7Qow#e;lB;4qLzc zCAfP5vg43z;vjbsW)hSx^veQxy5$-j*@=$oQK0w&Fsr590yx08*MvA(ffErIn%Ii_ zoII~vN9<2~7b200xh^z{uDfwyIE<}hA@jzW^iBEy9TY zvj{`|h?9m;>|)sHF-|XkQ`KT*LFaLsZkctsXyUBp&)2TgPm9?U&ENT-KuRpacuNX# zr15Ms{ue;fEWw_CD1HX8C0|3N-gEM*m;(_NS$I7sIId(%#d>IlP|K(6w!wun=f_C9@m{%(ZgyMaB z@pp&Pu*?1S2K`nDMgMC#EbS+U24mhr15FE`w5GLKqH0&-oT?wnc<^g2>!^DrN@ z=a4PZNK4+q`~db=0$PN1kU(aagJx2TP^?5c%2}VDwg(zClTyJ9oX|$z2)s^ zb5Ir3S=Ecb&y|UtdJ&|+asXu}}-({C%_|X@6TB6Auvwh1JqN*pO7M~TEqG%f4NBk6?m8g1dj*S;E44&&0Y(m z1Q4PpciEusxlUhoY3)Tnzl+5F zdw@dsWAJJVB$<_Nw}kV{rsLNl@QquG;k>vGf#{iAyw5w4*Zqc&M=x_T57U9aDSEq`(Fv5FHPLmxfi8kOEA`x85sB|*|Ct6IwhbQ_9W>GA+ z_!>BnbQ{tA)(R*M-i+!l>Ep zuHXrPiu-LlUk^d+Di3U8Fkbm_$BVb6wMT5m7A=U1HnVc=IIt>|Gx*wj@Y>ieLaZuxM2sA%xGg=K)AZ!0Xt7Sw zPCMyH6?%dUwF=Mij)HqoCwFX*_<=ZoQ2jZl)6>?iu*W;MrJ)O9EnCqG{C5Rau-0|& zV`lol52ya8RS^Q2@jj&E%uVDpKn80)Tg6cfPYimyXk2>PUia{8l>v=|yaWw92f<28Ss1tzxCJ6Aq=; zZHN`FZT7B!7Izr5$tgs^U-4;^E*iEIlRL3Z=3pq`opw$;wN0|LBc$Jfq0ViS%Zz}3 z-vM>3ZCY9)t!g{b?A>ZXF{DxOQ&ZLfN8D zms;%t`@jzycSBoy+oggo?ZJ}ey9dw54_oPh=xGxWyfRq3hs{;)c2)#Z z)?S2m&khlD_A+1o=8UcXP1NPPpIf! zX9>#b4iU!DQsUIOAJi8+#At!~D%b2SU1=8hVPBDZfCVb|tX+&b2$N|+h4Ql_;&l+D z&J=JEBXgzPgE+H&o{|o+p}6Q0`C$fAz#8oA=1_DEGiV>(4W5Me{DPlih_c@j@P3ZM4`cCA0Y^x<<}gO= zO~(&I+X0oe=+X!ZuSGZ-1)8anroNU9?q=X^lE^qkd7A!L3z5l3eU7l!(czxnqZU|l z{IYY5X=-YQ(LBeLuV$vJ`Njeh?(dJwH>uth)4bfAJY(KsH9a%iq^9TO@#;+T9L)>f z6#9^@e`&Cw%QK}eP6a_qrdeH>VKS>}rfic1bfR7U(e{Vz%+p7`dO8;?w5zwXiJtA_ zTt{tvoCCXQrv*OHlIR`V^!)GXDKXG}GzAk*|UTGS=_ zBG9Qz0*W;5U5X*unP!u^B(O;HQY7a<(+$qSUQy^owkfTXspjc8Gt?x(qi-9WL)?yD JOK~2e|3A{imGuAs delta 36006 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 bYn_9Jy!6t{l@_xeQrJ3r`e&W