that's working, but convertions in IL has to be reworked

--- src/GraphicObjects/GraphicObject.cs
+++ src/GraphicObjects/GraphicObject.cs
@@ -453,11 +453,9 @@

 			il.Emit(OpCodes.Nop);

-			int cpt = 0;
-
 			foreach (PropertyInfo pi in thisType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
 				string name = "";
-				cpt++;
+
 				#region retrieve custom attributes
 				if (pi.GetSetMethod () == null)
 					continue;
@@ -485,7 +483,6 @@
 					il.Emit (OpCodes.Ldnull);
 				} else {
 					Type dvType = defaultValue.GetType ();
-					Debug.WriteLine (dvType.ToString ());

 					if (dvType.IsValueType) {
 						switch (Type.GetTypeCode (dvType)) {
@@ -537,11 +534,9 @@
 							il.Emit (OpCodes.Pop);
 							continue;
 						}
-					} else if (dvType.FullName == "System.String") {
+					} else if (dvType.FullName == "System.String")
 						il.Emit (OpCodes.Ldstr, Convert.ToString (defaultValue));
-//						il.Emit (OpCodes.Pop);
-//						continue;
-					}else{
+					else{
 						if (!dvType.IsEnum) {
 							il.Emit (OpCodes.Pop);
 							continue;
@@ -550,20 +545,23 @@
 					}

 					if (pi.PropertyType != dvType) {
-						MethodInfo miParse = pi.PropertyType.GetMethod ("Parse", BindingFlags.Static | BindingFlags.Public);
-						if (miParse != null) {
-							il.Emit (OpCodes.Callvirt, miParse);
-							if (miParse.ReturnType != pi.PropertyType)
-								il.Emit(OpCodes.Unbox_Any, pi.PropertyType);
-//								il.Emit(OpCodes.Castclass, pi.PropertyType);
-
-						} else
-							Debugger.Break ();
+						if (Type.GetTypeCode (dvType) == TypeCode.String) {
+							MethodInfo miParse = pi.PropertyType.GetMethod ("Parse", BindingFlags.Static | BindingFlags.Public);
+							if (miParse != null) {
+								il.Emit (OpCodes.Callvirt, miParse);
+								if (miParse.ReturnType != pi.PropertyType)
+									il.Emit (OpCodes.Unbox_Any, pi.PropertyType);
+							} else
+								throw new Exception ("no Parse method found for: " + pi.PropertyType.FullName);
+						} else {
+							MethodInfo conv = CompilerServices.GetConvertMethod (pi.PropertyType);
+							il.Emit(OpCodes.Callvirt, conv);
+							il.Emit (OpCodes.Unbox_Any, pi.PropertyType);
+						}
 					}
 				}

 				il.Emit (OpCodes.Callvirt, pi.GetSetMethod ());
-
 			}

 			il.Emit(OpCodes.Ret);


