Update Translations.cs

Update Translations.cs

Reupdated

--- PoGo.PokeMobBot.Logic/Common/Translations.cs
+++ PoGo.PokeMobBot.Logic/Common/Translations.cs
@@ -185,7 +185,7 @@
                 "{0}\t- CP: {1}  IV: {2}%   [Best CP: {3}  IV: {4}%] (Candies: {5})"),
             new KeyValuePair<TranslationString, string>(TranslationString.EventItemRecycled, "{0}x {1}"),
             new KeyValuePair<TranslationString, string>(TranslationString.EventPokemonCapture,
-                "({0}) | ({1}) {2} Lvl: {3} CP: ({4}/{5}) IV: {6}% | Chance: {7}% | {8}m dist | with a {9} ({10} left). | {11}xp | {12}"),
+                "({0}) | {2}, Lvl: {3} | CP: ({4}/{5}) | IV: {6}% | Type: {1} | Chance: {7}% | Dist: {8}m | Used: {9} ({10} left) | XP: {11} | Candy: {12}"),
             new KeyValuePair<TranslationString, string>(TranslationString.EventNoPokeballs,
                 "No Pokeballs - We missed a {0} with CP {1}"),
             new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusAttempt, "{0} Attempt #{1}"),
@@ -216,14 +216,14 @@
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryPokestop, "POKESTOP"),
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryFarming, "FARMING"),
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryRecycling, "RECYCLING"),
-            new KeyValuePair<TranslationString, string>(TranslationString.LogEntryPkmn, "PKMN"),
-            new KeyValuePair<TranslationString, string>(TranslationString.LogEntryTransfered, "TRANSFERED"),
+            new KeyValuePair<TranslationString, string>(TranslationString.LogEntryPkmn, "CATCH"),
+            new KeyValuePair<TranslationString, string>(TranslationString.LogEntryTransfered, "TRANSFER"),
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryEvolved, "EVOLVED"),
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryBerry, "BERRY"),
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryEgg, "EGG"),
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryDebug, "DEBUG"),
             new KeyValuePair<TranslationString, string>(TranslationString.LogEntryUpdate, "UPDATE"),
-            new KeyValuePair<TranslationString, string>(TranslationString.LoggingIn, "Logging in using {0}"),
+            new KeyValuePair<TranslationString, string>(TranslationString.LoggingIn, "Logging in using account {0}"),
             new KeyValuePair<TranslationString, string>(TranslationString.PtcOffline,
                 "PTC Servers are probably down OR your credentials are wrong. Try google"),
             new KeyValuePair<TranslationString, string>(TranslationString.TryingAgainIn,
@@ -265,9 +265,9 @@
             new KeyValuePair<TranslationString, string>(TranslationString.ZeroPokeballInv,
                 "You have no pokeballs in your inventory, no more Pokemon can be caught!"),
             new KeyValuePair<TranslationString, string>(TranslationString.CurrentPokeballInv,
-                "[Current Inventory] Pokeballs: {0} | Greatballs: {1} | Ultraballs: {2} | Masterballs: {3}"),
+                "[Inventory] Pokeballs: {0} | Greatballs: {1} | Ultraballs: {2} | Masterballs: {3}"),
             new KeyValuePair<TranslationString, string>(TranslationString.CurrentPotionInv,
-                "[Current Inventory] Potions: {0} | Super Potions: {1} | Hyper Potions: {2} | Max Potions: {3}"),
+                "[Inventory] Potions: {0} | Super Potions: {1} | Hyper Potions: {2} | Max Potions: {3}"),
             new KeyValuePair<TranslationString, string>(TranslationString.CheckingForBallsToRecycle,
                 "Checking for balls to recycle, keeping {0}"),
             new KeyValuePair<TranslationString, string>(TranslationString.CheckingForPotionsToRecycle,
@@ -291,12 +291,12 @@
                 "Pokemon {0} ({1}) renamed from {2} to {3}."),
             new KeyValuePair<TranslationString, string>(TranslationString.PokemonIgnoreFilter,
                 "[Pokemon ignore filter] - Ignoring {0} as defined in settings"),
-            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusAttempt, "CatchAttempt"),
-            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusError, "CatchError"),
-            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusEscape, "CatchEscape"),
-            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusFlee, "CatchFlee"),
-            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusMissed, "CatchMissed"),
-            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusSuccess, "CatchSuccess"),
+            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusAttempt, "Attempt"),
+            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusError, "Error"),
+            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusEscape, "Escape"),
+            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusFlee, "Flee"),
+            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusMissed, "Missed"),
+            new KeyValuePair<TranslationString, string>(TranslationString.CatchStatusSuccess, "Success"),
             new KeyValuePair<TranslationString, string>(TranslationString.CatchTypeNormal, "Normal"),
             new KeyValuePair<TranslationString, string>(TranslationString.CatchTypeLure, "Lure"),
             new KeyValuePair<TranslationString, string>(TranslationString.CatchTypeIncense, "Incense"),


Fixed clients losing message registration

--- Providers/Network/NetworkClientConnection.cs
+++ Providers/Network/NetworkClientConnection.cs
@@ -143,7 +143,7 @@

 				case (ushort)TempestMessageType.Connected:
 					var msg = (ConnectedMessage)e.Message;
-					this.protocols = msg.EnabledProtocols.ToDictionary (p => p.id);
+					this.protocols = this.protocols.Values.Intersect (msg.EnabledProtocols).ToDictionary (p => p.id);

 					OnConnected (new ClientConnectionEventArgs (this));
 					Interlocked.Decrement (ref this.pendingAsync);


Fixed a pendingAsync and potential lost receive on server connections

--- Providers/Network/NetworkServerConnection.cs
+++ Providers/Network/NetworkServerConnection.cs
@@ -55,7 +55,12 @@
 			asyncArgs.SetBuffer (this.rmessageBuffer, 0, 20480);
 			asyncArgs.Completed += ReliableReceiveCompleted;

-			this.reliableSocket.ReceiveAsync (asyncArgs);
+			int p = Interlocked.Increment (ref this.pendingAsync);
+
+
+			if (!this.reliableSocket.ReceiveAsync (asyncArgs))
+				ReliableReceiveCompleted (this, asyncArgs);
+
 			this.rreader = new BufferValueReader (this.rmessageBuffer);

 			provider.PingFrequencyChanged += ProviderOnPingFrequencyChanged;


Fixed bug in InstrumentModule

Fixed bug in InstrumentModule

--- QDMS.Server/NancyModules/InstrumentModule.cs
+++ QDMS.Server/NancyModules/InstrumentModule.cs
@@ -66,7 +66,7 @@
                 return instruments;
             };

-            Post["/"] = _ =>
+            Post["/", true] = async (parameters, token) =>
             {
                 Instrument instrument = this.BindAndValidate<Instrument>();
                 if (ModelValidationResult.IsValid == false)
@@ -74,7 +74,7 @@
                     return this.ValidationFailure();
                 }

-                var addedInstrument = instrumentRepo.AddInstrument(instrument);
+                var addedInstrument = await instrumentRepo.AddInstrument(instrument);
                 return addedInstrument;
             };


Allow use viewmodel context in custom controls,  obsolete Control property

--- R7.University/components/ViewModelContext.cs
+++ R7.University/components/ViewModelContext.cs
@@ -25,22 +25,31 @@
 // THE SOFTWARE.

 using System;
+using System.Web.UI;
 using DotNetNuke.UI.Modules;

 namespace R7.University
 {
     public class ViewModelContext
     {
+        [Obsolete]
         public IModuleControl Control { get; protected set; }

-        public ModuleInstanceContext Module
+        public string LocalResourceFile { get; protected set; }
+
+        public ModuleInstanceContext Module { get; protected set; }
+
+        public ViewModelContext (IModuleControl module)
         {
-            get { return Control.ModuleContext; }
+            Control = module;
+            Module = module.ModuleContext;
+            LocalResourceFile = module.LocalResourceFile;
         }

-        public ViewModelContext (IModuleControl control)
+        public ViewModelContext (Control control, IModuleControl module)
         {
-            Control = control;
+            Module = module.ModuleContext;
+            LocalResourceFile = DotNetNuke.Web.UI.Utilities.GetLocalResourceFile (control);
         }
     }
 }


Characterization test for failing patches

--- RavenMigrations.Tests/PatchMigrationTests.cs
+++ RavenMigrations.Tests/PatchMigrationTests.cs
@@ -1,4 +1,5 @@
 using System.Linq;
+using System.Text;
 using FluentAssertions;
 using Raven.Abstractions.Data;
 using Raven.Abstractions.Indexing;
@@ -26,6 +27,25 @@
                     sampleDocument.Name.Should().Be("woot patched");
                     var otherSampleDocument = session.Load<OtherSampleDoc>("other-sample-document");
                     otherSampleDocument.Name.Should().Be("woot");
+                }
+            }
+        }
+
+        [Fact]
+        public void Bad_patches_should_cause_errors()
+        {
+            var collector = new AttributeBasedMigrationCollector(new DefaultMigrationResolver(),
+                () => new[] {typeof (CreateDocument), typeof (BlowUp)});
+
+            using (var store = NewDocumentStore())
+            {
+                Runner.Run(store, migrationCollector: collector);
+                using (var session = store.OpenSession())
+                {
+                    var migration = collector.GetOrderedMigrations(new string[] {}).Last();
+
+                    var sampleDocument = session.Load<MigrationDocument>(migration.GetMigrationId());
+                    Assert.True(sampleDocument.HasError);
                 }
             }
         }
@@ -139,6 +159,17 @@
 "; }
         }
     }
+
+    [Migration(4)]
+    internal class BlowUp : CollectionPatchMigration<SampleDoc>
+    {
+        public override string UpPatch
+        {
+            get { return @"
+WillBlowUp().Something();
+"; }
+        }
+    }

     [Migration(3)]
     internal class PatchByIndex : IndexPatchMigration<SampleDocIndex>


Fix some whitespace issues w/ the previous commit.

--- RestSharp/Authenticators/OAuth/OAuthTools.cs
+++ RestSharp/Authenticators/OAuth/OAuthTools.cs
@@ -315,12 +315,12 @@

 					break;
 				}
-                case OAuthSignatureMethod.PlainText:
-                {
-                    signature = "{0}&{1}".FormatWith(consumerSecret, tokenSecret);
-
-                    break;
-                }
+				case OAuthSignatureMethod.PlainText:
+				{
+				    signature = "{0}&{1}".FormatWith(consumerSecret, tokenSecret);
+
+				    break;
+				}
 				default:
 					throw new NotImplementedException("Only HMAC-SHA1 is currently supported.");
 			}


Bump content major version

Bump content major version

--- RuneScapeCacheTools/Utility/ClientDetails.cs
+++ RuneScapeCacheTools/Utility/ClientDetails.cs
@@ -29,7 +29,7 @@

         private static Dictionary<string, string>? _cachedAppletParams;

