From 7a3d743650e30a68c822895ca44f5738da4b7c9e Mon Sep 17 00:00:00 2001 From: MaxED Date: Wed, 29 Oct 2014 11:35:27 +0000 Subject: [PATCH] Fixed, Thing Edit form: double-click on a thing type in the Things list was handled incorrectly in some cases. Changed, Thing Edit form: multi-select mode is now disabled when only one thing is edited. Internal: different implementation of MultiSelectTreeview (http://sourceforge.net/projects/mstreeview/) is now used. --- .../Controls/ThingBrowserControl.Designer.cs | 31 +- Source/Core/Controls/ThingBrowserControl.cs | 119 +- Source/Core/Controls/ThingBrowserControl.resx | 788 ++++--- .../GZBuilder/Controls/MultiSelectTreeview.cs | 2010 ++++++++++++++--- Source/Core/Windows/ThingEditForm.cs | 1 + Source/Core/Windows/ThingEditFormUDMF.cs | 1 + 6 files changed, 2123 insertions(+), 827 deletions(-) diff --git a/Source/Core/Controls/ThingBrowserControl.Designer.cs b/Source/Core/Controls/ThingBrowserControl.Designer.cs index aeb69a7d..bdba9889 100644 --- a/Source/Core/Controls/ThingBrowserControl.Designer.cs +++ b/Source/Core/Controls/ThingBrowserControl.Designer.cs @@ -39,11 +39,11 @@ namespace CodeImp.DoomBuilder.Controls this.positionlabel = new System.Windows.Forms.Label(); this.thingimages = new System.Windows.Forms.ImageList(this.components); this.infopanel = new System.Windows.Forms.Panel(); + this.typeid = new CodeImp.DoomBuilder.Controls.NumericTextbox(); this.label1 = new System.Windows.Forms.Label(); this.tbFilter = new System.Windows.Forms.TextBox(); this.bClear = new System.Windows.Forms.Button(); this.typelist = new CodeImp.DoomBuilder.GZBuilder.Controls.MultiSelectTreeview(); - this.typeid = new CodeImp.DoomBuilder.Controls.NumericTextbox(); this.infopanel.SuspendLayout(); this.SuspendLayout(); // @@ -152,6 +152,19 @@ namespace CodeImp.DoomBuilder.Controls this.infopanel.Size = new System.Drawing.Size(304, 48); this.infopanel.TabIndex = 18; // + // typeid + // + this.typeid.AllowDecimal = false; + this.typeid.AllowNegative = false; + this.typeid.AllowRelative = false; + this.typeid.ForeColor = System.Drawing.SystemColors.WindowText; + this.typeid.ImeMode = System.Windows.Forms.ImeMode.Off; + this.typeid.Location = new System.Drawing.Point(41, 5); + this.typeid.Name = "typeid"; + this.typeid.Size = new System.Drawing.Size(68, 20); + this.typeid.TabIndex = 1; + this.typeid.TextChanged += new System.EventHandler(this.typeid_TextChanged); + // // label1 // this.label1.AutoSize = true; @@ -191,26 +204,14 @@ namespace CodeImp.DoomBuilder.Controls this.typelist.Margin = new System.Windows.Forms.Padding(8, 8, 9, 8); this.typelist.Name = "typelist"; this.typelist.SelectedImageIndex = 0; - this.typelist.SelectedNodes = ((System.Collections.Generic.List)(resources.GetObject("typelist.SelectedNodes"))); + this.typelist.SelectionBackColor = System.Drawing.SystemColors.Highlight; + this.typelist.SelectionMode = CodeImp.DoomBuilder.GZBuilder.Controls.TreeViewSelectionMode.SingleSelect; this.typelist.Size = new System.Drawing.Size(304, 244); this.typelist.TabIndex = 22; - this.typelist.UseMultiSelection = false; this.typelist.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.typelist_MouseDoubleClick); this.typelist.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.typelist_AfterSelect); this.typelist.MouseEnter += new System.EventHandler(this.typelist_MouseEnter); // - // typeid - // - this.typeid.AllowDecimal = false; - this.typeid.AllowNegative = false; - this.typeid.AllowRelative = false; - this.typeid.ImeMode = System.Windows.Forms.ImeMode.Off; - this.typeid.Location = new System.Drawing.Point(41, 5); - this.typeid.Name = "typeid"; - this.typeid.Size = new System.Drawing.Size(68, 20); - this.typeid.TabIndex = 1; - this.typeid.TextChanged += new System.EventHandler(this.typeid_TextChanged); - // // ThingBrowserControl // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); diff --git a/Source/Core/Controls/ThingBrowserControl.cs b/Source/Core/Controls/ThingBrowserControl.cs index 8d709732..d31846e5 100644 --- a/Source/Core/Controls/ThingBrowserControl.cs +++ b/Source/Core/Controls/ThingBrowserControl.cs @@ -20,6 +20,7 @@ using System; using System.Collections.Generic; using System.Windows.Forms; using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.GZBuilder.Controls; #endregion @@ -43,13 +44,14 @@ namespace CodeImp.DoomBuilder.Controls private ThingTypeInfo thinginfo; private bool doupdatenode; private bool doupdatetextbox; + private TreeNode doubleclickednode; //mxd #endregion #region ================== Properties public string TypeStringValue { get { return typeid.Text; } } - public bool UseMultiSelection { get { return typelist.UseMultiSelection; } set { typelist.UseMultiSelection = value; } } + public bool UseMultiSelection { get { return typelist.SelectionMode == TreeViewSelectionMode.MultiSelectSameLevel; } set { typelist.SelectionMode = (value ? TreeViewSelectionMode.MultiSelectSameLevel : TreeViewSelectionMode.SingleSelect); } } #endregion @@ -112,7 +114,7 @@ namespace CodeImp.DoomBuilder.Controls doupdatenode = false; // Clear selection - typelist.ClearSelectedNodes(); //mxd + typelist.SelectedNodes.Clear(); //mxd typeid.Text = ""; // Collapse nodes @@ -126,11 +128,13 @@ namespace CodeImp.DoomBuilder.Controls public int GetResult(int original) { //mxd - if(typelist.UseMultiSelection && typelist.SelectedNodes.Count > 1) { - List validNodes = getValidNodes(); + if(typelist.SelectionMode == TreeViewSelectionMode.MultiSelectSameLevel && typelist.SelectedNodes.Count > 1) + { + List validNodes = GetValidNodes(); //get a random ThingTypeInfo from valid nodes - if(validNodes.Count > 1) { + if(validNodes.Count > 1) + { ThingTypeInfo ti = validNodes[General.Random(0, validNodes.Count - 1)].Tag as ThingTypeInfo; return ti.Index; } @@ -140,13 +144,13 @@ namespace CodeImp.DoomBuilder.Controls } //mxd - private List getValidNodes() + private List GetValidNodes() { List validNodes = new List(); - foreach(TreeNode n in typelist.SelectedNodes) { - if((n.Nodes.Count == 0) && (n.Tag is ThingTypeInfo)) - validNodes.Add(n); + foreach(TreeNode n in typelist.SelectedNodes) + { + if((n.Nodes.Count == 0) && (n.Tag is ThingTypeInfo)) validNodes.Add(n); } return validNodes; @@ -156,48 +160,51 @@ namespace CodeImp.DoomBuilder.Controls #region ================== Events - // List double-clicked (mxd) + // List double-clicked. e.Node and typelist.SelectedNodes[0] may contain incorrect node, + // so we set the correct one in typelist_AfterSelect handler (mxd) private void typelist_MouseDoubleClick(object sender, MouseEventArgs e) { - var info = typelist.HitTest(e.Location); - if(info.Node != null && info.Location == TreeViewHitTestLocations.Label) + if (typelist.SelectedNodes.Count == 1 + && doubleclickednode != null + && doubleclickednode.Nodes.Count == 0 + && doubleclickednode.Tag is ThingTypeInfo + && OnTypeDoubleClicked != null + && typeid.Text.Length > 0) { - // Node is a child node? - if((info.Node.Nodes.Count == 0) && (info.Node.Tag is ThingTypeInfo)) - { - if((OnTypeDoubleClicked != null) && (typeid.Text.Length > 0)) OnTypeDoubleClicked(); - } + OnTypeDoubleClicked(); } } // Thing type selection changed private void typelist_AfterSelect(object sender, TreeViewEventArgs e) { - if(doupdatetextbox) + doubleclickednode = null; //mxd + if (!doupdatetextbox) return; + + //mxd. Got a valid multiselection? Well, can't show any useful info about that... + if(typelist.SelectionMode == TreeViewSelectionMode.MultiSelectSameLevel && typelist.SelectedNodes.Count > 1 && GetValidNodes().Count > 1) { - //mxd. Got a valid multiselection? Well, can't show any useful info about that... - if(typelist.UseMultiSelection && typelist.SelectedNodes.Count > 1 && getValidNodes().Count > 1) { - doupdatenode = false; - if(!string.IsNullOrEmpty(typeid.Text)) // Event will be raised in typeid_OnTextChanged - typeid.Text = ""; - else if(OnTypeChanged != null) // Or raise event here - OnTypeChanged(thinginfo); - doupdatenode = true; - } - else if(typelist.SelectedNode != null) //Anything selected? + doupdatenode = false; + if(!string.IsNullOrEmpty(typeid.Text)) // Event will be raised in typeid_OnTextChanged + typeid.Text = ""; + else if(OnTypeChanged != null) // Or raise event here + OnTypeChanged(thinginfo); + doupdatenode = true; + } + else if(typelist.SelectedNodes.Count > 0) //Anything selected? + { + TreeNode n = typelist.SelectedNodes[0]; + + // Node is a child node? + if ((n.Nodes.Count == 0) && (n.Tag is ThingTypeInfo)) { - TreeNode n = typelist.SelectedNode; + ThingTypeInfo ti = (n.Tag as ThingTypeInfo); - // Node is a child node? - if((n.Nodes.Count == 0) && (n.Tag is ThingTypeInfo)) - { - ThingTypeInfo ti = (n.Tag as ThingTypeInfo); - - // Show info - doupdatenode = false; - typeid.Text = ti.Index.ToString(); - doupdatenode = true; - } + // Show info + doupdatenode = false; + typeid.Text = ti.Index.ToString(); + doupdatenode = true; + doubleclickednode = n; //mxd } } } @@ -236,17 +243,19 @@ namespace CodeImp.DoomBuilder.Controls if(doupdatenode) { doupdatetextbox = false; - typelist.ClearSelectedNodes(); + typelist.SelectedNodes.Clear(); foreach(TreeNode n in nodes) { // Matching node? if((n.Tag as ThingTypeInfo).Index == typeindex) { // Select this - if(typelist.Nodes.Contains(n.Parent)) { //mxd. Tree node may've been removed during filtering + if(typelist.Nodes.Contains(n.Parent)) //mxd. Tree node may've been removed during filtering + { n.Parent.Expand(); - typelist.SelectedNode = n; + typelist.SelectedNodes.Add(n); n.EnsureVisible(); + break; } } } @@ -256,7 +265,7 @@ namespace CodeImp.DoomBuilder.Controls else { thinginfo = null; - if(doupdatenode) typelist.ClearSelectedNodes(); + if(doupdatenode) typelist.SelectedNodes.Clear(); } // No known thing? @@ -291,30 +300,38 @@ namespace CodeImp.DoomBuilder.Controls } //mxd - private void typelist_MouseEnter(object sender, EventArgs e) { + private void typelist_MouseEnter(object sender, EventArgs e) + { typelist.Focus(); } //mxd - private void bClear_Click(object sender, EventArgs e) { + private void bClear_Click(object sender, EventArgs e) + { tbFilter.Clear(); } //mxd - private void tbFilter_TextChanged(object sender, EventArgs e) { + private void tbFilter_TextChanged(object sender, EventArgs e) + { typelist.SuspendLayout(); - if(string.IsNullOrEmpty(tbFilter.Text)) { + if(string.IsNullOrEmpty(tbFilter.Text)) + { Setup(); typeid_TextChanged(this, EventArgs.Empty); - } else { + } + else + { // Go for all predefined categories - typelist.ClearSelectedNodes(); + typelist.SelectedNodes.Clear(); typelist.Nodes.Clear(); string match = tbFilter.Text.ToUpperInvariant(); - foreach(TreeNode node in nodes){ - if(node.Text.ToUpperInvariant().Contains(match)) { + foreach(TreeNode node in nodes) + { + if(node.Text.ToUpperInvariant().Contains(match)) + { typelist.Nodes.Add(node); } } diff --git a/Source/Core/Controls/ThingBrowserControl.resx b/Source/Core/Controls/ThingBrowserControl.resx index 1160130b..f96ef4f2 100644 --- a/Source/Core/Controls/ThingBrowserControl.resx +++ b/Source/Core/Controls/ThingBrowserControl.resx @@ -124,410 +124,398 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACw - WwAAAk1TRnQBSQFMAgEBFAEAAWwBAAFsAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABw + WwAAAk1TRnQBSQFMAgEBFAEAAbQBAAG0AQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABYAMAAQEBAAEgBgABYP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wA3AAGUAYsBxQH/ - AYQBcAHEAf8BgQFnAcQB/wGAAWUBwwH/AXEBYwHBAf8BcQFlAbYB/ykAAUoBlwH/AQABOwFyAf8BAAE0 - AWYB/wEAATIBYwH/AQABLwFdAf8BAAEoAVAB/ygAAT4BVwFZAf8BLwFHAUkB/wEpAT8BQQH/AScBPQE/ - Af8BJQE5ATsB/wEhAS8BMAH/KAABJQFJAVgB/wEZATsBSQH/ARQBNQFCAf8BEwE0AUEB/wESATABPAH/ - ARIBJwEvAf8gAAG5AbQB0gH/AZ8BlQHSAf8BngGUAdMB/wGcAZIB0gH/AZsBkQHSAf8BmQGOAdIB/wGV - AYoB0AH/AYsBgQHLAf8BgAFmAcUB/wFnAWEBkQH/GAABSwGUAcsB/wEAAVsBtQH/AQABWwG0Af8BAAFZ - AbIB/wEAAVgBrwH/AQABVgGrAf8BAAFSAaQB/wEAAUYBjgH/AQABNAFmAf8BIAE6AU8B/xgAAYoBnwGh - Af8BSQFtAXAB/wFIAW0BcAH/AUcBbAFvAf8BRQFqAW0B/wFDAWgBawH/AUABYwFmAf8BNwFUAVcB/wEo - AT8BQQH/ATYCPQH/GAABbgGUAaEB/wEoAVwBcgH/AScBXQFyAf8BJgFbAXEB/wElAVoBbwH/ASMBWAFt - Af8BIQFTAWgB/wEcAUcBWAH/ARQBNQFCAf8BLwE4AT0B/xQAAbwBtwHYAf8BqwGhAeIB/wGuAaMB6AH/ - AbABpAHsAf8BrwGkAesB/wGvAaQB6gH/Aa8BpAHqAf8BrQGhAegB/wGqAZ8B4gH/AZ0BkwHTAf8BgwFu - AcYB/wFmAWABkQH/EAABTQGbAdQB/wEAAXAB2wH/AQABgQHmAf8BAAGCAe0B/wEAAYEB7AH/AQABgQHq - Af8BAAGBAeoB/wEAAYEB5AH/AQABbwHZAf8BAAFaAbMB/wEAATsBgAH/AR8BOQFOAf8QAAGNAagBqgH/ - AVMBkwGYAf8BUwGfAaUB/wFVAaUBqwH/AVUBowGpAf8BVAGiAagB/wFUAaIBqAH/AVIBngGjAf8BUQGT - AZgB/wFIAWwBcAH/AS8BSAFKAf8BNgE8AT0B/xAAAW0BnAGsAf8BJQGBAaAB/wEeAYkBsQH/ARkBkQG9 - Af8BGgGPAboB/wEbAY0BuAH/ARsBjQG4Af8BHQGIAa8B/wEjAYEBoAH/ASYBXAFyAf8BGAE8AUsB/wEu - ATgBPAH/EAABrAGiAeMB/wGvAaQB6wH/AbUBqgHwAf8BtQGqAfAB/wG1AaoB8AH/AbUBqgHwAf8BsAGl - Ae0B/wGxAaYB7wH/Aa0BogHnAf8BlwGNAc8B/wGZAY4B0QH/AYIBbQHGAf8RAAFxAd4B/wEAAYEB7QH/ - AQABiQH6Af8BAAGJAfoB/wEAAYkB+gH/AQABiQH6Af8BAAGDAfAB/wEAAYUB9AH/AQABgQHkAf8BAAFS - AaUB/wEAAVYBqwH/AQABOgFxAf8QAAFTAZcBnAH/AVUBpAGqAf8BXAGsAbIB/wFcAawBsgH/AVwBrAGy - Af8BXAGsAbIB/wFWAaYBrAH/AVcBqQGvAf8BUwGdAaIB/wFCAWMBZgH/AUQBZwFqAf8BLgFGAUgB/xAA - ASQBggGkAf8BGgGPAbwB/wEVAZsBzQH/ARUBmwHNAf8BFQGbAc0B/wEVAZsBzQH/ARgBkgHAAf8BFQGW - AcYB/wEgAYcBrQH/ASMBVAFnAf8BJAFXAWwB/wEXATsBSgH/DAABsgGnAeoB/wG1AasB7QH/AbQBqAHx - Af8BtQGqAfAB/wG1AaoB8AH/AbUBqgHvAf8BswGoAesB/wGmAZ0B0wH/AYIBbgHAAf8BWAFJAa4B/wMA - Af8BmQGPAdAB/wGVAYoB0AH/AYEBagG9Af8JAAGCAe8B/wEAAYgB+AH/AQABiQH6Af8BAAGJAfoB/wEA - AYkB+gH/AQABiAH6Af8BAAGEAfEB/wEAAWIBwgH/AQABNwFrAf8BAAENAR8B/wMAAf8BAAFVAaoB/wEA - AVIBpAH/AQABMQFgAf8IAAFYAaQBqgH/AV0BqQGvAf8BWgGtAbQB/wFcAawBsgH/AVwBrAGyAf8BXAGr - AbEB/wFaAaUBqgH/AVACgQH/ASwBQQFDAf8BCgIRAf8DAAH/AUQBZwFqAf8BQAFjAWYB/wEoAToBPAH/ - CAABHQGQAbsB/wEaAZcBxgH/AREBnAHRAf8BFQGbAc0B/wEVAZsBzQH/ARYBmgHLAf8BHQGRAbwB/wEu - AWIBgQH/ARgBNwFDAf8BAwENAREB/wMAAf8BJAFXAWsB/wEhAVMBaAH/ARYBMQE7Af8IAAG1AaoB8gH/ - Ab8BtQHzAf8BtwGsAfAB/wG1AaoB8AH/AakBoAHZAf8BiQGBAcQB/wFdAU4BswH/AVcBTgGNAf8DAAH/ - AwAB/wFTAUQBqwH/Aa0BogHlAf8BpAGaAdcB/wGIAYAByAH/CQABigH9Af8BBwGSAv8BAAGLAf4B/wEA - AYkB+gH/AQABaAHOAf8BAAFAAYMB/wEAARUBLQH/AwAB/wMAAf8DAAH/AQABBwEUAf8BAAGAAeEB/wEA - AWMBxAH/AQABQQGFAf8IAAFcAa4BtQH/AWoBtQG7Af8BXwGtAbMB/wFcAawBsgH/AVMBhgGKAf8BNAFM - AU4B/wEQARoBGwH/AwAB/wMAAf8DAAH/AQUCCgH/AVMBmgGgAf8BTgGBAYMB/wEzAU4BUAH/CAABEgGe - AdIB/wETAakB4gH/ARYBnQHPAf8BFQGbAc0B/wEsAWsBjAH/ARwBQAFOAf8BBgEVARsB/wMAAf8DAAH/ - AwAB/wEAAQcBCgH/ASEBhQGqAf8BKQFmAYYB/wEaAUIBUgH/CAABvQGzAfMB/wHGAb0B9QH/AboBsAHw - Af8BtQGqAfAB/wGVAYoBygH/AYABZgG8Af8BUAFBAaQB/wMAAf8DAAH/AwAB/wGEAXEBwQH/AbIBpwHw - Af8BqQGeAeIB/wGOAYIBzQH/CAABBAGRAv8BFAGYAv8BAAGNAv8BAAGJAfoB/wEAAU0BnAH/AQABLgFa - Af8CAAEHAf8DAAH/AwAB/wMAAf8BAAE6AXAB/wEAAYYB9gH/AQABbgHXAf8BAAFJAZQB/wgAAWcBtAG6 - Af8BgQG6AcAB/wFkAa8BtQH/AVwBrAGyAf8BPwFcAV4B/wElATYBOAH/AQABAQECAf8DAAH/AwAB/wMA - Af8BLwFFAUYB/wFYAasBsQH/AVEBkgGXAf8BOQFZAVsB/wgAARMBpwHeAf8BHQGuAeQB/wEYAaAB0wH/ - ARUBmwHNAf8BJAFOAV4B/wEUAS4BOAH/AgABAgH/AwAB/wMAAf8DAAH/ARoBOgFGAf8BFAGYAcoB/wEj - AYEBnwH/AR4BSwFdAf8IAAHBAbgB9AH/AcoBwgH1Af8BuwGxAfAB/wG1AaoB8AH/AbUBqgHvAf8BtQGq - Ae8B/wFlAVgBtwH/AwAB/wMAAf8BTwFBAZ0B/wGoAZ8B1wH/Aa8BpAHrAf8BrQGiAeYB/wGRAYUBzgH/ - CAABCwGUAv8BGwGbAv8BAAGNAv8BAAGJAfoB/wEAAYgB+gH/AQABiAH5Af8BAAEfAT8B/wMAAf8DAAH/ - AwAB/wEAAWcBywH/AQABgQHsAf8BAAGBAeIB/wEAAUwBmgH/CAABbAG3Ab0B/wGBAb0BwgH/AWQBrwG0 - Af8BXAGsAbIB/wFcAasBsQH/AVwBqwGxAf8BGAElAScB/wMAAf8DAAH/AwAB/wFSAYMBhwH/AVUBowGp - Af8BUgGbAaEB/wE8AVwBXwH/CAABFgGrAeMB/wEjAbAB5QH/ARkBnwHRAf8BFQGbAc0B/wEWAZoBywH/ - ARcBmQHJAf8BDAEfAScB/wMAAf8DAAH/AwAB/wEtAWkBiQH/ARoBjwG6Af8BHwGGAawB/wEfAU4BYQH/ - CAABwAG3AfQB/wHPAcgB9gH/AcABtgHzAf8BtAGpAewB/wGyAagB6gH/AW0BYAG6Af8BMQEWAcQB/wGD - AXABwgH/AUwBPQGiAf8BZQFYAbcB/wG1AaoB7gH/AbUBqgHwAf8BqwGhAeMB/wGRAYYBzQH/CAABCgGU - Av8BJQGgAv8BCAGTAv8BAAGFAfQB/wEAAYMB8AH/AQABJwFOAf8DAAH/AQABOQFvAf8DAAH/AQABHwE/ - Af8BAAGIAfgB/wEAAYkB+gH/AQABcQHdAf8BAAFMAZkB/wgAAWsBtgG8Af8BiAHBAcYB/wFrAbUBuwH/ - AVsBpwGsAf8BWQGkAakB/wEfAS8BMQH/AwAB/wEuAUQBRgH/AwAB/wEYASUBJwH/AVwBqgGwAf8BXAGs - AbIB/wFSAZYBmwH/ATwBWwFeAf8IAAEVAaoB4wH/ASwBswHmAf8BFQGpAeEB/wEcAZQBwAH/AR4BkAG6 - Af8BEAEnATEB/wMAAf8BGQE5AUYB/wMAAf8BDAEfAScB/wEYAZgByAH/ARUBmwHNAf8BIgGBAaQB/wEg - AU0BXwH/CAABvAGxAfMB/wHTAcwB9wH/AcwBxAH2Af8BuwGyAeoB/wFtAWABugH/AwAB/wGTAYkByQH/ - AbcBqwHyAf8BZAFWAbYB/wGVAYoBygH/AbYBqwHxAf8BtQGqAfAB/wGrAaEB4gH/AZgBjwHMAf8IAAEB - AZAC/wErAaMC/wEfAZ0C/wEAAYoB/QH/AQABJwFOAf8DAAH/AQABSwGXAf8BAAGLAv8BAAEdATsB/wEA - AU0BnAH/AQABiwH+Af8BAAGJAfoB/wEAAXAB2wH/AQABUgGkAf8IAAFlAbMBuQH/AY0BwwHIAf8BgwG/ - AcQB/wFlAagBrQH/AR8BLwExAf8DAAH/AT0BWQFbAf8BXgGvAbUB/wEXASMBJAH/AT8BXAFeAf8BXgGv - AbUB/wFcAawBsgH/AVIBlAGYAf8BQwFhAWQB/wgAARMBpQHdAf8BMQG1AeYB/wEmAbEB5QH/ASUBlgHA - Af8BEAEnATEB/wMAAf8BIwFLAVsB/wESAZ8B1QH/AQsBHQEkAf8BJAFOAV4B/wETAZ4B0wH/ARUBmwHN - Af8BJAGBAaAB/wEmAVIBZAH/DAAB0wHNAfcB/wHWAdAB9wH/AakBowHMAf8BVwFOAY0B/wGUAYoBygH/ - AbYBqwHxAf8BtQGqAe4B/wGkAZsB0gH/Aa8BpQHkAf8BtQGqAfAB/wG1AaoB8AH/AawBogHkAf8QAAEt - AaMC/wExAaUC/wEAAWEBwAH/AwAB/wEAAU0BmwH/AQABigH9Af8BAAGIAfgB/wEAAV8BvQH/AQABgQHk - Af8BAAGJAfoB/wEAAYkB+gH/AQABcgHgAf8QAAGOAcQByAH/AZEBxgHKAf8BVAFvAXEB/wMAAf8BPwFb - AV4B/wFdAa0BtAH/AVwBqgGwAf8BTgFxAYEB/wFWAZoBnwH/AVwBrAGyAf8BXAGsAbIB/wFTAZkBngH/ - EAABMgG1AecB/wE2AbYB5wH/ATYBXQFtAf8DAAH/ASMBTQFeAf8BFAGdAdAB/wEYAZgByAH/AS0BYAGB - Af8BJQGFAagB/wEVAZsBzQH/ARUBmwHNAf8BIgGDAacB/xAAAd0B2AH5Af8B2gHVAfgB/wHCAbsB5gH/ - AbABqgHVAf8BwQG3AfIB/wG7AbIB7gH/AbkBrwHvAf8BtQGqAfAB/wG1AaoB8AH/AbUBqgHwAf8BtQGq - AfAB/wG8AbYB3AH/EAABbwHBAv8BOQGpAv8BAAGOAv8BAAFtAdUB/wEIAZMC/wEAAY0C/wEAAYwC/wEA - AYkB+gH/AQABiQH6Af8BAAGJAfoB/wEAAYkB+gH/AUoBnQHcAf8QAAGxAdcB2gH/AZcByQHNAf8BcAGl - AakB/wFbAYcBigH/AWwBtAG6Af8BZQGtAbIB/wFjAa0BsgH/AVwBrAGyAf8BXAGsAbIB/wFcAawBsgH/ - AVwBrAGyAf8BiwGvAbIB/xAAAYEBzwHvAf8BPAG5AegB/wE2AZMBtgH/ATcBawGIAf8BGQGnAd0B/wEe - AZ0BzAH/ARsBnAHNAf8BFQGbAc0B/wEVAZsBzQH/ARUBmwHNAf8BFQGbAc0B/wFlAaIBtwH/FAAB4QHd - AfoB/wHWAdAB+AH/AdMBzAH3Af8BzgHHAfYB/wHFAbwB9AH/AbwBsQHyAf8BtwGtAfAB/wGzAagB7gH/ - AbEBpgHvAf8BvwG4AeEB/xgAAYEBxQL/ATIBpgL/ASwBowL/ASMBnwL/AREBlwL/AQABjwL/AQABiwH+ - Af8BAAGGAfYB/wEAAYUB9AH/AU0BogHiAf8YAAG1AdkB3AH/AZIBxgHKAf8BjQHEAcgB/wGGAcABxQH/ - AXEBuQG/Af8BZQGyAbgB/wFgAa0BswH/AVoBqQGvAf8BVwGpAbAB/wGNAbYBuQH/GAABgwHRAfAB/wE2 - AbcB5wH/ATEBtQHmAf8BKgGyAeUB/wEbAawB5AH/ARUBowHZAf8BFwGcAc4B/wEYAZcBxgH/ARQBlgHH - Af8BZAGpAcIB/yAAAcMBugH0Af8BxwG/AfUB/wHLAcMB9QH/AcUBvAH0Af8BvAGxAfMB/wGxAaYB7wH/ - KAABEAGWAv8BFgGZAv8BHQGcAv8BEQGXAv8BAQGQAv8BAAGFAfQB/ygAAXABuQG+Af8BgQG7AcAB/wGC - Ab4BwwH/AXEBuQG/Af8BZQGzAbkB/wFXAakBrwH/KAABGQGsAeQB/wEfAa4B5AH/ASUBsAHlAf8BGwGs - AeQB/wETAaUB3QH/ARUBlgHGAf//AP8AKgABLgE6AYIB/wEeASkBZwH/ARkBIwFeAf8BGAEiAVsB/wEW - ASABVQH/ARgBHgFEAf8oAAGSAUYBkgH/AYEBNQGBAf8BcAEvAXAB/wFuAS0BbgH/AWgBLAFoAf8BWAEs - AVgB/ykAApAB/wEAAm0B/wEAAmIB/wEAAl8B/wEAAlkB/wEAAkwB/ygAA6UB/wORAf8DhwH/A4UB/wOB - Af8DbQH/IAABgQGGAbwB/wEvAUABpgH/AS4BPwGnAf8BLQE+AaUB/wEsATwBowH/ASoBOgGgAf8BKAE3 - AZkB/wEiAS8BgwH/ARgBIgFeAf8BMgE1AUcB/xgAAb4BkwG+Af8BsAFNAbAB/wGxAUsBsQH/AbABSQGw - Af8BrwFHAa8B/wGsAUUBrAH/AaYBQgGmAf8BkwE6AZMB/wFwAS4BcAH/AVMBPgFTAf8YAAFvAskB/wEA - Aq0B/wEAAq0B/wEAAqsB/wEAAqgB/wEAAqQB/wEAAp0B/wEAAogB/wEAAmEB/wExAlEB/xgAA8kB/wO7 - Af8DuwH/A7gB/wO2Af8DtQH/A68B/wOeAf8DhwH/A2EB/xQAAYABhwHLAf8BMAFHAdMB/wExAUoB4QH/ - ATIBTAHpAf8BMgFMAecB/wExAUsB5gH/ATEBSwHmAf8BLgFIAeEB/wEtAUUB1QH/AS4BPgGmAf8BHQEo - AWoB/wExATQBRgH/EAABxwGWAccB/wHJAWEByQH/AdMBZQHTAf8B2QFnAdkB/wHYAWgB2AH/AdcBZgHX - Af8B1wFmAdcB/wHSAWIB0gH/AcoBXwHKAf8BsAFLAbAB/wGCATQBggH/AVMBPQFTAf8QAAFxAtEB/wEA - AtEB/wEAAtwB/wEAAuQB/wEAAuIB/wEAAuEB/wEAAuEB/wEAAtoB/wEAAtAB/wEAAqwB/wEAAm4B/wEw - AlAB/xAAA9EB/wPTAf8D2gH/A98B/wPeAf8D3AH/A9wB/wPZAf8D0gH/A7oB/wOSAf8DYAH/EAABMgFJ - AdcB/wEyAUwB6AH/AToBVAHwAf8BOgFUAfAB/wE6AVQB8AH/AToBVAHwAf8BMgFNAesB/wE0AU4B7wH/ - ATEBSgHeAf8BKgE5AZgB/wErATsBnwH/ARwBJwFoAf8QAAHLAWMBywH/AdgBZwHYAf8B4AFxAeAB/wHg - AXEB4AH/AeABcQHgAf8B4AFxAeAB/wHbAWkB2wH/Ad4BawHeAf8B0QFkAdEB/wGlAUQBpQH/AasBRgGr - Af8BgQEzAYEB/xEAAtUB/wEAAuMB/wEAAvAB/wEAAvAB/wEAAvAB/wEAAvAB/wEAAuYB/wEAAukB/wEA - AtoB/wEAAp4B/wEAAqQB/wEAAmwB/xAAA9UB/wPfAf8D5gH/A+YB/wPmAf8D5gH/A+AB/wPhAf8D2QH/ - A7AB/wO1Af8DkAH/DAABNwFQAeUB/wE9AVYB6wH/ATYBUQH0Af8BOgFUAfAB/wE6AVQB8AH/AToBVAHv - Af8BOgFSAeUB/wE3AUgBrgH/AR4BKAFfAf8BBQEIARoB/wMAAf8BLAE7AZ0B/wEoATcBmQH/ARwBJAFU - Af8IAAHXAWwB1wH/AdwBcgHcAf8B4gFvAeIB/wHgAXEB4AH/AeABcQHgAf8B3wFxAd8B/wHYAW4B2AH/ - AbIBWgGyAf8BcAE0AXAB/wEzARYBMwH/AwAB/wGqAUYBqgH/AaYBQgGmAf8BZwExAWcB/wkAAuUB/wEA - Au4B/wEAAvAB/wEAAvAB/wEAAvAB/wEAAu8B/wEAAucB/wEAArkB/wEAAmYB/wEAAh0B/wMAAf8BAAKj - Af8BAAKdAf8BAAJcAf8IAAPfAf8D5AH/A+YB/wPmAf8D5gH/A+UB/wPgAf8DwwH/A4sB/wM7Af8DAAH/ - A7QB/wOvAf8DggH/CAABOQFUAfQB/wFOAWYB9QH/AT8BWAHwAf8BOgFUAfAB/wE0AUcBwAH/ASMBLgFt - Af8BCQEOASgB/wMAAf8DAAH/AwAB/wEBAQMBEQH/ATABSQHcAf8BMAFDAbgB/wEgASwBgAH/CAAB4wFx - AeMB/wHmAYsB5gH/AeABgQHgAf8B4AFxAeAB/wG7AV8BuwH/AYYBOgGGAf8BPwEbAT8B/wETAQkBEwH/ - AwAB/wMAAf8BKwERASsB/wHPAWMBzwH/AbgBVgG4Af8BiwE3AYsB/wkAAvIB/wEAA/8BAAL0Af8BAALw - Af8BAALFAf8BAAKBAf8BAAIrAf8DAAH/AwAB/wMAAf8BAAITAf8BAALYAf8BAAK8Af8BAAKBAf8IAAPn - Af8D8gH/A+cB/wPmAf8DyQH/A5gB/wNNAf8DAAH/AwAB/wMAAf8DLwH/A9YB/wPDAf8DmQH/CAABSgFi - AfUB/wFdAYAB9gH/AUYBXgHvAf8BOgFUAfAB/wErATkBjAH/ARkBIQFPAf8CAAEGAf8DAAH/AwAB/wMA - Af8BIAEqAWMB/wE0AU8B8QH/ASwBRAHUAf8BIwEyAYoB/wgAAeYBhwHmAf8B6QGXAekB/wHhAYMB4QH/ - AeABcQHgAf8BmgFEAZoB/wFjAS4BYwH/ASEBDAEhAf8DAAH/AwAB/wMAAf8BgQE2AYEB/wHfAWwB3wH/ - AckBXgHJAf8BmQE9AZkB/wkAA/8BCAP/AQAC+QH/AQAC8AH/AQAClgH/AQACVgH/AQACBwH/AwAB/wMA - Af8DAAH/AQACawH/AQAC7AH/AQACzwH/AQACjgH/CAAD8AH/A/kB/wPrAf8D5gH/A6oB/wOBAf8DHQH/ - AwAB/wMAAf8DAAH/A5AB/wPiAf8D0AH/A6QB/wgAAVMBagH2Af8BZgGCAfcB/wFHAV8B7gH/AToBVAHw - Af8BOgFUAe8B/wE7AVUB7gH/AQ8BFQE4Af8DAAH/AwAB/wMAAf8BNQFIAbsB/wEyAUwB5wH/AS8BSAHe - Af8BJAEzAZAB/wgAAecBjgHnAf8B6wGfAesB/wHgAYMB4AH/AeABcQHgAf8B3wFxAd8B/wHeAXEB3gH/ - AU0BIgFNAf8DAAH/AwAB/wEYAQgBGAH/AbkBXgG5Af8B2AFoAdgB/wHQAWMB0AH/AZ4BPgGeAf8JAAP/ - AQ8D/wEAAvkB/wEAAvAB/wEAAu8B/wEAAu8B/wEAAjwB/wMAAf8DAAH/AwAB/wEAAsIB/wEAAuIB/wEA - AtkB/wEAApMB/wgAA/QB/wP9Af8D6wH/A+YB/wPlAf8D5QH/A18B/wMAAf8DAAH/AwgB/wPIAf8D3gH/ - A9gB/wOoAf8IAAFRAWgB9QH/AXEBjAH3Af8BUAFnAfQB/wE7AVQB5wH/ATkBUgHkAf8BFAEcAUUB/wMA - Af8BHwEpAWIB/wMAAf8BDwEVATgB/wE7AVUB7QH/AToBVAHwAf8BLwFHAdgB/wEmATQBjQH/CAAB5wGN - AecB/wHtAakB7QH/AeYBjAHmAf8B2gFwAdoB/wHXAW0B1wH/AVkBKQFZAf8BGwEAARsB/wGBATUBgQH/ - ARoBCAEaAf8BTQEiAU0B/wHdAXAB3QH/AeABcQHgAf8BzAFhAcwB/wGcAT8BnAH/CQAD/wEZA/8BAAP/ - AQAC6gH/AQAC5gH/AQACSwH/AwAB/wEAAmoB/wMAAf8BAAI8Af8BAALuAf8BAALwAf8BAALUAf8BAAKT - Af8IAAPzAf8EAAPzAf8D4gH/A+AB/wNsAf8DAAH/A44B/wMLAf8DXwH/A+QB/wPmAf8D1AH/A6gB/wgA - AUcBYAH1Af8BgQGSAfgB/wFqAYYB9wH/AUwBYgHiAf8BFAEcAUUB/wMAAf8BKgE3AYcB/wE7AVYB9AH/ - AQ4BFAE0Af8BKwE5AYwB/wE8AVYB8wH/AToBVAHwAf8BLwFHAdQB/wEuATwBkwH/CAAB5QGEAeUB/wHu - Aa8B7gH/AesBowHrAf8B2AGEAdgB/wFZASkBWQH/AwAB/wGWAUMBlgH/AeMBgAHjAf8BSgEhAUoB/wGa - AUQBmgH/AeIBgAHiAf8B4AFxAeAB/wHJAWEByQH/AaEBSAGhAf8JAAL+Af8BHwP/ARMD/wEAAvMB/wEA - AksB/wMAAf8BAAKRAf8BAAL0Af8BAAI5Af8BAAKWAf8BAAL0Af8BAALwAf8BAALRAf8BAAKeAf8IAAPu - Af8IAAPnAf8DbAH/AwAB/wOmAf8D6AH/A1oB/wOqAf8D5wH/A+YB/wPTAf8DrwH/DAABggGTAfgB/wGH - AZgB+AH/AUQBUAGfAf8DAAH/ASsBOAGLAf8BOwFVAfIB/wE7AVUB7QH/ATcBRwGqAf8BNwFOAdgB/wE6 - AVQB8AH/AToBVAHwAf8BMAFIAdoB/xAAAe4BsAHuAf8B7wG1Ae8B/wGnAWIBpwH/ARMBCQETAf8BmQFE - AZkB/wHhAXIB4QH/Ad0BcAHdAf8BsAFXAbAB/wHNAWgBzQH/AeABcQHgAf8B4AFxAeAB/wHNAWMBzQH/ - EAABIAP/ASQD/wEAArgB/wMAAf8BAAKVAf8BAALyAf8BAALuAf8BAAK1Af8BAALaAf8BAALwAf8BAALw - Af8BAALXAf8YAAPCAf8DAAH/A6kB/wPnAf8D5AH/A8EB/wPZAf8D5gH/A+YB/wPVAf8QAAGjAbEB+gH/ - AY8BnwH5Af8BYgFyAdUB/wFHAVYBtgH/AVMBagHxAf8BSgFhAeoB/wFGAV0B7AH/AToBVAHwAf8BOgFU - AfAB/wE6AVQB8AH/AToBVAHwAf8BcAGGAdQB/xAAAfIBwQHyAf8B8QG8AfEB/wHRAZMB0QH/AbYBbgG2 - Af8B5AGOAeQB/wHeAYUB3gH/Ad4BgQHeAf8B4AFxAeAB/wHgAXEB4AH/AeABcQHgAf8B4AFxAeAB/wHO - AZYBzgH/EAABmAP/ASwD/wEAAvkB/wEAAswB/wEAA/8BAAL4Af8BAAL2Af8BAALwAf8BAALwAf8BAALw - Af8BAALwAf8BbQLUAf8QAAP8Af8EAAPrAf8DzwH/A/MB/wPrAf8D6gH/A+YB/wPmAf8D5gH/A+YB/wPV - Af8UAAGsAbcB+wH/AYgBmQH4Af8BgQGTAfgB/wFuAYkB9wH/AVoBcAH2Af8BRwFgAfMB/wFAAVkB7wH/ - ATgBUgHtAf8BMwFOAfAB/wFxAYgB3QH/GAAB9AHJAfQB/wHvAbYB7wH/Ae4BrwHuAf8B7AGmAewB/wHo - AZUB6AH/AeQBhAHkAf8B4AGBAeAB/wHdAW4B3QH/Ad4BagHeAf8B1AGZAdQB/xgAAZ4D/wElA/8BHwP/ - ARcD/wEGA/8BAAL8Af8BAAL0Af8BAALsAf8BAALpAf8BcQLaAf8oAAP3Af8D7QH/A+cB/wPiAf8D4QH/ - A9kB/yAAAVgBbgH2Af8BYAGBAfYB/wFnAYQB9wH/AVoBcAH2Af8BRwFgAfUB/wE0AU4B7wH/KAAB6AGT - AegB/wHqAZoB6gH/AesBoAHrAf8B6AGVAegB/wHlAYQB5QH/Ad4BawHeAf8oAAEEA/8BCwP/ARED/wEG - A/8BAAL+Af8BAALpAf8oAAP3Af8D+QH/A/0B/wP3Af8D7gH/A+EB//8A/wAqAANYAf8DTQH/A0gB/wNH - Af8DRQH/A0AB/ygAAZEBYwERAf8BcQFQAQkB/wFmAUcBBgH/AWMBRQEGAf8BXQFAAQUB/wFMATYBBwH/ - KAABKwFVASsB/wEeAUYBHgH/ARkBQAEZAf8BGAE+ARgB/wEXATkBFwH/ARYBLgEWAf8oAAKeAUEB/wKW - ARwB/wKTAQ4B/wKSAQsB/wKNAQgB/wJuAQsB/yAAA5kB/wNlAf8DZQH/A2MB/wNiAf8DYQH/A10B/wNU - Af8DSAH/A0kB/xgAAcYBqQFgAf8BtAGCAREB/wG0AYEBEAH/AbIBgQEQAf8BrwGBAQ8B/wGsAYEBDgH/ - AaQBbgENAf8BjgFfAQsB/wFmAUYBBgH/AUwBQQEoAf8YAAGAAZ4BgAH/ATABbQEwAf8BLwFuAS8B/wEu - AW0BLgH/AS0BawEtAf8BKwFpASsB/wEpAWMBKQH/ASMBVQEjAf8BGQE/ARkB/wExATwBMQH/GAACwAGb - Af8CsgFXAf8CtAFVAf8CsgFSAf8CsQFOAf8CsQFKAf8CrQFDAf8CogEtAf8CkwEMAf8CXQErAf8UAAOf - Af8DgQH/A4QB/wOJAf8DiAH/A4YB/wOGAf8DgwH/A4EB/wNkAf8DTgH/A0gB/xAAAdEBsQFiAf8B2QGd - ARcB/wHlAaUBGAH/Ae0BrAEZAf8B6wGqARkB/wHqAagBGAH/AeoBqAEYAf8B4wGkARYB/wHZAZwBFQH/ - AbMBgQEQAf8BgAFRAQgB/wFLAUABKAH/EAABgAGpAYAB/wExAZgBMQH/ASwBqAEsAf8BKQGzASkB/wEq - AbABKgH/ASoBrgEqAf8BKgGuASoB/wErAaYBKwH/AS8BmQEvAf8BLwFtAS8B/wEdAUgBHQH/ATABPAEw - Af8QAALJAaAB/wLLAXIB/wLUAYEB/wLaAYMB/wLYAYIB/wLXAYIB/wLXAYIB/wLUAYEB/wLMAW4B/wK0 - AVMB/wKZARsB/wJeASkB/xAAA4EB/wOJAf8DkAH/A5AB/wOQAf8DkAH/A4oB/wOMAf8DgwH/A14B/wNh - Af8DTAH/EAAB3AGgARgB/wHsAaoBGQH/AfYBswEeAf8B9gGzAR4B/wH2AbMBHgH/AfYBswEeAf8B7wGt - ARkB/wHyAbABGgH/AeIBpAEYAf8BpAFvAQ8B/wGrAYABDwH/AXEBUAEIAf8QAAEwAZ0BMAH/ASkBsQEp - Af8BJwHAAScB/wEnAcABJwH/AScBwAEnAf8BJwHAAScB/wEoAbYBKAH/ASYBuwEmAf8BLQGkAS0B/wEr - AWMBKwH/ASwBaAEsAf8BHAFHARwB/xAAAs0BgQH/AtgBggH/At8BjQH/At8BjQH/At8BjQH/At8BjQH/ - AtsBgwH/At0BhwH/AtIBgQH/Aq0BRwH/ArABSgH/ApgBFwH/DAADiQH/A44B/wOQAf8DkAH/A5AB/wOP - Af8DiwH/A2oB/wNKAf8DJwH/AwAB/wNgAf8DXQH/A0YB/wgAAesBrAEcAf8B8gGyAR8B/wH4AbQBHAH/ - AfYBswEeAf8B9gGzAR4B/wH1AbIBHgH/AewBrAEdAf8BvgGKARUB/wFoAUkBCQH/AR4BFAEAAf8DAAH/ - AaoBgAEPAf8BpAFuAQ0B/wFdAUMBCAH/CAABLAGxASwB/wEqAbsBKgH/ASMBxAEjAf8BJwHAAScB/wEn - AcABJwH/AScBvwEnAf8BLQGyAS0B/wE2AYABNgH/AR0BQQEdAf8BBAEQAQQB/wMAAf8BLAFnASwB/wEp - AWMBKQH/ARoBOQEaAf8IAALYAYcB/wLcAY8B/wLhAYsB/wLfAY0B/wLfAY0B/wLeAY0B/wLYAYoB/wK1 - AWcB/wKPARkB/wJBAQAB/wMAAf8CrgFKAf8CrQFDAf8CiAERAf8IAAORAf8DnAH/A5EB/wOQAf8DbwH/ - A1EB/wMwAf8DAAH/AwAB/wMAAf8DIAH/A4EB/wNrAf8DUQH/CAAB+QG2AR0C/wG/ASsB/wH4AbcBIAH/ - AfYBswEeAf8BygGTARcB/wGBAVUBDAH/ASwBHgEAAf8DAAH/AwAB/wMAAf8BFAEMAQAB/wHgAaMBFwH/ - AcQBjgESAf8BhAFXAQoB/wgAASQBxgEkAf8BKgHRASoB/wEoAcMBKAH/AScBwAEnAf8BNgGHATYB/wEi - AUsBIgH/AQkBGgEJAf8DAAH/AwAB/wMAAf8BAQEKAQEB/wEuAaEBLgH/ATIBgQEyAf8BIAFOASAB/wgA - AuIBjQH/AuUBoQH/At8BkgH/At8BjQH/Ar8BbgH/ApgBKAH/AlIBAAH/AhEBAAH/AwAB/wMAAf8COAEA - Af8C0QGBAf8CuwFkAf8CngElAf8IAAOaAf8DpgH/A5UB/wOQAf8DWwH/A0MB/wMUAf8DAAH/AwAB/wMA - Af8DTAH/A40B/wOBAf8DVwH/CAAB/wG+AScC/wHFAToB/wH6AboBJAH/AfYBswEeAf8BmQFnARAB/wFY - AT0BBwH/AQcBAwEAAf8DAAH/AwAB/wMAAf8BbQFNAQoB/wH0AbEBGwH/AdgBmwEUAf8BlQFjAQsB/wgA - AScB0AEnAf8BNAHTATQB/wEqAcYBKgH/AScBwAEnAf8BKgFbASoB/wEYATYBGAH/AQABAgEAAf8DAAH/ - AwAB/wMAAf8BHwFEAR8B/wElAb4BJQH/AS8BlwEvAf8BJQFZASUB/wgAAuUBnAH/AugBrQH/AuEBmAH/ - At8BjQH/AqQBQQH/AoUBCwH/AiwBAAH/AwAB/wMAAf8DAAH/ApIBHgH/At4BiAH/AssBbgH/AqUBMwH/ - CAADnwH/A6oB/wOVAf8DkAH/A48B/wOPAf8DOQH/AwAB/wMAAf8DBgH/A24B/wOIAf8DggH/A1kB/wgA - Af8BwQEwAv8ByAFCAf8B+QG5ASUB/wH2AbMBHgH/AfUBsgEeAf8B9AGyAR4B/wE+ASsBAwH/AwAB/wMA - Af8DAAH/AccBkQEXAf8B6wGqARkB/wHiAaMBFwH/AZoBZwEMAf8IAAEtAdIBLQH/ATkB1QE5Af8BKwHF - ASsB/wEnAcABJwH/AScBvwEnAf8BKAG+ASgB/wEPASUBDwH/AwAB/wMAAf8DAAH/ATYBhAE2Af8BKgGw - ASoB/wEtAaMBLQH/ASYBXQEmAf8IAALmAaQB/wLrAbQB/wLhAZgB/wLfAY0B/wLeAY0B/wLeAY0B/wJk - AQAB/wMAAf8DAAH/AiEBAAH/Ar0BbQH/AtgBggH/AtEBgQH/AqgBOAH/CAADngH/A7EB/wOeAf8DjQH/ - A4oB/wNAAf8DAAH/A0wB/wMIAf8DOQH/A44B/wOQAf8DgQH/A1kB/wgAAf8BwAEuAv8BzAFNAv8BwQEt - Af8B7wGvAR4B/wHrAasBHAH/AU0BNQEFAf8DAAH/AWwBTAEKAf8DAAH/AT4BKwEDAf8B8wGxAR4B/wH2 - AbMBHgH/AdwBnwEWAf8BmQFnAQ0B/wgAASsB0gErAf8BQQHWAUEB/wErAdABKwH/ASwBtgEsAf8BLQGw - AS0B/wEUAS8BFAH/AwAB/wEeAUMBHgH/AwAB/wEPASUBDwH/ASkBvQEpAf8BJwHAAScB/wEvAZwBLwH/ - AScBXAEnAf8IAALmAaIB/wLtAb0B/wLlAaIB/wLbAYsB/wLYAYgB/wJyAQUB/wJBAQAB/wKSARwB/wIl - AQAB/wJkAQAB/wLdAY0B/wLfAY0B/wLNAXIB/wKnAToB/wgAA5kB/wO2Af8DrQH/A5EB/wNAAf8DAAH/ - A1kB/wOTAf8DNwH/A1sB/wORAf8DkAH/A4EB/wNdAf8IAAH/AbwBJQL/Ac4BVAL/AckBRgH/AfEBtAEn - Af8BTQE1AQUB/wMAAf8BlAFkAQ8B/wH6AbYBHwH/AToBKAECAf8BmQFnARAB/wH5AbUBHwH/AfYBswEe - Af8B2QGdARYB/wGhAW4BEQH/CAABJgHPASYB/wFGAdcBRgH/ATwB1QE8Af8BNAG2ATQB/wEUAS8BFAH/ - AwAB/wEpAVgBKQH/ASQBxwEkAf8BDgEjAQ4B/wEqAVsBKgH/ASUBxgElAf8BJwHAAScB/wEwAZkBMAH/ - AS0BYQEtAf8IAALkAZkB/wLuAcIB/wLsAbgB/wLaAZgB/wJyAQUB/wMAAf8CoQE9Af8C4gGQAf8CYAEA - Af8CpAFBAf8C4QGQAf8C3wGNAf8CzAFyAf8CqAFIAf8MAAO4Af8DuwH/A2kB/wMAAf8DWgH/A5EB/wOO - Af8DaQH/A4MB/wOQAf8DkAH/A4EB/xAAAf8BzgFVAv8B0AFaAf8BtQGJARwB/wMAAf8BmAFnARAB/wH4 - AbQBHgH/AfMBsQEeAf8BugGHARUB/wHfAaIBGwH/AfYBswEeAf8B9gGzAR4B/wHfAaEBFwH/EAABRwHY - AUcB/wFKAdgBSgH/AT0BawE9Af8DAAH/ASoBWwEqAf8BJgHEASYB/wEpAb0BKQH/ATUBcAE1Af8BMQGg - ATEB/wEnAcABJwH/AScBwAEnAf8BLwGfAS8B/xAAAu8BxAH/AvAByAH/Aq4BbgH/AhEBAAH/AqQBQQH/ - AuEBjwH/At0BjQH/ArQBZAH/AtABggH/At8BjQH/At8BjQH/As8BgQH/EAADygH/A8AB/wOVAf8DgQH/ - A54B/wOVAf8DlAH/A5AB/wOQAf8DkAH/A5AB/wOhAf8QAAH/Ad0BjgL/AdMBYwH/Ae0BuAExAf8BxwGY - ASIB/wH+AcABLgH/AfcBuQEmAf8B9wG3ASQB/wH2AbMBHgH/AfYBswEeAf8B9gGzAR4B/wH2AbMBHgH/ - AdkBtAFfAf8QAAGKAeYBigH/AVAB2gFQAf8BQwGuAUMB/wFAAYQBQAH/AS8BzQEvAf8BLgHBAS4B/wEs - AcEBLAH/AScBwAEnAf8BJwHAAScB/wEnAcABJwH/AScBwAEnAf8BbQGzAW0B/xAAAvMBzwH/AvEBzwH/ - AtYBpQH/ArwBhQH/AuQBpAH/At4BmQH/At8BlgH/At8BjQH/At8BjQH/At8BjQH/At8BjQH/AtABoQH/ - FAADzwH/A7sB/wO2Af8DrgH/A6MB/wOXAf8DkQH/A40B/wOMAf8DpQH/GAAB/wHfAZUC/wHQAVsC/wHN - AVQC/wHLAUoC/wHDATcB/wH9AbsBJQH/AfcBtwEhAf8B8gGxARwB/wHyAa8BGgH/AeABugFhAf8YAAGP - AecBjwH/AUsB2QFLAf8BRgHYAUYB/wE/AdYBPwH/ATIB0wEyAf8BKAHMASgB/wEpAcIBKQH/ASgBuwEo - Af8BJQG7ASUB/wFtAbwBbQH/GAAC9AHVAf8C8AHIAf8C7wHDAf8C7QG7Af8C6AGqAf8C4wGZAf8C3wGS - Af8C3QGKAf8C3QGHAf8C1gGkAf8gAAOiAf8DpgH/A6oB/wOjAf8DmQH/A4wB/ygAAf8BwwE1Av8BxgE9 - Av8ByQFEAv8BwgE3Av8BvQElAf8B8gGvARoB/ygAATAB0wEwAf8BNgHUATYB/wE6AdUBOgH/ATIB0wEy - Af8BJgHPASYB/wEmAbsBJgH/KAAC5wGoAf8C6gGwAf8C6wG1Af8C6AGqAf8C5AGZAf8C3QGHAf//AP8A - KgACIAFIAf8CFgE7Af8CEgE2Af8CEQE0Af8CEAExAf8CEAEmAf8oAAFwAQABSwH/AVkBAAE8Af8BTwEA - ATUB/wFNAQABMwH/AUgBAAEwAf8BPgEAASkB/ygAARcBOQFGAf8BDgEuATsB/wEKASkBNgH/AQoBKAE0 - Af8BCQElATAB/wEKAR4BJQH/KAADhQH/A2sB/wNjAf8DYQH/A10B/wNUAf8gAAJYAYcB/wIjAV0B/wIi - AV0B/wIiAVwB/wIhAVsB/wIgAVgB/wIeAVQB/wIZAUcB/wIRATYB/wIkATEB/xgAAawBMwGJAf8BjwEA - AVwB/wGPAQABXAH/AY0BAAFbAf8BiwEAAVkB/wGIAQABVwH/AYIBAAFTAf8BaQEAAUYB/wFPAQABNAH/ - AUEBFAEzAf8YAAFQAXEBhgH/ARgBSAFcAf8BFgFJAV0B/wEWAUcBXAH/ARUBRgFaAf8BFAFFAVgB/wET - AUEBVAH/ARABNwFHAf8BCgEpATYB/wEgASwBMAH/GAADtAH/A5cB/wOXAf8DlQH/A5MB/wOSAf8DjQH/ - A4EB/wNjAf8DUgH/FAACVwGSAf8CIgGEAf8CHQGRAf8CGgGbAf8CGwGZAf8CGwGYAf8CGwGYAf8CHQGQ - Af8CIQGEAf8CIgFdAf8CFQE9Af8CIwEwAf8QAAG1ATQBkAH/Aa0BAAFxAf8BtgEAAYEB/wG8AQABgwH/ - AbsBAAGDAf8BugEAAYIB/wG6AQABggH/AbQBAAGBAf8BrAEAAXAB/wGOAQABWwH/AVoBAAE8Af8BQAEU - ATMB/xAAAU0BgQGSAf8BEgFeAYUB/wELAWcBlAH/AQYBbQGfAf8BBwFsAZ0B/wEIAWsBmwH/AQgBawGb - Af8BCwFmAZMB/wEQAV4BhgH/ARYBSAFdAf8BDQEvATwB/wEgASsBMAH/EAADugH/A6wB/wOyAf8DtgH/ - A7UB/wO0Af8DtAH/A7EB/wOrAf8DlgH/A2wB/wNSAf8QAAIiAYcB/wIaAZoB/wIXAagB/wIXAagB/wIX - AagB/wIXAagB/wIZAZ4B/wIXAaMB/wIfAY8B/wIfAVQB/wIgAVgB/wIUATsB/xAAAbABAAGAAf8BvAEA - AYMB/wHGAQABigH/AcYBAAGKAf8BxgEAAYoB/wHGAQABigH/Ab4BAAGFAf8BwQEAAYcB/wG0AQABgQH/ - AYMBAAFTAf8BiAEAAVcB/wFYAQABOwH/EAABEQFhAYkB/wEGAWwBngH/AQEBgQGtAf8BAQGBAa0B/wEB - AYEBrQH/AQEBgQGtAf8BBAFvAaMB/wECAXIBpwH/AQ0BZQGRAf8BFQFCAVQB/wEVAUQBWAH/AQwBLgE7 - Af8QAAOuAf8DtgH/A70B/wO9Af8DvQH/A70B/wO3Af8DuQH/A7EB/wOOAf8DkgH/A2oB/wwAAh0BmQH/ - AhsBogH/AhQBqwH/AhcBqAH/AhcBqAH/AhgBpwH/Ah0BmwH/AigBYgH/AhUBNgH/AgIBDQH/AwAB/wIg - AVcB/wIeAVQB/wITATAB/wgAAb0BAAGEAf8BxQEAAYkB/wHGAQABigH/AcYBAAGKAf8BxgEAAYoB/wHG - AQABigH/Ab8BAAGFAf8BmQEAAWMB/wFTAQABNwH/ARcBAAENAf8DAAH/AYcBAAFWAf8BggEAAVMB/wFL - AQABMgH/CAABCQFtAZ0B/wEGAYABpwH/AQABgQGxAf8BAQGBAa0B/wEBAYEBrQH/AQIBgQGrAf8BCgFu - AZ4B/wEcAU0BYQH/AQ4BKgE2Af8BAAEJAQ0B/wMAAf8BFQFEAVcB/wETAUEBVAH/AQwBJQEvAf8IAAO2 - Af8DuwH/A70B/wO9Af8DvQH/A7wB/wO4Af8DngH/A2YB/wMrAf8DAAH/A5EB/wONAf8DXwH/CAACFAGt - Af8CFwG5Af8CGAGqAf8CFwGoAf8CKAFsAf8CGQE/Af8CBQEVAf8DAAH/AwAB/wMAAf8CAAEHAf8CHwGM - Af8CJQFnAf8CFwFCAf8IAAHIAQABjAH/AdcBAAGWAf8ByQEAAYwB/wHGAQABigH/AaMBAAFqAf8BYAEA - AUEB/wEiAQABFQH/AwAB/wMAAf8DAAH/AQ4BAAEHAf8BswEAAYEB/wGbAQABZAH/AWEBAAFBAf8JAAGB - AbMB/wEAAYoBvwH/AQIBgQGvAf8BAQGBAa0B/wEaAVQBbAH/AREBMgE/Af8BAgEPARUB/wMAAf8DAAH/ - AwAB/wEAAQQBBwH/AQ4BZAGOAf8BGAFQAWcB/wEPATMBQgH/CAADvgH/A8cB/wO+Af8DvQH/A6QB/wNx - Af8DOQH/AwAB/wMAAf8DAAH/AyEB/wOvAf8DnwH/A3IB/wgAAhYBtwH/AhgBwgH/AhoBrQH/AhcBqAH/ - Ah8BTQH/AhEBLQH/AwAB/wMAAf8DAAH/AwAB/wIWATkB/wIWAaYB/wIhAYMB/wIaAUwB/wgAAdQBAAGU - Af8B4QEAAZ0B/wHOAQABjwH/AcYBAAGKAf8BgQEAAU4B/wFGAQABLgH/AQQCAAH/AwAB/wMAAf8DAAH/ - AVcBAAE6Af8BwwEAAYgB/wGrAQABbwH/AW4BAAFKAf8JAAGIAb0B/wEAAZAByAH/AQMBggGyAf8BAQGB - Aa0B/wEVATwBTAH/AQsBIwEtAf8DAAH/AwAB/wMAAf8DAAH/AQ8BLAE4Af8BAAGBAasB/wERAV0BhAH/ - ARABOwFMAf8IAAPFAf8DzgH/A8EB/wO9Af8DiQH/A1oB/wMTAf8DAAH/AwAB/wMAAf8DagH/A7oB/wOq - Af8DhAH/CAACFwG8Af8CGQHHAf8CGwGsAf8CFwGoAf8CGAGnAf8CGQGlAf8CCgEfAf8DAAH/AwAB/wMA - Af8CKAFqAf8CGwGZAf8CHgGNAf8CGwFPAf8IAAHaAQABmAH/AecBAAGhAf8BzgEAAY8B/wHGAQABigH/ - AcYBAAGKAf8BxQEAAYoB/wEwAQABHwH/AwAB/wMAAf8DAAH/AaEBAAFoAf8BuwEAAYMB/wGzAQABgQH/ - AXIBAAFNAf8JAAGMAcIB/wEAAZQBzQH/AQQBgQGxAf8BAQGBAa0B/wECAYEBqwH/AQMBgQGqAf8BBQEX - AR4B/wMAAf8DAAH/AwAB/wEaAVIBaQH/AQcBbAGdAf8BDAFlAZAB/wERAT0BTwH/CAADyQH/A9EB/wPB - Af8DvQH/A7wB/wO8Af8DSAH/AwAB/wMAAf8DBAH/A6MB/wO1Af8DsAH/A4cB/wgAAhcBuwH/AhoBzgH/ - AhgBuQH/AhwBngH/Ah4BmQH/Ag4BJwH/AwAB/wIWATgB/wMAAf8CCgEfAf8CGQGkAf8CFwGoAf8CIQGH - Af8CHAFNAf8IAAHZAQABlwH/Ae4BAAGmAf8B1wEAAZYB/wHCAQABhwH/Ab4BAAGFAf8BPAEAAScB/wMA - Af8BVgEAATkB/wMAAf8BMAEAAR8B/wHFAQABiQH/AcYBAAGKAf8BrwEAAXIB/wFyAQABTQH/CQABiwHB - Af8BAAGZAdQB/wEAAYkBvgH/AQgBcAGiAf8BCgFtAZ0B/wEIAR4BJwH/AwAB/wEOASwBOAH/AwAB/wEF - ARcBHgH/AQQBgAGpAf8BAQGBAa0B/wEQAWABiQH/ARIBPAFNAf8IAAPIAf8D1gH/A8gB/wO6Af8DtwH/ - A1MB/wMAAf8DaQH/AwYB/wNIAf8DuwH/A70B/wOtAf8DhwH/CAACFgG1Af8CGwHRAf8CGQHJAf8CJAGe - Af8CDgEnAf8DAAH/Ah4BSgH/AhUBrgH/AgkBHAH/Ah8BTQH/AhUBrQH/AhcBqAH/AiIBhAH/AiEBUgH/ - CAAB0gEAAZIB/wHzAQABqgH/AeoBAAGjAf8ByQEAAYwB/wE8AQABJwH/AwAB/wFwAQABTAH/AcoBAAGN - Af8BLQEAAR0B/wGBAQABTgH/AckBAAGMAf8BxgEAAYoB/wGtAQABcQH/AYIBAAFTAf8JAAGHAbsB/wEA - AZwB2QH/AQABlgHQAf8BEAFxAaEB/wEIAR4BJwH/AwAB/wEVAToBSgH/AQABggG0Af8BBQEVARwB/wEV - ATwBTAH/AQABgQGzAf8BAQGBAa0B/wERAV8BhgH/ARcBQAFRAf8IAAPEAf8D2QH/A9MB/wO+Af8DUwH/ - AwAB/wOGAf8DvwH/A0QB/wOJAf8DvgH/A70B/wOsAf8DjQH/DAACGwHTAf8CGwHWAf8CLwFaAf8DAAH/ - Ah8BTAH/AhYBqwH/AhkBpAH/AigBXwH/AiIBiwH/AhcBqAH/AhcBqAH/AiABigH/EAAB9AEAAaoB/wH4 - AQABrQH/AZgBAAFiAf8DAAH/AYABAAFOAf8ByAEAAYwB/wHFAQABiQH/AZYBAAFhAf8BtAEAAYEB/wHG - AQABigH/AcYBAAGKAf8BsQEAAYEB/xEAAZ0B2QH/AQABnwHdAf8BJAFJAVcB/wMAAf8BFQE8AUwB/wEA - AYEBsQH/AQQBgAGpAf8BHAFLAV4B/wERAWMBjAH/AQEBgQGtAf8BAQGBAa0B/wEPAWIBjAH/EAAD2gH/ - A9wB/wOdAf8DAAH/A4gB/wO+Af8DuwH/A5wB/wOxAf8DvQH/A70B/wOuAf8QAAJXAdQB/wIdAdoB/wIx - AZYB/wIxAWkB/wIbAbYB/wIeAagB/wIcAagB/wIXAagB/wIXAagB/wIXAagB/wIXAagB/wJQAZ4B/xAA - AesBQAG5Af8B/gEAAbEB/wHOAQABkAH/AakBAAFuAf8B1wEAAZYB/wHNAQABjwH/AcsBAAGOAf8BxgEA - AYoB/wHGAQABigH/AcYBAAGKAf8BxgEAAYoB/wG8ATIBlQH/EAABRAGwAdkB/wEAAaMB4gH/AR8BbgGW - Af8BJAFUAWgB/wEDAYgBuwH/AQgBgQGsAf8BBgGBAa0B/wEBAYEBrQH/AQEBgQGtAf8BAQGBAa0B/wEB - AYEBrQH/AUQBhwGfAf8QAAPiAf8D3wH/A8EB/wOpAf8DyAH/A8EB/wPAAf8DvQH/A70B/wO9Af8DvQH/ - A70B/xQAAlgB2QH/AhsB1gH/AhsB0gH/AhoBzAH/AhgBvwH/AhgBsgH/AhkBqQH/AhkBowH/AhYBowH/ - Ak8BpwH/GAAB8QFAAb4B/wH5AQABrQH/AfQBAAGqAf8B7QEAAaUB/wHfAQABmwH/AdEBAAGSAf8ByQEA - AYwB/wHDAQABiAH/AcEBAAGHAf8BwgE0AZkB/xgAAUUBtAHeAf8BAAGfAd0B/wEAAZwB2QH/AQABmAHT - Af8BAAGPAcYB/wEAAYUBuAH/AQMBgQGvAf8BBAFyAacB/wEBAXIBqAH/AUEBjQGpAf8YAAPmAf8D3AH/ - A9kB/wPUAf8DzAH/A8MB/wO+Af8DugH/A7kB/wPBAf8gAAIXAb8B/wIYAcMB/wIZAcgB/wIYAb8B/wIW - AbUB/wIXAaMB/ygAAd0BAAGaAf8B4wEAAZ4B/wHoAQABogH/Ad8BAAGbAf8B0gEAAZIB/wHBAQABhwH/ - KQABjgHFAf8BAAGRAcoB/wEAAZUBzgH/AQABjwHGAf8BAAGHAbsB/wECAXIBpwH/KAADywH/A84B/wPR - Af8DzAH/A8QB/wO5Af//AP8AKgADNQH/Ay4B/wMsAf8DKwH/AyoB/wMoAf8oAAFkAT4BMQH/AVMBLgEi - Af8BSwEoAR0B/wFJAScBHAH/AUQBJQEaAf8BNgEhARkB/ygAARsBNwEbAf8BEgEtARIB/wEOASkBDgH/ - AQ4BJwEOAf8BDQEkAQ0B/wEMAR0BDAH/KAABRQFHASAB/wE5ATsBFQH/ATMBNgERAf8BMgE0ARAB/wEv - ATEBDwH/ASUBJgEPAf8gAAOCAf8DPwH/Az8B/wM+Af8DPQH/AzwB/wM5Af8DMwH/AywB/wM7Af8YAAGi - AYEBZwH/AYcBSAE2Af8BiAFIATUB/wGGAUcBNAH/AYQBRQEzAf8BggFDATEB/wGBAUABLgH/AWMBNgEo - Af8BSwEoARwB/wE7AS8BKgH/GAABUwFvAVMB/wEeAUgBHgH/AR0BSAEdAf8BHQFHAR0B/wEcAUYBHAH/ - ARsBRQEbAf8BGQFBARkB/wEVATcBFQH/AQ4BKQEOAf8BIgErASIB/xgAAYUBhwFXAf8BWQFdASIB/wFa - AV0BIQH/AVkBXAEhAf8BVwFbASAB/wFVAVkBHwH/AVEBVQEdAf8BRQFIARgB/wEzATYBEQH/ATABMQEk - Af8UAAOIAf8DUQH/A1cB/wNcAf8DWwH/A1kB/wNZAf8DVgH/A1AB/wM/Af8DLwH/AzsB/xAAAbABgQFm - Af8BsAFTATYB/wHCAVMBMAH/Ac0BVAEuAf8BygFUAS8B/wHJAVMBLgH/AckBUwEuAf8BwQFSAS8B/wGx - AVEBNAH/AYcBRwE1Af8BVQEuASEB/wE6AS0BKQH/EAABUwGBAVMB/wEfAWABHwH/ARsBawEbAf8BGQFy - ARkB/wEaAXABGgH/ARoBbwEaAf8BGgFvARoB/wEbAWkBGwH/AR0BYAEdAf8BHQFIAR0B/wERAS4BEQH/ - ASEBKwEhAf8QAAGPAZIBVgH/AYEBhAEhAf8BiwGSARwB/wGUAZwBGAH/AZIBmQEZAf8BkQGYARoB/wGR - AZgBGgH/AYoBkAEbAf8BgQGEAR8B/wFZAV0BIQH/ATsBPQEUAf8CMAEjAf8QAANTAf8DXAH/A2UB/wNl - Af8DZQH/A2UB/wNdAf8DXwH/A1YB/wM6Af8DPAH/Ay4B/xAAAbUBUwE1Af8BywFUAS8B/wHUAVsBNQH/ - AdQBWwE1Af8B1AFbATUB/wHUAVsBNQH/Ac8BVQEvAf8B0gFWATAB/wG+AVMBMgH/AYEBQQEwAf8BgQFD - ATEB/wFTAS0BIAH/EAABHgFjAR4B/wEZAXEBGQH/ARgBgwEYAf8BGAGDARgB/wEYAYMBGAH/ARgBgwEY - Af8BGAGBARgB/wEXAYEBFwH/ARwBaAEcAf8BGwFBARsB/wEbAUQBGwH/AREBLgERAf8QAAGCAYgBIAH/ - AZMBmwEZAf8BoAGoARYB/wGgAagBFgH/AaABqAEWAf8BoAGoARYB/wGXAZ8BFwH/AZsBowEWAf8BiAGO - AR0B/wFRAVQBHgH/AVUBWAEfAf8BOQE8ARMB/wwAA1wB/wNiAf8DZQH/A2UB/wNlAf8DYwH/A14B/wNE - Af8DLQH/AxwB/wMAAf8DPAH/AzkB/wMrAf8IAAHJAVcBMwH/Ac8BWwE3Af8B1wFZATIB/wHUAVsBNQH/ - AdQBWwE1Af8B0wFbATUB/wHKAVkBNQH/AY4BTwE9Af8BTAEsASEB/wEUAQkBBgH/AwAB/wGBAUMBMgH/ - AYEBQAEuAf8BQwEnAR4B/wgAARsBcQEbAf8BGgGBARoB/wEVAYUBFQH/ARgBgwEYAf8BGAGDARgB/wEY - AYIBGAH/ARwBcgEcAf8BIgFMASIB/wERASkBEQH/AQABCAEAAf8DAAH/ARsBRAEbAf8BGQFBARkB/wEP - ASQBDwH/CAABkwGaARsB/wGbAaMBGQH/AaMBqwESAf8BoAGoARYB/wGgAagBFgH/AZ8BpwEWAf8BlAGb - ARwB/wFeAWIBJwH/ATQBNgEUAf8BDAENAQEB/wMAAf8BVAFXASAB/wFRAVUBHQH/AS4BMAESAf8IAANm - Af8DgAH/A2YB/wNlAf8DSQH/AzAB/wMhAf8DAAH/AwAB/wMAAf8DFwH/A1QB/wNFAf8DMQH/CAAB2AFb - ATQB/wHbAWgBRAH/AdQBXgE4Af8B1AFbATUB/wGcAVIBPAH/AVgBMwEnAf8BHwEQAQsB/wMAAf8DAAH/ - AwAB/wENAQQBAgH/AbsBUwEzAf8BlQFOATgB/wFcATMBJQH/CAABFgGHARYB/wEYAZABGAH/ARgBhQEY - Af8BGAGDARgB/wEiAVQBIgH/ARUBMQEVAf8BAwEPAQMB/wMAAf8DAAH/AwAB/wEAAQQBAAH/AR0BZgEd - Af8BIAFQASAB/wETATMBEwH/CAABpAGtARMB/wGwAboBFQH/AaIBqgEWAf8BoAGoARYB/wFoAWwBJgH/ - AT0BPwEYAf8BFAEVAQUB/wMAAf8DAAH/AwAB/wIHAQAB/wGGAYwBHgH/AWMBZwEkAf8BPwFCARcB/wgA - A3AB/wOHAf8DagH/A2UB/wM3Af8DKQH/Aw8B/wMAAf8DAAH/AwAB/wMuAf8DYQH/A08B/wM1Af8IAAHa - AWUBQAH/Ad0BcQFQAf8B1QFiAT4B/wHUAVsBNQH/AWsBPwEwAf8BPwEkARsB/wEDAgAB/wMAAf8DAAH/ - AwAB/wFPAS4BIwH/AdQBVwEwAf8BrwFRATQB/wFpATkBKQH/CAABFwGOARcB/wEZAZcBGQH/ARoBhwEa - Af8BGAGDARgB/wEaATsBGgH/AQ0BIgENAf8DAAH/AwAB/wMAAf8DAAH/ARIBLAESAf8BFwGBARcB/wEd - AV8BHQH/ARYBOgEWAf8IAAGuAbcBFAH/AbkBwgEWAf8BpQGtARgB/wGgAagBFgH/AUoBTQEeAf8BKwEt - ARAB/wMAAf8DAAH/AwAB/wMAAf8BNwE5ARYB/wGeAaYBFAH/AYEBgwEfAf8BSQFMARoB/wgAA4EB/wOM - Af8DagH/A2UB/wNjAf8DYwH/AyUB/wMAAf8DAAH/AwQB/wNIAf8DWwH/A1UB/wM2Af8IAAHcAWsBRwH/ - Ad8BgQFWAf8B1AFiAT8B/wHUAVsBNQH/AdMBWwE1Af8B0gFbATYB/wEsARgBEQH/AwAB/wMAAf8DAAH/ - AZkBUgE8Af8BygFUAS8B/wG9AVIBMQH/AW0BOwErAf8IAAEYAZIBGAH/ARoBmwEaAf8BGgGGARoB/wEY - AYMBGAH/ARgBggEYAf8BGQGBARkB/wEHARYBBwH/AwAB/wMAAf8DAAH/ASIBUgEiAf8BGgFwARoB/wEc - AWcBHAH/ARcBPQEXAf8IAAGzAbwBFQH/Ab0BxwEXAf8BpAGsARkB/wGgAagBFgH/AZ8BpwEWAf8BngGm - ARcB/wEdAR4BCQH/AwAB/wMAAf8DAAH/AWYBagEnAf8BkgGZARkB/wGIAY4BHQH/AUwBTwEbAf8IAAOB - Af8DlgH/A4EB/wNhAf8DXQH/AygB/wMAAf8DLgH/AwYB/wMlAf8DYgH/A2UB/wNSAf8DNgH/CAAB3AFq - AUYB/wHhAYYBXwH/AdoBaQFFAf8BzAFaATcB/wHJAVgBNQH/ATcBHwEXAf8DAAH/AU8BLQEiAf8DAAH/ - ASwBGAERAf8B0QFbATYB/wHUAVsBNQH/AbUBUgE0Af8BawE8ASwB/wgAARgBkgEYAf8BGwGgARsB/wEZ - AZABGQH/ARsBgQEbAf8BHAFwARwB/wELAR0BCwH/AwAB/wESASsBEgH/AwAB/wEHARYBBwH/ARkBgQEZ - Af8BGAGDARgB/wEdAWMBHQH/ARgBPAEYAf8IAAGyAbsBFQH/AcQBzgEYAf8BsAG5ARYB/wGXAZ4BGwH/ - AZMBmgEcAf8BJQEnAQ0B/wMAAf8BNgE4ARUB/wMAAf8BHQEeAQkB/wGdAaQBGAH/AaABqAEWAf8BggGH - AR8B/wFLAU4BGwH/CAADbwH/A5sB/wOQAf8DZgH/AygB/wMAAf8DNgH/A2cB/wMkAf8DNwH/A2YB/wNl - Af8DUQH/AzkB/wgAAdoBYwE+Af8B4gGKAWUB/wHfAYEBWgH/AcgBYwFEAf8BNwEfARcB/wMAAf8BZwE9 - AS4B/wHYAV0BNgH/ASkBFgEQAf8BawE/ATAB/wHXAVwBNgH/AdQBWwE1Af8BsQFSATUB/wFxAUIBMwH/ - CAABFwGNARcB/wEcAaQBHAH/ARsBnQEbAf8BIQGBASEB/wELAR0BCwH/AwAB/wEZATkBGQH/ARYBiAEW - Af8BBwEVAQcB/wEaATsBGgH/ARYBhwEWAf8BGAGDARgB/wEeAWABHgH/ARwBPwEcAf8IAAGsAbUBFAH/ - AcgB0gEYAf8BwAHKARcB/wGYAZ4BIgH/ASUBJwENAf8DAAH/AUgBSgEdAf8BpgGvARMB/wEbARwBCAH/ - AUoBTQEeAf8BpQGtARQB/wGgAagBFgH/AYEBhAEgAf8BTwFRASEB/wwAA54B/wOiAf8DRAH/AwAB/wM3 - Af8DZgH/A2IB/wNDAf8DVgH/A2UB/wNlAf8DUwH/EAAB4gGLAWYB/wHjAY8BagH/AYQBUwFFAf8DAAH/ - AWoBPgEwAf8B1gFcATYB/wHRAVsBNgH/AYsBTgE8Af8BugFVATcB/wHUAVsBNQH/AdQBWwE1Af8BuQFT - ATQB/xAAARwBpAEcAf8BHQGnAR0B/wEnAUYBJwH/AwAB/wEaATsBGgH/ARcBhQEXAf8BGQGBARkB/wEi - AUoBIgH/AR8BZQEfAf8BGAGDARgB/wEYAYMBGAH/AR0BZQEdAf8QAAHIAdMBGQH/AcwB1gEZAf8BVwFZ - AS4B/wMAAf8BSgFMAR4B/wGjAasBFAH/AZ0BpAEYAf8BXAFfAScB/wGFAYsBIQH/AaABqAEWAf8BoAGo - ARYB/wGEAYoBHwH/EAADtwH/A6gB/wNqAf8DTgH/A4EB/wNqAf8DaQH/A2UB/wNlAf8DZQH/A2UB/wOL - Af8QAAHoAaABhwH/AeQBlAFxAf8BvQFuAVYB/wGYAVoBSAH/AdcBagFIAf8B0AFkAUIB/wHRAWEBPgH/ - AdQBWwE1Af8B1AFbATUB/wHUAVsBNQH/AdQBWwE1Af8BwAGBAV8B/xAAAVgBtQFYAf8BHgGrAR4B/wEr - AW8BKwH/ASkBUgEpAf8BGwGOARsB/wEdAYMBHQH/ARsBhAEbAf8BGAGDARgB/wEYAYMBGAH/ARgBgwEY - Af8BGAGDARgB/wFOAYgBTgH/EAABzQHUAVUB/wHRAdwBGgH/AZABlgEwAf8BZQFpATAB/wGtAbYBGQH/ - AaEBqAEcAf8BoQGpARoB/wGgAagBFgH/AaABqAEWAf8BoAGoARYB/wGgAagBFgH/AZoBngFPAf8UAAO+ - Af8DogH/A5sB/wOSAf8DgwH/A20B/wNmAf8DYQH/A18B/wOPAf8YAAHpAaUBjwH/AeMBjwFrAf8B4gGL - AWUB/wHgAYQBXQH/Ad0BbwFNAf8B2AFjAT8B/wHUAV4BOQH/AdABWQE0Af8B0wFWAS8B/wHKAYEBXQH/ - GAABWQG6AVkB/wEdAacBHQH/ARwBpAEcAf8BGwGfARsB/wEZAZYBGQH/ARgBiwEYAf8BGQGEARkB/wEZ - AYEBGQH/ARcBgQEXAf8BTgGQAU4B/xgAAdMB2gFWAf8BzAHXARkB/wHIAdIBGQH/AcIBzAEYAf8BtwHA - ARYB/wGqAbMBFgH/AaEBqgEXAf8BmwGjARcB/wGcAaQBFQH/AaIBpwFOAf8gAAOCAf8DhwH/A4wB/wOD - Af8DbwH/A18B/ygAAd0BbgFMAf8B3gGAAVIB/wHfAYEBWAH/Ad0BbwFNAf8B2gFjAT4B/wHSAVYBMAH/ - KAABGQGVARkB/wEaAZkBGgH/ARoBnAEaAf8BGQGWARkB/wEXAY0BFwH/ARcBgQEXAf8oAAG2Ab8BFQH/ - AboBxAEWAf8BvgHIARcB/wG3AcABFgH/AawBtQEUAf8BmwGjARYB//8AFQABQgFNAT4HAAE+AwABKAMA - AUADAAFgAwABAQEAAQEGAAEDFgAD/4EACP8B+AEfAfgBHwH4AR8B+AEfAeABBwHgAQcB4AEHAeABBwHA + AYQBZwHEAf8BgQFeAcQB/wGAAVwBwwH/AWgBWgHBAf8BaAFcAbYB/ykAAUEBlwH/AQABMgFpAf8BAAEr + AV0B/wEAASkBWgH/AQABJgFUAf8BAAEfAUcB/ygAATUBTgFQAf8BJgE+AUAB/wEgATYBOAH/AR4BNAE2 + Af8BHAEwATIB/wEYASYBJwH/KAABHAFAAU8B/wEQATIBQAH/AQsBLAE5Af8BCgErATgB/wEJAScBMwH/ + AQkBHgEmAf8gAAG5AbQB0gH/AZ8BlQHSAf8BngGUAdMB/wGcAZIB0gH/AZsBkQHSAf8BmQGOAdIB/wGV + AYoB0AH/AYsBgQHLAf8BgAFdAcUB/wFeAVgBkQH/GAABQgGUAcsB/wEAAVIBtQH/AQABUgG0Af8BAAFQ + AbIB/wEAAU8BrwH/AQABTQGrAf8BAAFJAaQB/wEAAT0BjgH/AQABKwFdAf8BFwExAUYB/xgAAYoBnwGh + Af8BQAFkAWcB/wE/AWQBZwH/AT4BYwFmAf8BPAFhAWQB/wE6AV8BYgH/ATcBWgFdAf8BLgFLAU4B/wEf + ATYBOAH/AS0CNAH/GAABZQGUAaEB/wEfAVMBaQH/AR4BVAFpAf8BHQFSAWgB/wEcAVEBZgH/ARoBTwFk + Af8BGAFKAV8B/wETAT4BTwH/AQsBLAE5Af8BJgEvATQB/xQAAbwBtwHYAf8BqwGhAeIB/wGuAaMB6AH/ + AbABpAHsAf8BrwGkAesB/wGvAaQB6gH/Aa8BpAHqAf8BrQGhAegB/wGqAZ8B4gH/AZ0BkwHTAf8BgwFl + AcYB/wFdAVcBkQH/EAABRAGbAdQB/wEAAWcB2wH/AQABgQHmAf8BAAGCAe0B/wEAAYEB7AH/AQABgQHq + Af8BAAGBAeoB/wEAAYEB5AH/AQABZgHZAf8BAAFRAbMB/wEAATIBgAH/ARYBMAFFAf8QAAGNAagBqgH/ + AUoBkwGYAf8BSgGfAaUB/wFMAaUBqwH/AUwBowGpAf8BSwGiAagB/wFLAaIBqAH/AUkBngGjAf8BSAGT + AZgB/wE/AWMBZwH/ASYBPwFBAf8BLQEzATQB/xAAAWQBnAGsAf8BHAGBAaAB/wEVAYkBsQH/ARABkQG9 + Af8BEQGPAboB/wESAY0BuAH/ARIBjQG4Af8BFAGIAa8B/wEaAYEBoAH/AR0BUwFpAf8BDwEzAUIB/wEl + AS8BMwH/EAABrAGiAeMB/wGvAaQB6wH/AbUBqgHwAf8BtQGqAfAB/wG1AaoB8AH/AbUBqgHwAf8BsAGl + Ae0B/wGxAaYB7wH/Aa0BogHnAf8BlwGNAc8B/wGZAY4B0QH/AYIBZAHGAf8RAAFoAd4B/wEAAYEB7QH/ + AQABiQH6Af8BAAGJAfoB/wEAAYkB+gH/AQABiQH6Af8BAAGDAfAB/wEAAYUB9AH/AQABgQHkAf8BAAFJ + AaUB/wEAAU0BqwH/AQABMQFoAf8QAAFKAZcBnAH/AUwBpAGqAf8BUwGsAbIB/wFTAawBsgH/AVMBrAGy + Af8BUwGsAbIB/wFNAaYBrAH/AU4BqQGvAf8BSgGdAaIB/wE5AVoBXQH/ATsBXgFhAf8BJQE9AT8B/xAA + ARsBggGkAf8BEQGPAbwB/wEMAZsBzQH/AQwBmwHNAf8BDAGbAc0B/wEMAZsBzQH/AQ8BkgHAAf8BDAGW + AcYB/wEXAYcBrQH/ARoBSwFeAf8BGwFOAWMB/wEOATIBQQH/DAABsgGnAeoB/wG1AasB7QH/AbQBqAHx + Af8BtQGqAfAB/wG1AaoB8AH/AbUBqgHvAf8BswGoAesB/wGmAZ0B0wH/AYIBZQHAAf8BTwFAAa4B/wMA + Af8BmQGPAdAB/wGVAYoB0AH/AYEBYQG9Af8JAAGCAe8B/wEAAYgB+AH/AQABiQH6Af8BAAGJAfoB/wEA + AYkB+gH/AQABiAH6Af8BAAGEAfEB/wEAAVkBwgH/AQABLgFiAf8BAAEEARYB/wMAAf8BAAFMAaoB/wEA + AUkBpAH/AQABKAFXAf8IAAFPAaQBqgH/AVQBqQGvAf8BUQGtAbQB/wFTAawBsgH/AVMBrAGyAf8BUwGr + AbEB/wFRAaUBqgH/AUcCgQH/ASMBOAE6Af8BAQIIAf8DAAH/ATsBXgFhAf8BNwFaAV0B/wEfATEBMwH/ + CAABFAGQAbsB/wERAZcBxgH/AQgBnAHRAf8BDAGbAc0B/wEMAZsBzQH/AQ0BmgHLAf8BFAGRAbwB/wEl + AVkBgQH/AQ8BLgE6Af8BAAEEAQgB/wMAAf8BGwFOAWIB/wEYAUoBXwH/AQ0BKAEyAf8IAAG1AaoB8gH/ + Ab8BtQHzAf8BtwGsAfAB/wG1AaoB8AH/AakBoAHZAf8BiQGBAcQB/wFUAUUBswH/AU4BRQGNAf8DAAH/ + AwAB/wFKATsBqwH/Aa0BogHlAf8BpAGaAdcB/wGIAYAByAH/CQABigH9Af8BAAGSAv8BAAGLAf4B/wEA + AYkB+gH/AQABXwHOAf8BAAE3AYMB/wEAAQwBJAH/AwAB/wMAAf8DAAH/AgABCwH/AQABgAHhAf8BAAFa + AcQB/wEAATgBhQH/CAABUwGuAbUB/wFhAbUBuwH/AVYBrQGzAf8BUwGsAbIB/wFKAYYBigH/ASsBQwFF + Af8BBwERARIB/wMAAf8DAAH/AwAB/wEAAgEB/wFKAZoBoAH/AUUBgQGDAf8BKgFFAUcB/wgAAQkBngHS + Af8BCgGpAeIB/wENAZ0BzwH/AQwBmwHNAf8BIwFiAYwB/wETATcBRQH/AQABDAESAf8DAAH/AwAB/wMA + Af8CAAEBAf8BGAGFAaoB/wEgAV0BhgH/AREBOQFJAf8IAAG9AbMB8wH/AcYBvQH1Af8BugGwAfAB/wG1 + AaoB8AH/AZUBigHKAf8BgAFdAbwB/wFHATgBpAH/AwAB/wMAAf8DAAH/AYQBaAHBAf8BsgGnAfAB/wGp + AZ4B4gH/AY4BggHNAf8JAAGRAv8BCwGYAv8BAAGNAv8BAAGJAfoB/wEAAUQBnAH/AQABJQFRAf8DAAH/ + AwAB/wMAAf8DAAH/AQABMQFnAf8BAAGGAfYB/wEAAWUB1wH/AQABQAGUAf8IAAFeAbQBugH/AYEBugHA + Af8BWwGvAbUB/wFTAawBsgH/ATYBUwFVAf8BHAEtAS8B/wMAAf8DAAH/AwAB/wMAAf8BJgE8AT0B/wFP + AasBsQH/AUgBkgGXAf8BMAFQAVIB/wgAAQoBpwHeAf8BFAGuAeQB/wEPAaAB0wH/AQwBmwHNAf8BGwFF + AVUB/wELASUBLwH/AwAB/wMAAf8DAAH/AwAB/wERATEBPQH/AQsBmAHKAf8BGgGBAZ8B/wEVAUIBVAH/ + CAABwQG4AfQB/wHKAcIB9QH/AbsBsQHwAf8BtQGqAfAB/wG1AaoB7wH/AbUBqgHvAf8BXAFPAbcB/wMA + Af8DAAH/AUYBOAGdAf8BqAGfAdcB/wGvAaQB6wH/Aa0BogHmAf8BkQGFAc4B/wgAAQIBlAL/ARIBmwL/ + AQABjQL/AQABiQH6Af8BAAGIAfoB/wEAAYgB+QH/AQABFgE2Af8DAAH/AwAB/wMAAf8BAAFeAcsB/wEA + AYEB7AH/AQABgQHiAf8BAAFDAZoB/wgAAWMBtwG9Af8BgQG9AcIB/wFbAa8BtAH/AVMBrAGyAf8BUwGr + AbEB/wFTAasBsQH/AQ8BHAEeAf8DAAH/AwAB/wMAAf8BSQGDAYcB/wFMAaMBqQH/AUkBmwGhAf8BMwFT + AVYB/wgAAQ0BqwHjAf8BGgGwAeUB/wEQAZ8B0QH/AQwBmwHNAf8BDQGaAcsB/wEOAZkByQH/AQMBFgEe + Af8DAAH/AwAB/wMAAf8BJAFgAYkB/wERAY8BugH/ARYBhgGsAf8BFgFFAVgB/wgAAcABtwH0Af8BzwHI + AfYB/wHAAbYB8wH/AbQBqQHsAf8BsgGoAeoB/wFkAVcBugH/ASgBDQHEAf8BgwFnAcIB/wFDATQBogH/ + AVwBTwG3Af8BtQGqAe4B/wG1AaoB8AH/AasBoQHjAf8BkQGGAc0B/wgAAQEBlAL/ARwBoAL/AQABkwL/ + AQABhQH0Af8BAAGDAfAB/wEAAR4BRQH/AwAB/wEAATABZgH/AwAB/wEAARYBNgH/AQABiAH4Af8BAAGJ + AfoB/wEAAWgB3QH/AQABQwGZAf8IAAFiAbYBvAH/AYgBwQHGAf8BYgG1AbsB/wFSAacBrAH/AVABpAGp + Af8BFgEmASgB/wMAAf8BJQE7AT0B/wMAAf8BDwEcAR4B/wFTAaoBsAH/AVMBrAGyAf8BSQGWAZsB/wEz + AVIBVQH/CAABDAGqAeMB/wEjAbMB5gH/AQwBqQHhAf8BEwGUAcAB/wEVAZABugH/AQcBHgEoAf8DAAH/ + ARABMAE9Af8DAAH/AQMBFgEeAf8BDwGYAcgB/wEMAZsBzQH/ARkBgQGkAf8BFwFEAVYB/wgAAbwBsQHz + Af8B0wHMAfcB/wHMAcQB9gH/AbsBsgHqAf8BZAFXAboB/wMAAf8BkwGJAckB/wG3AasB8gH/AVsBTQG2 + Af8BlQGKAcoB/wG2AasB8QH/AbUBqgHwAf8BqwGhAeIB/wGYAY8BzAH/CQABkAL/ASIBowL/ARYBnQL/ + AQABigH9Af8BAAEeAUUB/wMAAf8BAAFCAZcB/wEAAYsC/wEAARQBMgH/AQABRAGcAf8BAAGLAf4B/wEA + AYkB+gH/AQABZwHbAf8BAAFJAaQB/wgAAVwBswG5Af8BjQHDAcgB/wGDAb8BxAH/AVwBqAGtAf8BFgEm + ASgB/wMAAf8BNAFQAVIB/wFVAa8BtQH/AQ4BGgEbAf8BNgFTAVUB/wFVAa8BtQH/AVMBrAGyAf8BSQGU + AZgB/wE6AVgBWwH/CAABCgGlAd0B/wEoAbUB5gH/AR0BsQHlAf8BHAGWAcAB/wEHAR4BKAH/AwAB/wEa + AUIBUgH/AQkBnwHVAf8BAgEUARsB/wEbAUUBVQH/AQoBngHTAf8BDAGbAc0B/wEbAYEBoAH/AR0BSQFb + Af8MAAHTAc0B9wH/AdYB0AH3Af8BqQGjAcwB/wFOAUUBjQH/AZQBigHKAf8BtgGrAfEB/wG1AaoB7gH/ + AaQBmwHSAf8BrwGlAeQB/wG1AaoB8AH/AbUBqgHwAf8BrAGiAeQB/xAAASQBowL/ASgBpQL/AQABWAHA + Af8DAAH/AQABRAGbAf8BAAGKAf0B/wEAAYgB+AH/AQABVgG9Af8BAAGBAeQB/wEAAYkB+gH/AQABiQH6 + Af8BAAFpAeAB/xAAAY4BxAHIAf8BkQHGAcoB/wFLAWYBaAH/AwAB/wE2AVIBVQH/AVQBrQG0Af8BUwGq + AbAB/wFFAWgBgQH/AU0BmgGfAf8BUwGsAbIB/wFTAawBsgH/AUoBmQGeAf8QAAEpAbUB5wH/AS0BtgHn + Af8BLQFUAWQB/wMAAf8BGgFEAVUB/wELAZ0B0AH/AQ8BmAHIAf8BJAFXAYEB/wEcAYUBqAH/AQwBmwHN + Af8BDAGbAc0B/wEZAYMBpwH/EAAB3QHYAfkB/wHaAdUB+AH/AcIBuwHmAf8BsAGqAdUB/wHBAbcB8gH/ + AbsBsgHuAf8BuQGvAe8B/wG1AaoB8AH/AbUBqgHwAf8BtQGqAfAB/wG1AaoB8AH/AbwBtgHcAf8QAAFm + AcEC/wEwAakC/wEAAY4C/wEAAWQB1QH/AQABkwL/AQABjQL/AQABjAL/AQABiQH6Af8BAAGJAfoB/wEA + AYkB+gH/AQABiQH6Af8BQQGdAdwB/xAAAbEB1wHaAf8BlwHJAc0B/wFnAaUBqQH/AVIBhwGKAf8BYwG0 + AboB/wFcAa0BsgH/AVoBrQGyAf8BUwGsAbIB/wFTAawBsgH/AVMBrAGyAf8BUwGsAbIB/wGLAa8BsgH/ + EAABgQHPAe8B/wEzAbkB6AH/AS0BkwG2Af8BLgFiAYgB/wEQAacB3QH/ARUBnQHMAf8BEgGcAc0B/wEM + AZsBzQH/AQwBmwHNAf8BDAGbAc0B/wEMAZsBzQH/AVwBogG3Af8UAAHhAd0B+gH/AdYB0AH4Af8B0wHM + AfcB/wHOAccB9gH/AcUBvAH0Af8BvAGxAfIB/wG3Aa0B8AH/AbMBqAHuAf8BsQGmAe8B/wG/AbgB4QH/ + GAABgQHFAv8BKQGmAv8BIwGjAv8BGgGfAv8BCAGXAv8BAAGPAv8BAAGLAf4B/wEAAYYB9gH/AQABhQH0 + Af8BRAGiAeIB/xgAAbUB2QHcAf8BkgHGAcoB/wGNAcQByAH/AYYBwAHFAf8BaAG5Ab8B/wFcAbIBuAH/ + AVcBrQGzAf8BUQGpAa8B/wFOAakBsAH/AY0BtgG5Af8YAAGDAdEB8AH/AS0BtwHnAf8BKAG1AeYB/wEh + AbIB5QH/ARIBrAHkAf8BDAGjAdkB/wEOAZwBzgH/AQ8BlwHGAf8BCwGWAccB/wFbAakBwgH/IAABwwG6 + AfQB/wHHAb8B9QH/AcsBwwH1Af8BxQG8AfQB/wG8AbEB8wH/AbEBpgHvAf8oAAEHAZYC/wENAZkC/wEU + AZwC/wEIAZcC/wEAAZAC/wEAAYUB9AH/KAABZwG5Ab4B/wGBAbsBwAH/AYIBvgHDAf8BaAG5Ab8B/wFc + AbMBuQH/AU4BqQGvAf8oAAEQAawB5AH/ARYBrgHkAf8BHAGwAeUB/wESAawB5AH/AQoBpQHdAf8BDAGW + AcYB//8A/wAqAAElATEBggH/ARUBIAFeAf8BEAEaAVUB/wEPARkBUgH/AQ0BFwFMAf8BDwEVATsB/ygA + AZIBPQGSAf8BgQEsAYEB/wFnASYBZwH/AWUBJAFlAf8BXwEjAV8B/wFPASMBTwH/KQACkAH/AQACZAH/ + AQACWQH/AQACVgH/AQACUAH/AQACQwH/KAADpQH/A5EB/wOHAf8DhQH/A4EB/wNkAf8gAAGBAYYBvAH/ + ASYBNwGmAf8BJQE2AacB/wEkATUBpQH/ASMBMwGjAf8BIQExAaAB/wEfAS4BmQH/ARkBJgGDAf8BDwEZ + AVUB/wEpASwBPgH/GAABvgGTAb4B/wGwAUQBsAH/AbEBQgGxAf8BsAFAAbAB/wGvAT4BrwH/AawBPAGs + Af8BpgE5AaYB/wGTATEBkwH/AWcBJQFnAf8BSgE1AUoB/xgAAWYCyQH/AQACrQH/AQACrQH/AQACqwH/ + AQACqAH/AQACpAH/AQACnQH/AQACiAH/AQACWAH/ASgCSAH/GAADyQH/A7sB/wO7Af8DuAH/A7YB/wO1 + Af8DrwH/A54B/wOHAf8DWAH/FAABgAGHAcsB/wEnAT4B0wH/ASgBQQHhAf8BKQFDAekB/wEpAUMB5wH/ + ASgBQgHmAf8BKAFCAeYB/wElAT8B4QH/ASQBPAHVAf8BJQE1AaYB/wEUAR8BYQH/ASgBKwE9Af8QAAHH + AZYBxwH/AckBWAHJAf8B0wFcAdMB/wHZAV4B2QH/AdgBXwHYAf8B1wFdAdcB/wHXAV0B1wH/AdIBWQHS + Af8BygFWAcoB/wGwAUIBsAH/AYIBKwGCAf8BSgE0AUoB/xAAAWgC0QH/AQAC0QH/AQAC3AH/AQAC5AH/ + AQAC4gH/AQAC4QH/AQAC4QH/AQAC2gH/AQAC0AH/AQACrAH/AQACZQH/AScCRwH/EAAD0QH/A9MB/wPa + Af8D3wH/A94B/wPcAf8D3AH/A9kB/wPSAf8DugH/A5IB/wNXAf8QAAEpAUAB1wH/ASkBQwHoAf8BMQFL + AfAB/wExAUsB8AH/ATEBSwHwAf8BMQFLAfAB/wEpAUQB6wH/ASsBRQHvAf8BKAFBAd4B/wEhATABmAH/ + ASIBMgGfAf8BEwEeAV8B/xAAAcsBWgHLAf8B2AFeAdgB/wHgAWgB4AH/AeABaAHgAf8B4AFoAeAB/wHg + AWgB4AH/AdsBYAHbAf8B3gFiAd4B/wHRAVsB0QH/AaUBOwGlAf8BqwE9AasB/wGBASoBgQH/EQAC1QH/ + AQAC4wH/AQAC8AH/AQAC8AH/AQAC8AH/AQAC8AH/AQAC5gH/AQAC6QH/AQAC2gH/AQACngH/AQACpAH/ + AQACYwH/EAAD1QH/A98B/wPmAf8D5gH/A+YB/wPmAf8D4AH/A+EB/wPZAf8DsAH/A7UB/wOQAf8MAAEu + AUcB5QH/ATQBTQHrAf8BLQFIAfQB/wExAUsB8AH/ATEBSwHwAf8BMQFLAe8B/wExAUkB5QH/AS4BPwGu + Af8BFQEfAVYB/wIAAREB/wMAAf8BIwEyAZ0B/wEfAS4BmQH/ARMBGwFLAf8IAAHXAWMB1wH/AdwBaQHc + Af8B4gFmAeIB/wHgAWgB4AH/AeABaAHgAf8B3wFoAd8B/wHYAWUB2AH/AbIBUQGyAf8BZwErAWcB/wEq + AQ0BKgH/AwAB/wGqAT0BqgH/AaYBOQGmAf8BXgEoAV4B/wkAAuUB/wEAAu4B/wEAAvAB/wEAAvAB/wEA + AvAB/wEAAu8B/wEAAucB/wEAArkB/wEAAl0B/wEAAhQB/wMAAf8BAAKjAf8BAAKdAf8BAAJTAf8IAAPf + Af8D5AH/A+YB/wPmAf8D5gH/A+UB/wPgAf8DwwH/A4sB/wMyAf8DAAH/A7QB/wOvAf8DggH/CAABMAFL + AfQB/wFFAV0B9QH/ATYBTwHwAf8BMQFLAfAB/wErAT4BwAH/ARoBJQFkAf8BAAEFAR8B/wMAAf8DAAH/ + AwAB/wIAAQgB/wEnAUAB3AH/AScBOgG4Af8BFwEjAYAB/wgAAeMBaAHjAf8B5gGLAeYB/wHgAYEB4AH/ + AeABaAHgAf8BuwFWAbsB/wGGATEBhgH/ATYBEgE2Af8BCgEAAQoB/wMAAf8DAAH/ASIBCAEiAf8BzwFa + Ac8B/wG4AU0BuAH/AYsBLgGLAf8JAALyAf8BAAP/AQAC9AH/AQAC8AH/AQACxQH/AQACgQH/AQACIgH/ + AwAB/wMAAf8DAAH/AQACCgH/AQAC2AH/AQACvAH/AQACgQH/CAAD5wH/A/IB/wPnAf8D5gH/A8kB/wOY + Af8DRAH/AwAB/wMAAf8DAAH/AyYB/wPWAf8DwwH/A5kB/wgAAUEBWQH1Af8BVAGAAfYB/wE9AVUB7wH/ + ATEBSwHwAf8BIgEwAYwB/wEQARgBRgH/AwAB/wMAAf8DAAH/AwAB/wEXASEBWgH/ASsBRgHxAf8BIwE7 + AdQB/wEaASkBigH/CAAB5gGHAeYB/wHpAZcB6QH/AeEBgwHhAf8B4AFoAeAB/wGaATsBmgH/AVoBJQFa + Af8BGAEDARgB/wMAAf8DAAH/AwAB/wGBAS0BgQH/Ad8BYwHfAf8ByQFVAckB/wGZATQBmQH/CQAD/wEA + A/8BAAL5Af8BAALwAf8BAAKWAf8BAAJNAf8DAAH/AwAB/wMAAf8DAAH/AQACYgH/AQAC7AH/AQACzwH/ + AQACjgH/CAAD8AH/A/kB/wPrAf8D5gH/A6oB/wOBAf8DFAH/AwAB/wMAAf8DAAH/A5AB/wPiAf8D0AH/ + A6QB/wgAAUoBYQH2Af8BXQGCAfcB/wE+AVYB7gH/ATEBSwHwAf8BMQFLAe8B/wEyAUwB7gH/AQYBDAEv + Af8DAAH/AwAB/wMAAf8BLAE/AbsB/wEpAUMB5wH/ASYBPwHeAf8BGwEqAZAB/wgAAecBjgHnAf8B6wGf + AesB/wHgAYMB4AH/AeABaAHgAf8B3wFoAd8B/wHeAWgB3gH/AUQBGQFEAf8DAAH/AwAB/wEPAQABDwH/ + AbkBVQG5Af8B2AFfAdgB/wHQAVoB0AH/AZ4BNQGeAf8JAAP/AQYD/wEAAvkB/wEAAvAB/wEAAu8B/wEA + Au8B/wEAAjMB/wMAAf8DAAH/AwAB/wEAAsIB/wEAAuIB/wEAAtkB/wEAApMB/wgAA/QB/wP9Af8D6wH/ + A+YB/wPlAf8D5QH/A1YB/wMAAf8DAAH/AwAB/wPIAf8D3gH/A9gB/wOoAf8IAAFIAV8B9QH/AWgBjAH3 + Af8BRwFeAfQB/wEyAUsB5wH/ATABSQHkAf8BCwETATwB/wMAAf8BFgEgAVkB/wMAAf8BBgEMAS8B/wEy + AUwB7QH/ATEBSwHwAf8BJgE+AdgB/wEdASsBjQH/CAAB5wGNAecB/wHtAakB7QH/AeYBjAHmAf8B2gFn + AdoB/wHXAWQB1wH/AVABIAFQAf8BEgEAARIB/wGBASwBgQH/AREBAAERAf8BRAEZAUQB/wHdAWcB3QH/ + AeABaAHgAf8BzAFYAcwB/wGcATYBnAH/CQAD/wEQA/8BAAP/AQAC6gH/AQAC5gH/AQACQgH/AwAB/wEA + AmEB/wMAAf8BAAIzAf8BAALuAf8BAALwAf8BAALUAf8BAAKTAf8IAAPzAf8EAAPzAf8D4gH/A+AB/wNj + Af8DAAH/A44B/wMCAf8DVgH/A+QB/wPmAf8D1AH/A6gB/wgAAT4BVwH1Af8BgQGSAfgB/wFhAYYB9wH/ + AUMBWQHiAf8BCwETATwB/wMAAf8BIQEuAYcB/wEyAU0B9AH/AQUBCwErAf8BIgEwAYwB/wEzAU0B8wH/ + ATEBSwHwAf8BJgE+AdQB/wElATMBkwH/CAAB5QGEAeUB/wHuAa8B7gH/AesBowHrAf8B2AGEAdgB/wFQ + ASABUAH/AwAB/wGWAToBlgH/AeMBgAHjAf8BQQEYAUEB/wGaATsBmgH/AeIBgAHiAf8B4AFoAeAB/wHJ + AVgByQH/AaEBPwGhAf8JAAL+Af8BFgP/AQoD/wEAAvMB/wEAAkIB/wMAAf8BAAKRAf8BAAL0Af8BAAIw + Af8BAAKWAf8BAAL0Af8BAALwAf8BAALRAf8BAAKeAf8IAAPuAf8IAAPnAf8DYwH/AwAB/wOmAf8D6AH/ + A1EB/wOqAf8D5wH/A+YB/wPTAf8DrwH/DAABggGTAfgB/wGHAZgB+AH/ATsBRwGfAf8DAAH/ASIBLwGL + Af8BMgFMAfIB/wEyAUwB7QH/AS4BPgGqAf8BLgFFAdgB/wExAUsB8AH/ATEBSwHwAf8BJwE/AdoB/xAA + Ae4BsAHuAf8B7wG1Ae8B/wGnAVkBpwH/AQoBAAEKAf8BmQE7AZkB/wHhAWkB4QH/Ad0BZwHdAf8BsAFO + AbAB/wHNAV8BzQH/AeABaAHgAf8B4AFoAeAB/wHNAVoBzQH/EAABFwP/ARsD/wEAArgB/wMAAf8BAAKV + Af8BAALyAf8BAALuAf8BAAK1Af8BAALaAf8BAALwAf8BAALwAf8BAALXAf8YAAPCAf8DAAH/A6kB/wPn + Af8D5AH/A8EB/wPZAf8D5gH/A+YB/wPVAf8QAAGjAbEB+gH/AY8BnwH5Af8BWQFpAdUB/wE+AU0BtgH/ + AUoBYQHxAf8BQQFYAeoB/wE9AVQB7AH/ATEBSwHwAf8BMQFLAfAB/wExAUsB8AH/ATEBSwHwAf8BZwGG + AdQB/xAAAfIBwQHyAf8B8QG8AfEB/wHRAZMB0QH/AbYBZQG2Af8B5AGOAeQB/wHeAYUB3gH/Ad4BgQHe + Af8B4AFoAeAB/wHgAWgB4AH/AeABaAHgAf8B4AFoAeAB/wHOAZYBzgH/EAABmAP/ASMD/wEAAvkB/wEA + AswB/wEAA/8BAAL4Af8BAAL2Af8BAALwAf8BAALwAf8BAALwAf8BAALwAf8BZALUAf8QAAP8Af8EAAPr + Af8DzwH/A/MB/wPrAf8D6gH/A+YB/wPmAf8D5gH/A+YB/wPVAf8UAAGsAbcB+wH/AYgBmQH4Af8BgQGT + AfgB/wFlAYkB9wH/AVEBZwH2Af8BPgFXAfMB/wE3AVAB7wH/AS8BSQHtAf8BKgFFAfAB/wFoAYgB3QH/ + GAAB9AHJAfQB/wHvAbYB7wH/Ae4BrwHuAf8B7AGmAewB/wHoAZUB6AH/AeQBhAHkAf8B4AGBAeAB/wHd + AWUB3QH/Ad4BYQHeAf8B1AGZAdQB/xgAAZ4D/wEcA/8BFgP/AQ4D/wEAA/8BAAL8Af8BAAL0Af8BAALs + Af8BAALpAf8BaALaAf8oAAP3Af8D7QH/A+cB/wPiAf8D4QH/A9kB/yAAAU8BZQH2Af8BVwGBAfYB/wFe + AYQB9wH/AVEBZwH2Af8BPgFXAfUB/wErAUUB7wH/KAAB6AGTAegB/wHqAZoB6gH/AesBoAHrAf8B6AGV + AegB/wHlAYQB5QH/Ad4BYgHeAf8pAAP/AQID/wEIA/8BAAP/AQAC/gH/AQAC6QH/KAAD9wH/A/kB/wP9 + Af8D9wH/A+4B/wPhAf//AP8AKgADTwH/A0QB/wM/Af8DPgH/AzwB/wM3Af8oAAGRAVoBCAH/AWgBRwEA + Af8BXQE+AQAB/wFaATwBAAH/AVQBNwEAAf8BQwEtAQAB/ygAASIBTAEiAf8BFQE9ARUB/wEQATcBEAH/ + AQ8BNQEPAf8BDgEwAQ4B/wENASUBDQH/KAACngE4Af8ClgETAf8CkwEFAf8CkgECAf8CjQEAAf8CZQEC + Af8gAAOZAf8DXAH/A1wB/wNaAf8DWQH/A1gB/wNUAf8DSwH/Az8B/wNAAf8YAAHGAakBVwH/AbQBggEI + Af8BtAGBAQcB/wGyAYEBBwH/Aa8BgQEGAf8BrAGBAQUB/wGkAWUBBAH/AY4BVgECAf8BXQE9AQAB/wFD + ATgBHwH/GAABgAGeAYAB/wEnAWQBJwH/ASYBZQEmAf8BJQFkASUB/wEkAWIBJAH/ASIBYAEiAf8BIAFa + ASAB/wEaAUwBGgH/ARABNgEQAf8BKAEzASgB/xgAAsABmwH/ArIBTgH/ArQBTAH/ArIBSQH/ArEBRQH/ + ArEBQQH/Aq0BOgH/AqIBJAH/ApMBAwH/AlQBIgH/FAADnwH/A4EB/wOEAf8DiQH/A4gB/wOGAf8DhgH/ + A4MB/wOBAf8DWwH/A0UB/wM/Af8QAAHRAbEBWQH/AdkBnQEOAf8B5QGlAQ8B/wHtAawBEAH/AesBqgEQ + Af8B6gGoAQ8B/wHqAagBDwH/AeMBpAENAf8B2QGcAQwB/wGzAYEBBwH/AYABSAEAAf8BQgE3AR8B/xAA + AYABqQGAAf8BKAGYASgB/wEjAagBIwH/ASABswEgAf8BIQGwASEB/wEhAa4BIQH/ASEBrgEhAf8BIgGm + ASIB/wEmAZkBJgH/ASYBZAEmAf8BFAE/ARQB/wEnATMBJwH/EAACyQGgAf8CywFpAf8C1AGBAf8C2gGD + Af8C2AGCAf8C1wGCAf8C1wGCAf8C1AGBAf8CzAFlAf8CtAFKAf8CmQESAf8CVQEgAf8QAAOBAf8DiQH/ + A5AB/wOQAf8DkAH/A5AB/wOKAf8DjAH/A4MB/wNVAf8DWAH/A0MB/xAAAdwBoAEPAf8B7AGqARAB/wH2 + AbMBFQH/AfYBswEVAf8B9gGzARUB/wH2AbMBFQH/Ae8BrQEQAf8B8gGwAREB/wHiAaQBDwH/AaQBZgEG + Af8BqwGAAQYB/wFoAUcBAAH/EAABJwGdAScB/wEgAbEBIAH/AR4BwAEeAf8BHgHAAR4B/wEeAcABHgH/ + AR4BwAEeAf8BHwG2AR8B/wEdAbsBHQH/ASQBpAEkAf8BIgFaASIB/wEjAV8BIwH/ARMBPgETAf8QAALN + AYEB/wLYAYIB/wLfAY0B/wLfAY0B/wLfAY0B/wLfAY0B/wLbAYMB/wLdAYcB/wLSAYEB/wKtAT4B/wKw + AUEB/wKYAQ4B/wwAA4kB/wOOAf8DkAH/A5AB/wOQAf8DjwH/A4sB/wNhAf8DQQH/Ax4B/wMAAf8DVwH/ + A1QB/wM9Af8IAAHrAawBEwH/AfIBsgEWAf8B+AG0ARMB/wH2AbMBFQH/AfYBswEVAf8B9QGyARUB/wHs + AawBFAH/Ab4BigEMAf8BXwFAAQAB/wEVAQsBAAH/AwAB/wGqAYABBgH/AaQBZQEEAf8BVAE6AQAB/wgA + ASMBsQEjAf8BIQG7ASEB/wEaAcQBGgH/AR4BwAEeAf8BHgHAAR4B/wEeAb8BHgH/ASQBsgEkAf8BLQGA + AS0B/wEUATgBFAH/AQABBwEAAf8DAAH/ASMBXgEjAf8BIAFaASAB/wERATABEQH/CAAC2AGHAf8C3AGP + Af8C4QGLAf8C3wGNAf8C3wGNAf8C3gGNAf8C2AGKAf8CtQFeAf8CjwEQAf8COAEAAf8DAAH/Aq4BQQH/ + Aq0BOgH/AogBCAH/CAADkQH/A5wB/wORAf8DkAH/A2YB/wNIAf8DJwH/AwAB/wMAAf8DAAH/AxcB/wOB + Af8DYgH/A0gB/wgAAfkBtgEUAv8BvwEiAf8B+AG3ARcB/wH2AbMBFQH/AcoBkwEOAf8BgQFMAQMB/wEj + ARUBAAH/AwAB/wMAAf8DAAH/AQsBAwEAAf8B4AGjAQ4B/wHEAY4BCQH/AYQBTgEBAf8IAAEbAcYBGwH/ + ASEB0QEhAf8BHwHDAR8B/wEeAcABHgH/AS0BhwEtAf8BGQFCARkB/wEAAREBAAH/AwAB/wMAAf8DAAH/ + AQABAQEAAf8BJQGhASUB/wEpAYEBKQH/ARcBRQEXAf8IAALiAY0B/wLlAaEB/wLfAZIB/wLfAY0B/wK/ + AWUB/wKYAR8B/wJJAQAB/wIIAQAB/wMAAf8DAAH/Ai8BAAH/AtEBgQH/ArsBWwH/Ap4BHAH/CAADmgH/ + A6YB/wOVAf8DkAH/A1IB/wM6Af8DCwH/AwAB/wMAAf8DAAH/A0MB/wONAf8DgQH/A04B/wgAAf8BvgEe + Av8BxQExAf8B+gG6ARsB/wH2AbMBFQH/AZkBXgEHAf8BTwE0AQAB/wMAAf8DAAH/AwAB/wMAAf8BZAFE + AQEB/wH0AbEBEgH/AdgBmwELAf8BlQFaAQIB/wgAAR4B0AEeAf8BKwHTASsB/wEhAcYBIQH/AR4BwAEe + Af8BIQFSASEB/wEPAS0BDwH/AwAB/wMAAf8DAAH/AwAB/wEWATsBFgH/ARwBvgEcAf8BJgGXASYB/wEc + AVABHAH/CAAC5QGcAf8C6AGtAf8C4QGYAf8C3wGNAf8CpAE4Af8ChQECAf8CIwEAAf8DAAH/AwAB/wMA + Af8CkgEVAf8C3gGIAf8CywFlAf8CpQEqAf8IAAOfAf8DqgH/A5UB/wOQAf8DjwH/A48B/wMwAf8DAAH/ + AwAB/wMAAf8DZQH/A4gB/wOCAf8DUAH/CAAB/wHBAScC/wHIATkB/wH5AbkBHAH/AfYBswEVAf8B9QGy + ARUB/wH0AbIBFQH/ATUBIgEAAf8DAAH/AwAB/wMAAf8BxwGRAQ4B/wHrAaoBEAH/AeIBowEOAf8BmgFe + AQMB/wgAASQB0gEkAf8BMAHVATAB/wEiAcUBIgH/AR4BwAEeAf8BHgG/AR4B/wEfAb4BHwH/AQYBHAEG + Af8DAAH/AwAB/wMAAf8BLQGEAS0B/wEhAbABIQH/ASQBowEkAf8BHQFUAR0B/wgAAuYBpAH/AusBtAH/ + AuEBmAH/At8BjQH/At4BjQH/At4BjQH/AlsBAAH/AwAB/wMAAf8CGAEAAf8CvQFkAf8C2AGCAf8C0QGB + Af8CqAEvAf8IAAOeAf8DsQH/A54B/wONAf8DigH/AzcB/wMAAf8DQwH/AwAB/wMwAf8DjgH/A5AB/wOB + Af8DUAH/CAAB/wHAASUC/wHMAUQC/wHBASQB/wHvAa8BFQH/AesBqwETAf8BRAEsAQAB/wMAAf8BYwFD + AQEB/wMAAf8BNQEiAQAB/wHzAbEBFQH/AfYBswEVAf8B3AGfAQ0B/wGZAV4BBAH/CAABIgHSASIB/wE4 + AdYBOAH/ASIB0AEiAf8BIwG2ASMB/wEkAbABJAH/AQsBJgELAf8DAAH/ARUBOgEVAf8DAAH/AQYBHAEG + Af8BIAG9ASAB/wEeAcABHgH/ASYBnAEmAf8BHgFTAR4B/wgAAuYBogH/Au0BvQH/AuUBogH/AtsBiwH/ + AtgBiAH/AmkBAAH/AjgBAAH/ApIBEwH/AhwBAAH/AlsBAAH/At0BjQH/At8BjQH/As0BaQH/AqcBMQH/ + CAADmQH/A7YB/wOtAf8DkQH/AzcB/wMAAf8DUAH/A5MB/wMuAf8DUgH/A5EB/wOQAf8DgQH/A1QB/wgA + Af8BvAEcAv8BzgFLAv8ByQE9Af8B8QG0AR4B/wFEASwBAAH/AwAB/wGUAVsBBgH/AfoBtgEWAf8BMQEf + AQAB/wGZAV4BBwH/AfkBtQEWAf8B9gGzARUB/wHZAZ0BDQH/AaEBZQEIAf8IAAEdAc8BHQH/AT0B1wE9 + Af8BMwHVATMB/wErAbYBKwH/AQsBJgELAf8DAAH/ASABTwEgAf8BGwHHARsB/wEFARoBBQH/ASEBUgEh + Af8BHAHGARwB/wEeAcABHgH/AScBmQEnAf8BJAFYASQB/wgAAuQBmQH/Au4BwgH/AuwBuAH/AtoBmAH/ + AmkBAAH/AwAB/wKhATQB/wLiAZAB/wJXAQAB/wKkATgB/wLhAZAB/wLfAY0B/wLMAWkB/wKoAT8B/wwA + A7gB/wO7Af8DYAH/AwAB/wNRAf8DkQH/A44B/wNgAf8DgwH/A5AB/wOQAf8DgQH/EAAB/wHOAUwC/wHQ + AVEB/wG1AYkBEwH/AwAB/wGYAV4BBwH/AfgBtAEVAf8B8wGxARUB/wG6AYcBDAH/Ad8BogESAf8B9gGz + ARUB/wH2AbMBFQH/Ad8BoQEOAf8QAAE+AdgBPgH/AUEB2AFBAf8BNAFiATQB/wMAAf8BIQFSASEB/wEd + AcQBHQH/ASABvQEgAf8BLAFnASwB/wEoAaABKAH/AR4BwAEeAf8BHgHAAR4B/wEmAZ8BJgH/EAAC7wHE + Af8C8AHIAf8CrgFlAf8CCAEAAf8CpAE4Af8C4QGPAf8C3QGNAf8CtAFbAf8C0AGCAf8C3wGNAf8C3wGN + Af8CzwGBAf8QAAPKAf8DwAH/A5UB/wOBAf8DngH/A5UB/wOUAf8DkAH/A5AB/wOQAf8DkAH/A6EB/xAA + Af8B3QGOAv8B0wFaAf8B7QG4ASgB/wHHAZgBGQH/Af4BwAElAf8B9wG5AR0B/wH3AbcBGwH/AfYBswEV + Af8B9gGzARUB/wH2AbMBFQH/AfYBswEVAf8B2QG0AVYB/xAAAYoB5gGKAf8BRwHaAUcB/wE6Aa4BOgH/ + ATcBhAE3Af8BJgHNASYB/wElAcEBJQH/ASMBwQEjAf8BHgHAAR4B/wEeAcABHgH/AR4BwAEeAf8BHgHA + AR4B/wFkAbMBZAH/EAAC8wHPAf8C8QHPAf8C1gGlAf8CvAGFAf8C5AGkAf8C3gGZAf8C3wGWAf8C3wGN + Af8C3wGNAf8C3wGNAf8C3wGNAf8C0AGhAf8UAAPPAf8DuwH/A7YB/wOuAf8DowH/A5cB/wORAf8DjQH/ + A4wB/wOlAf8YAAH/Ad8BlQL/AdABUgL/Ac0BSwL/AcsBQQL/AcMBLgH/Af0BuwEcAf8B9wG3ARgB/wHy + AbEBEwH/AfIBrwERAf8B4AG6AVgB/xgAAY8B5wGPAf8BQgHZAUIB/wE9AdgBPQH/ATYB1gE2Af8BKQHT + ASkB/wEfAcwBHwH/ASABwgEgAf8BHwG7AR8B/wEcAbsBHAH/AWQBvAFkAf8YAAL0AdUB/wLwAcgB/wLv + AcMB/wLtAbsB/wLoAaoB/wLjAZkB/wLfAZIB/wLdAYoB/wLdAYcB/wLWAaQB/yAAA6IB/wOmAf8DqgH/ + A6MB/wOZAf8DjAH/KAAB/wHDASwC/wHGATQC/wHJATsC/wHCAS4C/wG9ARwB/wHyAa8BEQH/KAABJwHT + AScB/wEtAdQBLQH/ATEB1QExAf8BKQHTASkB/wEdAc8BHQH/AR0BuwEdAf8oAALnAagB/wLqAbAB/wLr + AbUB/wLoAaoB/wLkAZkB/wLdAYcB//8A/wAqAAIXAT8B/wINATIB/wIJAS0B/wIIASsB/wIHASgB/wIH + AR0B/ygAAWcBAAFCAf8BUAEAATMB/wFGAQABLAH/AUQBAAEqAf8BPwEAAScB/wE1AQABIAH/KAABDgEw + AT0B/wEFASUBMgH/AQEBIAEtAf8BAQEfASsB/wEAARwBJwH/AQEBFQEcAf8oAAOFAf8DYgH/A1oB/wNY + Af8DVAH/A0sB/yAAAk8BhwH/AhoBVAH/AhkBVAH/AhkBUwH/AhgBUgH/AhcBTwH/AhUBSwH/AhABPgH/ + AggBLQH/AhsBKAH/GAABrAEqAYkB/wGPAQABUwH/AY8BAAFTAf8BjQEAAVIB/wGLAQABUAH/AYgBAAFO + Af8BggEAAUoB/wFgAQABPQH/AUYBAAErAf8BOAELASoB/xgAAUcBaAGGAf8BDwE/AVMB/wENAUABVAH/ + AQ0BPgFTAf8BDAE9AVEB/wELATwBTwH/AQoBOAFLAf8BBwEuAT4B/wEBASABLQH/ARcBIwEnAf8YAAO0 + Af8DlwH/A5cB/wOVAf8DkwH/A5IB/wONAf8DgQH/A1oB/wNJAf8UAAJOAZIB/wIZAYQB/wIUAZEB/wIR + AZsB/wISAZkB/wISAZgB/wISAZgB/wIUAZAB/wIYAYQB/wIZAVQB/wIMATQB/wIaAScB/xAAAbUBKwGQ + Af8BrQEAAWgB/wG2AQABgQH/AbwBAAGDAf8BuwEAAYMB/wG6AQABggH/AboBAAGCAf8BtAEAAYEB/wGs + AQABZwH/AY4BAAFSAf8BUQEAATMB/wE3AQsBKgH/EAABRAGBAZIB/wEJAVUBhQH/AQIBXgGUAf8BAAFk + AZ8B/wEAAWMBnQH/AQABYgGbAf8BAAFiAZsB/wECAV0BkwH/AQcBVQGGAf8BDQE/AVQB/wEEASYBMwH/ + ARcBIgEnAf8QAAO6Af8DrAH/A7IB/wO2Af8DtQH/A7QB/wO0Af8DsQH/A6sB/wOWAf8DYwH/A0kB/xAA + AhkBhwH/AhEBmgH/Ag4BqAH/Ag4BqAH/Ag4BqAH/Ag4BqAH/AhABngH/Ag4BowH/AhYBjwH/AhYBSwH/ + AhcBTwH/AgsBMgH/EAABsAEAAYAB/wG8AQABgwH/AcYBAAGKAf8BxgEAAYoB/wHGAQABigH/AcYBAAGK + Af8BvgEAAYUB/wHBAQABhwH/AbQBAAGBAf8BgwEAAUoB/wGIAQABTgH/AU8BAAEyAf8QAAEIAVgBiQH/ + AQABYwGeAf8BAAGBAa0B/wEAAYEBrQH/AQABgQGtAf8BAAGBAa0B/wEAAWYBowH/AQABaQGnAf8BBAFc + AZEB/wEMATkBSwH/AQwBOwFPAf8BAwElATIB/xAAA64B/wO2Af8DvQH/A70B/wO9Af8DvQH/A7cB/wO5 + Af8DsQH/A44B/wOSAf8DYQH/DAACFAGZAf8CEgGiAf8CCwGrAf8CDgGoAf8CDgGoAf8CDwGnAf8CFAGb + Af8CHwFZAf8CDAEtAf8CAAEEAf8DAAH/AhcBTgH/AhUBSwH/AgoBJwH/CAABvQEAAYQB/wHFAQABiQH/ + AcYBAAGKAf8BxgEAAYoB/wHGAQABigH/AcYBAAGKAf8BvwEAAYUB/wGZAQABWgH/AUoBAAEuAf8BDgEA + AQQB/wMAAf8BhwEAAU0B/wGCAQABSgH/AUIBAAEpAf8JAAFkAZ0B/wEAAYABpwH/AQABgQGxAf8BAAGB + Aa0B/wEAAYEBrQH/AQABgQGrAf8BAQFlAZ4B/wETAUQBWAH/AQUBIQEtAf8CAAEEAf8DAAH/AQwBOwFO + Af8BCgE4AUsB/wEDARwBJgH/CAADtgH/A7sB/wO9Af8DvQH/A70B/wO8Af8DuAH/A54B/wNdAf8DIgH/ + AwAB/wORAf8DjQH/A1YB/wgAAgsBrQH/Ag4BuQH/Ag8BqgH/Ag4BqAH/Ah8BYwH/AhABNgH/AgABDAH/ + AwAB/wMAAf8DAAH/AwAB/wIWAYwB/wIcAV4B/wIOATkB/wgAAcgBAAGMAf8B1wEAAZYB/wHJAQABjAH/ + AcYBAAGKAf8BowEAAWEB/wFXAQABOAH/ARkBAAEMAf8DAAH/AwAB/wMAAf8BBQIAAf8BswEAAYEB/wGb + AQABWwH/AVgBAAE4Af8JAAGBAbMB/wEAAYoBvwH/AQABgQGvAf8BAAGBAa0B/wERAUsBYwH/AQgBKQE2 + Af8BAAEGAQwB/wMAAf8DAAH/AwAB/wMAAf8BBQFbAY4B/wEPAUcBXgH/AQYBKgE5Af8IAAO+Af8DxwH/ + A74B/wO9Af8DpAH/A2gB/wMwAf8DAAH/AwAB/wMAAf8DGAH/A68B/wOfAf8DaQH/CAACDQG3Af8CDwHC + Af8CEQGtAf8CDgGoAf8CFgFEAf8CCAEkAf8DAAH/AwAB/wMAAf8DAAH/Ag0BMAH/Ag0BpgH/AhgBgwH/ + AhEBQwH/CAAB1AEAAZQB/wHhAQABnQH/Ac4BAAGPAf8BxgEAAYoB/wGBAQABRQH/AT0BAAElAf8DAAH/ + AwAB/wMAAf8DAAH/AU4BAAExAf8BwwEAAYgB/wGrAQABZgH/AWUBAAFBAf8JAAGIAb0B/wEAAZAByAH/ + AQABggGyAf8BAAGBAa0B/wEMATMBQwH/AQIBGgEkAf8DAAH/AwAB/wMAAf8DAAH/AQYBIwEvAf8BAAGB + AasB/wEIAVQBhAH/AQcBMgFDAf8IAAPFAf8DzgH/A8EB/wO9Af8DiQH/A1EB/wMKAf8DAAH/AwAB/wMA + Af8DYQH/A7oB/wOqAf8DhAH/CAACDgG8Af8CEAHHAf8CEgGsAf8CDgGoAf8CDwGnAf8CEAGlAf8CAQEW + Af8DAAH/AwAB/wMAAf8CHwFhAf8CEgGZAf8CFQGNAf8CEgFGAf8IAAHaAQABmAH/AecBAAGhAf8BzgEA + AY8B/wHGAQABigH/AcYBAAGKAf8BxQEAAYoB/wEnAQABFgH/AwAB/wMAAf8DAAH/AaEBAAFfAf8BuwEA + AYMB/wGzAQABgQH/AWkBAAFEAf8JAAGMAcIB/wEAAZQBzQH/AQABgQGxAf8BAAGBAa0B/wEAAYEBqwH/ + AQABgQGqAf8BAAEOARUB/wMAAf8DAAH/AwAB/wERAUkBYAH/AQABYwGdAf8BAwFcAZAB/wEIATQBRgH/ + CAADyQH/A9EB/wPBAf8DvQH/A7wB/wO8Af8DPwH/AwAB/wMAAf8DAAH/A6MB/wO1Af8DsAH/A4cB/wgA + Ag4BuwH/AhEBzgH/Ag8BuQH/AhMBngH/AhUBmQH/AgUBHgH/AwAB/wINAS8B/wMAAf8CAQEWAf8CEAGk + Af8CDgGoAf8CGAGHAf8CEwFEAf8IAAHZAQABlwH/Ae4BAAGmAf8B1wEAAZYB/wHCAQABhwH/Ab4BAAGF + Af8BMwEAAR4B/wMAAf8BTQEAATAB/wMAAf8BJwEAARYB/wHFAQABiQH/AcYBAAGKAf8BrwEAAWkB/wFp + AQABRAH/CQABiwHBAf8BAAGZAdQB/wEAAYkBvgH/AQABZwGiAf8BAQFkAZ0B/wEAARUBHgH/AwAB/wEF + ASMBLwH/AwAB/wEAAQ4BFQH/AQABgAGpAf8BAAGBAa0B/wEHAVcBiQH/AQkBMwFEAf8IAAPIAf8D1gH/ + A8gB/wO6Af8DtwH/A0oB/wMAAf8DYAH/AwAB/wM/Af8DuwH/A70B/wOtAf8DhwH/CAACDQG1Af8CEgHR + Af8CEAHJAf8CGwGeAf8CBQEeAf8DAAH/AhUBQQH/AgwBrgH/AgABEwH/AhYBRAH/AgwBrQH/Ag4BqAH/ + AhkBhAH/AhgBSQH/CAAB0gEAAZIB/wHzAQABqgH/AeoBAAGjAf8ByQEAAYwB/wEzAQABHgH/AwAB/wFn + AQABQwH/AcoBAAGNAf8BJAEAARQB/wGBAQABRQH/AckBAAGMAf8BxgEAAYoB/wGtAQABaAH/AYIBAAFK + Af8JAAGHAbsB/wEAAZwB2QH/AQABlgHQAf8BBwFoAaEB/wEAARUBHgH/AwAB/wEMATEBQQH/AQABggG0 + Af8BAAEMARMB/wEMATMBQwH/AQABgQGzAf8BAAGBAa0B/wEIAVYBhgH/AQ4BNwFIAf8IAAPEAf8D2QH/ + A9MB/wO+Af8DSgH/AwAB/wOGAf8DvwH/AzsB/wOJAf8DvgH/A70B/wOsAf8DjQH/DAACEgHTAf8CEgHW + Af8CJgFRAf8DAAH/AhYBQwH/Ag0BqwH/AhABpAH/Ah8BVgH/AhkBiwH/Ag4BqAH/Ag4BqAH/AhcBigH/ + EAAB9AEAAaoB/wH4AQABrQH/AZgBAAFZAf8DAAH/AYABAAFFAf8ByAEAAYwB/wHFAQABiQH/AZYBAAFY + Af8BtAEAAYEB/wHGAQABigH/AcYBAAGKAf8BsQEAAYEB/xEAAZ0B2QH/AQABnwHdAf8BGwFAAU4B/wMA + Af8BDAEzAUMB/wEAAYEBsQH/AQABgAGpAf8BEwFCAVUB/wEIAVoBjAH/AQABgQGtAf8BAAGBAa0B/wEG + AVkBjAH/EAAD2gH/A9wB/wOdAf8DAAH/A4gB/wO+Af8DuwH/A5wB/wOxAf8DvQH/A70B/wOuAf8QAAJO + AdQB/wIUAdoB/wIoAZYB/wIoAWAB/wISAbYB/wIVAagB/wITAagB/wIOAagB/wIOAagB/wIOAagB/wIO + AagB/wJHAZ4B/xAAAesBNwG5Af8B/gEAAbEB/wHOAQABkAH/AakBAAFlAf8B1wEAAZYB/wHNAQABjwH/ + AcsBAAGOAf8BxgEAAYoB/wHGAQABigH/AcYBAAGKAf8BxgEAAYoB/wG8ASkBlQH/EAABOwGwAdkB/wEA + AaMB4gH/ARYBZQGWAf8BGwFLAV8B/wEAAYgBuwH/AQABgQGsAf8BAAGBAa0B/wEAAYEBrQH/AQABgQGt + Af8BAAGBAa0B/wEAAYEBrQH/ATsBhwGfAf8QAAPiAf8D3wH/A8EB/wOpAf8DyAH/A8EB/wPAAf8DvQH/ + A70B/wO9Af8DvQH/A70B/xQAAk8B2QH/AhIB1gH/AhIB0gH/AhEBzAH/Ag8BvwH/Ag8BsgH/AhABqQH/ + AhABowH/Ag0BowH/AkYBpwH/GAAB8QE3Ab4B/wH5AQABrQH/AfQBAAGqAf8B7QEAAaUB/wHfAQABmwH/ + AdEBAAGSAf8ByQEAAYwB/wHDAQABiAH/AcEBAAGHAf8BwgErAZkB/xgAATwBtAHeAf8BAAGfAd0B/wEA + AZwB2QH/AQABmAHTAf8BAAGPAcYB/wEAAYUBuAH/AQABgQGvAf8BAAFpAacB/wEAAWkBqAH/ATgBjQGp + Af8YAAPmAf8D3AH/A9kB/wPUAf8DzAH/A8MB/wO+Af8DugH/A7kB/wPBAf8gAAIOAb8B/wIPAcMB/wIQ + AcgB/wIPAb8B/wINAbUB/wIOAaMB/ygAAd0BAAGaAf8B4wEAAZ4B/wHoAQABogH/Ad8BAAGbAf8B0gEA + AZIB/wHBAQABhwH/KQABjgHFAf8BAAGRAcoB/wEAAZUBzgH/AQABjwHGAf8BAAGHAbsB/wEAAWkBpwH/ + KAADywH/A84B/wPRAf8DzAH/A8QB/wO5Af//AP8AKgADLAH/AyUB/wMjAf8DIgH/AyEB/wMfAf8oAAFb + ATUBKAH/AUoBJQEZAf8BQgEfARQB/wFAAR4BEwH/ATsBHAERAf8BLQEYARAB/ygAARIBLgESAf8BCQEk + AQkB/wEFASABBQH/AQUBHgEFAf8BBAEbAQQB/wEDARQBAwH/KAABPAE+ARcB/wEwATIBDAH/ASoBLQEI + Af8BKQErAQcB/wEmASgBBgH/ARwBHQEGAf8gAAOCAf8DNgH/AzYB/wM1Af8DNAH/AzMB/wMwAf8DKgH/ + AyMB/wMyAf8YAAGiAYEBXgH/AYcBPwEtAf8BiAE/ASwB/wGGAT4BKwH/AYQBPAEqAf8BggE6ASgB/wGB + ATcBJQH/AVoBLQEfAf8BQgEfARMB/wEyASYBIQH/GAABSgFmAUoB/wEVAT8BFQH/ARQBPwEUAf8BFAE+ + ARQB/wETAT0BEwH/ARIBPAESAf8BEAE4ARAB/wEMAS4BDAH/AQUBIAEFAf8BGQEiARkB/xgAAYUBhwFO + Af8BUAFUARkB/wFRAVQBGAH/AVABUwEYAf8BTgFSARcB/wFMAVABFgH/AUgBTAEUAf8BPAE/AQ8B/wEq + AS0BCAH/AScBKAEbAf8UAAOIAf8DSAH/A04B/wNTAf8DUgH/A1AB/wNQAf8DTQH/A0cB/wM2Af8DJgH/ + AzIB/xAAAbABgQFdAf8BsAFKAS0B/wHCAUoBJwH/Ac0BSwElAf8BygFLASYB/wHJAUoBJQH/AckBSgEl + Af8BwQFJASYB/wGxAUgBKwH/AYcBPgEsAf8BTAElARgB/wExASQBIAH/EAABSgGBAUoB/wEWAVcBFgH/ + ARIBYgESAf8BEAFpARAB/wERAWcBEQH/AREBZgERAf8BEQFmAREB/wESAWABEgH/ARQBVwEUAf8BFAE/ + ARQB/wEIASUBCAH/ARgBIgEYAf8QAAGPAZIBTQH/AYEBhAEYAf8BiwGSARMB/wGUAZwBDwH/AZIBmQEQ + Af8BkQGYAREB/wGRAZgBEQH/AYoBkAESAf8BgQGEARYB/wFQAVQBGAH/ATIBNAELAf8CJwEaAf8QAANK + Af8DUwH/A1wB/wNcAf8DXAH/A1wB/wNUAf8DVgH/A00B/wMxAf8DMwH/AyUB/xAAAbUBSgEsAf8BywFL + ASYB/wHUAVIBLAH/AdQBUgEsAf8B1AFSASwB/wHUAVIBLAH/Ac8BTAEmAf8B0gFNAScB/wG+AUoBKQH/ + AYEBOAEnAf8BgQE6ASgB/wFKASQBFwH/EAABFQFaARUB/wEQAWgBEAH/AQ8BgwEPAf8BDwGDAQ8B/wEP + AYMBDwH/AQ8BgwEPAf8BDwGBAQ8B/wEOAYEBDgH/ARMBXwETAf8BEgE4ARIB/wESATsBEgH/AQgBJQEI + Af8QAAGCAYgBFwH/AZMBmwEQAf8BoAGoAQ0B/wGgAagBDQH/AaABqAENAf8BoAGoAQ0B/wGXAZ8BDgH/ + AZsBowENAf8BiAGOARQB/wFIAUsBFQH/AUwBTwEWAf8BMAEzAQoB/wwAA1MB/wNZAf8DXAH/A1wB/wNc + Af8DWgH/A1UB/wM7Af8DJAH/AxMB/wMAAf8DMwH/AzAB/wMiAf8IAAHJAU4BKgH/Ac8BUgEuAf8B1wFQ + ASkB/wHUAVIBLAH/AdQBUgEsAf8B0wFSASwB/wHKAVABLAH/AY4BRgE0Af8BQwEjARgB/wELAgAB/wMA + Af8BgQE6ASkB/wGBATcBJQH/AToBHgEVAf8IAAESAWgBEgH/AREBgQERAf8BDAGFAQwB/wEPAYMBDwH/ + AQ8BgwEPAf8BDwGCAQ8B/wETAWkBEwH/ARkBQwEZAf8BCAEgAQgB/wMAAf8DAAH/ARIBOwESAf8BEAE4 + ARAB/wEGARsBBgH/CAABkwGaARIB/wGbAaMBEAH/AaMBqwEJAf8BoAGoAQ0B/wGgAagBDQH/AZ8BpwEN + Af8BlAGbARMB/wFVAVkBHgH/ASsBLQELAf8BAwEEAQAB/wMAAf8BSwFOARcB/wFIAUwBFAH/ASUBJwEJ + Af8IAANdAf8DgAH/A10B/wNcAf8DQAH/AycB/wMYAf8DAAH/AwAB/wMAAf8DDgH/A0sB/wM8Af8DKAH/ + CAAB2AFSASsB/wHbAV8BOwH/AdQBVQEvAf8B1AFSASwB/wGcAUkBMwH/AU8BKgEeAf8BFgEHAQIB/wMA + Af8DAAH/AwAB/wEEAgAB/wG7AUoBKgH/AZUBRQEvAf8BUwEqARwB/wgAAQ0BhwENAf8BDwGQAQ8B/wEP + AYUBDwH/AQ8BgwEPAf8BGQFLARkB/wEMASgBDAH/AQABBgEAAf8DAAH/AwAB/wMAAf8DAAH/ARQBXQEU + Af8BFwFHARcB/wEKASoBCgH/CAABpAGtAQoB/wGwAboBDAH/AaIBqgENAf8BoAGoAQ0B/wFfAWMBHQH/ + ATQBNgEPAf8BCwEMAQAB/wMAAf8DAAH/AwAB/wMAAf8BhgGMARUB/wFaAV4BGwH/ATYBOQEOAf8IAANn + Af8DhwH/A2EB/wNcAf8DLgH/AyAB/wMGAf8DAAH/AwAB/wMAAf8DJQH/A1gB/wNGAf8DLAH/CAAB2gFc + ATcB/wHdAWgBRwH/AdUBWQE1Af8B1AFSASwB/wFiATYBJwH/ATYBGwESAf8DAAH/AwAB/wMAAf8DAAH/ + AUYBJQEaAf8B1AFOAScB/wGvAUgBKwH/AWABMAEgAf8IAAEOAY4BDgH/ARABlwEQAf8BEQGHAREB/wEP + AYMBDwH/AREBMgERAf8BBAEZAQQB/wMAAf8DAAH/AwAB/wMAAf8BCQEjAQkB/wEOAYEBDgH/ARQBVgEU + Af8BDQExAQ0B/wgAAa4BtwELAf8BuQHCAQ0B/wGlAa0BDwH/AaABqAENAf8BQQFEARUB/wEiASQBBwH/ + AwAB/wMAAf8DAAH/AwAB/wEuATABDQH/AZ4BpgELAf8BgQGDARYB/wFAAUMBEQH/CAADgQH/A4wB/wNh + Af8DXAH/A1oB/wNaAf8DHAH/AwAB/wMAAf8DAAH/Az8B/wNSAf8DTAH/Ay0B/wgAAdwBYgE+Af8B3wGB + AU0B/wHUAVkBNgH/AdQBUgEsAf8B0wFSASwB/wHSAVIBLQH/ASMBDwEIAf8DAAH/AwAB/wMAAf8BmQFJ + ATMB/wHKAUsBJgH/Ab0BSQEoAf8BZAEyASIB/wgAAQ8BkgEPAf8BEQGbAREB/wERAYYBEQH/AQ8BgwEP + Af8BDwGCAQ8B/wEQAYEBEAH/AQABDQEAAf8DAAH/AwAB/wMAAf8BGQFJARkB/wERAWcBEQH/ARMBXgET + Af8BDgE0AQ4B/wgAAbMBvAEMAf8BvQHHAQ4B/wGkAawBEAH/AaABqAENAf8BnwGnAQ0B/wGeAaYBDgH/ + ARQBFQEAAf8DAAH/AwAB/wMAAf8BXQFhAR4B/wGSAZkBEAH/AYgBjgEUAf8BQwFGARIB/wgAA4EB/wOW + Af8DgQH/A1gB/wNUAf8DHwH/AwAB/wMlAf8DAAH/AxwB/wNZAf8DXAH/A0kB/wMtAf8IAAHcAWEBPQH/ + AeEBhgFWAf8B2gFgATwB/wHMAVEBLgH/AckBTwEsAf8BLgEWAQ4B/wMAAf8BRgEkARkB/wMAAf8BIwEP + AQgB/wHRAVIBLQH/AdQBUgEsAf8BtQFJASsB/wFiATMBIwH/CAABDwGSAQ8B/wESAaABEgH/ARABkAEQ + Af8BEgGBARIB/wETAWcBEwH/AQIBFAECAf8DAAH/AQkBIgEJAf8DAAH/AQABDQEAAf8BEAGBARAB/wEP + AYMBDwH/ARQBWgEUAf8BDwEzAQ8B/wgAAbIBuwEMAf8BxAHOAQ8B/wGwAbkBDQH/AZcBngESAf8BkwGa + ARMB/wEcAR4BBAH/AwAB/wEtAS8BDAH/AwAB/wEUARUBAAH/AZ0BpAEPAf8BoAGoAQ0B/wGCAYcBFgH/ + AUIBRQESAf8IAANmAf8DmwH/A5AB/wNdAf8DHwH/AwAB/wMtAf8DXgH/AxsB/wMuAf8DXQH/A1wB/wNI + Af8DMAH/CAAB2gFaATUB/wHiAYoBXAH/Ad8BgQFRAf8ByAFaATsB/wEuARYBDgH/AwAB/wFeATQBJQH/ + AdgBVAEtAf8BIAENAQcB/wFiATYBJwH/AdcBUwEtAf8B1AFSASwB/wGxAUkBLAH/AWgBOQEqAf8IAAEO + AY0BDgH/ARMBpAETAf8BEgGdARIB/wEYAYEBGAH/AQIBFAECAf8DAAH/ARABMAEQAf8BDQGIAQ0B/wEA + AQwBAAH/AREBMgERAf8BDQGHAQ0B/wEPAYMBDwH/ARUBVwEVAf8BEwE2ARMB/wgAAawBtQELAf8ByAHS + AQ8B/wHAAcoBDgH/AZgBngEZAf8BHAEeAQQB/wMAAf8BPwFBARQB/wGmAa8BCgH/ARIBEwEAAf8BQQFE + ARUB/wGlAa0BCwH/AaABqAENAf8BgQGEARcB/wFGAUgBGAH/DAADngH/A6IB/wM7Af8DAAH/Ay4B/wNd + Af8DWQH/AzoB/wNNAf8DXAH/A1wB/wNKAf8QAAHiAYsBXQH/AeMBjwFhAf8BhAFKATwB/wMAAf8BYQE1 + AScB/wHWAVMBLQH/AdEBUgEtAf8BiwFFATMB/wG6AUwBLgH/AdQBUgEsAf8B1AFSASwB/wG5AUoBKwH/ + EAABEwGkARMB/wEUAacBFAH/AR4BPQEeAf8DAAH/AREBMgERAf8BDgGFAQ4B/wEQAYEBEAH/ARkBQQEZ + Af8BFgFcARYB/wEPAYMBDwH/AQ8BgwEPAf8BFAFcARQB/xAAAcgB0wEQAf8BzAHWARAB/wFOAVABJQH/ + AwAB/wFBAUMBFQH/AaMBqwELAf8BnQGkAQ8B/wFTAVYBHgH/AYUBiwEYAf8BoAGoAQ0B/wGgAagBDQH/ + AYQBigEWAf8QAAO3Af8DqAH/A2EB/wNFAf8DgQH/A2EB/wNgAf8DXAH/A1wB/wNcAf8DXAH/A4sB/xAA + AegBoAGHAf8B5AGUAWgB/wG9AWUBTQH/AZgBUQE/Af8B1wFhAT8B/wHQAVsBOQH/AdEBWAE1Af8B1AFS + ASwB/wHUAVIBLAH/AdQBUgEsAf8B1AFSASwB/wHAAYEBVgH/EAABTwG1AU8B/wEVAasBFQH/ASIBZgEi + Af8BIAFJASAB/wESAY4BEgH/ARQBgwEUAf8BEgGEARIB/wEPAYMBDwH/AQ8BgwEPAf8BDwGDAQ8B/wEP + AYMBDwH/AUUBiAFFAf8QAAHNAdQBTAH/AdEB3AERAf8BkAGWAScB/wFcAWABJwH/Aa0BtgEQAf8BoQGo + ARMB/wGhAakBEQH/AaABqAENAf8BoAGoAQ0B/wGgAagBDQH/AaABqAENAf8BmgGeAUYB/xQAA74B/wOi + Af8DmwH/A5IB/wODAf8DZAH/A10B/wNYAf8DVgH/A48B/xgAAekBpQGPAf8B4wGPAWIB/wHiAYsBXAH/ + AeABhAFUAf8B3QFmAUQB/wHYAVoBNgH/AdQBVQEwAf8B0AFQASsB/wHTAU0BJgH/AcoBgQFUAf8YAAFQ + AboBUAH/ARQBpwEUAf8BEwGkARMB/wESAZ8BEgH/ARABlgEQAf8BDwGLAQ8B/wEQAYQBEAH/ARABgQEQ + Af8BDgGBAQ4B/wFFAZABRQH/GAAB0wHaAU0B/wHMAdcBEAH/AcgB0gEQAf8BwgHMAQ8B/wG3AcABDQH/ + AaoBswENAf8BoQGqAQ4B/wGbAaMBDgH/AZwBpAEMAf8BogGnAUUB/yAAA4IB/wOHAf8DjAH/A4MB/wNm + Af8DVgH/KAAB3QFlAUMB/wHeAYABSQH/Ad8BgQFPAf8B3QFmAUQB/wHaAVoBNQH/AdIBTQEnAf8oAAEQ + AZUBEAH/AREBmQERAf8BEQGcAREB/wEQAZYBEAH/AQ4BjQEOAf8BDgGBAQ4B/ygAAbYBvwEMAf8BugHE + AQ0B/wG+AcgBDgH/AbcBwAENAf8BrAG1AQsB/wGbAaMBDQH//wAVAAFCAU0BPgcAAT4DAAEoAwABQAMA + AWADAAEBAQABAQYAAQMWAAP/gQAI/wH4AR8B+AEfAfgBHwH4AR8B4AEHAeABBwHgAQcB4AEHAcABAwHA + AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHgAQcB4AEHAeABBwHgAQcB+AEfAfgBHwH4 + AR8B+AEfEP8B+AEfAfgBHwH4AR8B+AEfAeABBwHgAQcB4AEHAeABBwHAAQMBwAEDAcABAwHAAQMBwAED + AcABAwHAAQMBwAEDAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGgAQEBgAEBAYABAQGAAQEBsAEBAcABAwHAAQMBwAED + AfABAwHAAQMBwAEDAcABAwHQAQMB4AEHAeABBwHgAQcB/gEHAfgBHwH4AR8B+AEfAfgBHxD/AfgBHwH4 + AR8B+AEfAfgBHwHgAQcB4AEHAeABBwHgAQcBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA + AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA + AQMBwAEDAeABBwHgAQcB4AEHAeABBwH4AR8B+AEfAfgBHwH4AR8Q/wH4AR8B+AEfAfgBHwH4AR8B4AEH + AeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBgAEBAYABAQGAAQEBgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB + AYABAQGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHgAQcB4AEH + AeABBwHgAQcB+AEfAfgBHwH4AR8B+AEfEP8B+AEfAfgBHwH4AR8B+AEfAeABBwHgAQcB4AEHAeABBwHA AQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA AQEBgAEBAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMB4AEHAeABBwHgAQcB4AEHAfgBHwH4 - AR8B+AEfAfgBHxD/AfgBHwH4AR8B+AEfAfgBHwHgAQcB4AEHAeABBwHgAQcBwAEDAcABAwHAAQMBwAED - AcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB - AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBoAEBAYABAQGAAQEBgAEBAbABAQHAAQMBwAED - AcABAwHwAQMBwAEDAcABAwHAAQMB0AEDAeABBwHgAQcB4AEHAf4BBwH4AR8B+AEfAfgBHwH4AR8Q/wH4 - AR8B+AEfAfgBHwH4AR8B4AEHAeABBwHgAQcB4AEHAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHA - AQMBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA - AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBwAEDAcABAwHAAQMBwAEDAcABAwHA - AQMBwAEDAcABAwHgAQcB4AEHAeABBwHgAQcB+AEfAfgBHwH4AR8B+AEfEP8B+AEfAfgBHwH4AR8B+AEf - AeABBwHgAQcB4AEHAeABBwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAYABAQGAAQEBgAEB - AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEB - AYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMB4AEH - AeABBwHgAQcB4AEHAfgBHwH4AR8B+AEfAfgBHxD/AfgBHwH4AR8B+AEfAfgBHwHgAQcB4AEHAeABBwHg - AQcBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA - AQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGAAQEBgAEBAYABAQGA - AQEBgAEBAYABAQHAAQMBwAEDAcABAwHAAQMBwAEDAcABAwHAAQMBwAEDAeABBwHgAQcB4AEHAeABBwH4 - AR8B+AEfAfgBHwH4AR8I/ws= - - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkEAQAAAJsBU3lz - dGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UcmVlTm9k - ZSwgU3lzdGVtLldpbmRvd3MuRm9ybXMsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQ - dWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQA - AB9TeXN0ZW0uV2luZG93cy5Gb3Jtcy5UcmVlTm9kZVtdAgAAAAgICQMAAAAAAAAAAQAAAAcDAAAAAAEA - AAAAAAAABB1TeXN0ZW0uV2luZG93cy5Gb3Jtcy5UcmVlTm9kZQIAAAAL + AR8B+AEfAfgBHwj/Cw== \ No newline at end of file diff --git a/Source/Core/GZBuilder/Controls/MultiSelectTreeview.cs b/Source/Core/GZBuilder/Controls/MultiSelectTreeview.cs index b6b5a680..e2c3be4b 100644 --- a/Source/Core/GZBuilder/Controls/MultiSelectTreeview.cs +++ b/Source/Core/GZBuilder/Controls/MultiSelectTreeview.cs @@ -1,7 +1,74 @@ -#region Namespaces +#region ================== Copyright + +// ***************************************************************************** +// +// Copyright 2004, Coder's Lab +// All rights reserved. The software and associated documentation +// supplied hereunder are the proprietary information of Coder's Lab +// and are supplied subject to licence terms. +// +// +// You can use this control freely in your projects, but let me know if you +// are using it so I can add you to a list of references. +// +// Email: ludwig.stuyck@coders-lab.be +// Home page: http://www.coders-lab.be +// +// History +// 18/07/2004 +// - Control creation +// 24/07/2004 +// - Implemented rubberband selection; also combination keys work: +// ctrl, shift, ctrl+shift +// 25/08/2004 +// - Rubberband selection temporary removed due to scrolling problems. +// - Renamed TreeViewSelectionMode property to SelectionMode. +// - Renamed SelectionModes enumeration to TreeViewSelectionMode. +// - Added MultiSelectSameParent selection mode. +// - Added keyboard functionality. +// - Enhanced selection drawing. +// - Added SelectionBackColor property. +// 02/09/2004 +// - When shift/ctrl was pressed, treeview scrolled to last selected +// node. Fixed. +// - Moved TreeViewSelectionMode outside the TreeView class. +// - BeforeSelect was fired multiple times, AfterSelect was never +// fired. Fixed. +// - Collapsing/Expanding node changed selection. This does not happen +// anymore, except if a node that has selected descendants is +// collapsed; then all descendants are unselected and the collapsed +// node becomes selected. +// - If in the BeforeSelect event, e.Cancel is set to true, then node +// will not be selected +// - SHIFT selection sometimes didn’t behave correctly. Fixed. +// 04/09/2004 +// - SelectedNodes is no longer an array of tree nodes, but a +// SelectedNodesCollection +// - In the AfterSelect event, the SelectedNodes contained two tree +// nodes; the old one and the new one. Fixed. +// 05/09/2004 +// - Added Home, End, PgUp and PgDwn keys functionality +// 08/10/2004 +// - SelectedNodeCollection renamed to NodeCollection +// - Fixes by GKM +// +// 18/8/2005 +// - Added events BeforeDeselect and AfterDeselect +// 09/5/2007 +// - Added an InvokeRequired check to Flashnode() +// 16/5/2007 +// - Gave the document a consistant format +// - Created a new event 'SelectionsChanged' +// +// ***************************************************************************** + +#endregion + +#region ================== Namespaces using System; -using System.Collections.Generic; +using System.Collections; +using System.ComponentModel; using System.Drawing; using System.Windows.Forms; @@ -9,419 +76,1640 @@ using System.Windows.Forms; namespace CodeImp.DoomBuilder.GZBuilder.Controls { + #region TreeViewSelectionMode enumeration + + /// + /// Selection mode for the treeview. + /// + /// + /// The Selection mode determines how treeview nodes can be selected. + /// + public enum TreeViewSelectionMode + { + /// + /// Only one node can be selected at a time. + /// + SingleSelect, + /// + /// Multiple nodes can be selected at the same time without restriction. + /// + MultiSelect, + /// + /// Multiple nodes that belong to the same root branch can be selected at the same time. + /// + MultiSelectSameRootBranch, + /// + /// Multiple nodes that belong to the same level can be selected at the same time. + /// + MultiSelectSameLevel, + /// + /// Multiple nodes that belong to the same level and same root branch can be selected at the same time. + /// + MultiSelectSameLevelAndRootBranch, + /// + /// Only nodes that belong to the same direct parent can be selected at the same time. + /// + MultiSelectSameParent + } + + #endregion + + #region Delegates + + /// + /// Delegate used for tree node events. + /// + public delegate void TreeNodeEventHandler(TreeNode tn); + + #endregion + + /// + /// The TreeView control is a regular treeview with multi-selection capability. + /// + [ToolboxItem(true)] public class MultiSelectTreeview : TreeView { - #region Selected Node(s) Properties + public event TreeViewEventHandler AfterDeselect; + public event TreeViewEventHandler BeforeDeselect; + public event EventHandler SelectionsChanged; - private List m_SelectedNodes; - public List SelectedNodes { - get { - return m_SelectedNodes; + protected void OnAfterDeselect(TreeNode tn) + { + if (AfterDeselect != null) + { + AfterDeselect(this, new TreeViewEventArgs(tn)); } - set { - ClearSelectedNodes(); - if(value != null) { - foreach(TreeNode node in value) { - ToggleNode(node, true); - } + } + + protected void OnBeforeDeselect(TreeNode tn) + { + if (BeforeDeselect != null) + { + BeforeDeselect(this, new TreeViewEventArgs(tn)); + } + } + + protected void OnSelectionsChanged() + { + if (blnSelectionChanged) + if (SelectionsChanged != null) + { + SelectionsChanged(this, new EventArgs()); + } + } + + #region Private variables + + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + /// + /// Used to make sure that SelectedNode can only be used from within this class. + /// + private bool blnInternalCall = false; + + /// + /// Hashtable that contains all selected nodes. + /// + private Hashtable htblSelectedNodes = new Hashtable(); + + /// + /// Track whether the total SelectedNodes changed across multiple operations + /// for SelectionsChanged event + /// + private bool blnSelectionChanged = false; + + /// + /// Hashtable to preserve Node's original colors (colors can be set on the TreeView, or individual nodes) + /// (GKM) + /// + private Hashtable htblSelectedNodesOrigColors = new Hashtable(); + + /// + /// Keeps track of node that has to be pu in edit mode. + /// + private TreeNode tnNodeToStartEditOn = null; + + /// + /// Remembers whether mouse click on a node was single or double click. + /// + private bool blnWasDoubleClick = false; + + /// + /// Keeps track of most recent selected node. + /// + private TreeNode tnMostRecentSelectedNode = null; + + /// + /// Keeps track of the selection mirror point; this is the last selected node without SHIFT key pressed. + /// It is used as the mirror node during SHIFT selection. + /// + private TreeNode tnSelectionMirrorPoint = null; + + /// + /// Keeps track of the number of mouse clicks. + /// + private int intMouseClicks = 0; + + /// + /// Selection mode. + /// + private TreeViewSelectionMode selectionMode = TreeViewSelectionMode.SingleSelect; + + /// + /// Backcolor for selected nodes. + /// + private Color selectionBackColor = System.Drawing.SystemColors.Highlight; + + /// + /// Keeps track whether a node click has been handled by the mouse down event. This is almost always the + /// case, except when a selected node has been clicked again. Then, it will not be handled in the mouse + /// down event because we might want to drag the node and if that's the case, node should not go in edit + /// mode. + /// + private bool blnNodeProcessedOnMouseDown = false; + + /// + /// Holds node that needs to be flashed. + /// + private TreeNode tnToFlash = null; + + /// + /// Keeps track of the first selected node when selection has begun with the keyboard. + /// + private TreeNode tnKeysStartNode = null; + + #endregion + + #region SelectedNode, SelectionMode, SelectionBackColor, SelectedNodes + events + + /// + /// This property is for internal use only. Use SelectedNodes instead. + /// + public new TreeNode SelectedNode + { + get + { + if (!blnInternalCall) + { + throw new NotSupportedException("Use SelectedNodes instead of SelectedNode."); + } + else + { + return base.SelectedNode; + } + } + set + { + if (!blnInternalCall) + { + throw new NotSupportedException("Use SelectedNodes instead of SelectedNode."); + } + else + { + base.SelectedNode = value; } } } - // Note we use the new keyword to Hide the native treeview's SelectedNode property. - private TreeNode m_SelectedNode; - public new TreeNode SelectedNode { - get { return m_SelectedNode; } - set { - ClearSelectedNodes(); - if(value != null) SelectNode(value); + /// + /// Gets/sets selection mode. + /// + public TreeViewSelectionMode SelectionMode + { + get + { + return selectionMode; + } + set + { + selectionMode = value; } } - //mxd - private bool useMultiSelection; - public bool UseMultiSelection { get { return useMultiSelection; } set { useMultiSelection = value; } } + /// + /// Gets/sets backcolor for selected nodes. + /// + public Color SelectionBackColor + { + get + { + return selectionBackColor; + } + set + { + selectionBackColor = value; + } + } - #endregion + /// + /// Gets selected nodes. + /// + public NodesCollection SelectedNodes + { + get + { + // Create a SelectedNodesCollection to return, and add event handlers to catch actions on it + NodesCollection selectedNodesCollection = new NodesCollection(); + foreach (TreeNode tn in htblSelectedNodes.Values) + { + selectedNodesCollection.Add(tn); + } - #region Constructor + selectedNodesCollection.TreeNodeAdded += new TreeNodeEventHandler(SelectedNodes_TreeNodeAdded); + selectedNodesCollection.TreeNodeInserted += new TreeNodeEventHandler(SelectedNodes_TreeNodeInserted); + selectedNodesCollection.TreeNodeRemoved += new TreeNodeEventHandler(SelectedNodes_TreeNodeRemoved); + selectedNodesCollection.SelectedNodesCleared += new EventHandler(SelectedNodes_SelectedNodesCleared); - public MultiSelectTreeview() { - m_SelectedNodes = new List(); - base.SelectedNode = null; + return selectedNodesCollection; + } + } + + /// + /// Occurs when a tree node is added to the SelectedNodes collection. + /// + /// Tree node that was added. + private void SelectedNodes_TreeNodeAdded(TreeNode tn) + { + blnSelectionChanged = false; + + SelectNode(tn, true, TreeViewAction.Unknown); + //ProcessNodeRange(null, tn, new MouseEventArgs(MouseButtons.Left, 1, Cursor.Position.X, Cursor.Position.Y, 0), Keys.None, TreeViewAction.ByKeyboard, false); + + OnSelectionsChanged(); + } + + /// + /// Occurs when a tree node is inserted to the SelectedNodes collection. + /// + /// tree node that was inserted. + private void SelectedNodes_TreeNodeInserted(TreeNode tn) + { + blnSelectionChanged = false; + + SelectNode(tn, true, TreeViewAction.Unknown); + + OnSelectionsChanged(); + } + + /// + /// Occurs when a tree node is removed from the SelectedNodes collection. + /// + /// Tree node that was removed. + private void SelectedNodes_TreeNodeRemoved(TreeNode tn) + { + blnSelectionChanged = false; + + SelectNode(tn, false, TreeViewAction.Unknown); + + OnSelectionsChanged(); + } + + /// + /// Occurs when the SelectedNodes collection was cleared. + /// + /// + /// + private void SelectedNodes_SelectedNodesCleared(object sender, EventArgs e) + { + blnSelectionChanged = false; + + UnselectAllNodes(TreeViewAction.Unknown); + + OnSelectionsChanged(); } #endregion - #region Overridden Events + #region Node selection methods - protected override void OnGotFocus(EventArgs e) { - // Make sure at least one node has a selection - // this way we can tab to the ctrl and use the - // keyboard to select nodes - try { - if(m_SelectedNode == null && this.TopNode != null) { - ToggleNode(this.TopNode, true); + /// + /// Unselects all selected nodes. + /// + /// Specifies the action that caused the selection change. + private void UnselectAllNodes(TreeViewAction tva) + { + UnselectAllNodesExceptNode(null, tva); + } + + /// + /// Unselects all selected nodes that don't belong to the specified level. + /// + /// Node level. + /// Specifies the action that caused the selection change. + private void UnselectAllNodesNotBelongingToLevel(int level, TreeViewAction tva) + { + // First, build list of nodes that need to be unselected + ArrayList arrNodesToDeselect = new ArrayList(); + foreach (TreeNode selectedTreeNode in htblSelectedNodes.Values) + { + if (GetNodeLevel(selectedTreeNode) != level) + { + arrNodesToDeselect.Add(selectedTreeNode); + } + } + + // Do the actual unselect + foreach (TreeNode tnToDeselect in arrNodesToDeselect) + { + SelectNode(tnToDeselect, false, tva); + } + } + + /// + /// Unselects all selected nodes that don't belong directly to the specified parent. + /// + /// Parent node. + /// Specifies the action that caused the selection change. + private void UnselectAllNodesNotBelongingDirectlyToParent(TreeNode parent, TreeViewAction tva) + { + // First, build list of nodes that need to be unselected + ArrayList arrNodesToDeselect = new ArrayList(); + foreach (TreeNode selectedTreeNode in htblSelectedNodes.Values) + { + if (selectedTreeNode.Parent != parent) + { + arrNodesToDeselect.Add(selectedTreeNode); + } + } + + // Do the actual unselect + foreach (TreeNode tnToDeselect in arrNodesToDeselect) + { + SelectNode(tnToDeselect, false, tva); + } + } + + /// + /// Unselects all selected nodes that don't belong directly or indirectly to the specified parent. + /// + /// Parent node. + /// Specifies the action that caused the selection change. + private void UnselectAllNodesNotBelongingToParent(TreeNode parent, TreeViewAction tva) + { + // First, build list of nodes that need to be unselected + ArrayList arrNodesToDeselect = new ArrayList(); + foreach (TreeNode selectedTreeNode in htblSelectedNodes.Values) + { + if (!IsChildOf(selectedTreeNode, parent)) + { + arrNodesToDeselect.Add(selectedTreeNode); + } + } + + // Do the actual unselect + foreach (TreeNode tnToDeselect in arrNodesToDeselect) + { + SelectNode(tnToDeselect, false, tva); + } + } + + /// + /// Unselects all selected nodes, except for the specified node which should not be touched. + /// + /// Node not to touch. + /// Specifies the action that caused the selection change. + private void UnselectAllNodesExceptNode(TreeNode nodeKeepSelected, TreeViewAction tva) + { + // First, build list of nodes that need to be unselected + ArrayList arrNodesToDeselect = new ArrayList(); + foreach (TreeNode selectedTreeNode in htblSelectedNodes.Values) + { + if (nodeKeepSelected == null) + { + arrNodesToDeselect.Add(selectedTreeNode); + } + else if ((nodeKeepSelected != null) && (selectedTreeNode != nodeKeepSelected)) + { + arrNodesToDeselect.Add(selectedTreeNode); + } + } + + // Do the actual unselect + foreach (TreeNode tnToDeselect in arrNodesToDeselect) + { + SelectNode(tnToDeselect, false, tva); + } + } + + /// + /// occurs when a node is about to be selected. + /// + /// TreeViewCancelEventArgs. + protected override void OnBeforeSelect(TreeViewCancelEventArgs e) + { + // We don't want the base TreeView to handle the selection, because it can only handle single selection. + // Instead, we'll handle the selection ourselves by keeping track of the selected nodes and drawing the + // selection ourselves. + e.Cancel = true; + } + + /// + /// Determines whether the specified node is selected or not. + /// + /// Node to check. + /// True if specified node is selected, false if not. + private bool IsNodeSelected(TreeNode tn) + { + if (tn != null) + return htblSelectedNodes.ContainsKey(tn.GetHashCode()); + return false; + } + + private void PreserveNodeColors(TreeNode tn) + { + if (tn == null) return; + + if (htblSelectedNodesOrigColors.ContainsKey(tn.GetHashCode())) + { + // Color[] color = (Color[])htblSelectedNodesOrigColors[tn.GetHashCode()]; + // color[0]=tn.BackColor; + // color[1]=tn.ForeColor; + } + else + { + htblSelectedNodesOrigColors.Add(tn.GetHashCode(), new Color[] { tn.BackColor, tn.ForeColor }); + } + } + + /// + /// (Un)selects the specified node. + /// + /// Node to (un)select. + /// True to select node, false to unselect node. + /// Specifies the action that caused the selection change. + /// True if node was selected, false if not. + private bool SelectNode(TreeNode tn, bool select, TreeViewAction tva) + { + bool blnSelected = false; + + if (tn == null) + return false; + + if (select) + { + // Only try to select node if it was not already selected + if (!IsNodeSelected(tn)) + { + // Check if node selection is cancelled + TreeViewCancelEventArgs tvcea = new TreeViewCancelEventArgs(tn, false, tva); + base.OnBeforeSelect(tvcea); + if (tvcea.Cancel) + { + // This node selection was cancelled! + return false; + } + + PreserveNodeColors(tn); + + tn.BackColor = SelectionBackColor; // GKM moved from above + tn.ForeColor = BackColor; // GKM moved from above + + htblSelectedNodes.Add(tn.GetHashCode(), tn); + blnSelected = true; + blnSelectionChanged = true; + + base.OnAfterSelect(new TreeViewEventArgs(tn, tva)); } - base.OnGotFocus(e); - } catch(Exception ex) { - HandleException(ex); + tnMostRecentSelectedNode = tn; + } + else + { + // Only unselect node if it was selected + if (IsNodeSelected(tn)) + { + OnBeforeDeselect(tn); + + Color[] originalColors = (Color[])this.htblSelectedNodesOrigColors[tn.GetHashCode()]; + if (originalColors != null) + { + htblSelectedNodes.Remove(tn.GetHashCode()); + blnSelectionChanged = true; + htblSelectedNodesOrigColors.Remove(tn.GetHashCode()); + + // GKM - Restore original node colors + tn.BackColor = originalColors[0]; // GKM - was BackColor; + tn.ForeColor = originalColors[1]; // GKM - was ForeColor; + } + + OnAfterDeselect(tn); + } + } + + return blnSelected; + } + + /// + /// Selects nodes within the specified range. + /// + /// Start node. + /// End Node. + /// Specifies the action that caused the selection change. + private void SelectNodesInsideRange(TreeNode startNode, TreeNode endNode, TreeViewAction tva) + { + // Calculate start node and end node + TreeNode firstNode = null; + TreeNode lastNode = null; + if (startNode.Bounds.Y < endNode.Bounds.Y) + { + firstNode = startNode; + lastNode = endNode; + } + else + { + firstNode = endNode; + lastNode = startNode; + } + + // Select each node in range + SelectNode(firstNode, true, tva); + TreeNode tnTemp = firstNode; + while (tnTemp != lastNode) + { + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + SelectNode(tnTemp, true, tva); + } + } + SelectNode(lastNode, true, tva); + } + + /// + /// Unselects nodes outside the specified range. + /// + /// Start node. + /// End node. + /// Specifies the action that caused the selection change. + private void UnselectNodesOutsideRange(TreeNode startNode, TreeNode endNode, TreeViewAction tva) + { + // Calculate start node and end node + TreeNode firstNode = null; + TreeNode lastNode = null; + if (startNode.Bounds.Y < endNode.Bounds.Y) + { + firstNode = startNode; + lastNode = endNode; + } + else + { + firstNode = endNode; + lastNode = startNode; + } + + // Unselect each node outside range + TreeNode tnTemp = firstNode; + while (tnTemp != null) + { + tnTemp = tnTemp.PrevVisibleNode; + if (tnTemp != null) + { + SelectNode(tnTemp, false, tva); + } + } + + tnTemp = lastNode; + while (tnTemp != null) + { + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + SelectNode(tnTemp, false, tva); + } } } - protected override void OnMouseDown(MouseEventArgs e) { - try { - base.SelectedNode = null; - base.OnMouseDown(e); - } catch(Exception ex) { - HandleException(ex); + /// + /// Recursively unselect node. + /// + /// Node to recursively unselect. + /// Specifies the action that caused the selection change. + private void UnselectNodesRecursively(TreeNode tn, TreeViewAction tva) + { + SelectNode(tn, false, tva); + foreach (TreeNode child in tn.Nodes) + { + UnselectNodesRecursively(child, tva); } } - protected override void OnMouseUp(MouseEventArgs e) { - try { - // Check to see if a node was clicked on - TreeNode node = this.GetNodeAt(e.Location); - if(node != null) { - int leftBound = node.Bounds.X; // -20; // Allow user to click on image - int rightBound = node.Bounds.Right + 10; // Give a little extra room - if(e.Location.X > leftBound && e.Location.X < rightBound) { + #endregion - SelectNode(node); + #region Helper methods + + /// + /// Determines whether a mouse click was inside the node bounds or outside the node bounds.. + /// + /// TreeNode to check. + /// MouseEventArgs. + /// True is mouse was clicked inside the node bounds, false if it was clicked ouside the node bounds. + private bool IsClickOnNode(TreeNode tn, MouseEventArgs e) + { + if (tn == null) + return false; + + // GKM + // Determine the rightmost position we'll process clicks (so that the click has to be on the node's bounds, + // like the .NET treeview + int rightMostX = tn.Bounds.X + tn.Bounds.Width; + return (tn != null && e.X < rightMostX); // GKM + } + + /// + /// Gets level of specified node. + /// + /// Node. + /// Level of node. + public int GetNodeLevel(TreeNode node) + { + int level = 0; + while ((node = node.Parent) != null) + level++; + return level; + } + + /// + /// Determines whether the specified node is a child (indirect or direct) of the specified parent. + /// + /// Node to check. + /// Parent node. + /// True if specified node is a direct or indirect child of parent node, false if not. + private bool IsChildOf(TreeNode child, TreeNode parent) + { + bool blnChild = false; + + TreeNode tnTemp = child; + while (tnTemp != null) + { + if (tnTemp == parent) + { + blnChild = true; + break; + } + else + { + tnTemp = tnTemp.Parent; + } + } + + return blnChild; + } + + /// + /// Gets root parent of specified node. + /// + /// Node. + /// Root parent of specified node. + public TreeNode GetRootParent(TreeNode child) + { + TreeNode tnParent = child; + + while (tnParent.Parent != null) + { + tnParent = tnParent.Parent; + } + + return tnParent; + } + + /// + /// Gets number of visible nodes. + /// + /// Number of visible nodes. + private int GetNumberOfVisibleNodes() + { + int intCounter = 0; + + TreeNode tnTemp = this.Nodes[0]; + + while (tnTemp != null) + { + if (tnTemp.IsVisible) + { + intCounter++; + } + + tnTemp = tnTemp.NextVisibleNode; + } + + return intCounter; + } + + /// + /// Gets last visible node. + /// + /// Last visible node. + private TreeNode GetLastVisibleNode() + { + TreeNode tnTemp = this.Nodes[0]; + + while (tnTemp.NextVisibleNode != null) + { + tnTemp = tnTemp.NextVisibleNode; + } + + return tnTemp; + } + + /// + /// Gets next tree node(s), starting from the specified node and direction. + /// + /// Node to start from. + /// True to go down, false to go up. + /// Number of nodes to go down or up. + /// Next node. + private TreeNode GetNextTreeNode(TreeNode start, bool down, int intNumber) + { + int intCounter = 0; + TreeNode tnTemp = start; + while (intCounter < intNumber) + { + if (down) + { + if (tnTemp.NextVisibleNode != null) + tnTemp = tnTemp.NextVisibleNode; + else + break; + } + else + { + if (tnTemp.PrevVisibleNode != null) + tnTemp = tnTemp.PrevVisibleNode; + else + break; + } + + intCounter++; + } + + return tnTemp; + } + + /// + /// makes focus rectangle visible or hides it. + /// + /// Node to make focus rectangle (in)visible for. + /// True to make focus rectangle visible, false to hide it. + private void SetFocusToNode(TreeNode tn, bool visible) + { + Graphics g = this.CreateGraphics(); + Rectangle rect = new Rectangle(tn.Bounds.X, tn.Bounds.Y, tn.Bounds.Width, tn.Bounds.Height); + if (visible) + { + this.Invalidate(rect, false); + Update(); + if (tn.BackColor != SelectionBackColor) + { + g.DrawRectangle(new Pen(new SolidBrush(SelectionBackColor), 1), rect); + } + } + else + { + if (tn.BackColor != SelectionBackColor) + { + g.DrawRectangle(new Pen(new SolidBrush(BackColor), 1), tnMostRecentSelectedNode.Bounds.X, tnMostRecentSelectedNode.Bounds.Y, tnMostRecentSelectedNode.Bounds.Width, tnMostRecentSelectedNode.Bounds.Height); + } + this.Invalidate(rect, false); + Update(); + } + } + + #endregion + + #region Dispose + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + #endregion + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + + #region OnMouseUp, OnMouseDown + + /// + /// Occurs when mouse button is up after a click. + /// + /// + protected override void OnMouseUp(MouseEventArgs e) + { +#if DEBUG + try + { +#endif + if (!this.blnNodeProcessedOnMouseDown) + { + TreeNode tn = this.GetNodeAt(e.X, e.Y); + + // Mouse click has not been handled by the mouse down event, so do it here. This is the case when + // a selected node was clicked again; in that case we handle that click here because in case the + // user is dragging the node, we should not put it in edit mode. + + if (IsClickOnNode(tn, e)) + { + this.ProcessNodeRange(this.tnMostRecentSelectedNode, tn, e, Control.ModifierKeys, TreeViewAction.ByMouse, true); } } + this.blnNodeProcessedOnMouseDown = false; + base.OnMouseUp(e); - } catch(Exception ex) { - HandleException(ex); +#if DEBUG } + catch (Exception ex) + { + // GKM - Untrapped exceptions were killing me for debugging purposes. + // It probably shouldn't be here permanently, but it was causing real trouble for me. + MessageBox.Show(this, ex.ToString()); + } +#endif } - //mxd. Reduces flickering a bit... - protected override void OnMouseMove(MouseEventArgs e) { } + private bool IsPlusMinusClicked(TreeNode tn, MouseEventArgs e) + { + int intNodeLevel = GetNodeLevel(tn); + bool blnPlusMinusClicked = e.X < 20 + (intNodeLevel * 20); - protected override void OnItemDrag(ItemDragEventArgs e) { - // If the user drags a node and the node being dragged is NOT - // selected, then clear the active selection, select the - // node being dragged and drag it. Otherwise if the node being - // dragged is selected, drag the entire selection. - try { - TreeNode node = e.Item as TreeNode; + return blnPlusMinusClicked; + } - if(node != null) { - if(!m_SelectedNodes.Contains(node)) { - SelectSingleNode(node); - ToggleNode(node, true); - } + /// + /// Occurs when mouse is down. + /// + /// + protected override void OnMouseDown(MouseEventArgs e) + { + tnKeysStartNode = null; + + // Store number of mouse clicks in OnMouseDown event, because here we also get e.Clicks = 2 when an item was doubleclicked + // in OnMouseUp we seem to get always e.Clicks = 1, also when item is doubleclicked + intMouseClicks = e.Clicks; + + TreeNode tn = this.GetNodeAt(e.X, e.Y); + + if (tn == null) return; + + // Preserve colors here, because if you do it later then it will already have selected colors + // Don't know why...! + PreserveNodeColors(tn); + + // If +/- was clicked, we should not process the node. + if (!IsPlusMinusClicked(tn, e)) + { + // If mouse down on a node that is already selected, then we should process this node in the mouse up event, because we + // might want to drag it and it should not be put in edit mode. + // Also, only process node if click was in node's bounds. + if ((tn != null) && (IsClickOnNode(tn, e)) && (!IsNodeSelected(tn))) + { + // Flash node. In case the node selection is cancelled by the user, this gives the effect that it + // was selected and unselected again. + tnToFlash = tn; + System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(FlashNode)); + t.Start(); + + blnNodeProcessedOnMouseDown = true; + + ProcessNodeRange(tnMostRecentSelectedNode, tn, e, Control.ModifierKeys, TreeViewAction.ByMouse, true); } - - base.OnItemDrag(e); - } catch(Exception ex) { - HandleException(ex); } - } - protected override void OnBeforeSelect(TreeViewCancelEventArgs e) { - // Never allow base.SelectedNode to be set! - try { - base.SelectedNode = null; - e.Cancel = true; - - base.OnBeforeSelect(e); - } catch(Exception ex) { - HandleException(ex); - } - } - - protected override void OnAfterSelect(TreeViewEventArgs e) { - // Never allow base.SelectedNode to be set! - try { - base.OnAfterSelect(e); - base.SelectedNode = null; - } catch(Exception ex) { - HandleException(ex); - } - } - - protected override void OnKeyDown(KeyEventArgs e) { - // Handle all possible key strokes for the control. - // including navigation, selection, etc. - - base.OnKeyDown(e); - - if(e.KeyCode == Keys.ShiftKey) return; - - this.BeginUpdate(); - bool bShift = (ModifierKeys == Keys.Shift); - - try { - // Nothing is selected in the tree, this isn't a good state - // select the top node - if(m_SelectedNode == null && this.TopNode != null) { - ToggleNode(this.TopNode, true); - } - - // Nothing is still selected in the tree, this isn't a good state, leave. - if(m_SelectedNode == null) return; - - if(e.KeyCode == Keys.Left) { - if(m_SelectedNode.IsExpanded && m_SelectedNode.Nodes.Count > 0) { - // Collapse an expanded node that has children - m_SelectedNode.Collapse(); - } else if(m_SelectedNode.Parent != null) { - // Node is already collapsed, try to select its parent. - SelectSingleNode(m_SelectedNode.Parent); - } - } else if(e.KeyCode == Keys.Right) { - if(!m_SelectedNode.IsExpanded) { - // Expand a collpased node's children - m_SelectedNode.Expand(); - } else { - // Node was already expanded, select the first child - SelectSingleNode(m_SelectedNode.FirstNode); - } - } else if(e.KeyCode == Keys.Up) { - // Select the previous node - if(m_SelectedNode.PrevVisibleNode != null) { - SelectNode(m_SelectedNode.PrevVisibleNode); - } - } else if(e.KeyCode == Keys.Down) { - // Select the next node - if(m_SelectedNode.NextVisibleNode != null) { - SelectNode(m_SelectedNode.NextVisibleNode); - } - } else if(e.KeyCode == Keys.Home) { - if(bShift) { - if(m_SelectedNode.Parent == null) { - // Select all of the root nodes up to this point - if(this.Nodes.Count > 0) { - SelectNode(this.Nodes[0]); - } - } else { - // Select all of the nodes up to this point under this nodes parent - SelectNode(m_SelectedNode.Parent.FirstNode); - } - } else { - // Select this first node in the tree - if(this.Nodes.Count > 0) { - SelectSingleNode(this.Nodes[0]); - } - } - } else if(e.KeyCode == Keys.End) { - if(bShift) { - if(m_SelectedNode.Parent == null) { - // Select the last ROOT node in the tree - if(this.Nodes.Count > 0) { - SelectNode(this.Nodes[this.Nodes.Count - 1]); - } - } else { - // Select the last node in this branch - SelectNode(m_SelectedNode.Parent.LastNode); - } - } else { - if(this.Nodes.Count > 0) { - // Select the last node visible node in the tree. - // Don't expand branches incase the tree is virtual - TreeNode ndLast = this.Nodes[0].LastNode; - while(ndLast.IsExpanded && (ndLast.LastNode != null)) { - ndLast = ndLast.LastNode; - } - SelectSingleNode(ndLast); - } - } - } else if(e.KeyCode == Keys.PageUp) { - // Select the highest node in the display - int nCount = this.VisibleCount; - TreeNode ndCurrent = m_SelectedNode; - while((nCount) > 0 && (ndCurrent.PrevVisibleNode != null)) { - ndCurrent = ndCurrent.PrevVisibleNode; - nCount--; - } - SelectSingleNode(ndCurrent); - } else if(e.KeyCode == Keys.PageDown) { - // Select the lowest node in the display - int nCount = this.VisibleCount; - TreeNode ndCurrent = m_SelectedNode; - while((nCount) > 0 && (ndCurrent.NextVisibleNode != null)) { - ndCurrent = ndCurrent.NextVisibleNode; - nCount--; - } - SelectSingleNode(ndCurrent); - } else { - // Assume this is a search character a-z, A-Z, 0-9, etc. - // Select the first node after the current node that - // starts with this character - string sSearch = ((char)e.KeyValue).ToString(); - - TreeNode ndCurrent = m_SelectedNode; - while((ndCurrent.NextVisibleNode != null)) { - ndCurrent = ndCurrent.NextVisibleNode; - if(ndCurrent.Text.StartsWith(sSearch)) { - SelectSingleNode(ndCurrent); - break; - } - } - } - } catch(Exception ex) { - HandleException(ex); - } finally { - this.EndUpdate(); - } + base.OnMouseDown(e); } #endregion - #region Helper Methods + #region FlashNode, StartEdit - private void SelectNode(TreeNode node) { - try { - this.BeginUpdate(); - - if(!useMultiSelection) { //mxd - SelectSingleNode(node); - } else if(m_SelectedNode == null || ModifierKeys == Keys.Control) { - // Ctrl+Click selects an unselected node, or unselects a selected node. - bool bIsSelected = m_SelectedNodes.Contains(node); - ToggleNode(node, !bIsSelected); - } else if(ModifierKeys == Keys.Shift) { - // Shift+Click selects nodes between the selected node and here. - TreeNode ndStart = m_SelectedNode; - TreeNode ndEnd = node; - - if(ndStart.Parent == ndEnd.Parent) { - // Selected node and clicked node have same parent, easy case. - if(ndStart.Index < ndEnd.Index) { - // If the selected node is beneath the clicked node walk down - // selecting each Visible node until we reach the end. - while(ndStart != ndEnd) { - ndStart = ndStart.NextVisibleNode; - if(ndStart == null) break; - ToggleNode(ndStart, true); - } - } else if(ndStart.Index == ndEnd.Index) { - // Clicked same node, do nothing - } else { - // If the selected node is above the clicked node walk up - // selecting each Visible node until we reach the end. - while(ndStart != ndEnd) { - ndStart = ndStart.PrevVisibleNode; - if(ndStart == null) break; - ToggleNode(ndStart, true); - } - } - } else { - // Selected node and clicked node have same parent, hard case. - // We need to find a common parent to determine if we need - // to walk down selecting, or walk up selecting. - - TreeNode ndStartP = ndStart; - TreeNode ndEndP = ndEnd; - int startDepth = Math.Min(ndStartP.Level, ndEndP.Level); - - // Bring lower node up to common depth - while(ndStartP.Level > startDepth) { - ndStartP = ndStartP.Parent; - } - - // Bring lower node up to common depth - while(ndEndP.Level > startDepth) { - ndEndP = ndEndP.Parent; - } - - // Walk up the tree until we find the common parent - while(ndStartP.Parent != ndEndP.Parent) { - ndStartP = ndStartP.Parent; - ndEndP = ndEndP.Parent; - } - - // Select the node - if(ndStartP.Index < ndEndP.Index) { - // If the selected node is beneath the clicked node walk down - // selecting each Visible node until we reach the end. - while(ndStart != ndEnd) { - ndStart = ndStart.NextVisibleNode; - if(ndStart == null) break; - ToggleNode(ndStart, true); - } - } else if(ndStartP.Index == ndEndP.Index) { - if(ndStart.Level < ndEnd.Level) { - while(ndStart != ndEnd) { - ndStart = ndStart.NextVisibleNode; - if(ndStart == null) break; - ToggleNode(ndStart, true); - } - } else { - while(ndStart != ndEnd) { - ndStart = ndStart.PrevVisibleNode; - if(ndStart == null) break; - ToggleNode(ndStart, true); - } - } - } else { - // If the selected node is above the clicked node walk up - // selecting each Visible node until we reach the end. - while(ndStart != ndEnd) { - ndStart = ndStart.PrevVisibleNode; - if(ndStart == null) break; - ToggleNode(ndStart, true); - } - } - } - } else { - // Just clicked a node, select it - SelectSingleNode(node); - } - - OnAfterSelect(new TreeViewEventArgs(m_SelectedNode)); - } finally { - this.EndUpdate(); - } - } - - public void ClearSelectedNodes() { - try { - foreach(TreeNode node in m_SelectedNodes) { - node.BackColor = this.BackColor; - node.ForeColor = this.ForeColor; - } - } finally { - m_SelectedNodes.Clear(); - m_SelectedNode = null; - } - } - - private void SelectSingleNode(TreeNode node) { - if(node == null) { + /// + /// Flashes node. + /// + private void FlashNode() + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(FlashNode)); return; } - ClearSelectedNodes(); - ToggleNode(node, true); - node.EnsureVisible(); - } + TreeNode tn = tnToFlash; + // Only flash node is it's not yet selected + if (!IsNodeSelected(tn)) + { + tn.BackColor = SelectionBackColor; + tn.ForeColor = this.BackColor; + this.Invalidate(); + this.Refresh(); + Application.DoEvents(); + System.Threading.Thread.Sleep(200); + } - private void ToggleNode(TreeNode node, bool bSelectNode) { - if(bSelectNode) { - m_SelectedNode = node; - if(!m_SelectedNodes.Contains(node)) { - m_SelectedNodes.Add(node); - } - node.BackColor = SystemColors.Highlight; - node.ForeColor = SystemColors.HighlightText; - } else { - m_SelectedNodes.Remove(node); - node.BackColor = this.BackColor; - node.ForeColor = this.ForeColor; + // If node is not selected yet, restore default colors to end flashing + if (!IsNodeSelected(tn)) + { + tn.BackColor = BackColor; + tn.ForeColor = this.ForeColor; } } - private static void HandleException(Exception ex) { - // Perform some error handling here. - // We don't want to bubble errors to the CLR. - General.ErrorLogger.Add(ErrorType.Error, ex.Message); + /// + /// Starts edit on a node. + /// + private void StartEdit() + { + System.Threading.Thread.Sleep(200); + if (!blnWasDoubleClick) + { + blnInternalCall = true; + SelectedNode = tnNodeToStartEditOn; + blnInternalCall = false; + tnNodeToStartEditOn.BeginEdit(); + } + else + { + blnWasDoubleClick = false; + } } #endregion + + #region ProcessNodeRange + + /// + /// Processes a node range. + /// + /// Start node of range. + /// End node of range. + /// MouseEventArgs. + /// Keys. + /// TreeViewAction. + /// True if node can go to edit mode, false if not. + private void ProcessNodeRange(TreeNode startNode, TreeNode endNode, MouseEventArgs e, Keys keys, TreeViewAction tva, bool allowStartEdit) + { + blnSelectionChanged = false; // prepare for OnSelectionsChanged + + if (e.Button == MouseButtons.Left) + { + blnWasDoubleClick = (intMouseClicks == 2); + + TreeNode tnTemp; + int intNodeLevelStart; + + if (((keys & Keys.Control) == 0) && ((keys & Keys.Shift) == 0)) + { + // CTRL and SHIFT not held down + tnSelectionMirrorPoint = endNode; + int intNumberOfSelectedNodes = SelectedNodes.Count; + + // If it was a double click, select node and suspend further processing + if (blnWasDoubleClick) + { + base.OnMouseDown(e); + return; + } + + if (!IsPlusMinusClicked(endNode, e)) + { + bool blnNodeWasSelected = IsNodeSelected(endNode); + + UnselectAllNodesExceptNode(endNode, tva); + SelectNode(endNode, true, tva); + + + if ((blnNodeWasSelected) && (LabelEdit) && (allowStartEdit) && (!blnWasDoubleClick) && (intNumberOfSelectedNodes <= 1)) + { + // Node should be put in edit mode + tnNodeToStartEditOn = endNode; + System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(StartEdit)); + t.Start(); + } + } + } + else if (((keys & Keys.Control) != 0) && ((keys & Keys.Shift) == 0)) + { + // CTRL held down + tnSelectionMirrorPoint = null; + + if (!IsNodeSelected(endNode)) + { + switch (selectionMode) + { + case TreeViewSelectionMode.SingleSelect: + UnselectAllNodesExceptNode(endNode, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameRootBranch: + TreeNode tnAbsoluteParent2 = GetRootParent(endNode); + UnselectAllNodesNotBelongingToParent(tnAbsoluteParent2, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameLevel: + UnselectAllNodesNotBelongingToLevel(GetNodeLevel(endNode), tva); + break; + + case TreeViewSelectionMode.MultiSelectSameLevelAndRootBranch: + TreeNode tnAbsoluteParent = GetRootParent(endNode); + UnselectAllNodesNotBelongingToParent(tnAbsoluteParent, tva); + UnselectAllNodesNotBelongingToLevel(GetNodeLevel(endNode), tva); + break; + + case TreeViewSelectionMode.MultiSelectSameParent: + TreeNode tnParent = endNode.Parent; + UnselectAllNodesNotBelongingDirectlyToParent(tnParent, tva); + break; + } + + SelectNode(endNode, true, tva); + } + else + { + SelectNode(endNode, false, tva); + } + } + else if (((keys & Keys.Control) == 0) && ((keys & Keys.Shift) != 0)) + { + // SHIFT pressed + if (tnSelectionMirrorPoint == null) + { + tnSelectionMirrorPoint = startNode; + } + + switch (selectionMode) + { + case TreeViewSelectionMode.SingleSelect: + UnselectAllNodesExceptNode(endNode, tva); + SelectNode(endNode, true, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameRootBranch: + TreeNode tnAbsoluteParentStartNode = GetRootParent(startNode); + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + TreeNode tnAbsoluteParent = GetRootParent(tnTemp); + if (tnAbsoluteParent == tnAbsoluteParentStartNode) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStartNode, tva); + UnselectNodesOutsideRange(tnSelectionMirrorPoint, endNode, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameLevel: + intNodeLevelStart = GetNodeLevel(startNode); + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + int intNodeLevel = GetNodeLevel(tnTemp); + if (intNodeLevel == intNodeLevelStart) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva); + UnselectNodesOutsideRange(tnSelectionMirrorPoint, endNode, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameLevelAndRootBranch: + TreeNode tnAbsoluteParentStart = GetRootParent(startNode); + intNodeLevelStart = GetNodeLevel(startNode); + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + int intNodeLevel = GetNodeLevel(tnTemp); + TreeNode tnAbsoluteParent = GetRootParent(tnTemp); + if ((intNodeLevel == intNodeLevelStart) && (tnAbsoluteParent == tnAbsoluteParentStart)) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStart, tva); + UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva); + UnselectNodesOutsideRange(tnSelectionMirrorPoint, endNode, tva); + break; + + case TreeViewSelectionMode.MultiSelect: + SelectNodesInsideRange(tnSelectionMirrorPoint, endNode, tva); + UnselectNodesOutsideRange(tnSelectionMirrorPoint, endNode, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameParent: + TreeNode tnParentStartNode = startNode.Parent; + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + TreeNode tnParent = tnTemp.Parent; + if (tnParent == tnParentStartNode) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingDirectlyToParent(tnParentStartNode, tva); + UnselectNodesOutsideRange(tnSelectionMirrorPoint, endNode, tva); + break; + } + } + else if (((keys & Keys.Control) != 0) && ((keys & Keys.Shift) != 0)) + { + // SHIFT AND CTRL pressed + switch (selectionMode) + { + case TreeViewSelectionMode.SingleSelect: + UnselectAllNodesExceptNode(endNode, tva); + SelectNode(endNode, true, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameRootBranch: + TreeNode tnAbsoluteParentStartNode = GetRootParent(startNode); + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + TreeNode tnAbsoluteParent = GetRootParent(tnTemp); + if (tnAbsoluteParent == tnAbsoluteParentStartNode) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStartNode, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameLevel: + intNodeLevelStart = GetNodeLevel(startNode); + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + int intNodeLevel = GetNodeLevel(tnTemp); + if (intNodeLevel == intNodeLevelStart) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva); + break; + + case TreeViewSelectionMode.MultiSelectSameLevelAndRootBranch: + TreeNode tnAbsoluteParentStart = GetRootParent(startNode); + intNodeLevelStart = GetNodeLevel(startNode); + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + int intNodeLevel = GetNodeLevel(tnTemp); + TreeNode tnAbsoluteParent = GetRootParent(tnTemp); + if ((intNodeLevel == intNodeLevelStart) && (tnAbsoluteParent == tnAbsoluteParentStart)) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingToParent(tnAbsoluteParentStart, tva); + UnselectAllNodesNotBelongingToLevel(intNodeLevelStart, tva); + break; + + case TreeViewSelectionMode.MultiSelect: + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + SelectNode(tnTemp, true, tva); + } + } + break; + + case TreeViewSelectionMode.MultiSelectSameParent: + TreeNode tnParentStartNode = startNode.Parent; + tnTemp = startNode; + // Check each visible node from startNode to endNode and select it if needed + while ((tnTemp != null) && (tnTemp != endNode)) + { + if (startNode.Bounds.Y > endNode.Bounds.Y) + tnTemp = tnTemp.PrevVisibleNode; + else + tnTemp = tnTemp.NextVisibleNode; + if (tnTemp != null) + { + TreeNode tnParent = tnTemp.Parent; + if (tnParent == tnParentStartNode) + { + SelectNode(tnTemp, true, tva); + } + } + } + UnselectAllNodesNotBelongingDirectlyToParent(tnParentStartNode, tva); + break; + } + } + } + else if (e.Button == MouseButtons.Right) + { + // if right mouse button clicked, clear selection and select right-clicked node + if (!IsNodeSelected(endNode)) + { + UnselectAllNodes(tva); + SelectNode(endNode, true, tva); + } + } + OnSelectionsChanged(); + } + + #endregion + + #region OnBeforeLabelEdit + + /// + /// Occurs before node goes into edit mode. + /// + /// + protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e) + { + blnSelectionChanged = false; // prepare for OnSelectionsChanged + + // Make sure that it's the only selected node + SelectNode(e.Node, true, TreeViewAction.ByMouse); + UnselectAllNodesExceptNode(e.Node, TreeViewAction.ByMouse); + + OnSelectionsChanged(); + + base.OnBeforeLabelEdit(e); + } + + #endregion + + #region OnKeyDown + + /// + /// occurs when a key is down. + /// + /// + protected override void OnKeyDown(KeyEventArgs e) + { + Keys kMod = Keys.None; + switch (e.Modifiers) + { + case Keys.Shift: + case Keys.Control: + case Keys.Control | Keys.Shift: + kMod = Keys.Shift; + if (tnKeysStartNode == null) + tnKeysStartNode = tnMostRecentSelectedNode; + break; + default: + tnKeysStartNode = null; + break; + } + + int intNumber = 0; + + TreeNode tnNewlySelectedNodeWithKeys = null; + switch (e.KeyCode) + { + case Keys.Down: + tnNewlySelectedNodeWithKeys = tnMostRecentSelectedNode.NextVisibleNode; + break; + + case Keys.Up: + tnNewlySelectedNodeWithKeys = tnMostRecentSelectedNode.PrevVisibleNode; + break; + + case Keys.Left: + if (tnMostRecentSelectedNode.IsExpanded) + tnMostRecentSelectedNode.Collapse(); + else + tnNewlySelectedNodeWithKeys = tnMostRecentSelectedNode.Parent; + break; + + case Keys.Right: + if (!tnMostRecentSelectedNode.IsExpanded) + tnMostRecentSelectedNode.Expand(); + else + if (tnMostRecentSelectedNode.Nodes != null) + tnNewlySelectedNodeWithKeys = tnMostRecentSelectedNode.Nodes[0]; + break; + + case Keys.Home: + tnNewlySelectedNodeWithKeys = this.Nodes[0]; + break; + + case Keys.End: + tnNewlySelectedNodeWithKeys = GetLastVisibleNode(); + break; + + case Keys.PageDown: + + intNumber = GetNumberOfVisibleNodes(); + tnNewlySelectedNodeWithKeys = GetNextTreeNode(tnMostRecentSelectedNode, true, intNumber); + break; + + case Keys.PageUp: + + intNumber = GetNumberOfVisibleNodes(); + tnNewlySelectedNodeWithKeys = GetNextTreeNode(tnMostRecentSelectedNode, false, intNumber); + break; + + default: + base.OnKeyDown(e); // GKM + return; + } + + if ((tnNewlySelectedNodeWithKeys != null)) + { + SetFocusToNode(tnMostRecentSelectedNode, false); + ProcessNodeRange(tnKeysStartNode, tnNewlySelectedNodeWithKeys, new MouseEventArgs(MouseButtons.Left, 1, Cursor.Position.X, Cursor.Position.Y, 0), kMod, TreeViewAction.ByKeyboard, false); + tnMostRecentSelectedNode = tnNewlySelectedNodeWithKeys; + SetFocusToNode(tnMostRecentSelectedNode, true); + } + + // Ensure visibility + if (tnMostRecentSelectedNode != null) + { + TreeNode tnToMakeVisible = null; + switch (e.KeyCode) + { + case Keys.Down: + case Keys.Right: + tnToMakeVisible = GetNextTreeNode(tnMostRecentSelectedNode, true, 5); + break; + + case Keys.Up: + case Keys.Left: + tnToMakeVisible = GetNextTreeNode(tnMostRecentSelectedNode, false, 5); + break; + + case Keys.Home: + case Keys.End: + tnToMakeVisible = tnMostRecentSelectedNode; + break; + + case Keys.PageDown: + tnToMakeVisible = GetNextTreeNode(tnMostRecentSelectedNode, true, intNumber - 2); + break; + + case Keys.PageUp: + tnToMakeVisible = GetNextTreeNode(tnMostRecentSelectedNode, false, intNumber - 2); + break; + } + + if (tnToMakeVisible != null) + tnToMakeVisible.EnsureVisible(); + } + + base.OnKeyDown(e); + } + + #endregion + + #region OnAfterCollapse + + /// + /// Occurs after a node is collapsed. + /// + /// + protected override void OnAfterCollapse(TreeViewEventArgs e) + { + blnSelectionChanged = false; + + // All child nodes should be deselected + bool blnChildSelected = false; + foreach (TreeNode tn in e.Node.Nodes) + { + if (IsNodeSelected(tn)) + { + blnChildSelected = true; + } + UnselectNodesRecursively(tn, TreeViewAction.Collapse); + } + + if (blnChildSelected) + { + SelectNode(e.Node, true, TreeViewAction.Collapse); + } + + OnSelectionsChanged(); + + base.OnAfterCollapse(e); + } + + #endregion + + #region OnItemDrag + + /// + /// Occurs when an item is being dragged. + /// + /// + protected override void OnItemDrag(ItemDragEventArgs e) + { + e = new ItemDragEventArgs(MouseButtons.Left, this.SelectedNodes); + base.OnItemDrag(e); + } + + #endregion + } + + #region SelectedNodesCollection + + /// + /// Collection of selected nodes. + /// + public class NodesCollection : CollectionBase + { + #region Events + + /// + /// Event fired when a tree node has been added to the collection. + /// + internal event TreeNodeEventHandler TreeNodeAdded; + + /// + /// Event fired when a tree node has been removed to the collection. + /// + internal event TreeNodeEventHandler TreeNodeRemoved; + + /// + /// Event fired when a tree node has been inserted to the collection. + /// + internal event TreeNodeEventHandler TreeNodeInserted; + + /// + /// Event fired the collection has been cleared. + /// + internal event EventHandler SelectedNodesCleared; + + #endregion + + #region CollectionBase members + + /// + /// Gets tree node at specified index. + /// + public TreeNode this[int index] + { + get { return ((TreeNode)List[index]); } + } + + /// + /// Adds a tree node to the collection. + /// + /// Tree node to add. + /// The position into which the new element was inserted. + public int Add(TreeNode treeNode) + { + if (TreeNodeAdded != null) + TreeNodeAdded(treeNode); + + return List.Add(treeNode); + } + + /// + /// Inserts a tree node at specified index. + /// + /// The position into which the new element has to be inserted. + /// Tree node to insert. + public void Insert(int index, TreeNode treeNode) + { + if (TreeNodeInserted != null) + TreeNodeInserted(treeNode); + + List.Add(treeNode); + } + + /// + /// Removed a tree node from the collection. + /// + /// Tree node to remove. + public void Remove(TreeNode treeNode) + { + if (TreeNodeRemoved != null) + TreeNodeRemoved(treeNode); + + List.Remove(treeNode); + } + + /// + /// Determines whether treenode belongs to the collection. + /// + /// Tree node to check. + /// True if tree node belongs to the collection, false if not. + public bool Contains(TreeNode treeNode) + { + return List.Contains(treeNode); + } + + /// + /// Gets index of tree node in the collection. + /// + /// Tree node to get index of. + /// Index of tree node in the collection. + public int IndexOf(TreeNode treeNode) + { + return List.IndexOf(treeNode); + } + + #endregion + + #region OnClear + + /// + /// Occurs when collection is being cleared. + /// + protected override void OnClear() + { + if (SelectedNodesCleared != null) + SelectedNodesCleared(this, EventArgs.Empty); + + base.OnClear(); + } + + #endregion + + } + + #endregion } diff --git a/Source/Core/Windows/ThingEditForm.cs b/Source/Core/Windows/ThingEditForm.cs index cb5bf779..f9765300 100644 --- a/Source/Core/Windows/ThingEditForm.cs +++ b/Source/Core/Windows/ThingEditForm.cs @@ -140,6 +140,7 @@ namespace CodeImp.DoomBuilder.Windows if (things.Count > 1) this.Text = "Edit Things (" + things.Count + ")"; hint.Visible = things.Count > 1; //mxd hintlabel.Visible = things.Count > 1; //mxd + thingtype.UseMultiSelection = things.Count > 1; //mxd //mxd. Make undo string undodesc = "thing"; diff --git a/Source/Core/Windows/ThingEditFormUDMF.cs b/Source/Core/Windows/ThingEditFormUDMF.cs index 27a55902..07bce8a8 100644 --- a/Source/Core/Windows/ThingEditFormUDMF.cs +++ b/Source/Core/Windows/ThingEditFormUDMF.cs @@ -164,6 +164,7 @@ namespace CodeImp.DoomBuilder.Windows if(things.Count > 1) this.Text = "Edit Things (" + things.Count + ")"; hint.Visible = things.Count > 1; //mxd hintlabel.Visible = things.Count > 1; //mxd + thingtype.UseMultiSelection = things.Count > 1; //mxd //mxd. Make undo string undodesc = "thing";