Update HeaderNames.cs (#28488)

Update HeaderNames.cs (#28488)

--- src/Http/Headers/src/HeaderNames.cs
+++ src/Http/Headers/src/HeaderNames.cs
@@ -4,7 +4,7 @@
 namespace Microsoft.Net.Http.Headers
 {
     /// <summary>
-    /// Defines cnstants for well-known HTTP headers.
+    /// Defines constants for well-known HTTP headers.
     /// </summary>
     public static class HeaderNames
     {


[arm armel] Added arm-reloc type to getRelocTypeHint (#4134)

--- src/JitInterface/src/CorInfoImpl.cs
+++ src/JitInterface/src/CorInfoImpl.cs
@@ -3519,10 +3519,18 @@

         private ushort getRelocTypeHint(void* target)
         {
-            if (_compilation.TypeSystemContext.Target.Architecture == TargetArchitecture.X64)
-                return (ushort)ILCompiler.DependencyAnalysis.RelocType.IMAGE_REL_BASED_REL32;
-
-            return UInt16.MaxValue;
+            switch (_compilation.TypeSystemContext.Target.Architecture)
+            {
+                case TargetArchitecture.X64:
+                    return (ushort)ILCompiler.DependencyAnalysis.RelocType.IMAGE_REL_BASED_REL32;
+
+                case TargetArchitecture.ARM:
+                case TargetArchitecture.ARMEL:
+                    return (ushort)ILCompiler.DependencyAnalysis.RelocType.IMAGE_REL_BASED_THUMB_BRANCH24;
+
+                default:
+                    return UInt16.MaxValue;
+            }
         }

         private void getModuleNativeEntryPointRange(ref void* pStart, ref void* pEnd)


PERFORMANCE: Lucene.Net.Store.FSDirectory: Removed extra call to Flush() that was causing slow performance and moved the call to the Dispose() block.

--- src/Lucene.Net/Store/FSDirectory.cs
+++ src/Lucene.Net/Store/FSDirectory.cs
@@ -499,14 +499,6 @@
                 //Debug.Assert(size == 0);
             }

-            // LUCENENET specific - file.Flush(flushToDisk: true) required in .NET for concurrency
-            // Part of a solution suggested by Vincent Van Den Berghe: http://apache.markmail.org/message/hafnuhq2ydhfjmi2
-            public override void Flush()
-            {
-                base.Flush();
-                file.Flush(flushToDisk: true);
-            }
-
             protected override void Dispose(bool disposing)
             {
                 if (disposing)
@@ -519,6 +511,9 @@
                         try
                         {
                             base.Dispose(disposing);
+                            // LUCENENET specific - file.Flush(flushToDisk: true) required in .NET for concurrency
+                            // Part of a solution suggested by Vincent Van Den Berghe: http://apache.markmail.org/message/hafnuhq2ydhfjmi2
+                            file.Flush(flushToDisk: true);
                         }
                         catch (IOException ioe)
                         {


PerSecondLimiter: changed to use slices

PerSecondLimiter: changed to use slices

--- src/Medo/Timers/PerSecondLimiter.cs
+++ src/Medo/Timers/PerSecondLimiter.cs
@@ -30,11 +30,21 @@
             get { return _perSecondRate; }
             set {
                 if (value < 0) { throw new ArgumentOutOfRangeException(nameof(value), "Per-second rate cannot be lower than 0."); }
-                lock (SyncTimer) {
-                    lock (SyncProperties) {
-                        _perSecondRate = value;
+                _perSecondRate = value;
+                lock (SyncRate) {  // setup rate slices
+                    var thousandth = value / 1000;
+                    var remaining = value % 1000;
+                    for (var i = 0; i < 1000; i++) {
+                        RateSlices[i] = thousandth;
                     }
-                    while (Tickets.CurrentCount > 0) { Tickets.Wait(0); }  // use up remaining allowance
+                    if (remaining > 0) {  // equaly distribute remaining TPS
+                        var skipCount = 1000 / remaining;
+                        for (var i = 0; i < 1000; i += skipCount) {
+                            RateSlices[i] += 1;
+                            remaining--;
+                            if (remaining == 0) { break; }
+                        }
+                    }
                 }
             }
         }
@@ -88,62 +98,50 @@
         private readonly Timer HeartbeatTimer;
 #pragma warning restore IDE0052 // Remove unread private members

-        private readonly object SyncProperties = new();
-        private readonly object SyncTimer = new();
+        private readonly AutoResetEvent HeartbeatMonitor = new(initialState: true);
         private readonly SemaphoreSlim Tickets = new(0);

+        private readonly object SyncRate = new();
+        private readonly long[] RateSlices = new long[1000];
+        private int RateSliceIndex = 0;
+
         private void Heartbeat(object? state) {
-            lock (SyncTimer) {
-                var now = Environment.TickCount;
-                var msLastElapsed = unchecked(now - PeriodLastStart) & 0x7FFFFFFF;  // positive result even if TickCount is negative at the start
-                if (msLastElapsed == 0) { return; }  // less than 1ms has elapsed - can happen sometime
+            if (!HeartbeatMonitor.WaitOne(0)) { return; }  // immediatelly exit if you cannot get the monitor; you'll catch up on the next go

-                try {
-                    long rate;
-                    lock (SyncProperties) {
-                        rate = PerSecondRate;
+            var currentTimestamp = Environment.TickCount;
+            var msElapsed = unchecked(currentTimestamp - LastTimestamp) & 0x7FFFFFFF;  // positive result even if TickCount is negative at the start
+
+            try {
+                if (msElapsed <= 0) { return; }  // less than 1ms has elapsed - can happen sometime
+
+                long maxToAdd;
+                if ((msElapsed == 1) || (msElapsed >= 100)) {  // add only single slice if waiting more than 100ms (or if only single slice is needed)
+                    lock (SyncRate) {
+                        maxToAdd = RateSlices[RateSliceIndex++];
+                        if (RateSliceIndex >= 1000) { RateSliceIndex = 0; }
                     }
-
-                    if (rate == 0) { return; }  // special case when semaphore is not used
-
-                    var allowanceRemaining = Tickets.CurrentCount;
-                    var msTotalElapsed = unchecked(now - PeriodTotalStart) & 0x7FFFFFFF;  // positive result even if TickCount is negative at the start
-
-                    if (msTotalElapsed >= 2000) {  // it's been long enough to forget all about counting
-                        //System.Diagnostics.Debug.WriteLine($"[Medo PerSecondLimiter] Init");
-                        PeriodTotalStart = now;
-                        PeriodTotalAllowanceUsed = 0;
-                    } else {  // try to distribute quota bit by bit
-                        //System.Diagnostics.Debug.WriteLine($"[Medo PerSecondLimiter] Tick");
-                        if (allowanceRemaining > 0) { return; }  // if there is unused allowance, don't give it more
-
-                        var expectedLastUsage = (rate + 1) * msLastElapsed / 1000 + 1;
-                        var expectedTotalUsage = rate * msTotalElapsed / 1000 + 1;
-
-                        var rateMaxUnused = rate / 16;  // limit unused counter to about 6.25% at a time
-                        if (rateMaxUnused == 0) { rateMaxUnused = 1; }  // always allow at least one
-                        var unused = expectedTotalUsage - PeriodTotalAllowanceUsed;
-                        if (unused > rateMaxUnused) { unused = rateMaxUnused; }
-                        if (unused > 0) {
-                            PeriodTotalAllowanceUsed += unused;
-                            Tickets.Release((int)unused);
-                        }
-
-                        if (msTotalElapsed >= 1000) {  // move sliding window to the current second
-                            PeriodTotalStart += 1000;
-                            PeriodTotalAllowanceUsed -= rate;
-                            if (PeriodTotalAllowanceUsed < 0) { PeriodTotalAllowanceUsed = 0; }  // forget about missed
+                } else {
+                    maxToAdd = 0;
+                    lock (SyncRate) {
+                        for (var i = 0; i < msElapsed; i++) {  // add each missed bucket
+                            maxToAdd += RateSlices[RateSliceIndex++];
+                            if (RateSliceIndex >= 1000) { RateSliceIndex = 0; }
                         }
                     }
-                } finally {
-                    PeriodLastStart = now;
                 }
+                if (maxToAdd > 0) {
+                    if (maxToAdd > Int32.MaxValue) { maxToAdd = Int32.MaxValue; }
+                    if (maxToAdd > Tickets.CurrentCount) {  // add new tickets only if not too many tickets are already available - CurrentCount is not precise but it's good enough
+                        Tickets.Release((int)maxToAdd);
+                    }
+                }
+            } finally {
+                LastTimestamp = currentTimestamp;
+                HeartbeatMonitor.Set();
             }
         }

-        private long PeriodLastStart;
-        private long PeriodTotalStart;
-        private long PeriodTotalAllowanceUsed;
+        private long LastTimestamp;

         #endregion Timer


Added check for .NET version. Systems running versions prior to 1.1 will get error message.

SVN: 488784591515bd4cdaa016be4ec9b172dc4e7caf@636

--- src/NHibernate/Cfg/Configuration.cs
+++ src/NHibernate/Cfg/Configuration.cs
@@ -579,6 +579,11 @@
 		/// <returns></returns>
 		public ISessionFactory BuildSessionFactory()
 		{
+			// Version check to determine which version of .NET is running
+			if ((System.Environment.Version.Major == 1)
+				&& (System.Environment.Version.Minor == 0))
+				throw new HibernateException("Wrong version of .NET framework is used, NHibernate is not to be used with versions prior to 1.1.4322");
+
 			SecondPassCompile();
 			Hashtable copy = new Hashtable();
 			foreach(DictionaryEntry de in properties)


GrainExtensions: remove RuntimeClient.Current usage (#2794)

--- src/Orleans/Core/GrainExtensions.cs
+++ src/Orleans/Core/GrainExtensions.cs
@@ -9,10 +9,12 @@
     /// </summary>
     public static class GrainExtensions
     {
-        private const string WRONG_GRAIN_ERROR_MSG = "Passing a half baked grain as an argument. It is possible that you instantiated a grain class explicitely, as a regular object and not via Orleans runtime or via proper test mocking";
+        private const string WRONG_GRAIN_ERROR_MSG = "Passing a half baked grain as an argument. It is possible that you instantiated a grain class explicitly, as a regular object and not via Orleans runtime or via proper test mocking";

         internal static GrainReference AsWeaklyTypedReference(this IAddressable grain)
         {
+            ThrowIfNullGrain(grain);
+
             // When called against an instance of a grain reference class, do nothing
             var reference = grain as GrainReference;
             if (reference != null) return reference;
@@ -44,12 +46,9 @@
         /// <returns>A strongly typed <c>GrainReference</c> of grain interface type TGrainInterface.</returns>
         public static TGrainInterface AsReference<TGrainInterface>(this IAddressable grain)
         {
-            if (grain == null)
-            {
-                throw new ArgumentNullException("grain", "Cannot pass null as an argument to AsReference");
-            }
-
-            return RuntimeClient.Current.InternalGrainFactory.Cast<TGrainInterface>(grain.AsWeaklyTypedReference());
+            ThrowIfNullGrain(grain);
+            var grainReference = grain.AsWeaklyTypedReference();
+            return grainReference.RuntimeClient.InternalGrainFactory.Cast<TGrainInterface>(grainReference);
         }

         /// <summary>
@@ -59,7 +58,7 @@
         /// <param name="grain">The grain to cast.</param>
         public static TGrainInterface Cast<TGrainInterface>(this IAddressable grain)
         {
-            return RuntimeClient.Current.InternalGrainFactory.Cast<TGrainInterface>(grain);
+            return grain.AsReference<TGrainInterface>();
         }

         /// <summary>
@@ -204,5 +203,13 @@
         {
             return GetGrainIdentity(grain).PrimaryKeyString;
         }
+
+        private static void ThrowIfNullGrain(IAddressable grain)
+        {
+            if (grain == null)
+            {
+                throw new ArgumentNullException(nameof(grain));
+            }
+        }
     }
 }


bug fixes

bug fixes

--- cscs/Functions.OS.cs
+++ cscs/Functions.OS.cs
@@ -634,39 +634,30 @@
         static Variable ExtractObject(ParsingScript script)
         {
             Variable newValue = new Variable(Variable.VarType.ARRAY);
-            script.Forward();
-
-            while (script.StillValid())
-            {
+
+            while (script.StillValid() && (newValue.Count == 0 || script.Current == ','))
+            {
+                script.Forward();
                 string key = Utils.GetToken(script, SEP);
                 script.MoveForwardIf(':');
+
                 Variable valueVar = ExtractValue(script);
                 newValue.SetHashVariable(key, valueVar);
-                if (script.TryCurrent() != ',')
-                {
-                    break;
-                }
+            }
+            script.MoveForwardIf('}');
+
+            return newValue;
+        }
+
+        static Variable ExtractArray(ParsingScript script)
+        {
+            Variable newValue = new Variable(Variable.VarType.ARRAY);
+
+            while (script.StillValid() && (newValue.Count == 0 || script.Current == ','))
+            {
                 script.Forward();
-            }
-            script.MoveForwardIf('}');
-
-            return newValue;
-        }
-
-        static Variable ExtractArray(ParsingScript script)
-        {
-            Variable newValue = new Variable(Variable.VarType.ARRAY);
-            script.MoveForwardIf('[');
-
-            while (script.StillValid() && script.TryCurrent() != ']')
-            {
                 Variable addVariable = ExtractValue(script);
                 newValue.AddVariable(addVariable);
-                if (script.TryCurrent() != ',')
-                {
-                    break;
-                }
-                script.Forward();
             }
             script.MoveForwardIf(']');


added comment for GetSketchParts

added comment for GetSketchParts

--- Addin/MasterModel/MasterModel/MasterM.cs
+++ Addin/MasterModel/MasterModel/MasterM.cs
@@ -55,6 +55,11 @@
         }

+        /// <summary>
+        /// Gives you all the Entitys of one Sketch
+        /// </summary>
+        /// <param name="sketchy">The Sketch you want the Entitys from</param>
+        /// <returns>List of Entitys (Containing stuff like Arcs, )</returns>
         public static List<SketchEntity> GetSketchParts(Sketch sketchy)
         {
             List<SketchEntity> sketchParts = new List<SketchEntity>();


Add fading background while changing

Add fading background while changing

--- Flirper/FlirperBootstrap.cs
+++ Flirper/FlirperBootstrap.cs
@@ -3,6 +3,7 @@
 using UnityEngine;
 using ColossalFramework.UI;
 using ColossalFramework.HTTP;
+using ColossalFramework;

 namespace Flirper
 {
@@ -26,30 +27,90 @@

             ImageListEntry entry = ImageList.getRandomEntry ();
             if (entry == null) {
-                DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Error, FlirperBootstrap.ModTag+" could not get an image entry. Check format of FlirperImageList.txt");
+                DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Error, FlirperBootstrap.ModTag + " could not get an image entry. Check format of FlirperImageList.txt");
                 error = "Could not load a valid entry\n";
                 error += "Click to try again";
             }

-            if(error != "") {
-                changeLabel(error);
+            if (error != "") {
+                changeLabel (error);
                 return;
             }

             try {
                 changeBackgroundImage (bgsprite, entry);
             } catch (Exception ex) {
-                DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Error, FlirperBootstrap.ModTag+" " + ex.ToString ());
-                error = "Error loading "+entry.uri+"\n";
+                DebugOutputPanel.AddMessage (ColossalFramework.Plugins.PluginManager.MessageType.Error, FlirperBootstrap.ModTag + " " + ex.ToString ());
+                error = "Error loading " + entry.uri + "\n";
                 error += "Click to try again";
             }

-            if(error != "") {
-                changeLabel(error);
-                return;
-            }
-        }
-
+            if (error != "") {
+                changeLabel (error);
+                return;
+            }
+        }
+
+        static void initLabel ()
+        {
+            if (UIView.GetAView ().FindUIComponent ("FlirperAttribution") == null) {
+                UILabel flirperAttribution = UIView.GetAView ().AddUIComponent (typeof(UILabel)) as UILabel;
+                flirperAttribution.name = "FlirperAttribution";
+                flirperAttribution.eventClick += loadNextFlirp;
+
+                flirperAttribution.textAlignment = UIHorizontalAlignment.Right;
+                flirperAttribution.textScale = 2f;
+                flirperAttribution.textScaleMode = UITextScaleMode.ScreenResolution;
+
+                flirperAttribution.outlineColor = new Color32 (0, 0, 0, 200);
+                flirperAttribution.outlineSize = 1;
+                flirperAttribution.useOutline = true;
+            }
+        }
+
+        static void loadNextFlirp (UIComponent component, UIMouseEventParameter eventParam)
+        {
+            UILabel label = ((UILabel)component);
+            if (label.text != "Loading") {
+                label.text = "Loading";
+                FlirperBootstrap.flirpIt ();
+            }
+        }
+
+        static void changeBackgroundImage (UITextureSprite bgsprite, ImageListEntry entry)
+        {
+            if (entry.isLatestSaveGame) {
+                SaveGameMetaData latestSaveGame = SaveHelper.GetLatestSaveGame ();
+
+                if (latestSaveGame == null) {
+                    throw new Exception ("no savegame available");
+                }
+
+                String title = latestSaveGame.cityName;
+                String extraInfo = latestSaveGame.timeStamp.ToShortDateString ();
+
+                Texture2D savegameimage = latestSaveGame.imageRef.Instantiate<Texture> () as Texture2D;
+                savegameimage = Blur.FastBlur (savegameimage, 2, 2);
+                assignImageData (bgsprite, savegameimage);
+
+                changeLabel (new ImageListEntry ("", title, "", extraInfo));
+            } else if (entry.isHTTP) {
+                Request imgget = new Request ("get", entry.uri);
+                imgget.AddHeader ("Accept-Language", "en");
+
+                imgget.Send (httpCallback (bgsprite, entry));
+            } else {
+                // read path @verbatim to avoid escaping
+                byte[] imgdata = System.IO.File.ReadAllBytes (@entry.uri);
+
+                Texture2D bg = new Texture2D (1, 1);
+                bg.LoadImage (imgdata);
+
+                assignImageData (bgsprite, bg);
+                changeLabel(entry);
+            }
+        }
+
         static Action<Request> httpCallback (UITextureSprite bgsprite, ImageListEntry entry)
         {
             return delegate (Request req) {
@@ -60,72 +121,21 @@
                     if (req.response == null || req.response.status != 200) {
                         throw new Exception ("error while fetching " + entry.uri);
                     }
-
+
                     Texture2D bg = new Texture2D (1, 1);
                     byte[] imgdata = req.response.bytes;
                     bg.LoadImage (imgdata);
-
+
                     if (bg.width < 10 || bg.height < 10) {
                         throw new Exception ("image looks wrong " + entry.uri);
                     }
-
+
                     assignImageData (bgsprite, bg);
                     changeLabel (entry);
                 }
             };
         }

-        static void changeBackgroundImage (UITextureSprite bgsprite, ImageListEntry entry)
-        {
-            if (entry.isLatestSaveGame) {
-                SaveGameMetaData latestSaveGame = SaveHelper.GetLatestSaveGame ();
-
-                if (latestSaveGame == null) {
-                    throw new Exception ("no savegame available");
-                }
-
-                String title = latestSaveGame.cityName;
-                String extraInfo = latestSaveGame.timeStamp.ToShortDateString ();
-
-                Texture2D savegameimage = latestSaveGame.imageRef.Instantiate<Texture> () as Texture2D;
-                savegameimage = Blur.FastBlur (savegameimage, 2, 2);
-                assignImageData (bgsprite, savegameimage);
-
-                changeLabel (new ImageListEntry ("", title, "", extraInfo));
-            } else if (entry.isHTTP) {
-                Request imgget = new Request ("get", entry.uri);
-                imgget.AddHeader ("Accept-Language", "en");
-
-                imgget.Send (httpCallback (bgsprite, entry));
-            } else {
-                // read path @verbatim to avoid escaping
-                byte[] imgdata = System.IO.File.ReadAllBytes (@entry.uri);
-
-                Texture2D bg = new Texture2D (1, 1);
-                bg.LoadImage (imgdata);
-
-                assignImageData (bgsprite, bg);
-                changeLabel(entry);
-            }
-        }
-
-        static void initLabel ()
-        {
-            if (UIView.GetAView ().FindUIComponent ("FlirperAttribution") == null) {
-                UILabel flirperAttribution = UIView.GetAView ().AddUIComponent (typeof(UILabel)) as UILabel;
-                flirperAttribution.name = "FlirperAttribution";
-                flirperAttribution.eventClick += loadNextFlirp;
-
-                flirperAttribution.textAlignment = UIHorizontalAlignment.Right;
-                flirperAttribution.textScale = 2f;
-                flirperAttribution.textScaleMode = UITextScaleMode.ScreenResolution;
-
-                flirperAttribution.outlineColor = new Color32 (0, 0, 0, 200);
-                flirperAttribution.outlineSize = 1;
-                flirperAttribution.useOutline = true;
-            }
-        }
-
         static void changeLabel (String msg) {

             String text = "";
@@ -166,17 +176,13 @@
             changeLabel(text);
         }

-        static void loadNextFlirp (UIComponent component, UIMouseEventParameter eventParam)
-        {
-            UILabel label = ((UILabel)component);
-            if(label.text != "Loading"){
-                label.text = "Loading";
-                FlirperBootstrap.flirpIt();
-            }
-        }
-
-        static void assignImageData (UITextureSprite bgsprite, Texture2D bg)
-        {
+        static void assignImageData (UITextureSprite bgsprite, Texture2D bg) {
+            fadeAssign(bgsprite, bg);
+        }
+
+        static void assignBGsprite (UITextureSprite bgsprite, Texture2D bg)
+        {
+
             //reset to allow multiple flirps without stretching
             bgsprite.width = UIView.GetAView ().GetScreenResolution ().x;
             bgsprite.height = UIView.GetAView ().GetScreenResolution ().y;
@@ -196,5 +202,32 @@
             bgsprite.texture = bg;
             bgsprite.absolutePosition = new Vector3 (0, 0);
         }
+
+        static void fadeAssign (UITextureSprite bgsprite, Texture2D bg)
+        {
+            UITextureSprite cc;
+            cc = UIView.GetAView ().FindUIComponent ("BackgroundHider") as UITextureSprite;
+            if (cc == null) {
+                cc = UIView.GetAView ().AddUIComponent (typeof(UITextureSprite)) as UITextureSprite;
+                cc.name = "BackgroundHider";
+            }
+            cc.zOrder = 1;
+            cc.FitTo (cc.parent);
+            cc.relativePosition = new Vector3 (0, 0);
+            cc.texture = Texture2D.whiteTexture;
+
+            cc.color = new Color32(0,0,0,0);
+
+            ValueAnimator.Animate("HideAnimation",delegate(float val) {
+                cc.color = new Color32(cc.color.r,cc.color.g,cc.color.b,(byte)val);
+            }, new AnimatedFloat(0f,255f,1f,EasingType.CubicEaseIn), delegate() {
+
+                assignBGsprite(bgsprite,bg);
+
+                ValueAnimator.Animate("HideAnimation2",delegate(float val) {
+                    cc.color = new Color32(cc.color.r,cc.color.g,cc.color.b,(byte)val);
+                }, new AnimatedFloat(255f,0f,1f,EasingType.CubicEaseOut));
+            });
+        }
     }
  }


Prevent deadlock in KeyedOperationQueue

Prevent deadlock in KeyedOperationQueue

Disabling this lock is safe because the subscriber list doesn't ever change
once the object is created

--- Akavache/Portable/KeyedOperationQueue.cs
+++ Akavache/Portable/KeyedOperationQueue.cs
@@ -98,11 +98,7 @@
                 Func = asyncCalculationFunc,
             };

-            lock (queuedOps)
-            {
-                queuedOps.OnNext(item);
-            }
-
+            queuedOps.OnNext(item);
             return item.Result;
         }


Disable debugging code.

Disable debugging code.

--- source/Cosmos.Debug.VSDebugEngine/AD7.Impl/AD7Process.cs
+++ source/Cosmos.Debug.VSDebugEngine/AD7.Impl/AD7Process.cs
@@ -283,14 +283,14 @@

             string xPort = mDebugInfo[BuildProperties.VisualStudioDebugPortString];

-            using (var xDebug = new StreamWriter(@"e:\debug.info", false))
-            {
-                foreach (var xItem in mDebugInfo.AllKeys)
-                {
-                    xDebug.WriteLine("{0}: '{1}'", xItem, mDebugInfo[xItem]);
-                }
-                xDebug.Flush();
-            }
+            // using (var xDebug = new StreamWriter(@"e:\debug.info", false))
+            // {
+            //     foreach (var xItem in mDebugInfo.AllKeys)
+            //     {
+            //         xDebug.WriteLine("{0}: '{1}'", xItem, mDebugInfo[xItem]);
+            //     }
+            //     xDebug.Flush();
+            // }

             if (String.IsNullOrWhiteSpace(xPort))
             {


Update ChargePoint/POI model attributes

Update ChargePoint/POI model attributes

--- API/OCM.Net/OCM.API.Model/Base/ChargePoint.cs
+++ API/OCM.Net/OCM.API.Model/Base/ChargePoint.cs
@@ -8,17 +8,40 @@
 {
     public class ChargePoint
     {
+        [DisplayName("OCM Ref")]
         public int ID { get; set; }
+
+        [DisplayName("Unique ID")]
         public string UUID { get; set; }
+
+        [DisplayName("Data Provider")]
         public DataProvider DataProvider { get; set; }
+
+        [DisplayName("Data Providers Reference")]
         public string DataProvidersReference { get; set; }
+
+        [DisplayName("Network/Operator")]
         public OperatorInfo OperatorInfo { get; set; }
+
+        [DisplayName("Operators Ref")]
         public string OperatorsReference { get; set; }
+
+        [DisplayName("Usage Type")]
         public UsageType UsageType { get; set; }
+
+        [DisplayName("Usage Cost")]
         public string UsageCost { get; set; }
+
+        [DisplayName("Address")]
         public AddressInfo AddressInfo { get; set; }
+
+        [DisplayName("Number Of Points/Bays")]
         public int? NumberOfPoints { get; set; }
+
+        [DisplayName("General Comments")]
         public string GeneralComments { get; set; }
+
+        [DisplayName("Date Planned")]
         public DateTime? DatePlanned { get; set; }

         [DisplayName("Date Last Confirmed")]
@@ -30,20 +53,38 @@
         [DisplayName("Date Status Last Updated")]
         public DateTime? DateLastStatusUpdate { get; set; }

+        [DisplayName("Data Quality Level")]
         public int? DataQualityLevel { get; set; }
+
+        [DisplayName("Data Added")]
         public DateTime? DateCreated { get; set; }
+
+        [DisplayName("Contributor")]
         public User Contributor { get; set; }

+        [DisplayName("Submission Status")]
         public SubmissionStatusType SubmissionStatus { get; set; }
+
+        [DisplayName("Comments/Checkins")]
         public List<UserComment> UserComments { get; set; }
+
+        [DisplayName("% Similarity")]
         public int? PercentageSimilarity { get; set; }
+
+        [DisplayName("Equipment Info")]
         public List<ConnectionInfo> Connections { get; set; }
+
+        [DisplayName("Media Items")]
         public List<MediaItem> MediaItems { get; set; }

+        [DisplayName("Metadata")]
+        public List<MetadataValue> MetadataValues { get; set; }
+
+
         #region deprecated properties
-        [JsonIgnore]
+        [Obsolete, JsonIgnore]
         public List<ChargerInfo> Chargers { get; set; }
-        [JsonIgnore]
+        [Obsolete, JsonIgnore]
         public string MetadataTags { get; set; }
         #endregion


Minor tweaks to method FindFileSystemEntryInfo.FindFileSystemEntryInfo()

--- AlphaFS/Filesystem/FindFileSystemEntryInfo.cs
+++ AlphaFS/Filesystem/FindFileSystemEntryInfo.cs
@@ -124,7 +124,7 @@
                      // Directory.GetFiles()
                      // Directory.GetFileSystemEntries()

-                     NativeError.ThrowException(lastError, InputPath);
+                     NativeError.ThrowException(lastError, pathLp);
                      break;

                   case Win32Errors.ERROR_ACCESS_DENIED:
@@ -251,7 +251,7 @@
                   } while (NativeMethods.FindNextFile(handle, out win32FindData));

-                  var lastError = (uint)Marshal.GetLastWin32Error();
+                  var lastError = (uint) Marshal.GetLastWin32Error();

                   if (!ContinueOnException)
                   {
@@ -269,7 +269,7 @@
                      }

                      if (lastError != Win32Errors.NO_ERROR)
-                        NativeError.ThrowException(lastError, InputPath);
+                        NativeError.ThrowException(lastError, pathLp);
                   }
                }
             }
@@ -295,7 +295,7 @@
          using (SafeFindFileHandle handle = FindFirstFile(InputPath, out win32FindData))
          {
             if (handle != null && !handle.IsInvalid)
-               return NewFileSystemEntryType<T>(win32FindData, InputPath, (win32FindData.dwFileAttributes & FileAttributes.Directory) == FileAttributes.Directory);
+               return NewFileSystemEntryType<T>(win32FindData, InputPath, IsDirectory);
          }

          return (T) (object) null;


user merge:  this has to happen in the second submit

--- App/StackExchange.DataExplorer/Models/User.cs
+++ App/StackExchange.DataExplorer/Models/User.cs
@@ -196,7 +196,6 @@
             // User Open Ids
             var userOpenIds = db.UserOpenIds.Where(uoi => uoi.UserId == masterId).ToList();
             var firstOpenId = userOpenIds.First();
-            firstOpenId.OpenIdClaim = User.NormalizeOpenId(firstOpenId.OpenIdClaim);
             userOpenIds = userOpenIds.Skip(1).ToList();
             log.AppendLine(string.Format("Removing {0} inaccessible openids found for master", userOpenIds.Count));
             userOpenIds.ForEach(uoi => log.AppendLine(string.Format("--Dropping {0} as an open id for the master user", uoi.OpenIdClaim)));
@@ -272,6 +271,7 @@
                 okToContinue = submitIfValid(() =>
                 {
                     masterUser.Login = savedLogin;
+                    firstOpenId.OpenIdClaim = User.NormalizeOpenId(firstOpenId.OpenIdClaim);
                     db.SubmitChanges();
                 });
                 if (!okToContinue) return false;


[DDSDK-1] Added workaround for compiler directive mismatch in 2019.1 and 2019.2

--- Assets/DeltaDNA/Editor/ConfigurationWindow.cs
+++ Assets/DeltaDNA/Editor/ConfigurationWindow.cs
@@ -186,10 +186,10 @@
                 true,
                 styleFoldout);
             if (foldoutiOSNotifications)
-            {
-#if UNITY_2019_3_OR_NEWER
-                DrawIOSRichPushNotificationSettings();
-#elif UNITY_2018_4_OR_NEWER
+            {
+#if UNITY_2019_3_OR_NEWER
+                DrawIOSRichPushNotificationSettings();
+#elif UNITY_2018_4_OR_NEWER || UNITY_2019_1 || UNITY_2019_2
                 EditorGUILayout.HelpBox("In order to support iOS Rich Push Notifications in this version of Unity, you must change the build system in the built XCode project to 'legacy' (File -> Project Settings -> Build System). This is done automatically in 2019.3 or newer.", MessageType.Warning);
                 DrawIOSRichPushNotificationSettings();
 #else
@@ -209,23 +209,23 @@
             EditorGUILayout.EndScrollView();
         }

-        private void DrawIOSRichPushNotificationSettings()
-        {
-            EditorGUI.BeginChangeCheck();
-            iOS.enableRichPushNotifications = EditorGUILayout.Toggle(
-                    new GUIContent(
-                        "Enable",
-                        "Tick this to enable rich push notifications in the iOS app"),
-                    iOS.enableRichPushNotifications);
-            iOS.pushNotificationServiceExtensionIdentifier = EditorGUILayout.TextField(
-                new GUIContent(
-                        "Extension Identifier",
-                        "This is the bundle identifier that will be given to the push notification service extension that is added to the XCode project"),
-                    iOS.pushNotificationServiceExtensionIdentifier);
-            if (EditorGUI.EndChangeCheck())
-            {
-                iOS.Dirty = true;
-            }
+        private void DrawIOSRichPushNotificationSettings()
+        {
+            EditorGUI.BeginChangeCheck();
+            iOS.enableRichPushNotifications = EditorGUILayout.Toggle(
+                    new GUIContent(
+                        "Enable",
+                        "Tick this to enable rich push notifications in the iOS app"),
+                    iOS.enableRichPushNotifications);
+            iOS.pushNotificationServiceExtensionIdentifier = EditorGUILayout.TextField(
+                new GUIContent(
+                        "Extension Identifier",
+                        "This is the bundle identifier that will be given to the push notification service extension that is added to the XCode project"),
+                    iOS.pushNotificationServiceExtensionIdentifier);
+            if (EditorGUI.EndChangeCheck())
+            {
+                iOS.Dirty = true;
+            }
         }

         private void Load() {


Add play command to context menu

Add play command to context menu

When only one command is selected, an option will pop up to "Play from
Selected Command"

--- Assets/Fungus/Flowchart/Editor/BlockEditor.cs
+++ Assets/Fungus/Flowchart/Editor/BlockEditor.cs
@@ -790,13 +790,20 @@
 			bool showCopy = false;
 			bool showDelete = false;
 			bool showPaste = false;
-
+            bool showPlay = false;
+
 			if (flowchart.selectedCommands.Count > 0)
 			{
 				showCut = true;
 				showCopy = true;
 				showDelete = true;
-			}
+                if (flowchart.selectedCommands.Count == 1)
+                {
+                    showPlay = true;
+                }
+            }
+
+

 			CommandCopyBuffer commandCopyBuffer = CommandCopyBuffer.GetInstance();

@@ -842,13 +849,22 @@
 			{
 				commandMenu.AddDisabledItem(new GUIContent ("Delete"));
 			}
-
+
+            if (showPlay)
+            {
+                commandMenu.AddItem(new GUIContent("Play from Selected Command"), false, PlayCommand);
+            }
+            else
+            {
+                commandMenu.AddDisabledItem(new GUIContent("Play from Selected Command"));
+            }
+
 			commandMenu.AddSeparator("");

 			commandMenu.AddItem (new GUIContent ("Select All"), false, SelectAll);
 			commandMenu.AddItem (new GUIContent ("Select None"), false, SelectNone);
-
-			commandMenu.ShowAsContext();
+
+            commandMenu.ShowAsContext();
 		}

 		protected void SelectAll()
@@ -1029,7 +1045,15 @@
 			Repaint();
 		}

-		protected void SelectPrevious()
+		protected void PlayCommand()
+        {
+            Block block = target as Block;
+            Flowchart flowchart = block.GetFlowchart();
+            Command command = flowchart.selectedCommands[0];
+            //block.Execute(null, command.commandIndex);
+        }
+
+        protected void SelectPrevious()
 		{
 			Block block = target as Block;
 			Flowchart flowchart = block.GetFlowchart();


Cleanup

Cleanup

--- AnimatorComponent/Editor/SceneHandles.cs
+++ AnimatorComponent/Editor/SceneHandles.cs
@@ -8,6 +8,7 @@
     ///     Class responsible for drawing all on scene handles.
     /// </summary>
     public static class SceneHandles {
+        #region FIELDS

         /// <summary>
         ///     Minimum value below which arc handle drawer method will set the
@@ -15,24 +16,7 @@
         /// </summary>
         private static float MinValueThreshold = 0.01f;

-        public static void DrawPositionHandles(
-            Vector3[] nodeGlobalPositions,
-            Action<int, Vector3> callback) {
-
-            // For each node..
-            for (var i = 0; i < nodeGlobalPositions.Length; i++) {
-                // Draw position handle.
-                var newGlobalPos = Handles.PositionHandle(
-                    nodeGlobalPositions[i],
-                    Quaternion.identity);
-
-                // If node was moved..
-                if (newGlobalPos != nodeGlobalPositions[i]) {
-                    // Execute callback.
-                    callback(i, newGlobalPos);
-                }
-            }
-        }
+        #endregion

         #region METHDOS

@@ -109,7 +93,7 @@
         }

         /// <summary>
-        /// Draws arc tool for each node.
+        ///     Draws arc tool for each node.
         /// </summary>
         /// <param name="nodePositions">Positions to draw the tools.</param>
         /// <param name="curveValues">Values represented by the tools.</param>
@@ -196,6 +180,25 @@
             }
         }

+        public static void DrawPositionHandles(
+            Vector3[] nodeGlobalPositions,
+            Action<int, Vector3> callback) {
+
+            // For each node..
+            for (var i = 0; i < nodeGlobalPositions.Length; i++) {
+                // Draw position handle.
+                var newGlobalPos = Handles.PositionHandle(
+                    nodeGlobalPositions[i],
+                    Quaternion.identity);
+
+                // If node was moved..
+                if (newGlobalPos != nodeGlobalPositions[i]) {
+                    // Execute callback.
+                    callback(i, newGlobalPos);
+                }
+            }
+        }
+
         public static void DrawRemoveNodeButtons(
             Vector3[] nodePositions,
             int offsetH,
@@ -274,8 +277,6 @@
                 labelHeight,
                 style);
         }
-
-        #region DrawArcTool()

         private static void DrawArcHandle(
             Vector3 position,
@@ -409,6 +410,81 @@
                 callback);
         }

+        private static bool DrawButton(
+            Vector2 position,
+            int relativeXPos,
+            int relativeYPos,
+            int width,
+            int height,
+            GUIStyle style,
+            string buttonText = "") {
+
+            // Create rectangle for the "+" button.
+            var rectAdd = new Rect(
+                position.x + relativeXPos,
+                position.y + relativeYPos,
+                width,
+                height);
+
+            // Draw the "+" button.
+            var addButtonPressed = GUI.Button(rectAdd, buttonText, style);
+
+            return addButtonPressed;
+        }
+
+        private static Vector3 DrawCustomPositionHandle(
+            Vector3 nodePosition,
+            float handleSize,
+            Color handleColor,
+            Handles.DrawCapFunction capFunction) {
+
+            // Set handle color.
+            Handles.color = handleColor;
+
+            // Get handle size.
+            var movementHandleSize = HandleUtility.GetHandleSize(nodePosition);
+            var sphereSize = movementHandleSize * handleSize;
+
+            // Draw handle.
+            var newPos = Handles.FreeMoveHandle(
+                nodePosition,
+                Quaternion.identity,
+                sphereSize,
+                Vector3.zero,
+                capFunction);
+            return newPos;
+        }
+
+        private static void DrawNodeLabel(
+            Vector3 nodeGlobalPosition,
+            string value,
+            int offsetX,
+            int offsetY,
+            int labelWidth,
+            int labelHeight,
+            GUIStyle style) {
+
+            // Translate node's 3d position into screen coordinates.
+            var guiPoint = HandleUtility.WorldToGUIPoint(nodeGlobalPosition);
+
+            // Create rectangle for the label.
+            var labelPosition = new Rect(
+                guiPoint.x + offsetX,
+                guiPoint.y + offsetY,
+                labelWidth,
+                labelHeight);
+
+            Handles.BeginGUI();
+
+            // Draw label.
+            GUI.Label(
+                labelPosition,
+                value,
+                style);
+
+            Handles.EndGUI();
+        }
+
         /// <summary>
         ///     Save new tilting value to animation curve.
         /// </summary>
@@ -450,83 +526,6 @@
         }

         #endregion
-
-        private static bool DrawButton(
-            Vector2 position,
-            int relativeXPos,
-            int relativeYPos,
-            int width,
-            int height,
-            GUIStyle style,
-            string buttonText = "") {
-
-            // Create rectangle for the "+" button.
-            var rectAdd = new Rect(
-                position.x + relativeXPos,
-                position.y + relativeYPos,
-                width,
-                height);
-
-            // Draw the "+" button.
-            var addButtonPressed = GUI.Button(rectAdd, buttonText, style);
-
-            return addButtonPressed;
-        }
-
-        private static Vector3 DrawCustomPositionHandle(
-            Vector3 nodePosition,
-            float handleSize,
-            Color handleColor,
-            Handles.DrawCapFunction capFunction) {
-
-            // Set handle color.
-            Handles.color = handleColor;
-
-            // Get handle size.
-            var movementHandleSize = HandleUtility.GetHandleSize(nodePosition);
-            var sphereSize = movementHandleSize * handleSize;
-
-            // Draw handle.
-            var newPos = Handles.FreeMoveHandle(
-                nodePosition,
-                Quaternion.identity,
-                sphereSize,
-                Vector3.zero,
-                capFunction);
-            return newPos;
-        }
-
-        private static void DrawNodeLabel(
-            Vector3 nodeGlobalPosition,
-            string value,
-            int offsetX,
-            int offsetY,
-            int labelWidth,
-            int labelHeight,
-            GUIStyle style) {
-
-            // Translate node's 3d position into screen coordinates.
-            var guiPoint = HandleUtility.WorldToGUIPoint(nodeGlobalPosition);
-
-            // Create rectangle for the label.
-            var labelPosition = new Rect(
-                guiPoint.x + offsetX,
-                guiPoint.y + offsetY,
-                labelWidth,
-                labelHeight);
-
-            Handles.BeginGUI();
-
-            // Draw label.
-            GUI.Label(
-                labelPosition,
-                value,
-                style);
-
-            Handles.EndGUI();
-        }
-
-        #endregion
     }

 }


Progress bar display is a little nicer looking... still not great tho

--- Assets/PreviewTween/Editor/TweenBaseEditor.cs
+++ Assets/PreviewTween/Editor/TweenBaseEditor.cs
@@ -90,6 +90,8 @@
             GUIStyle leftStyle = GUI.skin.FindStyle("LargeButtonLeft");
             GUIStyle middleStyle = GUI.skin.FindStyle("LargeButtonMid");
             GUIStyle rightStyle = GUI.skin.FindStyle("LargeButtonRight");
+            GUIStyle progressBarStyle = GUI.skin.FindStyle("ProgressBarBack");
+            GUIStyle thumbStyle = GUI.skin.FindStyle("MeTransPlayhead");

             EditorGUILayout.BeginHorizontal();

@@ -101,14 +103,18 @@

             EditorGUILayout.EndHorizontal();

+            EditorGUILayout.Separator();
             EditorGUI.BeginDisabledGroup(_mode != PreviewMode.None);
-            float newValue = EditorGUILayout.Slider(_tween.progress, 0f, 1f);
+            //float newValue = EditorGUILayout.Slider(_tween.progress, 0f, 1f);
+            Rect progressRect = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.ExpandWidth(true), GUILayout.Height(40));
+            float newValue = PreviewProgress(progressRect, _tween.progress, progressBarStyle, thumbStyle);
             if (!Mathf.Approximately(newValue, _tween.progress))
             {
                 _tween.progress = newValue;
                 _tween.Apply();
             }
             EditorGUI.EndDisabledGroup();