-        private static Tuple<int, int> _buildNumber = new Tuple<int, int>(913, 1);
+        private static Tuple<int, int> _buildNumber = new Tuple<int, int>(914, 1);

         public static string GetContentServerHostname()
         {


Minor fix in EditorViewAdapter to prevent occasional crush

--- Irony.GrammarExplorer/Highlighter/EditorViewAdapter.cs
+++ Irony.GrammarExplorer/Highlighter/EditorViewAdapter.cs
@@ -106,7 +106,7 @@
         var oldData = _data;
         _data = new ViewData(newTree);
         //Now try to figure out tokens that match old Colored tokens
-        if (oldData != null) {
+        if (oldData != null && oldData.Tree != null) {
           DetectAlreadyColoredTokens(oldData.ColoredTokens, _data.Tree.SourceText.Length - oldData.Tree.SourceText.Length);
         }
         _wantsColorize = true;


_Znear on consideration needs to be 1, and so max zoom is 300

--- EDDiscovery/3DMap/FormMap.cs
+++ EDDiscovery/3DMap/FormMap.cs
@@ -26,7 +26,7 @@
         public bool noWindowReposition { get; set; } = false;                       // set externally
         public TravelHistoryControl travelHistoryControl { get; set; } = null;      // set externally

-        const int HELP_VERSION = 2;         // increment this to force help onto the screen of users first time.
+        const int HELP_VERSION = 3;         // increment this to force help onto the screen of users first time.

         public EDDConfig.MapColoursClass MapColours { get; set; } = EDDConfig.Instance.MapColours;

@@ -40,44 +40,40 @@
         private List<IData3DSet> _datasets_bookedmarkedsystems;
         private List<IData3DSet> _datasets_notedsystems;

-        private const double ZoomMax = 500;
+        StarGrids _stargrids;                   // holds stars
+
+        StarNamesList _starnameslist;           // holds named stars
+        Timer _starnametimer = new Timer();
+
+        private AutoCompleteStringCollection _systemNames;
+
+        private ISystem _centerSystem;
+        private ISystem _homeSystem;
+        private ISystem _historySelection;
+        private ISystem _clickedSystem;         // left clicked on a system/bookmark system/noted system
+        private Vector3 _clickedposition;       // left clicked on a position
+
+        private bool _loaded = false;
+        private float _zoom = 1.0f;
+
+        private Vector3 _cameraPos = Vector3.Zero;
+        private Vector3 _cameraDir = Vector3.Zero;
+        private float _cameraFov = (float)(Math.PI / 2.0f);         // Camera, in radians, 180/2 = 90 degrees
+
+        private const double ZoomMax = 300;
         private const double ZoomMin = 0.01;
         private const double ZoomFact = 1.2589254117941672104239541063958;
-        private const double CameraSlewTime = 1.0;
-
-        StarGrids _stargrids;
-
-        //        List<SystemClassStarNames> _starnames = null;    // star list combines data base and travelled h
-        //        Dictionary<string, SystemClassStarNames> _starnamelookup; // and a dictionary to above since its so slow to do a search
-
-        private AutoCompleteStringCollection _systemNames;
-        private ISystem _centerSystem;
-        private ISystem _homeSystem;
-
-        private ISystem _clickedSystem;        // left clicked on a system/bookmark system/noted system
-        private Vector3 _clickedposition;                   // left clicked on a position
-
-        private ISystem _historySelection;
-        private bool _loaded = false;
-
-        private float _zoom = 1.0f;
-
-        private Vector3 _cameraPos = Vector3.Zero;
-        private Vector3 _cameraDir = Vector3.Zero;
-
+
         private Vector3 _cameraActionMovement = Vector3.Zero;
         private Vector3 _cameraActionRotation = Vector3.Zero;
-        private float _cameraFov = (float)(Math.PI / 2.0f);
-        private float _cameraSlewProgress = 1.0f;
+        private const double CameraSlewTime = 1.0;                  // Controls speed of slew
+        private float _cameraSlewProgress = 1.0f;                   // 0 -> 1 slew progress
         private Vector3 _cameraSlewPosition;

         private KeyboardActions _kbdActions = new KeyboardActions();
         private long _oldTickCount = DateTime.Now.Ticks / 10000;
         private int _ticks = 0;
-
-        StarNamesList _starnameslist;
-        Timer _starnametimer = new Timer();
-
+
         private Point _mouseStartRotate;
         private Point _mouseStartTranslateXY;
         private Point _mouseStartTranslateXZ;
@@ -85,8 +81,7 @@
         private Point _mouseHover;
         Timer _mousehovertick = new Timer();
         System.Windows.Forms.ToolTip _mousehovertooltip = null;
-
-
+
         private float _defaultZoom;
         private List<SystemClass> _referenceSystems { get; set; }
         public List<VisitedSystemsClass> _visitedSystems { get; set; }
@@ -497,10 +492,10 @@
             if (w == 0 || h == 0) return;

             if (toolStripButtonPerspective.Checked)
-            {
+            {                                                                   // Fov, perspective, znear, zfar
                 Matrix4 perspective = Matrix4.CreatePerspectiveFieldOfView(_cameraFov, (float)w / h, 1.0f, 1000000.0f);
                 GL.LoadMatrix(ref perspective);
-                _znear = 0.00000000000001f;     // very small positive value.. needed to be low so zoom=500 works.. may need revisiting
+                _znear = 1.0f;
             }
             else
             {


Handles non-zero mean signals

Handles non-zero mean signals

--- LiveSPICE/Controls/Oscilloscope/OscilloscopeControl.cs
+++ LiveSPICE/Controls/Oscilloscope/OscilloscopeControl.cs
@@ -107,7 +107,7 @@
         }

         protected long clock = 0;
-        protected double Vmax;
+        protected double Vmax, Vmean;
         protected Point? tracePoint;

         public OscilloscopeControl()
@@ -181,8 +181,9 @@

                     // Compute statistics of the clock signal.
                     align = stats.Count;
-                    peak = stats.Max(i => Math.Abs(i), 0.0);
-                    rms = Math.Sqrt(stats.Sum(i => i * i) / stats.Count);
+                    Vmean = stats.Sum() / stats.Count;
+                    peak = stats.Max(i => Math.Abs(i - Vmean), 0.0);
+                    rms = Math.Sqrt(stats.Sum(i => (i - Vmean) * (i - Vmean)) / stats.Count);

                     int Decimate = 1 << (int)Math.Floor(Math.Log((double)sampleRate / 24000, 2));
                     int BlockSize = 8192;
@@ -240,7 +241,7 @@
             if (stats != null)
             {
                 lock (stats) DrawSignal(DC, bounds, stats, align - (int)(stats.Clock - sync));
-                DrawStatistics(DC, bounds, stats.Pen.Brush, peak, rms, f0);
+                DrawStatistics(DC, bounds, stats.Pen.Brush, peak, Vmean, rms, f0);
             }

             if (tracePoint.HasValue)
@@ -298,7 +299,7 @@

             Typeface typeface = new Typeface(FontFamily, FontStyle, FontWeight, FontStretch);

-            for (double v = -Vmax + (2 * Vmax - (labels * dv)) / 2; v < Vmax; v += dv)
+            for (double v = -Vmax + (2 * Vmax - (labels * dv)) / 2 + Vmean; v < Vmax + Vmean; v += dv)
             {
                 double y = MapFromSignal(Bounds, v);
                 if (y + 10 < (Bounds.Top + Bounds.Bottom) / 2 ||
@@ -382,13 +383,14 @@
             DC.DrawText(volts, new Point(Bounds.Right - volts.Width - 4, At.Y));
         }

-        protected void DrawStatistics(DrawingContext DC, Rect Bounds, Brush Brush, double Peak, double Rms, double Freq)
+        protected void DrawStatistics(DrawingContext DC, Rect Bounds, Brush Brush, double Peak, double Mean, double Rms, double Freq)
         {
             FormattedText stats = new FormattedText(
                 String.Format(
-                    "\u0192\u2080:   {0}\nPeak: {1}\nRms:  {2}",
+                    "\u0192\u2080:   {0}\nPeak: {1}\nMean: {2}\nRms:  {3}",
                     FrequencyToString(Freq),
                     Circuit.Quantity.ToString(Peak, Circuit.Units.V, "+G3"),
+                    Circuit.Quantity.ToString(Mean, Circuit.Units.V, "+G3"),
                     Circuit.Quantity.ToString(Rms, Circuit.Units.V, "+G3")),
                 System.Globalization.CultureInfo.CurrentCulture,
                 System.Windows.FlowDirection.LeftToRight,
@@ -402,8 +404,8 @@

         private int MapToSample(Rect Bounds, double x, int shift) { return (int)Math.Round(((x - Bounds.Right) * zoom * (double)sampleRate) / Bounds.Width) + shift; }

-        private double MapToSignal(Rect Bounds, double y) { return Vmax - (y - Bounds.Top) * 2 * Vmax / Bounds.Height; }
-        private double MapFromSignal(Rect Bounds, double v) { return Bounds.Top + ((Vmax - v) / (2 * Vmax) * Bounds.Height); }
+        private double MapToSignal(Rect Bounds, double y) { return Vmax - (y - Bounds.Top) * 2 * Vmax / Bounds.Height + Vmean; }
+        private double MapFromSignal(Rect Bounds, double v) { return Bounds.Top + ((Vmax - (v - Vmean)) / (2 * Vmax) * Bounds.Height); }

         private string FrequencyToString(double f)
         {


temp fix for crash at char selection

temp fix for crash at char selection

--- TCC.Core/Parsing/Messages/S_GET_USER_LIST.cs
+++ TCC.Core/Parsing/Messages/S_GET_USER_LIST.cs
@@ -82,7 +82,7 @@
                 c.face = reader.ReadInt32();
                 c.appearance = reader.ReadInt64();
                 //if(reader.Version < 321150 || reader.Version > 321600)
-                    reader.Skip(8);
+                reader.Skip(8);
                 c.unk10 = reader.ReadInt32();
                 c.unk11 = reader.ReadInt32();
                 c.unk12 = reader.ReadInt32();
@@ -121,16 +121,23 @@
                 c.weaponEnchant = reader.ReadInt32();
                 c.curRestExp = reader.ReadInt32();
                 c.maxRestExp = reader.ReadInt32();
-                reader.Skip(1); //bool showFace
-                reader.Skip(31 * 8); //floats accTransform
-                reader.Skip(4 + 1); //uint unk, byte unk
-                reader.Skip(1); //bool showStyle
-                c.curRestExpPerc = reader.ReadInt32(); //unk25 from tera-data?
-                c.achiPoints = reader.ReadInt32();
-                c.laurel = reader.ReadInt32();
-                c.pos = reader.ReadInt32();
-                c.guildId = reader.ReadInt32();
-
+                try
+                {
+                    reader.Skip(1); //bool showFace
+                    reader.Skip(30 * 4); //floats accTransform
+                    reader.Skip(1);
+                    reader.Skip(4 + 1); //uint unk, byte unk
+                    reader.Skip(1); //bool showStyle
+                    c.curRestExpPerc = reader.ReadInt32(); //unk25 from tera-data?
+                    c.achiPoints = reader.ReadInt32();
+                    c.laurel = reader.ReadInt32();
+                    c.pos = reader.ReadInt32();
+                    c.guildId = reader.ReadInt32();
+                }
+                catch (Exception)
+                {
+
+                }
                 reader.BaseStream.Position = nameOffset - 4;
                 c.name = reader.ReadTeraString();

@@ -165,7 +172,7 @@
         public int unk1;
         public short nameOffset, detailsOffset, detailsCount, details2offset, details2count, guildOffset;
         public uint id;
-        public int  gender, race, charClass, level, unk2, unk3;
+        public int gender, race, charClass, level, unk2, unk3;
         public long lastOnline;
         public byte unk4;
         public int unk5, unk6, unk7, unk8;


Clean up 'AssemblyInfo.cs'.

Clean up 'AssemblyInfo.cs'.

The new 'csproj' format obsoleted most of this file, and there's no
benefit in retaining the commented-out portions.

--- McSherry.SemanticVersioning/Properties/AssemblyInfo.cs
+++ McSherry.SemanticVersioning/Properties/AssemblyInfo.cs
@@ -1,4 +1,4 @@
-// Copyright (c) 2015-16 Liam McSherry
+// Copyright (c) 2015-20 Liam McSherry
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -23,29 +23,9 @@

 using CLSCompliantAttribute = System.CLSCompliantAttribute;

-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-//[assembly: AssemblyTitle("Semantic Versioning for .NET")]
-//[assembly: AssemblyProduct("Semantic Versioning for .NET")]
-//[assembly: AssemblyCopyright("Copyright 2015-16 © Liam McSherry")]
+// Since the introduction of the new 'csproj' format, there's no need to specify
+// author, version, etc. metadata in an 'AssemblyInfo.cs' file, so we're only
+// using it here since it's the most appropriate place to put assembly attributes.
 [assembly: AssemblyCulture("")]
 [assembly: InternalsVisibleTo("McSherry.SemanticVersioning.Testing")]
 [assembly: CLSCompliant(true)]
-
-// We're using Semantic Versioning for the library, but this doesn't translate
-// exactly to .NET versioning. To get around this, we're going to specify two
-// version attributes:
-//
-//  [AssemblyInformationalVersion]: We're using this for the "actual" (semantic)
-//                                  version number.
-//
-//               [AssemblyVersion]: This will track the "actual" version number's
-//                                  major and minor versions. This should allow any
-//                                  patched versions to be swapped out without
-//                                  needing a recompile (e.g. you built against
-//                                  v1.0.0, but you should be able to use v1.0.1 or
-//                                  v1.0.2 without needing to recompile).
-//
-//[assembly: AssemblyVersion("1.2.0.0")]
-//[assembly: AssemblyInformationalVersion("1.2.0")]


Changed some properties (automated).

Changed some properties (automated).

--- TPMapEditor/TPMapEditor/MainForm.Designer.cs
+++ TPMapEditor/TPMapEditor/MainForm.Designer.cs
@@ -21,47 +21,48 @@
         /// </summary>
         private void InitializeComponent()
         {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
-            this.PrimaryContextMenuStrip = new System.Windows.Forms.MenuStrip();
-            this.FileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.NewFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.LoadFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.FirstFileMenuSeparator = new System.Windows.Forms.ToolStripSeparator();
-            this.SaveFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.SaveAsFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.SecondFileMenuSeparator = new System.Windows.Forms.ToolStripSeparator();
-            this.QuitFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.noMapLoadedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-            this.OpenMapDialog = new System.Windows.Forms.OpenFileDialog();
-            this.PrimaryMapStatusStrip = new System.Windows.Forms.StatusStrip();
-            this.TitleStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
-            this.TilesetStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
-            this.BackgroundStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
-            this.SizeStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
-            this.TileSizeStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
-            this.PrimaryContextMenuStrip.SuspendLayout();
-            this.PrimaryMapStatusStrip.SuspendLayout();
-            this.SuspendLayout();
-            //
-            // PrimaryContextMenuStrip
-            //
-            this.PrimaryContextMenuStrip.BackColor = System.Drawing.SystemColors.Control;
-            this.PrimaryContextMenuStrip.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
-            this.PrimaryContextMenuStrip.Font = new System.Drawing.Font("Segoe UI Light", 13.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
-            this.PrimaryContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+			this.PrimaryContextMenuStrip = new System.Windows.Forms.MenuStrip();
+			this.FileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.NewFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.LoadFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.FirstFileMenuSeparator = new System.Windows.Forms.ToolStripSeparator();
+			this.SaveFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.SaveAsFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.SecondFileMenuSeparator = new System.Windows.Forms.ToolStripSeparator();
+			this.QuitFileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.noMapLoadedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+			this.OpenMapDialog = new System.Windows.Forms.OpenFileDialog();
+			this.PrimaryMapStatusStrip = new System.Windows.Forms.StatusStrip();
+			this.TitleStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+			this.TilesetStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+			this.BackgroundStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+			this.SizeStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+			this.TileSizeStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+			this.SaveMapDialog = new System.Windows.Forms.SaveFileDialog();
+			this.PrimaryContextMenuStrip.SuspendLayout();
+			this.PrimaryMapStatusStrip.SuspendLayout();
+			this.SuspendLayout();
+			//
+			// PrimaryContextMenuStrip
+			//
+			this.PrimaryContextMenuStrip.BackColor = System.Drawing.SystemColors.Control;
+			this.PrimaryContextMenuStrip.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+			this.PrimaryContextMenuStrip.Font = new System.Drawing.Font("Segoe UI Light", 13.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
+			this.PrimaryContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.FileMenuItem});
-            this.PrimaryContextMenuStrip.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow;
-            this.PrimaryContextMenuStrip.Location = new System.Drawing.Point(0, 0);
-            this.PrimaryContextMenuStrip.Name = "PrimaryContextMenuStrip";
-            this.PrimaryContextMenuStrip.Padding = new System.Windows.Forms.Padding(0);
-            this.PrimaryContextMenuStrip.Size = new System.Drawing.Size(984, 23);
-            this.PrimaryContextMenuStrip.TabIndex = 0;
-            this.PrimaryContextMenuStrip.Text = "MainMenuStrip";
-            //
-            // FileMenuItem
-            //
-            this.FileMenuItem.BackColor = System.Drawing.SystemColors.Control;
-            this.FileMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+			this.PrimaryContextMenuStrip.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow;
+			this.PrimaryContextMenuStrip.Location = new System.Drawing.Point(0, 0);
+			this.PrimaryContextMenuStrip.Name = "PrimaryContextMenuStrip";
+			this.PrimaryContextMenuStrip.Padding = new System.Windows.Forms.Padding(0);
+			this.PrimaryContextMenuStrip.Size = new System.Drawing.Size(984, 23);
+			this.PrimaryContextMenuStrip.TabIndex = 0;
+			this.PrimaryContextMenuStrip.Text = "MainMenuStrip";
+			//
+			// FileMenuItem
+			//
+			this.FileMenuItem.BackColor = System.Drawing.SystemColors.Control;
+			this.FileMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.NewFileMenuItem,
             this.LoadFileMenuItem,
             this.FirstFileMenuSeparator,
@@ -69,160 +70,192 @@
             this.SaveAsFileMenuItem,
             this.SecondFileMenuSeparator,
             this.QuitFileMenuItem});
-            this.FileMenuItem.Name = "FileMenuItem";
-            this.FileMenuItem.Size = new System.Drawing.Size(41, 23);
-            this.FileMenuItem.Text = "File";
-            //
-            // NewFileMenuItem
-            //
-            this.NewFileMenuItem.Name = "NewFileMenuItem";
-            this.NewFileMenuItem.Size = new System.Drawing.Size(152, 24);
-            this.NewFileMenuItem.Text = "New...";
-            //
-            // LoadFileMenuItem
-            //
-            this.LoadFileMenuItem.Name = "LoadFileMenuItem";
-            this.LoadFileMenuItem.Size = new System.Drawing.Size(152, 24);
-            this.LoadFileMenuItem.Text = "Load...";
-            this.LoadFileMenuItem.ToolTipText = "Click to load a map.";
-            this.LoadFileMenuItem.Click += new System.EventHandler(this.LoadFileMenuItem_Click);
-            //
-            // FirstFileMenuSeparator
-            //
-            this.FirstFileMenuSeparator.BackColor = System.Drawing.SystemColors.Control;
-            this.FirstFileMenuSeparator.ForeColor = System.Drawing.SystemColors.Control;
-            this.FirstFileMenuSeparator.Name = "FirstFileMenuSeparator";
-            this.FirstFileMenuSeparator.Size = new System.Drawing.Size(149, 6);
-            //
-            // SaveFileMenuItem
-            //
-            this.SaveFileMenuItem.Name = "SaveFileMenuItem";
-            this.SaveFileMenuItem.Size = new System.Drawing.Size(152, 24);
-            this.SaveFileMenuItem.Text = "Save";
-            //
-            // SaveAsFileMenuItem
-            //
-            this.SaveAsFileMenuItem.Name = "SaveAsFileMenuItem";
-            this.SaveAsFileMenuItem.Size = new System.Drawing.Size(152, 24);
-            this.SaveAsFileMenuItem.Text = "Save As...";
-            //
-            // SecondFileMenuSeparator
-            //
-            this.SecondFileMenuSeparator.Name = "SecondFileMenuSeparator";
-            this.SecondFileMenuSeparator.Size = new System.Drawing.Size(149, 6);
-            //
-            // QuitFileMenuItem
-            //
-            this.QuitFileMenuItem.BackColor = System.Drawing.SystemColors.Control;
-            this.QuitFileMenuItem.Font = new System.Drawing.Font("Segoe UI Light", 9.5F);
-            this.QuitFileMenuItem.Name = "QuitFileMenuItem";
-            this.QuitFileMenuItem.Size = new System.Drawing.Size(152, 24);
-            this.QuitFileMenuItem.Text = "Quit";
-            this.QuitFileMenuItem.ToolTipText = "Click to exit the map editor.";
-            this.QuitFileMenuItem.Click += new System.EventHandler(this.QuitFileMenuItem_Click);
-            //
-            // noMapLoadedToolStripMenuItem
-            //
-            this.noMapLoadedToolStripMenuItem.Name = "noMapLoadedToolStripMenuItem";
-            this.noMapLoadedToolStripMenuItem.Size = new System.Drawing.Size(159, 22);
-            this.noMapLoadedToolStripMenuItem.Text = "No map loaded.";
-            //
-            // OpenMapDialog
-            //
-            this.OpenMapDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.OpenMapDialog_FileOk);
-            //
-            // PrimaryMapStatusStrip
-            //
-            this.PrimaryMapStatusStrip.BackColor = System.Drawing.SystemColors.Control;
-            this.PrimaryMapStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+			this.FileMenuItem.Name = "FileMenuItem";
+			this.FileMenuItem.Size = new System.Drawing.Size(41, 23);
+			this.FileMenuItem.Text = "File";
+			//
+			// NewFileMenuItem
+			//
+			this.NewFileMenuItem.Name = "NewFileMenuItem";
+			this.NewFileMenuItem.Padding = new System.Windows.Forms.Padding(0);
+			this.NewFileMenuItem.ShortcutKeyDisplayString = "Ctrl+N";
+			this.NewFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
+			this.NewFileMenuItem.Size = new System.Drawing.Size(203, 22);
+			this.NewFileMenuItem.Text = "New...";
+			this.NewFileMenuItem.ToolTipText = "Click to create a new map.";
+			this.NewFileMenuItem.Click += new System.EventHandler(this.NewFileMenuItem_Click);
+			//
+			// LoadFileMenuItem
+			//
+			this.LoadFileMenuItem.Name = "LoadFileMenuItem";
+			this.LoadFileMenuItem.Padding = new System.Windows.Forms.Padding(0);
+			this.LoadFileMenuItem.ShortcutKeyDisplayString = "Ctrl+O";
+			this.LoadFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+			this.LoadFileMenuItem.Size = new System.Drawing.Size(203, 22);
+			this.LoadFileMenuItem.Text = "Load...";
+			this.LoadFileMenuItem.ToolTipText = "Click to load a map.";
+			this.LoadFileMenuItem.Click += new System.EventHandler(this.LoadFileMenuItem_Click);
+			//
+			// FirstFileMenuSeparator
+			//
+			this.FirstFileMenuSeparator.BackColor = System.Drawing.SystemColors.Control;
+			this.FirstFileMenuSeparator.ForeColor = System.Drawing.SystemColors.Control;
+			this.FirstFileMenuSeparator.Name = "FirstFileMenuSeparator";
+			this.FirstFileMenuSeparator.Size = new System.Drawing.Size(200, 6);
+			//
+			// SaveFileMenuItem
+			//
+			this.SaveFileMenuItem.Name = "SaveFileMenuItem";
+			this.SaveFileMenuItem.Padding = new System.Windows.Forms.Padding(0);
+			this.SaveFileMenuItem.ShortcutKeyDisplayString = "Ctrl+S";
+			this.SaveFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+			this.SaveFileMenuItem.Size = new System.Drawing.Size(203, 22);
+			this.SaveFileMenuItem.Text = "Save";
+			this.SaveFileMenuItem.ToolTipText = "Click to save the current map.";
+			this.SaveFileMenuItem.Click += new System.EventHandler(this.SaveFileMenuItem_Click);
+			//
+			// SaveAsFileMenuItem
+			//
+			this.SaveAsFileMenuItem.Name = "SaveAsFileMenuItem";
+			this.SaveAsFileMenuItem.Padding = new System.Windows.Forms.Padding(0);
+			this.SaveAsFileMenuItem.ShortcutKeyDisplayString = "Ctrl+Alt+S";
+			this.SaveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Alt)
+            | System.Windows.Forms.Keys.S)));
+			this.SaveAsFileMenuItem.Size = new System.Drawing.Size(203, 22);
+			this.SaveAsFileMenuItem.Text = "Save As...";
+			this.SaveAsFileMenuItem.ToolTipText = "Click to save the current map as...";
+			this.SaveAsFileMenuItem.Click += new System.EventHandler(this.SaveAsFileMenuItem_Click);
+			//
+			// SecondFileMenuSeparator
+			//
+			this.SecondFileMenuSeparator.Name = "SecondFileMenuSeparator";
+			this.SecondFileMenuSeparator.Size = new System.Drawing.Size(200, 6);
+			//
+			// QuitFileMenuItem
+			//
+			this.QuitFileMenuItem.BackColor = System.Drawing.SystemColors.Control;
+			this.QuitFileMenuItem.Font = new System.Drawing.Font("Segoe UI Light", 9.5F);
+			this.QuitFileMenuItem.Name = "QuitFileMenuItem";
+			this.QuitFileMenuItem.Padding = new System.Windows.Forms.Padding(0);
+			this.QuitFileMenuItem.ShortcutKeyDisplayString = "Ctrl+W";
+			this.QuitFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W)));
+			this.QuitFileMenuItem.Size = new System.Drawing.Size(203, 22);
+			this.QuitFileMenuItem.Text = "Quit";
+			this.QuitFileMenuItem.ToolTipText = "Click to exit the map editor.";
+			this.QuitFileMenuItem.Click += new System.EventHandler(this.QuitFileMenuItem_Click);
+			//
+			// noMapLoadedToolStripMenuItem
+			//
+			this.noMapLoadedToolStripMenuItem.Name = "noMapLoadedToolStripMenuItem";
+			this.noMapLoadedToolStripMenuItem.Size = new System.Drawing.Size(159, 22);
+			this.noMapLoadedToolStripMenuItem.Text = "No map loaded.";
+			//
+			// OpenMapDialog
+			//
+			this.OpenMapDialog.DefaultExt = "tpm";
+			this.OpenMapDialog.Filter = "The Teleporter Map (*.tpm)|*.tpm";
+			this.OpenMapDialog.Title = "Load Map";
+			this.OpenMapDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.OpenMapDialog_FileOk);
+			//
+			// PrimaryMapStatusStrip
+			//
+			this.PrimaryMapStatusStrip.BackColor = System.Drawing.SystemColors.Control;
+			this.PrimaryMapStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.TitleStripStatusLabel,
             this.TilesetStripStatusLabel,
             this.BackgroundStripStatusLabel,
             this.SizeStripStatusLabel,
             this.TileSizeStripStatusLabel});
