Update ProductDecorator.cs

Update ProductDecorator.cs

part 2 of the color update

--- Shop/Decorator/Product/ProductDecorator.cs
+++ Shop/Decorator/Product/ProductDecorator.cs
@@ -85,7 +85,7 @@
 		public GameObject Decorate(Dictionary<string, object> options, AssetBundle assetBundle)
 		{
 			var asset = UnityEngine.Object.Instantiate(assetBundle.LoadAsset((string)options["model"])) as GameObject;
-
+			(new ColorDecorator()).Decorate(asset.gameObject, options, assetBundle);
 			asset.gameObject.SetActive (false);
 			this.Decorate (asset,options, assetBundle);
 			AssetManager.Instance.registerObject (asset.gameObject.GetComponent<Product> ());


fix MetadataVisitor

fix MetadataVisitor

--- Signum.Engine/Linq/Meta/MetadataVisitor.cs
+++ Signum.Engine/Linq/Meta/MetadataVisitor.cs
@@ -169,7 +169,7 @@
                 }
             }

-            if (m.Method.DeclaringType == typeof(LinqHints))
+            if (m.Method.DeclaringType == typeof(LinqHints) || m.Method.DeclaringType == typeof(LinqHintEntities))
                 return Visit(m.Arguments[0]);

             if (m.Method.DeclaringType == typeof(Lite) && m.Method.Name == "ToLite")


Move firstRow designation from subgroup to group

- Issue MatterHackers/MCCentral#3127
Missing slice setting row borders after first/last row modifications

--- SlicerConfiguration/SliceSettingsWidget.cs
+++ SlicerConfiguration/SliceSettingsWidget.cs
@@ -448,9 +448,11 @@

 			var sectionWidget = new SectionWidget(group.Name.Localize(), groupPanel, theme, serializationKey: userSettingsKey).ApplyBoxStyle();