+            EditorGUILayout.Separator();
         }

         private void DrawRecordStartButton(GUIStyle leftStyle)
@@ -217,6 +223,83 @@
             EditorGUI.EndDisabledGroup();
         }

+        private static float PreviewProgress(Rect controlRect, float value, GUIStyle barStyle, GUIStyle thumbStyle)
+        {
+            Texture2D thumbTexture = thumbStyle.normal.background;
+
+            // give our slider a little bit of a buffer
+            Rect backgroundRect = new Rect
+            {
+                x = controlRect.x + thumbTexture.width / 2f,
+                y = controlRect.y + thumbTexture.height,
+                width = controlRect.width - thumbTexture.width,
+                height = controlRect.height - thumbTexture.height
+            };
+
+            int controlId = GUIUtility.GetControlID(FocusType.Passive);
+            switch (Event.current.GetTypeForControl(controlId))
+            {
+                case EventType.Repaint:
+                    {
+                        // Draw the texture from the GUIStyle
+                        GUI.DrawTexture(backgroundRect, barStyle.normal.background, ScaleMode.StretchToFill);
+                        break;
+                    }
+                case EventType.MouseDown:
+                    {
+                        // If the click is actually on us...
+                        // ...and the click is with the left mouse button (button 0)...
+                        if (controlRect.Contains(Event.current.mousePosition) && Event.current.button == 0)
+                        {
+                            // ...then capture the mouse by setting the hotControl.
+                            GUIUtility.hotControl = controlId;
+                        }
+
+                        break;
+                    }
+                case EventType.MouseUp:
+                    {
+                        // If we were the hotControl, we aren't any more.
+                        if (GUIUtility.hotControl == controlId)
+                        {
+                            GUIUtility.hotControl = 0;
+                        }
+
+                        break;
+                    }
+            }
+
+            if (Event.current.isMouse && GUIUtility.hotControl == controlId)
+            {
+                // Get mouse X position relative to left edge of the control
+                float relativeX = Event.current.mousePosition.x - backgroundRect.x;
+
+                // Divide by control width to get a value between 0 and 1
+                value = Mathf.Clamp01(relativeX / backgroundRect.width);
+
+                // Report that the data in the GUI has changed
+                GUI.changed = true;
+
+                // Mark event as 'used' so other controls don't respond to it, and to
+                // trigger an automatic repaint.
+                Event.current.Use();
+            }
+
+            // calculate where our thumb is now
+            Rect thumbRect = new Rect
+            {
+                x = backgroundRect.x + value * backgroundRect.width - thumbTexture.width / 2f,
+                y = controlRect.y,
+                width = thumbTexture.width,
+                height = thumbTexture.height
+            };
+
+            // Draw the thumb texture
+            GUI.DrawTexture(thumbRect, thumbTexture);
+
+            return value;
+        }
+
         private void UpdatePreview()
         {
             // if we are paused we dont want to do anything


Fix loop variable references

Fix loop variable references

--- Antlr4.Runtime/Atn/ParserATNSimulator.cs
+++ Antlr4.Runtime/Atn/ParserATNSimulator.cs
@@ -1773,9 +1773,9 @@
                 }
                 if (!exact && optimize_hidden_conflicted_configs)
                 {
-                    for (int j = firstIndexCurrentState; j_1 <= lastIndexCurrentStateMinAlt; j_1++)
-                    {
-                        ATNConfig checkConfig = configs[j_1];
+                    for (int j = firstIndexCurrentState; j <= lastIndexCurrentStateMinAlt; j++)
+                    {
+                        ATNConfig checkConfig = configs[j];
                         if (checkConfig.GetSemanticContext() != SemanticContext.None && !checkConfig.GetSemanticContext
                             ().Equals(config.GetSemanticContext()))
                         {


Scan redis servers to make sure all keys are found.

--- src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs
+++ src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs
@@ -273,7 +273,12 @@
         public override IEnumerable<string> Keys(string pattern, string region)
         {
             var keyPattern = GetKey(pattern, region);
-            return _connection.Servers.First().Keys(_redisConfiguration.Database, keyPattern).Select(k => k.ToString());
+
+            // Keys are spread out across the cluster, slaves should contain a complete copy of their master nodes, so ignore them.
+            return _connection
+                .Servers
+                .Where(s => s.IsConnected && !s.IsSlave).
+                SelectMany(s => s.Keys(_redisConfiguration.Database, keyPattern).Select(k => k.ToString()));
         }

         /// <inheritdoc />


Unit test ouput generator mission lint checks

--- AnvilEditorTests/OutputGeneratorTests.cs
+++ AnvilEditorTests/OutputGeneratorTests.cs
@@ -1,12 +1,10 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using AnvilEditor;
-using NUnit.Framework;
-namespace AnvilEditor.Tests
+namespace AnvilEditor.Tests
 {
+    using NUnit.Framework;
+    using System.Windows;
+
+    using AnvilEditor.Models;
+
     [TestFixture()]
     public class OutputGeneratorTests
     {
@@ -17,9 +15,47 @@
         }

         [Test()]
-        public void CompleteChecksTest()
+        public void CompleteChecksShouldIdentifyOverPopulatedObjectives()
         {
-            Assert.Fail();
+            var m = new Mission();
+            var o = m.AddObjective(new Point(10, 10));
+            o.Infantry = 1000;
+            o.Radius = 50;
+
+            var result = OutputGenerator.CompleteChecks(m);
+
+            Assert.IsTrue(result.Contains("Occupation of objective 0"));
+        }
+
+        [Test()]
+        public void CompleteChecksShouldIdentifySameFriendlyAndEnemySide()
+        {
+            var m = new Mission();
+            m.FriendlySide = "EAST";
+            m.EnemySide = "EAST";
+            var result = OutputGenerator.CompleteChecks(m);
+
+            Assert.IsTrue(result.Contains("The friendly and enemy side are the same"));
+        }
+
+        [Test()]
+        public void CompleteChecksShouldIdentifyUnoccupiedObjectives()
+        {
+            var m = new Mission();
+            var o = m.AddObjective(new Point(10, 10));
+            var result = OutputGenerator.CompleteChecks(m);
+
+            Assert.IsTrue(result.Contains("There are 1 unoccupied objective"));
+        }
+
+        [Test()]
+        public void CompleteChecksShouldIdentifyUnoccupiedAmbientZones()
+        {
+            var m = new Mission();
+            var z = m.SetAmbientZone(new Point(1, 1));
+            var result = OutputGenerator.CompleteChecks(m);
+
+            Assert.IsTrue(result.Contains("There are 1 unoccupied ambient zone"));
         }
     }
 }


removed: unnecessary logs.

removed: unnecessary logs.

--- Assets/Autoya/Purchase/PurchaseRouter.cs
+++ Assets/Autoya/Purchase/PurchaseRouter.cs
@@ -891,19 +891,17 @@
             var purchaseCancelledUrl = PurchaseSettings.PURCHASE_URL_CANCEL;
             var dataStr = JsonUtility.ToJson(new PurchaseFailed(callbacks.ticketId, currentTransactionId, reason));
             var connectionId = PurchaseSettings.PURCHASE_CONNECTIONID_CANCEL_PREFIX + Guid.NewGuid().ToString();
-            Debug.Log("purchaseCancelledUrl:" + purchaseCancelledUrl);
+
             var cor = HttpPost(
                 connectionId,
                 purchaseCancelledUrl,
                 dataStr,
                 (conId, responseData) =>
                 {
-                    Debug.Log("responseData:" + responseData);
                     // do nothing.
                 },
                 (conId, code, errorReason) =>
                 {
-                    Debug.Log("errorReason:" + errorReason);
                     // do nothing.
                 }
             );


removed rogue imports

removed rogue imports

--- Assets/DeltaDNA/Triggers/EventTrigger.cs
+++ Assets/DeltaDNA/Triggers/EventTrigger.cs
@@ -17,9 +17,6 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Runtime.CompilerServices;
-using NUnit.Framework.Constraints;
-using UnityEngine;

 namespace DeltaDNA {


Change stickers export to name the stickers with the name defined in the pack and use correct file extension at export

Makes more sense to me.

--- Assets/Stickers/Editor/StickersExport.cs
+++ Assets/Stickers/Editor/StickersExport.cs
@@ -139,7 +139,7 @@
             {
                 if (sticker.Frames.Count == 1)
                 {
-                    ExportSticker(pathToStickers, sticker.Frames[0], pathToProject);
+                    ExportSticker(pathToStickers, sticker, pathToProject);
                 }
                 else
                 {
@@ -148,11 +148,13 @@
             }
         }

-        private static void ExportSticker(string pathToStickers, Texture2D sticker, string pathToProject)
-        {
-			if (sticker == null) return;
-
-            var pathToSticker = pathToStickers + "/" + sticker.name + ".sticker";
+        private static void ExportSticker(string pathToStickers, Sticker sticker, string pathToProject)
+        {
+            if (sticker == null || sticker.Frames[0] == null) return;
+
+            var stickerTexture = sticker.Frames[0];
+
+            var pathToSticker = pathToStickers + "/" + sticker.Name + ".sticker";

             if (Directory.Exists(pathToSticker))
             {
@@ -160,19 +162,24 @@
             }

             Directory.CreateDirectory(pathToSticker);
-
-            var json = CreateStickerContent(sticker);
+            var unityAssetPath = pathToProject + "/" + AssetDatabase.GetAssetPath(stickerTexture);
+
+            var newFileName = sticker.Name;
+            var fileExtension = Path.GetExtension(unityAssetPath);
+
+
+            var json = CreateStickerContent(newFileName + fileExtension);
             Log("writing " + pathToSticker + "/Contents.json");
             json.WriteToFile(pathToSticker + "/Contents.json");
-            var oldPath = pathToProject + "/" + AssetDatabase.GetAssetPath(sticker);
-            var fileName = pathToSticker + "/" + sticker.name + ".png";
+
+            var xcodeAssetPath = pathToSticker + "/" + newFileName + fileExtension;

             var count = 0;
-            while (File.Exists(fileName))
-            {
-                fileName = pathToSticker + "/" + sticker.name + count + ".png";
-            }
-            File.Copy(oldPath, fileName);
+            while (File.Exists(xcodeAssetPath))
+            {
+                xcodeAssetPath = pathToSticker + "/" + newFileName + count.ToString() + fileExtension;
+            }
+            File.Copy(unityAssetPath, xcodeAssetPath);
         }

         private static void ExportStickerSequence(string pathToStickers, Sticker stickerSequence, string pathToProject)
@@ -275,12 +282,12 @@
             return content;
         }

-        public static JsonDocument CreateStickerContent(Texture2D file)
+        public static JsonDocument CreateStickerContent(string filename)
         {
             var content = CreateContent();

             var properties = content.root.CreateDict("properties");
-            properties.SetString("filename", file.name + ".png");
+            properties.SetString("filename", filename);
             return content;
         }


Version bump.

Version bump.

--- Austin.Linode/Properties/AssemblyInfo.cs
+++ Austin.Linode/Properties/AssemblyInfo.cs
@@ -14,5 +14,5 @@
 [assembly: ComVisible(false)]
 [assembly: Guid("d012d95d-8bbe-4382-b610-8cd1205fbd36")]

-[assembly: AssemblyVersion("0.1.1.0")]
-[assembly: AssemblyFileVersion("0.1.1.0")]
+[assembly: AssemblyVersion("0.2.0.0")]
+[assembly: AssemblyFileVersion("0.2.0.0")]


Streamlines link-creation for patterns with 0 parameters.

--- main/System.Web.Mvc.Html/HtmlHelper_Extensions.cs
+++ main/System.Web.Mvc.Html/HtmlHelper_Extensions.cs
@@ -20,6 +20,11 @@
 	/// </summary>
 	public static class HtmlHelper_Extensions
 	{
+		public static KeyValuePair<string, PotentialUrl> Link(this string linkText, UrlPattern pathWithoutParameters)
+		{
+			return linkText.Link(pathWithoutParameters.Url);
+		}
+
 		public static KeyValuePair<string, PotentialUrl> Link(this string linkText, PotentialUrl location)
 		{
 			return new KeyValuePair<string, PotentialUrl>(linkText, location);
@@ -28,6 +33,11 @@
 		public static MvcHtmlString Link(this HtmlHelper self, KeyValuePair<string, PotentialUrl> link, object htmlAttributes = null)
 		{
 			return self.Link(link.Key, link.Value, htmlAttributes);
+		}
+
+		public static MvcHtmlString Link(this HtmlHelper self, string linkText, UrlPattern pathWithoutParameters, object htmlAttributes = null)
+		{
+			return self.Link(linkText, pathWithoutParameters.Url, htmlAttributes);
 		}

 		public static MvcHtmlString Link(this HtmlHelper self, string linkText, PotentialUrl location, object htmlAttributes = null)
@@ -53,6 +63,11 @@
 			return MvcHtmlString.Create(linkString);
 		}

+		public static string Of(this UrlHelper self, UrlPattern pathWithoutParameters)
+		{
+			return self.Of(pathWithoutParameters.Url);
+		}
+
 		public static string Of(this UrlHelper self, PotentialUrl location)
 		{
 			return location.Resolved(self.RequestContext.HttpContext);


Remove left-over ApplicationContext.cs that was moved to Hyena

--- src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs
+++ src/Core/Banshee.Core/Banshee.Base/ApplicationContext.cs
@@ -1,79 +0,0 @@
-//
-// ApplicationContext.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//
-// Copyright (C) 2007 Novell, 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 in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-
-using Hyena;
-using Hyena.CommandLine;
-
-namespace Banshee.Base
-{
-    public delegate void InvokeHandler ();
-
-    public static class ApplicationContext
-    {
-        static ApplicationContext ()
-        {
-            Log.Debugging = Debugging;
-        }
-
-        private static CommandLineParser command_line = new CommandLineParser ();
-        public static CommandLineParser CommandLine {
-            set { command_line = value; }
-            get { return command_line; }
-        }
-
-        private static Layout command_line_layout;
-        public static Layout CommandLineLayout {
-            get { return command_line_layout; }
-            set { command_line_layout = value; }
-        }
-
-        private static bool? debugging = null;
-        public static bool Debugging {
-            get {
-                if (debugging == null) {
-                    debugging = CommandLine.Contains ("debug");
-                    debugging |= CommandLine.Contains ("debug-sql");
-                    debugging |= EnvironmentIsSet ("BANSHEE_DEBUG");
-                }
-
-                return debugging.Value;
-            }
-        }
-
-        public static bool EnvironmentIsSet (string env)
-        {
-            return !String.IsNullOrEmpty (Environment.GetEnvironmentVariable (env));
-        }
-
-        public static System.Globalization.CultureInfo InternalCultureInfo {
-            get { return System.Globalization.CultureInfo.InvariantCulture; }
-        }
-    }
-}


Remove duplicated code

Remove duplicated code

--- osu.Game/Screens/Menu/ButtonSystem.cs
+++ osu.Game/Screens/Menu/ButtonSystem.cs
@@ -227,23 +227,9 @@
                     {
                         case MenuState.Exit:
                         case MenuState.Initial:
-                            trackingPosition = false;
-
                             buttonAreaBackground.ScaleTo(Vector2.One, 500, Easing.Out);
                             buttonArea.FadeOut(300);

-                            logo?.Delay(150)
-                                .Schedule(() =>
-                                {
-                                    toolbar?.Hide();
-
-                                    logo.ClearTransforms(targetMember: nameof(Position));
-                                    logo.RelativePositionAxes = Axes.Both;
-
-                                    logo.MoveTo(new Vector2(0.5f), 800, Easing.OutExpo);
-                                    logo.ScaleTo(1, 800, Easing.OutExpo);
-                                });
-
                             foreach (Button b in buttonsTopLevel)
                                 b.State = ButtonState.Contracted;

@@ -255,33 +241,6 @@
                             break;
                         case MenuState.TopLevel:
                             buttonAreaBackground.ScaleTo(Vector2.One, 200, Easing.Out);
-
-                            logo.ClearTransforms(targetMember: nameof(Position));
-                            logo.RelativePositionAxes = Axes.None;
-
-                            trackingPosition = true;
-
-                            switch (lastState)
-                            {
-                                case MenuState.Initial:
-                                    logo.ScaleTo(0.5f, 200, Easing.In);
-
-                                    trackingPosition = false;
-
-                                    logo
-                                        .MoveTo(iconTrackingPosition, lastState == MenuState.EnteringMode ? 0 : 200, Easing.In)
-                                        .OnComplete(o =>
-                                        {
-                                            trackingPosition = true;
-
-                                            o.Impact();
-                                            toolbar?.Show();
-                                        });
-                                    break;
-                                default:
-                                    logo.ScaleTo(0.5f, 200, Easing.OutQuint);
-                                    break;
-                            }

                             buttonArea.FadeIn(300);

@@ -300,8 +259,6 @@
                             break;
                         case MenuState.EnteringMode:
                             buttonAreaBackground.ScaleTo(new Vector2(2, 0), 300, Easing.InSine);
-
-                            trackingPosition = true;

                             buttonsTopLevel.ForEach(b => b.ContractStyle = 1);
                             buttonsPlay.ForEach(b => b.ContractStyle = 1);


Reduce volume requirement for showing muted notification to 1%

--- osu.Game/Screens/Play/PlayerLoader.cs
+++ osu.Game/Screens/Play/PlayerLoader.cs
@@ -502,7 +502,7 @@

         private int restartCount;

-        private const double volume_requirement = 0.05;
+        private const double volume_requirement = 0.01;

         private void showMuteWarningIfNeeded()
         {


Make tests happy.

Make tests happy.

--- src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs
+++ src/EditorFeatures/Test/Utilities/PatternMatcherTests.cs
@@ -768,14 +768,14 @@
             if (matches.IsDefaultOrEmpty)
             {
                 Assert.True(expectedSpans == null || expectedSpans.Count == 0);
+                return null;
             }
             else
             {
                 var actualSpans = matches.SelectMany(m => m.MatchedSpans).OrderBy(s => s.Start).ToList();
                 Assert.Equal(expectedSpans, actualSpans);
+                return matches;
             }
-
-            return matches;
         }
     }
 }


fix graph not completely hiding

fix graph not completely hiding

--- osu.Game/Screens/Play/SongProgress.cs
+++ osu.Game/Screens/Play/SongProgress.cs
@@ -172,7 +172,7 @@
             float barHeight = bottom_bar_height + handle_size.Y;

             bar.ResizeHeightTo(CollapseGraph.Value ? barHeight : barHeight + graph_height, transition_duration, Easing.In);
-            graph.MoveToY(CollapseGraph.Value ? graph_height : 0, transition_duration, Easing.In);
+            graph.MoveToY(CollapseGraph.Value ? bottom_bar_height + graph_height : 0, transition_duration, Easing.In);

             updateInfoMargin();
         }


removed unnecessary using

removed unnecessary using

--- osu.Game/Screens/Select/SongSelect.cs
+++ osu.Game/Screens/Select/SongSelect.cs
@@ -2,7 +2,6 @@
 // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE

 using System;
-using System.Linq;
 using System.Threading;
 using OpenTK;
 using OpenTK.Input;


Remove detour for string in ToGroovy.

Remove detour for string in ToGroovy.

--- src/ExRam.Gremlinq.Core/Extensions/BytecodeExtensions.cs
+++ src/ExRam.Gremlinq.Core/Extensions/BytecodeExtensions.cs
@@ -101,13 +101,6 @@

                             break;
                         }
-                        case string str when allowEnumerableExpansion:
-                        {
-                            // ReSharper disable once TailRecursiveCall
-                            Append(str);
-
-                            break;
-                        }
                         case Type type:
                         {
                             builder.Append(type.Name);


Oops, forgot to pass in options

Oops, forgot to pass in options

--- plugins/p5.web/misc/Minify.cs
+++ plugins/p5.web/misc/Minify.cs
@@ -68,7 +68,7 @@
                 // Turning off ALL comments.
                 var options = new Microsoft.Ajax.Utilities.CssSettings ();
                 options.CommentMode = Microsoft.Ajax.Utilities.CssComment.None;
-                e.Args.Value = minifier.MinifyStyleSheet (css);
+                e.Args.Value = minifier.MinifyStyleSheet (css, options);
             }
         }
     }


#full New up to 6 args

#full New up to 6 args

--- src/FastExpressionCompiler.LightExpression/Expression.cs
+++ src/FastExpressionCompiler.LightExpression/Expression.cs
@@ -231,6 +231,10 @@
         public static NewExpression New(ConstructorInfo ctor,
             Expression arg0, Expression arg1, Expression arg2, Expression arg3, Expression arg4) =>
             new FiveArgumentsNewExpression(ctor, arg0, arg1, arg2, arg3, arg4);
+
+        public static NewExpression New(ConstructorInfo ctor,
+            Expression arg0, Expression arg1, Expression arg2, Expression arg3, Expression arg4, Expression arg5) =>
+            new SixArgumentsNewExpression(ctor, arg0, arg1, arg2, arg3, arg4, arg5);

         public static MethodCallExpression Call(MethodInfo method, params Expression[] arguments) =>
             arguments == null || arguments.Length == 0
@@ -2217,11 +2221,9 @@
         public override IReadOnlyList<Expression> Arguments => new[] { Argument0, Argument1 };
         public override int ArgumentCount => 2;
         public override Expression GetArgument(int i) => i == 0 ? Argument0 : Argument1;
-        internal TwoArgumentsNewExpression(ConstructorInfo constructor,
-            Expression argument0, Expression argument1) : base(constructor)
-        {
-            Argument0 = argument0;
-            Argument1 = argument1;
+        internal TwoArgumentsNewExpression(ConstructorInfo constructor, Expression a0, Expression a1) : base(constructor)
+        {
+            Argument0 = a0; Argument1 = a1;
         }
     }

@@ -2233,11 +2235,9 @@
         public override Expression GetArgument(int i) =>
             i == 0 ? Argument0 : i == 1 ? Argument1 : Argument2;
         internal ThreeArgumentsNewExpression(ConstructorInfo constructor,
-            Expression argument0, Expression argument1, Expression argument2) : base(constructor)
-        {
-            Argument0 = argument0;
-            Argument1 = argument1;
-            Argument2 = argument2;
+            Expression a0, Expression a1, Expression a2) : base(constructor)
+        {
+            Argument0 = a0; Argument1 = a1; Argument2 = a2;
         }
     }

