feat(server): fix wrong date displayed in blotter (ARTP-1157)

--- src/server/dotNet/Adaptive.ReactiveTrader.Server.TradeExecution/TradeExecutionEngine.cs
+++ src/server/dotNet/Adaptive.ReactiveTrader.Server.TradeExecution/TradeExecutionEngine.cs
@@ -27,7 +27,7 @@
         public async Task<ExecuteTradeResponseDto> ExecuteAsync(ExecuteTradeRequestDto request, string user)
         {
             var id = await _tradeIdProvider.GetNextId();
-            var tradeDate = DateTimeOffset.UtcNow.Date;
+            var tradeDate = DateTimeOffset.UtcNow;

             DateTimeOffset valueDate;
             if (!DateTimeOffset.TryParse(request.ValueDate, out valueDate))


Added some more tests for the ZigZagConverters

--- test/AM.Core.Algorithms.StringManipulation.Tests/Converters/ZigZagConverterTestsBase.cs
+++ test/AM.Core.Algorithms.StringManipulation.Tests/Converters/ZigZagConverterTestsBase.cs
@@ -1,4 +1,5 @@
 using AM.Core.Algorithms.StringManipulation.Converters;
+using System;
 using Xunit;

 namespace AM.Core.Algorithms.StringManipulation.Tests.Converters
@@ -32,5 +33,24 @@
         {
             Assert.Equal(expectedResult, sut.Convert(input, numberOfRows));
         }
+
+        [Fact]
+        public void Convert_ThrowsForNegativeNumberOfRows()
+        {
+            Assert.Throws<ArgumentOutOfRangeException>(() => sut.Convert("abcd", -7));
+        }
+
+        [Fact]
+        public void Convert_ThrowsForZeroNumRows()
+        {
+            Assert.Throws<ArgumentOutOfRangeException>(() => sut.Convert("abcd", 0));
+        }
+
+        [Fact]
+        public void Convert_ReturnsTheSameInputForSingleRow()
+        {
+            const string input = "asdfoasdf";
+            Assert.Equal(input, sut.Convert(input, 1));
+        }
     }
 }


compile out

compile out

--- unity-proj/Assets/BetterDefines/Editor/PlatformUtils.cs
+++ unity-proj/Assets/BetterDefines/Editor/PlatformUtils.cs
@@ -14,7 +14,6 @@
         public const string STANDALONE_PLATFORM_ID = "Standalone";
         public const string ANDROID_PLATFORM_ID = "Android";
         public const string IOS_PLATFORM_ID = "iPhone";
-        public const string TV_OS_PLATFORM_ID = "tvOS";
         public const string BLACKBERRY_PLATFORM_ID = "BlackBerry";
         public const string TIZEN_PLATFORM_ID = "Tizen";
         public const string XBOX360_PLATFORM_ID = "XBox360";
@@ -23,11 +22,15 @@
         public const string PS_VITA_PLATFORM_ID = "PSP2";
         public const string PS4_PLATFORM_ID = "PS4";
         public const string GLESEMU_PLATFORM_ID = "StandaloneGLESEmu";
-        public const string WIIU_PLATFORM_ID = "WiiU";
         public const string WINDOWS_STORE_PLATFORM_ID = "Metro";
         public const string WEB_GL_PLATFORM_ID = "WebGL";
         public const string SAMSUNG_TV_PLATFORM_ID = "SamsungTV";
+
+#if UNITY_5_3_2
         public const string NINTENDO_3DS_PLATFORM_ID = "N3DS";
+        public const string TV_OS_PLATFORM_ID = "tvOS";
+        public const string WIIU_PLATFORM_ID = "WiiU";
+#endif

         private static readonly List<BuildPlatform> _allBuildPlatforms;
         private static readonly Dictionary<string, BuildTargetGroup> _buildTargetGroups;
@@ -46,7 +49,9 @@
                 new BuildPlatform("PC, Mac & Linux Standalone", STANDALONE_PLATFORM_ID, true, LoadPlatformIcon(STANDALONE_PLATFORM_ID)),
                 new BuildPlatform("Android", ANDROID_PLATFORM_ID, true, LoadPlatformIcon(ANDROID_PLATFORM_ID)),
                 new BuildPlatform("iOS", IOS_PLATFORM_ID, true, LoadPlatformIcon(IOS_PLATFORM_ID)),
+#if UNITY_5_3_2
                 new BuildPlatform("tvOS", TV_OS_PLATFORM_ID, true, LoadPlatformIcon(TV_OS_PLATFORM_ID)),
+#endif
                 new BuildPlatform("BlackBerry", BLACKBERRY_PLATFORM_ID, true, LoadPlatformIcon(BLACKBERRY_PLATFORM_ID)),
                 new BuildPlatform("Tizen", TIZEN_PLATFORM_ID, true, LoadPlatformIcon(TIZEN_PLATFORM_ID)),
                 new BuildPlatform("Xbox 360", XBOX360_PLATFORM_ID, true, LoadPlatformIcon(XBOX360_PLATFORM_ID)),
@@ -56,11 +61,13 @@
                 new BuildPlatform("PS4", PS4_PLATFORM_ID, true, LoadPlatformIcon(PS4_PLATFORM_ID)),
                 // TODO GLES Emulator - what is this?
                 //new BuildPlatform("GLES Emulator", GLESEMU_PLATFORM_ID, true, LoadPlatformIcon(GLESEMU_PLATFORM_ID)),
+#if UNITY_5_3_2
                 new BuildPlatform("Wii U", WIIU_PLATFORM_ID, true, LoadPlatformIcon(WIIU_PLATFORM_ID)),
+                new BuildPlatform("Nintendo 3DS", NINTENDO_3DS_PLATFORM_ID, true, LoadPlatformIcon(NINTENDO_3DS_PLATFORM_ID)),
+#endif
                 new BuildPlatform("Windows Store", WINDOWS_STORE_PLATFORM_ID, true, LoadPlatformIcon(WINDOWS_STORE_PLATFORM_ID)),
                 new BuildPlatform("WebGL", WEB_GL_PLATFORM_ID, true, LoadPlatformIcon(WEB_GL_PLATFORM_ID)),
                 new BuildPlatform("Samsung TV", SAMSUNG_TV_PLATFORM_ID, true, LoadPlatformIcon(SAMSUNG_TV_PLATFORM_ID)),
-                new BuildPlatform("Nintendo 3DS", NINTENDO_3DS_PLATFORM_ID, true, LoadPlatformIcon(NINTENDO_3DS_PLATFORM_ID))
             };
         }

@@ -72,7 +79,12 @@
                 {STANDALONE_PLATFORM_ID, BuildTargetGroup.Standalone},
                 {ANDROID_PLATFORM_ID, BuildTargetGroup.Android},
                 {IOS_PLATFORM_ID, BuildTargetGroup.iOS},
+#if UNITY_5_3_2
                 {TV_OS_PLATFORM_ID, BuildTargetGroup.tvOS},
+                {NINTENDO_3DS_PLATFORM_ID, BuildTargetGroup.Nintendo3DS},
+                {WIIU_PLATFORM_ID, BuildTargetGroup.WiiU},
+#endif
+
 #if !UNITY_5
                 { IOS_PLATFORM_ID, BuildTargetGroup.iPhone },
 #endif
@@ -83,11 +95,9 @@
                 {PS3_PLATFORM_ID, BuildTargetGroup.PS3},
                 {PS_VITA_PLATFORM_ID, BuildTargetGroup.PSP2},
                 {PS4_PLATFORM_ID, BuildTargetGroup.PS4},
-                {WIIU_PLATFORM_ID, BuildTargetGroup.WiiU},
                 {WINDOWS_STORE_PLATFORM_ID, BuildTargetGroup.WSA},
                 {WEB_GL_PLATFORM_ID, BuildTargetGroup.WebGL},
                 {SAMSUNG_TV_PLATFORM_ID, BuildTargetGroup.SamsungTV},
-                {NINTENDO_3DS_PLATFORM_ID, BuildTargetGroup.Nintendo3DS}
             };
         }


Correct process stop handling for Demo console app.

--- Resonance.Demo/Program.cs
+++ Resonance.Demo/Program.cs
@@ -16,7 +16,7 @@
 {
     public class Program
     {
-        private const int WORKER_COUNT = 4; // Multiple parallel workers, to make sure any issues related to parallellisation occur, if any.
+        private const int WORKER_COUNT = 1; // Multiple parallel workers, to make sure any issues related to parallellisation occur, if any.
         // 1=1750
         // 2=3350
         // 4=6000
@@ -118,8 +118,13 @@
                 workers[i] = CreateWorker(consumer, "Demo Subscription 1");
                 workers[i].Start();
             }
-            Console.WriteLine("Press a key to stop the worker(s)...");
-            Console.ReadKey();
+
+            // Wait for a user to press Ctrl+C or when windows sends the stop process signal
+            Console.WriteLine("Press Ctrl+C to stop the worker(s)...");
+            var handle = new ManualResetEvent(false);
+            Console.CancelKeyPress += (s, e) => { handle.Set(); e.Cancel = true; }; // Cancel must be true, to make sure the process is not killed and we can clean up nicely below
+            handle.WaitOne();
+
             for (int i = 0; i < WORKER_COUNT; i++)
             {
                 if (workers[i].IsRunning())
@@ -139,8 +144,12 @@
                 {
                     //Console.WriteLine($"Consumed {ceW.Id} from thread {System.Threading.Thread.CurrentThread.ManagedThreadId}.");
                     await Task.Delay(1);
+
                     if (DateTime.UtcNow.Millisecond == 1)
                         throw new Exception("Sorry");
+
+                    if (DateTime.UtcNow.Millisecond > 200)
+                        return ConsumeResult.MustRetry("Retry nodig");

                     return ConsumeResult.Succeeded;
                 },


* Fix a bug in the SnapshotConfig class that causes the percentiles to not be measured.

--- src/platform/toolkit/metrics/library/core/SnapshotConfig.cs
+++ src/platform/toolkit/metrics/library/core/SnapshotConfig.cs
@@ -109,9 +109,9 @@
         Percentiles = new double[percentiles.Length];
         for (int i = 0; i < percentiles.Length; i++) {
           double percentile = percentiles[i];
-          if (percentile < 0.0 || percentile > 1.0) {
+          if (percentile < 0.0 || percentile > 100.0) {
             throw new ArgumentOutOfRangeException("percentiles",
-              Resources.ArgIsNotInRange.Fmt(0.0, 1.0));
+              Resources.ArgIsNotInRange.Fmt(0.0, 100.0));
           }
           Percentiles[i] = percentile;
         }
@@ -179,8 +179,12 @@
       ComputeMin = builder.ComputeMin;
       ComputeStdDev = builder.ComputeStdDev;

-      Percentiles = new double[builder.Percentiles.Length];
-      Array.Copy(Percentiles, builder.Percentiles, builder.Percentiles.Length);
+      double[] percentiles = builder.Percentiles;
+      int length = percentiles.Length;
+      Percentiles = new double[length];
+      for (int i = 0; i < length; i++) {
+        Percentiles[i] = percentiles[i]/100.0;
+      }
     }

     /// <summary>


Changed NullReferenceException to InvalidOperationException

--- src/plug-ins/motoi.platform.ui/factories/FactoryProvider.cs
+++ src/plug-ins/motoi.platform.ui/factories/FactoryProvider.cs
@@ -66,7 +66,7 @@
         protected override void OnInitialize() {
             ILog logWriter = LogManager.GetLogger(typeof(FactoryProvider));
             IConfigurationElement[] configurationElements = ExtensionService.Instance.GetConfigurationElements(FactoryExtensionPointId);
-            if (configurationElements.Length == 0) throw new NullReferenceException("There is no registered UI provider!");
+            if (configurationElements.Length == 0) throw new InvalidOperationException("There is no registered UI provider!");

             if (configurationElements.Length > 1) {
                 string[] viewPartFactories = configurationElements.Select(x => x.Id).ToArray();


C# mvc: Add history creation for the first version of the file

--- web/documentserver-example/csharp-mvc/WebEditor.ashx.cs
+++ web/documentserver-example/csharp-mvc/WebEditor.ashx.cs
@@ -303,7 +303,7 @@
             var userAddress = context.Request["userAddress"];
             var fileName = Path.GetFileName(context.Request["fileName"]);
             var status = (TrackerStatus) (int) fileData["status"];  // get status from the request body
-            var saved = 1;  // editing
+            var saved = 0;  // editing
             switch (status)
             {
                 case TrackerStatus.Editing:


Fix ci issues

Fix ci issues

--- osu.Framework.Tests/Bindables/BindableNumberTest.cs
+++ osu.Framework.Tests/Bindables/BindableNumberTest.cs
@@ -39,11 +39,11 @@

             object bindable = createBindable(type);

-            MethodInfo setMethod = bindable.GetType().GetMethod(nameof(BindableNumber<int>.Set), BindingFlags.Public | BindingFlags.Instance).MakeGenericMethod(type);
-            setMethod.Invoke(bindable, new[] { expectedValue });
+            MethodInfo setMethod = bindable.GetType().GetMethod(nameof(BindableNumber<int>.Set), BindingFlags.Public | BindingFlags.Instance)?.MakeGenericMethod(type);
+            setMethod?.Invoke(bindable, new[] { expectedValue });

             PropertyInfo valueProperty = bindable.GetType().GetProperty(nameof(BindableNumber<int>.Value), BindingFlags.Public | BindingFlags.Instance);
-            object value = valueProperty.GetValue(bindable);
+            object value = valueProperty?.GetValue(bindable);

             Assert.That(Convert.ChangeType(value, typeof(int)), Is.EqualTo(expectedValue));
         }
@@ -55,15 +55,15 @@

             object bindable = createBindable(type);

-            MethodInfo addMethod = bindable.GetType().GetMethod(nameof(BindableNumber<int>.Add), BindingFlags.Public | BindingFlags.Instance).MakeGenericMethod(type);
-            addMethod.Invoke(bindable, new[] { expectedValue });
+            MethodInfo addMethod = bindable.GetType().GetMethod(nameof(BindableNumber<int>.Add), BindingFlags.Public | BindingFlags.Instance)?.MakeGenericMethod(type);
+            addMethod?.Invoke(bindable, new[] { expectedValue });

             PropertyInfo valueProperty = bindable.GetType().GetProperty(nameof(BindableNumber<int>.Value), BindingFlags.Public | BindingFlags.Instance);
-            object value = valueProperty.GetValue(bindable);
+            object value = valueProperty?.GetValue(bindable);

             Assert.That(Convert.ChangeType(value, typeof(int)), Is.EqualTo(expectedValue));
         }

-        private object createBindable(Type type) => Activator.CreateInstance(typeof(BindableNumber<>).MakeGenericType(type), new[] { Convert.ChangeType(0, type) });
+        private object createBindable(Type type) => Activator.CreateInstance(typeof(BindableNumber<>).MakeGenericType(type), Convert.ChangeType(0, type));
     }
 }