+			bool firstRow = true;
+
 			foreach (var subGroup in group.SubGroups)
 			{
-				var subGroupPanel = this.AddSettingRowsForSubgroup(subGroup);
+				var subGroupPanel = this.AddSettingRowsForSubgroup(subGroup, ref firstRow);
 				if (subGroupPanel != null)
 				{
 					groupPanel.AddChild(subGroupPanel);
@@ -460,7 +462,7 @@
 			return sectionWidget;
 		}

-		private GuiWidget AddSettingRowsForSubgroup(SettingsOrganizer.SubGroup subGroup)
+		private GuiWidget AddSettingRowsForSubgroup(SettingsOrganizer.SubGroup subGroup, ref bool firstRow)
 		{
 			var topToBottomSettings = new FlowLayoutWidget(FlowDirection.TopToBottom)
 			{
@@ -468,7 +470,6 @@
 			};

 			GuiWidget settingsRow = null;
-			bool firstRow = true;

 			foreach (SliceSettingData settingData in subGroup.Settings)
 			{


Refs #95.  Tabs voor indentatie.

Refs #95.  Tabs voor indentatie.

git-svn-id: 0ffdc289f568b1e7493e560395a00d06174c8a92@932 99b415e2-69d1-4072-8d93-0ed3a15484ab

--- Solution/Chiro.Gap.Workers/LedenManager.cs
+++ Solution/Chiro.Gap.Workers/LedenManager.cs
@@ -17,350 +17,350 @@

 namespace Chiro.Gap.Workers
 {
-    /// <summary>
-    /// Worker die alle businesslogica i.v.m. leden bevat
-    /// </summary>
-    public class LedenManager
-    {
-        private LedenDaoCollectie _daos;
-        private IAutorisatieManager _autorisatieMgr;
-
-        /// <summary>
-        /// Maakt een nieuwe ledenmanager aan
-        /// </summary>
-        /// <param name="daos">Een hele reeks van IDao-objecten, nodig
-        /// voor data access.</param>
-        /// <param name="autorisatie">Een IAuthorisatieManager, die
-        /// de GAV-permissies van de huidige user controleert.</param>
-        public LedenManager(LedenDaoCollectie daos, IAutorisatieManager autorisatie)
-        {
-            _daos = daos;
-            _autorisatieMgr = autorisatie;
-        }
-
-        /// <summary>
-        /// Doet de basic aanpassingen aan het lidobject (alle andere zijn specifiek voor kind of leiding).
-        /// </summary>
-        /// <param name="lid"></param>
-        /// <param name="gp"></param>
-        /// <param name="gwj"></param>
-        private void LidMaken(Lid lid, GelieerdePersoon gp, GroepsWerkJaar gwj)
-        {
-            // GroepsWerkJaar en GelieerdePersoon invullen
-            lid.GroepsWerkJaar = gwj;
-            lid.GelieerdePersoon = gp;
-            gp.Lid.Add(lid);
-            gwj.Lid.Add(lid);
-        }
-
-        /// <summary>
-        /// Doet alle nodige checks om na te kijken dat de gegeven gelieerde persoon lid gemaakt kan worden in het
-        /// gegeven groepswerkjaar. In dat geval wordt er true teruggeven
-        /// </summary>
-        /// <param name="gp">De gelieerde persoon die je lid wilt maken</param>
-        /// <param name="gwj">Het groepswerkjaar waarin je die persoon lid wilt maken</param>
-        /// <param name="gpMetDetails">De gelieerde persoon aangevuld met details</param>
-        /// <returns><c>True</c> als de persoon lid kan worden</returns>
-        private bool kanLidMaken(GelieerdePersoon gp, GroepsWerkJaar gwj, out GelieerdePersoon gpMetDetails)
-        {
-            if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
-            }
-            if (!_autorisatieMgr.IsGavGroepsWerkJaar(gwj.ID))
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavGroepsWerkJaar);
-            }
-
-            // De persoonsgegevens zijn nodig om de afdeling te bepalen.  Haal ze op als ze ontbreken.
-            gpMetDetails = gp;
-            if (gp.Persoon == null)
-            {
-                GelieerdePersonenManager gpm = Factory.Maak<GelieerdePersonenManager>();
-                gpMetDetails = gpm.DetailsOphalen(gp.ID);
-            }
-
-            // CONTROLES
-            // Lid bestaat al
-            var x = (from l in gpMetDetails.Lid
-                     where l.GroepsWerkJaar.ID == gwj.ID
-                     select l).FirstOrDefault();
-
-            if (x != null) // was dus al lid
-            {
-                throw new BestaatAlException();
-            }
-
-            // Er zijn afdelingen
-            if (gwj.AfdelingsJaar.Count == 0)
-            {
-                throw new OngeldigeActieException("Je kan geen lid maken als de groep geen afdelingen heeft in het huidige werkjaar!");
-            }
-
-            return true;
-        }
-
-        /// <summary>
-        /// Maakt gelieerde persoon een kind (lid) voor het recentste werkjaar
-        /// </summary>
-        /// <param name="gp">Gelieerde persoon</param>
-        /// <returns>Nieuw kindobject, niet gepersisteerd</returns>
-        public Kind KindMaken(GelieerdePersoon gp)
-        {
-            if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
-            }
-
-            if (gp.Groep == null)
-            {
-                _daos.GelieerdePersoonDao.GroepLaden(gp);
-            }
-
-            // Door het groepswerkjaar van de persoon op te halen is de link tussen groepswerkjaar en persoon zeker in orde
-            GroepsWerkJaar gwj = _daos.GroepenDao.RecentsteGroepsWerkJaarGet(gp.Groep.ID);
-
-            return KindMaken(gp, gwj);
-        }
-
-        /// <summary>
-        /// Maakt gelieerde persoon een kind (lid) voor het gegeven werkjaar
-        /// </summary>
-        /// <param name="gp">Gelieerde persoon, gekoppeld aan groep</param>
-        /// <param name="gwj">Groepswerkjaar waarin lid te maken</param>
-        /// <returns>Nieuw kindobject, niet gepersisteerd</returns>
-        /// <remarks>De user zal nooit zelf mogen kiezen in welk groepswerkjaar een kind lid wordt.  Maar
-        /// om testdata voor unit tests op te bouwen, hebben we deze functionaliteit wel nodig.
-        /// </remarks>
-        public Kind KindMaken(GelieerdePersoon gp, GroepsWerkJaar gwj)
-        {
-            if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
-            }
-
-            GroepenManager gm = Factory.Maak<GroepenManager>();
-
-            GelieerdePersoon gpMetDetails;
-            if (!kanLidMaken(gp, gwj, out gpMetDetails))
-            {
-                throw new OngeldigeActieException("De gegeven persoon kan geen lid worden in het huidige werkjaar.");
-            }
-
-            // Geboortedatum is verplicht als je lid wilt worden
-            if (gpMetDetails.Persoon.GeboorteDatum == null)
-            {
-                throw new OngeldigeActieException("Je kan geen lid maken als je de geboortedatum van de persoon niet hebt ingegeven");
-            }
-
-            // Afdeling automatisch bepalen
-            int geboortejaar = gpMetDetails.Persoon.GeboorteDatum.Value.Year;
-            geboortejaar += gpMetDetails.ChiroLeefTijd;	 // aanpassen aan Chiroleeftijd
-
-            int leeftijd = DateTime.Today.Year - gpMetDetails.Persoon.GeboorteDatum.Value.Year;
-            if (leeftijd < 6)
-            {
-                throw new OngeldigeActieException("Deze persoon is te jong om lid te zijn in de chiro.");
-            }
-            if (leeftijd > 20)
-            {
-                throw new OngeldigeActieException("Is deze persoon niet te oud om in de chiro te komen?");
-            }
-            int aangepasteleeftijd = DateTime.Today.Year - geboortejaar;
-            if (aangepasteleeftijd < 6 || aangepasteleeftijd > 18)
-            {
-                throw new OngeldigeActieException("De afdelingen lopen maar van 6 tot 18 jaar.");
-            }
-
-            // Relevante afdelingsjaren opzoeken
-            List<AfdelingsJaar> afdelingsjaren =
-                    (from a in gwj.AfdelingsJaar
-                     where a.GeboorteJaarVan <= geboortejaar && geboortejaar <= a.GeboorteJaarTot
-                     select a).ToList();
-
-            if (afdelingsjaren.Count == 0)
-            {
-                throw new OngeldigeActieException("Er is geen afdeling in jullie groep voor die leeftijd. Je maakt er best eerst een aan (of controleert de leeftijd van het kind).");
-            }
-
-            AfdelingsJaar aj = null;
-            if (afdelingsjaren.Count > 1)
-            {
-                aj = (from a in afdelingsjaren
-                      where a.Geslacht == gpMetDetails.Persoon.Geslacht || a.Geslacht == GeslachtsType.Gemengd
-                      select a).FirstOrDefault();
-            }
-            if (aj == null)
-            {
-                aj = afdelingsjaren.First();
-            }
-
-            Kind kind = new Kind();
-            kind.AfdelingsJaar = aj;
-            aj.Kind.Add(kind);
-            kind.EindeInstapPeriode = DateTime.Today.AddDays(int.Parse(Properties.Resources.InstapPeriode));
-
-            LidMaken(kind, gpMetDetails, gwj);
-
-            return kind;
-        }
-
-        /// <summary>
-        /// Maakt de gelieerdepersoon leiding in het huidige werkjaar.
-        /// </summary>
-        /// <param name="gp">De gelieerde persoon die je leiding wilt maken</param>
-        /// <returns>Het leidingsobject van de gelieerde persoon die leiding geworden is</returns>
-        public Leiding LeidingMaken(GelieerdePersoon gp)
-        {
-            if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
-            }
-
-            GroepsWerkJaarManager mgr = Factory.Maak<GroepsWerkJaarManager>();
-
-            if (gp.Groep == null)
-            {
-                _daos.GelieerdePersoonDao.GroepLaden(gp);
-            }
-
-            GroepsWerkJaar gwj = _daos.GroepenDao.RecentsteGroepsWerkJaarGet(gp.Groep.ID);
-
-            GelieerdePersoon gpMetDetails;
-            if (!kanLidMaken(gp, gwj, out gpMetDetails))
-            {
-                throw new OngeldigeActieException("De gegeven persoon kan geen lid worden in het huidige werkjaar.");
-            }
-
-            Leiding leiding = new Leiding();
-
-            LidMaken(leiding, gpMetDetails, gwj);
-            return leiding;
-        }
-
-        /// <summary>
-        /// Verwijdert lid uit database
-        /// Dit kan enkel als het een lid uit het huidige werkjaar is en als de instapperiode niet verstreken is voor een kind
-        /// Leiding kan niet verwijderd worden.
-        /// </summary>
-        /// <param name="id">ID van het lid dat verwijderd moet worden</param>
-        /// <returns><c>True</c> on successful</returns>
-        public Boolean LidVerwijderen(int id)
-        {
-            if (!_autorisatieMgr.IsGavLid(id))
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavLid);
-            }
-
-            Lid lid = _daos.LedenDao.OphalenMetDetails(id);
-
-            // checks:
-            if (lid is Leiding)
-            {
-                throw new OngeldigeActieException("Leiding kan niet meer verwijderd worden.");
-            }
-            if (lid.GroepsWerkJaar != _daos.GroepenDao.RecentsteGroepsWerkJaarGet(lid.GroepsWerkJaar.Groep.ID))
-            {
-                throw new OngeldigeActieException("Een lid verwijderen mag enkel als het een lid uit het huidige werkjaar is.");
-            }
-            if (lid is Kind && DateTime.Compare(((Kind)lid).EindeInstapPeriode.Value, DateTime.Today) < 0)
-            {
-                throw new OngeldigeActieException("Een kind verwijderen kan niet meer nadat de instapperiode verstreken is.");
-            }
-
-            lid.TeVerwijderen = true;
-
-            Debug.Assert(lid is Kind || lid is Leiding, "Lid moet ofwel Kind ofwel Leiding zijn!");
-
-            // voor een Kind is _dao.Bewaren(lid) voldoende
-            if (lid is Kind)
-            {
-                _daos.LedenDao.Bewaren(lid);
-            }
-            return true;
-        }
-
-        /// <summary>
-        /// Haal een pagina op met leden van een groepswerkjaar.
-        /// </summary>
-        /// <param name="groepsWerkJaarID">ID van het groepswerkjaar</param>
-        /// <param name="paginas">Totaal aantal groepswerkjaren van de groep</param>
-        /// <returns>Lijst met alle leden uit het gevraagde groepswerkjaar.</returns>
-        public IList<Lid> PaginaOphalen(int groepsWerkJaarID, out int paginas)
-        {
-            if (_autorisatieMgr.IsGavGroepsWerkJaar(groepsWerkJaarID))
-            {
-                GroepsWerkJaar gwj = _daos.GroepsWerkJaarDao.Ophalen(groepsWerkJaarID, grwj => grwj.Groep);
-                paginas = _daos.GroepenDao.OphalenMetGroepsWerkJaren(gwj.Groep.ID).GroepsWerkJaar.Count;
-                IList<Lid> list = _daos.LedenDao.AllesOphalen(groepsWerkJaarID);
-                list = list.OrderBy(e => e.GelieerdePersoon.Persoon.Naam).ThenBy(e => e.GelieerdePersoon.Persoon.VoorNaam).ToList();
-                return list;
-            }
-            else
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavGroepsWerkJaar);
-            }
-        }
-
-        /// <summary>
-        /// Haalt een 'pagina' op met leden uit een bepaald GroepsWerkJaar
-        /// </summary>
-        /// <param name="groepsWerkJaarID">ID gevraagde GroepsWerkJaar</param>
-        /// <param name="afdelingsID">ID gevraagde afdeling</param>
-        /// <param name="paginas">De 'pagina' met leden uit een bepaald GroepsWerkJaar</param>
-        /// <returns>De 'pagina' (collectie) met leden</returns>
-        public IList<Lid> PaginaOphalenVolgensAfdeling(int groepsWerkJaarID, int afdelingsID, out int paginas)
-        {
-            GroepsWerkJaar gwj = _daos.GroepsWerkJaarDao.Ophalen(groepsWerkJaarID, grwj => grwj.Groep);
-            paginas = _daos.GroepenDao.OphalenMetGroepsWerkJaren(gwj.Groep.ID).GroepsWerkJaar.Count;
-            if (_autorisatieMgr.IsGavGroepsWerkJaar(groepsWerkJaarID))
-            {
-                return _daos.LedenDao.PaginaOphalenVolgensAfdeling(groepsWerkJaarID, afdelingsID);
-            }
-            else
-            {
-                throw new GeenGavException("Dit GroepsWerkJaar hoort niet bij je groep(en).");
-            }
-        }
-
-        public Lid LidBewaren(Lid lid)
-        {
-            if (_autorisatieMgr.IsGavLid(lid.ID))
-            {
-                Debug.Assert(lid is Kind || lid is Leiding, "Lid moet ofwel Kind ofwel Leiding zijn!");
-                if (lid is Kind)
-                {
-                    return _daos.KindDao.Bewaren((Kind)lid);
-                }
-                else if (lid is Leiding)
-                {
-                    return _daos.LeidingDao.Bewaren((Leiding)lid);
-                }
-                // Hier mag de code nooit komen (zie assert)
-                return null;
-            }
-            else
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavLid);
-            }
-        }
-
-        /// <summary>
-        /// Haalt lid op met afdelingsjaren, afdelingen en gelieerdepersoon
-        /// </summary>
-        /// <param name="lidID">ID gevraagde lid</param>
-        /// <returns>Lid met afdelingsjaren, afdelingen en gelieerdepersoon.</returns>
-        public Lid OphalenMetAfdelingen(int lidID)
-        {
-            if (_autorisatieMgr.IsGavLid(lidID))
-            {
-                return _daos.LedenDao.OphalenMetDetails(lidID);
-            }
-            else
-            {
-                throw new GeenGavException(Properties.Resources.GeenGavLid);
-            }
-        }
+	/// <summary>
+	/// Worker die alle businesslogica i.v.m. leden bevat
+	/// </summary>
+	public class LedenManager
+	{
+		private LedenDaoCollectie _daos;
+		private IAutorisatieManager _autorisatieMgr;
+
+		/// <summary>
+		/// Maakt een nieuwe ledenmanager aan
+		/// </summary>
+		/// <param name="daos">Een hele reeks van IDao-objecten, nodig
+		/// voor data access.</param>
+		/// <param name="autorisatie">Een IAuthorisatieManager, die
+		/// de GAV-permissies van de huidige user controleert.</param>
+		public LedenManager(LedenDaoCollectie daos, IAutorisatieManager autorisatie)
+		{
+			_daos = daos;
+			_autorisatieMgr = autorisatie;
+		}
+
+		/// <summary>
+		/// Doet de basic aanpassingen aan het lidobject (alle andere zijn specifiek voor kind of leiding).
+		/// </summary>
+		/// <param name="lid"></param>
+		/// <param name="gp"></param>
+		/// <param name="gwj"></param>
+		private void LidMaken(Lid lid, GelieerdePersoon gp, GroepsWerkJaar gwj)
+		{
+			// GroepsWerkJaar en GelieerdePersoon invullen
+			lid.GroepsWerkJaar = gwj;
+			lid.GelieerdePersoon = gp;
+			gp.Lid.Add(lid);
+			gwj.Lid.Add(lid);
+		}
+
+		/// <summary>
+		/// Doet alle nodige checks om na te kijken dat de gegeven gelieerde persoon lid gemaakt kan worden in het
+		/// gegeven groepswerkjaar. In dat geval wordt er true teruggeven
+		/// </summary>
+		/// <param name="gp">De gelieerde persoon die je lid wilt maken</param>
+		/// <param name="gwj">Het groepswerkjaar waarin je die persoon lid wilt maken</param>
+		/// <param name="gpMetDetails">De gelieerde persoon aangevuld met details</param>
+		/// <returns><c>True</c> als de persoon lid kan worden</returns>
+		private bool kanLidMaken(GelieerdePersoon gp, GroepsWerkJaar gwj, out GelieerdePersoon gpMetDetails)
+		{
+			if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
+			}
+			if (!_autorisatieMgr.IsGavGroepsWerkJaar(gwj.ID))
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavGroepsWerkJaar);
+			}
+
+			// De persoonsgegevens zijn nodig om de afdeling te bepalen.  Haal ze op als ze ontbreken.
+			gpMetDetails = gp;
+			if (gp.Persoon == null)
+			{
+				GelieerdePersonenManager gpm = Factory.Maak<GelieerdePersonenManager>();
+				gpMetDetails = gpm.DetailsOphalen(gp.ID);
+			}
+
+			// CONTROLES
+			// Lid bestaat al
+			var x = (from l in gpMetDetails.Lid
+				 where l.GroepsWerkJaar.ID == gwj.ID
+				 select l).FirstOrDefault();
+
+			if (x != null) // was dus al lid
+			{
+				throw new BestaatAlException();
+			}
+
+			// Er zijn afdelingen
+			if (gwj.AfdelingsJaar.Count == 0)
+			{
+				throw new OngeldigeActieException("Je kan geen lid maken als de groep geen afdelingen heeft in het huidige werkjaar!");
+			}
+
+			return true;
+		}
+
+		/// <summary>
+		/// Maakt gelieerde persoon een kind (lid) voor het recentste werkjaar
+		/// </summary>
+		/// <param name="gp">Gelieerde persoon</param>
+		/// <returns>Nieuw kindobject, niet gepersisteerd</returns>
+		public Kind KindMaken(GelieerdePersoon gp)
+		{
+			if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
+			}
+
+			if (gp.Groep == null)
+			{
+				_daos.GelieerdePersoonDao.GroepLaden(gp);
+			}
+
+			// Door het groepswerkjaar van de persoon op te halen is de link tussen groepswerkjaar en persoon zeker in orde
+			GroepsWerkJaar gwj = _daos.GroepenDao.RecentsteGroepsWerkJaarGet(gp.Groep.ID);
+
+			return KindMaken(gp, gwj);
+		}
+
+		/// <summary>
+		/// Maakt gelieerde persoon een kind (lid) voor het gegeven werkjaar
+		/// </summary>
+		/// <param name="gp">Gelieerde persoon, gekoppeld aan groep</param>
+		/// <param name="gwj">Groepswerkjaar waarin lid te maken</param>
+		/// <returns>Nieuw kindobject, niet gepersisteerd</returns>
+		/// <remarks>De user zal nooit zelf mogen kiezen in welk groepswerkjaar een kind lid wordt.  Maar
+		/// om testdata voor unit tests op te bouwen, hebben we deze functionaliteit wel nodig.
+		/// </remarks>
+		public Kind KindMaken(GelieerdePersoon gp, GroepsWerkJaar gwj)
+		{
+			if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
+			}
+
+			GroepenManager gm = Factory.Maak<GroepenManager>();
+
+			GelieerdePersoon gpMetDetails;
+			if (!kanLidMaken(gp, gwj, out gpMetDetails))
+			{
+				throw new OngeldigeActieException("De gegeven persoon kan geen lid worden in het huidige werkjaar.");
+			}
+
+			// Geboortedatum is verplicht als je lid wilt worden
+			if (gpMetDetails.Persoon.GeboorteDatum == null)
+			{
+				throw new OngeldigeActieException("Je kan geen lid maken als je de geboortedatum van de persoon niet hebt ingegeven");
+			}
+
+			// Afdeling automatisch bepalen
+			int geboortejaar = gpMetDetails.Persoon.GeboorteDatum.Value.Year;
+			geboortejaar += gpMetDetails.ChiroLeefTijd;	 // aanpassen aan Chiroleeftijd
+
+			int leeftijd = DateTime.Today.Year - gpMetDetails.Persoon.GeboorteDatum.Value.Year;
+			if (leeftijd < 6)
+			{
+				throw new OngeldigeActieException("Deze persoon is te jong om lid te zijn in de chiro.");
+			}
+			if (leeftijd > 20)
+			{
+				throw new OngeldigeActieException("Is deze persoon niet te oud om in de chiro te komen?");
+			}
+			int aangepasteleeftijd = DateTime.Today.Year - geboortejaar;
+			if (aangepasteleeftijd < 6 || aangepasteleeftijd > 18)
+			{
+				throw new OngeldigeActieException("De afdelingen lopen maar van 6 tot 18 jaar.");
+			}
+
+			// Relevante afdelingsjaren opzoeken
+			List<AfdelingsJaar> afdelingsjaren =
+				(from a in gwj.AfdelingsJaar
+				 where a.GeboorteJaarVan <= geboortejaar && geboortejaar <= a.GeboorteJaarTot
+				 select a).ToList();
+
+			if (afdelingsjaren.Count == 0)
+			{
+				throw new OngeldigeActieException("Er is geen afdeling in jullie groep voor die leeftijd. Je maakt er best eerst een aan (of controleert de leeftijd van het kind).");
+			}
+
+			AfdelingsJaar aj = null;
+			if (afdelingsjaren.Count > 1)
+			{
+				aj = (from a in afdelingsjaren
+				      where a.Geslacht == gpMetDetails.Persoon.Geslacht || a.Geslacht == GeslachtsType.Gemengd
+				      select a).FirstOrDefault();
+			}
+			if (aj == null)
+			{
+				aj = afdelingsjaren.First();
+			}
+
+			Kind kind = new Kind();
+			kind.AfdelingsJaar = aj;
+			aj.Kind.Add(kind);
+			kind.EindeInstapPeriode = DateTime.Today.AddDays(int.Parse(Properties.Resources.InstapPeriode));
+
+			LidMaken(kind, gpMetDetails, gwj);
+
+			return kind;
+		}
+
+		/// <summary>
+		/// Maakt de gelieerdepersoon leiding in het huidige werkjaar.
+		/// </summary>
+		/// <param name="gp">De gelieerde persoon die je leiding wilt maken</param>
+		/// <returns>Het leidingsobject van de gelieerde persoon die leiding geworden is</returns>
+		public Leiding LeidingMaken(GelieerdePersoon gp)
+		{
+			if (!_autorisatieMgr.IsGavGelieerdePersoon(gp.ID))
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavGelieerdePersoon);
+			}
+
+			GroepsWerkJaarManager mgr = Factory.Maak<GroepsWerkJaarManager>();
+
+			if (gp.Groep == null)
+			{
+				_daos.GelieerdePersoonDao.GroepLaden(gp);
+			}
+
+			GroepsWerkJaar gwj = _daos.GroepenDao.RecentsteGroepsWerkJaarGet(gp.Groep.ID);
+
+			GelieerdePersoon gpMetDetails;
+			if (!kanLidMaken(gp, gwj, out gpMetDetails))
+			{
+				throw new OngeldigeActieException("De gegeven persoon kan geen lid worden in het huidige werkjaar.");
+			}
+
+			Leiding leiding = new Leiding();
+
+			LidMaken(leiding, gpMetDetails, gwj);
+			return leiding;
+		}
+
+		/// <summary>
+		/// Verwijdert lid uit database
+		/// Dit kan enkel als het een lid uit het huidige werkjaar is en als de instapperiode niet verstreken is voor een kind
+		/// Leiding kan niet verwijderd worden.
+		/// </summary>
+		/// <param name="id">ID van het lid dat verwijderd moet worden</param>
+		/// <returns><c>True</c> on successful</returns>
+		public Boolean LidVerwijderen(int id)
+		{
+			if (!_autorisatieMgr.IsGavLid(id))
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavLid);
+			}
+
+			Lid lid = _daos.LedenDao.OphalenMetDetails(id);
+
+			// checks:
+			if (lid is Leiding)
+			{
+				throw new OngeldigeActieException("Leiding kan niet meer verwijderd worden.");
+			}
+			if (lid.GroepsWerkJaar != _daos.GroepenDao.RecentsteGroepsWerkJaarGet(lid.GroepsWerkJaar.Groep.ID))
+			{
+				throw new OngeldigeActieException("Een lid verwijderen mag enkel als het een lid uit het huidige werkjaar is.");
+			}
+			if (lid is Kind && DateTime.Compare(((Kind)lid).EindeInstapPeriode.Value, DateTime.Today) < 0)
+			{
+				throw new OngeldigeActieException("Een kind verwijderen kan niet meer nadat de instapperiode verstreken is.");
+			}
+
+			lid.TeVerwijderen = true;
+
+			Debug.Assert(lid is Kind || lid is Leiding, "Lid moet ofwel Kind ofwel Leiding zijn!");
+
+			// voor een Kind is _dao.Bewaren(lid) voldoende
+			if (lid is Kind)
+			{
+				_daos.LedenDao.Bewaren(lid);
+			}
+			return true;
+		}
+
+		/// <summary>
+		/// Haal een pagina op met leden van een groepswerkjaar.
+		/// </summary>
+		/// <param name="groepsWerkJaarID">ID van het groepswerkjaar</param>
+		/// <param name="paginas">Totaal aantal groepswerkjaren van de groep</param>
+		/// <returns>Lijst met alle leden uit het gevraagde groepswerkjaar.</returns>
+		public IList<Lid> PaginaOphalen(int groepsWerkJaarID, out int paginas)
+		{
+			if (_autorisatieMgr.IsGavGroepsWerkJaar(groepsWerkJaarID))
+			{
+				GroepsWerkJaar gwj = _daos.GroepsWerkJaarDao.Ophalen(groepsWerkJaarID, grwj => grwj.Groep);
+				paginas = _daos.GroepenDao.OphalenMetGroepsWerkJaren(gwj.Groep.ID).GroepsWerkJaar.Count;
+				IList<Lid> list = _daos.LedenDao.AllesOphalen(groepsWerkJaarID);
+				list = list.OrderBy(e => e.GelieerdePersoon.Persoon.Naam).ThenBy(e => e.GelieerdePersoon.Persoon.VoorNaam).ToList();
+				return list;
+			}
+			else
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavGroepsWerkJaar);
+			}
+		}
+
+		/// <summary>
+		/// Haalt een 'pagina' op met leden uit een bepaald GroepsWerkJaar
+		/// </summary>
+		/// <param name="groepsWerkJaarID">ID gevraagde GroepsWerkJaar</param>
+		/// <param name="afdelingsID">ID gevraagde afdeling</param>
+		/// <param name="paginas">De 'pagina' met leden uit een bepaald GroepsWerkJaar</param>
+		/// <returns>De 'pagina' (collectie) met leden</returns>
+		public IList<Lid> PaginaOphalenVolgensAfdeling(int groepsWerkJaarID, int afdelingsID, out int paginas)
+		{
+			GroepsWerkJaar gwj = _daos.GroepsWerkJaarDao.Ophalen(groepsWerkJaarID, grwj => grwj.Groep);
+			paginas = _daos.GroepenDao.OphalenMetGroepsWerkJaren(gwj.Groep.ID).GroepsWerkJaar.Count;
+			if (_autorisatieMgr.IsGavGroepsWerkJaar(groepsWerkJaarID))
+			{
+				return _daos.LedenDao.PaginaOphalenVolgensAfdeling(groepsWerkJaarID, afdelingsID);
+			}
+			else
+			{
+				throw new GeenGavException("Dit GroepsWerkJaar hoort niet bij je groep(en).");
+			}
+		}
+
+		public Lid LidBewaren(Lid lid)
+		{
+			if (_autorisatieMgr.IsGavLid(lid.ID))
+			{
+				Debug.Assert(lid is Kind || lid is Leiding, "Lid moet ofwel Kind ofwel Leiding zijn!");
+				if (lid is Kind)
+				{
+					return _daos.KindDao.Bewaren((Kind)lid);
+				}
+				else if (lid is Leiding)
+				{
+					return _daos.LeidingDao.Bewaren((Leiding)lid);
+				}
+				// Hier mag de code nooit komen (zie assert)
+				return null;
+			}
+			else
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavLid);
+			}
+		}
+
+		/// <summary>
+		/// Haalt lid op met afdelingsjaren, afdelingen en gelieerdepersoon
+		/// </summary>
+		/// <param name="lidID">ID gevraagde lid</param>
+		/// <returns>Lid met afdelingsjaren, afdelingen en gelieerdepersoon.</returns>
+		public Lid OphalenMetAfdelingen(int lidID)
+		{
+			if (_autorisatieMgr.IsGavLid(lidID))
+			{
+				return _daos.LedenDao.OphalenMetDetails(lidID);
+			}
+			else
+			{
+				throw new GeenGavException(Properties.Resources.GeenGavLid);
+			}
+		}

 		/// <summary>
 		/// De afdelingen van het gegeven lid worden aangepast van whatever momenteel zijn afdelingen zijn naar