@@ -2249,12 +2249,9 @@
         public override Expression GetArgument(int i) =>
             i == 0 ? Argument0 : i == 1 ? Argument1 : i == 2 ? Argument2 : Argument3;
         internal FourArgumentsNewExpression(ConstructorInfo constructor,
-            Expression argument0, Expression argument1, Expression argument2, Expression argument3) : base(constructor)
-        {
-            Argument0 = argument0;
-            Argument1 = argument1;
-            Argument2 = argument2;
-            Argument3 = argument3;
+            Expression a0, Expression a1, Expression a2, Expression a3) : base(constructor)
+        {
+            Argument0 = a0; Argument1 = a1; Argument2 = a2; Argument3 = a3;
         }
     }

@@ -2266,23 +2263,35 @@
         public override Expression GetArgument(int i) =>
             i == 0 ? Argument0 : i == 1 ? Argument1 : i == 2 ? Argument2 : i == 3 ? Argument3 : Argument4;
         internal FiveArgumentsNewExpression(ConstructorInfo constructor,
-            Expression argument0, Expression argument1, Expression argument2, Expression argument3, Expression argument4) : base(constructor)
-        {
-            Argument0 = argument0;
-            Argument1 = argument1;
-            Argument2 = argument2;
-            Argument3 = argument3;
-            Argument4 = argument4;
+            Expression a0, Expression a1, Expression a2, Expression a3, Expression a4) : base(constructor)
+        {
+            Argument0 = a0; Argument1 = a1; Argument2 = a2; Argument3 = a3; Argument4 = a4;
+        }
+    }
+
+    public sealed class SixArgumentsNewExpression : NewExpression
+    {
+        public readonly Expression Argument0, Argument1, Argument2, Argument3, Argument4, Argument5;
+        public override IReadOnlyList<Expression> Arguments =>
+            new[] { Argument0, Argument1, Argument2, Argument3, Argument4, Argument5 };
+        public override int ArgumentCount => 6;
+        public override Expression GetArgument(int i) =>
+            i == 0 ? Argument0 : i == 1 ? Argument1 : i == 2 ? Argument2 : i == 3 ? Argument3 : i == 4 ? Argument4 : Argument5;
+        internal SixArgumentsNewExpression(ConstructorInfo constructor,
+            Expression a0, Expression a1, Expression a2, Expression a3, Expression a4, Expression a5) : base(constructor)
+        {
+            Argument0 = a0; Argument1 = a1; Argument2 = a2; Argument3 = a3; Argument4 = a4; Argument4 = a5;
         }
     }

     public sealed class ManyArgumentsNewExpression : NewExpression
     {
-        public override IReadOnlyList<Expression> Arguments { get; }
-        public override int ArgumentCount => Arguments.Count;
-        public override Expression GetArgument(int i) => Arguments[i];
+        private readonly IReadOnlyList<Expression> _arguments;
+        public override IReadOnlyList<Expression> Arguments => _arguments;
+        public override int ArgumentCount => _arguments.Count;
+        public override Expression GetArgument(int i) => _arguments[i];
         internal ManyArgumentsNewExpression(ConstructorInfo constructor, IReadOnlyList<Expression> arguments) : base(constructor) =>
-            Arguments = arguments;
+            _arguments = arguments;
     }

     public abstract class NewArrayExpression : Expression, IArgumentProvider