-            this.PrimaryMapStatusStrip.Location = new System.Drawing.Point(0, 532);
-            this.PrimaryMapStatusStrip.Name = "PrimaryMapStatusStrip";
-            this.PrimaryMapStatusStrip.Size = new System.Drawing.Size(984, 29);
-            this.PrimaryMapStatusStrip.SizingGrip = false;
-            this.PrimaryMapStatusStrip.TabIndex = 1;
-            this.PrimaryMapStatusStrip.Text = "statusStrip1";
-            //
-            // TitleStripStatusLabel
-            //
-            this.TitleStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
-            this.TitleStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.TitleStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
-            this.TitleStripStatusLabel.Name = "TitleStripStatusLabel";
-            this.TitleStripStatusLabel.Size = new System.Drawing.Size(192, 23);
-            this.TitleStripStatusLabel.Spring = true;
-            this.TitleStripStatusLabel.Text = "Title:";
-            //
-            // TilesetStripStatusLabel
-            //
-            this.TilesetStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
-            this.TilesetStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
-            this.TilesetStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.TilesetStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
-            this.TilesetStripStatusLabel.Name = "TilesetStripStatusLabel";
-            this.TilesetStripStatusLabel.Size = new System.Drawing.Size(192, 23);
-            this.TilesetStripStatusLabel.Spring = true;
-            this.TilesetStripStatusLabel.Text = "Tileset:";
-            //
-            // BackgroundStripStatusLabel
-            //
-            this.BackgroundStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
-            this.BackgroundStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
-            this.BackgroundStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.BackgroundStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
-            this.BackgroundStripStatusLabel.Name = "BackgroundStripStatusLabel";
-            this.BackgroundStripStatusLabel.Size = new System.Drawing.Size(192, 23);
-            this.BackgroundStripStatusLabel.Spring = true;
-            this.BackgroundStripStatusLabel.Text = "Background:";
-            //
-            // SizeStripStatusLabel
-            //
-            this.SizeStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
-            this.SizeStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
-            this.SizeStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.SizeStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
-            this.SizeStripStatusLabel.Name = "SizeStripStatusLabel";
-            this.SizeStripStatusLabel.Size = new System.Drawing.Size(192, 23);
-            this.SizeStripStatusLabel.Spring = true;
-            this.SizeStripStatusLabel.Text = "Size:";
-            //
-            // TileSizeStripStatusLabel
-            //
-            this.TileSizeStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
-            this.TileSizeStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
-            this.TileSizeStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.TileSizeStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
-            this.TileSizeStripStatusLabel.Name = "TileSizeStripStatusLabel";
-            this.TileSizeStripStatusLabel.Size = new System.Drawing.Size(192, 23);
-            this.TileSizeStripStatusLabel.Spring = true;
-            this.TileSizeStripStatusLabel.Text = "Tile size:";
-            //
-            // MainForm
-            //
-            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.BackColor = System.Drawing.SystemColors.Window;
-            this.ClientSize = new System.Drawing.Size(984, 561);
-            this.Controls.Add(this.PrimaryMapStatusStrip);
-            this.Controls.Add(this.PrimaryContextMenuStrip);
-            this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
-            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
-            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
-            this.MainMenuStrip = this.PrimaryContextMenuStrip;
-            this.MaximizeBox = false;
-            this.Name = "MainForm";
-            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
-            this.Text = "The Teleporter - Map Editor";
-            this.PrimaryContextMenuStrip.ResumeLayout(false);
-            this.PrimaryContextMenuStrip.PerformLayout();
-            this.PrimaryMapStatusStrip.ResumeLayout(false);
-            this.PrimaryMapStatusStrip.PerformLayout();
-            this.ResumeLayout(false);
-            this.PerformLayout();
+			this.PrimaryMapStatusStrip.Location = new System.Drawing.Point(0, 532);
+			this.PrimaryMapStatusStrip.Name = "PrimaryMapStatusStrip";
+			this.PrimaryMapStatusStrip.Size = new System.Drawing.Size(984, 29);
+			this.PrimaryMapStatusStrip.SizingGrip = false;
+			this.PrimaryMapStatusStrip.TabIndex = 1;
+			this.PrimaryMapStatusStrip.Text = "statusStrip1";
+			//
+			// TitleStripStatusLabel
+			//
+			this.TitleStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
+			this.TitleStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+			this.TitleStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
+			this.TitleStripStatusLabel.Name = "TitleStripStatusLabel";
+			this.TitleStripStatusLabel.Size = new System.Drawing.Size(192, 23);
+			this.TitleStripStatusLabel.Spring = true;
+			this.TitleStripStatusLabel.Text = "Title:";
+			//
+			// TilesetStripStatusLabel
+			//
+			this.TilesetStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
+			this.TilesetStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
+			this.TilesetStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+			this.TilesetStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
+			this.TilesetStripStatusLabel.Name = "TilesetStripStatusLabel";
+			this.TilesetStripStatusLabel.Size = new System.Drawing.Size(192, 23);
+			this.TilesetStripStatusLabel.Spring = true;
+			this.TilesetStripStatusLabel.Text = "Tileset:";
+			//
+			// BackgroundStripStatusLabel
+			//
+			this.BackgroundStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
+			this.BackgroundStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
+			this.BackgroundStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+			this.BackgroundStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
+			this.BackgroundStripStatusLabel.Name = "BackgroundStripStatusLabel";
+			this.BackgroundStripStatusLabel.Size = new System.Drawing.Size(192, 23);
+			this.BackgroundStripStatusLabel.Spring = true;
+			this.BackgroundStripStatusLabel.Text = "Background:";
+			//
+			// SizeStripStatusLabel
+			//
+			this.SizeStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
+			this.SizeStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
+			this.SizeStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+			this.SizeStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
+			this.SizeStripStatusLabel.Name = "SizeStripStatusLabel";
+			this.SizeStripStatusLabel.Size = new System.Drawing.Size(192, 23);
+			this.SizeStripStatusLabel.Spring = true;
+			this.SizeStripStatusLabel.Text = "Size:";
+			//
+			// TileSizeStripStatusLabel
+			//
+			this.TileSizeStripStatusLabel.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left;
+			this.TileSizeStripStatusLabel.BorderStyle = System.Windows.Forms.Border3DStyle.Etched;
+			this.TileSizeStripStatusLabel.Font = new System.Drawing.Font("Segoe UI Semilight", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+			this.TileSizeStripStatusLabel.Margin = new System.Windows.Forms.Padding(1, 3, 0, 3);
+			this.TileSizeStripStatusLabel.Name = "TileSizeStripStatusLabel";
+			this.TileSizeStripStatusLabel.Size = new System.Drawing.Size(192, 23);
+			this.TileSizeStripStatusLabel.Spring = true;
+			this.TileSizeStripStatusLabel.Text = "Tile size:";
+			//
+			// SaveMapDialog
+			//
+			this.SaveMapDialog.DefaultExt = "tpm";
+			this.SaveMapDialog.Filter = "The Teleporter Map (*.tpm)|*.tpm";
+			this.SaveMapDialog.Title = "Save Map";
+			this.SaveMapDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.SaveMapDialog_FileOk);
+			//
+			// MainForm
+			//
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.BackColor = System.Drawing.SystemColors.Window;
+			this.ClientSize = new System.Drawing.Size(984, 561);
+			this.Controls.Add(this.PrimaryMapStatusStrip);
+			this.Controls.Add(this.PrimaryContextMenuStrip);
+			this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+			this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+			this.MainMenuStrip = this.PrimaryContextMenuStrip;
+			this.MaximizeBox = false;
+			this.Name = "MainForm";
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+			this.Text = "The Teleporter - Map Editor";
+			this.PrimaryContextMenuStrip.ResumeLayout(false);
+			this.PrimaryContextMenuStrip.PerformLayout();
+			this.PrimaryMapStatusStrip.ResumeLayout(false);
+			this.PrimaryMapStatusStrip.PerformLayout();
+			this.ResumeLayout(false);
+			this.PerformLayout();

         }