@@ -381,66 +381,66 @@
 					throw new OngeldigeActieException("Een kind moet in exact 1 afdeling zitten.");
 				}

-                if (kind.AfdelingsJaar.Afdeling.ID != afdelingsIDs[0]) // anders verandert er niets
-                {
-                    // Verwijder het kind uit zijn huidige afdelingsjaar
-                    kind.AfdelingsJaar.TeVerwijderen = true;
-
-                    AfdelingsJaar ajnieuw = kind.GroepsWerkJaar.AfdelingsJaar.FirstOrDefault(e => e.Afdeling.ID == afdelingsIDs[0]);
-                    if (ajnieuw == null)
-                    {
-                        throw new OngeldigeActieException("De gekozen afdeling is geen afdeling van de groep in het gekozen werkjaar.");
-                    }
-                    ajnieuw.Kind.Add(kind);
-
-                    // Pas Chiroleeftijd aan als het kind buiten het veld van de nieuwe afdeling valt
-                    if (kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year + kind.GelieerdePersoon.ChiroLeefTijd < ajnieuw.GeboorteJaarVan)
-                    {
-                        kind.GelieerdePersoon.ChiroLeefTijd = ajnieuw.GeboorteJaarVan - kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year;
-                    }
-                    else if (kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year + kind.GelieerdePersoon.ChiroLeefTijd > ajnieuw.GeboorteJaarTot)
-                    {
-                        kind.GelieerdePersoon.ChiroLeefTijd = ajnieuw.GeboorteJaarTot - kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year;
-                    }
-
-                    kind.AfdelingsJaar = ajnieuw;
-                }
-            }
-            else
-            {
-                Leiding leiding = (Leiding)l;
-                var afdelingsjaren = leiding.GroepsWerkJaar.AfdelingsJaar.ToList();
-                int checks = 0;
-                foreach (AfdelingsJaar aj in afdelingsjaren) // alle afdelingsjaren van de GROEP
-                {
-                    // De leid(st)er moet in dat afdelingsjaar zitten
-                    if (afdelingsIDs.Contains(aj.Afdeling.ID))
-                    {
-                        checks++;
-
-                        // En hij/zij zit er nog niet in
-                        if (leiding.AfdelingsJaar.FirstOrDefault(e => e.Afdeling.ID == aj.Afdeling.ID) == null)
-                        {
-                            // Voeg het dan toe
-                            leiding.AfdelingsJaar.Add(aj);
-                            aj.Leiding.Add(leiding);
-                        }
-                    }
-                    else // De leid(st)er mag niet in dat afdelingsjaar zitten
-                    {
-                        // En hij/zij zit er wel in
-                        if (leiding.AfdelingsJaar.FirstOrDefault(e => e.Afdeling.ID == aj.Afdeling.ID) != null)
-                        {
-                            // Verwijder hem/haar eruit
-                            leiding.AfdelingsJaar.FirstOrDefault(e => e.ID == aj.ID).TeVerwijderen = true;
-                        }
-                    }
-                }
-                if (checks != afdelingsIDs.Count || afdelingsIDs.Count != leiding.AfdelingsJaar.Count)
-                {
-                    throw new OngeldigeActieException("Niet alle gekozen afdelingen zijn afdelingen van de groep in het gekozen werkjaar.");
-                }
-            }
-        }
-    }
+				if (kind.AfdelingsJaar.Afdeling.ID != afdelingsIDs[0]) // anders verandert er niets
+				{
+					// Verwijder het kind uit zijn huidige afdelingsjaar
+					kind.AfdelingsJaar.TeVerwijderen = true;
+
+					AfdelingsJaar ajnieuw = kind.GroepsWerkJaar.AfdelingsJaar.FirstOrDefault(e => e.Afdeling.ID == afdelingsIDs[0]);
+					if (ajnieuw == null)
+					{
+						throw new OngeldigeActieException("De gekozen afdeling is geen afdeling van de groep in het gekozen werkjaar.");
+					}
+					ajnieuw.Kind.Add(kind);
+
+					// Pas Chiroleeftijd aan als het kind buiten het veld van de nieuwe afdeling valt
+					if (kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year + kind.GelieerdePersoon.ChiroLeefTijd < ajnieuw.GeboorteJaarVan)
+					{
+						kind.GelieerdePersoon.ChiroLeefTijd = ajnieuw.GeboorteJaarVan - kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year;
+					}
+					else if (kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year + kind.GelieerdePersoon.ChiroLeefTijd > ajnieuw.GeboorteJaarTot)
+					{
+						kind.GelieerdePersoon.ChiroLeefTijd = ajnieuw.GeboorteJaarTot - kind.GelieerdePersoon.Persoon.GeboorteDatum.Value.Year;
+					}
+
+					kind.AfdelingsJaar = ajnieuw;
+				}
+			}
+			else
+			{
+				Leiding leiding = (Leiding)l;
+				var afdelingsjaren = leiding.GroepsWerkJaar.AfdelingsJaar.ToList();
+				int checks = 0;
+				foreach (AfdelingsJaar aj in afdelingsjaren) // alle afdelingsjaren van de GROEP
+				{
+					// De leid(st)er moet in dat afdelingsjaar zitten
+					if (afdelingsIDs.Contains(aj.Afdeling.ID))
+					{
+						checks++;
+
+						// En hij/zij zit er nog niet in
+						if (leiding.AfdelingsJaar.FirstOrDefault(e => e.Afdeling.ID == aj.Afdeling.ID) == null)
+						{
+							// Voeg het dan toe
+							leiding.AfdelingsJaar.Add(aj);
+							aj.Leiding.Add(leiding);
+						}
+					}
+					else // De leid(st)er mag niet in dat afdelingsjaar zitten
+					{
+						// En hij/zij zit er wel in
+						if (leiding.AfdelingsJaar.FirstOrDefault(e => e.Afdeling.ID == aj.Afdeling.ID) != null)
+						{
+							// Verwijder hem/haar eruit
+							leiding.AfdelingsJaar.FirstOrDefault(e => e.ID == aj.ID).TeVerwijderen = true;
+						}
+					}
+				}
+				if (checks != afdelingsIDs.Count || afdelingsIDs.Count != leiding.AfdelingsJaar.Count)
+				{
+					throw new OngeldigeActieException("Niet alle gekozen afdelingen zijn afdelingen van de groep in het gekozen werkjaar.");
+				}
+			}
+		}
+	}
 }