@@ -2381,11 +2390,12 @@

     public class ManyArgumentsMethodCallExpression : MethodCallExpression
     {
-        public override IReadOnlyList<Expression> Arguments { get; }
-        public override int ArgumentCount => Arguments.Count;
-        public override Expression GetArgument(int i) => Arguments[i];
+        private readonly IReadOnlyList<Expression> _arguments;
+        public sealed override IReadOnlyList<Expression> Arguments => _arguments;
+        public sealed override int ArgumentCount => _arguments.Count;
+        public sealed override Expression GetArgument(int i) => _arguments[i];
         internal ManyArgumentsMethodCallExpression(MethodInfo method, IReadOnlyList<Expression> arguments) : base(method) =>
-            Arguments = arguments;
+            _arguments = arguments;
     }

     public sealed class InstanceManyArgumentsMethodCallExpression : ManyArgumentsMethodCallExpression


options window and keybind settings implementation done on the UI side

--- rgatCore/rgatUI.cs
+++ rgatCore/rgatUI.cs
@@ -54,6 +54,7 @@
             Console.WriteLine("State created");
             GlobalConfig.InitDefaultConfig();
             Console.WriteLine("Config Inited");
+            InitSettings();

             _ImGuiController = imguicontroller;

@@ -204,6 +205,12 @@

         private void CloseDialogs()
         {
+            if (_pendingKeybind.active)
+            {
+                _pendingKeybind.active = false;
+                return;
+            }
+
             _show_load_trace_window = false;
             _settings_window_shown = false;
             _show_select_exe_window = false;
@@ -1315,17 +1322,166 @@

         }