Fix `UIEvent.Target` not set on event propagation

--- osu.Framework/Input/Bindings/KeyBindingContainer.cs
+++ osu.Framework/Input/Bindings/KeyBindingContainer.cs
@@ -1,10 +1,10 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.

+using System;
 using System.Collections.Generic;
 using System.Linq;
 using osu.Framework.Allocation;
-using osu.Framework.Extensions.IEnumerableExtensions;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Input.Events;
@@ -268,13 +268,13 @@
                 if (scrollAmount != 0)
                 {
                     var scrollEvent = new KeyBindingScrollEvent<T>(state, pressed, scrollAmount, isPrecise);
-                    handled = (Drawable)drawables.OfType<IScrollBindingHandler<T>>().FirstOrDefault(d => d.OnScroll(scrollEvent));
+                    handled = drawables.FirstOrDefault(d => triggerKeyBindingEvent(d, scrollEvent));
                 }

                 if (handled == null)
                 {
                     var pressEvent = new KeyBindingPressEvent<T>(state, pressed, repeat);
-                    handled = (Drawable)drawables.OfType<IKeyBindingHandler<T>>().FirstOrDefault(d => d.OnPressed(pressEvent));
+                    handled = drawables.FirstOrDefault(d => triggerKeyBindingEvent(d, pressEvent));
                 }
             }

@@ -295,7 +295,7 @@
                 var releaseEvent = new KeyBindingReleaseEvent<T>(state, action);

                 foreach (var kvp in keyBindingQueues.Where(k => EqualityComparer<T>.Default.Equals(k.Key.GetAction<T>(), action)))
-                    kvp.Value.OfType<IKeyBindingHandler<T>>().ForEach(d => d.OnReleased(releaseEvent));
+                    kvp.Value.ForEach(d => triggerKeyBindingEvent(d, releaseEvent));
             }

             pressedActions.Clear();
@@ -334,7 +334,7 @@
                 var releaseEvent = new KeyBindingReleaseEvent<T>(state, released);

                 foreach (var d in drawables.OfType<IKeyBindingHandler<T>>())
-                    d.OnReleased(releaseEvent);
+                    triggerKeyBindingEvent(d, releaseEvent);

                 pressedActions.Remove(released);
             }
@@ -363,6 +363,27 @@
                 currentQueue.AddRange(KeyBindingInputQueue);

             return currentQueue;
+        }
+
+        private bool triggerKeyBindingEvent(IDrawable drawable, KeyBindingEvent<T> e)
+        {
+            e.Target = (Drawable)drawable;
+
+            switch (e)
+            {
+                case KeyBindingPressEvent<T> press:
+                    return (drawable as IKeyBindingHandler<T>)?.OnPressed(press) ?? false;
+
+                case KeyBindingReleaseEvent<T> release:
+                    (drawable as IKeyBindingHandler<T>)?.OnReleased(release);
+                    return false;
+
+                case KeyBindingScrollEvent<T> scroll:
+                    return (drawable as IScrollBindingHandler<T>)?.OnScroll(scroll) ?? false;
+
+                default:
+                    throw new ArgumentOutOfRangeException(nameof(e));
+            }
         }
     }


Use slightly closer values

Use slightly closer values

--- osu.Game.Rulesets.Osu.Tests/TestSceneSliderInput.cs
+++ osu.Game.Rulesets.Osu.Tests/TestSceneSliderInput.cs
@@ -300,7 +300,7 @@
             {
                 new OsuReplayFrame { Position = new Vector2(0, 0), Actions = { OsuAction.LeftButton }, Time = time_slider_start },
                 new OsuReplayFrame { Position = new Vector2(0, OsuHitObject.OBJECT_RADIUS * 1.19f), Actions = { OsuAction.LeftButton }, Time = time_slider_start + 100 },
-                new OsuReplayFrame { Position = new Vector2(slider_path_length, OsuHitObject.OBJECT_RADIUS * 1.19f), Actions = { OsuAction.LeftButton }, Time = time_slider_end },
+                new OsuReplayFrame { Position = new Vector2(slider_path_length, OsuHitObject.OBJECT_RADIUS * 1.199f), Actions = { OsuAction.LeftButton }, Time = time_slider_end },
             });

             AddAssert("Tracking kept", assertGreatJudge);
@@ -321,7 +321,7 @@
             {
                 new OsuReplayFrame { Position = new Vector2(0, 0), Actions = { OsuAction.LeftButton }, Time = time_slider_start },
                 new OsuReplayFrame { Position = new Vector2(0, OsuHitObject.OBJECT_RADIUS * 1.21f), Actions = { OsuAction.LeftButton }, Time = time_slider_start + 100 },
-                new OsuReplayFrame { Position = new Vector2(slider_path_length, OsuHitObject.OBJECT_RADIUS * 1.21f), Actions = { OsuAction.LeftButton }, Time = time_slider_end },
+                new OsuReplayFrame { Position = new Vector2(slider_path_length, OsuHitObject.OBJECT_RADIUS * 1.201f), Actions = { OsuAction.LeftButton }, Time = time_slider_end },
             });

             AddAssert("Tracking dropped", assertMidSliderJudgementFail);


Add test coverage

Add test coverage

--- osu.Game.Tests/NonVisual/CustomDataDirectoryTest.cs
+++ osu.Game.Tests/NonVisual/CustomDataDirectoryTest.cs
@@ -7,14 +7,23 @@
 using System.Threading.Tasks;
 using NUnit.Framework;
 using osu.Framework.Allocation;
+using osu.Framework.Configuration;
 using osu.Framework.Platform;
 using osu.Game.Configuration;