@@ -244,6 +277,7 @@
         private System.Windows.Forms.ToolStripStatusLabel BackgroundStripStatusLabel;
         private System.Windows.Forms.ToolStripStatusLabel SizeStripStatusLabel;
         private System.Windows.Forms.ToolStripStatusLabel TileSizeStripStatusLabel;
-    }
+		private System.Windows.Forms.SaveFileDialog SaveMapDialog;
+	}
 }


Correct migration to identity 2.0 on fetching 3rd party oauth

--- TheCollection.Web/Views/Account/Login.cshtml
+++ TheCollection.Web/Views/Account/Login.cshtml
@@ -32,13 +32,13 @@

                     @{
-                        var loginProviders = SignInManager.GetExternalAuthenticationSchemes().ToList();
+                        var loginProviders = (await SignInManager.GetExternalAuthenticationSchemesAsync())  .ToList();
                         <form asp-controller="Account" asp-action="ExternalLogin" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal">

                                     @foreach (var provider in loginProviders)
                                     {
-                                        <button type="submit" class="btn btn-block btn-social btn-@provider.DisplayName.ToLower()" name="provider" value="@provider.AuthenticationScheme" title="Log in using your @provider.DisplayName account">
+                                        <button type="submit" style="cursor: pointer" class="btn btn-block btn-social btn-@provider.DisplayName.ToLower()" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">
                                              Sign in with @provider.DisplayName
                                         </button>
                                     }


Check if any positional arguments are left


Port JS code in Pusher.OnMessage

Port JS code in Pusher.OnMessage


Spacing problem resolved

Spacing problem resolved

--- Trappist/src/Promact.Trappist.Web/Startup.cs
+++ Trappist/src/Promact.Trappist.Web/Startup.cs
@@ -109,7 +109,7 @@
                      defaults: new { controller = "Home", action = "Index" });
             });