Overrided the property email in User model class.

--- Source/Data/CarsSystem.Data.Models/User.cs
+++ Source/Data/CarsSystem.Data.Models/User.cs
@@ -53,6 +53,9 @@
         [Required]
         public override string PhoneNumber { get; set; }

+        [Required]
+        public override string Email { get; set; }
+
         public virtual ICollection<Car> Cars
         {
             get { return this.cars; }


GSF.Core: Added Parse() method to ComplexNumber.cs.

--- Source/Libraries/GSF.Core/ComplexNumber.cs
+++ Source/Libraries/GSF.Core/ComplexNumber.cs
@@ -68,8 +68,10 @@

 using System;
 using System.ComponentModel;
+using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Text;
+using System.Text.RegularExpressions;
 using GSF.Units;
 #if DNF46
 using System.Numerics;
@@ -478,5 +480,90 @@
         public static ComplexNumber op_Exponent(ComplexNumber z, double y) => Pow(z, y);

         #endregion
+
+        #region [ Static ]
+
+        // Static Methods
+
+        /// <summary>
+        /// Converts the string representation of a complex number to its complex number equivalent.
+        /// </summary>
+        /// <param name="str">A string that contains a number to convert.</param>
+        /// <returns>A complex number that is equivalent to the numeric value or symbols specified in <paramref name="str"/>.</returns>
+        public static ComplexNumber Parse(string str)
+        {
+            // Regex pattern to match a single number
+            const string NumberPattern = @"(?<Number>[+-]?(?:[ij][0-9eE\.]+|[0-9eE\.]+[ij]?))";
+
+            // Regex pattern to match the operator
+            const string OperatorPattern = @"(?<Operator>[+-])";
+
+            // Regex pattern to match the whole complex number
+            //
+            const string Pattern = @"^" +               // Start of string
+                                   @"\s*" +             // Whitespace
+                                   NumberPattern +      // Number
+                                   @"\s*" +             // Whitespace
+                                   "(?:" +              // Start of optional of noncapturing group
+                                   OperatorPattern +    // Operator
+                                   @"\s*" +             // Whitespace
+                                   NumberPattern +      // Number
+                                   @"\s*" +             // Whitespace
+                                   ")?" +               // End of optional noncapturing group
+                                   "$";                 // End of string
+
+            Match match;
+            CaptureCollection numberCaptures;
+            CaptureCollection operatorCaptures;
+
+            double op = 1.0;
+            double real = 0.0D;
+            double imaginary = 0.0D;
+
+            // Parses the string as a double by first removing the i or j
+            Func<string, double> parse = s => double.Parse(Regex.Replace(s, "[ij]", ""));
+            Func<string, bool> isImaginary = s => Regex.IsMatch(s, "[ij]");
+
+            match = Regex.Match(str, Pattern);
+
+            // String format is invalid if regex does not match
+            if (!match.Success)
+                throw new FormatException("Input string was not in a correct format.");
+
+            // Get the captures for the Number and Operator groups
+            numberCaptures = match.Groups["Number"].Captures;
+            operatorCaptures = match.Groups["Operator"].Captures;
+
+            // If the string defines two numbers, ensure that exactly one of them is imaginary
+            if (numberCaptures.Count == 2 && !(isImaginary(numberCaptures[0].Value) ^ isImaginary(numberCaptures[1].Value)))
+                throw new FormatException("Input string was not in a correct format.");
+
+            // Parse the first capture group to the
+            // appropriate part of the complex number
+            if (isImaginary(numberCaptures[0].Value))
+                imaginary = parse(numberCaptures[0].Value);
+            else
+                real = parse(numberCaptures[0].Value);
+
+            if (numberCaptures.Count == 2)
+            {
+                // Determine if the sign needs to be
+                // inverted based on the operator
+                if (operatorCaptures[0].Value == "-")
+                    op = -1.0;
+
+                // Parse the second capture group to the
+                // appropriate part of the complex number
+                if (isImaginary(numberCaptures[1].Value))
+                    imaginary = op * parse(numberCaptures[1].Value);
+                else
+                    real = op * parse(numberCaptures[1].Value);
+            }
+
+            // Return the complex number
+            return new ComplexNumber(real, imaginary);
+        }
+
+        #endregion
     }
 }


Change: Do not catch exception

Change: Do not catch exception

--- src/reni2/Code/Container.cs
+++ src/reni2/Code/Container.cs
@@ -51,14 +51,7 @@
         public string GetCSharpStatements(int indent)
         {
             var generator = new CSharpGenerator(Data.TemporarySize.SaveByteCount);
-            try
-            {
-                Data.Visit(generator);
-            }
-            catch(UnexpectedContextReference e)
-            {
-                Tracer.AssertionFailed("", () => e.Message);
-            }
+            Data.Visit(generator);
             return generator.Data.Indent(indent);
         }
     }


Version 1.20.

Version 1.20.

--- Source/Seobiseu/Properties/SolutionInfo.cs
+++ Source/Seobiseu/Properties/SolutionInfo.cs
@@ -4,5 +4,5 @@
 [assembly: AssemblyCompany("Josip Medved")]
 [assembly: AssemblyCopyright("Copyright (c) 2011 Josip Medved <jmedved@jmedved.com>")]

-[assembly: AssemblyVersion("0.00.*")]
-[assembly: AssemblyInformationalVersion("0.00")]
+[assembly: AssemblyVersion("1.20.*")]
+[assembly: AssemblyInformationalVersion("1.20")]


Dispose パターン対応

Dispose パターン対応

--- Threading/SemaphoreSlimLock.cs
+++ Threading/SemaphoreSlimLock.cs
@@ -33,7 +33,7 @@
         /// </summary>
         ~SemaphoreSlimLock()
         {
-            this.Dispose();
+            this.Dispose(false);
         }

         /// <summary>
@@ -134,9 +134,21 @@
         #region IDisposable の実装

         /// <summary>
-        /// 内部に保持している SemaphoreSlim インスタンスを解放する。
+        /// リソースの破棄を行う。
         /// </summary>
         public void Dispose()
+        {
+            this.Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        /// <summary>
+        /// リソース破棄の実処理を行う。
+        /// </summary>
+        /// <param name="disposing">
+        /// Dispose メソッドから呼び出された場合は true 。
+        /// </param>
+        protected virtual void Dispose(bool disposing)
         {
             this.Semaphore.Dispose();
         }
@@ -177,7 +189,7 @@
             }

             /// <summary>
-            /// SemaphoreSlim インスタンスを取得する。
+            /// SemaphoreSlim インスタンスを取得または設定する。
             /// </summary>
             private SemaphoreSlim Semaphore { get; set; }
         }


Decent drawing

Decent drawing

--- TimerChange.mod/TimerChange.cs
+++ TimerChange.mod/TimerChange.cs
@@ -107,7 +107,7 @@
                         float roundTime = (float)roundTimeField.GetValue(target);
                         float timePassed = (roundTimer >= 0f) ? Mathf.Floor(Time.time - roundTimer) : 0f;
                         int seconds = Mathf.Max(0, (int)(roundTime + 1 - timePassed)); // add +1 so round stops 1 second AFTER hitting 0
-                        p1Seconds += seconds;
+                        p1Seconds = seconds;
                         if (seconds == 0 && !turnEnded) {
                             turnEnded = true;
                             BattleModeUI battleUI = (BattleModeUI)battleUIField.GetValue(target);
@@ -120,7 +120,7 @@
                         float roundTime = (float)roundTimeField.GetValue(target);
                         float timePassed = (roundTimer >= 0f) ? Mathf.Floor(Time.time - roundTimer) : 0f;
                         int seconds = Mathf.Max(0, (int)(roundTime + 1 - timePassed)); // add +1 so round stops 1 second AFTER hitting 0
-                        p2Seconds += seconds;
+                        p2Seconds = seconds;
                         turnEnded = false;
                     }
                 }
@@ -128,7 +128,7 @@
                     BattleMode target = (BattleMode)info.target;
                     GUISkin skin = GUI.skin;
                     GUI.skin = (UnityEngine.GUISkin) battleUISkinField.GetValue(target);
-                    GUI.color = Color.white;
+                    GUI.color = new Color(1f, 1f, 1f, 0.75f);

                     // position of GUI box containing names
                     float namesBoxX = (float)Screen.width * 0.5f - (float)Screen.height * 0.3f;
@@ -144,55 +144,29 @@

                     GUI.skin.label.fontSize = GUI.skin.label.fontSize;
                     GUI.skin = skin;
+                    GUI.color = Color.white;

                     string p1Text = p1Seconds.ToString();
                     Rect p1Rect = new Rect((float)(Screen.width / 2) - width / 2f - namesBoxX + Screen.height * 0.01f, (float)Screen.height * 0.035f, 0f, (float)Screen.height * 0.03f);
-                    Vector2 c = default(Vector2);
                     for (int i = 0; i < p1Text.Length; i++) {
                         int num7 = (int)(p1Text[i] - '0');
                         p1Rect.width = p1Rect.height * (float)kerning[num7] / 34f;
                         if (p1Text.Length == 1) {
                             p1Rect.x += p1Rect.width / 2f;
                         }
-                        if (i == 0) {
-                            c = new Vector2(p1Rect.x + p1Rect.width * 1.05f, p1Rect.y + p1Rect.height / 2f);
-                        }
-                        float num10 = Time.time - p1Seconds;
-                        float num11 = num10 / 0.6f;
-                        Color color = GUI.color;
-                        GUI.color = new Color(1f, 1f, 1f, 1f - num11);
-                        Rect position2 = GeomUtil.scaleAround(p1Rect, c, 1f + 3f * num11);
-                        GUI.DrawTexture(position2, ResourceManager.LoadTexture("BattleMode/Clock/time__n_" + p1Text[i]));
-                        if (num10 >= 0.6f) {
-                            //this.resetTime = -1f;
-                        }
-                        GUI.color = color;
+                        GUI.DrawTexture(p1Rect, ResourceManager.LoadTexture("BattleMode/Clock/time__n_" + p1Text[i]));
                         p1Rect.x += p1Rect.width * 1.1f;
                     }

                     string p2Text = p2Seconds.ToString();
                     Rect p2Rect = new Rect((float)(Screen.width / 2) - width / 2f + namesBoxX + Screen.height * 0.01f, (float)Screen.height * 0.035f, 0f, (float)Screen.height * 0.03f);