+using osu.Game.IO;

 namespace osu.Game.Tests.NonVisual
 {
     [TestFixture]
     public class CustomDataDirectoryTest
     {
+        [SetUp]
+        public void SetUp()
+        {
+            if (Directory.Exists(customPath))
+                Directory.Delete(customPath, true);
+        }
+
         [Test]
         public void TestDefaultDirectory()
         {
@@ -36,6 +45,8 @@
             }
         }

+        private string customPath => Path.Combine(Environment.CurrentDirectory, "custom-path");
+
         [Test]
         public void TestCustomDirectory()
         {
@@ -49,7 +60,7 @@
                 storage.DeleteDirectory(string.Empty);

                 using (var storageConfig = new StorageConfigManager(storage))
-                    storageConfig.Set(StorageConfig.FullPath, Path.Combine(Environment.CurrentDirectory, "custom-path"));
+                    storageConfig.Set(StorageConfig.FullPath, customPath);

                 try
                 {
@@ -58,7 +69,52 @@
                     // switch to DI'd storage
                     storage = osu.Dependencies.Get<Storage>();

-                    Assert.That(storage.GetFullPath("."), Is.EqualTo(Path.Combine(Environment.CurrentDirectory, "custom-path")));
+                    Assert.That(storage.GetFullPath("."), Is.EqualTo(customPath));
+                }
+                finally
+                {
+                    host.Exit();
+                }
+            }
+        }
+
+        [Test]
+        public void TestMigration()
+        {
+            using (HeadlessGameHost host = new CleanRunHeadlessGameHost(nameof(TestMigration)))
+            {
+                try
+                {
+                    var osu = loadOsu(host);
+                    var storage = osu.Dependencies.Get<Storage>();
+
+                    // ensure we perform a save
+                    host.Dependencies.Get<FrameworkConfigManager>().Save();
+
+                    // ensure we "use" cache
+                    host.Storage.GetStorageForDirectory("cache");
+
+                    string defaultStorageLocation = Path.Combine(Environment.CurrentDirectory, "headless", nameof(TestMigration));
+
+                    Assert.That(storage.GetFullPath("."), Is.EqualTo(defaultStorageLocation));
+
+                    (storage as OsuStorage)?.Migrate(customPath);
+
+                    Assert.That(storage.GetFullPath("."), Is.EqualTo(customPath));
+
+                    foreach (var file in OsuStorage.IGNORE_FILES)
+                    {
+                        Assert.That(host.Storage.Exists(file), Is.True);
+                        Assert.That(storage.Exists(file), Is.False);
+                    }
+
+                    foreach (var dir in OsuStorage.IGNORE_DIRECTORIES)
+                    {
+                        Assert.That(host.Storage.ExistsDirectory(dir), Is.True);
+                        Assert.That(storage.ExistsDirectory(dir), Is.False);
+                    }
+
+                    Assert.That(new StreamReader(host.Storage.GetStream("storage.ini")).ReadToEnd().Contains($"FullPath = {customPath}"));
                 }
                 finally
                 {


Move loader hiding to a better place.

Move loader hiding to a better place.

--- osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
+++ osu.Game/Screens/Select/Leaderboards/Leaderboard.cs
@@ -51,6 +51,8 @@

                 if (scores == null)
                     return;
+
+                loading.Hide();

                 if (scores.Count() == 0)
                 {
@@ -191,7 +193,6 @@
             getScoresRequest.Success += r =>
             {
                 Scores = r.Scores;
-                loading.Hide();
             };
             api.Queue(getScoresRequest);
         }


ExpressionSample - more string tests

ExpressionSample - more string tests

--- projects/ExpressionSample/GWExpr.Test/Atoms.cs
+++ projects/ExpressionSample/GWExpr.Test/Atoms.cs
@@ -19,6 +19,8 @@
         }

         [InlineData("\"1\"", "StringLiteral(\"1\")")]
+        [InlineData("\"\"", "StringLiteral(\"\")")]
+        [InlineData("\"string with spaces\"", "StringLiteral(\"string with spaces\")")]
         [Theory]
         public void Strings(string input, string output)
         {


Added AddMultipartFormDataContent method for formData requests body

--- RestClient/RESTRequest.cs
+++ RestClient/RESTRequest.cs
@@ -38,6 +38,23 @@
         public void AddContent(HttpContent content)
         {
             this.content = content;
+        }
+        /// <summary>
+        /// Add a new MultipartFormDataContent to HTTPContent request. Be careful, it overwrite the previous HTTPContent, if it exists
+        /// </summary>
+        /// <param name="key"></param>
+        /// <param name="value"></param>
+        public void AddMultipartFormDataContent(string key, string value)
+        {
+            if(this.content != null && this.content.GetType() != typeof(MultipartFormDataContent))
+            {
+                this.content = new MultipartFormDataContent();
+                (this.content as MultipartFormDataContent).Add(new StringContent(value), key);
+            }
+            else
+            {
+                (this.content as MultipartFormDataContent).Add(new StringContent(value), key);
+            }
         }
         /// <summary>
         /// Add header to the request


Fix recursion

Fix recursion

--- RevitLookup/Core/Utils.cs
+++ RevitLookup/Core/Utils.cs
@@ -363,10 +363,13 @@
         return widthArray;
     }

-    public static TreeNode GetRootNode(TreeNode node)
-    {
-        if (node.Parent is null) return node;
-        return GetRootNode(node.Parent);
+    private static TreeNode GetRootNode(TreeNode node)
+    {
+        while (true)
+        {
+            if (node.Parent is null) return node;
+            node = node.Parent;
+        }
     }

     public static string GetPrintDocumentName(TreeNode node)


Correcting spelling mistake Addresss to Addresses.

--- Accounting/Wilson.Accounting.Data/AccountingDbContext.cs
+++ Accounting/Wilson.Accounting.Data/AccountingDbContext.cs
@@ -20,7 +20,7 @@
         public virtual DbSet<Payment> Payments { get; set; }
         public virtual DbSet<Price> Prices { get; set; }
         public virtual DbSet<Storehouse> Storehouses { get; set; }
-        public virtual DbSet<Address> Addresss { get; set; }
+        public virtual DbSet<Address> Addresses { get; set; }
         public virtual DbSet<Company> Companies { get; set; }
         public virtual DbSet<Employee> Employees { get; set; }
         public virtual DbSet<Project> Projects { get; set; }


Update IMessageSource.cs

Update IMessageSource.cs

--- Archimedes.Localisation/MessageSources/IMessageSource.cs
+++ Archimedes.Localisation/MessageSources/IMessageSource.cs
@@ -13,7 +13,7 @@
     public interface IMessageSource
     {
         /// <summary>
-        /// Load all localized messages in the given culture and returns them in a PropertyStore
+        /// Load all localized messages in the given culture and returns them in a Dictionary
         /// </summary>
         /// <param name="culture"></param>
         /// <returns></returns>


Split GUI for PrimitiveCreatorWindow into functions

--- Assets/PrimativeCreator/Editor/PrimitiveCreatorWindow.cs
+++ Assets/PrimativeCreator/Editor/PrimitiveCreatorWindow.cs
@@ -53,8 +53,29 @@

         private void OnGUI()
         {
+            this.DrawConfigPresetSelectionGUI();
+
+            EditorGUILayout.Space();
+
+            this.DrawConfigGUI();
+
+            EditorGUILayout.Space();
+
+            if (GUILayout.Button(this.createPrimitiveButtonLabel))
+            {
+                GameObject shape = PrimitiveCreator.CreatePrimitive(this.currentConfig);
+
+                Selection.activeGameObject = shape;
+            }
+
+            this.SaveSettings();
+        }
+
+        private void DrawConfigPresetSelectionGUI()
+        {
             EditorGUILayout.BeginHorizontal();

+            // Check for changes so that we can load in the new Config as it's selected.
             EditorGUI.BeginChangeCheck();
             this.selectedConfigPreset = EditorGUILayout.Popup(
                 this.savedConfigLabel,
@@ -66,49 +87,60 @@
                 this.LoadConfigPresetByIndex(this.selectedConfigPreset);
             }

-            EditorGUI.BeginDisabledGroup(this.saveData.HasConfigForIndex(this.selectedConfigPreset));
+            var isConfigPresetSelected = this.saveData.HasConfigForIndex(this.selectedConfigPreset);
+            EditorGUI.BeginDisabledGroup(isConfigPresetSelected);
             if (GUILayout.Button(this.saveButtonLabel))
             {
                 var namePresetWindow = PrimitiveCreatorNamePresetWindow.Show("Name Preset");

-                namePresetWindow.NameSaved.AddListener((string name) =>
-                    {
-                        this.currentConfig.Name = name;
-                        this.saveData.ConfigPresets.Add(this.currentConfig);
-                        this.PopulateConfigPresetsDropdown();
-
-                        this.selectedConfigPreset = this.saveData.ConfigPresets.Count - 1;
-                        this.LoadConfigPresetByIndex(this.selectedConfigPreset);
-                    });
+                namePresetWindow.NameSaved.AddListener(SaveSelectedPreset);
             }
             EditorGUI.EndDisabledGroup();

-            EditorGUI.BeginDisabledGroup(!this.saveData.HasConfigForIndex(this.selectedConfigPreset));
+            EditorGUI.BeginDisabledGroup(!isConfigPresetSelected);
             if (GUILayout.Button(this.renameButtonLabel))
             {
                 var namePresetWindow = PrimitiveCreatorNamePresetWindow.Show("Rename Preset",
                                            this.currentConfig.Name);

-                namePresetWindow.NameSaved.AddListener((string name) =>
-                    {
-                        this.currentConfig.Name = name;
-                        this.PopulateConfigPresetsDropdown();
-                    });
+                namePresetWindow.NameSaved.AddListener(RenameSelectedPreset);
             }

             if (GUILayout.Button(this.deleteButtonLabel))
             {
-                this.saveData.ConfigPresets.Remove(this.currentConfig);
-                this.selectedConfigPreset = this.saveData.ConfigPresets.Count;
-                this.PopulateConfigPresetsDropdown();
-                this.LoadConfigPresetByIndex(this.selectedConfigPreset);
+                this.DeleteSelectedPreset();
             }

             EditorGUI.EndDisabledGroup();
             EditorGUILayout.EndHorizontal();
-
-            EditorGUILayout.Space();
-
+        }
+
+        private void SaveSelectedPreset(string name)
+        {
+            this.currentConfig.Name = name;
+            this.saveData.ConfigPresets.Add(this.currentConfig);
+            this.PopulateConfigPresetsDropdown();
+
+            this.selectedConfigPreset = this.saveData.ConfigPresets.Count - 1;
+            this.LoadConfigPresetByIndex(this.selectedConfigPreset);
+        }
+
+        private void RenameSelectedPreset(string name)
+        {
+            this.currentConfig.Name = name;
+            this.PopulateConfigPresetsDropdown();
+        }
+
+        private void DeleteSelectedPreset()
+        {
+            this.saveData.ConfigPresets.Remove(this.currentConfig);
+            this.selectedConfigPreset = this.saveData.ConfigPresets.Count;
+            this.PopulateConfigPresetsDropdown();
+            this.LoadConfigPresetByIndex(this.selectedConfigPreset);
+        }
+
+        private void DrawConfigGUI()
+        {
             EditorGUILayout.LabelField(this.configHeaderLabel, EditorStyles.boldLabel);
             this.currentConfig.PrimitiveType = (PrimitiveType)EditorGUILayout.EnumPopup(
                 this.primitiveTypeLabel,
@@ -117,20 +149,9 @@
             this.currentConfig.UniformScale = EditorGUILayout.FloatField(
                 this.uniformScaleLabel,
                 this.currentConfig.UniformScale);
-
+
             this.currentConfig.Color = (PrimitiveCreator.Config.PrimitiveColor)
                 EditorGUILayout.EnumPopup(this.colorLabel, this.currentConfig.Color);
-
-            EditorGUILayout.Space();
-
-            if (GUILayout.Button(this.createPrimitiveButtonLabel))
-            {
-                GameObject shape = PrimitiveCreator.CreatePrimitive(this.currentConfig);
-
-                Selection.activeGameObject = shape;
-            }
-
-            this.SaveSettings();
         }

         private void LoadSaveData()
@@ -170,6 +191,7 @@
             }
             else
             {
+                // When no config data is found, use whatever the user last entered in
                 this.currentConfig = new PrimitiveCreator.Config();

                 this.currentConfig.PrimitiveType = (PrimitiveType)
@@ -186,6 +208,7 @@
         {
             EditorPrefs.SetInt(PrimitiveCreatorPrefKeys.PreviousConfigIndex, this.selectedConfigPreset);

+            // Remember what the user last entered for unsaved presets
             if (!this.saveData.HasConfigForIndex(this.selectedConfigPreset))
             {
                 EditorPrefs.SetInt(PrimitiveCreatorPrefKeys.Color, (int)this.currentConfig.PrimitiveType);


Minor refactoring

Minor refactoring

--- CSharpQuickReference/CSharpQuickReference/src/Structs.cs
+++ CSharpQuickReference/CSharpQuickReference/src/Structs.cs
@@ -39,6 +39,7 @@
         public structEntity(string color)
         {
             this.color = color;
+            this.Color = color;
         }

         public string Describe()


add hack for new amd opengl driver version format

--- CompatBot/Database/Providers/AmdDriverVersionProvider.cs
+++ CompatBot/Database/Providers/AmdDriverVersionProvider.cs
@@ -13,6 +13,7 @@
 {
     private static readonly Dictionary<string, List<string>> VulkanToDriver = new();
     private static readonly Dictionary<string, string> OpenglToDriver = new();
+    private static readonly Dictionary<string, string> InternalToDriver = new();
     private static readonly SemaphoreSlim SyncObj = new(1, 1);

     public static async Task RefreshAsync()
@@ -33,18 +34,21 @@
                 {
                     var winVer = (string?)driver.Element("windows-version");
                     var vkVer = (string?)driver.Element("vulkan-version");
+                    var internVer = (string?)driver.Element("internal-version");
                     var driverVer = (string?)driver.Attribute("version");
                     if (vkVer is null)
                         continue;

                     if (!VulkanToDriver.TryGetValue(vkVer, out var verList))
-                        VulkanToDriver[vkVer] = verList = new List<string>();
+                        VulkanToDriver[vkVer] = verList = new();
                     if (string.IsNullOrEmpty(driverVer))
                         continue;

                     verList.Insert(0, driverVer);
                     if (!string.IsNullOrEmpty(winVer))
                         OpenglToDriver[winVer] = driverVer;
+                    if (!string.IsNullOrEmpty(internVer))
+                        InternalToDriver[internVer] = driverVer;
                 }
                 foreach (var key in VulkanToDriver.Keys.ToList())
                     VulkanToDriver[key] = VulkanToDriver[key].Distinct().ToList();
@@ -66,6 +70,9 @@

         if (!Version.TryParse(openglVersion, out var glVersion))
             return openglVersion;
+
+        if (glVersion is { Major: >= 22, Minor: < 13, Build: <10, Revision: > 220600 })
+            return $"{glVersion.Major}.{glVersion.Minor}.{glVersion.Build}";

         var glVersions = new List<(Version glVer, string driverVer)>(OpenglToDriver.Count);
         foreach (var key in OpenglToDriver.Keys)


Método asíncrono de verificación

Método asíncrono de verificación

--- CoreComponents/Core/Security/Password/PasswordStorage.cs
+++ CoreComponents/Core/Security/Password/PasswordStorage.cs
@@ -23,9 +23,11 @@
 this program. If not, see <http://www.gnu.org/licenses/>.
 */

+using System.Collections.Generic;
 using System.IO;
 using System.Security;
 using System.Security.Cryptography;
+using System.Threading.Tasks;

 namespace TheXDS.MCART.Security.Password
 {
@@ -49,28 +51,25 @@
         */

         #region Constantes
-        const short SALT_BYTES = 24;
-        const short HASH_BYTES = 18;
-        const int PBKDF2_ITERATIONS = 64000;
+        private const short SaltBytes = 24;
+        private const short HashBytes = 18;
+        private const int Pbkdf2Iterations = 64000;
         #endregion

-        static byte[] PBKDF2(SecureString password, byte[] salt, int iterations, int outputBytes)
+        private static byte[] Pbkdf2(SecureString password, byte[] salt, int iterations, int outputBytes)
         {
             using (password)
             using (var pbkdf2 = new Rfc2898DeriveBytes(password.ReadBytes(), salt, iterations))
-            {
                 return pbkdf2.GetBytes(outputBytes);
-            }
         }
-        static bool CheckEquals(byte[] a, byte[] b)
+        private static bool CheckEquals(IReadOnlyList<byte> a, IReadOnlyList<byte> b)
         {
 #if SaferPasswords
             // Este método realiza una comprobación lenta intencionalmente.
-            uint diff = (uint)a.Length ^ (uint)b.Length;
-            for (int i = 0; i < a.Length && i < b.Length; i++)
-            {
+            var diff = (uint)a.Count ^ (uint)b.Count;
+            for (var i = 0; i < a.Count && i < b.Count; i++)
                 diff |= (uint)(a[i] ^ b[i]);
-            }
+
             return diff == 0;
 #else
             return System.Linq.Enumerable.SequenceEqual(a, b);
@@ -84,17 +83,16 @@
         /// <returns></returns>
         public static byte[] CreateHash(SecureString password)
         {
-            byte[] salt = new byte[SALT_BYTES];
-            using (RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider())
-            {
+            var salt = new byte[SaltBytes];
+            using (var csprng = new RNGCryptoServiceProvider())
                 csprng.GetBytes(salt);
-            }
-            byte[] hash = PBKDF2(password, salt, PBKDF2_ITERATIONS, HASH_BYTES);
+
+            var hash = Pbkdf2(password, salt, Pbkdf2Iterations, HashBytes);

             using (var ms = new MemoryStream())
             using (var bw = new BinaryWriter(ms))
             {
-                bw.Write(PBKDF2_ITERATIONS);
+                bw.Write(Pbkdf2Iterations);
                 bw.Write((short)salt.Length);
                 bw.Write(salt);
                 bw.Write((short)hash.Length);
@@ -102,26 +100,8 @@
                 return ms.ToArray();
             }
         }
-
-#if PreferExceptions
         /// <summary>
-        /// Verifica la contraseña.
-        /// </summary>
-        /// <param name="password">
-        /// Contraseña a verificar.
-        /// </param>
-        /// <param name="goodHash">
-        /// Hash+Salt contra el cual comparar.
-        /// </param>
-        /// <returns>
-        /// <see langword="true"/> si la contraseña es válida,
-        /// <see langword="false"/> en caso contrario.
-        /// </returns>
-        public static bool? VerifyPassword(SecureString password, byte[] goodHash)
-        {
-#else
-        /// <summary>
-        /// Verifica la contraseña.
+        /// Verifica una contraseña.
         /// </summary>
         /// <param name="password">
         /// Contraseña a verificar.
@@ -139,21 +119,39 @@
         {
             try
             {
-#endif
                 using (var ms = new MemoryStream(goodHash))
                 using (var br = new BinaryReader(ms))
                 {
-                    int iterations = br.ReadInt32();
-                    byte[] salt = br.ReadBytes(br.ReadInt16());
-                    byte[] hash = br.ReadBytes(br.ReadInt16());
+                    var iterations = br.ReadInt32();
+                    var salt = br.ReadBytes(br.ReadInt16());
+                    var hash = br.ReadBytes(br.ReadInt16());

-                    byte[] testHash = PBKDF2(password, salt, iterations, hash.Length);
+                    var testHash = Pbkdf2(password, salt, iterations, hash.Length);
                     return CheckEquals(hash, testHash);
                 }
 #if !PreferExceptions
             }
             catch { return null; }
+#else
+            }
+            catch { throw; }
 #endif
         }
+        /// <summary>
+        /// Verifica una contraseña de forma asíncrona.
+        /// </summary>
+        /// <param name="password">
+        /// Contraseña a verificar.
+        /// </param>
+        /// <param name="goodHash">
+        /// Hash+Salt contra el cual comparar.
+        /// </param>
+        /// <returns>
+        /// <see langword="true"/> si la contraseña es válida,
+        /// <see langword="false"/> en caso contrario, o
+        /// <see langword="null"/> si hay un problema al verificar la
+        /// contraseña, como ser, debido a tampering.
+        /// </returns>
+        public static async Task<bool?> VerifyPasswordAsync(SecureString password, byte[] goodHash) => await Task.Run(()=>VerifyPassword(password, goodHash));
     }
 }


Don't block when rosparam executable is about to exit.

--- RosParamClient/Program.cs
+++ RosParamClient/Program.cs
@@ -88,7 +88,6 @@
             RemappingHelper.GetRemappings(ref args, out remappings);
             ROS.Init(args, "");
             new Program(args).result();
-            Console.ReadLine();
         }
     }
 }


cleanup

cleanup

--- EFCore/EFCoreSamples/UsingDependencyInjection/Program.cs
+++ EFCore/EFCoreSamples/UsingDependencyInjection/Program.cs
@@ -1,7 +1,6 @@
 using Microsoft.EntityFrameworkCore;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
-using System;
 using System.Threading.Tasks;

 namespace UsingDependencyInjection


Update IgnoreHiddenColumnsDataTable.cs

Update IgnoreHiddenColumnsDataTable.cs

--- Examples/CSharp/Articles/IgnoreHiddenColumnsDataTable.cs
+++ Examples/CSharp/Articles/IgnoreHiddenColumnsDataTable.cs
@@ -8,6 +8,7 @@
     {
         static void Main()
         {
+            //ExStart:1
             string dataDir = Aspose.Cells.Examples.Utils.GetDataDir(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
             string inputPath = dataDir + "Sample.xlsx";

@@ -22,6 +23,7 @@
             int totalColumns = worksheet.Cells.MaxColumn + 1;

             DataTable dt = worksheet.Cells.ExportDataTable(0, 0, totalRows, totalColumns, opts);
+            //ExEnd:1
         }
     }
 }


resources update

resources update

--- TCC.Core/R.cs
+++ TCC.Core/R.cs
@@ -434,29 +434,6 @@
 		public static Double MapHeight => ((Double)App.Current.FindResource("MapHeight"));
 	}

-	// ResourceDictionaries/Styles.xaml
-	public static class Styles
-	{
-		public static Style NotificationTitle => ((Style)App.Current.FindResource("NotificationTitle"));
-		public static Style NotificationBody => ((Style)App.Current.FindResource("NotificationBody"));
-		public static Style NotificationVersion => ((Style)App.Current.FindResource("NotificationVersion"));
-		public static Style NotificationTimestamp => ((Style)App.Current.FindResource("NotificationTimestamp"));
-		public static Style NotificationRectangle => ((Style)App.Current.FindResource("NotificationRectangle"));
-		public static Style BaseWindowStyle => ((Style)App.Current.FindResource("BaseWindowStyle"));
-		public static Style DefaultBorderStyle => ((Style)App.Current.FindResource("DefaultBorderStyle"));
-		public static Style RevampBorderStyle => ((Style)App.Current.FindResource("RevampBorderStyle"));
-		public static Style BoundaryBorderStyle => ((Style)App.Current.FindResource("BoundaryBorderStyle"));
-		public static Style DefaultTextStyle => ((Style)App.Current.FindResource("DefaultTextStyle"));
-		public static Style SettingsButton => ((Style)App.Current.FindResource("SettingsButton"));
-		public static Style ScrollThumbs => ((Style)App.Current.FindResource("ScrollThumbs"));
-		public static Style ReversedScrollBar => ((Style)App.Current.FindResource("ReversedScrollBar"));
-		public static Style ScrollViewerWithReversedVerticalScrollBar => ((Style)App.Current.FindResource("ScrollViewerWithReversedVerticalScrollBar"));
-		public static Style ChatTabControlStyle => ((Style)App.Current.FindResource("ChatTabControlStyle"));
-		public static Style GlowHoverGrid => ((Style)App.Current.FindResource("GlowHoverGrid"));
-		public static Style GlowHoverGridLeft => ((Style)App.Current.FindResource("GlowHoverGridLeft"));
-		public static Style ClassWindowSkillBorder => ((Style)App.Current.FindResource("ClassWindowSkillBorder"));
-	}
-
 	// ResourceDictionaries/SVG.xaml
 	public static class SVG
 	{
@@ -490,6 +467,29 @@
 		public static Geometry SvgBuffIcon => ((Geometry)App.Current.FindResource("SvgBuffIcon"));
 	}

+	// ResourceDictionaries/Styles.xaml
+	public static class Styles
+	{
+		public static Style NotificationTitle => ((Style)App.Current.FindResource("NotificationTitle"));
+		public static Style NotificationBody => ((Style)App.Current.FindResource("NotificationBody"));
+		public static Style NotificationVersion => ((Style)App.Current.FindResource("NotificationVersion"));
+		public static Style NotificationTimestamp => ((Style)App.Current.FindResource("NotificationTimestamp"));
+		public static Style NotificationRectangle => ((Style)App.Current.FindResource("NotificationRectangle"));
+		public static Style BaseWindowStyle => ((Style)App.Current.FindResource("BaseWindowStyle"));
+		public static Style DefaultBorderStyle => ((Style)App.Current.FindResource("DefaultBorderStyle"));
+		public static Style RevampBorderStyle => ((Style)App.Current.FindResource("RevampBorderStyle"));
+		public static Style BoundaryBorderStyle => ((Style)App.Current.FindResource("BoundaryBorderStyle"));
+		public static Style DefaultTextStyle => ((Style)App.Current.FindResource("DefaultTextStyle"));
+		public static Style SettingsButton => ((Style)App.Current.FindResource("SettingsButton"));
+		public static Style ScrollThumbs => ((Style)App.Current.FindResource("ScrollThumbs"));
+		public static Style ReversedScrollBar => ((Style)App.Current.FindResource("ReversedScrollBar"));
+		public static Style ScrollViewerWithReversedVerticalScrollBar => ((Style)App.Current.FindResource("ScrollViewerWithReversedVerticalScrollBar"));
+		public static Style ChatTabControlStyle => ((Style)App.Current.FindResource("ChatTabControlStyle"));
+		public static Style GlowHoverGrid => ((Style)App.Current.FindResource("GlowHoverGrid"));
+		public static Style GlowHoverGridLeft => ((Style)App.Current.FindResource("GlowHoverGridLeft"));
+		public static Style ClassWindowSkillBorder => ((Style)App.Current.FindResource("ClassWindowSkillBorder"));
+	}
+
 	// ResourceDictionaries/TemplateSelectors.xaml
 	public static class TemplateSelectors
 	{
@@ -512,123 +512,123 @@
 	// pack://application:,,,/Nostrum;component/Resources/Converters.xaml
 	public static class Nostrum_Converters
 	{
+		public static EpochConverter EpochConverter => ((EpochConverter)App.Current.FindResource("EpochConverter"));
+		public static MillisecondsToStringConverter MillisecondsToString => ((MillisecondsToStringConverter)App.Current.FindResource("MillisecondsToString"));
+		public static RoundedClipConverter RoundedClipConverter => ((RoundedClipConverter)App.Current.FindResource("RoundedClipConverter"));
+		public static BooleanInverter BoolInverter => ((BooleanInverter)App.Current.FindResource("BoolInverter"));
+		public static DurationLabelConverter DurationToTimeFormat => ((DurationLabelConverter)App.Current.FindResource("DurationToTimeFormat"));
+		public static ListBoxItemIndexConverter ListBoxItemIndex => ((ListBoxItemIndexConverter)App.Current.FindResource("ListBoxItemIndex"));
+		public static EnumDescriptionConverter EnumDescriptionConverter => ((EnumDescriptionConverter)App.Current.FindResource("EnumDescriptionConverter"));
 		public static BoolToVisibility BoolToVisibility => ((BoolToVisibility)App.Current.FindResource("BoolToVisibility"));
+		public static MathMultiplicationConverter MathMultiplication => ((MathMultiplicationConverter)App.Current.FindResource("MathMultiplication"));
+		public static ValueToFactorConverter ValueToFactor => ((ValueToFactorConverter)App.Current.FindResource("ValueToFactor"));
 		public static NullToVisibleCollapsedConverter NullToVisibleCollapsed => ((NullToVisibleCollapsedConverter)App.Current.FindResource("NullToVisibleCollapsed"));
 		public static ColorToTransparent ColorToTransparent => ((ColorToTransparent)App.Current.FindResource("ColorToTransparent"));
-		public static EnumDescriptionConverter EnumDescriptionConverter => ((EnumDescriptionConverter)App.Current.FindResource("EnumDescriptionConverter"));
-		public static MathMultiplicationConverter MathMultiplication => ((MathMultiplicationConverter)App.Current.FindResource("MathMultiplication"));
-		public static RoundedClipConverter RoundedClipConverter => ((RoundedClipConverter)App.Current.FindResource("RoundedClipConverter"));
-		public static DurationLabelConverter DurationToTimeFormat => ((DurationLabelConverter)App.Current.FindResource("DurationToTimeFormat"));
 		public static FactorToAngleConverter FactorToAngle => ((FactorToAngleConverter)App.Current.FindResource("FactorToAngle"));
-		public static ListBoxItemIndexConverter ListBoxItemIndex => ((ListBoxItemIndexConverter)App.Current.FindResource("ListBoxItemIndex"));
-		public static BooleanInverter BoolInverter => ((BooleanInverter)App.Current.FindResource("BoolInverter"));
-		public static MillisecondsToStringConverter MillisecondsToString => ((MillisecondsToStringConverter)App.Current.FindResource("MillisecondsToString"));
-		public static EpochConverter EpochConverter => ((EpochConverter)App.Current.FindResource("EpochConverter"));
-		public static ValueToFactorConverter ValueToFactor => ((ValueToFactorConverter)App.Current.FindResource("ValueToFactor"));
 	}

 	// pack://application:,,,/Nostrum;component/Resources/MiscResources.xaml
 	public static class Nostrum_MiscResources
 	{
+		public static RotateTransform Rotate45 => ((RotateTransform)App.Current.FindResource("Rotate45"));
 		public static ScaleTransform DefaultScaleTransform => ((ScaleTransform)App.Current.FindResource("DefaultScaleTransform"));
 		public static SkewTransform Skew45 => ((SkewTransform)App.Current.FindResource("Skew45"));
+		public static RotateTransform Rotate45Inv => ((RotateTransform)App.Current.FindResource("Rotate45Inv"));
 		public static SkewTransform Skew45Inv => ((SkewTransform)App.Current.FindResource("Skew45Inv"));
+		public static QuadraticEase QuadraticEase => ((QuadraticEase)App.Current.FindResource("QuadraticEase"));
 		public static TranslateTransform DefaultTranslateTransform => ((TranslateTransform)App.Current.FindResource("DefaultTranslateTransform"));
-		public static RotateTransform Rotate45Inv => ((RotateTransform)App.Current.FindResource("Rotate45Inv"));
-		public static RotateTransform Rotate45 => ((RotateTransform)App.Current.FindResource("Rotate45"));
-		public static QuadraticEase QuadraticEase => ((QuadraticEase)App.Current.FindResource("QuadraticEase"));
 		public static RotateTransform DefaultRotateTransform => ((RotateTransform)App.Current.FindResource("DefaultRotateTransform"));
+	}
+
+	// pack://application:,,,/Nostrum;component/Resources/SVG.xaml
+	public static class Nostrum_SVG
+	{
+		public static StreamGeometry SvgAuto => ((StreamGeometry)App.Current.FindResource("SvgAuto"));
+		public static StreamGeometry SvgDiscord => ((StreamGeometry)App.Current.FindResource("SvgDiscord"));
+		public static StreamGeometry SvgShop => ((StreamGeometry)App.Current.FindResource("SvgShop"));
+		public static StreamGeometry SvgTwitch => ((StreamGeometry)App.Current.FindResource("SvgTwitch"));
+		public static StreamGeometry SvgConfirm => ((StreamGeometry)App.Current.FindResource("SvgConfirm"));
+		public static StreamGeometry SvgSearch => ((StreamGeometry)App.Current.FindResource("SvgSearch"));
+		public static StreamGeometry SvgCheckAll => ((StreamGeometry)App.Current.FindResource("SvgCheckAll"));
+		public static StreamGeometry SvgGitHub => ((StreamGeometry)App.Current.FindResource("SvgGitHub"));
+		public static StreamGeometry SvgMail => ((StreamGeometry)App.Current.FindResource("SvgMail"));
+		public static StreamGeometry SvgChatMessage => ((StreamGeometry)App.Current.FindResource("SvgChatMessage"));
+		public static StreamGeometry SvgEye => ((StreamGeometry)App.Current.FindResource("SvgEye"));
+		public static StreamGeometry SvgBlock => ((StreamGeometry)App.Current.FindResource("SvgBlock"));
+		public static StreamGeometry SvgGift => ((StreamGeometry)App.Current.FindResource("SvgGift"));
+		public static StreamGeometry SvgCollapseAll => ((StreamGeometry)App.Current.FindResource("SvgCollapseAll"));
+		public static StreamGeometry SvgMatching => ((StreamGeometry)App.Current.FindResource("SvgMatching"));
+		public static StreamGeometry SvgWarning => ((StreamGeometry)App.Current.FindResource("SvgWarning"));
+		public static StreamGeometry SvgFolder => ((StreamGeometry)App.Current.FindResource("SvgFolder"));
+		public static StreamGeometry SvgAdd => ((StreamGeometry)App.Current.FindResource("SvgAdd"));
+		public static StreamGeometry SvgDelegateLeader => ((StreamGeometry)App.Current.FindResource("SvgDelegateLeader"));
+		public static StreamGeometry SvgUnpin => ((StreamGeometry)App.Current.FindResource("SvgUnpin"));
+		public static StreamGeometry SvgAddUser => ((StreamGeometry)App.Current.FindResource("SvgAddUser"));
+		public static StreamGeometry SvgCrossedSwords => ((StreamGeometry)App.Current.FindResource("SvgCrossedSwords"));
+		public static StreamGeometry SvgRemoveCircle => ((StreamGeometry)App.Current.FindResource("SvgRemoveCircle"));
+		public static StreamGeometry SvgAddCircle => ((StreamGeometry)App.Current.FindResource("SvgAddCircle"));
+		public static StreamGeometry SvgStar => ((StreamGeometry)App.Current.FindResource("SvgStar"));
+		public static StreamGeometry SvgDrag => ((StreamGeometry)App.Current.FindResource("SvgDrag"));
+		public static StreamGeometry SvgPaypal => ((StreamGeometry)App.Current.FindResource("SvgPaypal"));
+		public static StreamGeometry SvgBasket => ((StreamGeometry)App.Current.FindResource("SvgBasket"));
+		public static StreamGeometry SvgCheckCircle => ((StreamGeometry)App.Current.FindResource("SvgCheckCircle"));
+		public static StreamGeometry SvgHide => ((StreamGeometry)App.Current.FindResource("SvgHide"));
+		public static StreamGeometry SvgShirt => ((StreamGeometry)App.Current.FindResource("SvgShirt"));
+		public static StreamGeometry SvgUser => ((StreamGeometry)App.Current.FindResource("SvgUser"));
+		public static StreamGeometry SvgSocial => ((StreamGeometry)App.Current.FindResource("SvgSocial"));
+		public static StreamGeometry SvgSettings => ((StreamGeometry)App.Current.FindResource("SvgSettings"));
+		public static StreamGeometry SvgReload => ((StreamGeometry)App.Current.FindResource("SvgReload"));
+		public static StreamGeometry SvgCopy => ((StreamGeometry)App.Current.FindResource("SvgCopy"));
+		public static StreamGeometry SvgBlurOn => ((StreamGeometry)App.Current.FindResource("SvgBlurOn"));
+		public static StreamGeometry SvgMoney => ((StreamGeometry)App.Current.FindResource("SvgMoney"));
+		public static StreamGeometry SvgInfo => ((StreamGeometry)App.Current.FindResource("SvgInfo"));
+		public static StreamGeometry SvgDisband => ((StreamGeometry)App.Current.FindResource("SvgDisband"));
+		public static StreamGeometry SvgUserAdd => ((StreamGeometry)App.Current.FindResource("SvgUserAdd"));
+		public static StreamGeometry SvgQuestLog => ((StreamGeometry)App.Current.FindResource("SvgQuestLog"));
+		public static StreamGeometry SvgAchievements => ((StreamGeometry)App.Current.FindResource("SvgAchievements"));
+		public static StreamGeometry SvgClose => ((StreamGeometry)App.Current.FindResource("SvgClose"));
+		public static StreamGeometry SvgTrophy => ((StreamGeometry)App.Current.FindResource("SvgTrophy"));
+		public static StreamGeometry SvgBlurOff => ((StreamGeometry)App.Current.FindResource("SvgBlurOff"));
+		public static StreamGeometry SvgAddUsers => ((StreamGeometry)App.Current.FindResource("SvgAddUsers"));
+		public static StreamGeometry SvgUpArrow => ((StreamGeometry)App.Current.FindResource("SvgUpArrow"));
+		public static StreamGeometry SvgAwaken => ((StreamGeometry)App.Current.FindResource("SvgAwaken"));
+		public static StreamGeometry SvgDotsVertical => ((StreamGeometry)App.Current.FindResource("SvgDotsVertical"));
+		public static StreamGeometry SvgPen => ((StreamGeometry)App.Current.FindResource("SvgPen"));
+		public static StreamGeometry SvgRemoveUser => ((StreamGeometry)App.Current.FindResource("SvgRemoveUser"));
+		public static StreamGeometry SvgMapMarker => ((StreamGeometry)App.Current.FindResource("SvgMapMarker"));
+		public static StreamGeometry SvgUsers => ((StreamGeometry)App.Current.FindResource("SvgUsers"));
+		public static StreamGeometry SvgHeart => ((StreamGeometry)App.Current.FindResource("SvgHeart"));
+		public static StreamGeometry SvgGuild => ((StreamGeometry)App.Current.FindResource("SvgGuild"));
+		public static StreamGeometry SvgMove => ((StreamGeometry)App.Current.FindResource("SvgMove"));
+		public static StreamGeometry SvgShare => ((StreamGeometry)App.Current.FindResource("SvgShare"));
+		public static StreamGeometry SvgPin => ((StreamGeometry)App.Current.FindResource("SvgPin"));
+		public static StreamGeometry SvgMenuRight => ((StreamGeometry)App.Current.FindResource("SvgMenuRight"));
+		public static StreamGeometry SvgExpandAll => ((StreamGeometry)App.Current.FindResource("SvgExpandAll"));
+		public static StreamGeometry SvgDownArrow => ((StreamGeometry)App.Current.FindResource("SvgDownArrow"));
+		public static StreamGeometry SvgOpenLink => ((StreamGeometry)App.Current.FindResource("SvgOpenLink"));
 	}

 	// pack://application:,,,/Nostrum;component/Resources/Styles.xaml
 	public static class Nostrum_Styles
 	{
-		public static ControlTemplate ComboBoxEditableTemplate => ((ControlTemplate)App.Current.FindResource("ComboBoxEditableTemplate"));
+		public static Style DefaultListItemStyle => ((Style)App.Current.FindResource("DefaultListItemStyle"));
+		public static ControlTemplate ComboBoxTemplate => ((ControlTemplate)App.Current.FindResource("ComboBoxTemplate"));
+		public static SolidColorBrush SelectionBorderBrush => ((SolidColorBrush)App.Current.FindResource("SelectionBorderBrush"));
+		public static DropShadowEffect BigDropShadow => ((DropShadowEffect)App.Current.FindResource("BigDropShadow"));
 		public static Style ButtonContentOpacityStyle => ((Style)App.Current.FindResource("ButtonContentOpacityStyle"));
+		public static DropShadowEffect DropShadow => ((DropShadowEffect)App.Current.FindResource("DropShadow"));
 		public static SolidColorBrush SelectionBackgroundLightBrush => ((SolidColorBrush)App.Current.FindResource("SelectionBackgroundLightBrush"));
+		public static Style NoHilightListItemStyle => ((Style)App.Current.FindResource("NoHilightListItemStyle"));
+		public static Style ComboBoxMainStyle => ((Style)App.Current.FindResource("ComboBoxMainStyle"));
+		public static SolidColorBrush SelectionBackgroundBrush => ((SolidColorBrush)App.Current.FindResource("SelectionBackgroundBrush"));
 		public static Style ComboBoxEditableTextBox => ((Style)App.Current.FindResource("ComboBoxEditableTextBox"));
 		public static Style NoHilightListItemStyleWithLines => ((Style)App.Current.FindResource("NoHilightListItemStyleWithLines"));
-		public static Style DefaultListItemStyle => ((Style)App.Current.FindResource("DefaultListItemStyle"));
+		public static ControlTemplate ComboBoxEditableTemplate => ((ControlTemplate)App.Current.FindResource("ComboBoxEditableTemplate"));
+		public static Style EmptyFocusVisual => ((Style)App.Current.FindResource("EmptyFocusVisual"));
 		public static ControlTemplate MenuItemControlTemplate1 => ((ControlTemplate)App.Current.FindResource("MenuItemControlTemplate1"));
 		public static Style ButtonMainStyle => ((Style)App.Current.FindResource("ButtonMainStyle"));
-		public static DropShadowEffect DropShadow => ((DropShadowEffect)App.Current.FindResource("DropShadow"));
-		public static SolidColorBrush SelectionBackgroundBrush => ((SolidColorBrush)App.Current.FindResource("SelectionBackgroundBrush"));
-		public static Style NoHilightListItemStyle => ((Style)App.Current.FindResource("NoHilightListItemStyle"));
-		public static DropShadowEffect BigDropShadow => ((DropShadowEffect)App.Current.FindResource("BigDropShadow"));
 		public static DropShadowEffect FadedDropShadow => ((DropShadowEffect)App.Current.FindResource("FadedDropShadow"));
-		public static ControlTemplate ComboBoxTemplate => ((ControlTemplate)App.Current.FindResource("ComboBoxTemplate"));
-		public static Style ComboBoxMainStyle => ((Style)App.Current.FindResource("ComboBoxMainStyle"));
-		public static SolidColorBrush SelectionBorderBrush => ((SolidColorBrush)App.Current.FindResource("SelectionBorderBrush"));
-		public static Style EmptyFocusVisual => ((Style)App.Current.FindResource("EmptyFocusVisual"));
 		public static Style ComboBoxToggleButton => ((Style)App.Current.FindResource("ComboBoxToggleButton"));
 	}

-	// pack://application:,,,/Nostrum;component/Resources/SVG.xaml
-	public static class Nostrum_SVG
-	{
-		public static StreamGeometry SvgCopy => ((StreamGeometry)App.Current.FindResource("SvgCopy"));
-		public static StreamGeometry SvgUpArrow => ((StreamGeometry)App.Current.FindResource("SvgUpArrow"));
-		public static StreamGeometry SvgAchievements => ((StreamGeometry)App.Current.FindResource("SvgAchievements"));
-		public static StreamGeometry SvgAwaken => ((StreamGeometry)App.Current.FindResource("SvgAwaken"));
-		public static StreamGeometry SvgGitHub => ((StreamGeometry)App.Current.FindResource("SvgGitHub"));
-		public static StreamGeometry SvgCheckAll => ((StreamGeometry)App.Current.FindResource("SvgCheckAll"));
-		public static StreamGeometry SvgPaypal => ((StreamGeometry)App.Current.FindResource("SvgPaypal"));
-		public static StreamGeometry SvgCollapseAll => ((StreamGeometry)App.Current.FindResource("SvgCollapseAll"));
-		public static StreamGeometry SvgBasket => ((StreamGeometry)App.Current.FindResource("SvgBasket"));
-		public static StreamGeometry SvgMove => ((StreamGeometry)App.Current.FindResource("SvgMove"));
-		public static StreamGeometry SvgEye => ((StreamGeometry)App.Current.FindResource("SvgEye"));
-		public static StreamGeometry SvgAdd => ((StreamGeometry)App.Current.FindResource("SvgAdd"));
-		public static StreamGeometry SvgConfirm => ((StreamGeometry)App.Current.FindResource("SvgConfirm"));
-		public static StreamGeometry SvgAddUser => ((StreamGeometry)App.Current.FindResource("SvgAddUser"));
-		public static StreamGeometry SvgShare => ((StreamGeometry)App.Current.FindResource("SvgShare"));
-		public static StreamGeometry SvgUser => ((StreamGeometry)App.Current.FindResource("SvgUser"));
-		public static StreamGeometry SvgShop => ((StreamGeometry)App.Current.FindResource("SvgShop"));
-		public static StreamGeometry SvgShirt => ((StreamGeometry)App.Current.FindResource("SvgShirt"));
-		public static StreamGeometry SvgReload => ((StreamGeometry)App.Current.FindResource("SvgReload"));
-		public static StreamGeometry SvgCheckCircle => ((StreamGeometry)App.Current.FindResource("SvgCheckCircle"));
-		public static StreamGeometry SvgMatching => ((StreamGeometry)App.Current.FindResource("SvgMatching"));
-		public static StreamGeometry SvgDiscord => ((StreamGeometry)App.Current.FindResource("SvgDiscord"));
-		public static StreamGeometry SvgDrag => ((StreamGeometry)App.Current.FindResource("SvgDrag"));
-		public static StreamGeometry SvgStar => ((StreamGeometry)App.Current.FindResource("SvgStar"));
-		public static StreamGeometry SvgFolder => ((StreamGeometry)App.Current.FindResource("SvgFolder"));
-		public static StreamGeometry SvgMapMarker => ((StreamGeometry)App.Current.FindResource("SvgMapMarker"));
-		public static StreamGeometry SvgChatMessage => ((StreamGeometry)App.Current.FindResource("SvgChatMessage"));
-		public static StreamGeometry SvgClose => ((StreamGeometry)App.Current.FindResource("SvgClose"));
-		public static StreamGeometry SvgHide => ((StreamGeometry)App.Current.FindResource("SvgHide"));
-		public static StreamGeometry SvgSocial => ((StreamGeometry)App.Current.FindResource("SvgSocial"));
-		public static StreamGeometry SvgBlurOff => ((StreamGeometry)App.Current.FindResource("SvgBlurOff"));
-		public static StreamGeometry SvgPen => ((StreamGeometry)App.Current.FindResource("SvgPen"));
-		public static StreamGeometry SvgUsers => ((StreamGeometry)App.Current.FindResource("SvgUsers"));
-		public static StreamGeometry SvgInfo => ((StreamGeometry)App.Current.FindResource("SvgInfo"));
-		public static StreamGeometry SvgGift => ((StreamGeometry)App.Current.FindResource("SvgGift"));
-		public static StreamGeometry SvgCrossedSwords => ((StreamGeometry)App.Current.FindResource("SvgCrossedSwords"));
-		public static StreamGeometry SvgWarning => ((StreamGeometry)App.Current.FindResource("SvgWarning"));
-		public static StreamGeometry SvgDownArrow => ((StreamGeometry)App.Current.FindResource("SvgDownArrow"));
-		public static StreamGeometry SvgQuestLog => ((StreamGeometry)App.Current.FindResource("SvgQuestLog"));
-		public static StreamGeometry SvgAddUsers => ((StreamGeometry)App.Current.FindResource("SvgAddUsers"));
-		public static StreamGeometry SvgRemoveUser => ((StreamGeometry)App.Current.FindResource("SvgRemoveUser"));
-		public static StreamGeometry SvgAuto => ((StreamGeometry)App.Current.FindResource("SvgAuto"));
-		public static StreamGeometry SvgBlurOn => ((StreamGeometry)App.Current.FindResource("SvgBlurOn"));
-		public static StreamGeometry SvgPin => ((StreamGeometry)App.Current.FindResource("SvgPin"));
-		public static StreamGeometry SvgSearch => ((StreamGeometry)App.Current.FindResource("SvgSearch"));
-		public static StreamGeometry SvgDotsVertical => ((StreamGeometry)App.Current.FindResource("SvgDotsVertical"));
-		public static StreamGeometry SvgHeart => ((StreamGeometry)App.Current.FindResource("SvgHeart"));
-		public static StreamGeometry SvgMenuRight => ((StreamGeometry)App.Current.FindResource("SvgMenuRight"));
-		public static StreamGeometry SvgRemoveCircle => ((StreamGeometry)App.Current.FindResource("SvgRemoveCircle"));
-		public static StreamGeometry SvgAddCircle => ((StreamGeometry)App.Current.FindResource("SvgAddCircle"));
-		public static StreamGeometry SvgUnpin => ((StreamGeometry)App.Current.FindResource("SvgUnpin"));
-		public static StreamGeometry SvgDisband => ((StreamGeometry)App.Current.FindResource("SvgDisband"));
-		public static StreamGeometry SvgMoney => ((StreamGeometry)App.Current.FindResource("SvgMoney"));
-		public static StreamGeometry SvgTwitch => ((StreamGeometry)App.Current.FindResource("SvgTwitch"));
-		public static StreamGeometry SvgExpandAll => ((StreamGeometry)App.Current.FindResource("SvgExpandAll"));
-		public static StreamGeometry SvgMail => ((StreamGeometry)App.Current.FindResource("SvgMail"));
-		public static StreamGeometry SvgGuild => ((StreamGeometry)App.Current.FindResource("SvgGuild"));
-		public static StreamGeometry SvgTrophy => ((StreamGeometry)App.Current.FindResource("SvgTrophy"));
-		public static StreamGeometry SvgSettings => ((StreamGeometry)App.Current.FindResource("SvgSettings"));
-		public static StreamGeometry SvgUserAdd => ((StreamGeometry)App.Current.FindResource("SvgUserAdd"));
-		public static StreamGeometry SvgOpenLink => ((StreamGeometry)App.Current.FindResource("SvgOpenLink"));
-		public static StreamGeometry SvgDelegateLeader => ((StreamGeometry)App.Current.FindResource("SvgDelegateLeader"));
-		public static StreamGeometry SvgBlock => ((StreamGeometry)App.Current.FindResource("SvgBlock"));
-	}
-
 }


Added summaries for fields that can be frozen.

--- Sandra.Chess/Variation.cs
+++ Sandra.Chess/Variation.cs
@@ -31,12 +31,18 @@
         /// </summary>
         public readonly Move Move;

+        /// <summary>
+        /// Gets the parent <see cref="MoveTree"/> in which this variation is embedded. This field is never equal to null.
+        /// </summary>
         public readonly MoveTree ParentTree;

+        /// <summary>
+        /// Gets the tree of moves after <see cref="Move"/> has been played.
+        /// </summary>
         public readonly MoveTree MoveTree;

         internal Variation(MoveTree parentTree, Move move)
-        {
+        {
             ParentTree = parentTree;
             Move = move;
             MoveTree = new MoveTree(this);
@@ -61,6 +67,9 @@
         /// </remarks>
         public readonly int PlyCount;

+        /// <summary>
+        /// Gets the optional parent <see cref="Variation"/> with previous move in which this <see cref="MoveTree"/> is embedded.
+        /// </summary>
         public readonly Variation ParentVariation;

         public Variation Main { get; private set; }


fixes a non-compileable assertion to the extent that it compiles


Added Google analictics to page

Added Google analictics to page

--- FormsGeneratorWebApplication/Views/Shared/_Layout.cshtml
+++ FormsGeneratorWebApplication/Views/Shared/_Layout.cshtml
@@ -4,11 +4,26 @@
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>@ViewBag.Title - Forms</title>
-        @Styles.Render("~/Content/css")
-
-    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
+    @Styles.Render("~/Content/css")
+
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
     <script type="text/javascript"> window.jQuery || document.write('<script>src="@Url.Content("~/Scripts/vender/jquery-1.10.2.js")" <\/script>')</script>
-
+    <!--
+
+
+    -->
+    <script>
+    (function (i, s, o, g, r, a, m) {
+        i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
+            (i[r].q = i[r].q || []).push(arguments)
+        }, i[r].l = 1 * new Date(); a = s.createElement(o),
+        m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
+    })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
+
+    ga('create', 'UA-62590401-1', 'auto');
+    ga('send', 'pageview');
+
+    </script>
     @Scripts.Render("~/Scripts/vender/vender-bundle")
     @*@Scripts.Render("~/bundles/modernizr")*@
     @Scripts.Render("~/bundles/bootstrap")


* Adding ON_ERROR_INFO event.

* Adding ON_ERROR_INFO event.

--- Scripts/Utilities/Constants.cs
+++ Scripts/Utilities/Constants.cs
@@ -78,6 +78,10 @@
             /// AFter toggle the debug console on or off.
             /// </summary>
             ON_DEBUG_TOGGLE_FINISH,
+            /// <summary>
+            /// This is sent to provide additional info about a error that is ocurring.
+            /// </summary>
+            ON_ERROR_INFO,
             #endregion

             #region Avatar


added address as allowed scope

added address as allowed scope

--- source/Host/Config/Clients.cs
+++ source/Host/Config/Clients.cs
@@ -54,6 +54,7 @@
                         Constants.StandardScopes.OpenId,
                         Constants.StandardScopes.Profile,
                         Constants.StandardScopes.Email,
+                        Constants.StandardScopes.Address,
                         Constants.StandardScopes.OfflineAccess,
                         "idmgr",
                         "read",


Made polygon a struct

Made polygon a struct

--- Sharpex2D/Math/Polygon.cs
+++ Sharpex2D/Math/Polygon.cs
@@ -25,30 +25,28 @@
 {
     [Developer("ThuCommix", "developer@sharpex2d.de")]
     [TestState(TestState.Tested)]
-    public class Polygon : IGeometry
+    public struct Polygon : IGeometry
     {
-        private readonly List<Vector2> _edges;
-        private readonly List<Vector2> _originalPoints;
         private readonly List<Vector2> _points;

         /// <summary>
         ///     Initializes a new Polygon class.
         /// </summary>
-        public Polygon()
+        /// <param name="points">The Points.</param>
+        public Polygon(params Vector2[] points) : this()
         {
             _points = new List<Vector2>();
-            _edges = new List<Vector2>();
-            _originalPoints = new List<Vector2>();
+            _points.AddRange(points);
         }

         /// <summary>
         ///     Initializes a new Polygon class.
         /// </summary>
         /// <param name="points">The Points.</param>
-        public Polygon(params Vector2[] points)
-        {
-            _originalPoints.AddRange(points);
-            UpdateEdges();
+        public Polygon(IEnumerable<Vector2> points) : this()
+        {
+            _points = new List<Vector2>();
+            _points.AddRange(points);
         }

         /// <summary>
@@ -87,60 +85,6 @@
         }

         /// <summary>
-        ///     Gets the Edges.
-        /// </summary>
-        public List<Vector2> Edges
-        {
-            get { return _edges; }
-        }
-
-        /// <summary>
-        ///     Adds a Vector to the Polygon.
-        /// </summary>
-        /// <param name="point">The Vector.</param>
-        public void Add(Vector2 point)
-        {
-            _originalPoints.Add(point);
-            UpdateEdges();
-        }
-
-        /// <summary>
-        ///     Adds a array of Vector to the Polygon.
-        /// </summary>
-        /// <param name="points">The Vector.</param>
-        public void Add(params Vector2[] points)
-        {
-            _originalPoints.AddRange(points);
-            UpdateEdges();
-        }
-
-        /// <summary>
-        ///     Resets the Polygon.
-        /// </summary>
-        public void Reset()
-        {
-            _points.Clear();
-            _originalPoints.Clear();
-            _edges.Clear();
-        }
-
-        /// <summary>
-        ///     Updates the edges.
-        /// </summary>
-        private void UpdateEdges()
-        {
-            if (!IsValid) return;
-
-            _edges.Clear();
-            for (int i = 0; i < _points.Count; i++)
-            {
-                Vector2 p1 = _points[i];
-                Vector2 p2 = i + 1 >= _points.Count ? _points[0] : _points[i + 1];
-                _edges.Add(p2 - p1);
-            }
-        }
-
-        /// <summary>
         ///     Projects an axis.
         /// </summary>
         /// <param name="axis">The Axis.</param>


Reduced P/Invoke declaration line width.

--- Shortcut/NativeMethods.cs
+++ Shortcut/NativeMethods.cs
@@ -6,10 +6,16 @@
     internal static class NativeMethods
     {
         [DllImport("user32.dll", SetLastError = true)]
-        internal static extern bool RegisterHotKey(IntPtr windowHandle, int hotkeyId, uint modifier, uint key);
+        internal static extern bool RegisterHotKey(
+            IntPtr windowHandle,
+            int hotkeyId,
+            uint modifier,
+            uint key);

         [DllImport("user32.dll", SetLastError = true)]
-        internal static extern bool UnregisterHotKey(IntPtr windowHandle, int hotkeyId);
+        internal static extern bool UnregisterHotKey(
+            IntPtr windowHandle,
+            int hotkeyId);

         [DllImport("user32.dll")]
         internal static extern bool HideCaret(IntPtr controlHandle);


[Modify] Edit it

[Modify] Edit it

--- websocket-sharp/Logger.cs
+++ websocket-sharp/Logger.cs
@@ -67,7 +67,8 @@
     /// Initializes a new instance of the <see cref="Logger"/> class.
     /// </summary>
     /// <remarks>
-    /// This constructor initializes the current logging level with <see cref="LogLevel.Error"/>.
+    /// This constructor initializes the current logging level with
+    /// <see cref="LogLevel.Error"/>.
     /// </remarks>
     public Logger ()
       : this (LogLevel.Error, null, null)


Allow video paths without starting with http

--- LiveSplit/LiveSplit.View/View/SpeedrunComSubmitDialog.cs
+++ LiveSplit/LiveSplit.View/View/SpeedrunComSubmitDialog.cs
@@ -53,9 +53,12 @@

             if (!string.IsNullOrEmpty(txtVideo.Text))
             {
-                if (Uri.IsWellFormedUriString(txtVideo.Text, UriKind.Absolute))
+                var videoText = txtVideo.Text;
+                if (!videoText.StartsWith("http"))
+                    videoText = "http://" + videoText;
+                if (Uri.IsWellFormedUriString(videoText, UriKind.Absolute))
                 {
-                    videoUri = new Uri(txtVideo.Text);
+                    videoUri = new Uri(videoText);
                 }
                 else
                 {


added persistant stprage

added persistant stprage

--- MiningStationAutomation/MiningStationAutomationScript.cs
+++ MiningStationAutomation/MiningStationAutomationScript.cs
@@ -9,7 +9,6 @@

 namespace SpaceEngineersScripts.MiningStationAutomation
 {
-    //TODO: use persistant storage
     //TODO: output to debug
     class MiningStationAutomationScript
     {
@@ -52,6 +51,9 @@
             }

             station.Request();
+
+            Storage = station.State.GetStateDTO(station).ToString();
+            Echo(string.Format("Storage:\n{0}", Storage));
         }

         /// <summary>
@@ -59,6 +61,11 @@
         /// </summary>
         class InitState : State
         {
+            public StateDTO GetStateDTO(Context context)
+            {
+                return new StateDTO(this.GetType().ToString(), -1, -1);
+            }
+
             public void Handle(Context context)
             {
                 var drillStationBlocks = (context as DrillStation).DrillStationBlocks;
@@ -108,24 +115,39 @@
                     block.GetActionWithName("OnOff_On").Apply(block);
                 });

-                //move to the start position (pistons at 1m/s rotor at 4 rpm)
-                if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 4))
-                {
-                    //when done proceed to the next state
-                    if (INIT_FLATTENING)
-                    {
-                        context.State = new FlatteningState(0);
-                    }
-                    else
-                    {
-                        context.State = new DeepeningState();
-                    }
-                }
+                //if the storage contains state info, load it.
+                var storage = (context as DrillStation).PersistantStorage;
+                if (storage.Contains("state="))
+                {
+                    context.State = new StateDTO(storage).BuildState();
+                }
+                else {
+                    //move to the start position (pistons at 1m/s rotor at 1 rpm)
+                    if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 1))
+                    {
+                        //when done proceed to the next state
+                        if (INIT_FLATTENING)
+                        {
+                            context.State = new FlatteningState(0);
+                        }
+                        else
+                        {
+                            context.State = new DeepeningState();
+                        }
+                    }
+                }
+            }
+
+            public void LoadFromStateDTO(StateDTO stateDTO)
+            {
+                //nothing to do here
+                return;
             }

             public string Status(Context context)
             {
-                return "INIT";
+                //leave blank
+                return "";
             }
         }

@@ -135,7 +157,7 @@
         class FlatteningState : State
         {
             private int currentCircle = 0;
-            protected readonly float depth;
+            private float depth;

             /// <summary>
             /// initializes a new FlatteningState
@@ -144,6 +166,11 @@
             public FlatteningState(float targetDepth)
             {
                 this.depth = targetDepth;
+            }
+
+            public StateDTO GetStateDTO(Context context)
+            {
+                return new StateDTO(this.GetType().ToString(), currentCircle, depth);
             }

             public void Handle(Context context)
@@ -180,10 +207,17 @@
                 }
                 else
                 {
-                    //move to the start position (pistons at 1m/s rotor at 4 rpm)
-                    if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 4))
-                    {
-                        context.State = new DeepeningState();
+                    //move to the start position (pistons at 1m/s rotor at 1 rpm)
+                    if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 1))
+                    {
+                        if (depth != TARGET_DEPTH)
+                        {
+                            context.State = new DeepeningState();
+                        }
+                        else
+                        {
+                            context.State = new DoneState();
+                        }
                     }
                 }
             }