+        static bool[] optionsSelectStates;
+        static List<string> settingsNames = new List<string>();
+        enum eSettingsCategory { eSetting1, eSetting2, eSetting3, eKeybinds, eSetting5, eSetting6 };
+        void InitSettings()
+        {
+            settingsNames = new List<string>();
+            settingsNames.Add("Setting1");
+            settingsNames.Add("Setting2");
+            settingsNames.Add("Setting3");
+            settingsNames.Add("Keybinds");
+            settingsNames.Add("Setting5");
+            settingsNames.Add("Setting6");
+            optionsSelectStates = new bool[settingsNames.Count];
+            optionsSelectStates[(int)eSettingsCategory.eKeybinds] = true;
+
+
+        }
+
         private unsafe void DrawSettingsWindow()
         {
-            ImGui.SetNextWindowPos(new Vector2(200, 200), ImGuiCond.Appearing);
+            //ImGui.SetNextWindowPos(new Vector2(700, 500), ImGuiCond.Appearing);

             ImGuiWindowFlags window_flags = ImGuiWindowFlags.None;

             ImGui.Begin("Settings", ref _settings_window_shown, window_flags);
-            ImGui.InputText("f", Encoding.ASCII.GetBytes("CHUNK THE FUNK"), 120);
-            ImGui.Text("Here be settings");
+
+            if (ImGui.BeginChildFrame(ImGui.GetID("SettingsCategories"), new Vector2(200, ImGui.GetContentRegionAvail().Y)))
+            {
+                for (int i = 0; i < settingsNames.Count; i++)
+                {
+                    if (ImGui.Selectable(settingsNames[i], ref optionsSelectStates[i]))
+                    {
+                        Array.Clear(optionsSelectStates, 0, optionsSelectStates.Length);
+                        optionsSelectStates[i] = true;
+                    }
+                }
+                ImGui.EndChildFrame();
+            }
+            ImGui.SameLine();
+            if (ImGui.BeginChildFrame(ImGui.GetID("SettingContent"), ImGui.GetContentRegionAvail()))
+            {
+                for (var i = 0; i < optionsSelectStates.Length; i++)
+                {
+                    if (optionsSelectStates[i])
+                    {
+                        CreateSettingsContentPane(settingCategoryName: settingsNames[i]);
+                        break;
+                    }
+                }
+                ImGui.EndChildFrame();
+            }
             ImGui.End();
         }
