From b6e5baf520b6d6e9731dc60c2674d25865fa0964 Mon Sep 17 00:00:00 2001 From: MP Date: Mon, 22 Dec 2025 11:47:49 +0100 Subject: [PATCH 01/12] =?UTF-8?q?=E2=9C=A8=20=2025.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FemDesign.Core/Properties/GlobalAssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FemDesign.Core/Properties/GlobalAssemblyInfo.cs b/FemDesign.Core/Properties/GlobalAssemblyInfo.cs index 8490cc46..a395682f 100644 --- a/FemDesign.Core/Properties/GlobalAssemblyInfo.cs +++ b/FemDesign.Core/Properties/GlobalAssemblyInfo.cs @@ -23,5 +23,5 @@ // Revision // -[assembly: AssemblyVersion("24.3.0")] -[assembly: AssemblyFileVersion("24.3.0")] +[assembly: AssemblyVersion("25.0.0")] +[assembly: AssemblyFileVersion("25.0.0")] From 48ca79cbbc498aca346011d6e9dc9ad9850a27e3 Mon Sep 17 00:00:00 2001 From: MP Date: Wed, 7 Jan 2026 15:33:15 +0100 Subject: [PATCH 02/12] =?UTF-8?q?=F0=9F=86=99=20add=20run=20node=20input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pipe/FemDesignCreateResPoints.cs | 14 ++++++++++++++ .../Pipe/FemDesignDisconnect.cs | 13 +++++++++++++ .../Pipe/FemDesignGetCaseCombResults.cs | 15 +++++++++++++++ .../Pipe/FemDesignGetEigenfrequencyResults.cs | 16 ++++++++++++++++ .../Pipe/FemDesignGetFeaModel.cs | 14 ++++++++++++++ FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs | 15 +++++++++++++++ .../Pipe/FemDesignGetQuantities.cs | 15 +++++++++++++++ .../Pipe/FemDesignGetStabilityResults.cs | 16 ++++++++++++++++ FemDesign.Grasshopper/Pipe/FemDesignOpen.cs | 15 +++++++++++++++ .../Pipe/FemDesignResultFromBsc.cs | 15 +++++++++++++++ .../Pipe/FemDesignRunAnalysis.cs | 14 ++++++++++++++ FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs | 14 ++++++++++++++ FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs | 14 ++++++++++++++ .../Pipe/FemDesignSaveDocumentation.cs | 14 ++++++++++++++ FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs | 14 ++++++++++++++ .../Pipe/FemDesignSetGlobalCfg.cs | 14 ++++++++++++++ 16 files changed, 232 insertions(+) diff --git a/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs b/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs index 2bab0faf..9b01343e 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs @@ -24,6 +24,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); pManager.AddGenericParameter("ResultPoints", "ResultPoints", "ResultPoints.", GH_ParamAccess.list); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -41,9 +43,21 @@ protected override void SolveInstance(IGH_DataAccess DA) var resultPoints = new List(); DA.GetDataList("ResultPoints", resultPoints); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetDataList("Log", log); + DA.SetData("Success", false); + return; + } + // check inputs if (!resultPoints.Any()) throw new Exception("ResultPoints is empty."); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs b/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs index 6fdf5430..56d2aed8 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs @@ -17,6 +17,8 @@ public FemDesignDisconnect() : base("FEM-Design.Disconnect", "Disconnect", "Deta protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddGenericParameter("Connection", "Connection", "Connection handle to disconnect.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -30,9 +32,20 @@ protected override void SolveInstance(IGH_DataAccess DA) FemDesign.Grasshopper.FemDesignHubHandle handle = null; DA.GetData("Connection", ref handle); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { if (handle == null) diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs index a26e29d6..62d3f37b 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs @@ -36,6 +36,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddGenericParameter("Units", "Units", "Optional. Specify result units for specific types." + "Default Units are: Length.m, Angle.deg, SectionalData.m, Force.kN, Mass.kg, Displacement.m, Stress.Pa", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -69,10 +71,23 @@ protected override void SolveInstance(IGH_DataAccess DA) Options options = null; DA.GetData("Options", ref options); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; var resultsTree = new DataTree(); + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetDataTree(1, resultsTree); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { FemDesignConnectionHub.InvokeAsync(handle.Id, connection => diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs index 21ffebe3..7bd73573 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs @@ -33,6 +33,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Units", "Units", "Specify the Result Units for some specific type.\nDefault Units are: Length.m, Angle.deg, SectionalData.m, Force.kN, Mass.kg, Displacement.m, Stress.Pa", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -58,12 +60,26 @@ protected override void SolveInstance(IGH_DataAccess DA) Results.UnitResults units = null; DA.GetData("Units", ref units); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; var vibrationTree = new DataTree(); var frequencyTree = new DataTree(); + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetDataTree(1, vibrationTree); + DA.SetDataTree(2, frequencyTree); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + // check inputs if (handle == null) throw new Exception("Connection handle is null."); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs index e6c9db12..184b0669 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs @@ -22,6 +22,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); pManager.AddGenericParameter("Units", "Units", "Specify the Result Units for some specific type.\nDefault Units are: Length.m, Angle.deg, SectionalData.m, Force.kN, Mass.kg, Displacement.m, Stress.Pa", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -39,9 +41,21 @@ protected override void SolveInstance(IGH_DataAccess DA) Results.UnitResults units = null; DA.GetData("Units", ref units); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + bool success = false; FiniteElement feModel = null; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("FiniteElement", feModel); + DA.SetData("Success", false); + return; + } + try { if (handle == null) diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs index 0098d594..7dc10c1f 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs @@ -17,6 +17,8 @@ public class FemDesignGetModel : FEM_Design_API_Component protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -32,10 +34,23 @@ protected override void SolveInstance(IGH_DataAccess DA) FemDesign.Grasshopper.FemDesignHubHandle handle = null; DA.GetData("Connection", ref handle); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; Model model = null; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Model", model); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { FemDesignConnectionHub.InvokeAsync(handle.Id, conn => diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs index 984f8bc9..61795404 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs @@ -32,6 +32,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) nameof(ListProc.QuantityEstimationProfiledPanel), GH_ParamAccess.item); pManager.AddGenericParameter("Units", "Units", "Optional result units.", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -53,10 +55,23 @@ protected override void SolveInstance(IGH_DataAccess DA) Results.UnitResults units = null; DA.GetData("Units", ref units); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; var results = new List(); + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetDataList("Quantities", results); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + // check inputs if (string.IsNullOrWhiteSpace(resultTypeName)) throw new Exception("'QuantityType' is null or empty."); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs index 5eeb1552..5c2a87d1 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs @@ -35,6 +35,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Units", "Units", "Specify the Result Units for some specific type.\nDefault Units are: Length.m, Angle.deg, SectionalData.m, Force.kN, Mass.kg, Displacement.m, Stress.Pa", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -63,12 +65,26 @@ protected override void SolveInstance(IGH_DataAccess DA) Results.UnitResults units = null; DA.GetData("Units", ref units); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; var bucklingTree = new DataTree(); var critParameterTree = new DataTree(); + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetDataTree(1, bucklingTree); + DA.SetDataTree(2, critParameterTree); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { if (handle == null) diff --git a/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs b/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs index 95398b0f..19d046da 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs @@ -18,6 +18,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); pManager.AddGenericParameter("Model", "Model", "Model to open or file path.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -36,10 +38,23 @@ protected override void SolveInstance(IGH_DataAccess DA) dynamic modelIn = null; DA.GetData("Model", ref modelIn); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; Model modelOut = null; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Model", modelOut); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { // Block UI while invoking hub (acceptable per requirements) diff --git a/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs b/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs index 53a235ef..a5ddd0ee 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs @@ -25,6 +25,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager[pManager.ParamCount - 1].Optional = true; pManager.AddGenericParameter("Elements", "Elements", "Optional elements filter.", GH_ParamAccess.list); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -49,10 +51,23 @@ protected override void SolveInstance(IGH_DataAccess DA) var elements = new List(); DA.GetDataList("Elements", elements); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; var resultsTree = new DataTree(); + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetDataTree(1, resultsTree); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { FemDesignConnectionHub.InvokeAsync(handle.Id, connection => diff --git a/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs b/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs index 5b010d6a..48675939 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs @@ -19,6 +19,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); pManager.AddGenericParameter("Analysis", "Analysis", "Analysis settings.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -36,9 +38,21 @@ protected override void SolveInstance(IGH_DataAccess DA) Analysis analysis = null; DA.GetData("Analysis", ref analysis); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + // check inputs if (analysis == null) throw new Exception("'Analysis' input is null."); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs b/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs index adf7d47e..cf27941c 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs @@ -21,6 +21,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddGenericParameter("Design", "Design", "Design settings.", GH_ParamAccess.item); pManager.AddGenericParameter("DesignGroup", "DesignGroup", "Optional design groups.", GH_ParamAccess.list); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -41,9 +43,21 @@ protected override void SolveInstance(IGH_DataAccess DA) var designGroups = new List(); DA.GetDataList("DesignGroup", designGroups); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + // check inputs if (design == null) throw new Exception("'Design' input is null."); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs b/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs index 47a3bd85..c43e8685 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs @@ -18,6 +18,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) { pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); pManager.AddTextParameter("FilePath", "FilePath", "Save the model to .struxml or .str file.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -35,9 +37,21 @@ protected override void SolveInstance(IGH_DataAccess DA) string filePath = null; DA.GetData("FilePath", ref filePath); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + // check inputs if (string.IsNullOrWhiteSpace(filePath)) throw new Exception("'FilePath' is null or empty."); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs b/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs index 2dc99375..73f19aad 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs @@ -20,6 +20,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddTextParameter("Docx", "Docx", "Docx file path for the documentation output.", GH_ParamAccess.item); pManager.AddTextParameter("Template", "Template", ".dsc template file path.", GH_ParamAccess.item); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -40,9 +42,21 @@ protected override void SolveInstance(IGH_DataAccess DA) string template = null; DA.GetData("Template", ref template); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + // check inputs if (string.IsNullOrWhiteSpace(docx)) throw new Exception("'Docx' path is null or empty."); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs b/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs index 7e7e8a7c..b363fe93 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs @@ -21,6 +21,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); pManager.AddGenericParameter("Config", "Cfg", "Filepath of the configuration file or Config objects.\nIf file path is not provided, the component will read the cfg.xml file in the package manager library folder.\n%AppData%\\McNeel\\Rhinoceros\\packages\\7.0\\FemDesign\\", GH_ParamAccess.list); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -38,9 +40,21 @@ protected override void SolveInstance(IGH_DataAccess DA) var cfg = new List(); DA.GetDataList("Config", cfg); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { FemDesignConnectionHub.InvokeAsync(handle.Id, connection => diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs b/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs index bb17284c..df62c2af 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs @@ -21,6 +21,8 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); pManager.AddGenericParameter("GlobalConfig", "GlobCfg", "Filepath of global configuration file or GlobConfig objects.\nIf file path is not provided, the component will read the cmdglobalcfg.xml file in the package manager library folder.\n%AppData%\\McNeel\\Rhinoceros\\packages\\7.0\\FemDesign\\", GH_ParamAccess.list); pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; } protected override void RegisterOutputParams(GH_OutputParamManager pManager) @@ -38,9 +40,21 @@ protected override void SolveInstance(IGH_DataAccess DA) var globCfg = new List(); DA.GetDataList("GlobalConfig", globCfg); + bool runNode = true; + DA.GetData("RunNode", ref runNode); + var log = new List(); bool success = false; + if (!runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", log); + return; + } + try { FemDesignConnectionHub.InvokeAsync(handle.Id, connection => From e6ee13383f3fd95838853781e8fafe7d9d59d863 Mon Sep 17 00:00:00 2001 From: MP Date: Wed, 7 Jan 2026 17:52:47 +0100 Subject: [PATCH 03/12] =?UTF-8?q?=F0=9F=91=B7=20async/sync=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/FemDesignHybridComponent.cs | 217 +++++++++++++++ .../FemDesign.Grasshopper.csproj | 2 + .../Pipe/FemDesignCreateResPoints.cs | 122 +++++---- .../Pipe/FemDesignDisconnect.cs | 129 +++++---- .../Pipe/FemDesignGetCaseCombResults.cs | 209 ++++++++------- .../Pipe/FemDesignGetEigenfrequencyResults.cs | 178 +++++++------ .../Pipe/FemDesignGetFeaModel.cs | 98 ++++--- .../Pipe/FemDesignGetModel.cs | 166 +++++++----- .../Pipe/FemDesignGetQuantities.cs | 235 +++++++++-------- .../Pipe/FemDesignGetStabilityResults.cs | 196 ++++++++------ FemDesign.Grasshopper/Pipe/FemDesignOpen.cs | 159 ++++++----- .../Pipe/FemDesignResultFromBsc.cs | 244 +++++++++-------- .../Pipe/FemDesignRunAnalysis.cs | 114 ++++---- .../Pipe/FemDesignRunDesign.cs | 206 ++++++++------- FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs | 193 ++++++++------ .../Pipe/FemDesignSaveDocumentation.cs | 204 +++++++------- FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs | 249 ++++++++++-------- .../Pipe/FemDesignSetGlobalCfg.cs | 249 ++++++++++-------- .../Settings/FemDesignSettings.cs | 40 +++ FemDesign.Grasshopper/UI/LoadMainMenu.cs | 23 ++ 20 files changed, 1942 insertions(+), 1291 deletions(-) create mode 100644 FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs create mode 100644 FemDesign.Grasshopper/Settings/FemDesignSettings.cs diff --git a/FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs b/FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs new file mode 100644 index 00000000..4237c9e0 --- /dev/null +++ b/FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs @@ -0,0 +1,217 @@ +// https://strusoft.com/ +using Grasshopper.Kernel; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace FemDesign.Grasshopper +{ + /// + /// Base component that can run either synchronously or asynchronously + /// based on global FemDesignSettings.AsyncModeEnabled setting. + /// + /// In sync mode: executes immediately, blocking the UI. + /// In async mode: executes in a background task, allowing UI to remain responsive. + /// + public abstract class FemDesignHybridComponent : FEM_Design_API_Component + { + private CancellationTokenSource _cts; + private bool _isRunning; + private bool _hasResult; + private Exception _asyncException; + + protected FemDesignHybridComponent(string name, string nickname, string description, string category, string subCategory) + : base(name, nickname, description, category, subCategory) + { + } + + /// + /// Override this to collect input data from the DataAccess object. + /// Store the data in instance fields for use in ExecuteWork. + /// This is called on the UI thread before async execution starts. + /// + protected abstract void CollectInputData(IGH_DataAccess DA); + + /// + /// Override this to implement the actual work logic. + /// This runs on a background thread in async mode. + /// Use cancellationToken to check for cancellation in long-running operations. + /// Store results in instance fields for use in SetOutputData. + /// + protected abstract void ExecuteWork(CancellationToken cancellationToken); + + /// + /// Override this to set output data to the DataAccess object. + /// This is called on the UI thread after ExecuteWork completes. + /// + protected abstract void SetOutputData(IGH_DataAccess DA); + + /// + /// Override this to set default/empty output data when RunNode is false or an error occurs. + /// + protected virtual void SetDefaultOutputData(IGH_DataAccess DA) { } + + /// + /// Override this to check if the component should execute. + /// Return false to skip execution (e.g., when RunNode is false). + /// + protected virtual bool ShouldExecute() => true; + + protected override void SolveInstance(IGH_DataAccess DA) + { + if (FemDesignSettings.AsyncModeEnabled) + { + SolveAsync(DA); + } + else + { + // Sync mode: collect input data and execute + CollectInputData(DA); + + // Check if we should execute + if (!ShouldExecute()) + { + SetDefaultOutputData(DA); + return; + } + + SolveSync(DA); + } + } + + private void SolveSync(IGH_DataAccess DA) + { + Message = "Running..."; + + try + { + ExecuteWork(CancellationToken.None); + SetOutputData(DA); + Message = "Done"; + } + catch (Exception ex) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); + SetDefaultOutputData(DA); + Message = "Error"; + } + } + + private void SolveAsync(IGH_DataAccess DA) + { + // Second pass: we have results from the async operation + // DON'T collect input data here - we need to preserve the output data from ExecuteWork + if (_hasResult) + { + if (_asyncException != null) + { + AddRuntimeMessage(GH_RuntimeMessageLevel.Error, _asyncException.Message); + SetDefaultOutputData(DA); + Message = "Error"; + } + else + { + SetOutputData(DA); + Message = "Done"; + } + + // Reset state for next run + _hasResult = false; + _asyncException = null; + return; + } + + // Already running, wait for completion + if (_isRunning) + { + Message = "Processing..."; + return; + } + + // First pass: collect input data and start async work + CollectInputData(DA); + + // Check if we should execute + if (!ShouldExecute()) + { + SetDefaultOutputData(DA); + return; + } + + // Cancel any previous operation + _cts?.Cancel(); + _cts?.Dispose(); + _cts = new CancellationTokenSource(); + var token = _cts.Token; + + _isRunning = true; + _asyncException = null; + Message = "Processing..."; + + // Start background task + Task.Run(() => + { + try + { + ExecuteWork(token); + } + catch (OperationCanceledException) + { + // Cancelled - don't expire solution + _isRunning = false; + return; + } + catch (Exception ex) + { + _asyncException = ex; + } + finally + { + _isRunning = false; + _hasResult = true; + } + + // Schedule solution update on UI thread + Rhino.RhinoApp.InvokeOnUiThread((Action)(() => + { + ExpireSolution(true); + })); + }, token); + } + + protected override void BeforeSolveInstance() + { + base.BeforeSolveInstance(); + + // If async mode changed or new solve started, cancel any pending work + if (_isRunning && !_hasResult) + { + _cts?.Cancel(); + } + } + + public override void RemovedFromDocument(GH_Document document) + { + // Cancel any pending async work + _cts?.Cancel(); + _cts?.Dispose(); + _cts = null; + + base.RemovedFromDocument(document); + } + + public override void DocumentContextChanged(GH_Document document, GH_DocumentContext context) + { + base.DocumentContextChanged(document, context); + + // Cancel async work when document is closing + if (context == GH_DocumentContext.Close || context == GH_DocumentContext.Unloaded) + { + _cts?.Cancel(); + _cts?.Dispose(); + _cts = null; + } + } + } +} + diff --git a/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj b/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj index abd37177..99fff21f 100644 --- a/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj +++ b/FemDesign.Grasshopper/FemDesign.Grasshopper.csproj @@ -205,6 +205,8 @@ + + diff --git a/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs b/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs index 9b01343e..12b52070 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignCreateResPoints.cs @@ -2,8 +2,8 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using Grasshopper.Kernel; -using Grasshopper.Kernel.Data; using FemDesign.AuxiliaryResults; using FemDesign.Calculate; @@ -11,11 +11,20 @@ namespace FemDesign.Grasshopper { /// - /// Create result points using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeResultPoints behavior without the async workaround. + /// Create result points using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. /// - public class FemDesignCreateResPoints : FEM_Design_API_Component + public class FemDesignCreateResPoints : FemDesignHybridComponent { + // Input data + private FemDesignHubHandle _handle; + private List _resultPoints; + private bool _runNode; + + // Output data + private List _log; + private bool _success; + public FemDesignCreateResPoints() : base("FEM-Design.CreateResPoints", "CreateResPoints", "Create result points using the shared FEM-Design connection.", CategoryName.Name(), SubCategoryName.Cat8()) { } @@ -35,65 +44,76 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddBooleanParameter("Success", "Success", "True if operation succeeded.", GH_ParamAccess.item); } - protected override void SolveInstance(IGH_DataAccess DA) + protected override void CollectInputData(IGH_DataAccess DA) { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); + _handle = null; + DA.GetData("Connection", ref _handle); - var resultPoints = new List(); - DA.GetDataList("ResultPoints", resultPoints); + _resultPoints = new List(); + DA.GetDataList("ResultPoints", _resultPoints); - bool runNode = true; - DA.GetData("RunNode", ref runNode); + _runNode = true; + DA.GetData("RunNode", ref _runNode); - var log = new List(); - bool success = false; + // Reset output data + _log = new List(); + _success = false; + } - if (!runNode) + protected override bool ShouldExecute() + { + if (!_runNode) { this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetDataList("Log", log); - DA.SetData("Success", false); - return; + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; } + return true; + } - // check inputs - if (!resultPoints.Any()) - throw new Exception("ResultPoints is empty."); + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); - try - { - if (handle == null) - throw new Exception("Connection handle is null."); + // Check inputs + if (!_resultPoints.Any()) + throw new Exception("ResultPoints is empty."); - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - var resPoints = resultPoints.Select(x => (CmdResultPoint)x).ToList(); - connection.CreateResultPoint(resPoints); - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + var resPoints = _resultPoints.Select(x => (CmdResultPoint)x).ToList(); + connection.CreateResultPoint(resPoints); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); - DA.SetData("Connection", handle); - DA.SetDataList("Log", log); - DA.SetData("Success", success); + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetDataList("Log", _log); + DA.SetData("Success", _success); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetDataList("Log", _log ?? new List()); + DA.SetData("Success", false); } protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; @@ -101,5 +121,3 @@ protected override void SolveInstance(IGH_DataAccess DA) public override GH_Exposure Exposure => GH_Exposure.tertiary; } } - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs b/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs index 56d2aed8..12f7ebbd 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignDisconnect.cs @@ -1,73 +1,92 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { - /// - /// Disconnects a specific FEM-Design hub connection (standard GH_Component, UI-blocking). - /// - public class FemDesignDisconnect : FEM_Design_API_Component - { - public FemDesignDisconnect() : base("FEM-Design.Disconnect", "Disconnect", "Detach and close the connection, but keeps open FEM-Design.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } + /// + /// Disconnects a specific FEM-Design hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignDisconnect : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private bool _runNode; - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Connection handle to disconnect.", GH_ParamAccess.item); - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } + // Output data + private List _log; + private bool _success; - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddBooleanParameter("Success", "Success", "True if disconnect succeeded.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } + public FemDesignDisconnect() : base("FEM-Design.Disconnect", "Disconnect", "Detach and close the connection, but keeps open FEM-Design.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesign.Grasshopper.FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Connection handle to disconnect.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } - bool runNode = true; - DA.GetData("RunNode", ref runNode); + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddBooleanParameter("Success", "Success", "True if disconnect succeeded.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } - var log = new List(); - bool success = false; + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } + _runNode = true; + DA.GetData("RunNode", ref _runNode); - try - { - if (handle == null) - throw new Exception("'Connection' handle is null."); - - FemDesignConnectionHub.DisposeAsync(handle.Id, true).GetAwaiter().GetResult(); - success = true; - } - catch (Exception ex) - { - log.Add(ex.Message); - success = false; - } + // Reset output data + _log = new List(); + _success = false; + } - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } + protected override bool ShouldExecute() + { + if (!_runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_Disconnect; - public override Guid ComponentGuid => new Guid("{5A52243F-4136-48F0-9279-3E7E3DF82D2E}"); - public override GH_Exposure Exposure => GH_Exposure.primary; - } -} + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + FemDesignConnectionHub.DisposeAsync(_handle.Id, true).GetAwaiter().GetResult(); + _success = true; + } + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_Disconnect; + public override Guid ComponentGuid => new Guid("{5A52243F-4136-48F0-9279-3E7E3DF82D2E}"); + public override GH_Exposure Exposure => GH_Exposure.primary; + } +} diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs index 62d3f37b..dfba4d23 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetCaseCombResults.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Threading; using Grasshopper; using Grasshopper.Kernel; using Grasshopper.Kernel.Data; @@ -12,11 +13,26 @@ namespace FemDesign.Grasshopper { /// - /// Read load cases and load combinations results using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeReadResults logic but executes via FemDesignConnectionHub. + /// Read load cases and load combinations results using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. /// - public class FemDesignGetCaseCombResults : FEM_Design_API_Component + public class FemDesignGetCaseCombResults : FemDesignHybridComponent { + // Input data + private FemDesignHubHandle _handle; + private List _resultTypes; + private List _caseNames; + private List _comboNames; + private List _elements; + private Results.UnitResults _units; + private Options _options; + private bool _runNode; + + // Output data + private DataTree _resultsTree; + private List _log; + private bool _success; + public FemDesignGetCaseCombResults() : base("FEM-Design.GetCaseCombResults", "CaseCombResults", "Read load cases and load combinations results from current model using shared connection. Result files (.csv) are saved into the output directory.", CategoryName.Name(), SubCategoryName.Cat8()) { } @@ -48,121 +64,135 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); } - protected override void SolveInstance(IGH_DataAccess DA) + protected override void CollectInputData(IGH_DataAccess DA) { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); + _handle = null; + DA.GetData("Connection", ref _handle); - var resultTypes = new List(); - DA.GetDataList("ResultType", resultTypes); + _resultTypes = new List(); + DA.GetDataList("ResultType", _resultTypes); - var caseNames = new List(); - DA.GetDataList("Case Name", caseNames); + _caseNames = new List(); + DA.GetDataList("Case Name", _caseNames); - var comboNames = new List(); - DA.GetDataList("Combination Name", comboNames); + _comboNames = new List(); + DA.GetDataList("Combination Name", _comboNames); - var elements = new List(); - DA.GetDataList("Elements", elements); + _elements = new List(); + DA.GetDataList("Elements", _elements); - Results.UnitResults units = null; - DA.GetData("Units", ref units); + _units = null; + DA.GetData("Units", ref _units); - Options options = null; - DA.GetData("Options", ref options); + _options = null; + DA.GetData("Options", ref _options); - bool runNode = true; - DA.GetData("RunNode", ref runNode); + _runNode = true; + DA.GetData("RunNode", ref _runNode); - var log = new List(); - bool success = false; - var resultsTree = new DataTree(); + // Reset output data + _resultsTree = new DataTree(); + _log = new List(); + _success = false; + } - if (!runNode) + protected override bool ShouldExecute() + { + if (!_runNode) { this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetDataTree(1, resultsTree); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); - try + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try + cancellationToken.ThrowIfCancellationRequested(); + + int resIndex = 0; + foreach (var rt in _resultTypes) { - int resIndex = 0; - foreach (var rt in resultTypes) - { - int caseIndex = 0; - int combIndex = 0; + int caseIndex = 0; + int combIndex = 0; - string typeName = $"FemDesign.Results.{rt}, FemDesign.Core"; - Type resultType = Type.GetType(typeName); - + string typeName = $"FemDesign.Results.{rt}, FemDesign.Core"; + Type resultType = Type.GetType(typeName); - // Helper to invoke private generic methods on FemDesignConnection - List InvokeGeneric(string methodName, Type genericType, object[] args) - { - var mi = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(genericType); - var res = (IEnumerable)mi.Invoke(connection, args); - return res.ToList(); - } + // Helper to invoke private generic methods on FemDesignConnection + List InvokeGeneric(string methodName, Type genericType, object[] args) + { + var mi = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(genericType); + var res = (IEnumerable)mi.Invoke(connection, args); + return res.ToList(); + } - if (!comboNames.Any() && !caseNames.Any()) - { - var res = InvokeGeneric(nameof(FemDesign.FemDesignConnection._getResults), resultType, new object[] { units, options, elements, true }); - resultsTree.AddRange(res, new GH_Path(resIndex)); - } + if (!_comboNames.Any() && !_caseNames.Any()) + { + var res = InvokeGeneric(nameof(FemDesign.FemDesignConnection._getResults), resultType, new object[] { _units, _options, _elements, true }); + _resultsTree.AddRange(res, new GH_Path(resIndex)); + } - if (caseNames.Any()) + if (_caseNames.Any()) + { + foreach (var c in _caseNames) { - foreach (var c in caseNames) - { - var res = InvokeGeneric(nameof(FemDesign.FemDesignConnection._getLoadCaseResults), resultType, new object[] { new List { c }, elements, units, options, true }); - resultsTree.AddRange(res, new GH_Path(resIndex, caseIndex)); - caseIndex++; - } + var res = InvokeGeneric(nameof(FemDesign.FemDesignConnection._getLoadCaseResults), resultType, new object[] { new List { c }, _elements, _units, _options, true }); + _resultsTree.AddRange(res, new GH_Path(resIndex, caseIndex)); + caseIndex++; } + } - if (comboNames.Any()) + if (_comboNames.Any()) + { + combIndex = caseIndex; + foreach (var cmb in _comboNames) { - combIndex = caseIndex; - foreach (var cmb in comboNames) - { - var res = InvokeGeneric(nameof(FemDesign.FemDesignConnection._getLoadCombinationResults), resultType, new object[] { new List { cmb }, elements, units, options, true }); - resultsTree.AddRange(res, new GH_Path(resIndex, combIndex)); - combIndex++; - } + var res = InvokeGeneric(nameof(FemDesign.FemDesignConnection._getLoadCombinationResults), resultType, new object[] { new List { cmb }, _elements, _units, _options, true }); + _resultsTree.AddRange(res, new GH_Path(resIndex, combIndex)); + combIndex++; } - - resIndex++; } + + resIndex++; } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.InnerException?.Message ?? ex.Message); - success = false; - } + _success = true; + } - DA.SetData("Connection", handle); - DA.SetDataTree(1, resultsTree); - DA.SetData("Success", success); - DA.SetDataList("Log", log); + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetDataTree(1, _resultsTree); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetDataTree(1, new DataTree()); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); } protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; @@ -170,6 +200,3 @@ protected override void SolveInstance(IGH_DataAccess DA) public override GH_Exposure Exposure => GH_Exposure.tertiary; } } - - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs index 7bd73573..32e85254 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetEigenfrequencyResults.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Threading; using Grasshopper; using Grasshopper.Kernel; @@ -15,11 +16,24 @@ namespace FemDesign.Grasshopper { /// - /// Read eigenfrequency results using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeEigenFrequencyResults behavior without the async workaround. + /// Read eigenfrequency results using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. /// - public class FemDesignGetEigenfrequencyResults : FEM_Design_API_Component + public class FemDesignGetEigenfrequencyResults : FemDesignHybridComponent { + // Input data + private FemDesignHubHandle _handle; + private List _shapeIds; + private Options _options; + private Results.UnitResults _units; + private bool _runNode; + + // Output data + private DataTree _vibrationTree; + private DataTree _frequencyTree; + private List _log; + private bool _success; + public FemDesignGetEigenfrequencyResults() : base("FEM-Design.GetEigenfrequencyResults", "EigenfrequencyResults", "Read eigenfrequency results from current model using shared connection. Result files (.csv) are saved into the output directory.", CategoryName.Name(), SubCategoryName.Cat8()) { } @@ -46,99 +60,109 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); } - protected override void SolveInstance(IGH_DataAccess DA) + protected override void CollectInputData(IGH_DataAccess DA) { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - var shapeIds = new List(); - DA.GetDataList("ShapeId", shapeIds); + _handle = null; + DA.GetData("Connection", ref _handle); - Options options = null; - DA.GetData("Options", ref options); + _shapeIds = new List(); + DA.GetDataList("ShapeId", _shapeIds); - Results.UnitResults units = null; - DA.GetData("Units", ref units); + _options = null; + DA.GetData("Options", ref _options); - bool runNode = true; - DA.GetData("RunNode", ref runNode); + _units = null; + DA.GetData("Units", ref _units); - var log = new List(); - bool success = false; + _runNode = true; + DA.GetData("RunNode", ref _runNode); - var vibrationTree = new DataTree(); - var frequencyTree = new DataTree(); + // Reset output data + _vibrationTree = new DataTree(); + _frequencyTree = new DataTree(); + _log = new List(); + _success = false; + } - if (!runNode) + protected override bool ShouldExecute() + { + if (!_runNode) { this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetDataTree(1, vibrationTree); - DA.SetDataTree(2, frequencyTree); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; + return false; } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } - // check inputs - if (handle == null) - throw new Exception("Connection handle is null."); + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); - try + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try + cancellationToken.ThrowIfCancellationRequested(); + + // Helper to invoke private generic _getResults + List InvokeGetResults(Type resultType) { - // helper to invoke private generic _getResults - List InvokeGetResults(Type resultType) - { - string methodName = nameof(FemDesign.FemDesignConnection._getResults); - MethodInfo genericMethod = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(resultType); - var res = (IEnumerable)genericMethod.Invoke(connection, new object[] { units, options, null, false }); - return res.ToList(); - } - - var vibrationRes = InvokeGetResults(typeof(FemDesign.Results.NodalVibration)).Cast().ToList(); - var frequencyRes = InvokeGetResults(typeof(FemDesign.Results.EigenFrequencies)).Cast().ToList(); - - if (vibrationRes.Count == 0 && frequencyRes.Count == 0) - throw new Exception("Eigenfrequencies results have not been found. Have you run the eigenfrequencies analysis?"); - - string vibPropName = nameof(FemDesign.Results.NodalVibration.ShapeId); - string freqPropName = nameof(FemDesign.Results.EigenFrequencies.ShapeId); - - if (shapeIds.Any()) - { - vibrationRes = vibrationRes.FilterResultsByShapeId(vibPropName, shapeIds); - frequencyRes = frequencyRes.FilterResultsByShapeId(freqPropName, shapeIds); - } - - vibrationTree = vibrationRes.CreateResultTree(vibPropName); - frequencyTree = frequencyRes.CreateResultTree(freqPropName); + string methodName = nameof(FemDesign.FemDesignConnection._getResults); + MethodInfo genericMethod = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(resultType); + var res = (IEnumerable)genericMethod.Invoke(connection, new object[] { _units, _options, null, false }); + return res.ToList(); } - finally + + var vibrationRes = InvokeGetResults(typeof(FemDesign.Results.NodalVibration)).Cast().ToList(); + var frequencyRes = InvokeGetResults(typeof(FemDesign.Results.EigenFrequencies)).Cast().ToList(); + + if (vibrationRes.Count == 0 && frequencyRes.Count == 0) + throw new Exception("Eigenfrequencies results have not been found. Have you run the eigenfrequencies analysis?"); + + string vibPropName = nameof(FemDesign.Results.NodalVibration.ShapeId); + string freqPropName = nameof(FemDesign.Results.EigenFrequencies.ShapeId); + + if (_shapeIds.Any()) { - connection.OnOutput -= onOutput; + vibrationRes = vibrationRes.FilterResultsByShapeId(vibPropName, _shapeIds); + frequencyRes = frequencyRes.FilterResultsByShapeId(freqPropName, _shapeIds); } - }).GetAwaiter().GetResult(); - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } + _vibrationTree = vibrationRes.CreateResultTree(vibPropName); + _frequencyTree = frequencyRes.CreateResultTree(freqPropName); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } - DA.SetData("Connection", handle); - DA.SetDataTree(1, vibrationTree); - DA.SetDataTree(2, frequencyTree); - DA.SetData("Success", success); - DA.SetDataList("Log", log); + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetDataTree(1, _vibrationTree); + DA.SetDataTree(2, _frequencyTree); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetDataTree(1, new DataTree()); + DA.SetDataTree(2, new DataTree()); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); } protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; @@ -146,5 +170,3 @@ List InvokeGetResults(Type resultType) public override GH_Exposure Exposure => GH_Exposure.tertiary; } } - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs index 184b0669..71005a53 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetFeaModel.cs @@ -1,6 +1,7 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; using FemDesign.Results; @@ -8,11 +9,20 @@ namespace FemDesign.Grasshopper { /// - /// Read the finite element model using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeGetFeaModel behavior without the async workaround. + /// Read the finite element model using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. /// - public class FemDesignGetFeaModel : FEM_Design_API_Component + public class FemDesignGetFeaModel : FemDesignHybridComponent { + // Input data + private FemDesignHubHandle _handle; + private Results.UnitResults _units; + private bool _runNode; + + // Output data + private FiniteElement _feModel; + private bool _success; + public FemDesignGetFeaModel() : base("FEM-Design.GetFeModel", "GetFeModel", "Read the finite element data using the shared FEM-Design connection.", CategoryName.Name(), SubCategoryName.Cat8()) { } @@ -33,54 +43,66 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddBooleanParameter("Success", "Success", "True if operation succeeded.", GH_ParamAccess.item); } - protected override void SolveInstance(IGH_DataAccess DA) + protected override void CollectInputData(IGH_DataAccess DA) { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); + _handle = null; + DA.GetData("Connection", ref _handle); - Results.UnitResults units = null; - DA.GetData("Units", ref units); + _units = null; + DA.GetData("Units", ref _units); - bool runNode = true; - DA.GetData("RunNode", ref runNode); + _runNode = true; + DA.GetData("RunNode", ref _runNode); - bool success = false; - FiniteElement feModel = null; + // Reset output data + _feModel = null; + _success = false; + } - if (!runNode) + protected override bool ShouldExecute() + { + if (!_runNode) { this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("FiniteElement", feModel); - DA.SetData("Success", false); - return; + return false; } - - try + if (_handle == null) { - if (handle == null) - throw new Exception("Connection handle is null."); + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } - if (units == null) - units = Results.UnitResults.Default(); + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - connection.GenerateFeaModel(); - feModel = connection.GetFeaModel(units.Length); - }).GetAwaiter().GetResult(); + if (_units == null) + _units = Results.UnitResults.Default(); - success = true; - } - catch (Exception ex) + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - success = false; - } + cancellationToken.ThrowIfCancellationRequested(); + connection.GenerateFeaModel(); + _feModel = connection.GetFeaModel(_units.Length); + }).GetAwaiter().GetResult(); - DA.SetData("Connection", handle); - DA.SetData("FiniteElement", feModel); - DA.SetData("Success", success); + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("FiniteElement", _feModel); + DA.SetData("Success", _success); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("FiniteElement", null); + DA.SetData("Success", false); } protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_GetMesh; @@ -88,5 +110,3 @@ protected override void SolveInstance(IGH_DataAccess DA) public override GH_Exposure Exposure => GH_Exposure.tertiary; } } - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs index 7dc10c1f..279d4730 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetModel.cs @@ -1,92 +1,114 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { - /// - /// Get the current open model using the shared hub connection (standard GH_Component, UI-blocking). - /// - public class FemDesignGetModel : FEM_Design_API_Component - { - public FemDesignGetModel() : base("FEM-Design.GetModel", "GetModel", "Get the current open model in FEM-Design using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } + /// + /// Get the current open model using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignGetModel : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private bool _runNode; - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } + // Output data + private Model _model; + private List _log; + private bool _success; - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddGenericParameter("Model", "Model", "Current FEM-Design model.", GH_ParamAccess.item); - pManager.AddBooleanParameter("Success", "Success", "True if succeeded.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } + public FemDesignGetModel() : base("FEM-Design.GetModel", "GetModel", "Get the current open model in FEM-Design using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesign.Grasshopper.FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } - bool runNode = true; - DA.GetData("RunNode", ref runNode); + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddGenericParameter("Model", "Model", "Current FEM-Design model.", GH_ParamAccess.item); + pManager.AddBooleanParameter("Success", "Success", "True if succeeded.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } - var log = new List(); - bool success = false; - Model model = null; + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Model", model); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } + _runNode = true; + DA.GetData("RunNode", ref _runNode); - try - { - FemDesignConnectionHub.InvokeAsync(handle.Id, conn => - { - void onOutput(string s) { log.Add(s); } - conn.OnOutput += onOutput; - try - { - model = conn.GetModel(); - } - finally - { - conn.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); + // Reset output data + _model = null; + _log = new List(); + _success = false; + } - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } + protected override bool ShouldExecute() + { + if (!_runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } - DA.SetData("Connection", handle); - DA.SetData("Model", model); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; - public override Guid ComponentGuid => new Guid("{65B2948C-4F04-4038-AC14-694091005DC5}"); - public override GH_Exposure Exposure => GH_Exposure.primary; - } -} + FemDesignConnectionHub.InvokeAsync(_handle.Id, conn => + { + void onOutput(string s) { _log.Add(s); } + conn.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + _model = conn.GetModel(); + } + finally + { + conn.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Model", _model); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Model", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; + public override Guid ComponentGuid => new Guid("{65B2948C-4F04-4038-AC14-694091005DC5}"); + public override GH_Exposure Exposure => GH_Exposure.primary; + } +} diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs index 61795404..2fa866c6 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetQuantities.cs @@ -2,26 +2,38 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Threading; using Grasshopper.Kernel; using FemDesign.Calculate; namespace FemDesign.Grasshopper { - /// - /// Get quantities using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeGetQuantities behavior. - /// - public class FemDesignGetQuantities: FEM_Design_API_Component - { - public FemDesignGetQuantities() : base("FEM-Design.GetQuantities", "GetQuantities", "Get quantities from current model using shared connection. Result files (.csv) are saved into the output directory.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } - - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddTextParameter("QuantityType", "QuantityType", "Quantity type:\n\n" + + /// + /// Get quantities using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignGetQuantities : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private string _resultTypeName; + private Results.UnitResults _units; + private bool _runNode; + + // Output data + private List _results; + private List _log; + private bool _success; + + public FemDesignGetQuantities() : base("FEM-Design.GetQuantities", "GetQuantities", "Get quantities from current model using shared connection. Result files (.csv) are saved into the output directory.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddTextParameter("QuantityType", "QuantityType", "Quantity type:\n\n" + nameof(ListProc.QuantityEstimationConcrete) + "\n" + nameof(ListProc.QuantityEstimationReinforcement) + "\n" + nameof(ListProc.QuantityEstimationSteel) + "\n" + @@ -30,97 +42,108 @@ protected override void RegisterInputParams(GH_InputParamManager pManager) nameof(ListProc.QuantityEstimationMasonry) + "\n" + nameof(ListProc.QuantityEstimationGeneral) + "\n" + nameof(ListProc.QuantityEstimationProfiledPanel), GH_ParamAccess.item); - pManager.AddGenericParameter("Units", "Units", "Optional result units.", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } - - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddGenericParameter("Quantities", "Quantities", "Quantities.", GH_ParamAccess.list); - pManager.AddBooleanParameter("Success", "Success", "True if succeeded.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } - - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesign.Grasshopper.FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - string resultTypeName = null; - DA.GetData("QuantityType", ref resultTypeName); - - Results.UnitResults units = null; - DA.GetData("Units", ref units); - - bool runNode = true; - DA.GetData("RunNode", ref runNode); - - var log = new List(); - bool success = false; - var results = new List(); - - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetDataList("Quantities", results); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } - - // check inputs - if (string.IsNullOrWhiteSpace(resultTypeName)) - throw new Exception("'QuantityType' is null or empty."); - - // try getting the quantity result type - string typeName = $"FemDesign.Results.{resultTypeName}, FemDesign.Core"; + pManager.AddGenericParameter("Units", "Units", "Optional result units.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddGenericParameter("Quantities", "Quantities", "Quantities.", GH_ParamAccess.list); + pManager.AddBooleanParameter("Success", "Success", "True if succeeded.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } + + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); + + _resultTypeName = null; + DA.GetData("QuantityType", ref _resultTypeName); + + _units = null; + DA.GetData("Units", ref _units); + + _runNode = true; + DA.GetData("RunNode", ref _runNode); + + // Reset output data + _results = new List(); + _log = new List(); + _success = false; + } + + protected override bool ShouldExecute() + { + if (!_runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + // Check inputs + if (string.IsNullOrWhiteSpace(_resultTypeName)) + throw new Exception("'QuantityType' is null or empty."); + + // Try getting the quantity result type + string typeName = $"FemDesign.Results.{_resultTypeName}, FemDesign.Core"; Type resultType = Type.GetType(typeName); - if (resultType == null) - throw new ArgumentException($"QuantityType '{typeName}' does not exist!"); - - try - { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - var methodName = nameof(FemDesign.FemDesignConnection._getQuantities); - var method = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(resultType); - var res = (IEnumerable)method.Invoke(connection, new object[] { units, false }); - results.AddRange(res); - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } - - DA.SetData("Connection", handle); - DA.SetDataList("Quantities", results); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } - - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; - public override Guid ComponentGuid => new Guid("{4498FBC1-1EA9-4885-8658-FF79652C51CB}"); - public override GH_Exposure Exposure => GH_Exposure.tertiary; - } + if (resultType == null) + throw new ArgumentException($"QuantityType '{typeName}' does not exist!"); + + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + var methodName = nameof(FemDesign.FemDesignConnection._getQuantities); + var method = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(resultType); + var res = (IEnumerable)method.Invoke(connection, new object[] { _units, false }); + _results.AddRange(res); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetDataList("Quantities", _results); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetDataList("Quantities", new List()); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; + public override Guid ComponentGuid => new Guid("{4498FBC1-1EA9-4885-8658-FF79652C51CB}"); + public override GH_Exposure Exposure => GH_Exposure.tertiary; + } } - - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs b/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs index 5c2a87d1..b55fc89c 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignGetStabilityResults.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Threading; using Grasshopper; using Grasshopper.Kernel; @@ -15,11 +16,25 @@ namespace FemDesign.Grasshopper { /// - /// Read stability results using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeStabilityResults behavior without the async workaround. + /// Read stability results using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. /// - public class FemDesignGetStabilityResults : FEM_Design_API_Component + public class FemDesignGetStabilityResults : FemDesignHybridComponent { + // Input data + private FemDesignHubHandle _handle; + private List _combos; + private List _shapeIds; + private Options _options; + private Results.UnitResults _units; + private bool _runNode; + + // Output data + private DataTree _bucklingTree; + private DataTree _critParameterTree; + private List _log; + private bool _success; + public FemDesignGetStabilityResults() : base("FEM-Design.GetStabilityResults", "StabilityResults", "Read stability results from current model using shared connection. Result files (.csv) are saved into the output directory.", CategoryName.Name(), SubCategoryName.Cat8()) { } @@ -48,104 +63,115 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); } - protected override void SolveInstance(IGH_DataAccess DA) + protected override void CollectInputData(IGH_DataAccess DA) { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - var combos = new List(); - DA.GetDataList("Combination Name", combos); + _handle = null; + DA.GetData("Connection", ref _handle); - var shapeIds = new List(); - DA.GetDataList("ShapeId", shapeIds); + _combos = new List(); + DA.GetDataList("Combination Name", _combos); - Options options = null; - DA.GetData("Options", ref options); + _shapeIds = new List(); + DA.GetDataList("ShapeId", _shapeIds); - Results.UnitResults units = null; - DA.GetData("Units", ref units); + _options = null; + DA.GetData("Options", ref _options); - bool runNode = true; - DA.GetData("RunNode", ref runNode); + _units = null; + DA.GetData("Units", ref _units); - var log = new List(); - bool success = false; + _runNode = true; + DA.GetData("RunNode", ref _runNode); - var bucklingTree = new DataTree(); - var critParameterTree = new DataTree(); + // Reset output data + _bucklingTree = new DataTree(); + _critParameterTree = new DataTree(); + _log = new List(); + _success = false; + } - if (!runNode) + protected override bool ShouldExecute() + { + if (!_runNode) { this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetDataTree(1, bucklingTree); - DA.SetDataTree(2, critParameterTree); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; + return false; } - - try + if (_handle == null) { - if (handle == null) - throw new Exception("Connection handle is null."); + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - // helper to invoke private generic _getStabilityResults - List InvokeStabilityResults(Type resultType, string loadCombination = null, int? shapeId = null) - { - string methodName = nameof(FemDesign.FemDesignConnection._getStabilityResults); - MethodInfo genericMethod = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(resultType); - var shapeList = shapeId.HasValue ? new List { shapeId.Value } : null; - var combList = loadCombination != null ? new List { loadCombination } : null; - var res = (IEnumerable)genericMethod.Invoke(connection, new object[] { combList, shapeList, units, options, false }); - return res.ToList(); - } - - // read full result sets - var bucklingRes = InvokeStabilityResults(typeof(FemDesign.Results.NodalBucklingShape)).Cast().ToList(); - var critParamRes = InvokeStabilityResults(typeof(FemDesign.Results.CriticalParameter)).Cast().ToList(); - - if (bucklingRes.Count == 0) - throw new Exception("Stability results have not been found. Have you run the Stability analysis?"); - - // validate filters - ValidateCombos(bucklingRes, combos); - ValidateShapes(bucklingRes, shapeIds); - - // build trees and filter - var rawBucklingTree = CreateBucklingTree(bucklingRes); - bucklingTree = FilterBucklingTree(rawBucklingTree, combos, shapeIds); - - string critParamPropName = nameof(CriticalParameter.CaseIdentifier); - var rawCritTree = critParamRes.CreateResultTree(critParamPropName); - critParameterTree = FilterCriticalTree(rawCritTree, combos, shapeIds); - } - finally + cancellationToken.ThrowIfCancellationRequested(); + + // Helper to invoke private generic _getStabilityResults + List InvokeStabilityResults(Type resultType, string loadCombination = null, int? shapeId = null) { - connection.OnOutput -= onOutput; + string methodName = nameof(FemDesign.FemDesignConnection._getStabilityResults); + MethodInfo genericMethod = connection.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic).MakeGenericMethod(resultType); + var shapeList = shapeId.HasValue ? new List { shapeId.Value } : null; + var combList = loadCombination != null ? new List { loadCombination } : null; + var res = (IEnumerable)genericMethod.Invoke(connection, new object[] { combList, shapeList, _units, _options, false }); + return res.ToList(); } - }).GetAwaiter().GetResult(); - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } + // Read full result sets + var bucklingRes = InvokeStabilityResults(typeof(FemDesign.Results.NodalBucklingShape)).Cast().ToList(); + var critParamRes = InvokeStabilityResults(typeof(FemDesign.Results.CriticalParameter)).Cast().ToList(); + + if (bucklingRes.Count == 0) + throw new Exception("Stability results have not been found. Have you run the Stability analysis?"); + + // Validate filters + ValidateCombos(bucklingRes, _combos); + ValidateShapes(bucklingRes, _shapeIds); + + // Build trees and filter + var rawBucklingTree = CreateBucklingTree(bucklingRes); + _bucklingTree = FilterBucklingTree(rawBucklingTree, _combos, _shapeIds); + + string critParamPropName = nameof(CriticalParameter.CaseIdentifier); + var rawCritTree = critParamRes.CreateResultTree(critParamPropName); + _critParameterTree = FilterCriticalTree(rawCritTree, _combos, _shapeIds); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); - DA.SetData("Connection", handle); - DA.SetDataTree(1, bucklingTree); - DA.SetDataTree(2, critParameterTree); - DA.SetData("Success", success); - DA.SetDataList("Log", log); + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetDataTree(1, _bucklingTree); + DA.SetDataTree(2, _critParameterTree); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetDataTree(1, new DataTree()); + DA.SetDataTree(2, new DataTree()); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); } private static void ValidateCombos(List results, List combos) @@ -191,7 +217,7 @@ private static void ValidateShapes(List re } } - // remove empty branches + // Remove empty branches var emptyPath = new List(); for (int i = 0; i < resultsTree.BranchCount; i++) { @@ -306,5 +332,3 @@ private static void ValidateShapes(List re public override GH_Exposure Exposure => GH_Exposure.tertiary; } } - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs b/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs index 19d046da..b5489f58 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignOpen.cs @@ -1,15 +1,27 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { /// - /// Open a model using the shared hub connection (standard GH_Component, UI-blocking). + /// Open a model using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. /// - public class FemDesignOpen : FEM_Design_API_Component + public class FemDesignOpen : FemDesignHybridComponent { + // Input data (collected on UI thread) + private FemDesignHubHandle _handle; + private dynamic _modelIn; + private bool _runNode; + + // Output data (set by ExecuteWork) + private Model _modelOut; + private List _log; + private bool _success; + public FemDesignOpen() : base("FEM-Design.OpenModel", "OpenModel", "Open model in FEM-Design using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) { } @@ -30,84 +42,103 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); } - protected override void SolveInstance(IGH_DataAccess DA) + protected override void CollectInputData(IGH_DataAccess DA) { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); + _handle = null; + DA.GetData("Connection", ref _handle); - dynamic modelIn = null; - DA.GetData("Model", ref modelIn); + _modelIn = null; + DA.GetData("Model", ref _modelIn); - bool runNode = true; - DA.GetData("RunNode", ref runNode); + _runNode = true; + DA.GetData("RunNode", ref _runNode); - var log = new List(); - bool success = false; - Model modelOut = null; + // Reset output data + _modelOut = null; + _log = new List(); + _success = false; + } - if (!runNode) + protected override bool ShouldExecute() + { + if (!_runNode) { this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Model", modelOut); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; + return false; } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } - try + protected override void ExecuteWork(CancellationToken cancellationToken) + { + // Check for cancellation before starting + cancellationToken.ThrowIfCancellationRequested(); + + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => { - // Block UI while invoking hub (acceptable per requirements) - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try + // Check for cancellation + cancellationToken.ThrowIfCancellationRequested(); + + if (_modelIn is string path) + { + connection.Open(path); + } + else if (_modelIn is Model m) { - if (modelIn is string path) - { - connection.Open(path); - } - else if (modelIn is Model m) - { - connection.Open(m); - } - else if (modelIn != null && modelIn.Value is string) - { - string vpath = modelIn.Value as string; - connection.Open(vpath); - } - else if (modelIn != null && modelIn.Value is Model) - { - Model vm = modelIn.Value as Model; - connection.Open(vm); - } - else - { - throw new Exception("Unsupported 'Model' input. Provide file path or FemDesign.Model."); - } - - modelOut = connection.GetModel(); + connection.Open(m); } - finally + else if (_modelIn != null && _modelIn.Value is string) { - connection.OnOutput -= onOutput; + string vpath = _modelIn.Value as string; + connection.Open(vpath); + } + else if (_modelIn != null && _modelIn.Value is Model) + { + Model vm = _modelIn.Value as Model; + connection.Open(vm); + } + else + { + throw new Exception("Unsupported 'Model' input. Provide file path or FemDesign.Model."); } - }).GetAwaiter().GetResult(); - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } + // Check for cancellation before getting model + cancellationToken.ThrowIfCancellationRequested(); + + _modelOut = connection.GetModel(); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } - DA.SetData("Connection", handle); - DA.SetData("Model", modelOut); - DA.SetData("Success", success); - DA.SetDataList("Log", log); + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Model", _modelOut); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Model", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); } protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_open; @@ -115,5 +146,3 @@ protected override void SolveInstance(IGH_DataAccess DA) public override GH_Exposure Exposure => GH_Exposure.primary; } } - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs b/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs index a5ddd0ee..d2fb872a 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignResultFromBsc.cs @@ -2,119 +2,145 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using Grasshopper.Kernel; using Grasshopper.Kernel.Data; using Grasshopper; namespace FemDesign.Grasshopper { - /// - /// Extract results from a model using a .bsc file with the shared hub connection (standard GH_Component, UI-blocking). - /// - public class FemDesignResultFromBsc : FEM_Design_API_Component - { - public FemDesignResultFromBsc() : base("FEM-Design.GetResultFromBsc", "ResultFromBsc", "Extract results using a .bsc file with shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } - - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddTextParameter("BscFilePath", "BscFilePath", "File path(s) to .bsc batch-file(s).", GH_ParamAccess.list); - pManager.AddTextParameter("CsvFilePath", "CsvFilePath", "Optional output .csv path(s). If not set, results are saved next to the .bsc file(s).", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddGenericParameter("Elements", "Elements", "Optional elements filter.", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } - - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddTextParameter("Results", "Results", "Results as data tree (CSV paths).", GH_ParamAccess.tree); - pManager.AddBooleanParameter("Success", "Success", "True if succeeded.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } - - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - var bscPaths = new List(); - DA.GetDataList("BscFilePath", bscPaths); - - var csvPaths = new List(); - DA.GetDataList("CsvFilePath", csvPaths); - - var elements = new List(); - DA.GetDataList("Elements", elements); - - bool runNode = true; - DA.GetData("RunNode", ref runNode); - - var log = new List(); - bool success = false; - var resultsTree = new DataTree(); - - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetDataTree(1, resultsTree); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } - - try - { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - if (csvPaths == null || csvPaths.Count == 0) - { - csvPaths = bscPaths.Select(b => System.IO.Path.ChangeExtension(b, "csv")).ToList(); - } - - var results = bscPaths.Zip(csvPaths, (bsc, csv) => connection.GetResultsFromBsc(bsc, csv, elements)); - int i = 0; - foreach (var r in results) - { - resultsTree.AddRange(r, new GH_Path(i)); - i++; - } - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } - - DA.SetData("Connection", handle); - DA.SetDataTree(1, resultsTree); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } - - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; - public override Guid ComponentGuid => new Guid("{59667BED-D84B-47E7-BC56-B6D99DC5C274}"); - public override GH_Exposure Exposure => GH_Exposure.tertiary; - } + /// + /// Extract results from a model using a .bsc file with the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignResultFromBsc : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private List _bscPaths; + private List _csvPaths; + private List _elements; + private bool _runNode; + + // Output data + private DataTree _resultsTree; + private List _log; + private bool _success; + + public FemDesignResultFromBsc() : base("FEM-Design.GetResultFromBsc", "ResultFromBsc", "Extract results using a .bsc file with shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddTextParameter("BscFilePath", "BscFilePath", "File path(s) to .bsc batch-file(s).", GH_ParamAccess.list); + pManager.AddTextParameter("CsvFilePath", "CsvFilePath", "Optional output .csv path(s). If not set, results are saved next to the .bsc file(s).", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddGenericParameter("Elements", "Elements", "Optional elements filter.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddTextParameter("Results", "Results", "Results as data tree (CSV paths).", GH_ParamAccess.tree); + pManager.AddBooleanParameter("Success", "Success", "True if succeeded.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } + + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); + + _bscPaths = new List(); + DA.GetDataList("BscFilePath", _bscPaths); + + _csvPaths = new List(); + DA.GetDataList("CsvFilePath", _csvPaths); + + _elements = new List(); + DA.GetDataList("Elements", _elements); + + _runNode = true; + DA.GetData("RunNode", ref _runNode); + + // Reset output data + _resultsTree = new DataTree(); + _log = new List(); + _success = false; + } + + protected override bool ShouldExecute() + { + if (!_runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + + if (_csvPaths == null || _csvPaths.Count == 0) + { + _csvPaths = _bscPaths.Select(b => System.IO.Path.ChangeExtension(b, "csv")).ToList(); + } + + var results = _bscPaths.Zip(_csvPaths, (bsc, csv) => connection.GetResultsFromBsc(bsc, csv, _elements)); + int i = 0; + foreach (var r in results) + { + _resultsTree.AddRange(r, new GH_Path(i)); + i++; + } + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetDataTree(1, _resultsTree); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetDataTree(1, new DataTree()); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_readresult; + public override Guid ComponentGuid => new Guid("{59667BED-D84B-47E7-BC56-B6D99DC5C274}"); + public override GH_Exposure Exposure => GH_Exposure.tertiary; + } } - - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs b/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs index 48675939..5b0e399d 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignRunAnalysis.cs @@ -1,16 +1,27 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; using FemDesign.Calculate; namespace FemDesign.Grasshopper { /// - /// Run analysis using the shared hub connection (standard GH_Component, UI-blocking). + /// Run analysis using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. /// - public class FemDesignRunAnalysis : FEM_Design_API_Component + public class FemDesignRunAnalysis : FemDesignHybridComponent { + // Input data + private FemDesignHubHandle _handle; + private Analysis _analysis; + private bool _runNode; + + // Output data + private List _log; + private bool _success; + public FemDesignRunAnalysis() : base("FEM-Design.RunAnalysis", "RunAnalysis", "Run analysis on current/open model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) { } @@ -30,61 +41,75 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); } - protected override void SolveInstance(IGH_DataAccess DA) + protected override void CollectInputData(IGH_DataAccess DA) { - FemDesign.Grasshopper.FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); + _handle = null; + DA.GetData("Connection", ref _handle); - Analysis analysis = null; - DA.GetData("Analysis", ref analysis); + _analysis = null; + DA.GetData("Analysis", ref _analysis); - bool runNode = true; - DA.GetData("RunNode", ref runNode); + _runNode = true; + DA.GetData("RunNode", ref _runNode); - var log = new List(); - bool success = false; + // Reset output data + _log = new List(); + _success = false; + } - if (!runNode) + protected override bool ShouldExecute() + { + if (!_runNode) { this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); - // check inputs - if (analysis == null) + // Check inputs + if (_analysis == null) throw new Exception("'Analysis' input is null."); - try + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - connection.RunAnalysis(analysis); - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } + cancellationToken.ThrowIfCancellationRequested(); + connection.RunAnalysis(_analysis); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } - DA.SetData("Connection", handle); - DA.SetData("Success", success); - DA.SetDataList("Log", log); + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); } protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_RunAnalysis; @@ -92,6 +117,3 @@ protected override void SolveInstance(IGH_DataAccess DA) public override GH_Exposure Exposure => GH_Exposure.secondary; } } - - - diff --git a/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs b/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs index cf27941c..eac6bd1c 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignRunDesign.cs @@ -1,102 +1,126 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; using FemDesign.Calculate; namespace FemDesign.Grasshopper { - /// - /// Run design using the shared hub connection (standard GH_Component, UI-blocking). - /// - public class FemDesignRunDesign : FEM_Design_API_Component - { - public FemDesignRunDesign() : base("FEM-Design.RunDesign", "RunDesign", "Run design on current/open model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } - - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddGenericParameter("Design", "Design", "Design settings.", GH_ParamAccess.item); - pManager.AddGenericParameter("DesignGroup", "DesignGroup", "Optional design groups.", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } - - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddBooleanParameter("Success", "Success", "True if design succeeded.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } - - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - Design design = null; - DA.GetData("Design", ref design); - - var designGroups = new List(); - DA.GetDataList("DesignGroup", designGroups); - - bool runNode = true; - DA.GetData("RunNode", ref runNode); - - var log = new List(); - bool success = false; - - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } - - // check inputs - if (design == null) - throw new Exception("'Design' input is null."); - - try + /// + /// Run design using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignRunDesign : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private Design _design; + private List _designGroups; + private bool _runNode; + + // Output data + private List _log; + private bool _success; + + public FemDesignRunDesign() : base("FEM-Design.RunDesign", "RunDesign", "Run design on current/open model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddGenericParameter("Design", "Design", "Design settings.", GH_ParamAccess.item); + pManager.AddGenericParameter("DesignGroup", "DesignGroup", "Optional design groups.", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddBooleanParameter("Success", "Success", "True if design succeeded.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } + + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); + + _design = null; + DA.GetData("Design", ref _design); + + _designGroups = new List(); + DA.GetDataList("DesignGroup", _designGroups); + + _runNode = true; + DA.GetData("RunNode", ref _runNode); + + // Reset output data + _log = new List(); + _success = false; + } + + protected override bool ShouldExecute() + { + if (!_runNode) { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - var userModule = design.Mode; - connection.RunDesign(userModule, design, designGroups); - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } - - DA.SetData("Connection", handle); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } - - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_RunDesign; - public override Guid ComponentGuid => new Guid("{0F185ABC-C496-4C6A-A59C-848ADE3A8390}"); - public override GH_Exposure Exposure => GH_Exposure.secondary; - } -} + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + // Check inputs + if (_design == null) + throw new Exception("'Design' input is null."); + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + var userModule = _design.Mode; + connection.RunDesign(userModule, _design, _designGroups); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_RunDesign; + public override Guid ComponentGuid => new Guid("{0F185ABC-C496-4C6A-A59C-848ADE3A8390}"); + public override GH_Exposure Exposure => GH_Exposure.secondary; + } +} diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs b/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs index c43e8685..569b953b 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSaveAs.cs @@ -1,95 +1,118 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { - /// - /// Save model using the shared hub connection (standard GH_Component, UI-blocking). - /// - public class FemDesignSaveAs : FEM_Design_API_Component - { - public FemDesignSaveAs() : base("FEM-Design.Save", "Save", "Save the current model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } - - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddTextParameter("FilePath", "FilePath", "Save the model to .struxml or .str file.", GH_ParamAccess.item); - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } - - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddBooleanParameter("Success", "Success", "True if save succeeded.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } - - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - string filePath = null; - DA.GetData("FilePath", ref filePath); - - bool runNode = true; - DA.GetData("RunNode", ref runNode); - - var log = new List(); - bool success = false; - - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } - - // check inputs - if (string.IsNullOrWhiteSpace(filePath)) - throw new Exception("'FilePath' is null or empty."); - - try + /// + /// Save model using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignSaveAs : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private string _filePath; + private bool _runNode; + + // Output data + private List _log; + private bool _success; + + public FemDesignSaveAs() : base("FEM-Design.Save", "Save", "Save the current model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddTextParameter("FilePath", "FilePath", "Save the model to .struxml or .str file.", GH_ParamAccess.item); + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddBooleanParameter("Success", "Success", "True if save succeeded.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } + + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); + + _filePath = null; + DA.GetData("FilePath", ref _filePath); + + _runNode = true; + DA.GetData("RunNode", ref _runNode); + + // Reset output data + _log = new List(); + _success = false; + } + + protected override bool ShouldExecute() + { + if (!_runNode) { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - connection.Save(filePath); - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } - - DA.SetData("Connection", handle); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } - - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_SaveAs; - public override Guid ComponentGuid => new Guid("{9997E67D-1212-4EB4-BA95-B050D6A0563A}"); - public override GH_Exposure Exposure => GH_Exposure.primary; - } -} + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + // Check inputs + if (string.IsNullOrWhiteSpace(_filePath)) + throw new Exception("'FilePath' is null or empty."); + + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + connection.Save(_filePath); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_SaveAs; + public override Guid ComponentGuid => new Guid("{9997E67D-1212-4EB4-BA95-B050D6A0563A}"); + public override GH_Exposure Exposure => GH_Exposure.primary; + } +} diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs b/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs index 73f19aad..f81aac04 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSaveDocumentation.cs @@ -1,100 +1,124 @@ // https://strusoft.com/ using System; using System.Collections.Generic; +using System.Threading; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { - /// - /// Save documentation using the shared hub connection (standard GH_Component, UI-blocking). - /// - public class FemDesignSaveDocumentation : FEM_Design_API_Component - { - public FemDesignSaveDocumentation() : base("FEM-Design.Documentation", "SaveDocx", "Save documentation of current model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } - - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddTextParameter("Docx", "Docx", "Docx file path for the documentation output.", GH_ParamAccess.item); - pManager.AddTextParameter("Template", "Template", ".dsc template file path.", GH_ParamAccess.item); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } - - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddBooleanParameter("Success", "Success", "True if documentation saved.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } - - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - string docx = null; - DA.GetData("Docx", ref docx); - - string template = null; - DA.GetData("Template", ref template); - - bool runNode = true; - DA.GetData("RunNode", ref runNode); - - var log = new List(); - bool success = false; - - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } - - // check inputs - if (string.IsNullOrWhiteSpace(docx)) - throw new Exception("'Docx' path is null or empty."); - - try + /// + /// Save documentation using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignSaveDocumentation : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private string _docx; + private string _template; + private bool _runNode; + + // Output data + private List _log; + private bool _success; + + public FemDesignSaveDocumentation() : base("FEM-Design.Documentation", "SaveDocx", "Save documentation of current model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddTextParameter("Docx", "Docx", "Docx file path for the documentation output.", GH_ParamAccess.item); + pManager.AddTextParameter("Template", "Template", ".dsc template file path.", GH_ParamAccess.item); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddBooleanParameter("Success", "Success", "True if documentation saved.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } + + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); + + _docx = null; + DA.GetData("Docx", ref _docx); + + _template = null; + DA.GetData("Template", ref _template); + + _runNode = true; + DA.GetData("RunNode", ref _runNode); + + // Reset output data + _log = new List(); + _success = false; + } + + protected override bool ShouldExecute() + { + if (!_runNode) { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - connection.SaveDocx(docx, template); - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } - - DA.SetData("Connection", handle); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } - - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.Docx; - public override Guid ComponentGuid => new Guid("{B7AD9265-2AAE-4562-9B47-DB178F69839D}"); - public override GH_Exposure Exposure => GH_Exposure.primary; - } -} + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + // Check inputs + if (string.IsNullOrWhiteSpace(_docx)) + throw new Exception("'Docx' path is null or empty."); + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + connection.SaveDocx(_docx, _template); + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.Docx; + public override Guid ComponentGuid => new Guid("{B7AD9265-2AAE-4562-9B47-DB178F69839D}"); + public override GH_Exposure Exposure => GH_Exposure.primary; + } +} diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs b/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs index b363fe93..f2706161 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSetCfg.cs @@ -2,122 +2,145 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Threading; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { - /// - /// Set configurations using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeSetCfg behavior. - /// - public class FemDesignSetCfg : FEM_Design_API_Component - { - public FemDesignSetCfg() : base("FEM-Design.SetConfigurations", "SetCfg", "Set design settings for current model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } - - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddGenericParameter("Config", "Cfg", "Filepath of the configuration file or Config objects.\nIf file path is not provided, the component will read the cfg.xml file in the package manager library folder.\n%AppData%\\McNeel\\Rhinoceros\\packages\\7.0\\FemDesign\\", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } - - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddBooleanParameter("Success", "Success", "True if configuration applied.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } - - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - var cfg = new List(); - DA.GetDataList("Config", cfg); - - bool runNode = true; - DA.GetData("RunNode", ref runNode); - - var log = new List(); - bool success = false; - - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } - - try - { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - if (cfg.Count == 0) - { - string assemblyLocation = Assembly.GetExecutingAssembly().Location; - var cfgfilePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(assemblyLocation), @"cfg.xml"); - connection.SetConfig(cfgfilePath); - } - else - { - foreach (var c in cfg) - { - if (c is string s) - { - connection.SetConfig(s); - } - else if (c != null && c.Value is string) - { - string vs = c.Value as string; - connection.SetConfig(vs); - } - else if (c is FemDesign.Calculate.CONFIG cfgObj) - { - connection.SetConfig(cfgObj); - } - else if (c != null && c.Value is FemDesign.Calculate.CONFIG) - { - FemDesign.Calculate.CONFIG vCfgObj = c.Value as FemDesign.Calculate.CONFIG; - connection.SetConfig(vCfgObj); - } - } - } - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } - - DA.SetData("Connection", handle); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } - - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_Config; - public override Guid ComponentGuid => new Guid("{24BCEA1D-13E7-47D0-B0F8-4403B0912D44}"); - public override GH_Exposure Exposure => GH_Exposure.obscure; - } -} + /// + /// Set configurations using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignSetCfg : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private List _cfg; + private bool _runNode; + + // Output data + private List _log; + private bool _success; + + public FemDesignSetCfg() : base("FEM-Design.SetConfigurations", "SetCfg", "Set design settings for current model using shared connection.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddGenericParameter("Config", "Cfg", "Filepath of the configuration file or Config objects.\nIf file path is not provided, the component will read the cfg.xml file in the package manager library folder.\n%AppData%\\McNeel\\Rhinoceros\\packages\\7.0\\FemDesign\\", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddBooleanParameter("Success", "Success", "True if configuration applied.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } + + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); + + _cfg = new List(); + DA.GetDataList("Config", _cfg); + + _runNode = true; + DA.GetData("RunNode", ref _runNode); + // Reset output data + _log = new List(); + _success = false; + } + protected override bool ShouldExecute() + { + if (!_runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + + if (_cfg.Count == 0) + { + string assemblyLocation = Assembly.GetExecutingAssembly().Location; + var cfgfilePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(assemblyLocation), @"cfg.xml"); + connection.SetConfig(cfgfilePath); + } + else + { + foreach (var c in _cfg) + { + if (c is string s) + { + connection.SetConfig(s); + } + else if (c != null && c.Value is string) + { + string vs = c.Value as string; + connection.SetConfig(vs); + } + else if (c is FemDesign.Calculate.CONFIG cfgObj) + { + connection.SetConfig(cfgObj); + } + else if (c != null && c.Value is FemDesign.Calculate.CONFIG) + { + FemDesign.Calculate.CONFIG vCfgObj = c.Value as FemDesign.Calculate.CONFIG; + connection.SetConfig(vCfgObj); + } + } + } + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_Config; + public override Guid ComponentGuid => new Guid("{24BCEA1D-13E7-47D0-B0F8-4403B0912D44}"); + public override GH_Exposure Exposure => GH_Exposure.obscure; + } +} diff --git a/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs b/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs index df62c2af..78f0f4bc 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignSetGlobalCfg.cs @@ -2,122 +2,145 @@ using System; using System.Collections.Generic; using System.Reflection; +using System.Threading; using Grasshopper.Kernel; namespace FemDesign.Grasshopper { - /// - /// Set global configurations using the shared hub connection (standard GH_Component, UI-blocking). - /// Mirrors PipeSetGlobalCfg behavior. - /// - public class FemDesignSetGlobalCfg : FEM_Design_API_Component - { - public FemDesignSetGlobalCfg() : base("FEM-Design.SetGlobalConfigurations", "SetGlobalCfg", "Set global settings for current model using shared connection. It defines the calculation settings that will instruct FEM-Design in operation like creating the finite element mesh.", CategoryName.Name(), SubCategoryName.Cat8()) - { - } - - protected override void RegisterInputParams(GH_InputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddGenericParameter("GlobalConfig", "GlobCfg", "Filepath of global configuration file or GlobConfig objects.\nIf file path is not provided, the component will read the cmdglobalcfg.xml file in the package manager library folder.\n%AppData%\\McNeel\\Rhinoceros\\packages\\7.0\\FemDesign\\", GH_ParamAccess.list); - pManager[pManager.ParamCount - 1].Optional = true; - pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); - pManager[pManager.ParamCount - 1].Optional = true; - } - - protected override void RegisterOutputParams(GH_OutputParamManager pManager) - { - pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); - pManager.AddBooleanParameter("Success", "Success", "True if global configuration applied.", GH_ParamAccess.item); - pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); - } - - protected override void SolveInstance(IGH_DataAccess DA) - { - FemDesignHubHandle handle = null; - DA.GetData("Connection", ref handle); - - var globCfg = new List(); - DA.GetDataList("GlobalConfig", globCfg); - - bool runNode = true; - DA.GetData("RunNode", ref runNode); - - var log = new List(); - bool success = false; - - if (!runNode) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); - DA.SetData("Connection", null); - DA.SetData("Success", false); - DA.SetDataList("Log", log); - return; - } - - try - { - FemDesignConnectionHub.InvokeAsync(handle.Id, connection => - { - void onOutput(string s) { log.Add(s); } - connection.OnOutput += onOutput; - try - { - if (globCfg.Count == 0) - { - string assemblyLocation = Assembly.GetExecutingAssembly().Location; - var globCfgfilePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(assemblyLocation), @"cmdglobalcfg.xml"); - connection.SetGlobalConfig(globCfgfilePath); - } - else - { - foreach (var c in globCfg) - { - if (c is string s) - { - connection.SetGlobalConfig(s); - } - else if (c != null && c.Value is string) - { - string vs = c.Value as string; - connection.SetGlobalConfig(vs); - } - else if (c is FemDesign.Calculate.GlobConfig cfgObj) - { - connection.SetGlobalConfig(cfgObj); - } - else if (c != null && c.Value is FemDesign.Calculate.GlobConfig) - { - FemDesign.Calculate.GlobConfig vCfgObj = c.Value as FemDesign.Calculate.GlobConfig; - connection.SetGlobalConfig(vCfgObj); - } - } - } - } - finally - { - connection.OnOutput -= onOutput; - } - }).GetAwaiter().GetResult(); - - success = true; - } - catch (Exception ex) - { - this.AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); - log.Add(ex.Message); - success = false; - } - - DA.SetData("Connection", handle); - DA.SetData("Success", success); - DA.SetDataList("Log", log); - } - - protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_Config; - public override Guid ComponentGuid => new Guid("{C223693E-139D-4A1C-8F02-F8618BEDB4BA}"); - public override GH_Exposure Exposure => GH_Exposure.obscure; - } -} + /// + /// Set global configurations using the shared hub connection. + /// Supports both sync (UI-blocking) and async (non-blocking) modes via FemDesignSettings. + /// + public class FemDesignSetGlobalCfg : FemDesignHybridComponent + { + // Input data + private FemDesignHubHandle _handle; + private List _globCfg; + private bool _runNode; + + // Output data + private List _log; + private bool _success; + + public FemDesignSetGlobalCfg() : base("FEM-Design.SetGlobalConfigurations", "SetGlobalCfg", "Set global settings for current model using shared connection. It defines the calculation settings that will instruct FEM-Design in operation like creating the finite element mesh.", CategoryName.Name(), SubCategoryName.Cat8()) + { + } + + protected override void RegisterInputParams(GH_InputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddGenericParameter("GlobalConfig", "GlobCfg", "Filepath of global configuration file or GlobConfig objects.\nIf file path is not provided, the component will read the cmdglobalcfg.xml file in the package manager library folder.\n%AppData%\\McNeel\\Rhinoceros\\packages\\7.0\\FemDesign\\", GH_ParamAccess.list); + pManager[pManager.ParamCount - 1].Optional = true; + pManager.AddBooleanParameter("RunNode", "RunNode", "If true node will execute. If false node will not execute.", GH_ParamAccess.item, true); + pManager[pManager.ParamCount - 1].Optional = true; + } + + protected override void RegisterOutputParams(GH_OutputParamManager pManager) + { + pManager.AddGenericParameter("Connection", "Connection", "Shared FEM-Design connection handle.", GH_ParamAccess.item); + pManager.AddBooleanParameter("Success", "Success", "True if global configuration applied.", GH_ParamAccess.item); + pManager.AddTextParameter("Log", "Log", "Operation log.", GH_ParamAccess.list); + } + + protected override void CollectInputData(IGH_DataAccess DA) + { + _handle = null; + DA.GetData("Connection", ref _handle); + + _globCfg = new List(); + DA.GetDataList("GlobalConfig", _globCfg); + + _runNode = true; + DA.GetData("RunNode", ref _runNode); + // Reset output data + _log = new List(); + _success = false; + } + protected override bool ShouldExecute() + { + if (!_runNode) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Run node set to false."); + return false; + } + if (_handle == null) + { + this.AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "Connection input is null."); + return false; + } + return true; + } + + protected override void ExecuteWork(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + FemDesignConnectionHub.InvokeAsync(_handle.Id, connection => + { + void onOutput(string s) { _log.Add(s); } + connection.OnOutput += onOutput; + try + { + cancellationToken.ThrowIfCancellationRequested(); + + if (_globCfg.Count == 0) + { + string assemblyLocation = Assembly.GetExecutingAssembly().Location; + var globCfgfilePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(assemblyLocation), @"cmdglobalcfg.xml"); + connection.SetGlobalConfig(globCfgfilePath); + } + else + { + foreach (var c in _globCfg) + { + if (c is string s) + { + connection.SetGlobalConfig(s); + } + else if (c != null && c.Value is string) + { + string vs = c.Value as string; + connection.SetGlobalConfig(vs); + } + else if (c is FemDesign.Calculate.GlobConfig cfgObj) + { + connection.SetGlobalConfig(cfgObj); + } + else if (c != null && c.Value is FemDesign.Calculate.GlobConfig) + { + FemDesign.Calculate.GlobConfig vCfgObj = c.Value as FemDesign.Calculate.GlobConfig; + connection.SetGlobalConfig(vCfgObj); + } + } + } + } + finally + { + connection.OnOutput -= onOutput; + } + }).GetAwaiter().GetResult(); + + _success = true; + } + + protected override void SetOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", _handle); + DA.SetData("Success", _success); + DA.SetDataList("Log", _log); + } + + protected override void SetDefaultOutputData(IGH_DataAccess DA) + { + DA.SetData("Connection", null); + DA.SetData("Success", false); + DA.SetDataList("Log", _log ?? new List()); + } + + protected override System.Drawing.Bitmap Icon => FemDesign.Properties.Resources.FEM_Config; + public override Guid ComponentGuid => new Guid("{C223693E-139D-4A1C-8F02-F8618BEDB4BA}"); + public override GH_Exposure Exposure => GH_Exposure.obscure; + } +} diff --git a/FemDesign.Grasshopper/Settings/FemDesignSettings.cs b/FemDesign.Grasshopper/Settings/FemDesignSettings.cs new file mode 100644 index 00000000..1d3f33a3 --- /dev/null +++ b/FemDesign.Grasshopper/Settings/FemDesignSettings.cs @@ -0,0 +1,40 @@ +// https://strusoft.com/ +using Grasshopper; +using System; + +namespace FemDesign.Grasshopper +{ + /// + /// Global settings for FEM-Design Grasshopper components. + /// + public static class FemDesignSettings + { + private const string ASYNC_MODE_KEY = "FemDesign_AsyncMode"; + + /// + /// Gets or sets whether async (non-blocking) mode is enabled for FEM-Design components. + /// When true, components will run in the background without blocking the Grasshopper UI. + /// When false, components run synchronously and block the UI until complete. + /// + public static bool AsyncModeEnabled + { + get => Instances.Settings.GetValue(ASYNC_MODE_KEY, false); + set + { + Instances.Settings.SetValue(ASYNC_MODE_KEY, value); + RaiseAsyncModeChanged(); + } + } + + /// + /// Event raised when the async mode setting changes. + /// + public static event Action AsyncModeChanged; + + internal static void RaiseAsyncModeChanged() + { + AsyncModeChanged?.Invoke(); + } + } +} + diff --git a/FemDesign.Grasshopper/UI/LoadMainMenu.cs b/FemDesign.Grasshopper/UI/LoadMainMenu.cs index 6c92da35..d42fad6e 100644 --- a/FemDesign.Grasshopper/UI/LoadMainMenu.cs +++ b/FemDesign.Grasshopper/UI/LoadMainMenu.cs @@ -59,6 +59,29 @@ internal static void OnStartup(GH_Canvas canvas) private static void PopulateSub(ToolStripMenuItem menuItem) { + // Async mode toggle + var asyncModeItem = new ToolStripMenuItem("Async Mode (Non-blocking UI)") + { + CheckOnClick = true, + Checked = FemDesignSettings.AsyncModeEnabled, + ToolTipText = "When enabled, FEM-Design operations run in the background without blocking the Grasshopper UI." + }; + asyncModeItem.CheckedChanged += (sender, e) => + { + FemDesignSettings.AsyncModeEnabled = asyncModeItem.Checked; + + // Log the change to Rhino command line + if (asyncModeItem.Checked) + Rhino.RhinoApp.WriteLine("FEM-Design: Async mode enabled - UI won't block during operations"); + else + Rhino.RhinoApp.WriteLine("FEM-Design: Sync mode enabled - Operations run sequentially"); + }; + menuItem.DropDown.Items.Add(asyncModeItem); + + // Separator + menuItem.DropDown.Items.Add(new ToolStripSeparator()); + + // Links menuItem.DropDown.Items.Add("Documentation", null/*Properties.Resources.MainMenu_Documentation*/, (sender, e) => OpenBrowser(sender, e, documentationUrl)); From e3d67d2d7f7a08ae7602fbd5d528ba459f490771 Mon Sep 17 00:00:00 2001 From: MP Date: Thu, 8 Jan 2026 11:30:56 +0100 Subject: [PATCH 04/12] Update FemDesignHybridComponent.cs --- .../Components/FemDesignHybridComponent.cs | 102 ++++++++++++++++-- 1 file changed, 95 insertions(+), 7 deletions(-) diff --git a/FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs b/FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs index 4237c9e0..6819711b 100644 --- a/FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs +++ b/FemDesign.Grasshopper/Components/FemDesignHybridComponent.cs @@ -3,6 +3,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Timer = System.Timers.Timer; namespace FemDesign.Grasshopper { @@ -20,9 +21,84 @@ public abstract class FemDesignHybridComponent : FEM_Design_API_Component private bool _hasResult; private Exception _asyncException; + // Spinner animation for async processing + private Timer _spinnerTimer; + private int _spinnerFrame; + private static readonly string[] SpinnerFrames = new[] + { + @"\Processing\", + @"|Processing|", + @"/Processing/", + @"-Processing-" + }; + protected FemDesignHybridComponent(string name, string nickname, string description, string category, string subCategory) : base(name, nickname, description, category, subCategory) { + // Initialize spinner timer (updates every 250ms) + _spinnerTimer = new Timer(250) { AutoReset = true }; + _spinnerTimer.Elapsed += OnSpinnerTick; + + // Set initial message based on current mode + UpdateAsyncMessage(); + } + + public override void AddedToDocument(GH_Document document) + { + base.AddedToDocument(document); + + // Subscribe to async mode changes + FemDesignSettings.AsyncModeChanged += OnAsyncModeChanged; + + // Update message when added to document + UpdateAsyncMessage(); + } + + private void OnAsyncModeChanged() + { + // Update message when async mode changes (only if not currently running) + if (!_isRunning) + { + UpdateAsyncMessage(); + + // Refresh display on UI thread + Rhino.RhinoApp.InvokeOnUiThread((Action)(() => + { + OnDisplayExpired(true); + })); + } + } + + private void UpdateAsyncMessage() + { + // Show "Async" when async mode is enabled, nothing when sync mode + Message = FemDesignSettings.AsyncModeEnabled ? "Async" : null; + } + + private void OnSpinnerTick(object sender, System.Timers.ElapsedEventArgs e) + { + if (!_isRunning) return; + + _spinnerFrame = (_spinnerFrame + 1) % SpinnerFrames.Length; + Message = SpinnerFrames[_spinnerFrame]; + + // Update display on UI thread + Rhino.RhinoApp.InvokeOnUiThread((Action)(() => + { + OnDisplayExpired(true); + })); + } + + private void StartSpinner() + { + _spinnerFrame = 0; + Message = SpinnerFrames[0]; + _spinnerTimer?.Start(); + } + + private void StopSpinner() + { + _spinnerTimer?.Stop(); } /// @@ -81,19 +157,18 @@ protected override void SolveInstance(IGH_DataAccess DA) private void SolveSync(IGH_DataAccess DA) { - Message = "Running..."; + // In sync mode, don't show any message annotation + Message = null; try { ExecuteWork(CancellationToken.None); SetOutputData(DA); - Message = "Done"; } catch (Exception ex) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message); SetDefaultOutputData(DA); - Message = "Error"; } } @@ -112,7 +187,7 @@ private void SolveAsync(IGH_DataAccess DA) else { SetOutputData(DA); - Message = "Done"; + Message = "Async"; } // Reset state for next run @@ -124,7 +199,6 @@ private void SolveAsync(IGH_DataAccess DA) // Already running, wait for completion if (_isRunning) { - Message = "Processing..."; return; } @@ -135,6 +209,7 @@ private void SolveAsync(IGH_DataAccess DA) if (!ShouldExecute()) { SetDefaultOutputData(DA); + Message = "Async"; return; } @@ -146,7 +221,7 @@ private void SolveAsync(IGH_DataAccess DA) _isRunning = true; _asyncException = null; - Message = "Processing..."; + StartSpinner(); // Start background task Task.Run(() => @@ -159,6 +234,7 @@ private void SolveAsync(IGH_DataAccess DA) { // Cancelled - don't expire solution _isRunning = false; + StopSpinner(); return; } catch (Exception ex) @@ -169,6 +245,7 @@ private void SolveAsync(IGH_DataAccess DA) { _isRunning = false; _hasResult = true; + StopSpinner(); } // Schedule solution update on UI thread @@ -192,7 +269,14 @@ protected override void BeforeSolveInstance() public override void RemovedFromDocument(GH_Document document) { - // Cancel any pending async work + // Unsubscribe from async mode changes + FemDesignSettings.AsyncModeChanged -= OnAsyncModeChanged; + + // Stop spinner and cancel any pending async work + StopSpinner(); + _spinnerTimer?.Dispose(); + _spinnerTimer = null; + _cts?.Cancel(); _cts?.Dispose(); _cts = null; @@ -207,6 +291,10 @@ public override void DocumentContextChanged(GH_Document document, GH_DocumentCon // Cancel async work when document is closing if (context == GH_DocumentContext.Close || context == GH_DocumentContext.Unloaded) { + StopSpinner(); + _spinnerTimer?.Dispose(); + _spinnerTimer = null; + _cts?.Cancel(); _cts?.Dispose(); _cts = null; From 673b9a1f185956e57dd5772beaab3f8e8243bc5a Mon Sep 17 00:00:00 2001 From: MP Date: Thu, 8 Jan 2026 11:51:59 +0100 Subject: [PATCH 05/12] Async Default behaviour --- FemDesign.Grasshopper/Settings/FemDesignSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FemDesign.Grasshopper/Settings/FemDesignSettings.cs b/FemDesign.Grasshopper/Settings/FemDesignSettings.cs index 1d3f33a3..2c9f60d8 100644 --- a/FemDesign.Grasshopper/Settings/FemDesignSettings.cs +++ b/FemDesign.Grasshopper/Settings/FemDesignSettings.cs @@ -18,7 +18,7 @@ public static class FemDesignSettings /// public static bool AsyncModeEnabled { - get => Instances.Settings.GetValue(ASYNC_MODE_KEY, false); + get => Instances.Settings.GetValue(ASYNC_MODE_KEY, true); set { Instances.Settings.SetValue(ASYNC_MODE_KEY, value); From 545bd90f6e58306db46c73e1f42158e5de7d0a75 Mon Sep 17 00:00:00 2001 From: MP Date: Fri, 30 Jan 2026 09:55:57 +0100 Subject: [PATCH 06/12] =?UTF-8?q?=F0=9F=9A=9A=20=20femdesign=2024=20->=202?= =?UTF-8?q?5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FemDesign.Core/FemDesignConnection.cs | 12 ++++++------ .../Program.cs | 2 +- .../Pipe/FemDesignConnectionComponent.cs | 4 ++-- FemDesign.Tests/Results/Utils/Read.cs | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/FemDesign.Core/FemDesignConnection.cs b/FemDesign.Core/FemDesignConnection.cs index 57f9f8ec..5ddfd486 100644 --- a/FemDesign.Core/FemDesignConnection.cs +++ b/FemDesign.Core/FemDesignConnection.cs @@ -71,7 +71,7 @@ public class FemDesignConnection : IDisposable /// BE CAREFUL!If true the will be deleted on exit. This option has no effect unless has been specified. /// public FemDesignConnection( - string fdInstallationDir = @"C:\Program Files\StruSoft\FEM-Design 24\", + string fdInstallationDir = @"C:\Program Files\StruSoft\FEM-Design 25\", bool minimized = false, bool keepOpen = false, string outputDir = null, @@ -110,7 +110,7 @@ public FemDesignConnection( } catch { - throw new Exception(@"fd3dstruct.exe has not been found. `C:\Program Files\StruSoft\FEM-Design 24\` does not exist!"); + throw new Exception($"fd3dstruct.exe has not been found. {installDir} does not exist!"); } _process.Exited += _processExited; @@ -142,10 +142,10 @@ public string SetFemDesignDirectory(string fdInstallationDir) var defaultDirs = new List() { - @"C:\Program Files\StruSoft\FEM-Design 24\", - @"C:\Program Files\StruSoft\FEM-Design 24 Educational\", - @"C:\Program Files\StruSoft\FEM-Design 24 Student\", - @"C:\Program Files\StruSoft\FEM-Design 24 Night Install\" // for StruSoft employees + @"C:\Program Files\StruSoft\FEM-Design 25\", + @"C:\Program Files\StruSoft\FEM-Design 25 Educational\", + @"C:\Program Files\StruSoft\FEM-Design 25 Student\", + @"C:\Program Files\StruSoft\FEM-Design 25 Night Install\" // for StruSoft employees }; foreach (var dir in defaultDirs) diff --git a/FemDesign.Examples/C#/Practical example - Connection forces to Load/Program.cs b/FemDesign.Examples/C#/Practical example - Connection forces to Load/Program.cs index ace04624..e672621c 100644 --- a/FemDesign.Examples/C#/Practical example - Connection forces to Load/Program.cs +++ b/FemDesign.Examples/C#/Practical example - Connection forces to Load/Program.cs @@ -25,7 +25,7 @@ static void Main(string[] args) }; - using (var femDesign = new FemDesignConnection(keepOpen: true, fdInstallationDir: "C:\\Program Files\\StruSoft\\FEM-Design 24 Night Install")) + using (var femDesign = new FemDesignConnection(keepOpen: true, fdInstallationDir: "C:\\Program Files\\StruSoft\\FEM-Design 25")) { var filePath = "fea.str"; femDesign.Open(filePath); diff --git a/FemDesign.Grasshopper/Pipe/FemDesignConnectionComponent.cs b/FemDesign.Grasshopper/Pipe/FemDesignConnectionComponent.cs index 318707df..43ae9d59 100644 --- a/FemDesign.Grasshopper/Pipe/FemDesignConnectionComponent.cs +++ b/FemDesign.Grasshopper/Pipe/FemDesignConnectionComponent.cs @@ -28,7 +28,7 @@ private void FemDesignConnectionComponent_ObjectChanged(object sender, GH_Object protected override void RegisterInputParams(GH_InputParamManager pManager) { - pManager.AddTextParameter("FEM-Design dir", "FEM-Design dir", "Path to the FEM-Design installation directory.", GH_ParamAccess.item, @"C:\\Program Files\\StruSoft\\FEM-Design 24\\"); + pManager.AddTextParameter("FEM-Design dir", "FEM-Design dir", "Path to the FEM-Design installation directory.", GH_ParamAccess.item, @"C:\\Program Files\\StruSoft\\FEM-Design 25\\"); pManager[pManager.ParamCount - 1].Optional = true; pManager.AddBooleanParameter("Minimized", "Minimized", "If true, FEM-Design window will open in a minimised mode.", GH_ParamAccess.item, false); @@ -48,7 +48,7 @@ protected override void RegisterOutputParams(GH_OutputParamManager pManager) protected override void SolveInstance(IGH_DataAccess DA) { - string fdDir = @"C:\\Program Files\\StruSoft\\FEM-Design 24\\"; + string fdDir = @"C:\\Program Files\\StruSoft\\FEM-Design 25\\"; DA.GetData("FEM-Design dir", ref fdDir); bool minimized = false; diff --git a/FemDesign.Tests/Results/Utils/Read.cs b/FemDesign.Tests/Results/Utils/Read.cs index ace5977c..30c20c1b 100644 --- a/FemDesign.Tests/Results/Utils/Read.cs +++ b/FemDesign.Tests/Results/Utils/Read.cs @@ -142,7 +142,7 @@ public void TestGetStabilityResults() FemDesign.Calculate.Analysis analysis = new FemDesign.Calculate.Analysis(stability: stability, calcComb: true, calcStab: true, diaphragm: DiaphragmType.None); - using (var femDesign = new FemDesignConnection(fdInstallationDir: @"C:\Program Files\StruSoft\FEM-Design 24\", outputDir: "My analyzed model", keepOpen: false)) + using (var femDesign = new FemDesignConnection(fdInstallationDir: @"C:\Program Files\StruSoft\FEM-Design 25\", outputDir: "My analyzed model", keepOpen: false)) { femDesign.RunAnalysis(model, analysis); From 4922753c5f9bf449410dfce6f2d876ace231a43c Mon Sep 17 00:00:00 2001 From: MP Date: Fri, 30 Jan 2026 14:12:02 +0100 Subject: [PATCH 07/12] =?UTF-8?q?=F0=9F=86=99=20fd=20schema=20upgrade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FemDesign.Core/FemDesign.Core.csproj | 2 +- FemDesign.Core/Materials/Concrete.cs | 18 +- FemDesign.Core/Materials/Material.cs | 18 +- FemDesign.Core/Model/Model.cs | 2 +- ...n 24.00.005.cs => FEM-Design 25.00.001.cs} | 3363 ++++++++++++----- .../C#/Example 1 - Simple beam/Program.cs | 14 - .../Materials/SetConcreteTimeDependant.cs | 12 +- 7 files changed, 2424 insertions(+), 1005 deletions(-) rename FemDesign.Core/Strusoft/Interop/Struxml/Data/{FEM-Design 24.00.005.cs => FEM-Design 25.00.001.cs} (95%) diff --git a/FemDesign.Core/FemDesign.Core.csproj b/FemDesign.Core/FemDesign.Core.csproj index 99ceda4c..33b88e39 100644 --- a/FemDesign.Core/FemDesign.Core.csproj +++ b/FemDesign.Core/FemDesign.Core.csproj @@ -144,7 +144,7 @@ - + diff --git a/FemDesign.Core/Materials/Concrete.cs b/FemDesign.Core/Materials/Concrete.cs index 42bfb2ad..ab2bf6a1 100644 --- a/FemDesign.Core/Materials/Concrete.cs +++ b/FemDesign.Core/Materials/Concrete.cs @@ -1,6 +1,6 @@ // https://strusoft.com/ -using StruSoft.Interop_24; +using StruSoft.Interop_25; using System.Xml.Serialization; namespace FemDesign.Materials @@ -12,16 +12,16 @@ namespace FemDesign.Materials public partial class Concrete: MaterialBase { [XmlElement("tda_creep")] - public StruSoft.Interop_24.Tda_creep2 CreepTimeDependant { get; set; } + public StruSoft.Interop_25.Tda_creep2 CreepTimeDependant { get; set; } [XmlElement("tda_shrinkage")] - public StruSoft.Interop_24.Tda_shrinkage ShrinkageTimeDependant { get; set; } + public StruSoft.Interop_25.Tda_shrinkage ShrinkageTimeDependant { get; set; } [XmlElement("tda_elasticity")] - public StruSoft.Interop_24.Tda_elasticity ElasticityTimeDependant { get; set; } + public StruSoft.Interop_25.Tda_elasticity ElasticityTimeDependant { get; set; } [XmlElement("plastic_analysis_data")] - public StruSoft.Interop_24.Concrete_pl_data Plasticity { get; set; } + public StruSoft.Interop_25.Concrete_pl_data Plasticity { get; set; } [XmlAttribute("Fck")] public string Fck { get; set; } // material_base_value @@ -101,7 +101,7 @@ internal void SetMaterialParameters(double creepUls, double creepSlq, double cre internal void SetPlasticity(bool plastic = true, bool hardening = true, CrushingCriterion crushing = CrushingCriterion.Prager, bool tensionStrength = true, TensionStiffening tensionStiffening = TensionStiffening.Hinton, ReducedCompression reducedCompression = ReducedCompression.Vecchio1, bool reducedTransverse = false, bool ultimateStrainRebars = true ) { - var plasticity = new StruSoft.Interop_24.Concrete_pl_attribs(); + var plasticity = new StruSoft.Interop_25.Concrete_pl_attribs(); plasticity.Elasto_plastic_behaviour = plastic; plasticity.Plastic_hardening = hardening; @@ -112,7 +112,7 @@ internal void SetPlasticity(bool plastic = true, bool hardening = true, Crushing else { plasticity.Concrete_crushing = true; - plasticity.Concrete_crushing_option = (StruSoft.Interop_24.Cc_type)crushing; + plasticity.Concrete_crushing_option = (StruSoft.Interop_25.Cc_type)crushing; } plasticity.Tension_strength = tensionStrength; @@ -124,7 +124,7 @@ internal void SetPlasticity(bool plastic = true, bool hardening = true, Crushing else { plasticity.Tension_stiffening = true; - plasticity.Tension_stiffening_option = (StruSoft.Interop_24.Ts_type)tensionStiffening; + plasticity.Tension_stiffening_option = (StruSoft.Interop_25.Ts_type)tensionStiffening; if(tensionStiffening == TensionStiffening.Hinton) plasticity.Tension_stiffening_param = 0.5; @@ -143,7 +143,7 @@ internal void SetPlasticity(bool plastic = true, bool hardening = true, Crushing else { plasticity.Reduced_compression_strength = true; - plasticity.Reduced_compression_strength_option = (StruSoft.Interop_24.Rcsm_type) reducedCompression; + plasticity.Reduced_compression_strength_option = (StruSoft.Interop_25.Rcsm_type) reducedCompression; if(reducedCompression == ReducedCompression.Cervera) plasticity.Reduced_compression_strength_param = 0.550; diff --git a/FemDesign.Core/Materials/Material.cs b/FemDesign.Core/Materials/Material.cs index 8a97b09f..3d9ea915 100644 --- a/FemDesign.Core/Materials/Material.cs +++ b/FemDesign.Core/Materials/Material.cs @@ -232,7 +232,7 @@ public static Material SetConcretePlasticity(this Material material, bool plasti return newMaterial; } - public static Material SetCreep(this Material material, int to = 28, int humidity = 50, bool nonLinearCreep = true, StruSoft.Interop_24.Cement_type cementType = StruSoft.Interop_24.Cement_type.Class_S, bool increaseFinalValue = true) + public static Material SetCreep(this Material material, int to = 28, int humidity = 50, bool nonLinearCreep = true, StruSoft.Interop_25.Cement_type cementType = StruSoft.Interop_25.Cement_type.Class_S, bool increaseFinalValue = true) { if (material.Concrete == null) { @@ -240,8 +240,8 @@ public static Material SetCreep(this Material material, int to = 28, int humidit } // deep clone. downstreams objs will have contain changes made in this method, upstream objs will not. - var creep = new StruSoft.Interop_24.Tda_creep2(); - creep.EN_199211_2004 = new StruSoft.Interop_24.Tda_creep_EN1992() + var creep = new StruSoft.Interop_25.Tda_creep2(); + creep.EN_199211_2004 = new StruSoft.Interop_25.Tda_creep_EN1992() { T0 = to, RH = humidity, @@ -263,7 +263,7 @@ public static Material SetCreep(this Material material, int to = 28, int humidit return newMaterial; } - public static Material SetShrinkage(this Material material, int to = 28, int humidity = 50, StruSoft.Interop_24.Cement_type cementType = StruSoft.Interop_24.Cement_type.Class_S) + public static Material SetShrinkage(this Material material, int to = 28, int humidity = 50, StruSoft.Interop_25.Cement_type cementType = StruSoft.Interop_25.Cement_type.Class_S) { if (material.Concrete == null) { @@ -271,8 +271,8 @@ public static Material SetShrinkage(this Material material, int to = 28, int hum } // deep clone. downstreams objs will have contain changes made in this method, upstream objs will not. - var shrinkage = new StruSoft.Interop_24.Tda_shrinkage(); - shrinkage.EN_199211_2004 = new StruSoft.Interop_24.Tda_shrinkageEN_199211_2004() + var shrinkage = new StruSoft.Interop_25.Tda_shrinkage(); + shrinkage.EN_199211_2004 = new StruSoft.Interop_25.Tda_shrinkageEN_199211_2004() { Ts = to, RH = humidity, @@ -292,7 +292,7 @@ public static Material SetShrinkage(this Material material, int to = 28, int hum return newMaterial; } - public static Material setElasticity(this Material material, int to = 28, StruSoft.Interop_24.Cement_type cementType = StruSoft.Interop_24.Cement_type.Class_S) + public static Material setElasticity(this Material material, int to = 28, StruSoft.Interop_25.Cement_type cementType = StruSoft.Interop_25.Cement_type.Class_S) { if (material.Concrete == null) { @@ -300,8 +300,8 @@ public static Material setElasticity(this Material material, int to = 28, StruSo } // deep clone. downstreams objs will have contain changes made in this method, upstream objs will not. - var elasticity = new StruSoft.Interop_24.Tda_elasticity(); - elasticity.EN_199211_2004 = new StruSoft.Interop_24.Tda_elasticityEN_199211_2004() + var elasticity = new StruSoft.Interop_25.Tda_elasticity(); + elasticity.EN_199211_2004 = new StruSoft.Interop_25.Tda_elasticityEN_199211_2004() { T0 = to, Cement_type = cementType, diff --git a/FemDesign.Core/Model/Model.cs b/FemDesign.Core/Model/Model.cs index 8e574b44..dd4f2979 100644 --- a/FemDesign.Core/Model/Model.cs +++ b/FemDesign.Core/Model/Model.cs @@ -106,7 +106,7 @@ public partial class Model public List BoltTypes { get; set; } [XmlElement("bar_end_lib_type", Order = 19)] - public List BarEndReleaseTypes { get; set; } + public List BarEndReleaseTypes { get; set; } [XmlElement("geometry", Order = 20)] public StruSoft.Interop.StruXml.Data.DatabaseGeometry Geometry { get; set; } diff --git a/FemDesign.Core/Strusoft/Interop/Struxml/Data/FEM-Design 24.00.005.cs b/FemDesign.Core/Strusoft/Interop/Struxml/Data/FEM-Design 25.00.001.cs similarity index 95% rename from FemDesign.Core/Strusoft/Interop/Struxml/Data/FEM-Design 24.00.005.cs rename to FemDesign.Core/Strusoft/Interop/Struxml/Data/FEM-Design 25.00.001.cs index 684ecbcf..883fbc15 100644 --- a/FemDesign.Core/Strusoft/Interop/Struxml/Data/FEM-Design 24.00.005.cs +++ b/FemDesign.Core/Strusoft/Interop/Struxml/Data/FEM-Design 25.00.001.cs @@ -8,7 +8,7 @@ //------------------------------------------------------------------------------ // This code was generated by XmlSchemaClassGenerator version 2.1.1162.0 -namespace StruSoft.Interop_24 +namespace StruSoft.Interop_25 { @@ -630,6 +630,8 @@ public enum Standardtype EC, + EC_G2, + [System.Xml.Serialization.XmlEnumAttribute("general")] General, @@ -953,6 +955,40 @@ public partial class Ecc_value_type [System.Xml.Serialization.XmlAttributeAttribute("z")] public double Z { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Beampos_type _reference_point = StruSoft.Interop_25.Beampos_type.Center_of_gravity; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Beampos_type.Center_of_gravity)] + [System.Xml.Serialization.XmlAttributeAttribute("reference_point")] + public Beampos_type Reference_point + { + get + { + return _reference_point; + } + set + { + _reference_point = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Rec_pos_type _rectangle_position = StruSoft.Interop_25.Rec_pos_type.Center_center; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Rec_pos_type.Center_center)] + [System.Xml.Serialization.XmlAttributeAttribute("rectangle_position")] + public Rec_pos_type Rectangle_position + { + get + { + return _rectangle_position; + } + set + { + _rectangle_position = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -985,6 +1021,56 @@ public Ecc_value_type() } } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("beampos_type", Namespace="urn:strusoft")] + public enum Beampos_type + { + + [System.Xml.Serialization.XmlEnumAttribute("center_of_gravity")] + Center_of_gravity, + + [System.Xml.Serialization.XmlEnumAttribute("shear_center")] + Shear_center, + + [System.Xml.Serialization.XmlEnumAttribute("bounding_rectangle")] + Bounding_rectangle, + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("rec_pos_type", Namespace="urn:strusoft")] + public enum Rec_pos_type + { + + [System.Xml.Serialization.XmlEnumAttribute("top_left")] + Top_left, + + [System.Xml.Serialization.XmlEnumAttribute("top_center")] + Top_center, + + [System.Xml.Serialization.XmlEnumAttribute("top_right")] + Top_right, + + [System.Xml.Serialization.XmlEnumAttribute("center_left")] + Center_left, + + [System.Xml.Serialization.XmlEnumAttribute("center_center")] + Center_center, + + [System.Xml.Serialization.XmlEnumAttribute("center_right")] + Center_right, + + [System.Xml.Serialization.XmlEnumAttribute("bottom_left")] + Bottom_left, + + [System.Xml.Serialization.XmlEnumAttribute("bottom_center")] + Bottom_center, + + [System.Xml.Serialization.XmlEnumAttribute("bottom_right")] + Bottom_right, + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute("eccentricity_type", Namespace="urn:strusoft")] @@ -1352,246 +1438,314 @@ public double R_z_release } [System.Xml.Serialization.XmlIgnoreAttribute()] - private System.Collections.Generic.List _anyAttribute; - - [System.Xml.Serialization.XmlAnyAttributeAttribute()] - public System.Collections.Generic.List AnyAttribute - { - get - { - return _anyAttribute; - } - set - { - _anyAttribute = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - public bool AnyAttributeSpecified - { - get - { - return ((this.AnyAttribute != null) - && (this.AnyAttribute.Count != 0)); - } - } - - public Connectivity_type() - { - this._anyAttribute = new System.Collections.Generic.List(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] - [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("simple_connectivity_type", Namespace="urn:strusoft")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Simple_connectivity_type - { - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _m_x = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("m_x")] - public bool M_x - { - get - { - return _m_x; - } - set - { - _m_x = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private double _m_x_release = 0D; - - [System.ComponentModel.DefaultValueAttribute(0D)] - [System.Xml.Serialization.XmlAttributeAttribute("m_x_release")] - public double M_x_release - { - get - { - return _m_x_release; - } - set - { - _m_x_release = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _m_y = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("m_y")] - public bool M_y - { - get - { - return _m_y; - } - set - { - _m_y = value; - } - } + private bool _v_x = true; - [System.Xml.Serialization.XmlIgnoreAttribute()] - private double _m_y_release = 0D; - - [System.ComponentModel.DefaultValueAttribute(0D)] - [System.Xml.Serialization.XmlAttributeAttribute("m_y_release")] - public double M_y_release - { - get - { - return _m_y_release; - } - set - { - _m_y_release = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _m_z = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("m_z")] - public bool M_z - { - get - { - return _m_z; - } - set - { - _m_z = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private double _m_z_release = 0D; - - [System.ComponentModel.DefaultValueAttribute(0D)] - [System.Xml.Serialization.XmlAttributeAttribute("m_z_release")] - public double M_z_release - { - get - { - return _m_z_release; - } - set - { - _m_z_release = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _r_x = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("r_x")] - public bool R_x - { - get - { - return _r_x; - } - set - { - _r_x = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private double _r_x_release = 0D; - - [System.ComponentModel.DefaultValueAttribute(0D)] - [System.Xml.Serialization.XmlAttributeAttribute("r_x_release")] - public double R_x_release - { - get - { - return _r_x_release; - } - set - { - _r_x_release = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _r_y = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("r_y")] - public bool R_y - { - get - { - return _r_y; - } - set - { - _r_y = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private double _r_y_release = 0D; - - [System.ComponentModel.DefaultValueAttribute(0D)] - [System.Xml.Serialization.XmlAttributeAttribute("r_y_release")] - public double R_y_release - { - get - { - return _r_y_release; - } - set - { - _r_y_release = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _r_z = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("r_z")] - public bool R_z + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("v_x")] + public bool V_x { get { - return _r_z; + return _v_x; } set { - _r_z = value; + _v_x = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - private double _r_z_release = 0D; + private double _v_x_release = 0D; [System.ComponentModel.DefaultValueAttribute(0D)] - [System.Xml.Serialization.XmlAttributeAttribute("r_z_release")] - public double R_z_release + [System.Xml.Serialization.XmlAttributeAttribute("v_x_release")] + public double V_x_release { get { - return _r_z_release; + return _v_x_release; } set { - _r_z_release = value; + _v_x_release = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public Connectivity_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("simple_connectivity_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Simple_connectivity_type + { + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _m_x = false; + + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("m_x")] + public bool M_x + { + get + { + return _m_x; + } + set + { + _m_x = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _m_x_release = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("m_x_release")] + public double M_x_release + { + get + { + return _m_x_release; + } + set + { + _m_x_release = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _m_y = false; + + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("m_y")] + public bool M_y + { + get + { + return _m_y; + } + set + { + _m_y = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _m_y_release = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("m_y_release")] + public double M_y_release + { + get + { + return _m_y_release; + } + set + { + _m_y_release = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _m_z = false; + + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("m_z")] + public bool M_z + { + get + { + return _m_z; + } + set + { + _m_z = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _m_z_release = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("m_z_release")] + public double M_z_release + { + get + { + return _m_z_release; + } + set + { + _m_z_release = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _r_x = false; + + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("r_x")] + public bool R_x + { + get + { + return _r_x; + } + set + { + _r_x = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _r_x_release = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("r_x_release")] + public double R_x_release + { + get + { + return _r_x_release; + } + set + { + _r_x_release = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _r_y = false; + + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("r_y")] + public bool R_y + { + get + { + return _r_y; + } + set + { + _r_y = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _r_y_release = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("r_y_release")] + public double R_y_release + { + get + { + return _r_y_release; + } + set + { + _r_y_release = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _r_z = false; + + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("r_z")] + public bool R_z + { + get + { + return _r_z; + } + set + { + _r_z = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _r_z_release = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("r_z_release")] + public double R_z_release + { + get + { + return _r_z_release; + } + set + { + _r_z_release = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _v_x = true; + + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("v_x")] + public bool V_x + { + get + { + return _v_x; + } + set + { + _v_x = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _v_x_release = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("v_x_release")] + public double V_x_release + { + get + { + return _v_x_release; + } + set + { + _v_x_release = value; } } @@ -3060,9 +3214,9 @@ public partial class Simple_stiffness_type public Stiff_base_type Rot_z { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Detach_type _detach = StruSoft.Interop_24.Detach_type.Empty; + private Detach_type _detach = StruSoft.Interop_25.Detach_type.Empty; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Detach_type.Empty)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Detach_type.Empty)] [System.Xml.Serialization.XmlAttributeAttribute("detach")] public Detach_type Detach { @@ -3205,23 +3359,6 @@ public partial class Rigidity_data_type2 : Rigidity_data_type1 [System.Xml.Serialization.XmlIncludeAttribute(typeof(Rigidity_data_type3))] public partial class Rigidity_data_type1 : Rigidity_data_type0 { - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private Detach_type _detach = StruSoft.Interop_24.Detach_type.Empty; - - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Detach_type.Empty)] - [System.Xml.Serialization.XmlAttributeAttribute("detach")] - public Detach_type Detach - { - get - { - return _detach; - } - set - { - _detach = value; - } - } } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -3240,6 +3377,40 @@ public partial class Rigidity_data_type0 [System.Xml.Serialization.XmlElementAttribute("plastic_limit_forces")] public Plasticity_type_3d Plastic_limit_forces { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Detach_type _detach = StruSoft.Interop_25.Detach_type.Empty; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Detach_type.Empty)] + [System.Xml.Serialization.XmlAttributeAttribute("detach")] + public Detach_type Detach + { + get + { + return _detach; + } + set + { + _detach = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _wx = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("Wx")] + public double Wx + { + get + { + return _wx; + } + set + { + _wx = value; + } + } } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -3375,9 +3546,9 @@ public System.Collections.Generic.List Plastic_limits } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Detach_type _detach = StruSoft.Interop_24.Detach_type.Empty; + private Detach_type _detach = StruSoft.Interop_25.Detach_type.Empty; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Detach_type.Empty)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Detach_type.Empty)] [System.Xml.Serialization.XmlAttributeAttribute("detach")] public Detach_type Detach { @@ -3443,6 +3614,23 @@ public partial class Stiffness_record : Stiffness_motion_record [System.Xml.Serialization.XmlAttributeAttribute("Cz_pos")] public double Cz_pos { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _wx = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("Wx")] + public double Wx + { + get + { + return _wx; + } + set + { + _wx = value; + } + } } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -3767,9 +3955,9 @@ public double Penwidth } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Pointstyle_type _point_style = StruSoft.Interop_24.Pointstyle_type.Cross; + private Pointstyle_type _point_style = StruSoft.Interop_25.Pointstyle_type.Cross; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Pointstyle_type.Cross)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Pointstyle_type.Cross)] [System.Xml.Serialization.XmlAttributeAttribute("point_style")] public Pointstyle_type Point_style { @@ -3824,9 +4012,9 @@ public partial class Fill_type { [System.Xml.Serialization.XmlIgnoreAttribute()] - private Fillmode_type _mode = StruSoft.Interop_24.Fillmode_type.Auto_fill; + private Fillmode_type _mode = StruSoft.Interop_25.Fillmode_type.Auto_fill; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Fillmode_type.Auto_fill)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Fillmode_type.Auto_fill)] [System.Xml.Serialization.XmlAttributeAttribute("mode")] public Fillmode_type Mode { @@ -3914,9 +4102,9 @@ public partial class Text_font_type : Font_type { [System.Xml.Serialization.XmlIgnoreAttribute()] - private Hor_align _h_align = StruSoft.Interop_24.Hor_align.Left; + private Hor_align _h_align = StruSoft.Interop_25.Hor_align.Left; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Hor_align.Left)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Hor_align.Left)] [System.Xml.Serialization.XmlAttributeAttribute("h_align")] public Hor_align H_align { @@ -3931,9 +4119,9 @@ public Hor_align H_align } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ver_align _v_align = StruSoft.Interop_24.Ver_align.Bottom; + private Ver_align _v_align = StruSoft.Interop_25.Ver_align.Bottom; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ver_align.Bottom)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ver_align.Bottom)] [System.Xml.Serialization.XmlAttributeAttribute("v_align")] public Ver_align V_align { @@ -3975,9 +4163,9 @@ public string Font } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Script_type _script = StruSoft.Interop_24.Script_type.Western; + private Script_type _script = StruSoft.Interop_25.Script_type.Western; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Script_type.Western)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Script_type.Western)] [System.Xml.Serialization.XmlAttributeAttribute("script")] public Script_type Script { @@ -4934,9 +5122,9 @@ public bool Cantilever } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ver_align _load_position = StruSoft.Interop_24.Ver_align.Top; + private Ver_align _load_position = StruSoft.Interop_25.Ver_align.Top; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ver_align.Top)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ver_align.Top)] [System.Xml.Serialization.XmlAttributeAttribute("load_position")] public Ver_align Load_position { @@ -6006,9 +6194,9 @@ public string Name public string Complex_composite { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Steelmadetype _made = StruSoft.Interop_24.Steelmadetype.Rolled; + private Steelmadetype _made = StruSoft.Interop_25.Steelmadetype.Rolled; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Steelmadetype.Rolled)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Steelmadetype.Rolled)] [System.Xml.Serialization.XmlAttributeAttribute("made")] public Steelmadetype Made { @@ -6142,36 +6330,19 @@ public bool First_order_analysis_Sc } [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; + private bool _seven_degrees_of_freedom = false; - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage - { - get - { - return _stage; - } - set - { - _stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("seven_degrees_of_freedom")] + public bool Seven_degrees_of_freedom { get { - return _end_stage; + return _seven_degrees_of_freedom; } set { - _end_stage = value; + _seven_degrees_of_freedom = value; } } @@ -6409,6 +6580,7 @@ public System.Collections.Generic.List Buckling_data public Apex_type() { this._buckling_data = new System.Collections.Generic.List(); + this._anyAttribute = new System.Collections.Generic.List(); } [System.Xml.Serialization.XmlElementAttribute("colouring")] @@ -6435,70 +6607,28 @@ public bool Rounded_edge } [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage_A = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage_A")] - public int Stage_A - { - get - { - return _stage_A; - } - set - { - _stage_A = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage_B = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage_B")] - public int Stage_B - { - get - { - return _stage_B; - } - set - { - _stage_B = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage_A = "last_stage"; + private System.Collections.Generic.List _anyAttribute; - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage_A")] - public string End_stage_A + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute { get { - return _end_stage_A; + return _anyAttribute; } set { - _end_stage_A = value; + _anyAttribute = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage_B = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage_B")] - public string End_stage_B + public bool AnyAttributeSpecified { get { - return _end_stage_B; - } - set - { - _end_stage_B = value; + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); } } } @@ -6655,9 +6785,9 @@ public string Hash_order_id public Beamtype Type { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Shell_model_type _shell_model = StruSoft.Interop_24.Shell_model_type.None; + private Shell_model_type _shell_model = StruSoft.Interop_25.Shell_model_type.None; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Shell_model_type.None)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Shell_model_type.None)] [System.Xml.Serialization.XmlAttributeAttribute("shell_model")] public Shell_model_type Shell_model { @@ -7821,39 +7951,32 @@ public System.Collections.Generic.List Item public Panel_typeInternal_panels() { this._item = new System.Collections.Generic.List(); + this._anyAttribute = new System.Collections.Generic.List(); } [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; + private System.Collections.Generic.List _anyAttribute; - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute { get { - return _stage; + return _anyAttribute; } set { - _stage = value; + _anyAttribute = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage + public bool AnyAttributeSpecified { get { - return _end_stage; - } - set - { - _end_stage = value; + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); } } } @@ -8139,6 +8262,23 @@ public System.Collections.Generic.List Plastic_limits _plastic_limits = value; } } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _wx = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("Wx")] + public double Wx + { + get + { + return _wx; + } + set + { + _wx = value; + } + } } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -8150,9 +8290,9 @@ public partial class Rigidity_group_type1 : Rigidity_group_type0 { [System.Xml.Serialization.XmlIgnoreAttribute()] - private Detach_type _detach = StruSoft.Interop_24.Detach_type.Empty; + private Detach_type _detach = StruSoft.Interop_25.Detach_type.Empty; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Detach_type.Empty)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Detach_type.Empty)] [System.Xml.Serialization.XmlAttributeAttribute("detach")] public Detach_type Detach { @@ -11427,9 +11567,9 @@ public bool Has_prefix public bool Id_is_letter { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Priority_type _priority = StruSoft.Interop_24.Priority_type.Primary; + private Priority_type _priority = StruSoft.Interop_25.Priority_type.Primary; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Priority_type.Primary)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Priority_type.Primary)] [System.Xml.Serialization.XmlAttributeAttribute("priority")] public Priority_type Priority { @@ -11461,9 +11601,9 @@ public bool Use_for_views } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Axis_position _label_position = StruSoft.Interop_24.Axis_position.Start; + private Axis_position _label_position = StruSoft.Interop_25.Axis_position.Start; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Axis_position.Start)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Axis_position.Start)] [System.Xml.Serialization.XmlAttributeAttribute("label_position")] public Axis_position Label_position { @@ -11630,9 +11770,9 @@ public Ts_visible_edge_type() } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Visiblelinetype _linetype = StruSoft.Interop_24.Visiblelinetype.Line; + private Visiblelinetype _linetype = StruSoft.Interop_25.Visiblelinetype.Line; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Visiblelinetype.Line)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Visiblelinetype.Line)] [System.Xml.Serialization.XmlAttributeAttribute("linetype")] public Visiblelinetype Linetype { @@ -11917,39 +12057,51 @@ public partial class Lnfoundation_ref_type public string Ref_support { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _supports_stage = 1; + private System.Collections.Generic.List _anyAttribute; - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("supports_stage")] - public int Supports_stage + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute { get { - return _supports_stage; + return _anyAttribute; } set { - _supports_stage = value; + _anyAttribute = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _supports_end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("supports_end_stage")] - public string Supports_end_stage + public bool AnyAttributeSpecified { get { - return _supports_end_stage; - } - set - { - _supports_end_stage = value; + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); } } + public Lnfoundation_ref_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("ptfoundation_ref_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Ptfoundation_ref_type + { + + [System.Xml.Serialization.XmlAttributeAttribute("ref_slab")] + public string Ref_slab { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("ref_support")] + public string Ref_support { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -11976,7 +12128,7 @@ public bool AnyAttributeSpecified } } - public Lnfoundation_ref_type() + public Ptfoundation_ref_type() { this._anyAttribute = new System.Collections.Generic.List(); } @@ -11984,10 +12136,10 @@ public Lnfoundation_ref_type() [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("ptfoundation_ref_type", Namespace="urn:strusoft")] + [System.Xml.Serialization.XmlTypeAttribute("sffoundation_ref_type", Namespace="urn:strusoft")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Ptfoundation_ref_type + public partial class Sffoundation_ref_type { [System.Xml.Serialization.XmlAttributeAttribute("ref_slab")] @@ -11997,39 +12149,54 @@ public partial class Ptfoundation_ref_type public string Ref_support { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _supports_stage = 1; + private System.Collections.Generic.List _anyAttribute; - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("supports_stage")] - public int Supports_stage + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute { get { - return _supports_stage; + return _anyAttribute; } set { - _supports_stage = value; + _anyAttribute = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _supports_end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("supports_end_stage")] - public string Supports_end_stage + public bool AnyAttributeSpecified { get { - return _supports_end_stage; - } - set - { - _supports_end_stage = value; + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); } } + public Sffoundation_ref_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("foundation_plinth_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Foundation_plinth_type + { + + [System.Xml.Serialization.XmlAttributeAttribute("a")] + public double A { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("b")] + public double B { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("h")] + public double H { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -12056,7 +12223,7 @@ public bool AnyAttributeSpecified } } - public Ptfoundation_ref_type() + public Foundation_plinth_type() { this._anyAttribute = new System.Collections.Generic.List(); } @@ -12064,170 +12231,41 @@ public Ptfoundation_ref_type() [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("sffoundation_ref_type", Namespace="urn:strusoft")] + [System.Xml.Serialization.XmlTypeAttribute("extruded_foundation_type", Namespace="urn:strusoft")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Sffoundation_ref_type + public partial class Extruded_foundation_type { - [System.Xml.Serialization.XmlAttributeAttribute("ref_slab")] - public string Ref_slab { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("ref_support")] - public string Ref_support { get; set; } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _supports_stage = 1; + [System.Xml.Serialization.XmlElementAttribute("region")] + public Region_type Region { get; set; } - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("supports_stage")] - public int Supports_stage + public Extruded_foundation_type() { - get - { - return _supports_stage; - } - set - { - _supports_stage = value; - } + this.Region = new Region_type(); + this._anyAttribute = new System.Collections.Generic.List(); } + [System.Xml.Serialization.XmlElementAttribute("cuboid_plinth")] + public Foundation_plinth_type Cuboid_plinth { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("thickness")] + public double Thickness { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _supports_end_stage = "last_stage"; + private bool _above = false; - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("supports_end_stage")] - public string Supports_end_stage + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("above")] + public bool Above { get { - return _supports_end_stage; + return _above; } set { - _supports_end_stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private System.Collections.Generic.List _anyAttribute; - - [System.Xml.Serialization.XmlAnyAttributeAttribute()] - public System.Collections.Generic.List AnyAttribute - { - get - { - return _anyAttribute; - } - set - { - _anyAttribute = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - public bool AnyAttributeSpecified - { - get - { - return ((this.AnyAttribute != null) - && (this.AnyAttribute.Count != 0)); - } - } - - public Sffoundation_ref_type() - { - this._anyAttribute = new System.Collections.Generic.List(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] - [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("foundation_plinth_type", Namespace="urn:strusoft")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Foundation_plinth_type - { - - [System.Xml.Serialization.XmlAttributeAttribute("a")] - public double A { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("b")] - public double B { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("h")] - public double H { get; set; } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private System.Collections.Generic.List _anyAttribute; - - [System.Xml.Serialization.XmlAnyAttributeAttribute()] - public System.Collections.Generic.List AnyAttribute - { - get - { - return _anyAttribute; - } - set - { - _anyAttribute = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - public bool AnyAttributeSpecified - { - get - { - return ((this.AnyAttribute != null) - && (this.AnyAttribute.Count != 0)); - } - } - - public Foundation_plinth_type() - { - this._anyAttribute = new System.Collections.Generic.List(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] - [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("extruded_foundation_type", Namespace="urn:strusoft")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Extruded_foundation_type - { - - [System.Xml.Serialization.XmlElementAttribute("region")] - public Region_type Region { get; set; } - - public Extruded_foundation_type() - { - this.Region = new Region_type(); - this._anyAttribute = new System.Collections.Generic.List(); - } - - [System.Xml.Serialization.XmlElementAttribute("cuboid_plinth")] - public Foundation_plinth_type Cuboid_plinth { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("thickness")] - public double Thickness { get; set; } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _above = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("above")] - public bool Above - { - get - { - return _above; - } - set - { - _above = value; + _above = value; } } @@ -12448,9 +12486,9 @@ public double Bedding_modulus } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Foundationsystems_type _analythical_system = StruSoft.Interop_24.Foundationsystems_type.Simple; + private Foundationsystems_type _analythical_system = StruSoft.Interop_25.Foundationsystems_type.Simple; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Foundationsystems_type.Simple)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Foundationsystems_type.Simple)] [System.Xml.Serialization.XmlAttributeAttribute("analythical_system")] public Foundationsystems_type Analythical_system { @@ -12501,40 +12539,6 @@ public uint Fillcolor } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _slabs_stage = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("slabs_stage")] - public int Slabs_stage - { - get - { - return _slabs_stage; - } - set - { - _slabs_stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _slabs_end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("slabs_end_stage")] - public string Slabs_end_stage - { - get - { - return _slabs_end_stage; - } - set - { - _slabs_end_stage = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] private int _point_connections_stage = 1; @@ -12716,9 +12720,9 @@ public double Bedding_modulus } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Foundationsystems_type _analythical_system = StruSoft.Interop_24.Foundationsystems_type.Simple; + private Foundationsystems_type _analythical_system = StruSoft.Interop_25.Foundationsystems_type.Simple; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Foundationsystems_type.Simple)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Foundationsystems_type.Simple)] [System.Xml.Serialization.XmlAttributeAttribute("analythical_system")] public Foundationsystems_type Analythical_system { @@ -12913,9 +12917,9 @@ public double Bedding_modulus } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Slabfoundationsystems_type _analythical_system = StruSoft.Interop_24.Slabfoundationsystems_type.Surface_support_group; + private Slabfoundationsystems_type _analythical_system = StruSoft.Interop_25.Slabfoundationsystems_type.Surface_support_group; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Slabfoundationsystems_type.Surface_support_group)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Slabfoundationsystems_type.Surface_support_group)] [System.Xml.Serialization.XmlAttributeAttribute("analythical_system")] public Slabfoundationsystems_type Analythical_system { @@ -13699,9 +13703,9 @@ public Piles_beam_type() public string Complex_composite { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Steelmadetype _made = StruSoft.Interop_24.Steelmadetype.Rolled; + private Steelmadetype _made = StruSoft.Interop_25.Steelmadetype.Rolled; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Steelmadetype.Rolled)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Steelmadetype.Rolled)] [System.Xml.Serialization.XmlAttributeAttribute("made")] public Steelmadetype Made { @@ -13718,40 +13722,6 @@ public Steelmadetype Made [System.Xml.Serialization.XmlAttributeAttribute("guid")] public string Guid { get; set; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage - { - get - { - return _stage; - } - set - { - _stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage - { - get - { - return _end_stage; - } - set - { - _end_stage = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -13992,40 +13962,6 @@ public partial class Pile_typePoint_support [System.Xml.Serialization.XmlElementAttribute("rigidity_group")] public Pile_rigidity_group_type2 Rigidity_group { get; set; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage - { - get - { - return _stage; - } - set - { - _stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage - { - get - { - return _end_stage; - } - set - { - _end_stage = value; - } - } - [System.Xml.Serialization.XmlAttributeAttribute("guid")] public string Guid { get; set; } @@ -14081,114 +14017,80 @@ public partial class Pile_typeLine_support [System.Xml.Serialization.XmlAttributeAttribute("beta_neg")] public double Beta_neg { get; set; } + [System.Xml.Serialization.XmlAttributeAttribute("guid")] + public string Guid { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; + private System.Collections.Generic.List _anyAttribute; - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute { get { - return _stage; + return _anyAttribute; } set { - _stage = value; + _anyAttribute = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage + public Pile_typeLine_support() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("excavation_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Excavation_type + { + + [System.Xml.Serialization.XmlElementAttribute("contour")] + public Horizontal_polygon_2d Contour { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("guid")] + public string Guid { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("last_change", DataType="dateTime")] + public System.DateTime Last_change { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("action")] + public Modification_type Action { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private string _hash_order_id = "-1"; + + [System.ComponentModel.DefaultValueAttribute("-1")] + [System.Xml.Serialization.XmlAttributeAttribute("hash_order_id")] + public string Hash_order_id { get { - return _end_stage; + return _hash_order_id; } set { - _end_stage = value; + _hash_order_id = value; } } - [System.Xml.Serialization.XmlAttributeAttribute("guid")] - public string Guid { get; set; } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private System.Collections.Generic.List _anyAttribute; - - [System.Xml.Serialization.XmlAnyAttributeAttribute()] - public System.Collections.Generic.List AnyAttribute - { - get - { - return _anyAttribute; - } - set - { - _anyAttribute = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - public bool AnyAttributeSpecified - { - get - { - return ((this.AnyAttribute != null) - && (this.AnyAttribute.Count != 0)); - } - } - - public Pile_typeLine_support() - { - this._anyAttribute = new System.Collections.Generic.List(); - } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] - [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("excavation_type", Namespace="urn:strusoft")] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Excavation_type - { - - [System.Xml.Serialization.XmlElementAttribute("contour")] - public Horizontal_polygon_2d Contour { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("guid")] - public string Guid { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("last_change", DataType="dateTime")] - public System.DateTime Last_change { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("action")] - public Modification_type Action { get; set; } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _hash_order_id = "-1"; - - [System.ComponentModel.DefaultValueAttribute("-1")] - [System.Xml.Serialization.XmlAttributeAttribute("hash_order_id")] - public string Hash_order_id - { - get - { - return _hash_order_id; - } - set - { - _hash_order_id = value; - } - } - - [System.Xml.Serialization.XmlAttributeAttribute("depth")] - public double Depth { get; set; } + [System.Xml.Serialization.XmlAttributeAttribute("depth")] + public double Depth { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -14536,9 +14438,9 @@ public string Hash_order_id public Sectiontype Type { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Fd_mat_type _fdmat = StruSoft.Interop_24.Fd_mat_type.Item_1; + private Fd_mat_type _fdmat = StruSoft.Interop_25.Fd_mat_type.Item_1; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Fd_mat_type.Item_1)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Fd_mat_type.Item_1)] [System.Xml.Serialization.XmlAttributeAttribute("fd-mat")] public Fd_mat_type Fdmat { @@ -15597,9 +15499,9 @@ public bool Elasto_plastic_transverse_shear_U } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Eptso_type _elasto_plastic_transverse_shear_option_U = StruSoft.Interop_24.Eptso_type.Parabolic; + private Eptso_type _elasto_plastic_transverse_shear_option_U = StruSoft.Interop_25.Eptso_type.Parabolic; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Eptso_type.Parabolic)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Eptso_type.Parabolic)] [System.Xml.Serialization.XmlAttributeAttribute("elasto_plastic_transverse_shear_option_U")] public Eptso_type Elasto_plastic_transverse_shear_option_U { @@ -15640,9 +15542,9 @@ public bool Elasto_plastic_transverse_shear_Sq } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Eptso_type _elasto_plastic_transverse_shear_option_Sq = StruSoft.Interop_24.Eptso_type.Parabolic; + private Eptso_type _elasto_plastic_transverse_shear_option_Sq = StruSoft.Interop_25.Eptso_type.Parabolic; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Eptso_type.Parabolic)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Eptso_type.Parabolic)] [System.Xml.Serialization.XmlAttributeAttribute("elasto_plastic_transverse_shear_option_Sq")] public Eptso_type Elasto_plastic_transverse_shear_option_Sq { @@ -15683,9 +15585,9 @@ public bool Elasto_plastic_transverse_shear_Sf } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Eptso_type _elasto_plastic_transverse_shear_option_Sf = StruSoft.Interop_24.Eptso_type.Parabolic; + private Eptso_type _elasto_plastic_transverse_shear_option_Sf = StruSoft.Interop_25.Eptso_type.Parabolic; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Eptso_type.Parabolic)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Eptso_type.Parabolic)] [System.Xml.Serialization.XmlAttributeAttribute("elasto_plastic_transverse_shear_option_Sf")] public Eptso_type Elasto_plastic_transverse_shear_option_Sf { @@ -15726,9 +15628,9 @@ public bool Elasto_plastic_transverse_shear_Sc } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Eptso_type _elasto_plastic_transverse_shear_option_Sc = StruSoft.Interop_24.Eptso_type.Parabolic; + private Eptso_type _elasto_plastic_transverse_shear_option_Sc = StruSoft.Interop_25.Eptso_type.Parabolic; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Eptso_type.Parabolic)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Eptso_type.Parabolic)] [System.Xml.Serialization.XmlAttributeAttribute("elasto_plastic_transverse_shear_option_Sc")] public Eptso_type Elasto_plastic_transverse_shear_option_Sc { @@ -15930,15 +15832,84 @@ public double Fck_cube [System.Xml.Serialization.XmlAttributeAttribute("Ecm")] public double Ecm { get; set; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] [System.Xml.Serialization.XmlAttributeAttribute("gammaC_0")] - public double GammaC_0 { get; set; } + public double GammaC_0Value { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool GammaC_0ValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable GammaC_0 + { + get + { + if (this.GammaC_0ValueSpecified) + { + return this.GammaC_0Value; + } + else + { + return null; + } + } + set + { + this.GammaC_0Value = value.GetValueOrDefault(); + this.GammaC_0ValueSpecified = value.HasValue; + } + } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] [System.Xml.Serialization.XmlAttributeAttribute("gammaC_1")] - public double GammaC_1 { get; set; } + public double GammaC_1Value { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool GammaC_1ValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable GammaC_1 + { + get + { + if (this.GammaC_1ValueSpecified) + { + return this.GammaC_1Value; + } + else + { + return null; + } + } + set + { + this.GammaC_1Value = value.GetValueOrDefault(); + this.GammaC_1ValueSpecified = value.HasValue; + } + } [System.Xml.Serialization.XmlAttributeAttribute("gammaCE")] public double GammaCE { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _gammaCE_1 = 1.15D; + + [System.ComponentModel.DefaultValueAttribute(1.15D)] + [System.Xml.Serialization.XmlAttributeAttribute("gammaCE_1")] + public double GammaCE_1 + { + get + { + return _gammaCE_1; + } + set + { + _gammaCE_1 = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private double _gammaCfi = 1D; @@ -15979,11 +15950,63 @@ public double GammaSfi } } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] [System.Xml.Serialization.XmlAttributeAttribute("alfaCc")] - public double AlfaCc { get; set; } + public double AlfaCcValue { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool AlfaCcValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable AlfaCc + { + get + { + if (this.AlfaCcValueSpecified) + { + return this.AlfaCcValue; + } + else + { + return null; + } + } + set + { + this.AlfaCcValue = value.GetValueOrDefault(); + this.AlfaCcValueSpecified = value.HasValue; + } + } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] [System.Xml.Serialization.XmlAttributeAttribute("alfaCt")] - public double AlfaCt { get; set; } + public double AlfaCtValue { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool AlfaCtValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable AlfaCt + { + get + { + if (this.AlfaCtValueSpecified) + { + return this.AlfaCtValue; + } + else + { + return null; + } + } + set + { + this.AlfaCtValue = value.GetValueOrDefault(); + this.AlfaCtValueSpecified = value.HasValue; + } + } [System.Xml.Serialization.XmlAttributeAttribute("Fcd_0")] public double Fcd_0 { get; set; } @@ -16061,11 +16084,63 @@ public System.Nullable Epscu2 } } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] [System.Xml.Serialization.XmlAttributeAttribute("Epsc3")] - public double Epsc3 { get; set; } + public double Epsc3Value { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool Epsc3ValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable Epsc3 + { + get + { + if (this.Epsc3ValueSpecified) + { + return this.Epsc3Value; + } + else + { + return null; + } + } + set + { + this.Epsc3Value = value.GetValueOrDefault(); + this.Epsc3ValueSpecified = value.HasValue; + } + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] [System.Xml.Serialization.XmlAttributeAttribute("Epscu3")] - public double Epscu3 { get; set; } + public double Epscu3Value { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool Epscu3ValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable Epscu3 + { + get + { + if (this.Epscu3ValueSpecified) + { + return this.Epscu3Value; + } + else + { + return null; + } + } + set + { + this.Epscu3Value = value.GetValueOrDefault(); + this.Epscu3ValueSpecified = value.HasValue; + } + } [System.Xml.Serialization.XmlAttributeAttribute("environment")] public string Environment { get; set; } @@ -16167,6 +16242,125 @@ public double Stability } } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _ktc = 1D; + + [System.ComponentModel.DefaultValueAttribute(1D)] + [System.Xml.Serialization.XmlAttributeAttribute("ktc")] + public double Ktc + { + get + { + return _ktc; + } + set + { + _ktc = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _ktt = 1D; + + [System.ComponentModel.DefaultValueAttribute(1D)] + [System.Xml.Serialization.XmlAttributeAttribute("ktt")] + public double Ktt + { + get + { + return _ktt; + } + set + { + _ktt = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _epscu = 0.0035D; + + [System.ComponentModel.DefaultValueAttribute(0.0035D)] + [System.Xml.Serialization.XmlAttributeAttribute("Epscu")] + public double Epscu + { + get + { + return _epscu; + } + set + { + _epscu = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _gammaV_0 = 1D; + + [System.ComponentModel.DefaultValueAttribute(1D)] + [System.Xml.Serialization.XmlAttributeAttribute("gammaV_0")] + public double GammaV_0 + { + get + { + return _gammaV_0; + } + set + { + _gammaV_0 = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _gammaV_1 = 1D; + + [System.ComponentModel.DefaultValueAttribute(1D)] + [System.Xml.Serialization.XmlAttributeAttribute("gammaV_1")] + public double GammaV_1 + { + get + { + return _gammaV_1; + } + set + { + _gammaV_1 = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _gammaV_fi = 1D; + + [System.ComponentModel.DefaultValueAttribute(1D)] + [System.Xml.Serialization.XmlAttributeAttribute("gammaV_fi")] + public double GammaV_fi + { + get + { + return _gammaV_fi; + } + set + { + _gammaV_fi = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _d_lower = 8D; + + [System.ComponentModel.DefaultValueAttribute(8D)] + [System.Xml.Serialization.XmlAttributeAttribute("D_lower")] + public double D_lower + { + get + { + return _d_lower; + } + set + { + _d_lower = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -16774,9 +16968,9 @@ public partial class Material_typeBrick public Optional_material_attribs Base_data { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Strength_type _strength_for = StruSoft.Interop_24.Strength_type.Brick_only; + private Strength_type _strength_for = StruSoft.Interop_25.Strength_type.Brick_only; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Strength_type.Brick_only)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Strength_type.Brick_only)] [System.Xml.Serialization.XmlAttributeAttribute("strength_for")] public Strength_type Strength_for { @@ -17029,6 +17223,35 @@ public System.Nullable Fvlt } } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Xml.Serialization.XmlAttributeAttribute("muf")] + public double MufValue { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool MufValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable Muf + { + get + { + if (this.MufValueSpecified) + { + return this.MufValue; + } + else + { + return null; + } + } + set + { + this.MufValue = value.GetValueOrDefault(); + this.MufValueSpecified = value.HasValue; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -17072,6 +17295,23 @@ public partial class Material_typeMasonry [System.Xml.Serialization.XmlElementAttribute("base_data")] public Optional_material_attribs Base_data { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Strength_type _strength_for = StruSoft.Interop_25.Strength_type.Brick_only; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Strength_type.Brick_only)] + [System.Xml.Serialization.XmlAttributeAttribute("strength_for")] + public Strength_type Strength_for + { + get + { + return _strength_for; + } + set + { + _strength_for = value; + } + } + [System.Xml.Serialization.XmlAttributeAttribute("fk")] public double Fk { get; set; } @@ -18005,9 +18245,9 @@ public partial class Rf_wire_type public string Reinforcing_material { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Wire_profile_type _profile = StruSoft.Interop_24.Wire_profile_type.Ribbed; + private Wire_profile_type _profile = StruSoft.Interop_25.Wire_profile_type.Ribbed; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Wire_profile_type.Ribbed)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Wire_profile_type.Ribbed)] [System.Xml.Serialization.XmlAttributeAttribute("profile")] public Wire_profile_type Profile { @@ -18580,6 +18820,22 @@ public Beam_reduction_zone_type() } } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("shell_force_type", Namespace="urn:strusoft")] + public enum Shell_force_type + { + + [System.Xml.Serialization.XmlEnumAttribute("integration")] + Integration, + + [System.Xml.Serialization.XmlEnumAttribute("smoothed")] + Smoothed, + + [System.Xml.Serialization.XmlEnumAttribute("max")] + Max, + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute("punching_area_type", Namespace="urn:strusoft")] @@ -18665,23 +18921,6 @@ public string Hash_order_id } } - [System.Xml.Serialization.XmlIgnoreAttribute()] - private bool _downward = false; - - [System.ComponentModel.DefaultValueAttribute(false)] - [System.Xml.Serialization.XmlAttributeAttribute("downward")] - public bool Downward - { - get - { - return _downward; - } - set - { - _downward = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] private bool _manual_design = false; @@ -18716,6 +18955,74 @@ public string Name } } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _nodal_force_method = true; + + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("nodal_force_method")] + public bool Nodal_force_method + { + get + { + return _nodal_force_method; + } + set + { + _nodal_force_method = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Shell_force_type _shell_internal_force_method = StruSoft.Interop_25.Shell_force_type.Integration; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Shell_force_type.Integration)] + [System.Xml.Serialization.XmlAttributeAttribute("shell_internal_force_method")] + public Shell_force_type Shell_internal_force_method + { + get + { + return _shell_internal_force_method; + } + set + { + _shell_internal_force_method = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _distance_of_perimeter = 1.5D; + + [System.ComponentModel.DefaultValueAttribute(1.5D)] + [System.Xml.Serialization.XmlAttributeAttribute("distance_of_perimeter")] + public double Distance_of_perimeter + { + get + { + return _distance_of_perimeter; + } + set + { + _distance_of_perimeter = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _perimeter_is_average = true; + + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("perimeter_is_average")] + public bool Perimeter_is_average + { + get + { + return _perimeter_is_average; + } + set + { + _perimeter_is_average = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -18893,6 +19200,91 @@ public string Name } } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Shell_force_type _shell_internal_force_method = StruSoft.Interop_25.Shell_force_type.Integration; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Shell_force_type.Integration)] + [System.Xml.Serialization.XmlAttributeAttribute("shell_internal_force_method")] + public Shell_force_type Shell_internal_force_method + { + get + { + return _shell_internal_force_method; + } + set + { + _shell_internal_force_method = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _distance_of_perimeter = 1.5D; + + [System.ComponentModel.DefaultValueAttribute(1.5D)] + [System.Xml.Serialization.XmlAttributeAttribute("distance_of_perimeter")] + public double Distance_of_perimeter + { + get + { + return _distance_of_perimeter; + } + set + { + _distance_of_perimeter = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _perimeter_length_limit = 1000D; + + [System.ComponentModel.DefaultValueAttribute(1000D)] + [System.Xml.Serialization.XmlAttributeAttribute("perimeter_length_limit")] + public double Perimeter_length_limit + { + get + { + return _perimeter_length_limit; + } + set + { + _perimeter_length_limit = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _end_limit = 1.5D; + + [System.ComponentModel.DefaultValueAttribute(1.5D)] + [System.Xml.Serialization.XmlAttributeAttribute("end_limit")] + public double End_limit + { + get + { + return _end_limit; + } + set + { + _end_limit = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _perimeter_is_average = true; + + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("perimeter_is_average")] + public bool Perimeter_is_average + { + get + { + return _perimeter_is_average; + } + set + { + _perimeter_is_average = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -19101,6 +19493,40 @@ public partial class Punching_reinforcement_typeBended_bar [System.Xml.Serialization.XmlAttributeAttribute("direction")] public Direction_type Direction { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _c_v_auto_calculation = true; + + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v_auto_calculation")] + public bool C_v_auto_calculation + { + get + { + return _c_v_auto_calculation; + } + set + { + _c_v_auto_calculation = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _c_v = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v")] + public double C_v + { + get + { + return _c_v; + } + set + { + _c_v = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -19168,6 +19594,40 @@ public Punching_reinforcement_typeOpen_stirrups() [System.Xml.Serialization.XmlAttributeAttribute("distance_y")] public double Distance_y { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _c_v_auto_calculation = true; + + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v_auto_calculation")] + public bool C_v_auto_calculation + { + get + { + return _c_v_auto_calculation; + } + set + { + _c_v_auto_calculation = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _c_v = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v")] + public double C_v + { + get + { + return _c_v; + } + set + { + _c_v = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -19208,24 +19668,40 @@ public partial class Punching_reinforcement_typeReinforcing_ring [System.Xml.Serialization.XmlElementAttribute("stirrups")] public Punching_reinforcement_typeReinforcing_ringStirrups Stirrups { get; set; } - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] - [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("Punching_reinforcement_typeReinforcing_ringAuxiliary_reinforcement", Namespace="urn:strusoft", AnonymousType=true)] - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Punching_reinforcement_typeReinforcing_ringAuxiliary_reinforcement - { - [System.Xml.Serialization.XmlElementAttribute("wire")] - public Rf_wire_type Wire { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _c_v_auto_calculation = true; - [System.Xml.Serialization.XmlAttributeAttribute("inner_radius")] - public double Inner_radius { get; set; } + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v_auto_calculation")] + public bool C_v_auto_calculation + { + get + { + return _c_v_auto_calculation; + } + set + { + _c_v_auto_calculation = value; + } + } - [System.Xml.Serialization.XmlAttributeAttribute("overlap")] - public double Overlap { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _c_v = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v")] + public double C_v + { + get + { + return _c_v; + } + set + { + _c_v = value; + } + } [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -19253,7 +19729,7 @@ public bool AnyAttributeSpecified } } - public Punching_reinforcement_typeReinforcing_ringAuxiliary_reinforcement() + public Punching_reinforcement_typeReinforcing_ring() { this._anyAttribute = new System.Collections.Generic.List(); } @@ -19261,23 +19737,72 @@ public Punching_reinforcement_typeReinforcing_ringAuxiliary_reinforcement() [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("Punching_reinforcement_typeReinforcing_ringStirrups", Namespace="urn:strusoft", AnonymousType=true)] + [System.Xml.Serialization.XmlTypeAttribute("Punching_reinforcement_typeReinforcing_ringAuxiliary_reinforcement", Namespace="urn:strusoft", AnonymousType=true)] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Punching_reinforcement_typeReinforcing_ringStirrups + public partial class Punching_reinforcement_typeReinforcing_ringAuxiliary_reinforcement { [System.Xml.Serialization.XmlElementAttribute("wire")] public Rf_wire_type Wire { get; set; } - [System.Xml.Serialization.XmlAttributeAttribute("width")] - public double Width { get; set; } - - [System.Xml.Serialization.XmlAttributeAttribute("height")] - public double Height { get; set; } + [System.Xml.Serialization.XmlAttributeAttribute("inner_radius")] + public double Inner_radius { get; set; } - [System.Xml.Serialization.XmlAttributeAttribute("max_distance")] - public double Max_distance { get; set; } + [System.Xml.Serialization.XmlAttributeAttribute("overlap")] + public double Overlap { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public Punching_reinforcement_typeReinforcing_ringAuxiliary_reinforcement() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("Punching_reinforcement_typeReinforcing_ringStirrups", Namespace="urn:strusoft", AnonymousType=true)] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Punching_reinforcement_typeReinforcing_ringStirrups + { + + [System.Xml.Serialization.XmlElementAttribute("wire")] + public Rf_wire_type Wire { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("width")] + public double Width { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("height")] + public double Height { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("max_distance")] + public double Max_distance { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -19326,9 +19851,9 @@ public partial class Punching_reinforcement_typeStud_rails public Punching_reinforcement_typeStud_railsPeikko_psb_product Peikko_psb_product { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Studrail_patterns _pattern = StruSoft.Interop_24.Studrail_patterns.Semiorthogonal; + private Studrail_patterns _pattern = StruSoft.Interop_25.Studrail_patterns.Semiorthogonal; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Studrail_patterns.Semiorthogonal)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Studrail_patterns.Semiorthogonal)] [System.Xml.Serialization.XmlAttributeAttribute("pattern")] public Studrail_patterns Pattern { @@ -19490,6 +20015,40 @@ public bool Use_minimal_elements } } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _c_v_auto_calculation = true; + + [System.ComponentModel.DefaultValueAttribute(true)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v_auto_calculation")] + public bool C_v_auto_calculation + { + get + { + return _c_v_auto_calculation; + } + set + { + _c_v_auto_calculation = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _c_v = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("c_v")] + public double C_v + { + get + { + return _c_v; + } + set + { + _c_v = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -19706,9 +20265,9 @@ public string Colour } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Srf_treatment_type _created_by = StruSoft.Interop_24.Srf_treatment_type.Manual; + private Srf_treatment_type _created_by = StruSoft.Interop_25.Srf_treatment_type.Manual; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Srf_treatment_type.Manual)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Srf_treatment_type.Manual)] [System.Xml.Serialization.XmlAttributeAttribute("created_by")] public Srf_treatment_type Created_by { @@ -20647,9 +21206,9 @@ public string Colour } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ssrf_treatment _created_by = StruSoft.Interop_24.Ssrf_treatment.Manual; + private Ssrf_treatment _created_by = StruSoft.Interop_25.Ssrf_treatment.Manual; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ssrf_treatment.Manual)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ssrf_treatment.Manual)] [System.Xml.Serialization.XmlAttributeAttribute("created_by")] public Ssrf_treatment Created_by { @@ -20764,9 +21323,9 @@ public partial class Simple_spring_type public Stiff_base_type Rot_z { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Detach_type _detach = StruSoft.Interop_24.Detach_type.Empty; + private Detach_type _detach = StruSoft.Interop_25.Detach_type.Empty; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Detach_type.Empty)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Detach_type.Empty)] [System.Xml.Serialization.XmlAttributeAttribute("detach")] public Detach_type Detach { @@ -20934,6 +21493,9 @@ public partial class Support_rigidity_data_type [System.Xml.Serialization.XmlElementAttribute("group")] public Support_rigidity_data_typeGroup Group { get; set; } + + [System.Xml.Serialization.XmlElementAttribute("warping")] + public Support_rigidity_data_typeWarping Warping { get; set; } } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -21011,9 +21573,9 @@ public partial class Support_rigidity_data_typeGroup public Rigidity_group_type2 Rigidity_group { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Detach_type _detach = StruSoft.Interop_24.Detach_type.Empty; + private Detach_type _detach = StruSoft.Interop_25.Detach_type.Empty; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Detach_type.Empty)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Detach_type.Empty)] [System.Xml.Serialization.XmlAttributeAttribute("detach")] public Detach_type Detach { @@ -21027,6 +21589,23 @@ public Detach_type Detach } } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private bool _seven_degrees_of_freedom = false; + + [System.ComponentModel.DefaultValueAttribute(false)] + [System.Xml.Serialization.XmlAttributeAttribute("seven_degrees_of_freedom")] + public bool Seven_degrees_of_freedom + { + get + { + return _seven_degrees_of_freedom; + } + set + { + _seven_degrees_of_freedom = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -21059,6 +21638,63 @@ public Support_rigidity_data_typeGroup() } } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("Support_rigidity_data_typeWarping", Namespace="urn:strusoft", AnonymousType=true)] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Support_rigidity_data_typeWarping + { + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _wx; + + [System.Xml.Serialization.XmlAttributeAttribute("Wx")] + public System.Collections.Generic.List Wx + { + get + { + return _wx; + } + set + { + _wx = value; + } + } + + public Support_rigidity_data_typeWarping() + { + this._wx = new System.Collections.Generic.List(); + this._anyAttribute = new System.Collections.Generic.List(); + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute("point_support_type", Namespace="urn:strusoft")] @@ -21351,9 +21987,9 @@ public string Name } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Detach_type _detach = StruSoft.Interop_24.Detach_type.Empty; + private Detach_type _detach = StruSoft.Interop_25.Detach_type.Empty; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Detach_type.Empty)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Detach_type.Empty)] [System.Xml.Serialization.XmlAttributeAttribute("detach")] public Detach_type Detach { @@ -21617,6 +22253,35 @@ public partial class Ptc_strand_lib_typePtc_strand_data [System.Xml.Serialization.XmlAttributeAttribute("f_pk")] public double F_pk { get; set; } + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Xml.Serialization.XmlAttributeAttribute("f_p01k")] + public double F_p01kValue { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public bool F_p01kValueSpecified { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public System.Nullable F_p01k + { + get + { + if (this.F_p01kValueSpecified) + { + return this.F_p01kValue; + } + else + { + return null; + } + } + set + { + this.F_p01kValue = value.GetValueOrDefault(); + this.F_p01kValueSpecified = value.HasValue; + } + } + [System.Xml.Serialization.XmlAttributeAttribute("A_p")] public double A_p { get; set; } @@ -22153,40 +22818,6 @@ public string Name [System.Xml.Serialization.XmlAttributeAttribute("jacking_stress")] public double Jacking_stress { get; set; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage - { - get - { - return _stage; - } - set - { - _stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage - { - get - { - return _end_stage; - } - set - { - _end_stage = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -22338,6 +22969,152 @@ public enum Lc_final_cs Final_cs, } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("ldpos_pos_type", Namespace="urn:strusoft")] + public enum Ldpos_pos_type + { + + [System.Xml.Serialization.XmlEnumAttribute("on_centric_axis/surface")] + On_centric_axissurface, + + [System.Xml.Serialization.XmlEnumAttribute("on_eccentric_axis/surface")] + On_eccentric_axissurface, + + [System.Xml.Serialization.XmlEnumAttribute("user_defined_eccentricity")] + User_defined_eccentricity, + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("ldpos_ref_type", Namespace="urn:strusoft")] + public enum Ldpos_ref_type + { + + [System.Xml.Serialization.XmlEnumAttribute("reference_axis")] + Reference_axis, + + [System.Xml.Serialization.XmlEnumAttribute("center_of_gravity")] + Center_of_gravity, + + [System.Xml.Serialization.XmlEnumAttribute("shear_center")] + Shear_center, + + [System.Xml.Serialization.XmlEnumAttribute("bounding_rectangle")] + Bounding_rectangle, + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("ldpos_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Ldpos_type + { + + [System.Xml.Serialization.XmlAttributeAttribute("position")] + public Ldpos_pos_type Position { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _shift_y = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("shift_y")] + public double Shift_y + { + get + { + return _shift_y; + } + set + { + _shift_y = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _shift_z = 0D; + + [System.ComponentModel.DefaultValueAttribute(0D)] + [System.Xml.Serialization.XmlAttributeAttribute("shift_z")] + public double Shift_z + { + get + { + return _shift_z; + } + set + { + _shift_z = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Ldpos_ref_type _reference_point = StruSoft.Interop_25.Ldpos_ref_type.Center_of_gravity; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldpos_ref_type.Center_of_gravity)] + [System.Xml.Serialization.XmlAttributeAttribute("reference_point")] + public Ldpos_ref_type Reference_point + { + get + { + return _reference_point; + } + set + { + _reference_point = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private Rec_pos_type _rectangle_position = StruSoft.Interop_25.Rec_pos_type.Center_center; + + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Rec_pos_type.Center_center)] + [System.Xml.Serialization.XmlAttributeAttribute("rectangle_position")] + public Rec_pos_type Rectangle_position + { + get + { + return _rectangle_position; + } + set + { + _rectangle_position = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public Ldpos_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute("caseless_point_load_type", Namespace="urn:strusoft")] @@ -22353,6 +23130,9 @@ public partial class Caseless_point_load_type [System.Xml.Serialization.XmlElementAttribute("load")] public Location_value Load { get; set; } + [System.Xml.Serialization.XmlElementAttribute("load_position")] + public Ldpos_type Load_position { get; set; } + [System.Xml.Serialization.XmlElementAttribute("colouring")] public Entity_color Colouring { get; set; } @@ -22658,6 +23438,9 @@ public Caseless_line_load_type() this._load = new System.Collections.Generic.List(); } + [System.Xml.Serialization.XmlElementAttribute("load_position")] + public Ldpos_type Load_position { get; set; } + [System.Xml.Serialization.XmlElementAttribute("colouring")] public Entity_color Colouring { get; set; } @@ -22916,6 +23699,9 @@ public Caseless_line_load_resultant_type() [System.Xml.Serialization.XmlElementAttribute("resultant")] public Resultant_type Resultant { get; set; } + [System.Xml.Serialization.XmlElementAttribute("load_position")] + public Ldpos_type Load_position { get; set; } + [System.Xml.Serialization.XmlElementAttribute("colouring")] public Entity_color Colouring { get; set; } @@ -24894,6 +25680,41 @@ public enum Seismic_ground_type S1S2_3560mA, } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_seismic_ground_type", Namespace="urn:strusoft")] + public enum EC_G2_seismic_ground_type + { + + A, + + B, + + C, + + D, + + E, + + F, + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("seismic_structure_type", Namespace="urn:strusoft")] + public enum Seismic_structure_type + { + + [System.Xml.Serialization.XmlEnumAttribute("building")] + Building, + + [System.Xml.Serialization.XmlEnumAttribute("bridge")] + Bridge, + + [System.Xml.Serialization.XmlEnumAttribute("others")] + Others, + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute("ec40_tc_type", Namespace="urn:strusoft")] @@ -25026,6 +25847,208 @@ public Ec040_standard_spectra_type() } } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_horizontal_spectra_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_horizontal_spectra_type + { + + [System.Xml.Serialization.XmlElementAttribute("amplification_factors")] + public EC_G2_horizontal_spectra_typeAmplification_factors Amplification_factors { get; set; } + + [System.Xml.Serialization.XmlElementAttribute("site_category")] + public EC_G2_horizontal_spectra_typeSite_category Site_category { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("SalphaRP")] + public double SalphaRP { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("SbetaRP")] + public double SbetaRP { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("FT")] + public double FT { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("FA")] + public double FA { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("Chi")] + public double Chi { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("TA")] + public double TA { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("TD")] + public double TD { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("BetaH")] + public double BetaH { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public EC_G2_horizontal_spectra_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_horizontal_spectra_typeAmplification_factors", Namespace="urn:strusoft", AnonymousType=true)] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_horizontal_spectra_typeAmplification_factors + { + + [System.Xml.Serialization.XmlAttributeAttribute("Falpha")] + public double Falpha { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("Fbeta")] + public double Fbeta { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public EC_G2_horizontal_spectra_typeAmplification_factors() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_horizontal_spectra_typeSite_category", Namespace="urn:strusoft", AnonymousType=true)] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_horizontal_spectra_typeSite_category + { + + [System.Xml.Serialization.XmlAttributeAttribute("type")] + public EC_G2_seismic_ground_type Type { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public EC_G2_horizontal_spectra_typeSite_category() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_vertical_spectra_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_vertical_spectra_type + { + + [System.Xml.Serialization.XmlAttributeAttribute("BetaV")] + public double BetaV { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public EC_G2_vertical_spectra_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute("spectra_record_type", Namespace="urn:strusoft")] @@ -25066,54 +26089,374 @@ public bool AnyAttributeSpecified } } - public Spectra_record_type() + public Spectra_record_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_spectra_record_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_spectra_record_type + { + + [System.Xml.Serialization.XmlAttributeAttribute("T")] + public double T { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("Sr")] + public double Sr { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + + public EC_G2_spectra_record_type() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("unique_spectra_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Unique_spectra_type + { + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _record; + + [System.Xml.Serialization.XmlElementAttribute("record")] + public System.Collections.Generic.List Record + { + get + { + return _record; + } + set + { + _record = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool RecordSpecified + { + get + { + return ((this.Record != null) + && (this.Record.Count != 0)); + } + } + + public Unique_spectra_type() + { + this._record = new System.Collections.Generic.List(); + this._anyAttribute = new System.Collections.Generic.List(); + } + + [System.Xml.Serialization.XmlAttributeAttribute("start_Sd")] + public double Start_Sd { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_unique_spectra_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_unique_spectra_type + { + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _record; + + [System.Xml.Serialization.XmlElementAttribute("record")] + public System.Collections.Generic.List Record + { + get + { + return _record; + } + set + { + _record = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool RecordSpecified + { + get + { + return ((this.Record != null) + && (this.Record.Count != 0)); + } + } + + public EC_G2_unique_spectra_type() + { + this._record = new System.Collections.Generic.List(); + this._anyAttribute = new System.Collections.Generic.List(); + } + + [System.Xml.Serialization.XmlAttributeAttribute("start_Sr")] + public double Start_Sr { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("bridge_pier_type", Namespace="urn:strusoft")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class Bridge_pier_type + { + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _elements; + + [System.Xml.Serialization.XmlElementAttribute("elements")] + public System.Collections.Generic.List Elements { + get + { + return _elements; + } + set + { + _elements = value; + } + } + + public Bridge_pier_type() + { + this._elements = new System.Collections.Generic.List(); this._anyAttribute = new System.Collections.Generic.List(); } + + [System.Xml.Serialization.XmlAttributeAttribute("name")] + public string Name { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("colour")] + public string Colour { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] - [System.Xml.Serialization.XmlTypeAttribute("unique_spectra_type", Namespace="urn:strusoft")] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_seismic_load_type", Namespace="urn:strusoft")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class Unique_spectra_type + public partial class EC_G2_seismic_load_type { + [System.Xml.Serialization.XmlElementAttribute("standard_spectrum")] + public EC_G2_seismic_load_typeStandard_spectrum Standard_spectrum { get; set; } + + [System.Xml.Serialization.XmlElementAttribute("unique_spectrum")] + public EC_G2_seismic_load_typeUnique_spectrum Unique_spectrum { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] - private System.Collections.Generic.List _record; + private System.Collections.Generic.List _bridge_pier; - [System.Xml.Serialization.XmlElementAttribute("record")] - public System.Collections.Generic.List Record + [System.Xml.Serialization.XmlElementAttribute("bridge_pier")] + public System.Collections.Generic.List Bridge_pier { get { - return _record; + return _bridge_pier; } set { - _record = value; + _bridge_pier = value; } } [System.Xml.Serialization.XmlIgnoreAttribute()] - public bool RecordSpecified + public bool Bridge_pierSpecified { get { - return ((this.Record != null) - && (this.Record.Count != 0)); + return ((this.Bridge_pier != null) + && (this.Bridge_pier.Count != 0)); } } - public Unique_spectra_type() + public EC_G2_seismic_load_type() { - this._record = new System.Collections.Generic.List(); + this._bridge_pier = new System.Collections.Generic.List(); this._anyAttribute = new System.Collections.Generic.List(); } - [System.Xml.Serialization.XmlAttributeAttribute("start_Sd")] - public double Start_Sd { get; set; } + [System.Xml.Serialization.XmlAttributeAttribute("last_change", DataType="dateTime")] + public System.DateTime Last_change { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("action")] + public Modification_type Action { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("structure_type")] + public Seismic_structure_type Structure_type { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("xi")] + public double Xi { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("qR")] + public double QR { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("qS")] + public double QS { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("qD")] + public double QD { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("qv")] + public double Qv { get; set; } + + [System.Xml.Serialization.XmlAttributeAttribute("qdisp")] + public double Qdisp { get; set; } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + private System.Collections.Generic.List _anyAttribute; + + [System.Xml.Serialization.XmlAnyAttributeAttribute()] + public System.Collections.Generic.List AnyAttribute + { + get + { + return _anyAttribute; + } + set + { + _anyAttribute = value; + } + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool AnyAttributeSpecified + { + get + { + return ((this.AnyAttribute != null) + && (this.AnyAttribute.Count != 0)); + } + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_seismic_load_typeStandard_spectrum", Namespace="urn:strusoft", AnonymousType=true)] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_seismic_load_typeStandard_spectrum + { + + [System.Xml.Serialization.XmlElementAttribute("horizontal")] + public EC_G2_horizontal_spectra_type Horizontal { get; set; } + + [System.Xml.Serialization.XmlElementAttribute("vertical")] + public EC_G2_vertical_spectra_type Vertical { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -25140,6 +26483,26 @@ public bool AnyAttributeSpecified && (this.AnyAttribute.Count != 0)); } } + + public EC_G2_seismic_load_typeStandard_spectrum() + { + this._anyAttribute = new System.Collections.Generic.List(); + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("EC_G2_seismic_load_typeUnique_spectrum", Namespace="urn:strusoft", AnonymousType=true)] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class EC_G2_seismic_load_typeUnique_spectrum + { + + [System.Xml.Serialization.XmlElementAttribute("horizontal")] + public EC_G2_unique_spectra_type Horizontal { get; set; } + + [System.Xml.Serialization.XmlElementAttribute("vertical")] + public EC_G2_unique_spectra_type Vertical { get; set; } } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -25252,9 +26615,9 @@ public partial class Seismic_load_typeCommon_standard_spectra public Standard_spectra_type Vertical { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Seismic_ground_type _ground = StruSoft.Interop_24.Seismic_ground_type.A; + private Seismic_ground_type _ground = StruSoft.Interop_25.Seismic_ground_type.A; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Seismic_ground_type.A)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Seismic_ground_type.A)] [System.Xml.Serialization.XmlAttributeAttribute("ground")] public Seismic_ground_type Ground { @@ -26218,9 +27581,9 @@ public string Hash_order_id public Loadcasetype_type Type { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Loadcasedurationtype _duration_class = StruSoft.Interop_24.Loadcasedurationtype.Permanent; + private Loadcasedurationtype _duration_class = StruSoft.Interop_25.Loadcasedurationtype.Permanent; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Loadcasedurationtype.Permanent)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Loadcasedurationtype.Permanent)] [System.Xml.Serialization.XmlAttributeAttribute("duration_class")] public Loadcasedurationtype Duration_class { @@ -27146,9 +28509,9 @@ public partial class Ldgroup_relation_record_type public string Name { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ldgroup_direction_type _direction = StruSoft.Interop_24.Ldgroup_direction_type.Non_directional; + private Ldgroup_direction_type _direction = StruSoft.Interop_25.Ldgroup_direction_type.Non_directional; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ldgroup_direction_type.Non_directional)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldgroup_direction_type.Non_directional)] [System.Xml.Serialization.XmlAttributeAttribute("direction")] public Ldgroup_direction_type Direction { @@ -27554,9 +28917,9 @@ public bool Snow_effect } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ldgroup_relation _relationship = StruSoft.Interop_24.Ldgroup_relation.Alternative; + private Ldgroup_relation _relationship = StruSoft.Interop_25.Ldgroup_relation.Alternative; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ldgroup_relation.Alternative)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldgroup_relation.Alternative)] [System.Xml.Serialization.XmlAttributeAttribute("relationship")] public Ldgroup_relation Relationship { @@ -27845,9 +29208,9 @@ public bool RelationsSpecified public double Xi { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ldgroup_relation _relationship = StruSoft.Interop_24.Ldgroup_relation.Alternative; + private Ldgroup_relation _relationship = StruSoft.Interop_25.Ldgroup_relation.Alternative; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ldgroup_relation.Alternative)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldgroup_relation.Alternative)] [System.Xml.Serialization.XmlAttributeAttribute("relationship")] public Ldgroup_relation Relationship { @@ -28120,9 +29483,9 @@ public bool RelationsSpecified public double Accidental { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ldgroup_relation _relationship = StruSoft.Interop_24.Ldgroup_relation.Alternative; + private Ldgroup_relation _relationship = StruSoft.Interop_25.Ldgroup_relation.Alternative; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ldgroup_relation.Alternative)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldgroup_relation.Alternative)] [System.Xml.Serialization.XmlAttributeAttribute("relationship")] public Ldgroup_relation Relationship { @@ -28727,9 +30090,9 @@ public bool Simultaneous } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ldgroup_relation _relationship = StruSoft.Interop_24.Ldgroup_relation.Alternative; + private Ldgroup_relation _relationship = StruSoft.Interop_25.Ldgroup_relation.Alternative; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ldgroup_relation.Alternative)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldgroup_relation.Alternative)] [System.Xml.Serialization.XmlAttributeAttribute("relationship")] public Ldgroup_relation Relationship { @@ -28744,9 +30107,9 @@ public Ldgroup_relation Relationship } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ldgroup_tmpeffect _temporary_effect = StruSoft.Interop_24.Ldgroup_tmpeffect.General; + private Ldgroup_tmpeffect _temporary_effect = StruSoft.Interop_25.Ldgroup_tmpeffect.General; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ldgroup_tmpeffect.General)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldgroup_tmpeffect.General)] [System.Xml.Serialization.XmlAttributeAttribute("temporary_effect")] public Ldgroup_tmpeffect Temporary_effect { @@ -29013,6 +30376,15 @@ public enum Ldcombmethod [System.Xml.Serialization.XmlEnumAttribute("custom")] Custom, + + [System.Xml.Serialization.XmlEnumAttribute("EN 1990 8.3.4.2 (8.12)")] + EN_1990_8Period3Period4Period2_LeftParenthesis8Period12RightParenthesis, + + [System.Xml.Serialization.XmlEnumAttribute("EN 1990 8.3.4.2 (8.13)")] + EN_1990_8Period3Period4Period2_LeftParenthesis8Period13RightParenthesis, + + [System.Xml.Serialization.XmlEnumAttribute("EN 1990 8.3.4.2 (8.14)")] + EN_1990_8Period3Period4Period2_LeftParenthesis8Period14RightParenthesis, } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -29188,9 +30560,9 @@ public System.Collections.Generic.List Group public System.DateTime Last_change { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Ldcombmethod _simple_combination_method = StruSoft.Interop_24.Ldcombmethod.EN_1990_6Period4Period3LeftParenthesis6Period10RightParenthesis; + private Ldcombmethod _simple_combination_method = StruSoft.Interop_25.Ldcombmethod.EN_1990_6Period4Period3LeftParenthesis6Period10RightParenthesis; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Ldcombmethod.EN_1990_6Period4Period3LeftParenthesis6Period10RightParenthesis)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Ldcombmethod.EN_1990_6Period4Period3LeftParenthesis6Period10RightParenthesis)] [System.Xml.Serialization.XmlAttributeAttribute("simple_combination_method")] public Ldcombmethod Simple_combination_method { @@ -29204,6 +30576,23 @@ public Ldcombmethod Simple_combination_method } } + [System.Xml.Serialization.XmlIgnoreAttribute()] + private double _k_f = 1D; + + [System.ComponentModel.DefaultValueAttribute(1D)] + [System.Xml.Serialization.XmlAttributeAttribute("k_f")] + public double K_f + { + get + { + return _k_f; + } + set + { + _k_f = value; + } + } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -29970,6 +31359,55 @@ public Fdarc3_type() } } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute("internal_line_style", Namespace="urn:strusoft")] + public enum Internal_line_style + { + + CONTINUOUS, + + DASH4, + + DASH2, + + DASH8, + + DASH12, + + CENTER4, + + CENTER2, + + CENTER8, + + CENTER12, + + DOT4, + + DOT2, + + DOT8, + + DOT12, + + SECTION4, + + SECTION2, + + SECTION8, + + SECTION12, + + DASHDOT4, + + DASHDOT2, + + DASHDOT8, + + DASHDOT12, + } + [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] [System.SerializableAttribute()] [System.Xml.Serialization.XmlTypeAttribute("point_type", Namespace="urn:strusoft")] @@ -30178,9 +31616,9 @@ public int Decimals } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Lengthunit_type _length_unit = StruSoft.Interop_24.Lengthunit_type.M; + private Lengthunit_type _length_unit = StruSoft.Interop_25.Lengthunit_type.M; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Lengthunit_type.M)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Lengthunit_type.M)] [System.Xml.Serialization.XmlAttributeAttribute("length_unit")] public Lengthunit_type Length_unit { @@ -30195,9 +31633,9 @@ public Lengthunit_type Length_unit } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Angleunit_type _angle_unit = StruSoft.Interop_24.Angleunit_type.Rad; + private Angleunit_type _angle_unit = StruSoft.Interop_25.Angleunit_type.Rad; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Angleunit_type.Rad)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Angleunit_type.Rad)] [System.Xml.Serialization.XmlAttributeAttribute("angle_unit")] public Angleunit_type Angle_unit { @@ -30280,9 +31718,9 @@ public string Colour } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Halign_type _h_align = StruSoft.Interop_24.Halign_type.Centered; + private Halign_type _h_align = StruSoft.Interop_25.Halign_type.Centered; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Halign_type.Centered)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Halign_type.Centered)] [System.Xml.Serialization.XmlAttributeAttribute("h_align")] public Halign_type H_align { @@ -30297,9 +31735,9 @@ public Halign_type H_align } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Valign_type _v_align = StruSoft.Interop_24.Valign_type.Above; + private Valign_type _v_align = StruSoft.Interop_25.Valign_type.Above; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Valign_type.Above)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Valign_type.Above)] [System.Xml.Serialization.XmlAttributeAttribute("v_align")] public Valign_type V_align { @@ -30382,9 +31820,9 @@ public partial class Arrow_type { [System.Xml.Serialization.XmlIgnoreAttribute()] - private Arrowtype_type _type = StruSoft.Interop_24.Arrowtype_type.Tick; + private Arrowtype_type _type = StruSoft.Interop_25.Arrowtype_type.Tick; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Arrowtype_type.Tick)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Arrowtype_type.Tick)] [System.Xml.Serialization.XmlAttributeAttribute("type")] public Arrowtype_type Type { @@ -32381,6 +33819,9 @@ public enum Sj_datatype_names [System.Xml.Serialization.XmlEnumAttribute("anchor_cfd")] Anchor_cfd, + [System.Xml.Serialization.XmlEnumAttribute("anchor_suitability_test")] + Anchor_suitability_test, + [System.Xml.Serialization.XmlEnumAttribute("bolt_group_ncol")] Bolt_group_ncol, @@ -32485,6 +33926,63 @@ public enum Sj_datatype_names [System.Xml.Serialization.XmlEnumAttribute("weld_preheating")] Weld_preheating, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material")] + Weld_filler_material, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_s")] + Weld_filler_material_s, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_fht")] + Weld_filler_material_fht, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_wht")] + Weld_filler_material_wht, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_f1")] + Weld_filler_material_f1, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_ft")] + Weld_filler_material_ft, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_w(l)")] + Weld_filler_material_wl, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_wr")] + Weld_filler_material_wr, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_f(b)")] + Weld_filler_material_fb, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_f4")] + Weld_filler_material_f4, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_whb")] + Weld_filler_material_whb, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_fhb")] + Weld_filler_material_fhb, + + [System.Xml.Serialization.XmlEnumAttribute("weld_top_filler_material_wh")] + Weld_top_filler_material_wh, + + [System.Xml.Serialization.XmlEnumAttribute("weld_bottom_filler_material_wh")] + Weld_bottom_filler_material_wh, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_f1_back")] + Weld_filler_material_f1_back, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_ft_back")] + Weld_filler_material_ft_back, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_fw_back")] + Weld_filler_material_fw_back, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_fb_back")] + Weld_filler_material_fb_back, + + [System.Xml.Serialization.XmlEnumAttribute("weld_filler_material_f4_back")] + Weld_filler_material_f4_back, } [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1162.0")] @@ -34234,9 +35732,9 @@ public string Name public string Complex_material { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Steelmadetype _made = StruSoft.Interop_24.Steelmadetype.Rolled; + private Steelmadetype _made = StruSoft.Interop_25.Steelmadetype.Rolled; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Steelmadetype.Rolled)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Steelmadetype.Rolled)] [System.Xml.Serialization.XmlAttributeAttribute("made")] public Steelmadetype Made { @@ -34300,40 +35798,6 @@ public System.Nullable D [System.Xml.Serialization.XmlAttributeAttribute("y")] public double Y { get; set; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage - { - get - { - return _stage; - } - set - { - _stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage - { - get - { - return _end_stage; - } - set - { - _end_stage = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -34497,40 +35961,6 @@ public bool Positive_side [System.Xml.Serialization.XmlAttributeAttribute("complex_material")] public string Complex_material { get; set; } - [System.Xml.Serialization.XmlIgnoreAttribute()] - private int _stage = 1; - - [System.ComponentModel.DefaultValueAttribute(1)] - [System.Xml.Serialization.XmlAttributeAttribute("stage")] - public int Stage - { - get - { - return _stage; - } - set - { - _stage = value; - } - } - - [System.Xml.Serialization.XmlIgnoreAttribute()] - private string _end_stage = "last_stage"; - - [System.ComponentModel.DefaultValueAttribute("last_stage")] - [System.Xml.Serialization.XmlAttributeAttribute("end_stage")] - public string End_stage - { - get - { - return _end_stage; - } - set - { - _end_stage = value; - } - } - [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _anyAttribute; @@ -35197,9 +36627,9 @@ public string Name } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Roof_type _roof_type = StruSoft.Interop_24.Roof_type.Flat; + private Roof_type _roof_type = StruSoft.Interop_25.Roof_type.Flat; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Roof_type.Flat)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Roof_type.Flat)] [System.Xml.Serialization.XmlAttributeAttribute("roof_type")] public Roof_type Roof_type { @@ -36433,9 +37863,9 @@ public string Convertid } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Standardtype _standard = StruSoft.Interop_24.Standardtype.EC; + private Standardtype _standard = StruSoft.Interop_25.Standardtype.EC; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Standardtype.EC)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Standardtype.EC)] [System.Xml.Serialization.XmlAttributeAttribute("standard")] public Standardtype Standard { @@ -36450,9 +37880,9 @@ public Standardtype Standard } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Eurocodetype _country = StruSoft.Interop_24.Eurocodetype.Common; + private Eurocodetype _country = StruSoft.Interop_25.Eurocodetype.Common; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Eurocodetype.Common)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Eurocodetype.Common)] [System.Xml.Serialization.XmlAttributeAttribute("country")] public Eurocodetype Country { @@ -37891,6 +39321,9 @@ public bool MassSpecified [System.Xml.Serialization.XmlElementAttribute("seismic_load")] public Seismic_load_type Seismic_load { get; set; } + [System.Xml.Serialization.XmlElementAttribute("EC_G2_seismic_load")] + public EC_G2_seismic_load_type EC_G2_seismic_load { get; set; } + [System.Xml.Serialization.XmlIgnoreAttribute()] private System.Collections.Generic.List _footfall_analysis_data; @@ -39932,9 +41365,9 @@ public bool Physical_view } [System.Xml.Serialization.XmlIgnoreAttribute()] - private Displaymodes _display_mode = StruSoft.Interop_24.Displaymodes.Wireframe; + private Displaymodes _display_mode = StruSoft.Interop_25.Displaymodes.Wireframe; - [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_24.Displaymodes.Wireframe)] + [System.ComponentModel.DefaultValueAttribute(StruSoft.Interop_25.Displaymodes.Wireframe)] [System.Xml.Serialization.XmlAttributeAttribute("display_mode")] public Displaymodes Display_mode { diff --git a/FemDesign.Examples/C#/Example 1 - Simple beam/Program.cs b/FemDesign.Examples/C#/Example 1 - Simple beam/Program.cs index b25df0ae..4adcde1a 100644 --- a/FemDesign.Examples/C#/Example 1 - Simple beam/Program.cs +++ b/FemDesign.Examples/C#/Example 1 - Simple beam/Program.cs @@ -96,20 +96,6 @@ static void Main() model.AddLoads(loads); - var column = model.Entities.Bars.Where(bar => bar.Type == Bars.BarType.Column).Where(bar => bar.Identifier == "MyElementID").First(); - - - var sectionDatabase = Sections.SectionDatabase.GetDefault(); - var sectionName = "Concrete sections, Rectangle, 300x900"; - var newSection = sectionDatabase.SectionByName(sectionName); - - column.UpdateSection( newSection ); - - var columns = new List(); - columns.Add(column); - - model.AddElements(columns, overwrite: true); - // Run Analysis using (var femDesign = new FemDesignConnection(outputDir: "My simple beam", keepOpen: true)) { diff --git a/FemDesign.Grasshopper/Materials/SetConcreteTimeDependant.cs b/FemDesign.Grasshopper/Materials/SetConcreteTimeDependant.cs index eef47505..5141286e 100644 --- a/FemDesign.Grasshopper/Materials/SetConcreteTimeDependant.cs +++ b/FemDesign.Grasshopper/Materials/SetConcreteTimeDependant.cs @@ -59,7 +59,7 @@ protected override void RegisterEvaluationUnits(EvaluationUnitManager mngr) evaluationUnit.RegisterInputParam(new Param_String(), "CementType", "CementType", "Cement Type as integer according to FemDesign API.", GH_ParamAccess.item, new GH_String("Class_S")); evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].Parameter.Optional = true; - evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].EnumInput = Enum.GetNames(typeof(StruSoft.Interop_24.Cement_type)).ToList(); + evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].EnumInput = Enum.GetNames(typeof(StruSoft.Interop_25.Cement_type)).ToList(); evaluationUnit.RegisterInputParam(new Param_Boolean(), "IncreaseFinalValue", "IncreaseFinalValue", "", GH_ParamAccess.item, new GH_Boolean(false)); evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].Parameter.Optional = true; @@ -87,7 +87,7 @@ protected override void RegisterEvaluationUnits(EvaluationUnitManager mngr) evaluationUnit.RegisterInputParam(new Param_String(), "CementType", "CementType", "Cement Type as integer according to FemDesign API.", GH_ParamAccess.item, new GH_String("Class_S")); evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].Parameter.Optional = true; - evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].EnumInput = Enum.GetNames(typeof(StruSoft.Interop_24.Cement_type)).ToList(); + evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].EnumInput = Enum.GetNames(typeof(StruSoft.Interop_25.Cement_type)).ToList(); GH_ExtendableMenu gH_ExtendableMenu1 = new GH_ExtendableMenu(1, ""); @@ -107,7 +107,7 @@ protected override void RegisterEvaluationUnits(EvaluationUnitManager mngr) evaluationUnit.RegisterInputParam(new Param_String(), "CementType", "CementType", "Cement Type as integer according to FemDesign API.", GH_ParamAccess.item, new GH_String("Class_S")); evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].Parameter.Optional = true; - evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].EnumInput = Enum.GetNames(typeof(StruSoft.Interop_24.Cement_type)).ToList(); + evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].EnumInput = Enum.GetNames(typeof(StruSoft.Interop_25.Cement_type)).ToList(); GH_ExtendableMenu gH_ExtendableMenu2 = new GH_ExtendableMenu(2, ""); gH_ExtendableMenu2.Name = "Elasticity"; @@ -145,7 +145,7 @@ protected override void SolveInstance(IGH_DataAccess DA, EvaluationUnit unit) string cementType_creep = "Class_S"; DA.GetData(5, ref cementType_creep); - Enum.TryParse(cementType_creep, out StruSoft.Interop_24.Cement_type _cementType_creep); + Enum.TryParse(cementType_creep, out StruSoft.Interop_25.Cement_type _cementType_creep); bool increaseFinalValue = false; DA.GetData(6, ref increaseFinalValue); @@ -162,7 +162,7 @@ protected override void SolveInstance(IGH_DataAccess DA, EvaluationUnit unit) string cementType_shrinkage = "Class_S"; ; DA.GetData(10, ref cementType_shrinkage); - Enum.TryParse(cementType_shrinkage, out StruSoft.Interop_24.Cement_type _cementType_shrinkage); + Enum.TryParse(cementType_shrinkage, out StruSoft.Interop_25.Cement_type _cementType_shrinkage); // elasticity bool en1992_elasticity = false; @@ -173,7 +173,7 @@ protected override void SolveInstance(IGH_DataAccess DA, EvaluationUnit unit) string cementType_elasticity = "Class_S"; DA.GetData(13, ref cementType_elasticity); - Enum.TryParse(cementType_elasticity, out StruSoft.Interop_24.Cement_type _cementType_elasticity); + Enum.TryParse(cementType_elasticity, out StruSoft.Interop_25.Cement_type _cementType_elasticity); // apply the method creep, shrinkage and elasticity using the booleans From 6e74fe0eb6a68e2f77af8532fa5856a2579b2748 Mon Sep 17 00:00:00 2001 From: MP Date: Mon, 2 Feb 2026 08:39:02 +0100 Subject: [PATCH 08/12] =?UTF-8?q?=F0=9F=90=9B=20net=2010=20raise=20error?= =?UTF-8?q?=20in=20case=20of=20True?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FemDesign.Core/Model/Entities.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FemDesign.Core/Model/Entities.cs b/FemDesign.Core/Model/Entities.cs index 71b8c344..4b3480c2 100644 --- a/FemDesign.Core/Model/Entities.cs +++ b/FemDesign.Core/Model/Entities.cs @@ -75,7 +75,7 @@ public partial class Entities [XmlElement("punching_reinforcement", Order = 20)] public List PunchingReinforcements { get; set; } = new List(); - [Obsolete("Use `NoShearControlRegions`", true)] + [Obsolete("Use `NoShearControlRegions`")] [XmlElement("no-shear_region", Order = 21)] public List NoShearRegions { get; set; } = new List(); From 5e090b65a60978591a951909896ea49d06eae2e7 Mon Sep 17 00:00:00 2001 From: MP Date: Tue, 3 Feb 2026 15:27:20 +0100 Subject: [PATCH 09/12] Update StudRail.cs --- .../Reinforcement/Punching/StudRail.cs | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/FemDesign.Grasshopper/Reinforcement/Punching/StudRail.cs b/FemDesign.Grasshopper/Reinforcement/Punching/StudRail.cs index de5e3b0f..bd7b1be4 100644 --- a/FemDesign.Grasshopper/Reinforcement/Punching/StudRail.cs +++ b/FemDesign.Grasshopper/Reinforcement/Punching/StudRail.cs @@ -21,7 +21,7 @@ public override void registerEvaluationUnits(EvaluationUnitManager mngr) mngr.RegisterUnit(evaluationUnit); evaluationUnit.Icon = FemDesign.Properties.Resources.StudRail; - evaluationUnit.RegisterInputParam(new Param_Plane(), "Point|Plane", "Point|Plane", "", GH_ParamAccess.item); + evaluationUnit.RegisterInputParam(new Param_Plane(), "Point|Plane", "Point|Plane", "End point of the column where the punchin reinforcement should be applied.", GH_ParamAccess.item); evaluationUnit.Inputs[evaluationUnit.Inputs.Count - 1].Parameter.Optional = false; evaluationUnit.RegisterInputParam(new Param_Brep(), "Region", "Region", "", GH_ParamAccess.item); @@ -97,12 +97,28 @@ public override void SolveInstance(IGH_DataAccess DA, out string msg, out GH_Run DA.GetData(4, ref diameter); diameter /= 1000; // mm to m - var numberRails = 2; + var numberRails = 4; DA.GetData(5, ref numberRails); + if (numberRails < 4 || numberRails > 50) + { + msg = "Number of rails must be between 4 and 50."; + level = GH_RuntimeMessageLevel.Error; + return; + } + var numberStudsPerMeter = 4; DA.GetData(6, ref numberStudsPerMeter); + if (numberStudsPerMeter < 2 || numberStudsPerMeter > 50) + { + msg = "Number of studs per meter must be between 2 and 20."; + level = GH_RuntimeMessageLevel.Error; + return; + } + + + var so = 150.0; DA.GetData(7, ref so); so = so/1000; // mm to m From c0901caefae332d0d297da11e9eab62768208853 Mon Sep 17 00:00:00 2001 From: MP Date: Tue, 3 Feb 2026 17:23:24 +0100 Subject: [PATCH 10/12] =?UTF-8?q?=F0=9F=90=9B=20section=20and=20material?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FemDesign.Core/Materials/MaterialDatabase.cs | 33 ++------------------ FemDesign.Core/Sections/SectionDatabase.cs | 4 +-- 2 files changed, 3 insertions(+), 34 deletions(-) diff --git a/FemDesign.Core/Materials/MaterialDatabase.cs b/FemDesign.Core/Materials/MaterialDatabase.cs index d653a1a6..9f938550 100644 --- a/FemDesign.Core/Materials/MaterialDatabase.cs +++ b/FemDesign.Core/Materials/MaterialDatabase.cs @@ -6,6 +6,7 @@ using System.Reflection; using System.Linq; using System.Xml.Serialization; +using FemDesign.Materials; namespace FemDesign.Materials { @@ -106,37 +107,7 @@ public List MaterialNames() /// public Material MaterialByName(string materialName) { - if (this.Materials != null) - { - foreach (Material material in this.Materials.Material) - { - if (material.Name == materialName) - { - // update object information - //material.Guid = System.Guid.NewGuid(); - material.EntityModified(); - - // return - return material; - } - } - } - if (this.ReinforcingMaterials != null) - { - foreach (Material material in this.ReinforcingMaterials.Material) - { - if (material.Name == materialName) - { - // update object information - //material.Guid = System.Guid.NewGuid(); - material.EntityModified(); - - // return - return material; - } - } - } - throw new System.ArgumentException($"Material was not found. Incorrect material name ({materialName}) or empty material database."); + return this.Materials.Material.MaterialByName(materialName); } public List GetSoilMaterial() diff --git a/FemDesign.Core/Sections/SectionDatabase.cs b/FemDesign.Core/Sections/SectionDatabase.cs index c6cebfb6..0be44f01 100644 --- a/FemDesign.Core/Sections/SectionDatabase.cs +++ b/FemDesign.Core/Sections/SectionDatabase.cs @@ -54,9 +54,7 @@ private SectionDatabase() public Section SectionByName(string sectionName) { var sections = this.Sections.Section; - var sectionNames = sections.Select(x => x._sectionName).ToArray(); - var index = FuzzySharp.Process.ExtractOne(sectionName, sectionNames).Index; - return sections[index]; + return sections.SectionByName(sectionName); } /// From 56f54d03b8f42fd63335b66582a6ad2f21499051 Mon Sep 17 00:00:00 2001 From: MP Date: Tue, 3 Feb 2026 17:24:39 +0100 Subject: [PATCH 11/12] =?UTF-8?q?=F0=9F=86=99=20python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FemDesign.Python/{packaging => }/LICENSE | 0 FemDesign.Python/PUBLISHING.md | 79 +++++++++++++++++++ FemDesign.Python/{packaging => }/README.md | 0 FemDesign.Python/femdesign/comunication.py | 2 +- FemDesign.Python/femdesign/database.py | 63 --------------- FemDesign.Python/packaging/publishing.txt | 0 .../{packaging => }/pyproject.toml | 19 ++++- 7 files changed, 95 insertions(+), 68 deletions(-) rename FemDesign.Python/{packaging => }/LICENSE (100%) create mode 100644 FemDesign.Python/PUBLISHING.md rename FemDesign.Python/{packaging => }/README.md (100%) delete mode 100644 FemDesign.Python/femdesign/database.py delete mode 100644 FemDesign.Python/packaging/publishing.txt rename FemDesign.Python/{packaging => }/pyproject.toml (63%) diff --git a/FemDesign.Python/packaging/LICENSE b/FemDesign.Python/LICENSE similarity index 100% rename from FemDesign.Python/packaging/LICENSE rename to FemDesign.Python/LICENSE diff --git a/FemDesign.Python/PUBLISHING.md b/FemDesign.Python/PUBLISHING.md new file mode 100644 index 00000000..50d98fc8 --- /dev/null +++ b/FemDesign.Python/PUBLISHING.md @@ -0,0 +1,79 @@ +# Publishing FEM-Design to PyPI + +## Prerequisites +1. Create a PyPI account at https://pypi.org/account/register/ +2. Create a TestPyPI account at https://test.pypi.org/account/register/ +3. Generate API tokens for both (recommended over password) + - PyPI: https://pypi.org/manage/account/token/ + - TestPyPI: https://test.pypi.org/manage/account/token/ + +## Step 1: Test on TestPyPI (Recommended) + +Upload to TestPyPI first to test the package: + +```powershell +python -m twine upload --repository testpypi dist/* +``` + +When prompted: +- Username: __token__ +- Password: (paste your TestPyPI API token, starts with pypi-...) + +Then test installation from TestPyPI: +```powershell +pip install --index-url https://test.pypi.org/simple/ FEM-Design +``` + +## Step 2: Upload to PyPI (Production) + +Once you've verified the package works on TestPyPI: + +```powershell +python -m twine upload dist/* +``` + +When prompted: +- Username: __token__ +- Password: (paste your PyPI API token, starts with pypi-...) + +## Step 3: Verify Installation + +Test that users can install your package: +```powershell +pip install FEM-Design +``` + +## Using API Tokens with .pypirc (Optional) + +Create a file at %USERPROFILE%\.pypirc with: + +```ini +[distutils] +index-servers = + pypi + testpypi + +[pypi] +repository = https://upload.pypi.org/legacy/ +username = __token__ +password = pypi-YourPyPITokenHere + +[testpypi] +repository = https://test.pypi.org/legacy/ +username = __token__ +password = pypi-YourTestPyPITokenHere +``` + +This allows you to upload without entering credentials: +```powershell +python -m twine upload --repository testpypi dist/* +python -m twine upload dist/* +``` + +## Important Notes + +- Make sure to increment the version number in pyproject.toml for each new release +- PyPI does not allow re-uploading the same version number +- Always test on TestPyPI before uploading to production PyPI +- The package name "FEM-Design" must be available on PyPI (check at https://pypi.org/project/FEM-Design/) +- Current version: 0.0.8 diff --git a/FemDesign.Python/packaging/README.md b/FemDesign.Python/README.md similarity index 100% rename from FemDesign.Python/packaging/README.md rename to FemDesign.Python/README.md diff --git a/FemDesign.Python/femdesign/comunication.py b/FemDesign.Python/femdesign/comunication.py index c4570b12..580e35fa 100644 --- a/FemDesign.Python/femdesign/comunication.py +++ b/FemDesign.Python/femdesign/comunication.py @@ -298,7 +298,7 @@ class Verbosity(Enum): class FemDesignConnection(_FdConnect): def __init__(self, - fd_path : str = r"C:\Program Files\StruSoft\FEM-Design 23\fd3dstruct.exe", + fd_path : str = r"C:\Program Files\StruSoft\FEM-Design 24\fd3dstruct.exe", pipe_name : str ="FdPipe1", verbose : Verbosity = Verbosity.SCRIPT_LOG_LINES, output_dir : str = None, diff --git a/FemDesign.Python/femdesign/database.py b/FemDesign.Python/femdesign/database.py deleted file mode 100644 index 8c9384e3..00000000 --- a/FemDesign.Python/femdesign/database.py +++ /dev/null @@ -1,63 +0,0 @@ -import xml.etree.ElementTree as ET -import uuid -import datetime - -namespace = {'': 'urn:strusoft'} - -class Database: - def __init__(self, country): - self.struxml_version = "01.00.000" - self.source_software = f"FEM-Design API SDK {self.get_version()}" - self.start_time = "1970-01-01T00:00:00.000" - self.end_time = datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] - self.guid = str(uuid.uuid4()) - self.convert_id = "00000000-0000-0000-0000-000000000000" - self.standard = "EC" - self.country = country - self.end = "" - - def get_version(self): - return "0.1.0" - - @property - def eurocode(self): - return self._root.attrib["standard"] - - @property - def country(self): - return self._root.attrib["country"] - - @property - def source_software(self): - return self._root.attrib["source_software"] - - @property - def entities(self): - return self._root.findall(".//entities", namespace) - - @property - def sections(self): - return self._root.findall(".//sections", namespace) - - @property - def materials(self): - return self._root.findall(".//materials", namespace) - - @property - def bars(self): - return self._root.findall(".//bar", namespace) - - def serialise_to_xml(self): - return ET.tostring(self._root, encoding="UTF-8") - - # private void Initialize(Country country) - # { - # this.StruxmlVersion = "01.00.000"; - # this.SourceSoftware = $"FEM-Design API SDK {Assembly.GetExecutingAssembly().GetName().Version.ToString()}"; - # this.StartTime = "1970-01-01T00:00:00.000"; - # this.EndTime = System.DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture); - # this.Guid = System.Guid.NewGuid(); - # this.ConvertId = "00000000-0000-0000-0000-000000000000"; - # this.Standard = "EC"; - # this.Country = country; - # this.End = ""; \ No newline at end of file diff --git a/FemDesign.Python/packaging/publishing.txt b/FemDesign.Python/packaging/publishing.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/FemDesign.Python/packaging/pyproject.toml b/FemDesign.Python/pyproject.toml similarity index 63% rename from FemDesign.Python/packaging/pyproject.toml rename to FemDesign.Python/pyproject.toml index e1af1922..63d84818 100644 --- a/FemDesign.Python/packaging/pyproject.toml +++ b/FemDesign.Python/pyproject.toml @@ -1,6 +1,10 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + [project] name = "FEM-Design" -version = "0.0.7" +version = "0.0.8" authors = [ { name="FEM-Design", email="femdesign.api@strusoft.com" }, ] @@ -11,14 +15,21 @@ maintainers = [ description = "The FEM-Design API package" readme = "README.md" requires-python = ">=3.8" +dependencies = [ + "pywin32>=306", +] classifiers = [ "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: Microsoft", + "Operating System :: Microsoft :: Windows", ] +license = {text = "MIT"} keywords = ["fem", "fea", "structures", "strusoft", "FEM-Design API"] [project.urls] Homepage = "https://femdesign-api-docs.onstrusoft.com" Repository = "https://github.com/strusoft/femdesign-api/tree/master/FemDesign.Python" -Issues = "https://github.com/strusoft/femdesign-api/issues" \ No newline at end of file +Issues = "https://github.com/strusoft/femdesign-api/issues" + +[tool.setuptools.packages.find] +include = ["femdesign*"] +exclude = ["test*", "packaging*"] \ No newline at end of file From 7f8cb1f2aaf32e9d794934b11e8c9ffca8e1b8fa Mon Sep 17 00:00:00 2001 From: MP Date: Tue, 3 Feb 2026 18:15:06 +0100 Subject: [PATCH 12/12] test section by name --- FemDesign.Core/Sections/Section.cs | 3 +- FemDesign.Core/Sections/SectionDatabase.cs | 9 + FemDesign.Tests/Assets/sections.struxml | 90354 ++++++++++++++++ FemDesign.Tests/FemDesign.Tests.csproj | 1 + .../Sections/SectionDatabaseTests.cs | 49 +- 5 files changed, 90403 insertions(+), 13 deletions(-) create mode 100644 FemDesign.Tests/Assets/sections.struxml diff --git a/FemDesign.Core/Sections/Section.cs b/FemDesign.Core/Sections/Section.cs index b2b3f57b..132c6575 100644 --- a/FemDesign.Core/Sections/Section.cs +++ b/FemDesign.Core/Sections/Section.cs @@ -199,6 +199,7 @@ public static class SectionExtension return sectionByFamily; } + public static Section SectionByName(this List sections, string sectionName) { // abbreviation HEA 100 @@ -213,7 +214,7 @@ public static Section SectionByName(this List sectio ExtractedResult extr = extracted.Score > extract.Score ? extracted : extract; if (extr.Score < Section._fuzzyScore) - throw new Exception($"{sectionName} can not be found!"); + throw new Exception($"{sectionName} can not be found! Try different naming conventions."); else return sections[extr.Index]; } diff --git a/FemDesign.Core/Sections/SectionDatabase.cs b/FemDesign.Core/Sections/SectionDatabase.cs index 0be44f01..0b92cb40 100644 --- a/FemDesign.Core/Sections/SectionDatabase.cs +++ b/FemDesign.Core/Sections/SectionDatabase.cs @@ -51,6 +51,15 @@ private SectionDatabase() } + + /// + /// Returns the first in the database with the specified name. + /// Use to get a list of all section names in the database. + /// You can also use abbreviated names as used in FEM-Design results. + /// i.e. "HEA100", "IPE200", "CHS 323.9-8.8" etc. + /// + /// The name of the section to find. + /// The with the specified name, or null if not found. public Section SectionByName(string sectionName) { var sections = this.Sections.Section; diff --git a/FemDesign.Tests/Assets/sections.struxml b/FemDesign.Tests/Assets/sections.struxml new file mode 100644 index 00000000..2f4d994e --- /dev/null +++ b/FemDesign.Tests/Assets/sections.struxml @@ -0,0 +1,90354 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
diff --git a/FemDesign.Tests/FemDesign.Tests.csproj b/FemDesign.Tests/FemDesign.Tests.csproj index 2fa34d66..25a37721 100644 --- a/FemDesign.Tests/FemDesign.Tests.csproj +++ b/FemDesign.Tests/FemDesign.Tests.csproj @@ -171,6 +171,7 @@ + Always diff --git a/FemDesign.Tests/Sections/SectionDatabaseTests.cs b/FemDesign.Tests/Sections/SectionDatabaseTests.cs index e04bc2c7..3166c5e4 100644 --- a/FemDesign.Tests/Sections/SectionDatabaseTests.cs +++ b/FemDesign.Tests/Sections/SectionDatabaseTests.cs @@ -34,25 +34,50 @@ public void GetDefaultTest() } - [TestMethod("Fuzz")] - public void test() + [TestMethod] + public void TestFuzzySearch() { var db = SectionDatabase.GetDefault(); - var choices = db.Sections.Section.Select(s => s._sectionName).ToArray(); - var a = FuzzySharp.Process.ExtractOne("HEA100", choices); - var b = FuzzySharp.Process.ExtractOne("CHS, 30-5.6", choices); - var c = FuzzySharp.Process.ExtractOne("CHS 30/5.6", choices); - var d = FuzzySharp.Process.ExtractOne("hea 100", choices); - var e = FuzzySharp.Process.ExtractOne("150x300", choices); + var section1 = db.SectionByName("HEA100"); + var targetName = "Steel section, HE-A, 100"; + Assert.IsTrue(section1.Name == targetName); - var f = FuzzySharp.Process.ExtractOne("150x20", choices); + section1 = db.SectionByName("HEA-100"); + Assert.IsTrue(section1.Name == targetName); - var test = 1; + section1 = db.SectionByName("HEA_100"); + Assert.IsTrue(section1.Name == targetName); - f = FuzzySharp.Process.ExtractOne("150", choices); + section1 = db.SectionByName("HEA100"); + Assert.IsTrue(section1.Name == targetName); + + section1 = db.SectionByName("Steel section, HE-A, 100"); + Assert.IsTrue(section1.Name == targetName); + + + + section1 = db.SectionByName("CHS 323.9-8.8"); + targetName = "Steel section, CHS, 323.9-8.8"; + Assert.IsTrue(section1.Name == targetName); + + section1 = db.SectionByName("CHS 323.9/8.8"); + Assert.IsTrue(section1.Name == targetName); + + section1 = db.SectionByName("CHS, 323.9-8.8"); + Assert.IsTrue(section1.Name == targetName); + + //Timber section, Rectangle, 66x225 + section1 = db.SectionByName("Timber section, Rectangle, 66x225"); + targetName = "Timber section, Rectangle, 66x225"; + Assert.IsTrue(section1.Name == targetName); + + section1 = db.SectionByName("Rectangle 66x225"); + Assert.IsTrue(section1.Name == targetName); + + section1 = db.SectionByName("Timber 66x225"); + Assert.IsTrue(section1.Name == targetName); - test = 1; } }