-                    Vector2 d = default(Vector2);
                     for (int i = 0; i < p2Text.Length; i++) {
                         int num7 = (int)(p2Text[i] - '0');
                         p2Rect.width = p2Rect.height * (float)kerning[num7] / 34f;
                         if (p2Text.Length == 1) {
                             p2Rect.x += p2Rect.width / 2f;
                         }
-                        if (i == 0) {
-                            d = new Vector2(p2Rect.x + p2Rect.width * 1.05f, p2Rect.y + p2Rect.height / 2f);
-                        }
-                        float num10 = Time.time - p2Seconds;
-                        float num11 = num10 / 0.6f;
-                        Color color = GUI.color;
-                        GUI.color = Color.red;
-                        //GUI.color = new Color(1f, 1f, 1f, 1f - num11);
-                        Rect position2 = GeomUtil.scaleAround(p2Rect, c, 1f + 3f * num11);
-                        GUI.DrawTexture(position2, ResourceManager.LoadTexture("BattleMode/Clock/time__n_" + p2Text[i]));
-                        if (num10 >= 0.6f) {
-                            //this.resetTime = -1f;
-                        }
-                        GUI.color = color;
+                        GUI.DrawTexture(p2Rect, ResourceManager.LoadTexture("BattleMode/Clock/time__n_" + p2Text[i]));
                         p2Rect.x += p2Rect.width * 1.1f;
                     }
                 }


Break lines at 100.

Break lines at 100.

--- Tomboy/Plugins/ExportToHTML.cs
+++ Tomboy/Plugins/ExportToHTML.cs
@@ -76,6 +76,7 @@

 		StreamWriter writer = null;
 		string error_message = null;
+
 		try {
 			try {
 				// FIXME: Warn about file existing.  Allow overwrite.
@@ -86,16 +87,22 @@
 			writer = new StreamWriter (output_path);
 			WriteHTMLForNote (writer, Note, dialog.ExportLinked);

-			// Save the dialog preferences now that the note has successfully been exported
+			// Save the dialog preferences now that the note has
+			// successfully been exported
 			dialog.SavePreferences ();
 			dialog.Destroy ();
 			dialog = null;

-			try	{
+			try {
 				Uri output_uri = new Uri (output_path);
 				Gnome.Url.Show (output_uri.AbsoluteUri);
 			} catch (Exception ex) {
-				Logger.Log ("Could not open the exported note in a web browser: {0}", ex);
+				Logger.Log ("Could not open exported note in a web browser: {0}",
+					    ex);
+
+				string detail = String.Format (
+					Catalog.GetString ("Your note was exported to \"{0}\"."),
+					output_path);

 				// Let the user know the note was saved successfully
 				// even though showing the note in a web browser failed.
@@ -106,9 +113,7 @@
 						Gtk.MessageType.Info,
 						Gtk.ButtonsType.Ok,
 						Catalog.GetString ("Note exported successfully"),
-						String.Format (
-							Catalog.GetString ("Your note was exported as \"{0}\"."),
-							output_path));
+						detail);
 				msg_dialog.Run ();
 				msg_dialog.Destroy ();
 			}
@@ -129,13 +134,17 @@
 		{
 			Logger.Log ("Could not export: {0}", error_message);

+			string msg = String.Format (
+				Catalog.GetString ("Could not save the file \"{0}\""),
+				output_path);
+
 			HIGMessageDialog msg_dialog =
 				new HIGMessageDialog (
 					dialog,
 					Gtk.DialogFlags.DestroyWithParent,
 					Gtk.MessageType.Error,
 					Gtk.ButtonsType.Ok,
-					String.Format (Catalog.GetString ("Could not save the file \"{0}\""), output_path),
+					msg,
 					error_message);
 			msg_dialog.Run ();
 			msg_dialog.Destroy ();


[Modify] Replace it

[Modify] Replace it

--- websocket-sharp/Net/HttpConnection.cs
+++ websocket-sharp/Net/HttpConnection.cs
@@ -458,7 +458,7 @@
     {
       _context.Listener = listener;

-      if (!_context.Register ()) {
+      if (!listener.RegisterContext (_context)) {
         _context.ErrorStatusCode = 503;
         _context.SendError ();


[Modify] 2016

[Modify] 2016

--- websocket-sharp/Net/HttpConnection.cs
+++ websocket-sharp/Net/HttpConnection.cs
@@ -8,7 +8,7 @@
  * The MIT License
  *
  * Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
- * Copyright (c) 2012-2015 sta.blockhead
+ * Copyright (c) 2012-2016 sta.blockhead
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal


[Modify] Edit it

[Modify] Edit it

--- websocket-sharp/Net/HttpStatusCode.cs
+++ websocket-sharp/Net/HttpStatusCode.cs
@@ -184,9 +184,8 @@
     /// </summary>
     NotModified = 304,
     /// <summary>
-    /// Equivalent to status code 305.
-    /// Indicates that the requested resource must be accessed through the proxy given by
-    /// the Location field.
+    /// Equivalent to status code 305. Indicates that the requested resource
+    /// must be accessed through the proxy given by the Location field.
     /// </summary>
     UseProxy = 305,
     /// <summary>


Fixed regions

Fixed regions

--- SpirvSpecToJson/SpirvSpecToJson/Program.cs
+++ SpirvSpecToJson/SpirvSpecToJson/Program.cs
@@ -47,7 +47,7 @@
             // init json
             var specJson = new JObject();

-            // metadata
+            #region MetaData
             {
                 var metaJson = new JObject();

@@ -58,10 +58,9 @@

                 specJson["Metadata"] = metaJson;
             }
-
-            // op code
-
-            #region
+            #endregion
+
+            #region OpCode

             {
                 var opcodeJson = new JArray();
@@ -145,7 +144,7 @@
                             opJson["WordCountFix"] = int.Parse(wc.Replace(" + variable", "").Trim());
                             opJson["OpCode"] = opcodeNr;
                             opJson["HasVariableWordCount"] = isVariableWC;
-
+

                             // Result
                             if (text == "Result <id>")
@@ -194,13 +193,13 @@
                             }
                             // Optionals
                             else if (text.Contains("Optional"))
-                            {
+                            {
                                 var a = text.GetLinkedNameAndType();
                                 operand["Name"] = a[0];
                                 operand["Type"] = "ID?";
                                 operands.Add(operand);
                             }
-
+
                         }
                         opJson["HasResult"] = hasResult;
                         opJson["HasResultType"] = hasResultType;
@@ -211,16 +210,17 @@

                     specJson["OpCodes"] = opcodeJson;
                 }
-
-                #endregion
-
-
-                // Enums
-
-                #region
-
-                // Array of Enums
+            }
+
+            #endregion
+
+            #region Enums
+
+            // Array of Enums
+            {
+
                 var enumJson = new JArray();
+

                 Console.WriteLine("Scanning Enums");

@@ -461,14 +461,13 @@
                     specJson["Enums"] = enumJson;

                 }
-
-                #endregion
-
-                // save json
-                Console.WriteLine("Writing result json");
-                File.WriteAllText(jsonFile, specJson.ToString(Formatting.Indented));
             }

+            #endregion
+
+            // save json
+            Console.WriteLine("Writing result json");
+            File.WriteAllText(jsonFile, specJson.ToString(Formatting.Indented));
         }
     }
 }


Enum names without numbers

Enum names without numbers

--- SpirvSpecToJson/SpirvSpecToJson/Program.cs
+++ SpirvSpecToJson/SpirvSpecToJson/Program.cs
@@ -230,11 +230,10 @@

             #region Enums

-            // Array of Enums
+
             {
-
+                // Array of Enums
                 var enumJson = new JArray();
-

                 Console.WriteLine("Scanning Enums");

@@ -263,9 +262,14 @@
                     // Array of Values
                     var valuesArray = new JArray();

-                    // metadata of Enum
-                    data["Name"] = node.InnerText.ToCamelCase();
-
+                    // name of Enum
+                    {
+                        var name = node.InnerText;
+
+                        name = name.Substring(name.IndexOf(' '));
+
+                        data["Name"] = name.Trim().ToCamelCase();
+                    }

                     // Scan all rows
                     foreach (var tr in tbody.ChildNodes)


[Modify] Polish it

[Modify] Polish it

--- websocket-sharp/CloseEventArgs.cs
+++ websocket-sharp/CloseEventArgs.cs
@@ -54,8 +54,8 @@
     #region Internal Constructors

     internal CloseEventArgs (PayloadData payloadData)
+      : this (payloadData, false)
     {
-      _payloadData = payloadData;
     }

     internal CloseEventArgs (ushort code, string reason)


[Modify] Edit it

[Modify] Edit it

--- websocket-sharp/ErrorEventArgs.cs
+++ websocket-sharp/ErrorEventArgs.cs
@@ -42,15 +42,14 @@
   /// </summary>
   /// <remarks>
   ///   <para>
-  ///   A <see cref="WebSocket.OnError"/> event occurs when the <see cref="WebSocket"/> gets
-  ///   an error.
+  ///   That event occurs when the <see cref="WebSocket"/> gets an error.
   ///   </para>
   ///   <para>
   ///   If you would like to get the error message, you should access
   ///   the <see cref="ErrorEventArgs.Message"/> property.
   ///   </para>
   ///   <para>
-  ///   And if the error is due to an exception, you can get the exception by accessing
+  ///   And if the error is due to an exception, you can get it by accessing
   ///   the <see cref="ErrorEventArgs.Exception"/> property.
   ///   </para>
   /// </remarks>
@@ -84,8 +83,8 @@
     /// Gets the exception that caused the error.
     /// </summary>
     /// <value>
-    /// An <see cref="System.Exception"/> instance that represents the cause of the error,
-    /// or <see langword="null"/> if the error isn't due to an exception.
+    /// An <see cref="System.Exception"/> instance that represents the cause of
+    /// the error, or <see langword="null"/> if it is not due to an exception.
     /// </value>
     public Exception Exception {
       get {


formatting of code for easier reading

formatting of code for easier reading

--- UndoExtension/UndoExtension.cs
+++ UndoExtension/UndoExtension.cs
@@ -46,6 +46,7 @@
                 ImageFactory.GetImageThisAssembly("Images/arrow-undo-16.png"),
                 ImageFactory.GetImageThisAssembly("Images/arrow-undo-32.png"));

+
             var group = IrAuthorShell.HomeTab.GetGroup("Clipboard");
             group.AddButton(undoCommand);

@@ -54,34 +55,41 @@
                 x => RuleApplicationService.Controller.RemovingDef -= x);

             DefActions = defChangedObservable.Select(x => x.EventArgs.Item);
+
+            var undoStream = DefActions.Select(x =>
+            new UndoHistoryItem()
+            {
+                DefToUndo = x.CopyWithSameGuids(),
+                ParentGuid = x.Parent.Guid,
+                OriginalIndex = ((IContainsRuleElements)x.Parent).RuleElements.IndexOf(x)
+            });
+            undoStream.Do(LogEvent);
             subscriptionsDisposable.Add(
-                DefActions.Select(x => new UndoHistoryItem()
-                {
-                    DefToUndo = x.CopyWithSameGuids(),
-                    ParentGuid = x.Parent.Guid,
-                    OriginalIndex = ((IContainsRuleElements)x.Parent).RuleElements.IndexOf(x)
-                }).Do(LogEvent)
-            .Subscribe(x =>
-            {
-                if (bufferCollection.Count >= BUFFER_SIZE)
-                {
-                    var p = bufferCollection.Pop();
-                    LogEvent("Buffer at max capacity. Popped {0} from stack", p.DefToUndo.Name);
-                }
-                bufferCollection.Push(x);
-            }));
+                undoStream
+                    .Subscribe(x =>
+                    {
+                        if (bufferCollection.Count >= BUFFER_SIZE)
+                        {
+                            var p = bufferCollection.Pop();
+                            LogEvent("Buffer at max capacity. Popped {0} from stack", p.DefToUndo.Name);
+                        }
+                        bufferCollection.Push(x);
+                        LogEvent("Added item to the undo buffer. Current count is {0}", bufferCollection.Count);
+                    })
+                );

             subscriptionsDisposable.Add(
                 UndoClicked.Do(x => LogEvent("Undo clicked. Current buffer size: {0}", bufferCollection.Count))
                 .Where(x => bufferCollection.Any())
-                .Subscribe(x => UndoDefRemoved(bufferCollection.Pop())));
+                .Subscribe(x => UndoDefRemoved(bufferCollection.Pop()))
+            );
         }

         private void LogEvent(UndoHistoryItem undoItem)
         {
             if (undoItem != null)
             {
-                LogEvent(string.Format("UNDOSTREAM - Buffer Count: {3} Name: {0} - DefIndex: {1} Parent: {2}", undoItem.DefToUndo.Name, undoItem.OriginalIndex, undoItem.ParentGuid, bufferCollection.Count));
+                LogEvent("Buffer Count: {3} Name: {0} - DefIndex: {1} Parent: {2}", undoItem.DefToUndo.Name, undoItem.OriginalIndex, undoItem.ParentGuid, bufferCollection.Count);
             }
         }