+
+
+        void CreateSettingsContentPane(string settingCategoryName)
+        {
+            switch (settingCategoryName)
+            {
+                case "Keybinds":
+                    CreateOptionsPane_Keybinds();
+                    break;
+                default:
+                    Console.WriteLine($"Warning: Bad option category '{settingCategoryName}' selected");
+                    break;
+            }
+        }
+
+
+        static PendingKeybind _pendingKeybind = new PendingKeybind();
+
+        void CreateKeybindInput(string caption, eKeybind keyAction, int rowIndex)
+        {
+
+            if ((rowIndex % 2) == 0)
+                ImGui.PushStyleColor(ImGuiCol.FrameBg, 0xafcc3500);
+            else
+                ImGui.PushStyleColor(ImGuiCol.FrameBg, 0xafdc4500);
+
+            if (ImGui.BeginChildFrame(ImGui.GetID(caption), new Vector2(ImGui.GetContentRegionAvail().X, 30), ImGuiWindowFlags.NoScrollbar))
+            {
+                ImGui.Columns(3, "kcols" + caption, false);
+                ImGui.SetColumnWidth(0, ImGui.GetItemRectSize().X - 300);
+                ImGui.SetColumnWidth(1, 150);
+                ImGui.SetColumnWidth(2, 150);
+                ImGui.AlignTextToFramePadding();
+                ImGui.Text(caption);
+                ImGui.NextColumn();
+                ImGui.AlignTextToFramePadding();
+                if (ImGui.Button("[Click To Set]")) DoClickToSetKeybind(caption, action: keyAction, 0);
+                ImGui.NextColumn();
+                ImGui.AlignTextToFramePadding();
+                if (ImGui.Button("[Click To Set]")) DoClickToSetKeybind(caption, action: keyAction, 1);
+                ImGui.Columns(1);
+                ImGui.EndChildFrame();
+            }
+            ImGui.PopStyleColor();
+        }
+
+
+
+        void DoClickToSetKeybind(string caption, eKeybind action, int bindIndex)
+        {
+            _pendingKeybind.active = true;
+            _pendingKeybind.actionText = caption;
+            _pendingKeybind.bindIndex = bindIndex;
+        }
+
+        void CreateOptionsPane_Keybinds()
+        {
+            if (_pendingKeybind.active)
+                ImGui.OpenPopup("Activate New Keybind");
+
+            if (ImGui.BeginPopupModal("Activate New Keybind", ref _pendingKeybind.active, ImGuiWindowFlags.AlwaysAutoResize))
+            {
+                if (ImGui.BeginChildFrame(ImGui.GetID("KBPopFrame"), new Vector2(280, 110)))
+                {
+                    ImGui.Text("Binding: " + _pendingKeybind.actionText);
+                    ImGui.Text("Current keybind: [todo]");
+
+                    string msg = "Press new keybind now";
+
+                    float msgWidth = ImGui.CalcTextSize(msg).X;
+
+                    ImGui.SetCursorPosX(ImGui.GetCursorPosX() + (ImGui.GetContentRegionAvail().X/2) - msgWidth/2);
+                    ImGui.SetCursorPosY(ImGui.GetCursorPosY() + 15);
+                    ImGui.Text(msg);
+                    ImGui.EndChildFrame();
+                }
+                ImGui.EndPopup();
+            }
+
+            int index = 0;
+            ImGui.Columns(3, "kbcols", false);
+            ImGui.SetColumnWidth(0, ImGui.GetItemRectSize().X - 300);
+            ImGui.SetColumnWidth(1, 150);
+            ImGui.SetColumnWidth(2, 150);
+            ImGui.Text("Action");
+            ImGui.NextColumn();
+            ImGui.Text("Keybind");
+            ImGui.NextColumn();
+            ImGui.Text("Alternate Keybind");
+            ImGui.Columns(1);
+            CreateKeybindInput("Camera Up", eKeybind.eMoveUp, index++);
+            CreateKeybindInput("Camera Down", eKeybind.eMoveDown, index++);
+            CreateKeybindInput("Camera Left", eKeybind.eMoveLeft, index++);
+            CreateKeybindInput("Camera Right", eKeybind.eMoveRight, index++);
+            CreateKeybindInput("Graph Pitch + (X axis)", eKeybind.ePitchXFwd, index++);
+            CreateKeybindInput("Graph Pitch - (X axis)", eKeybind.ePitchXBack, index++);
+            CreateKeybindInput("Graph Roll +  (Y axis)", eKeybind.eRollYLeft, index++);
+            CreateKeybindInput("Graph Roll -  (Y axis)", eKeybind.eRollYRight, index++);
+            CreateKeybindInput("Graph Yaw +   (Z axis)", eKeybind.eRotGraphZLeft, index++);
+            CreateKeybindInput("Graph Yaw -   (Z axis)", eKeybind.eRotGraphZLeft, index++);
+            CreateKeybindInput("Toggle Heatmap", eKeybind.eRotGraphZLeft, index++);
+            CreateKeybindInput("Toggle Conditionals", eKeybind.eRotGraphZLeft, index++);
+            CreateKeybindInput("Force Direction Temperature +", eKeybind.eRotGraphZLeft, index++);
+            CreateKeybindInput("Center Graph In View", eKeybind.eRotGraphZLeft, index++);
+            CreateKeybindInput("Lock Graph Centered", eKeybind.eRotGraphZLeft, index++);
+        }
+

         private unsafe void DrawFileSelectBox()
         {
@@ -1399,4 +1555,13 @@
             }
         }
     }
+
+    class PendingKeybind
+    {
+        public PendingKeybind() { }
+        public bool active;
+        public string actionText = "";
+        public eKeybind action;
+        public int bindIndex;
+    }
 }


chore(IQueryableExtensions): fix bad comments

--- src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs
+++ src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs
@@ -163,11 +163,10 @@
                     body = Expression.LessThanOrEqual(left, right);
                     break;
                 case FilterOperations.ge:
-                    // {model.Id <= 1}
+                    // {model.Id >= 1}
                     body = Expression.GreaterThanOrEqual(left, right);
                     break;
                 case FilterOperations.like:
-                    // {model.Id <= 1}
                     body = Expression.Call(left, "Contains", null, right);
                     break;
                 default:


HttpListener: Catch ObjectDisposedException on shutdown.

--- src/Microsoft.Owin.Host.HttpListener/OwinHttpListener.cs
+++ src/Microsoft.Owin.Host.HttpListener/OwinHttpListener.cs
@@ -197,6 +197,11 @@
                 // These happen if HttpListener has been disposed
                 HandleAcceptError(hle);
             }
+            catch (ObjectDisposedException ode)
+            {
+                // These happen if HttpListener has been disposed
+                HandleAcceptError(ode);
+            }
         }

         private CatchInfoBase<Task>.CatchResult HandleAcceptError(CatchInfo errorInfo)


Cleanup XML doc

Cleanup XML doc

--- src/NRules/NRules.Fluent/Dsl/IRightHandSideExpression.cs
+++ src/NRules/NRules.Fluent/Dsl/IRightHandSideExpression.cs
@@ -35,7 +35,7 @@

         /// <summary>
         /// Defines rule's action that yields a linked fact when the rule fires.