@@ -191,6 +225,12 @@
             public string Status(Context context)
             {
                 return string.Format("Flattening [{0}/{1}] ({2:0.##}m)", currentCircle + 1, DRILL_RADII.Count, BlockUtils.GetPistonsTotalPosition((context as DrillStation).DrillStationBlocks.VerticalPistons));
+            }
+
+            public void LoadFromStateDTO(StateDTO stateDTO)
+            {
+                this.currentCircle = stateDTO.Circle;
+                this.depth = stateDTO.Depth;
             }
         }

@@ -202,6 +242,17 @@
             private int currentCircle = 0;
             private bool depthReached = true;

+            public StateDTO GetStateDTO(Context context)
+            {
+                return new StateDTO(this.GetType().ToString(), currentCircle, BlockUtils.GetPistonsTotalPosition((context as DrillStation).DrillStationBlocks.VerticalPistons));
+            }
+
+            public void LoadFromStateDTO(StateDTO stateDTO)
+            {
+                currentCircle = stateDTO.Circle;
+                //TODO depth
+            }
+
             public void Handle(Context context)
             {
                 var drillStationBlocks = (context as DrillStation).DrillStationBlocks;
@@ -211,19 +262,10 @@
                 {
                     if (depthReached)
                     {
-                        //move to the start position (pistons at 1m/s rotor at 4 rpm)
-                        if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 4))
+                        //move to the start position (pistons at 1m/s rotor at 1 rpm)
+                        if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, DRILL_RADII[currentCircle], 1, drillStationBlocks.Rotor, 0, 1))
                         {
-                            //if start reached, move to drill radius
-                            if (BlockUtils.MovePistonsToPosition(drillStationBlocks.HorizontalPiston, DRILL_RADII[currentCircle], 1))
-                            {
-                                depthReached = false;
-                            }
-                            else
-                            {
-                                //if not at drill radius, break excecution
-                                return;
-                            }
+                            depthReached = false;
                         }
                         else
                         {
@@ -246,8 +288,8 @@
                     }
                 }
                 else {
-                    //move to the start position (pistons at 1m/s rotor at 4 rpm)
-                    if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 4))
+                    //move to the start position (pistons at 1m/s rotor at 1 rpm)
+                    if (drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 1))
                     {
                         //when done proceed to the next state
                         if (END_FLATTENING)
@@ -273,12 +315,17 @@
         /// </summary>
         class DoneState : State
         {
+            public StateDTO GetStateDTO(Context context)
+            {
+                return new StateDTO(this.GetType().ToString(), -1, -1);
+            }
+
             public void Handle(Context context)
             {
                 var drillStationBlocks = (context as DrillStation).DrillStationBlocks;

-                //move to the start position (pistons at 1m/s rotor at 4 rpm)
-                if (!drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 4))
+                //move to the start position (pistons at 1m/s rotor at 1 rpm)
+                if (!drillStationBlocks.ToPosition(drillStationBlocks.VerticalPistons, 0, 1, drillStationBlocks.HorizontalPiston, 0, 1, drillStationBlocks.Rotor, 0, 1))
                     return;

                 //turn off all panels
@@ -346,6 +393,11 @@
                 }
             }