clone new tests to .NET 4.0 solution

clone new tests to .NET 4.0 solution

--- UnitTestsNet40/SettingsTest.cs
+++ UnitTestsNet40/SettingsTest.cs
@@ -252,7 +252,72 @@
             var test = Jose.JWT.Decode<IDictionary<string, object>>(token, PrivKey(), settings: new JwtSettings().RegisterCompressionAlias("zip", JweCompression.DEF));

             Assert.That(test, Is.EqualTo(new Dictionary<string, object> { { "hello", "world" } }));
-        }
+        }
+
+        [Test]
+        public void DeregisterJwe()
+        {
+            try
+            {
+                JwtSettings settings = new JwtSettings();
+                settings.DeregisterJwe(JweEncryption.A128GCM);
+                Jose.JWT.Encode("should fail, no A128GCM", PubKey(), JweAlgorithm.RSA_OAEP_256, JweEncryption.A128GCM, settings: settings);
+                Assert.True(false, string.Format("JoseException was expected"));
+            }
+            catch (JoseException e)
+            {
+                Console.Out.WriteLine(e.ToString());
+            }
+        }
+
+        [Test]
+        public void DeregisterJws()
+        {
+            try
+            {
+                JwtSettings settings = new JwtSettings();
+                settings.DeregisterJws(JwsAlgorithm.RS256);
+                Jose.JWT.Encode("should fail, no RS-256", PrivKey(), JwsAlgorithm.RS256, settings: settings);
+                Assert.True(false, string.Format("JoseException was expected"));
+            }
+            catch (JoseException e)
+            {
+                Console.Out.WriteLine(e.ToString());
+            }
+        }
+
+        [Test]
+        public void DeregisterJwa()
+        {
+            try
+            {
+                JwtSettings settings = new JwtSettings();
+                settings.DeregisterJwa(JweAlgorithm.RSA_OAEP_256);
+                Jose.JWT.Encode("should fail, no RSA-OAEP-256", PubKey(), JweAlgorithm.RSA_OAEP_256, JweEncryption.A128GCM, settings: settings);
+                Assert.True(false, string.Format("JoseException was expected"));
+            }
+            catch (JoseException e)
+            {
+                Console.Out.WriteLine(e.ToString());
+            }
+        }
+
+        [Test]
+        public void DeregisterCompression()
+        {
+            try
+            {
+                JwtSettings settings = new JwtSettings();
+                settings.DeregisterCompression(JweCompression.DEF);
+                Jose.JWT.Encode("should fail, no RSA-OAEP-256", PubKey(), JweAlgorithm.RSA_OAEP_256, JweEncryption.A128GCM, JweCompression.DEF, settings: settings);
+                Assert.True(false, string.Format("JoseException was expected"));
+            }
+            catch (JoseException e)
+            {
+                Console.Out.WriteLine(e.ToString());
+            }
+        }
+

         #region test utils


Remove obsolete, commented-out option

Remove obsolete, commented-out option