-			context.Seed();
+	    context.Seed();

         }
     }


Cleaning up unused field

Cleaning up unused field

--- UI/Editor/ViewModels/SceneEditorViewModel.cs
+++ UI/Editor/ViewModels/SceneEditorViewModel.cs
@@ -11,8 +11,6 @@
     /// the view.
     /// </summary>
     public sealed class SceneEditorViewModel : MonoGameViewModel {
-        private readonly IEntityService _entityService;
-
         /// <summary>
         /// Initializes a new instance of the <see cref="SceneEditorViewModel" /> class.
         /// </summary>
@@ -24,18 +22,14 @@
         /// Initializes a new instance of the <see cref="SceneEditorViewModel" /> class.
         /// </summary>
         /// <param name="editorService">The editor service.</param>
-        /// <param name="entityService">The entity service.</param>
         /// <param name="sceneEditor">The scene editor.</param>
         /// <param name="sceneService">The scene service.</param>
-        /// <param name="selectionService">The selection service.</param>
         [InjectionConstructor]
         public SceneEditorViewModel(
             IEditorService editorService,
-            IEntityService entityService,
             IAvaloniaGame sceneEditor,
             ISceneService sceneService) : base(sceneEditor) {
             this.EditorService = editorService ?? throw new ArgumentNullException(nameof(editorService));
-            this._entityService = entityService ?? throw new ArgumentNullException(nameof(entityService));
             this.SceneService = sceneService ?? throw new ArgumentNullException(nameof(sceneService));

             this.EditorService.CenterCameraRequested += this.EditorService_CenterCameraRequested;


Added regression for #138

Added regression for #138

--- UnitTests/Regressions/IssueReportsFixture.cs
+++ UnitTests/Regressions/IssueReportsFixture.cs
@@ -324,6 +324,34 @@

 		#endregion

+		#region #138
+
+		public class _138
+		{
+			public interface SuperFoo
+			{
+				string Bar { get; set; }
+			}
+			public interface Foo : SuperFoo
+			{
+				string Baz { get; set; }
+			}
+
+			[Fact]
+			public void superFooMockSetupAllProperties()
+			{
+				var fac = new MockFactory(MockBehavior.Default);
+				var superFooMock = fac.Create<SuperFoo>();
+				superFooMock.SetupAllProperties();
+
+				var superFoo = superFooMock.Object;
+				superFoo.Bar = "Bar";
+				Assert.Equal("Bar", superFoo.Bar);
+			}
+		}
+
+		#endregion
+
 #if !SILVERLIGHT
 		// run "netsh http add urlacl url=http://+:7777/ user=[domain]\[user]"
 		// to avoid running the test as an admin


Add failing tests

Add failing tests

These three tests show that `Mock.Raise` does not correctly raise
events of "child mocks" in an expression such as:

    mock.Raise(_ => _.Foo.Bar.Event += null, ...)
                         ^^^^^

--- UnitTests/Regressions/IssueReportsFixture.cs
+++ UnitTests/Regressions/IssueReportsFixture.cs
@@ -522,6 +522,84 @@

 		#endregion

+		#region 166
+
+		public class Issue166
+		{
+			[Fact]
+			public void Events_with_same_name_in_object_graph_can_both_be_raised()
+			{
+				var mock = new Mock<IFoo> { DefaultValue = DefaultValue.Mock };
+
+				var fooEventRaiseCount = 0;
+				mock.Object.Event += (s, e) => ++fooEventRaiseCount;
+
+				var barEventRaiseCount = 0;
+				mock.Object.Bar.Event += (s, e) => ++barEventRaiseCount;
+
+				mock.Raise(x => x.Event += null, EventArgs.Empty);
+				mock.Raise(x => x.Bar.Event += null, EventArgs.Empty);
+
+				Assert.Equal(1, fooEventRaiseCount);
+				Assert.Equal(1, barEventRaiseCount);
+			}
+
+			[Fact]
+			public void Events_with_different_names_in_object_graph_can_both_be_raised()
+			{
+				var mock = new Mock<IFoo> { DefaultValue = DefaultValue.Mock };
+
+				var fooEventRaiseCount = 0;
+				mock.Object.Event += (s, e) => ++fooEventRaiseCount;
+
+				var barAnotherEventRaiseCount = 0;
+				mock.Object.Bar.AnotherEvent += (s, e) => ++barAnotherEventRaiseCount;
+
+				mock.Raise(x => x.Event += null, EventArgs.Empty);
+				mock.Raise(x => x.Bar.AnotherEvent += null, EventArgs.Empty);
+
+				Assert.Equal(1, fooEventRaiseCount);
+				Assert.Equal(1, barAnotherEventRaiseCount);
+			}
+
+			[Fact]
+			public void Event_in_child_mock_can_be_raised_if_parent_object_has_no_events()
+			{
+				var mock = new Mock<IQux>() { DefaultValue = DefaultValue.Mock };
+
+				var quuxEventRaiseCount = 0;
+				mock.Object.Quux.Event += (s, e) => ++quuxEventRaiseCount;
+
+				mock.Raise(x => x.Quux.Event += null, EventArgs.Empty);
+
+				Assert.Equal(1, quuxEventRaiseCount);
+			}
+
+			public interface IFoo
+			{
+				IBar Bar { get; }
+				event EventHandler Event;
+			}
+
+			public interface IBar
+			{
+				event EventHandler Event;
+				event EventHandler AnotherEvent;
+			}
+
+			public interface IQux
+			{
+				IQuux Quux { get; }
+			}
+
+			public interface IQuux : IQux
+			{
+				event EventHandler Event;
+			}
+		}
+
+		#endregion
+
 		#region 175

 		public class Issue175


Add regression tests

Add regression tests

--- UnitTests/Regressions/IssueReportsFixture.cs
+++ UnitTests/Regressions/IssueReportsFixture.cs
@@ -1148,6 +1148,44 @@

 #endregion

+		#region 383
+
+		public class Issue383
+		{
+			[Fact]
+			public void AsInterface_CanSetupMethodOfInterfaceThatClassDoesNotImplement()
+			{
+				var mock = new Mock<DoesNotImplementI>();
+				mock.As<I>().Setup(x => x.Foo()).Returns(42);
+				Assert.Equal(42, (mock.Object as I).Foo());
+			}
+
+			[Fact]
+			public void AsInterface_CanSetupMethodOfInterfaceThatClassImplementsAsNonVirtual()
+			{
+				var mock = new Mock<ImplementsI>();
+				mock.As<I>().Setup(x => x.Foo()).Returns(42);
+				Assert.Equal(42, (mock.Object as I).Foo());
+			}
+
+			public class DoesNotImplementI
+			{
+				public int Foo() => 13;
+			}
+
+			public interface I
+			{
+				int Foo();
+			}
+
+			public class ImplementsI : I
+			{
+				public int Foo() => 13;
+			}
+		}
+
+		#endregion
+
 		// Old @ Google Code

 		#region #47


New Serialize method. The new Deserialize polished.


Itch ShowUpload/CaptureOutput option for debugging.

--- UnityBuild-ItchUploader/Editor/UploadItch.cs
+++ UnityBuild-ItchUploader/Editor/UploadItch.cs
@@ -16,10 +16,13 @@
     [FilePath(false, true, "Path to butler.exe")]
     public string pathToButlerExe = "";
     public string nameOfItchUser = "";
-    public string nameOfItchGame = "";
+    public string nameOfItchGame = "";
     public bool useGeneratedBuildVersion = false;

-    [Header("The following field overrides default channel name (the per-build architecture target), and will be applied to all builds. Use with care.")]
+    [Header("Disable to capture error output for debugging.")]
+    public bool showUploadProgress = true;
+
+    [Header("Use with caution. Override applies to all platforms.")]
     public string itchChannelOverride = "";

     #region Public Methods
@@ -84,23 +87,53 @@

     private void RunScript(string scriptPath, string arguments)
     {
+        // Create and start butler process.
         ProcessStartInfo startInfo = new ProcessStartInfo();
         startInfo.FileName = Path.GetFullPath(scriptPath);
-        startInfo.UseShellExecute = true;
-        startInfo.CreateNoWindow = false;
+        startInfo.UseShellExecute = showUploadProgress;
+        startInfo.CreateNoWindow = !showUploadProgress;
+        startInfo.RedirectStandardOutput = !showUploadProgress;
+        startInfo.RedirectStandardError = !showUploadProgress;

         if (!string.IsNullOrEmpty(arguments))
             startInfo.Arguments = arguments;

         Process proc = Process.Start(startInfo);
+
+        StringBuilder outputText = new StringBuilder();
+        if (!showUploadProgress)
+        {
+            // Capture stdout.
+            proc.OutputDataReceived += (sendingProcess, outputLine) =>
+            {
+                outputText.AppendLine(outputLine.Data);
+            };
+
+            proc.BeginOutputReadLine();
+        }
+
+        // Wait for butler to finish.
         proc.WaitForExit();

+        // Display error if one occurred.
         if (proc.ExitCode != 0)
         {
+            string errString;
+            if (showUploadProgress)
+            {
+                errString = "Run w/ ShowUploadProgress disabled to capture debug output to console.";
+            }
+            else
+            {
+                errString = "Check console window for debug output.";
+            }
+
             BuildNotificationList.instance.AddNotification(new BuildNotification(
                 BuildNotification.Category.Error,
-                "Itch Upload Failed.", string.Format("Exit code: {0}", proc.ExitCode),
+                "Itch Upload Failed.", string.Format("Exit code: {0}\n{1}", proc.ExitCode, errString),
                 true, null));
+
+            UnityEngine.Debug.Log("ITCH.IO BUTLER OUTPUT: " + outputText.ToString());
         }
     }


Fixed the length check.

Fixed the length check.

--- Microsoft.Web.Administration/ConfigurationAttribute.cs
+++ Microsoft.Web.Administration/ConfigurationAttribute.cs
@@ -195,7 +195,7 @@
                 }

                 var length = full.Length - 10;
-                if (length == 0)
+                if (length < 0)
                 {
                     // TODO: why it happens?
                     return "";


rename of TempData to Session

rename of TempData to Session

--- MvcFlash.Core/Providers/TempDataFlashMessageService.cs
+++ MvcFlash.Core/Providers/TempDataFlashMessageService.cs
@@ -1,87 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Web;
-using MvcFlash.Core.Helpers;
-
-namespace MvcFlash.Core.Providers
-{
-    public class SessionFlashMessageService : IFlashMessageService
-    {
-        private readonly HttpContextBase _context;
-        private const string MessagesKey = "mvcflash.core.session.messages";
-        private readonly object _lock = new object();
-
-        private List<object> Messages
-        {
-            get { return (List<object>)_context.Session[MessagesKey]; }
-            set { _context.Session[MessagesKey] = value; }
-        }
-
-        public SessionFlashMessageService(HttpContextBase context = null)
-        {
-            try {
-                _context = context ?? new HttpContextWrapper(HttpContext.Current);
-            }
-            catch (ArgumentNullException e) {
-                throw new ArgumentException("you are not currently running where HttpContext is accessible", e);
-            }
-        }
-
-        public void Push(object message)
-        {
-            lock (_lock)
-            {
-                Messages = Messages ?? new List<dynamic>();
-                var converted = DynamicHelpers.IfAnonymousCovertToExpando(message);
-                Messages.Add(converted);
-            }
-        }
-
-        public ICollection<dynamic> Pop()
-        {
-            lock (_lock)
-            {
-                Messages = Messages ?? new List<dynamic>();
-
-                var temp = new List<dynamic>(Messages);
-                Messages.Clear();
-                return temp;
-            }
-        }
-
-        public ICollection<dynamic> Select(Func<dynamic, bool> where)
-        {
-            lock (_lock)
-            {
-                Messages = Messages ?? new List<dynamic>();
-
-                Func<dynamic, bool> filter = x =>
-                {
-                    try
-                    {
-                        return where.Invoke(x);
-                    }
-                    catch (Exception)
-                    {
-                        return false;
-                    }
-                };
-
-                var temp = new List<dynamic>(Messages.Where(filter).ToList());
-                Messages = Messages.Except(temp).ToList();
-
-                return temp;
-            }
-        }
-
-        public void Clear()
-        {
-            lock (_lock)
-            {
-                if (Messages != null)
-                    Messages.Clear();
-            }
-        }
-    }
-}


Fix missing file changes

Fix missing file changes

--- NBi.Testing/Integration/NUnit/EqualToConstraintTest.cs
+++ NBi.Testing/Integration/NUnit/EqualToConstraintTest.cs
@@ -110,7 +110,7 @@
         {
             //Buiding object used during test
             var rs = new ResultSet();
-            var objs = new List<object[]>() {
+            var objs = new List<object[]>() {
                 new object[] { "CY 2005", 1874469.00 },
                 new object[] { "CY 2006", 4511243.0 },
                 new object[] { "CY 2007", 4709851 },
@@ -193,7 +193,7 @@
             //Buiding object used during test
             var expectedQuery = "WITH MEMBER [Measures].NewAmount AS [Measures].[Amount]+1";
             expectedQuery += " SELECT [Measures].NewAmount ON 0, ([Date].[Calendar].[Calendar Year].[CY 2005]:[Date].[Calendar].[Calendar Year].[CY 2008]) ON 1  FROM [Adventure Works]";
-            var expectedCmd   = new AdomdCommand(expectedQuery, new AdomdConnection(ConnectionStringReader.GetAdomd()));
+            var expectedCmd = new AdomdCommand(expectedQuery, new AdomdConnection(ConnectionStringReader.GetAdomd()));
             var service = new QueryResultSetService(expectedCmd);
             var ctr = new EqualToConstraint(service);
             ctr.Using(new SettingsResultSetComparisonByIndex(
@@ -412,17 +412,18 @@
             var expectedCmd = new SqlCommand(expectedQuery, new SqlConnection(ConnectionStringReader.GetSqlClient()));

             var columns = new List<IColumnDefinition>(){
-                (new Column() { Index = 1, Role = ColumnRole.Value, Type = ColumnType.DateTime }
-            };
-
-            var ctr = new EqualToConstraint(expectedCmd);
-            ctr.Using(
-                    new SettingsResultSetComparisonByIndex(
-                        SettingsResultSetComparisonByIndex.KeysChoice.AllExpectLast,
-                        SettingsResultSetComparisonByIndex.ValuesChoice.Last,
-                        columns
-                    )
-                );
+                new Column() { Index = 1, Role = ColumnRole.Value, Type = ColumnType.DateTime }
+            };
+
+            var service = new QueryResultSetService(expectedCmd);
+            var ctr = new EqualToConstraint(service);
+            ctr.Using(
+                                new SettingsResultSetComparisonByIndex(
+                                    SettingsResultSetComparisonByIndex.KeysChoice.AllExpectLast,
+                                    SettingsResultSetComparisonByIndex.ValuesChoice.Last,
+                                    columns
+                                )
+                            );

             var query = "SELECT 'CY 2010',  '1/01/2010 01:00:00'";
             var cmd = new SqlCommand(query, new SqlConnection(ConnectionStringReader.GetSqlClient()));


Comment fix

Comment fix

--- Nav.Language.Extension/CSharp/GoToNav/GoToNavTagger.cs
+++ Nav.Language.Extension/CSharp/GoToNav/GoToNavTagger.cs
@@ -169,7 +169,6 @@

         /// <summary>
         /// Achtung: Diese Methode wird bereits in einem Background Thread aufgerufen. Also vorischt bzgl. thread safety!
-        /// Deshalb werden die BuildResultArgs bereits vorab im GUI Thread erstellt.
         /// </summary>
         static async Task<BuildTagsResult> BuildTagsAsync(ITextSnapshot snapshot, CancellationToken cancellationToken) {


Update Nodejs/Product/Nodejs/Project/NodejsProjectLauncher.cs

Co-Authored-By: Armando Aguirre <2c0b090d17cd42f7f57fb9f3e3071df444cf1cfb@gmail.com>

--- Nodejs/Product/Nodejs/Project/NodejsProjectLauncher.cs
+++ Nodejs/Product/Nodejs/Project/NodejsProjectLauncher.cs
@@ -237,7 +237,7 @@
                     return ((int) userDebuggerOption != 0) ? JsCdpDebuggerV3Guid : WebKitDebuggerV2Guid;
                 }
             }
-            catch (Exception e)
+            catch (Exception)
             {
                 return WebKitDebuggerV2Guid;
             }


Remove region defs

Remove region defs


Add CellUtil.CreateBoundCellRenderer

Add CellUtil.CreateBoundCellRenderer

--- Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs
+++ Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs
@@ -3,8 +3,10 @@
 //
 // Author:
 //       Luís Reis <luiscubal@gmail.com>
+//       Eric Maupin <ermau@xamarin.com>
 //
 // Copyright (c) 2012 Luís Reis
+// Copyright (c) 2012 Xamarin, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to deal
@@ -28,6 +30,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Windows;
+using System.Windows.Data;
 using SWC = System.Windows.Controls;
 using SWM = System.Windows.Media;
 using Xwt.Engine;
@@ -63,5 +66,37 @@
 			}
 			throw new NotImplementedException ();
 		}
+
+		internal static FrameworkElementFactory CreateBoundCellRenderer (CellView view)
+		{
+			TextCellView textView = view as TextCellView;
+			if (textView != null) {
+				FrameworkElementFactory factory = new FrameworkElementFactory (typeof (SWC.TextBlock));
+
+				if (textView.TextField != null)
+					factory.SetBinding (SWC.TextBlock.TextProperty, new Binding (".[" + textView.TextField.Index + "]"));
+
+				factory.SetValue (SWC.Control.PaddingProperty, new Thickness (2));
+
+				return factory;
+			}
+
+			ImageCellView imageView = view as ImageCellView;
+			if (imageView != null) {
+				FrameworkElementFactory factory = new FrameworkElementFactory (typeof (SWC.Image));
+
+				if (imageView.ImageField != null) {
+					var binding = new Binding (".[" + imageView.ImageField.Index + "]")
+					{ Converter = new ImageToImageSourceConverter () };
+
+					factory.SetBinding (SWC.Image.SourceProperty, binding);
+				}
+
+
+				return factory;
+			}
+
+			throw new NotImplementedException ();
+		}
 	}
 }


Add overload of YamlStream.Load to be able to specify the EventReader.

--- YamlDotNet/RepresentationModel/YamlStream.cs
+++ YamlDotNet/RepresentationModel/YamlStream.cs
@@ -88,19 +88,23 @@
 		/// <param name="input">The input.</param>
 		public void Load(TextReader input)
 		{
-			documents.Clear();
+            Load(new EventReader(new Parser(input)));
+		}

-			var parser = new Parser(input);
-
-			EventReader events = new EventReader(parser);
-			events.Expect<StreamStart>();
-			while (!events.Accept<StreamEnd>())
-			{
-				YamlDocument document = new YamlDocument(events);
-				documents.Add(document);
-			}
-			events.Expect<StreamEnd>();
-		}
+        /// <summary>
+        /// Loads the stream from the specified <see cref="EventReader"/>.
+        /// </summary>
+        public void Load(EventReader reader)
+        {
+            documents.Clear();
+            reader.Expect<StreamStart>();
+            while (!reader.Accept<StreamEnd>())
+            {
+                YamlDocument document = new YamlDocument(reader);
+                documents.Add(document);
+            }
+            reader.Expect<StreamEnd>();
+        }

 		/// <summary>
 		/// Saves the stream to the specified output.


Objects_SimpleClasses-Exercise/06.Messages/Messages.cs - WORKS. Points: 100/100.

--- Objects_SimpleClasses-Exercise/06.Messages/Messages.cs
+++ Objects_SimpleClasses-Exercise/06.Messages/Messages.cs
@@ -6,7 +6,13 @@
 {
     public string Username { get; set; }

-    public List<Message> ReceivedMessages { get; set; }
+    public List<Message> Messages { get; set; }
+
+    public User(string username) //Конструкрот
+    {   //this - за яснота
+        this.Username = username;
+        this.Messages = new List<Message>();
+    }
 }

 class Message
@@ -14,99 +20,96 @@
     public string Content { get; set; }

     public User Sender { get; set; }
+
+    public Message(string content, User sender)
+    {
+        this.Content = content;
+        this.Sender = sender;
+    }
 }

 class Messages
 {
     static void Main()
     {
-        var messages = new Dictionary<string, User>();
+        var user = new Dictionary<string, User>();
+        string sender = String.Empty;
+        string recipient = String.Empty;

-        ReadMessages(messages);
+        string input = Console.ReadLine();
+        while (!input.Equals("exit"))
+        {
+            string[] inputTokens = input.Split(' ');
+
+            if (inputTokens[0].Equals("register"))
+            {
+                string username = inputTokens[1];
+                user.Add(username, new User(username));
+            }
+            else
+            {
+                sender = inputTokens[0];
+                recipient = inputTokens[2];
+                string content = inputTokens[3];

-        PrintMessage(messages);
+                if (user.ContainsKey(sender) && user.ContainsKey(recipient))
+                {
+                    User senderUser = user[sender];
+                    user[recipient].Messages.Add(new Message(content, senderUser));
+                }
+            }
+
+            input = Console.ReadLine();
+        }
+
+        string[] chatTokens = Console.ReadLine().Split(' ');
+        sender = chatTokens[0];
+        recipient = chatTokens[1];
+
+        Message[] senderMessages = user[recipient].Messages
+            .Where(m => m.Sender.Username.Equals(sender))
+            .ToArray();
+
+        Message[] recipientMessages = user[sender].Messages
+            .Where(m => m.Sender.Username.Equals(recipient))
+            .ToArray();
+
+        if (senderMessages.Length == 0 && recipientMessages.Length == 0)
+        {
+            Console.WriteLine("No messages");
+        }
+
+        int index = 0;
+        while (index < senderMessages.Length && index < recipientMessages.Length)
+        {
+            PrintSender(sender, senderMessages, index);
+            PrintReceipient(recipient, recipientMessages, index);
+
+            index++;
+        }
+
+        while (index < senderMessages.Length)
+        {
+            PrintSender(sender, senderMessages, index);
+
+            index++;
+        }
+
+        while (index < recipientMessages.Length)
+        {
+            PrintReceipient(recipient, recipientMessages, index);
+
+            index++;
+        }
     }

-    private static void PrintMessage(Dictionary<string, User> messages)
+    private static void PrintReceipient(string recipient, Message[] recipientMessages, int index)
     {
-        string[] tokens = Console.ReadLine()
-            .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
-            .ToArray();
-
-        string firstUser = tokens[0];
-        string secondUser = tokens[1];
-
-        //messages
-        //    .Where(x => x.Key == secondUser)
-        //    .ToList()
-        //    .ForEach()
-
-        foreach (var kvp in messages)
-        {
-            if (kvp.Value.Username == firstUser)
-            {
-                    Console.Write($"{kvp.Value.Username}: ");
-                foreach (var received in kvp.Value.ReceivedMessages)
-                {
-                    Console.WriteLine($"{received.Content} :{received.Sender}");
-                }
-            }
-        }
-
-
+        Console.WriteLine($"{recipientMessages[index].Content} :{recipient}");
     }

-    private static void ReadMessages(Dictionary<string, User> messages)
+    private static void PrintSender(string sender, Message[] senderMessages, int index)
     {
-        while (true)
-        {
-            string readLine = Console.ReadLine();
-
-            if (readLine.Equals("exit"))
-            {
-                break;
-            }
-
-            string[] tokens = readLine
-                .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
-                .ToArray();
-
-            string senderUsername = tokens[0];
-            string register = tokens[0];
-            string username = tokens[1];
-
-            if (register.Equals("register"))
-            {
-                if (!messages.ContainsKey(username))
-                {
-                    messages.Add(username, new User());
-                }
-            }
-            else if (tokens.Length < 2)
-            {
-            }
-            else if (messages.ContainsKey(tokens[2]))
-            {
-                string send = tokens[1];
-                string recipientUsername = tokens[2];
-                string content = tokens[3];
-
-                foreach (var kvp in messages)
-                {
-                    if (kvp.Key == recipientUsername)
-                    {
-                        foreach (var item in kvp.Value.Username)
-                        {
-                            kvp.Value.Username = recipientUsername;
-                        }
-                        foreach (var item in kvp.Value.ReceivedMessages)
-                        {
-                            item.Content = content;
-                            item.Sender.Username = senderUsername;
-                        }
-                    }
-                }
-            }
-        }
+        Console.WriteLine($"{sender}: {senderMessages[index].Content}");
     }
 }