+            public void LoadFromStateDTO(StateDTO stateDTO)
+            {
+                return;
+            }
+
             public string Status(Context context)
             {
                 return "DONE";
@@ -357,8 +409,109 @@
         /// </summary>
         interface State
         {
+            /// <summary>
+            /// handle the context in order to move to the next state.
+            /// </summary>
+            /// <param name="context"></param>
             void Handle(Context context);
+
+            /// <summary>
+            /// retrieves a friendly status message
+            /// </summary>
+            /// <param name="context"></param>
             string Status(Context context);
+
+            /// <summary>
+            /// gets the stateDTO based on the current variables
+            /// </summary>
+            /// <param name="context"></param>
+            StateDTO GetStateDTO(Context context);
+
+            /// <summary>
+            /// sets the state to a point contained in the DTO
+            /// </summary>
+            /// <param name="stateDTO"></param>
+            void LoadFromStateDTO(StateDTO stateDTO);
+        }
+
+        class StateDTO
+        {
+            public string State { get; private set; }
+            public int Circle { get; private set; }
+            public float Depth { get; private set; }
+
+            public StateDTO(string state, int circle, float depth)
+            {
+                State = state;
+                Circle = circle;
+                Depth = depth;
+            }
+
+            /// <summary>
+            /// builds the DTO info from a string value
+            /// </summary>
+            /// <param name="persistantStorage"></param>
+            public StateDTO(string persistantStorage)
+            {
+                var keyValues = persistantStorage.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
+
+                foreach (var keyValue in keyValues)
+                {
+                    var key = keyValue.Split('=')[0];
+                    var value = keyValue.Split('=')[1];
+
+                    switch (key)
+                    {
+                        case "state":
+                            State = value;
+                            break;
+                        case "circle":
+                            Circle = int.Parse(value);
+                            break;
+                        case "depth":
+                            Depth = float.Parse(value);
+                            break;
+                    }
+                }
+            }
+
+            /// <summary>
+            /// formats the DTO to display as a string, also used in persistant storage
+            /// </summary>
+            /// <returns></returns>
+            public override string ToString()
+            {
+                return string.Format("state={0}\ncircle={1}\ndepth={2}", State, Circle, Depth);
+            }
+
+            /// <summary>
+            /// returns a build state from the DTO
+            /// </summary>
+            /// <returns></returns>
+            public State BuildState()
+            {
+                State targetState;
+
+                switch (State)
+                {
+                    case "FlatteningState":
+                        targetState = new FlatteningState(0);
+                        break;
+                    case "DeepeningState":
+                        targetState = new DeepeningState();
+                        break;
+                    case "DoneState":
+                        targetState = new DoneState();
+                        break;
+                    default:
+                        targetState = new InitState();
+                        break;
+                }
+
+                targetState.LoadFromStateDTO(this);
+
+                return targetState;
+            }
         }

         abstract class Context
@@ -387,61 +540,27 @@
         class DrillStation : Context
         {
             private DrillStationBlocks _drillStationBlocks;
+            public string _storage;

             // Constructor
             public DrillStation(IMyGridTerminalSystem GridTerminalSystem, string storage)
             {
-                //TODO: use persistant storage
-                /*if (storage.Contains("StateName"))
-                {
-                    //get the state from storage
-                    var entries = storage.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
-
-                    entries.ForEach(entry =>
-                    {
-                        if (entry.Contains("StateName"))
-                        {
-                            var stateName = entry.Split('=')[1];
-
-                            Echo(string.Format("Found State {0} persisted in Storage with key 'StateName', using to init", stateName));
-
-                            switch (stateName)
-                            {
-                                case "InitState":
-                                    this.State = new InitState();
-                                    break;
-                                case "InitFlatteningState":
-                                    this.State = new FlatteningState(0);
-                                    break;
-                                case "DeepeningState":
-                                    this.State = new DeepeningState();
-                                    break;
-                                case "EndFlatteningState":
-                                    this.State = new FlatteningState(TARGET_DEPTH);
-                                    break;
-                                case "DoneState":
-                                    this.State = new DoneState();
-                                    break;
-                                default:
-                                    Echo(string.Format("StateName {0} was not recognized as a State, using default InitState", stateName));
-                                    //init is the default state
-                                    this.State = new InitState();
-                                    break;
-                            }
-                        }
-                    });
-                }
-                else
-                {
-                    //init is the default state
-                    State = new InitState();
-                }*/
-
                 //init is the default state
                 State = new InitState();

+                //store the storage
+                this._storage = storage;
+
                 //build the station blocks
                 this._drillStationBlocks = new DrillStationBlocks(GridTerminalSystem);
+            }
+
+            public string PersistantStorage
+            {
+                get
+                {
+                    return _storage;
+                }
             }

             // Gets the DrillStationBlocks
@@ -537,19 +656,16 @@

             public bool ToPosition(List<IMyPistonBase> pistons1, float pistons1position, float speed1, List<IMyPistonBase> pistons2, float pistons2position, float speed2, IMyMotorAdvancedStator rotor, float rotorPosition, float rpm)
             {
-                //move the vPistons to 0 with speed of 1m/s
                 if (!BlockUtils.MovePistonsToPosition(pistons1, pistons1position, speed1))
                 {
                     return false;
                 }

-                //move the hPistons to 0 with speed of 1m/s
                 if (!BlockUtils.MovePistonsToPosition(pistons2, pistons2position, speed2))
                 {
                     return false;
                 }

-                //move the rotor to 0 degree on circles, with 4 RPM
                 if (!BlockUtils.MoveRotorToPosition(rotor, rotorPosition, rpm))
                 {
                     return false;


removed result field

removed result field

--- TreeWriter.cs
+++ TreeWriter.cs
@@ -23,22 +23,27 @@
 		private const string BODY = "body";
 		private const string PARAMETERS = "parameters";

-		private StringBuilder result;
 		private	string input;

 		public TreeWriter(string input)
 		{
-			result = new StringBuilder();
 			this.input = input;
-			CreateResult();
 		}

 		public void Write(string outputFilePath)
 		{
+			StringBuilder result = new StringBuilder();
+			Tree rootTree = CreateResult();
+			rootTree.AppendToBuilder(result);
+
 			File.WriteAllText(outputFilePath, result.ToString());
+
+#if DEBUG
+			Console.WriteLine(result);
+#endif
 		}

-		private void CreateResult()
+		private Tree CreateResult()
 		{
 			SyntaxTree tree = CSharpSyntaxTree.ParseText(input);
 			CompilationUnitSyntax root = tree.GetRoot() as CompilationUnitSyntax;
@@ -46,11 +51,7 @@
 			foreach (SyntaxNode node in root.Members) {
 				CreateTree(node, rootGitTree);
 			}
-			rootGitTree.AppendToBuilder(result);
-
-#if DEBUG
-			Console.WriteLine(result);
-#endif
+			return rootGitTree;
 		}

 		private void CreateTree(SyntaxNode node, Tree currentRoot)


added ws2/com8

added ws2/com8

--- winViz/MainWindow.xaml.cs
+++ winViz/MainWindow.xaml.cs
@@ -158,6 +158,7 @@
             InitializeComponent();

             MachineToLidarPort.Add("WS1", "com6");
+            MachineToLidarPort.Add("WS2", "com8");
             MachineToLidarPort.Add("MSI2", "com3");

             Width = Settings.Default.Width;


Add auto retry feature

Add auto retry feature

--- TwitterApi.cs
+++ TwitterApi.cs
@@ -13,6 +13,9 @@
 {
     internal static class TwitterApi
     {
+        private static bool AutoWaitForBlockList;
+        private static bool AutoWaitForMuteList;
+
         public static TwitterOAuth TwitterOAuth { get; internal set; }

         public static TwitterOAuth Login(IniSettings setting)
@@ -194,18 +197,21 @@
                     string response = reader.ReadToEnd();
                     Console.WriteLine(response);

-                    if (Regex.IsMatch(response, @"(?i)""code""\s*:\s*88"))
+                    if (!Regex.IsMatch(response, @"(?i)""code""\s*:\s*88")) return json.ToString();
+                    if (!AutoWaitForBlockList)
                     {
-                        Console.Write("Do you want retry get block list after 15min? (Y/N)");
+                        Console.Write("Do you want retry get block list after 15min? (Yes/No/Auto)");
                         string readLine = Console.ReadLine();
-                        if ((readLine != null) && readLine.ToUpper().Trim().Equals("N"))
+                        if ((readLine != null) && readLine.ToUpper().Trim().StartsWith("N"))
                             return json.ToString();
-
-                        Console.WriteLine("Wait for 15min... The job will be resumed at : " +
-                                          DateTime.Now.AddMinutes(15).ToString("hh:mm:ss"));
-                        Thread.Sleep(15 * 60 * 1000);
-                        return getMyBlockList(cursor);
+                        if ((readLine != null) && readLine.ToUpper().Trim().StartsWith("A"))
+                            AutoWaitForBlockList = true;
                     }
+
+                    Console.WriteLine("Wait for 15min... The job will be resumed at : " +
+                                      DateTime.Now.AddMinutes(15).ToString("hh:mm:ss"));
+                    Thread.Sleep(15 * 60 * 1000);
+                    return getMyBlockList(cursor);
                 }
             }

@@ -234,18 +240,21 @@
                     string response = reader.ReadToEnd();
                     Console.WriteLine(response);

-                    if (Regex.IsMatch(response, @"(?i)""code""\s*:\s*88"))
+                    if (!Regex.IsMatch(response, @"(?i)""code""\s*:\s*88")) return json.ToString();
+                    if (!AutoWaitForMuteList)
                     {
-                        Console.Write("Do you want retry get mute list after 15min? (Y/N)");
+                        Console.Write("Do you want retry get mute list after 15min? (Yes/No/Auto)");
                         string readLine = Console.ReadLine();
-                        if ((readLine != null) && readLine.ToUpper().Trim().Equals("N"))
+                        if ((readLine != null) && readLine.ToUpper().Trim().StartsWith("N"))
                             return json.ToString();
-
-                        Console.WriteLine("Wait for 15min... The job will be resumed at : " +
-                                          DateTime.Now.AddMinutes(15).ToString("hh:mm:ss"));
-                        Thread.Sleep(15 * 60 * 1000);
-                        return getMyBlockList(cursor);
+                        if ((readLine != null) && readLine.ToUpper().Trim().StartsWith("A"))
+                            AutoWaitForMuteList = true;
                     }
+
+                    Console.WriteLine("Wait for 15min... The job will be resumed at : " +
+                                      DateTime.Now.AddMinutes(15).ToString("hh:mm:ss"));
+                    Thread.Sleep(15 * 60 * 1000);
+                    return getMyBlockList(cursor);
                 }
             }


Fixed the previous patch, sorry minor error

git-svn-id: bab0c2de90ee11a20376049c2cdee62584491f34@3275 73e77b4c-caa6-f847-a29a-24ab75ae54b6

--- MonoRail/Castle.MonoRail.Framework/Helpers/AjaxHelper.cs
+++ MonoRail/Castle.MonoRail.Framework/Helpers/AjaxHelper.cs
@@ -319,7 +319,7 @@
 		/// <returns></returns>
 		public String LinkToFunction(String innerContent, String functionCodeOrName)
 		{
-			return LinkToFunction(innerContent, functionCodeOrName, null, null);
+			return LinkToFunction(innerContent, functionCodeOrName, new Hashtable());
 		}

 		/// <summary>
@@ -424,11 +424,11 @@
 		/// Usually, the result would be a partial prepared by the controller
 		/// </summary>
 		/// <param name="innerContent">Link content</param>
+		/// <param name="confirm">the confirm question</param>
 		/// <param name="url">Target url</param>
-		/// <param name="confirm">the confirm question</param>
 		/// <param name="options">the options for the Ajax invocation</param>
 		/// <returns>The handcrafted element</returns>
-		public String LinkToRemote(String innerContent, String url, String confirm, IDictionary options)
+		public String LinkToRemote(String innerContent, String confirm, String url, IDictionary options)
 		{
 			return LinkToFunction(innerContent, BuildRemoteFunction(url, options), confirm, null);
 		}