--- spike/src/Compiler/Program.cs
+++ spike/src/Compiler/Program.cs
@@ -54,7 +54,6 @@
         {
             var verbose = false;
             var help = false;
-            // var recurse = false;
             var force = false;
             var dontExecute = false;
             var targetFramework = NuGetFramework.Parse(Assembly.GetEntryAssembly().GetCustomAttribute<TargetFrameworkAttribute>().FrameworkName);


Use weaktable instead of weakref

Use weaktable instead of weakref

--- src/AngleSharp/Dom/Node.cs
+++ src/AngleSharp/Dom/Node.cs
@@ -6,6 +6,7 @@
     using System;
     using System.Diagnostics;
     using System.IO;
+    using System.Runtime.CompilerServices;

     /// <summary>
     /// Represents a node in the generated tree.
@@ -15,11 +16,12 @@
     {
         #region Fields

+        static readonly ConditionalWeakTable<Node, Document> Owners = new ConditionalWeakTable<Node, Document>();
+
         readonly NodeType _type;
         readonly String _name;
         readonly NodeFlags _flags;
-
-        WeakReference<Document> _owner;
+
         Url _baseUri;
         Node _parent;
         NodeList _children;
@@ -30,7 +32,7 @@

         internal Node(Document owner, String name, NodeType type = NodeType.Element, NodeFlags flags = NodeFlags.None)
         {
-            _owner = new WeakReference<Document>(owner);
+            Owners.Add(this, owner);
             _name = name ?? String.Empty;
             _type = type;
             _children = this.CreateChildren();
@@ -230,7 +232,7 @@

                 if (_type != NodeType.Document)
                 {
-                    _owner.TryGetTarget(out owner);
+                    Owners.TryGetValue(this, out owner);
                 }

                 return owner;
@@ -241,7 +243,8 @@

                 if (!Object.ReferenceEquals(oldDocument, value))
                 {
-                    _owner = new WeakReference<Document>(value);
+                    Owners.Remove(this);
+                    Owners.Add(this, value);

                     for (var i = 0; i < _children.Length; i++)
                     {


Removing redundant if statement

Removing redundant if statement

--- src/ADAL.Common/TokenCache.cs
+++ src/ADAL.Common/TokenCache.cs
@@ -327,10 +327,7 @@
                 if (tokenNearExpiry)
                 {
                     result.AccessToken = null;
-                    if (tokenNearExpiry)
-                    {
-                        Logger.Verbose(callState, "An expired or near expiry token was found in the cache");
-                    }
+                    Logger.Verbose(callState, "An expired or near expiry token was found in the cache");
                 }
                 else if (!cacheKey.ResourceEquals(resource))
                 {


Multiple calls to SocketAsyncEventArgs.Dispose() to ensure SocketAsyncEventArgs resources are released

--- src/Cassandra/TcpSocket.cs
+++ src/Cassandra/TcpSocket.cs
@@ -316,6 +316,7 @@
             }
             if (_receiveSocketEvent != null)
             {
+                //It is safe to call SocketAsyncEventArgs.Dispose() more than once
                 _sendSocketEvent.Dispose();
                 _receiveSocketEvent.Dispose();
             }
@@ -370,13 +371,13 @@

         public void Dispose()
         {
+            if (_socket == null)
+            {
+                return;
+            }
+            _isClosing = true;
             try
             {
-                if (_socket == null)
-                {
-                    return;
-                }
-                _isClosing = true;
                 //Try to close it.
                 //Some operations could make the socket to dispose itself
                 _socket.Shutdown(SocketShutdown.Both);
@@ -386,6 +387,13 @@
             {
                 //We should not mind if the socket shutdown or close methods throw an exception
             }
+            if (_receiveSocketEvent != null)
+            {
+                //It is safe to call SocketAsyncEventArgs.Dispose() more than once
+                //Also checked: .NET 4.0, .NET 4.5 and Mono 3.10 and 3.12 implementations
+                _sendSocketEvent.Dispose();
+                _receiveSocketEvent.Dispose();
+            }
         }
     }
 }


Add comments for Segment of Grid.

Add comments for Segment of Grid.

--- src/Avalonia.Controls/Grid.cs
+++ src/Avalonia.Controls/Grid.cs
@@ -857,15 +857,48 @@
             }
         }

+        /// <summary>
+        /// Stores the layout values of of <see cref="RowDefinitions"/> of <see cref="ColumnDefinitions"/>.
+        /// </summary>
         private struct Segment
         {
+            /// <summary>
+            /// Gets or sets the base size of this segment.
+            /// The value is from the user's code or from the stored measuring values.
+            /// </summary>
             public double OriginalSize;
-            public double Max;
-            public double Min;
+
+            /// <summary>
+            /// Gets the maximum size of this segment.
+            /// The value is from the user's code.
+            /// </summary>
+            public readonly double Max;
+
+            /// <summary>
+            /// Gets the minimum size of this segment.
+            /// The value is from the user's code.
+            /// </summary>
+            public readonly double Min;
+
+            /// <summary>
+            /// Gets or sets the row/column partial desired size of the <see cref="Grid"/>.
+            /// </summary>
             public double DesiredSize;
+
+            /// <summary>
+            /// Gets or sets the row/column offered size that will be used to measure the children.
+            /// </summary>
             public double OfferedSize;
+
+            /// <summary>
+            /// Gets or sets the star unit size if the <see cref="Type"/> is <see cref="GridUnitType.Star"/>.
+            /// </summary>
             public double Stars;
-            public GridUnitType Type;
+
+            /// <summary>
+            /// Gets the segment size unit type.
+            /// </summary>
+            public readonly GridUnitType Type;

             public Segment(double offeredSize, double min, double max, GridUnitType type)
             {


null checked all permissions checks in CurrentContext (#1097)

--- src/Core/CurrentContext.cs
+++ src/Core/CurrentContext.cs
@@ -194,52 +194,62 @@

         public bool AccessBusinessPortal(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.AccessBusinessPortal) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.AccessBusinessPortal ?? false)) ?? false);
         }

         public bool AccessEventLogs(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.AccessEventLogs) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.AccessEventLogs ?? false)) ?? false);
         }

         public bool AccessImportExport(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.AccessImportExport) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.AccessImportExport ?? false)) ?? false);
         }

         public bool AccessReports(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.AccessReports) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.AccessReports ?? false)) ?? false);
         }

         public bool ManageAllCollections(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.ManageAllCollections) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.ManageAllCollections ?? false)) ?? false);
         }

         public bool ManageAssignedCollections(Guid orgId)
         {
-            return OrganizationManager(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.ManageAssignedCollections) ?? false);
+            return OrganizationManager(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.ManageAssignedCollections ?? false)) ?? false);
         }

         public bool ManageGroups(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.ManageGroups) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.ManageGroups ?? false)) ?? false);
         }

         public bool ManagePolicies(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.ManagePolicies) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.ManagePolicies ?? false)) ?? false);
         }

         public bool ManageSso(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.ManageSso) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.ManageSso ?? false)) ?? false);
         }

         public bool ManageUsers(Guid orgId)
         {
-            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId && o.Permissions.ManageUsers) ?? false);
+            return OrganizationAdmin(orgId) || (Organizations?.Any(o => o.Id == orgId
+                        && (o.Permissions?.ManageUsers ?? false)) ?? false);
         }

         public async Task<ICollection<CurrentContentOrganization>> OrganizationMembershipAsync(


Add a method to custom job run code after bootstrap completed.

--- src/Core/Jobs/JobRunner.cs
+++ src/Core/Jobs/JobRunner.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.IO;
+using System.Runtime.InteropServices;
 using System.Threading;
 using System.Threading.Tasks;
 using Foundatio.Extensions;
@@ -30,7 +31,7 @@
     }

     public class JobRunner {
-        public static int RunInConsole(JobRunOptions options) {
+        public static int RunInConsole(JobRunOptions options, Action<IServiceProvider> afterBootstrap = null) {
             int result;
             string jobName = "N/A";
             try {
@@ -52,8 +53,7 @@

                 Logger.Info().Message("Starting job...").Write();

-                var metricsClient = ServiceProvider.Current.GetService<IMetricsClient>() as InMemoryMetricsClient;
-                metricsClient?.StartDisplayingStats(TimeSpan.FromSeconds(5), new LoggerTextWriter { Source = "Metrics" });
+                afterBootstrap?.Invoke(ServiceProvider.Current);

                 result = JobRunner.RunAsync(options).Result;


Corrects a typo in the documentation

Corrects a typo in the documentation

--- src/Cake.Curl/CurlSettings.cs
+++ src/Cake.Curl/CurlSettings.cs
@@ -22,7 +22,7 @@
         /// contains information such as the amount of transferred data, transfer speed
         /// and the estimated time left. When the <see cref="P:ProgressBar"/> property
         /// is set to <see langword="true"/>, curl displays a single line of <em>#</em>
-        /// characters instead. This may be preferrable when running the build script
+        /// characters instead. This may be preferable when running the build script
         /// in a terminal where we want to keep the amount of output to a minimum.
         /// </remarks>
         public bool ProgressBar { get; set; }


Fix for LOG4NET-45. Added constructor and property to take plugin type as a Type

git-svn-id: 7230453ef4d2e9c957b80d4737114f575fc9f7f8@312308 13f79535-47bb-0310-9956-ffa450edef68

--- src/Config/PluginAttribute.cs
+++ src/Config/PluginAttribute.cs
@@ -52,13 +52,31 @@
 		/// Initializes a new instance of the <see cref="PluginAttribute" /> class
 		/// with the specified type.
 		/// </summary>
+		/// <param name="typeName">The type name of plugin to create.</param>
+		/// <remarks>
+		/// <para>
+		/// Create the attribute with the plugin type specified.
+		/// </para>
+		/// <para>
+		/// Where possible use the constructor that takes a <see cref="System.Type"/>.
+		/// </para>
+		/// </remarks>
+		public PluginAttribute(string typeName)
+		{
+			m_typeName = typeName;
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="PluginAttribute" /> class
+		/// with the specified type.
+		/// </summary>
 		/// <param name="type">The type of plugin to create.</param>
 		/// <remarks>
 		/// <para>
 		/// Create the attribute with the plugin type specified.
 		/// </para>
 		/// </remarks>
-		public PluginAttribute(string type)
+		public PluginAttribute(Type type)
 		{
 			m_type = type;
 		}
@@ -66,6 +84,23 @@
 		#endregion Public Instance Constructors

 		#region Public Instance Properties
+
+		/// <summary>
+		/// Gets or sets the type for the plugin.
+		/// </summary>
+		/// <value>
+		/// The type for the plugin.
+		/// </value>
+		/// <remarks>
+		/// <para>
+		/// The type for the plugin.
+		/// </para>
+		/// </remarks>
+		public Type Type
+		{
+			get { return m_type; }
+			set { m_type = value ; }
+		}

 		/// <summary>
 		/// Gets or sets the type name for the plugin.
@@ -77,11 +112,14 @@
 		/// <para>
 		/// The type name for the plugin.
 		/// </para>
+		/// <para>
+		/// Where possible use the <see cref="Type"/> property instead.
+		/// </para>
 		/// </remarks>
-		public string Type
+		public string TypeName
 		{
-			get { return m_type; }
-			set { m_type = value ; }
+			get { return m_typeName; }
+			set { m_typeName = value ; }
 		}

 		#endregion Public Instance Properties
@@ -100,13 +138,17 @@
 		/// <returns>The plugin object.</returns>
 		public IPlugin CreatePlugin()
 		{
-			// Get the plugin object type
-			System.Type pluginType = SystemInfo.GetTypeFromString(this.Type, true, true);
+			Type pluginType = m_type;
+			if (m_type == null)
+			{
+				// Get the plugin object type from the string type name
+				pluginType = SystemInfo.GetTypeFromString(m_typeName, true, true);
+			}

 			// Check that the type is a plugin
 			if (!(typeof(IPlugin).IsAssignableFrom(pluginType)))
 			{
-				throw new LogException("Plugin type [" + this.Type + "] does not implement log4net.IPlugin interface");
+				throw new LogException("Plugin type [" + pluginType.FullName + "] does not implement the log4net.IPlugin interface");
 			}

 			// Create an instance of the plugin using the default constructor
@@ -131,14 +173,19 @@
 		/// <returns>A representation of the properties of this object</returns>
 		override public string ToString()
 		{
-			return "PluginAttribute[Type=" + this.Type + "]";
+			if (m_type != null)
+			{
+				return "PluginAttribute[Type=" + m_type.FullName + "]";
+			}
+			return "PluginAttribute[Type=" + m_typeName + "]";
 		}

 		#endregion Override implementation of Object

 		#region Private Instance Fields

-		private string m_type = null;
+		private string m_typeName = null;
+		private Type m_type = null;

 		#endregion Private Instance Fields
 	}


Update `InterfaceImpl` sorting, closes #426

--- src/DotNet/Writer/Metadata.cs
+++ src/DotNet/Writer/Metadata.cs
@@ -2,16 +2,16 @@

 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.IO;
+using System.Linq;
 using System.Text;
+using dnlib.DotNet.Emit;
+using dnlib.DotNet.MD;
+using dnlib.DotNet.Pdb;
+using dnlib.DotNet.Pdb.Portable;
 using dnlib.IO;
 using dnlib.PE;
-using dnlib.DotNet.MD;
-using dnlib.DotNet.Emit;
-using System.Diagnostics;
-using dnlib.DotNet.Pdb;
-using dnlib.DotNet.Pdb.Portable;
-using System.Linq;

 namespace dnlib.DotNet.Writer {
 	/// <summary>
@@ -158,6 +158,7 @@
 		AlwaysCreateBlobHeap = 0x80000,

 		/// <summary>
+		/// DEPRECATED:
 		/// Sort the InterfaceImpl table the same way Roslyn sorts it. Roslyn doesn't sort it
 		/// according to the ECMA spec, see https://github.com/dotnet/roslyn/issues/3905
 		/// </summary>
@@ -1822,15 +1823,7 @@
 					return a.row.Owner.CompareTo(b.row.Owner);
 				return a.row.Number.CompareTo(b.row.Number);
 			});
-			if (RoslynSortInterfaceImpl)
-				interfaceImplInfos.Sort((a, b) => a.row.Class.CompareTo(b.row.Class));
-			else {
-				interfaceImplInfos.Sort((a, b) => {
-					if (a.row.Class != b.row.Class)
-						return a.row.Class.CompareTo(b.row.Class);
-					return a.row.Interface.CompareTo(b.row.Interface);
-				});
-			}
+			interfaceImplInfos.Sort((a, b) => a.row.Class.CompareTo(b.row.Class));

 			tablesHeap.ClassLayoutTable.IsSorted = true;
 			tablesHeap.ConstantTable.IsSorted = true;


deletin work

deletin work

--- VisualStudio/MSDAWs/Program.cs
+++ VisualStudio/MSDAWs/Program.cs
@@ -1,137 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Threading;
-
-namespace MSDaws
-{
-    class Program
-    {
-        static List<Note> noteData = new List<Note>();
-        static string actn;
-        static int editID;
-        static string ans;
-        static int duration;
-        static void Main(string[] args)
-        {
-            Console.WriteLine("MS-DAWs v0.1 created by Brandon Lee.");
-            Console.WriteLine("PLEASE NOTE: The pitch of a note CANNOT contain a decimal!");
-            while (true)
-            {
-                Console.Clear();
-                Console.WriteLine("Action: (note, repl, play)");
-                actn = Console.ReadLine();
-                switch (actn)
-                {
-                    case "note":
-                        noteData.Add(new MSDaws.Note());
-                        Console.WriteLine("Pitch:");
-                        ans = Console.ReadLine();
-                        noteData[noteData.ToArray().Length-1].Pitch = (StringToInt(ans));
-                        Console.WriteLine("Length:");
-                        ans = Console.ReadLine();
-                        noteData[noteData.ToArray().Length-1].Length = (StringToInt(ans));
-                        Console.WriteLine("Starts At:");
-                        ans = Console.ReadLine();
-                        noteData[noteData.ToArray().Length-1].StartsAt = (StringToInt(ans));
-                        Console.WriteLine("Note Created with value " + noteData.ToArray().Length.ToString());
-                        Thread.Sleep(3000);
-                        break;
-                    case "repl":
-                        Console.WriteLine("Note ID to replace");
-                        ans = Console.ReadLine();
-                        editID = StringToInt(ans)-1;
-                        Console.WriteLine("Pitch:");
-                        ans = Console.ReadLine();
-                        noteData[editID].Pitch = (StringToInt(ans));
-                        Console.WriteLine("Length:");
-                        ans = Console.ReadLine();
-                        noteData[editID].Length = (StringToInt(ans));
-                        Console.WriteLine("Starts At:");
-                        ans = Console.ReadLine();
-                        noteData[editID].StartsAt = (StringToInt(ans));
-                        Console.WriteLine("Note Replaced with value " + noteData.ToArray().Length.ToString());
-                        Thread.Sleep(3000);
-                        break;
-                    case "play":
-                        foreach (Note note in noteData)
-                        {
-                            if (note.StartsAt > duration)
-                            {
-                                duration = note.StartsAt;
-                            }
-                        }
-                        Console.WriteLine("Duration: " + duration.ToString());
-                        Console.WriteLine("Song Playing");
-                        for (int time = 0; time <= duration; time++)
-                        {
-                            foreach (Note note in noteData)
-                            {
-                                if (note.StartsAt == time)
-                                {
-                                    Console.Beep(note.Pitch, note.Length);
-                                }
-                                Thread.Sleep(1);
-                            }
-                        }
-                        Console.WriteLine("Song Stopped");
-                        break;
-                    default:
-                        Console.WriteLine(actn + " isn't an action.");
-                        break;
-                }
-            }
-        }
-        static int StringToInt(string s)
-        {
-            int i;
-            if (int.TryParse(s, out i) == true)
-            {
-                return i;
-            } else
-            {
-                return 0;
-            }
-        }
-    }
-    class Note
-    {
-        int pitch;
-        public int Pitch
-        {
-            get
-            {
-                return pitch;
-            } set
-            {
-                pitch = value;
-            }
-        }
-        int length;
-        public int Length
-        {
-            get
-            {
-                return length;
-            }
-            set
-            {
-                length = value;
-            }
-        }
-        int startsAt;
-        public int StartsAt
-        {
-            get
-            {
-                return startsAt;
-            }
-            set
-            {
-                startsAt = value;
-            }
-        }
-    }
-}


Fixed the recursion test, subfolder ordering was adjusted

--- StyleCopCmd.Core.Test/ReportBuilderTest.cs
+++ StyleCopCmd.Core.Test/ReportBuilderTest.cs
@@ -266,10 +266,11 @@
                             .WithRecursion();

             var result = ExecuteTest(report, null);
-            Assert.AreEqual(3, result.Count, BasePath);
-            Assert.AreEqual("7 violations encountered.", result[0]);
-            Assert.IsTrue(result[1].EndsWith("ClassOne.cs"), result[1]);
-            Assert.IsTrue(result[2].EndsWith("ClassTwo.cs"), result[2]);
+            Assert.AreEqual(4, result.Count, BasePath);
+            Assert.AreEqual("8 violations encountered.", result[0]);
+            Assert.IsTrue(result[1].EndsWith("ClassOne.cs"), result[1]);
+            Assert.IsTrue(result[2].EndsWith("AssemblyInfo.cs"), result[2]);
+            Assert.IsTrue(result[3].EndsWith("ClassTwo.cs"), result[3]);
         }

         /// <summary>


Handle byte as integer, byte[] as string format=byte

--- Swashbuckle.Core/Swagger/SchemaRegistry.cs
+++ Swashbuckle.Core/Swagger/SchemaRegistry.cs
@@ -135,6 +135,8 @@

             switch (type.FullName)
             {
+                case "System.Byte":
+                case "System.SByte":
                 case "System.Int16":
                 case "System.UInt16":
                 case "System.Int32":
@@ -148,8 +150,8 @@
                 case "System.Double":
                 case "System.Decimal":
                     return new Schema { type = "number", format = "double" };
-                case "System.Byte":
-                case "System.SByte":
+                case "System.Byte[]":
+                case "System.SByte[]":
                     return new Schema { type = "string", format = "byte" };
                 case "System.Boolean":
                     return new Schema { type = "boolean" };


fix dungeons loading

fix dungeons loading

--- TCC.Core/Data/Databases/DungeonDatabase.cs
+++ TCC.Core/Data/Databases/DungeonDatabase.cs
@@ -36,7 +36,7 @@
                 var s = line.Split('\t');
                 var id = UInt32.Parse(s[0]);
                 var name = s[1];
-                var t = (DungeonTier)Enum.Parse(typeof(DungeonTier), s[2]);
+                //var t = (DungeonTier)Enum.Parse(typeof(DungeonTier), s[2]);

                 if (defs.ContainsKey(id))
                 {
@@ -45,7 +45,7 @@
                 }
                 else
                 {
-                    var dg = new Dungeon(id, name, t, 0, false);
+                    //var dg = new Dungeon(id, name, t, 0, false);
                 }
             }


Added Retry.WhileEmpty for strings

Added Retry.WhileEmpty for strings

--- src/FlaUI.Core/Tools/Retry.cs
+++ src/FlaUI.Core/Tools/Retry.cs
@@ -95,11 +95,19 @@
         }

         /// <summary>
-        /// Retries while return value from the given method evaluates to null or has no elements
+        /// Retries while return value from the given method evaluates to null or has no elements.
         /// </summary>
         public static T WhileEmpty<T>(Func<T> checkMethod, TimeSpan? timeout = null, TimeSpan? interval = null, bool throwOnTimeout = false, bool ignoreException = false) where T : IEnumerable
         {
             return While(checkMethod, r => r == null || !r.GetEnumerator().MoveNext(), timeout: timeout, interval: interval, throwOnTimeout: throwOnTimeout, ignoreException: ignoreException);
+        }
+
+        /// <summary>
+        /// Retries while return value from the given method is null or an empty string.
+        /// </summary>
+        public static string WhileEmpty(Func<string> checkMethod, TimeSpan? timeout = null, TimeSpan? interval = null, bool throwOnTimeout = false, bool ignoreException = false)
+        {
+            return While(checkMethod, r => String.IsNullOrEmpty(r), timeout: timeout, interval: interval, throwOnTimeout: throwOnTimeout, ignoreException: ignoreException);
         }

         /// <summary>


take the thrust limiter into account

take the thrust limiter into account

--- ksp_plugin_adapter/burn_editor.cs
+++ ksp_plugin_adapter/burn_editor.cs
@@ -184,7 +184,7 @@
     Vector3d reference_direction = vessel_.ReferenceTransform.up;
     double[] thrusts =
         (from engine in active_engines
-         select engine.maxThrust *
+         select engine.MaxThrustOutputVac(useThrustLimiter: true) *
              (from transform in engine.thrustTransforms
               select Math.Max(0,
                               Vector3d.Dot(reference_direction,


Update DataTableExtensions.cs

Update DataTableExtensions.cs

--- src/DataTableExtensions.cs
+++ src/DataTableExtensions.cs
@@ -4,6 +4,7 @@
 using System.Linq;
 using System.Runtime.Remoting.Metadata.W3cXsd2001;
 using System.Xml;
+using System.IO;

 namespace HallLibrary.Extensions
 {


Added delete multiple and delete all methods.

--- src/Dommel/DommelMapper.cs
+++ src/Dommel/DommelMapper.cs
@@ -30,6 +30,7 @@
         private static readonly IDictionary<Type, string> _insertQueryCache = new Dictionary<Type, string>();
         private static readonly IDictionary<Type, string> _updateQueryCache = new Dictionary<Type, string>();
         private static readonly IDictionary<Type, string> _deleteQueryCache = new Dictionary<Type, string>();
+        private static readonly IDictionary<Type, string> _deleteAllQueryCache = new Dictionary<Type, string>();

         /// <summary>
         /// Retrieves the entity of type <typeparamref name="TEntity"/> with the specified id.
@@ -1330,6 +1331,96 @@
         }

         /// <summary>
+        /// Deletes all entities of type <typeparamref name="TEntity"/> matching the specified predicate from the database.
+        /// Returns a value indicating whether the operation succeeded.
+        /// </summary>
+        /// <typeparam name="TEntity">The type of the entity.</typeparam>
+        /// <param name="connection">The connection to the database. This can either be open or closed.</param>
+        /// <param name="predicate">A predicate to filter which entities are deleted.</param>
+        /// <param name="transaction">Optional transaction for the command.</param>
+        /// <returns>A value indicating whether the delete operation succeeded.</returns>
+        public static bool DeleteMultiple<TEntity>(this IDbConnection connection, Expression<Func<TEntity, bool>> predicate, IDbTransaction transaction = null)
+        {
+            DynamicParameters parameters;
+            var sql = BuildDeleteMultipleQuery(predicate, out parameters);
+            return connection.Execute(sql, parameters, transaction) > 0;
+        }
+
+        /// <summary>
+        /// Deletes all entities of type <typeparamref name="TEntity"/> matching the specified predicate from the database.
+        /// Returns a value indicating whether the operation succeeded.
+        /// </summary>
+        /// <typeparam name="TEntity">The type of the entity.</typeparam>
+        /// <param name="connection">The connection to the database. This can either be open or closed.</param>
+        /// <param name="predicate">A predicate to filter which entities are deleted.</param>
+        /// <param name="transaction">Optional transaction for the command.</param>
+        /// <returns>A value indicating whether the delete operation succeeded.</returns>
+        public static async Task<bool> DeleteMultipleAsync<TEntity>(this IDbConnection connection, Expression<Func<TEntity, bool>> predicate, IDbTransaction transaction = null)
+        {
+            DynamicParameters parameters;
+            var sql = BuildDeleteMultipleQuery(predicate, out parameters);
+            return await connection.ExecuteAsync(sql, parameters, transaction) > 0;
+        }
+
+        private static string BuildDeleteMultipleQuery<TEntity>(Expression<Func<TEntity, bool>> predicate, out DynamicParameters parameters)
+        {
+            var type = typeof(TEntity);
+            string sql;
+            if (!_deleteAllQueryCache.TryGetValue(type, out sql))
+            {
+                var tableName = Resolvers.Table(type);
+                sql = $"delete from {tableName}";
+                _deleteAllQueryCache[type] = sql;
+            }
+
+            sql += new SqlExpression<TEntity>()
+                .Where(predicate)
+                .ToSql(out parameters);
+            return sql;
+        }
+
+        /// <summary>
+        /// Deletes all entities of type <typeparamref name="TEntity"/> from the database.
+        /// Returns a value indicating whether the operation succeeded.
+        /// </summary>
+        /// <typeparam name="TEntity">The type of the entity.</typeparam>
+        /// <param name="connection">The connection to the database. This can either be open or closed.</param>
+        /// <param name="transaction">Optional transaction for the command.</param>
+        /// <returns>A value indicating whether the delete operation succeeded.</returns>
+        public static bool DeleteAll<TEntity>(this IDbConnection connection, IDbTransaction transaction = null)
+        {
+            var sql = BuildDeleteAllQuery(typeof(TEntity));
+            return connection.Execute(sql, transaction: transaction) > 0;
+        }
+
+        /// <summary>
+        /// Deletes all entities of type <typeparamref name="TEntity"/> from the database.
+        /// Returns a value indicating whether the operation succeeded.
+        /// </summary>
+        /// <typeparam name="TEntity">The type of the entity.</typeparam>
+        /// <param name="connection">The connection to the database. This can either be open or closed.</param>
+        /// <param name="transaction">Optional transaction for the command.</param>
+        /// <returns>A value indicating whether the delete operation succeeded.</returns>
+        public static async Task<bool> DeleteAllAsync<TEntity>(this IDbConnection connection, IDbTransaction transaction = null)
+        {
+            var sql = BuildDeleteAllQuery(typeof(TEntity));
+            return await connection.ExecuteAsync(sql, transaction: transaction) > 0;
+        }
+
+        private static string BuildDeleteAllQuery(Type type)
+        {
+            string sql;
+            if (!_deleteAllQueryCache.TryGetValue(type, out sql))
+            {
+                var tableName = Resolvers.Table(type);
+                sql = $"delete from {tableName}";
+                _deleteAllQueryCache[type] = sql;
+            }
+
+            return sql;
+        }
+
+        /// <summary>
         /// Helper class for retrieving type metadata to build sql queries using configured resolvers.
         /// </summary>
         public static class Resolvers


- дописан раздел про шину сообщений

- дописан раздел про шину сообщений

--- ThinkingHomeSite/Views/Home/Plugins.cshtml
+++ ThinkingHomeSite/Views/Home/Plugins.cshtml
@@ -1,6 +1,7 @@
 @{
     ViewBag.Title = "Создание плагинов";
 }
+

@@ -765,8 +766,8 @@

             Плагин Listener имеет средства для передачи сообщений между сервером и клиентом (например, браузером), причем
             инициировать отправку сообщения может как клиент, так и сервер. В начале работы плагин Listener создает SignalR Hub
-            с именем messagequeuehub. В него можно отправлять сообщения с клиента и сервера и эти сообщения
-            будут получены всеми клиентами, подключенными в текущий момент.
+            (сейчас используется SignalR версии 2.2.0) с именем messagequeuehub. В него можно отправлять сообщения
+            с клиента и сервера и эти сообщения будут получены всеми клиентами, подключенными в текущий момент.

             Например, плагин, получающий информацию с датчиков температуры, при получении нового значения температуры
@@ -797,21 +798,48 @@

data – сериализованные в JSON данные.

-            Получение сообщения на клиенте и отправка сообщений со стороны клиента будут рассмотрены в разделе про разработку
-            интерфейса пользователя.
-

-
Настройка порта для плагина Listener

-

-            Вы можете указать порт, на котором будет работать плагин ThinkingHome.Plugins.Listener
-            в настройках приложения: в файле ThinkingHome.Service.exe.config, параметр
-            configuration/appSettings/add[@@key='Listener.Port'] (для тестового приложения настраивать порт
-            нужно в файле ThinkingHome.TestConsole.exe.config).
+            Чтобы получить отправленные сообщения в браузере: подключите на страницу библиотеки
+            jQuery и ASP.NET SignalR 2.2.0 (например, из
+            CDN).
+

+

+var connection = $.hubConnection(),
+    hub = connection.createHubProxy('messageQueueHub');
+
+// получение сообщений
+hub.on('serverMessage', function(message){
+    /* message:
+        {
+            "guid":"f7d14f74-b5d9-4439-926f-e30f4a686a77",
+            "timestamp":"2016-09-12T22:59:41.5679055+03:00",
+            "channel":"channel:name",
+            "data": { "field1": "value1", "field2": "value2"}
+        } */
+});
+
+// открываем соединение
+connection.start();
+
+// если подключаемся с другого домена, нужно добавить параметр jsonp: true
+// connection.start({ jsonp: true });
+
+// отправка сообщений
+hub.invoke("Send", channel, data);
+

+
Параметры плагина Listener

+

+            Вы можете настраивать параметры работы плагина ThinkingHome.Plugins.Listener
+            в настройках приложения: в файле ThinkingHome.Service.exe.config (параметры
+            тестового приложения находятся в файлк ThinkingHome.TestConsole.exe.config).

 <?xml version="1.0" encoding="utf-8" ?>
 <configuration>
     <appSettings>
+        <!-- номер порта -->
         <add key="Listener.Port" value="41831" />
+        <!-- разрешить/запретить отправку сообщений в шину с других доменов через JSONP -->
+        <add key="Listener.Hub.EnableJSONP" value="true" />
         ...
     </appSettings>
     ...


[TypeScript] Fixed emitter to output "string" instead of "String" in the d.ts. closes #283.

--- Translator/Emitter/TypeScript/EmitBlock.cs
+++ Translator/Emitter/TypeScript/EmitBlock.cs
@@ -201,12 +201,18 @@
                 return "Number";
             }

+            if (name == "String")
+            {
+                return "string";
+            }
+
             if (decodeRegex == null)
             {
                 replacements = new System.Collections.Generic.Dictionary<string, string>(4);
                 replacements.Add("\\(", "<");
                 replacements.Add("\\)", ">");
                 replacements.Add("Bridge.Int", "Number");
+                replacements.Add("String", "string");

                 decodeRegex = new Regex("(" + String.Join("|", replacements.Keys.ToArray()) + ")", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.Multiline);
             }