Font weight and style wasn't being cloned

Former-commit-id: 69e2b1c10ad25e9c53142d4fe996a0e991fdd22d

--- MeTLMeeting/SandRibbon/Components/Utility/CanvasExtensions.cs
+++ MeTLMeeting/SandRibbon/Components/Utility/CanvasExtensions.cs
@@ -113,9 +113,11 @@
             var newBox = new MeTLTextBox();
             newBox.Text = box.Text;
             newBox.TextAlignment = box.TextAlignment;
-            newBox.TextDecorations = box.TextDecorations;
+            newBox.TextDecorations = box.TextDecorations.Clone();
             newBox.FontFamily = box.FontFamily;
             newBox.FontSize = box.FontSize;
+            newBox.FontWeight = box.FontWeight;
+            newBox.FontStyle = box.FontStyle;
             newBox.Foreground = box.Foreground;
             newBox.Background = box.Background;
             newBox.tag(box.tag());


fixed weird view bug with deleting question

--- MedConnect/MedConnect/MedConnect/NewViews/EditQuestionPage.cs
+++ MedConnect/MedConnect/MedConnect/NewViews/EditQuestionPage.cs
@@ -61,9 +61,9 @@

             cancelButton.Clicked += (sender, args) =>
             {
-                _masterPage.Master = _masterPage.getMasterContentPage();
-                _masterPage.Detail = new LibraryPage(_masterPage);
-                //Navigation.PopModalAsync();
+                //_masterPage.Master = _masterPage.getMasterContentPage();
+                //_masterPage.Detail = new LibraryPage(_masterPage);
+                Navigation.PopModalAsync();
             };

             helpfulButton.Clicked += (sender, args) =>