-        /// If the rule is fired due to an update, the linked fact is also updated with the new yielded value.
+        /// If the rule fires due to an update, the linked fact is also updated with the new yielded value.
         /// </summary>
         /// <typeparam name="TFact">Type of fact to yield.</typeparam>
         /// <param name="yield">Action expression that yields the linked fact.</param>
@@ -44,22 +44,22 @@

         /// <summary>
         /// Defines rule's action that yields a linked fact when the rule fires.
-        /// If the rule is fired due to an update, the update expression is evaluated to produce an updated linked fact.
+        /// If the rule fires due to an update, the update expression is evaluated to produce an updated linked fact.
         /// </summary>
         /// <typeparam name="TFact">Type of fact to yield.</typeparam>
-        /// <param name="yieldInsert">Action expression that yields a new linked fact if the linked fact does not yet exist.</param>
-        /// <param name="yieldUpdate">Action expression that yields an updated linked fact if the linked fact already exists.</param>
+        /// <param name="yieldInsert">Action expression that yields a new linked fact.</param>
+        /// <param name="yieldUpdate">Action expression that yields an updated linked fact.</param>
         /// <returns>Right hand side expression builder.</returns>
         IRightHandSideExpression Yield<TFact>(Expression<Func<IContext, TFact>> yieldInsert, Expression<Func<IContext, TFact, TFact>> yieldUpdate);

         /// <summary>
         /// Defines rule's action that yields a linked fact when the rule fires.
-        /// If the rule is fired due to an update, the update expression is evaluated to produce an updated linked fact.
-        /// If the rule's conditions are no longer true and the rule's activation is removed, the remove expression is evaluated and the linked fact is retracted.
+        /// If the rule fires due to an update, the update expression is evaluated to produce an updated linked fact.
+        /// If the rule fires due to match removal, the remove expression is evaluated before the linked fact is retracted.
         /// </summary>
         /// <typeparam name="TFact">Type of fact to yield.</typeparam>
-        /// <param name="yieldInsert">Action expression that yields a new linked fact if the linked fact does not yet exist.</param>
-        /// <param name="yieldUpdate">Action expression that yields an updated linked fact if the linked fact already exists.</param>
+        /// <param name="yieldInsert">Action expression that yields a new linked fact.</param>
+        /// <param name="yieldUpdate">Action expression that yields an updated linked fact.</param>
         /// <param name="yieldRemove">Action expression that is evaluated before the linked fact is retracted.</param>
         /// <returns>Right hand side expression builder.</returns>
         IRightHandSideExpression Yield<TFact>(Expression<Func<IContext, TFact>> yieldInsert, Expression<Func<IContext, TFact, TFact>> yieldUpdate,


Add return type support for SyncCtxSwitcher.NoContext.

--- src/Nito.AsyncEx.Tasks/SynchronizationContextSwitcher.cs
+++ src/Nito.AsyncEx.Tasks/SynchronizationContextSwitcher.cs
@@ -44,10 +44,10 @@
         }

         /// <summary>
-        /// Executes an asynchronous delegate without the current <see cref="SynchronizationContext"/>. The current context is restored when this function returns its task.
+        /// Executes a synchronous or asynchronous delegate without the current <see cref="SynchronizationContext"/>. The current context is restored when this function synchronously returns.
         /// </summary>
         /// <param name="action">The delegate to execute.</param>
-        public static Task NoContextAsync(Func<Task> action)
+        public static T NoContext<T>(Func<T> action)
         {
             using (new SynchronizationContextSwitcher(null))
                 return action();


change to InnerText which is more often the true value

--- BroadvineOnboard/App_Code/ExcelSpreadSheet.cs
+++ BroadvineOnboard/App_Code/ExcelSpreadSheet.cs
@@ -119,7 +119,7 @@
                         //{
                             SharedStringItem ssi = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(cell.CellValue.InnerText));

-                            cellValue = ssi.Text.Text;
+                            cellValue = ssi.InnerText;
                         //}
                         //else
                         //{


adds new methods for servercomparer

adds new methods for servercomparer

What the title says.

--- CCExtractorTester/Comparers/ServerComparer.cs
+++ CCExtractorTester/Comparers/ServerComparer.cs
@@ -4,6 +4,7 @@
 using System.Linq;
 using System.Net;
 using System.Text;
+using CCExtractorTester.Analyzers;

 namespace CCExtractorTester.Comparers
 {
@@ -24,6 +25,7 @@
                 // Upload result
                 using (var wb = new WebClient())
                 {
+                    // TODO: check if this works
                     var response = wb.UploadFile(reportUrl, data.ProducedFile);
                 }
             }
@@ -34,6 +36,7 @@
                 {
                     var d = new NameValueCollection();
                     d["equal"] = data.ProducedFile;
+                    d["sample"] = data.SampleFile;

                     var response = wb.UploadValues(reportUrl, "POST", d);
                 }
@@ -50,5 +53,19 @@
             // Do nothing
             return "";
         }
+
+        public void SendExitCodeAndRuntime(RunData rd, string sample)
+        {
+            // Post equality status
+            using (var wb = new WebClient())
+            {
+                var d = new NameValueCollection();
+                d["exitCode"] = rd.ExitCode+"";
+                d["runTime"] = rd.Runtime+"";
+                d["sample"] = sample;
+
+                var response = wb.UploadValues(reportUrl, "POST", d);
+            }
+        }
     }
 }


Fix unreported bug introduced by #129 - keyword options dropped on the floor

This happened in the settings factory - the options weren't being carried across
properly.

--- CSF.Zpt/Rendering/RenderingSettingsFactory.cs
+++ CSF.Zpt/Rendering/RenderingSettingsFactory.cs
@@ -54,6 +54,11 @@
       else
       {
         contextFactory = GetContextFactory();
+      }
+
+      foreach(var keywordOption in options.KeywordOptions)
+      {
+        contextFactory.AddKeywordOption(keywordOption.Key, keywordOption.Value);
       }

       ITemplateFileFactory templateFactory;


shields no longer break from healing (#10719)

--- Content.Shared/Blocking/BlockingUserSystem.cs
+++ Content.Shared/Blocking/BlockingUserSystem.cs
@@ -12,6 +12,7 @@
 {
     [Dependency] private readonly IPrototypeManager _proto = default!;
     [Dependency] private readonly BlockingSystem _blockingSystem = default!;
+    [Dependency] private readonly DamageableSystem _damageable = default!;

     public override void Initialize()
     {
@@ -54,9 +55,9 @@

     private void OnDamageChanged(EntityUid uid, BlockingUserComponent component, DamageChangedEvent args)
     {
-        if (component.BlockingItem != null)
+        if (args.DamageDelta != null && args.DamageIncreased)
         {
-            RaiseLocalEvent(component.BlockingItem.Value, args);
+            _damageable.TryChangeDamage(component.BlockingItem, args.DamageDelta);
         }
     }


Small fix for the ForwardingLogger. Not releasing this yet. [skip ci]

--- Dapplo.Log.LogFile.Shared/ForwardingLogger.cs
+++ Dapplo.Log.LogFile.Shared/ForwardingLogger.cs
@@ -64,7 +64,11 @@
 			// Loop as long as there are items available
 			while (_logItems.TryDequeue(out logItem))
 			{
-				newLogger.Write(logItem.Item1, logItem.Item2, logItem.Item3);
+				// Only forward those items of which the log level is supported
+				if (newLogger.IsLogLevelEnabled(logItem.Item1.LogLevel))
+				{
+					newLogger.Write(logItem.Item1, logItem.Item2, logItem.Item3);
+				}
 			}
 		}


Don't limit 3d undo buffer

Don't limit 3d undo buffer

--- DataConverters3D/Object3D/InteractiveScene.cs
+++ DataConverters3D/Object3D/InteractiveScene.cs
@@ -100,7 +100,7 @@
 		}

 		[JsonIgnore]
-		public UndoBuffer UndoBuffer { get; } = new UndoBuffer() { MaxUndos = 10 };
+		public UndoBuffer UndoBuffer { get; } = new UndoBuffer();

 		[JsonIgnore]
 		public bool ShowSelectionShadow { get; set; } = true;


Fixed an issue with the new binding methodology incorrectly attempting to prepare known unsupported chunks.

--- Dataphor/DAE/Runtime.Instructions/PlanNode.cs
+++ Dataphor/DAE/Runtime.Instructions/PlanNode.cs
@@ -343,6 +343,15 @@
 		// DetermineDevice
 		public virtual void DetermineDevice(Plan plan)
 		{
+			// Recheck the NoDevice flag, as it will be set directly when a device-painted node has indicated not supported
+			if (_nodes != null)
+				for (int index = 0; index < _nodes.Count; index++)
+					if (_nodes[index].NoDevice)
+					{
+						NoDevice = true;
+						break;
+					}
+
             if (!NoDevice)
             {
 				_device = _potentialDevice;
@@ -379,15 +388,12 @@
 				else
 				{
 					DeviceSupported = false;
-					// BTR 4/28/2005 ->
-					// Not sure why this is here, but it is preventing the translation of several otherwise translatable items.
-					// I will turn it off and see what happens.
-					//if (DataType is Schema.ITableType)
-					//	NoDevice = true;
 				}
 			}
 			else
+			{
 				DeviceSupported = false;
+			}
 		}

 		public virtual void SetDevice(Plan plan, Schema.Device device)


Deployment of DevKitSample v5.20.0.17412 to Prod:MAIN by GitHub Deployment Plugin

--- DeveloperKitSample/Properties/AssemblyInfo.cs
+++ DeveloperKitSample/Properties/AssemblyInfo.cs
@@ -33,4 +33,4 @@
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("5.20.0.0")]
 [assembly: AssemblyVersion("5.20.0.0")]
-[assembly: AssemblyFileVersion("5.20.0.16939")]
+[assembly: AssemblyFileVersion("5.20.0.17412")]


Deployment of DevKitSample v5.20.16705.20143 to Prod:MAIN by GitHub Deployment Plugin

--- DeveloperKitSample/Properties/AssemblyInfo.cs
+++ DeveloperKitSample/Properties/AssemblyInfo.cs
@@ -33,4 +33,4 @@
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("5.20.0.0")]
 [assembly: AssemblyVersion("5.20.0.0")]
-[assembly: AssemblyFileVersion("5.20.16679.20117")]
+[assembly: AssemblyFileVersion("5.20.16705.20143")]


Fix from Adam J. Tybor, making SqlCeAppender work under ASP.Net

git-svn-id: 6eea8ec865c4fa60105bc56808c028bdcf72a817@483 079b0acf-d9fa-0310-9935-e5ade295c882

--- rhino-commons/Rhino.Commons/Logging/RollingSqlCEAppender.cs
+++ rhino-commons/Rhino.Commons/Logging/RollingSqlCEAppender.cs
@@ -3,6 +3,7 @@
 using System.Data;
 using System.Diagnostics;
 using System.IO;
+using System.Web;
 using log4net.Appender;
 using log4net.Core;
 using log4net.Layout;
@@ -42,6 +43,11 @@

 		public RollingSqlCEAppender()
 		{
+			//this is apperantly required in order to work correctly under ASP.Net
+			if(HttpContext.Current!=null)
+			{
+				AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true);
+			}
 			m_usePreparedCommand = false;
 			ConnectionType = "System.Data.SqlServerCe.SqlCeConnection, System.Data.SqlServerCe";
 			ReconnectOnError = true;


Features/FeatureDependencyExtensions.cs documentation changes

--- src/Abp/Application/Features/FeatureDependencyExtensions.cs
+++ src/Abp/Application/Features/FeatureDependencyExtensions.cs
@@ -8,7 +8,7 @@
     public static class FeatureDependencyExtensions
     {
         /// <summary>
-        /// Checks depended features and returns true if dependencies are satisfied.
+        /// Checks dependent features and returns true if dependencies are satisfied.
         /// </summary>
         /// <param name="featureDependency">The feature dependency.</param>
         /// <param name="context">The context.</param>