@@ -87,12 +87,14 @@

             Content = mainLayout;

+           /*
             var tapRecognizer = new TapGestureRecognizer();
             tapRecognizer.Tapped += (s, e) =>
             {
                 Navigation.PopModalAsync();
             };
             mainLayout.GestureRecognizers.Add(tapRecognizer);
+            */
         }

     }


Fixed #23011 - Join Excel File 'Data' Label not working when shapefile contains quotes in text fields

--- DotSpatial.Data/FeatureSet.cs
+++ DotSpatial.Data/FeatureSet.cs
@@ -824,10 +824,10 @@
             }

             // This connection string will not likely work on 64 bit machines.
-            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+            var con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
                                                       + xlsFilePath + "; Extended Properties=Excel 8.0");
-            OleDbDataAdapter da = new OleDbDataAdapter("select * from [Data$]", con);
-            DataTable dt = new DataTable();
+            var da = new OleDbDataAdapter("select * from [Data$]", con);
+            var dt = new DataTable();
             da.Fill(dt);

             if (!dt.Columns.Contains(xlsJoinField))
@@ -835,7 +835,7 @@
                 throw new Exception("The foreign join field specified is not in the xls data source specified.");
             }

-            List<DataColumn> copyColumns = new List<DataColumn>();
+            var copyColumns = new List<DataColumn>();
             foreach (DataColumn column in dt.Columns)
             {
                 if (res.DataTable.Columns.Contains(column.ColumnName))
@@ -853,21 +853,27 @@
                 string query;
                 if (dt.Columns[xlsJoinField].DataType == typeof(string))
                 {
-                    query = "[" + xlsJoinField + "] = '" + row[localJoinField] + "'";
+                    // Replcase quote with double quote, if need
+                    var localJoinStr = (string)row[localJoinField];
+                    if (localJoinStr != null)
+                    {
+                        localJoinStr = localJoinStr.Replace("'", "''");
+                    }
+                    query = "[" + xlsJoinField + "] = '" + localJoinStr + "'";
                 }
                 else
                 {
                     query = "[" + xlsJoinField + "] = " + row[localJoinField];
                 }

-                DataRow[] result = dt.Select(query);
+                var result = dt.Select(query);

                 if (result.Length == 0)
                 {
                     continue;
                 }

-                foreach (DataColumn column in copyColumns)
+                foreach (var column in copyColumns)
                 {
                     row[column.ColumnName] = result[0][column.ColumnName];
                 }


Format assembly properties

Format assembly properties

--- Assembly.cs
+++ Assembly.cs
@@ -2,8 +2,7 @@
 using System.Reflection;
 using System.Resources;
 using System.Runtime.InteropServices;
-[assembly: CLSCompliant(false),
-           NeutralResourcesLanguage("en"),
-           AssemblyVersion("1.0.0"),
-           AssemblyFileVersion("1.0.0"),
-           ComVisible(false)]
+[assembly: CLSCompliant(false)]
+[assembly: NeutralResourcesLanguage("en")]
+[assembly: AssemblyVersion("1.0.0"), AssemblyFileVersion("1.0.0")]
+[assembly: ComVisible(false)]


Bugfixes #FIX: Fixed Range object not being flagged [Serializable]

--- Duality/Utility/Math/Range.cs
+++ Duality/Utility/Math/Range.cs
@@ -8,6 +8,7 @@
 	/// <summary>
 	/// Represents a range of values between a specific minimum and maximum value.
 	/// </summary>
+	[Serializable]
 	public struct Range : IEquatable<Range>
 	{
 		/// <summary>


Moved the assignment into the constructor

--- Espera/Espera.Core/Library.cs
+++ Espera/Espera.Core/Library.cs
@@ -13,7 +13,7 @@
     {
         private readonly HashSet<Song> songs;
         private readonly Dictionary<int, Song> playlist;
-        private readonly object songLocker = new object();
+        private readonly object songLocker;
         private string password;
         private AccessMode accessMode;
         private AudioPlayer currentPlayer;
@@ -203,6 +203,7 @@
         /// </summary>
         public Library()
         {
+            this.songLocker = new object();
             this.songs = new HashSet<Song>();
             this.playlist = new Dictionary<int, Song>();
             this.volume = 1.0f;


Added an in-memory provider for caching

Added an in-memory provider for caching

--- GoorooIO.SqlBacked/Program.cs
+++ GoorooIO.SqlBacked/Program.cs
@@ -119,7 +119,7 @@
 				if (cacheType == CacheType.AzureCache) {
 					File.Copy(MapPath(@"..\Code\CacheProviders\AzureCacheProvider.cs"), path + @"\AzureCacheProvider.cs", true);
 				}
-				if (cacheType == CacheType.Redis) {
+				if (cacheType == CacheType.InProcess) {
 					File.Copy(MapPath(@"..\Code\CacheProviders\MemoryCacheProvider.cs"), path + @"\MemoryCacheProvider.cs", true);
 				}


Bugfix

Bugfix

--- Hermod/HTTP/Server/HTTPAPI.cs
+++ Hermod/HTTP/Server/HTTPAPI.cs
@@ -1318,15 +1318,17 @@
                 var ResourceStream = assembly.Item2.GetManifestResourceStream(assembly.Item1 + ResourceName);
                 if (ResourceStream != null)
                 {
+
                     ResourceStream.Seek(3, SeekOrigin.Begin);
                     ResourceStream.CopyTo(HTMLStream);
+
+                    return HTMLTemplate.Replace("<%= content %>", HTMLStream.ToArray().ToUTF8String());
+
                 }

-                return HTMLTemplate.Replace("<%= content %>", HTMLStream.ToArray().ToUTF8String());
-
-            }
-
-            return HTMLTemplate;
+            }
+
+            return String.Empty;

         }


Fix NEXT_ASSEMBLY

--- Assets/RuntimeUnitTestToolkit/UnitTestRunner.cs
+++ Assets/RuntimeUnitTestToolkit/UnitTestRunner.cs
@@ -140,8 +140,8 @@
                         }
                         catch (Exception ex)
                         {
+                            Debug.Log("TestAttribute Load Fail, Assembly:" + assembly.FullName);
                             Debug.LogException(ex);
-                            Debug.Log("TestAttribute Fail, Assembly:" + assembly.FullName);
                             goto NEXT_ASSEMBLY;
                         }
                         if (t1 != null)
@@ -157,8 +157,8 @@
                         }
                         catch (Exception ex)
                         {
+                            Debug.Log("UnityTestAttribute Load Fail, Assembly:" + assembly.FullName);
                             Debug.LogException(ex);
-                            Debug.Log("UnityTestAttribute Fail, Assembly:" + assembly.FullName);
                             goto NEXT_ASSEMBLY;
                         }
                         if (t2 != null)
@@ -167,10 +167,10 @@
                             break;
                         }
                     }
-
-                    NEXT_ASSEMBLY:
-                    continue;
-                }
+                }
+
+                NEXT_ASSEMBLY:
+                continue;
             }
         }


Ghost movement while floating fixed

Ghost movement while floating fixed

--- UnityProject/Assets/Scripts/PlayGroups/PlayerSync.Client.cs
+++ UnityProject/Assets/Scripts/PlayGroups/PlayerSync.Client.cs
@@ -61,7 +61,7 @@

 				//experiment: not enqueueing or processing action if floating.
 				//arguably it shouldn't really be like that in the future
-				if ( !isPseudoFloatingClient && !isFloatingClient && !blockClientMovement ) {
+				if ( (!isPseudoFloatingClient && !isFloatingClient && !blockClientMovement) || (playerScript.gameObject.GetComponent<PlayerMove>().isGhost && !blockClientMovement)) {
 //				Logger.Log($"{gameObject.name} requesting {action.Direction()} ({pendingActions.Count} in queue)");
 					pendingActions.Enqueue( action );


Fix for possible NRE.

Fix for possible NRE.

--- Assets/Scripts/Importing/Conversion/Geometry.cs
+++ Assets/Scripts/Importing/Conversion/Geometry.cs
@@ -234,7 +234,7 @@

             return new GeometryFrame
             {
-                Name = src.Name.Value,
+                Name = src.Name != null ? src.Name.Value : "unnamed",
                 Position = Convert(src.Position),
                 Rotation = Quaternion.LookRotation(Convert(src.MatrixForward), Convert(src.MatrixUp)),
                 ParentIndex = src.ParentIndex,


Added degree symbol

Added degree symbol

--- BackgroundFetch.Sample/WeatherViewController.cs
+++ BackgroundFetch.Sample/WeatherViewController.cs
@@ -15,19 +15,31 @@
 		{
 			InvokeOnMainThread (() =>
 			{
-				this.labelTemp.Text = weatherInfo.GetTempInCelsius().ToString();
+				this.labelTemp.Text = weatherInfo.GetTempInCelsius().ToString() + "°C";
 				this.labelLocation.Text = weatherInfo.name;
 			});
+		}
+
+		void LoadCachedWeather()
+		{
+			var weatherInfo = AppDelegate.GetCachedWeather ();
+
+			if (weatherInfo != null)
+				UpdateWeather (weatherInfo);
 		}

 		public override void ViewDidLoad ()
 		{
 			base.ViewDidLoad ();
+
+			LoadCachedWeather ();
+		}

-			var weatherInfo = AppDelegate.GetCachedWeather ();
+		public override void ViewDidAppear (bool animated)
+		{
+			base.ViewDidAppear (animated);

-			if (weatherInfo != null)
-				UpdateWeather (weatherInfo);
+			LoadCachedWeather ();
 		}
 	}
 }


Fixed operation data

Fixed operation data

--- Warden.Services.Storage/Handlers/OperationCreatedHandler.cs
+++ Warden.Services.Storage/Handlers/OperationCreatedHandler.cs
@@ -3,40 +3,31 @@
 using Warden.Common.Events;
 using Warden.Services.Operations.Shared.Dto;
 using Warden.Services.Operations.Shared.Events;
-using Warden.Services.Storage.Providers;
 using Warden.Services.Storage.Repositories;

 namespace Warden.Services.Storage.Handlers
 {
     public class OperationCreatedHandler : IEventHandler<OperationCreated>
     {
-        private readonly IOperationProvider _operationProvider;
         private readonly IOperationRepository _operationRepository;

-        public OperationCreatedHandler(IOperationProvider operationProvider, IOperationRepository operationRepository)
+        public OperationCreatedHandler(IOperationRepository operationRepository)
         {
-            _operationProvider = operationProvider;
             _operationRepository = operationRepository;
         }

         public async Task HandleAsync(OperationCreated @event)
         {
-            var operation = await _operationProvider.GetAsync(@event.RequestId);
-            if(operation.HasNoValue)
-                return;
-
             await _operationRepository.AddAsync(new OperationDto
             {
-                Id = operation.Value.Id,
+                Id = Guid.NewGuid(),
                 RequestId = @event.RequestId,
+                Name = @event.Name,
                 UserId = @event.UserId,
                 Origin = @event.Origin,
                 Resource = @event.Resource,
                 State = @event.State,
-                Code = operation.Value.Code,
-                Message = operation.Value.Message,
                 CreatedAt = @event.CreatedAt,
-                UpdatedAt = operation.Value.UpdatedAt
             });
         }
     }


Added simple IoC implementation to make the class a bit testable

--- WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs
+++ WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs
@@ -37,15 +37,101 @@
 using System.Reflection;
 using Ionic.Zip;
 using WebsitePanel.Providers.OS;
+using System.Diagnostics.Contracts;

 namespace WebsitePanel.Providers.Utils
 {
+    /// <summary>
+    /// Defines a contract that a system command provider needs to implement.
+    /// </summary>
+    public interface ICommandLineProvider
+    {
+        /// <summary>
+        /// Executes the file specifed as if you were executing it via command-line interface.
+        /// </summary>
+        /// <param name="filePath">Path to the executable file (eq. .exe, .bat, .cmd and etc).</param>
+        /// <param name="args">Arguments to pass to the executable file</param>
+        /// <param name="outputFile">Path to the output file if you want the output to be written somewhere.</param>
+        /// <returns>Output of the command being executed.</returns>
+        string Execute(string filePath, string args, string outputFile);
+    }
+
+    /// <summary>
+    /// Provides a default implementation of running system commands.
+    /// </summary>
+    public sealed class DefaultCommandLineProvider : ICommandLineProvider
+    {
+        /// <summary>
+        /// Creates a new process and executes the file specifed as if you were executing it via command-line interface.
+        /// </summary>
+        /// <param name="filePath">Path to the executable file (eq. .exe, .bat, .cmd and etc).</param>
+        /// <param name="args">Arguments to pass to the executable file</param>
+        /// <param name="outputFile">Path to the output file if you want the output to be written somewhere.</param>
+        /// <returns>Output of the command being executed.</returns>
+        public string Execute(string filePath, string args, string outputFile)
+        {
+            // launch system process
+            ProcessStartInfo startInfo = new ProcessStartInfo(filePath, args);
+            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
+            startInfo.RedirectStandardOutput = true;
+            startInfo.UseShellExecute = false;
+            startInfo.CreateNoWindow = true;
+
+            // get working directory from executable path
+            startInfo.WorkingDirectory = Path.GetDirectoryName(filePath);
+            Process proc = Process.Start(startInfo);
+
+            // analyze results
+            StreamReader reader = proc.StandardOutput;
+            string results = "";
+            if (!String.IsNullOrEmpty(outputFile))
+            {
+                // stream to writer
+                StreamWriter writer = new StreamWriter(outputFile);
+                int BUFFER_LENGTH = 2048;
+                int readBytes = 0;
+                char[] buffer = new char[BUFFER_LENGTH];
+                while ((readBytes = reader.Read(buffer, 0, BUFFER_LENGTH)) > 0)
+                {
+                    writer.Write(buffer, 0, readBytes);
+                }
+                writer.Close();
+            }
+            else
+            {
+                // return as string
+                results = reader.ReadToEnd();
+            }
+            reader.Close();
+
+            return results;
+        }
+    }
+
     /// <summary>
     /// Summary description for FileUtils.
     /// </summary>
     public class FileUtils
     {
+        private static ICommandLineProvider CliProvider;
+
+        static FileUtils()
+        {
+            SetDefaultCliProvider(new DefaultCommandLineProvider());
+        }
+
+        /// <summary>
+        /// Initializes command-line provider for the utility class. Yet this is not a perfect way to inverse control over CLI processing
+        /// but it does its job for the testing purposes.
+        /// </summary>
+        /// <param name="provider">An instance of a command-line provider to initialize the utility with.</param>
+        public static void SetDefaultCliProvider(ICommandLineProvider provider)
+        {
+            Contract.Requires(provider != null);
+            CliProvider = provider;
+        }
+
 		public static string EvaluateSystemVariables(string str)
         {
             if (String.IsNullOrEmpty(str))
@@ -616,45 +702,17 @@
             return ExecuteSystemCommand(cmd, args, null);
         }

+        /// <summary>
+        /// Executes the file specifed as if you were executing it via command-line interface.
+        /// </summary>
+        /// <param name="filePath">Path to the executable file (eq. .exe, .bat, .cmd and etc).</param>
+        /// <param name="args">Arguments to pass to the executable file</param>
+        /// <param name="outputFile">Path to the output file if you want the output to be written somewhere.</param>
+        /// <returns>Output of the command being executed.</returns>
         public static string ExecuteSystemCommand(string cmd, string args, string outputFile)
         {
             // launch system process
-            ProcessStartInfo startInfo = new ProcessStartInfo(cmd, args);
-            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
-            startInfo.RedirectStandardOutput = true;
-            startInfo.StandardOutputEncoding = Encoding.UTF8;
-            startInfo.UseShellExecute = false;
-            startInfo.CreateNoWindow = true;
-
-            // get working directory from executable path
-			startInfo.WorkingDirectory = Path.GetDirectoryName(cmd);
-            Process proc = Process.Start(startInfo);
-
-
-            // analyze results
-            StreamReader reader = proc.StandardOutput;
-            string results = "";
-            if (!String.IsNullOrEmpty(outputFile))
-            {
-                // stream to writer
-                StreamWriter writer = new StreamWriter(outputFile);
-                int BUFFER_LENGTH = 2048;
-                int readBytes = 0;
-                char[] buffer = new char[BUFFER_LENGTH];
-                while ((readBytes = reader.Read(buffer, 0, BUFFER_LENGTH)) > 0)
-                {
-                    writer.Write(buffer, 0, readBytes);
-                }
-                writer.Close();
-            }
-            else
-            {
-                // return as string
-                results = reader.ReadToEnd();
-            }
-            reader.Close();
-
-            return results;
+            return CliProvider.Execute(cmd, args, outputFile);
         }

         public static void ExecuteCmdCommand(string command)