diff --git a/.vs/ComputerResourceConsole/v15/.suo b/.vs/ComputerResourceConsole/v15/.suo new file mode 100644 index 0000000000000000000000000000000000000000..fc97e1302eb1aba724be6a762a5fd8fe889a753f Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/.suo differ diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/db.lock b/.vs/ComputerResourceConsole/v15/Server/sqlite3/db.lock new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide new file mode 100644 index 0000000000000000000000000000000000000000..a7adb941dc66efc67bdadc58c9c8387ac17f9b33 Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide differ diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-shm b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-shm new file mode 100644 index 0000000000000000000000000000000000000000..fb4b5cc538614aaaf039ba190c0eeae893d39a6b Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-shm differ diff --git a/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-wal b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-wal new file mode 100644 index 0000000000000000000000000000000000000000..9ff66f8e11f6067433b7556feee582a46e59f932 Binary files /dev/null and b/.vs/ComputerResourceConsole/v15/Server/sqlite3/storage.ide-wal differ diff --git a/ComputerResourceConsole.csproj b/ComputerResourceConsole.csproj index 16fe398d1e2027c33ef1cadad626c19e2c25ff28..e72633d30a67fa1b3ceec6f9908a3fd2c85e97ab 100644 --- a/ComputerResourceConsole.csproj +++ b/ComputerResourceConsole.csproj @@ -124,6 +124,23 @@ + + + + + + + + + Form + + + Component + + + Component + + @@ -132,6 +149,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + Form @@ -165,12 +220,6 @@ frm_debug_text.cs - - Form - - - frm_mdl.cs - Form @@ -189,6 +238,16 @@ frm_version.cs + + Form + + + Form + + + + DataReference.cs + frm_about.cs @@ -213,9 +272,6 @@ frm_debug_text.cs - - frm_mdl.cs - frm_packing.cs @@ -225,6 +281,12 @@ frm_version.cs + + frm_mdl.cs + + + StateInfomation.cs + Designer diff --git a/MDL/MDL.Class/AttributePage.cs b/MDL/MDL.Class/AttributePage.cs new file mode 100644 index 0000000000000000000000000000000000000000..94512a097f3518a884d3bf30823313bd1161e83a --- /dev/null +++ b/MDL/MDL.Class/AttributePage.cs @@ -0,0 +1,358 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace MDL.Class +{ + internal class AttributePage + { + private TabPage tabPage1; + + private GroupBox groupBox3; + + private DataGridView dataGridView3; + + private Label label11; + + private DataGridView dataGridView2; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn1; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn2; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn3; + + private DataGridViewTextBoxColumn Column4; + + private Label label10; + + private ComboBox comboBox2; + + private Label label9; + + private Label label8; + + private DataGridView dataGridView1; + + private DataGridViewComboBoxColumn Column1; + + private DataGridViewTextBoxColumn Column2; + + private DataGridViewTextBoxColumn Column3; + + private TextBox textBox5; + + private Label label7; + + private TextBox textBox4; + + private Label label6; + + private TextBox textBox3; + + private Label label5; + + private TextBox textBox2; + + private Label label4; + + private ComboBox comboBox1; + + private Label label3; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn4; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn5; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn6; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn7; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn8; + + private DataGridViewTextBoxColumn dataGridViewTextBoxColumn9; + + private Label tip; + + public TabPage getPage() + { + return tabPage1; + } + + public void Init(Label tipLabel) + { + tip = tipLabel; + tabPage1 = new TabPage(); + groupBox3 = new GroupBox(); + dataGridView3 = new DataGridView(); + dataGridViewTextBoxColumn4 = new DataGridViewTextBoxColumn(); + dataGridViewTextBoxColumn5 = new DataGridViewTextBoxColumn(); + dataGridViewTextBoxColumn6 = new DataGridViewTextBoxColumn(); + dataGridViewTextBoxColumn7 = new DataGridViewTextBoxColumn(); + dataGridViewTextBoxColumn8 = new DataGridViewTextBoxColumn(); + dataGridViewTextBoxColumn9 = new DataGridViewTextBoxColumn(); + label11 = new Label(); + dataGridView2 = new DataGridView(); + dataGridViewTextBoxColumn1 = new DataGridViewTextBoxColumn(); + dataGridViewTextBoxColumn2 = new DataGridViewTextBoxColumn(); + dataGridViewTextBoxColumn3 = new DataGridViewTextBoxColumn(); + Column4 = new DataGridViewTextBoxColumn(); + label10 = new Label(); + comboBox2 = new ComboBox(); + label9 = new Label(); + label8 = new Label(); + dataGridView1 = new DataGridView(); + Column1 = new DataGridViewComboBoxColumn(); + Column2 = new DataGridViewTextBoxColumn(); + Column3 = new DataGridViewTextBoxColumn(); + textBox5 = new TextBox(); + label7 = new Label(); + textBox4 = new TextBox(); + label6 = new Label(); + textBox3 = new TextBox(); + label5 = new Label(); + textBox2 = new TextBox(); + label4 = new Label(); + comboBox1 = new ComboBox(); + label3 = new Label(); + tabPage1.AutoScroll = true; + tabPage1.Controls.Add(groupBox3); + tabPage1.Controls.Add(label8); + tabPage1.Controls.Add(dataGridView1); + tabPage1.Controls.Add(textBox5); + tabPage1.Controls.Add(label7); + tabPage1.Controls.Add(textBox4); + tabPage1.Controls.Add(label6); + tabPage1.Controls.Add(textBox3); + tabPage1.Controls.Add(label5); + tabPage1.Controls.Add(textBox2); + tabPage1.Controls.Add(label4); + tabPage1.Controls.Add(comboBox1); + tabPage1.Controls.Add(label3); + tabPage1.Location = new Point(4, 29); + tabPage1.Name = "tabPage1"; + tabPage1.Padding = new Padding(3); + tabPage1.Size = new Size(717, 615); + tabPage1.TabIndex = 0; + tabPage1.Text = "Attribute"; + tabPage1.UseVisualStyleBackColor = true; + groupBox3.Controls.Add(dataGridView3); + groupBox3.Controls.Add(label11); + groupBox3.Controls.Add(dataGridView2); + groupBox3.Controls.Add(label10); + groupBox3.Controls.Add(comboBox2); + groupBox3.Controls.Add(label9); + groupBox3.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + groupBox3.Location = new Point(30, 512); + groupBox3.Name = "groupBox3"; + groupBox3.Size = new Size(643, 463); + groupBox3.TabIndex = 14; + groupBox3.TabStop = false; + groupBox3.Text = "Application"; + dataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; + dataGridView3.BackgroundColor = SystemColors.ActiveCaption; + dataGridView3.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView3.Columns.AddRange(dataGridViewTextBoxColumn4, dataGridViewTextBoxColumn5, dataGridViewTextBoxColumn6, dataGridViewTextBoxColumn7, dataGridViewTextBoxColumn8, dataGridViewTextBoxColumn9); + dataGridView3.Location = new Point(24, 283); + dataGridView3.Name = "dataGridView3"; + dataGridView3.RowTemplate.Height = 23; + dataGridView3.Size = new Size(601, 150); + dataGridView3.TabIndex = 17; + dataGridViewTextBoxColumn4.HeaderText = "RegionName"; + dataGridViewTextBoxColumn4.Name = "dataGridViewTextBoxColumn4"; + dataGridViewTextBoxColumn4.Width = 133; + dataGridViewTextBoxColumn5.HeaderText = "xMin"; + dataGridViewTextBoxColumn5.Name = "dataGridViewTextBoxColumn5"; + dataGridViewTextBoxColumn5.Width = 73; + dataGridViewTextBoxColumn6.HeaderText = "xMax"; + dataGridViewTextBoxColumn6.Name = "dataGridViewTextBoxColumn6"; + dataGridViewTextBoxColumn6.Width = 73; + dataGridViewTextBoxColumn7.HeaderText = "yMin"; + dataGridViewTextBoxColumn7.Name = "dataGridViewTextBoxColumn7"; + dataGridViewTextBoxColumn7.Width = 73; + dataGridViewTextBoxColumn8.HeaderText = "yMax"; + dataGridViewTextBoxColumn8.Name = "dataGridViewTextBoxColumn8"; + dataGridViewTextBoxColumn8.Width = 73; + dataGridViewTextBoxColumn9.HeaderText = "SpatialRef"; + dataGridViewTextBoxColumn9.Name = "dataGridViewTextBoxColumn9"; + dataGridViewTextBoxColumn9.Width = 133; + label11.AutoSize = true; + label11.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label11.Location = new Point(21, 257); + label11.Name = "label11"; + label11.Size = new Size(68, 18); + label11.TabIndex = 16; + label11.Text = "Scope:"; + dataGridView2.AllowUserToAddRows = false; + dataGridView2.AllowUserToDeleteRows = false; + dataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView2.BackgroundColor = SystemColors.ActiveCaption; + dataGridView2.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView2.Columns.AddRange(dataGridViewTextBoxColumn1, dataGridViewTextBoxColumn2, dataGridViewTextBoxColumn3, Column4); + dataGridView2.Location = new Point(24, 114); + dataGridView2.Name = "dataGridView2"; + dataGridView2.RowTemplate.Height = 23; + dataGridView2.Size = new Size(601, 120); + dataGridView2.TabIndex = 15; + dataGridViewTextBoxColumn1.HeaderText = "Dimension"; + dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1"; + dataGridViewTextBoxColumn1.ReadOnly = true; + dataGridViewTextBoxColumn2.HeaderText = "Min"; + dataGridViewTextBoxColumn2.Name = "dataGridViewTextBoxColumn2"; + dataGridViewTextBoxColumn3.HeaderText = "Max"; + dataGridViewTextBoxColumn3.Name = "dataGridViewTextBoxColumn3"; + Column4.HeaderText = "Unit"; + Column4.Name = "Column4"; + label10.AutoSize = true; + label10.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label10.Location = new Point(21, 77); + label10.Name = "label10"; + label10.Size = new Size(278, 18); + label10.TabIndex = 14; + label10.Text = "Spatiotemporal Step Length:"; + comboBox2.DropDownStyle = ComboBoxStyle.DropDownList; + comboBox2.FormattingEnabled = true; + comboBox2.Items.AddRange(new object[4] + { + "Global", + "Regional/Large", + "Regional/Middle", + "Regional/Small" + }); + comboBox2.Location = new Point(245, 35); + comboBox2.Name = "comboBox2"; + comboBox2.Size = new Size(380, 25); + comboBox2.TabIndex = 13; + label9.AutoSize = true; + label9.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label9.Location = new Point(21, 37); + label9.Name = "label9"; + label9.Size = new Size(218, 18); + label9.TabIndex = 12; + label9.Text = "Spatiotemporal Scale:"; + label8.AutoSize = true; + label8.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label8.Location = new Point(47, 349); + label8.Name = "label8"; + label8.Size = new Size(108, 18); + label8.TabIndex = 11; + label8.Text = "Mechanism:"; + dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView1.BackgroundColor = SystemColors.ActiveCaption; + dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView1.Columns.AddRange(Column1, Column2, Column3); + dataGridView1.Location = new Point(172, 349); + dataGridView1.Name = "dataGridView1"; + dataGridView1.RowTemplate.Height = 23; + dataGridView1.Size = new Size(501, 150); + dataGridView1.TabIndex = 10; + dataGridView1.DataError += dataGridView1_DataError; + Column1.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; + Column1.HeaderText = "Type"; + Column1.Items.AddRange("Text", "Algorithm", "Formula"); + Column1.Name = "Column1"; + Column1.Resizable = DataGridViewTriState.True; + Column1.SortMode = DataGridViewColumnSortMode.Automatic; + Column2.HeaderText = "Name"; + Column2.Name = "Column2"; + Column3.HeaderText = "Value"; + Column3.Name = "Column3"; + textBox5.Location = new Point(172, 236); + textBox5.Multiline = true; + textBox5.Name = "textBox5"; + textBox5.Size = new Size(501, 90); + textBox5.TabIndex = 9; + label7.AutoSize = true; + label7.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label7.Location = new Point(57, 240); + label7.Name = "label7"; + label7.Size = new Size(98, 18); + label7.TabIndex = 8; + label7.Text = "Abstract:"; + textBox4.Location = new Point(172, 189); + textBox4.Name = "textBox4"; + textBox4.Size = new Size(501, 29); + textBox4.TabIndex = 7; + textBox4.Enter += keywords_Enter; + textBox4.Leave += Control_Leave; + label6.AutoSize = true; + label6.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label6.Location = new Point(57, 192); + label6.Name = "label6"; + label6.Size = new Size(98, 18); + label6.TabIndex = 6; + label6.Text = "Keywords:"; + textBox3.Location = new Point(172, 138); + textBox3.Name = "textBox3"; + textBox3.Size = new Size(501, 29); + textBox3.TabIndex = 5; + textBox3.Enter += wiki_Enter; + textBox3.Leave += Control_Leave; + label5.AutoSize = true; + label5.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label5.Location = new Point(97, 143); + label5.Name = "label5"; + label5.Size = new Size(58, 18); + label5.TabIndex = 4; + label5.Text = "Wiki:"; + textBox2.Location = new Point(172, 87); + textBox2.Name = "textBox2"; + textBox2.Size = new Size(501, 29); + textBox2.TabIndex = 3; + label4.AutoSize = true; + label4.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label4.Location = new Point(37, 92); + label4.Name = "label4"; + label4.Size = new Size(118, 18); + label4.TabIndex = 2; + label4.Text = "Lcoal Name:"; + comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; + comboBox1.FormattingEnabled = true; + comboBox1.Items.AddRange(new object[7] + { + "EN_US", + "ZH_CN", + "DE_DE", + "RU_RU", + "AR", + "ES", + "Others" + }); + comboBox1.Location = new Point(172, 37); + comboBox1.Name = "comboBox1"; + comboBox1.Size = new Size(501, 27); + comboBox1.TabIndex = 1; + label3.AutoSize = true; + label3.Font = new Font("Times New Roman", 13f, FontStyle.Bold, GraphicsUnit.Point, 134); + label3.Location = new Point(57, 41); + label3.Name = "label3"; + label3.Size = new Size(98, 18); + label3.TabIndex = 0; + label3.Text = "Language:"; + } + + private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) + { + } + + private void keywords_Enter(object sender, EventArgs e) + { + showTip("Please separate the different keywords with ';'"); + } + + private void Control_Leave(object sender, EventArgs e) + { + showTip(""); + } + + private void wiki_Enter(object sender, EventArgs e) + { + showTip("eg.https://en.wikipedia.org/wiki/Nanjing"); + } + + private void showTip(string str) + { + tip.Text = str; + } + } +} diff --git a/MDL/MDL.Class/Dataset.cs b/MDL/MDL.Class/Dataset.cs new file mode 100644 index 0000000000000000000000000000000000000000..227f9de554e56df12bab1ac6804b3650ac895a85 --- /dev/null +++ b/MDL/MDL.Class/Dataset.cs @@ -0,0 +1,61 @@ +namespace MDL.Class +{ + public class Dataset + { + private string name; + + private string type; + + private string description; + + private string externalId; + + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + public string Type + { + get + { + return type; + } + set + { + type = value; + } + } + + public string Description + { + get + { + return description; + } + set + { + description = value; + } + } + + public string ExternalId + { + get + { + return externalId; + } + set + { + externalId = value; + } + } + } +} diff --git a/MDL/MDL.Class/Event.cs b/MDL/MDL.Class/Event.cs new file mode 100644 index 0000000000000000000000000000000000000000..2d64f0882a0225e86bd6e4fa3f13edca6dabf705 --- /dev/null +++ b/MDL/MDL.Class/Event.cs @@ -0,0 +1,75 @@ +namespace MDL.Class +{ + public class Event + { + private string name; + + private string type; + + private string optional; + + private string description; + + private Dataset datasetReference; + + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + public string Type + { + get + { + return type; + } + set + { + type = value; + } + } + + public string Optional + { + get + { + return optional; + } + set + { + optional = value; + } + } + + public string Description + { + get + { + return description; + } + set + { + description = value; + } + } + + internal Dataset DatasetReference + { + get + { + return datasetReference; + } + set + { + datasetReference = value; + } + } + } +} diff --git a/MDL/MDL.Class/EventPage.cs b/MDL/MDL.Class/EventPage.cs new file mode 100644 index 0000000000000000000000000000000000000000..6b125fb3af1c550cc8d877bc54f2e2345453e2cc --- /dev/null +++ b/MDL/MDL.Class/EventPage.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace MDL.Class +{ + internal class EventPage + { + private TabPage tabPage1; + + private Button button4; + + private Label label11; + + private Label label10; + + private ComboBox type; + + private TextBox description; + + private Label label6; + + private ComboBox optional; + + private Label label7; + + private Label label8; + + private TextBox name; + + private Label label9; + + private Dataset dataset; + + private ComboBox ComboBox; + + private Button button5; + + private static List datasets = new List(); + + private static List uniqueDatasets = new List(); + + public Dataset Dataset + { + get + { + return dataset; + } + set + { + frm_TransfEvent(value); + } + } + + public string Description + { + get + { + return description.Text; + } + set + { + description.Text = value; + } + } + + public string Name + { + get + { + return name.Text; + } + set + { + name.Text = value; + } + } + + public string Type + { + get + { + return type.Text; + } + set + { + type.Text = value; + } + } + + public string Optional + { + get + { + return optional.Text; + } + set + { + optional.Text = value; + } + } + + public TabPage getPage() + { + return tabPage1; + } + + private void configure_Click(object sender, EventArgs e) + { + DataReference dataReference = new DataReference(dataset, type.Text); + dataReference.TransfEvent += frm_TransfEvent; + dataReference.ShowDialog(); + } + + private void connect_Click(object sender, EventArgs e) + { + if (ComboBox.SelectedIndex < 0) + { + MessageBox.Show("Nodata! Re-select the data and try again"); + } + else + { + dataset = uniqueDatasets[ComboBox.SelectedIndex]; + label11.Text = dataset.Name; + label11.BackColor = Color.LightGreen; + + } + } + + private void frm_TransfEvent(Dataset value) + { + dataset = value; + if (dataset.Name != "" || dataset.Type != "" || dataset.Description != "" || dataset.ExternalId != "") + { + label11.Text = dataset.Name; + label11.BackColor = Color.LightGreen; + datasets.Add(dataset); + + } + else + { + label11.Text = "undefined"; + label11.BackColor = Color.Silver; + } + uniqueDatasets = datasets + .GroupBy(d => d.Name) + .Select(g => g.First()) // ´Óÿ¸ö·Ö×éÖÐÑ¡ÔñµÚÒ»¸öÔªËØ + .ToList(); + ComboBox.Items.Clear(); + foreach (Dataset dataset in uniqueDatasets) + { + ComboBox.Items.Add(dataset.Name); + } + } + + public void Init(int count) + { + tabPage1 = new TabPage(); + button4 = new Button(); + label11 = new Label(); + label10 = new Label(); + type = new ComboBox(); + description = new TextBox(); + label6 = new Label(); + optional = new ComboBox(); + label7 = new Label(); + label8 = new Label(); + name = new TextBox(); + label9 = new Label(); + dataset = new Dataset(); + ComboBox = new ComboBox(); + button5 = new Button(); + tabPage1.Controls.Add(button4); + tabPage1.Controls.Add(label11); + tabPage1.Controls.Add(label10); + tabPage1.Controls.Add(type); + tabPage1.Controls.Add(description); + tabPage1.Controls.Add(label6); + tabPage1.Controls.Add(optional); + tabPage1.Controls.Add(label7); + tabPage1.Controls.Add(label8); + tabPage1.Controls.Add(name); + tabPage1.Controls.Add(label9); + tabPage1.Controls.Add(ComboBox); + tabPage1.Controls.Add(button5); + tabPage1.Location = new Point(4, 22); + tabPage1.Name = "tabPage" + count; + tabPage1.Padding = new Padding(3); + tabPage1.Size = new Size(493, 345); + tabPage1.TabIndex = 0; + tabPage1.Text = "NewEvent" + count; + tabPage1.UseVisualStyleBackColor = true; + button4.Location = new Point(357, 285); + button4.Name = "button4"; + button4.Size = new Size(75, 23); + button4.TabIndex = 19; + button4.Text = "Configure"; + button4.UseVisualStyleBackColor = true; + button4.Click += configure_Click; + button5.Location = new Point(357, 315); + button5.Name = "button5"; + button5.Size = new Size(75, 23); + button5.TabIndex = 19; + button5.Text = "Connect"; + button5.UseVisualStyleBackColor = true; + button5.Click += connect_Click; + label11.AutoSize = true; + label11.BackColor = Color.Silver; + label11.Location = new Point(191, 290); + label11.Name = "label11"; + label11.Size = new Size(59, 12); + label11.TabIndex = 18; + label11.Text = "undefined"; + label10.AutoSize = true; + label10.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134); + label10.Location = new Point(32, 287); + label10.Name = "label10"; + label10.Size = new Size(152, 16); + label10.TabIndex = 17; + label10.Text = "Dataset Reference:"; + type.FormattingEnabled = true; + type.Items.AddRange(new object[2] + { + "response(input)", + "noresponse(output)" + }); + type.Location = new Point(86, 80); + type.Name = "comboBox3"; + type.Size = new Size(378, 20); + type.TabIndex = 16; + type.DropDownStyle = ComboBoxStyle.DropDownList; + type.SelectedIndex = 0; + description.Location = new Point(35, 192); + description.Multiline = true; + description.Name = "textBox4"; + description.Size = new Size(429, 67); + description.TabIndex = 15; + label6.AutoSize = true; + label6.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134); + label6.Location = new Point(32, 168); + label6.Name = "label6"; + label6.Size = new Size(104, 16); + label6.TabIndex = 14; + label6.Text = "Description:"; + ComboBox.FormattingEnabled = true; + ComboBox.Location = new Point(191, 315); + ComboBox.Items.Clear(); + + foreach (Dataset dataset in uniqueDatasets) + { + ComboBox.Items.Add(dataset.Name); + } + ComboBox.DropDownStyle = ComboBoxStyle.DropDownList; // ½ûÖ¹Óû§ÊäÈë + ComboBox.Name = "comboBox3"; + ComboBox.Size = new Size(80, 16); + optional.FormattingEnabled = true; + optional.Items.AddRange(new object[2] + { + "False", + "True" + }); + optional.Location = new Point(118, 125); + optional.Name = "comboBox2"; + optional.Size = new Size(347, 20); + optional.TabIndex = 13; + optional.DropDownStyle = ComboBoxStyle.DropDownList; + optional.SelectedIndex = 0; + label7.AutoSize = true; + label7.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134); + label7.Location = new Point(32, 125); + label7.Name = "label7"; + label7.Size = new Size(80, 16); + label7.TabIndex = 12; + label7.Text = "Optional:"; + label8.AutoSize = true; + label8.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134); + label8.Location = new Point(32, 80); + label8.Name = "label8"; + label8.Size = new Size(48, 16); + label8.TabIndex = 10; + label8.Text = "Type:"; + name.Location = new Point(86, 29); + name.Name = "textBox6"; + name.ReadOnly = false; + name.Size = new Size(379, 21); + name.TabIndex = 9; + label9.AutoSize = true; + label9.Font = new Font("Times New Roman", 12f, FontStyle.Regular, GraphicsUnit.Point, 134); + label9.Location = new Point(32, 31); + label9.Name = "label9"; + label9.Size = new Size(48, 16); + label9.TabIndex = 8; + label9.Text = "Name:"; + } + } +} diff --git a/MDL/MDL.Class/StateInfo.cs b/MDL/MDL.Class/StateInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..98f8aca34821877ea5d0dfec966cc8eb1f8e28c2 --- /dev/null +++ b/MDL/MDL.Class/StateInfo.cs @@ -0,0 +1,91 @@ +using System.Collections.Generic; + +namespace MDL.Class +{ + public class StateInfo + { + private string id; + + private string name; + + private string type; + + private string description; + + private Event[] events; + + private List to = new List(); + + public string ID + { + get + { + return id; + } + set + { + id = value; + } + } + + public string Name + { + get + { + return name; + } + set + { + name = value; + } + } + + public string Type + { + get + { + return type; + } + set + { + type = value; + } + } + + public string Description + { + get + { + return description; + } + set + { + description = value; + } + } + + internal Event[] Events + { + get + { + return events; + } + set + { + events = value; + } + } + + public List To + { + get + { + return to; + } + set + { + to = value; + } + } + } +} diff --git a/MDL/MDL.Properties/Resources.cs b/MDL/MDL.Properties/Resources.cs new file mode 100644 index 0000000000000000000000000000000000000000..bd6c3994e717cbbc1de60f0dc132a9d4d4986dfe --- /dev/null +++ b/MDL/MDL.Properties/Resources.cs @@ -0,0 +1,49 @@ +using System.CodeDom.Compiler; +using System.ComponentModel; +using System.Diagnostics; +using System.Globalization; +using System.Resources; +using System.Runtime.CompilerServices; + +namespace MDL.Properties +{ + [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [DebuggerNonUserCode] + [CompilerGenerated] + internal class Resources + { + private static ResourceManager resourceMan; + + private static CultureInfo resourceCulture; + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static ResourceManager ResourceManager + { + get + { + if (resourceMan == null) + { + ResourceManager resourceManager = resourceMan = new ResourceManager("MDL.Properties.Resources", typeof(Resources).Assembly); + } + return resourceMan; + } + } + + [EditorBrowsable(EditorBrowsableState.Advanced)] + internal static CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + + internal Resources() + { + } + } +} diff --git a/MDL/MDL.Properties/Settings.cs b/MDL/MDL.Properties/Settings.cs new file mode 100644 index 0000000000000000000000000000000000000000..a1d3727670e4c339f3e60fd65c02578de574154a --- /dev/null +++ b/MDL/MDL.Properties/Settings.cs @@ -0,0 +1,15 @@ +using System.CodeDom.Compiler; +using System.Configuration; +using System.Runtime.CompilerServices; + +namespace MDL.Properties +{ + [CompilerGenerated] + [GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed class Settings : ApplicationSettingsBase + { + private static Settings defaultInstance = (Settings)SettingsBase.Synchronized(new Settings()); + + public static Settings Default => defaultInstance; + } +} diff --git a/MDL/MDL.view/About.cs b/MDL/MDL.view/About.cs new file mode 100644 index 0000000000000000000000000000000000000000..c47354de38c26ab2fb382f428bc8df7978e10627 --- /dev/null +++ b/MDL/MDL.view/About.cs @@ -0,0 +1,102 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace MDL.view +{ + public class About : Form + { + private IContainer components = null; + + private Button btn_close; + + private Label label2; + + private Label label3; + + private Label label1; + + private PictureBox pictureBox1; + + public About() + { + InitializeComponent(); + } + + private void btn_close_Click(object sender, EventArgs e) + { + Close(); + } + + protected override void Dispose(bool disposing) + { + if (disposing && components != null) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MDL.view.About)); + btn_close = new System.Windows.Forms.Button(); + label2 = new System.Windows.Forms.Label(); + label3 = new System.Windows.Forms.Label(); + label1 = new System.Windows.Forms.Label(); + pictureBox1 = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); + SuspendLayout(); + btn_close.Location = new System.Drawing.Point(180, 65); + btn_close.Name = "btn_close"; + btn_close.Size = new System.Drawing.Size(75, 23); + btn_close.TabIndex = 7; + btn_close.Text = "Close"; + btn_close.UseVisualStyleBackColor = true; + btn_close.Click += new System.EventHandler(btn_close_Click); + label2.AutoSize = true; + label2.Font = new System.Drawing.Font("Times New Roman", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + label2.Location = new System.Drawing.Point(12, 68); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(161, 14); + label2.TabIndex = 4; + label2.Text = "Copyright: NNU OpenGMS"; + label3.AutoSize = true; + label3.Font = new System.Drawing.Font("Times New Roman", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + label3.Location = new System.Drawing.Point(61, 37); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(98, 14); + label3.TabIndex = 5; + label3.Text = "Version: v1.0"; + label1.AutoSize = true; + label1.Font = new System.Drawing.Font("Times New Roman", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + label1.Location = new System.Drawing.Point(61, 12); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(126, 14); + label1.TabIndex = 6; + label1.Text = "Service Container"; + pictureBox1.Image = (System.Drawing.Image)resources.GetObject("pictureBox1.Image"); + pictureBox1.Location = new System.Drawing.Point(12, 12); + pictureBox1.Name = "pictureBox1"; + pictureBox1.Size = new System.Drawing.Size(43, 45); + pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + pictureBox1.TabIndex = 3; + pictureBox1.TabStop = false; + base.AutoScaleDimensions = new System.Drawing.SizeF(6f, 12f); + base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + base.ClientSize = new System.Drawing.Size(266, 95); + base.Controls.Add(btn_close); + base.Controls.Add(label2); + base.Controls.Add(label3); + base.Controls.Add(label1); + base.Controls.Add(pictureBox1); + base.Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon"); + base.Name = "About"; + Text = "About"; + ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + } +} diff --git a/MDL/MDL.view/About.resx b/MDL/MDL.view/About.resx new file mode 100644 index 0000000000000000000000000000000000000000..131bcdf87b502b88a1c726b3548364af7e755cf2 --- /dev/null +++ b/MDL/MDL.view/About.resx @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0uRHJhd2luZy5JY29uAgAAAAhJY29uRGF0YQhJY29uU2l6ZQcEAhNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAIAAAAJAwAAAAX8////E1N5c3RlbS5EcmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgCAAAAAAAAAAAAAAAPAwAAAL6UAAACAAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Bv///wz///8Q/v7+FP7+/hj///8a/v7+Hv7+/hT+/v4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Ev///0D+/v5U////cv///5H///+z////yf///9n+/v7n/v7++f///7////9q/v7+JP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/7yoEf+8qBH/vKgP/8GuH//Ux2X/7+rH//z79f///////////////+////98////EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4E/v7+Iv///3L////d/v7+//7+/P/49uf/5t6q/8azPv+6pBf/uKIT/7iiFP+4oRT/uKES/7egE/+3oBP/uKEU/7ehFf+3oRb/t6EW/7egFv+3oBb/t58U/7efFP+2nxb/tp8Y/8KvPv/u6Mn//v37/////+3+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///6f+/v79/Pv1/+/rxv/PwlL/wrEh/8GwH//BsB7/wbAf/8GwH//Brx//wK8e/8CuHf/Arh3/wa8e/7+sF/+9qhH/vKkR/7ypEf+8qRH/vKkQ/7yoDv+9qhT/xrQx/+fgqf/49+n//f35//7+/v/+/v7z////2f///53+/v5s////Xv///1j///9a/v7+ZP///3b+/v7J/v7+4/////H+/v79+/rz//Lu0//Wynb/wKwq/7mjE/+5oxL/uKIT/7iiE/+4ohT/uKET/7ihEv+4oRL/uKAT/7egFP+3oBX/t6AV/7ehFv+3oBb/t6AW/7efFP+2nxT/uaMf/9jMhf/6+PH///////7+/n7///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////JP///8P+/vz/6uSz/9nOc//YzG//4NeN/+HZlP/f147/4NiP/+DYj//g2I//4NeP/+DXj//g15D/4tqZ/87AT/++qxf/vaoQ/7ypEf+9qRH/vagQ/7ypEf+8qQ//vKgP/7+sG//Ov1D/5+Cr//Tx2P/5+Oz//f35//7+/v///////v7+///////////////////////+/v3/+/r0//f15f/y7tP/29CE/8OwLv+7pRT/uaQR/7mjEf+4ohH/uaMS/7mjEv+4ohP/uKIU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//f04f/18tr/9fLa//Xy2v/49+j//f36//7+/v3+/v6j////QP///9X9/fr/181u/8CvFv/ArxX/wK8V/7+uFv+/rhb/v64V/7+uFv+/rhf/ybo6/+LbmP/5+Ov//v79/9zTg//Brx7/vqwT/76sEv+9qxP/vqwT/72rEv++qxL/vaoR/7yqEP+8qhH/vaoR/72qEf+9qRH/vakR/7ypEf+8qBD/vKgO/7yoDv+7qA7/vKgO/7yoDv+7pw//u6cP/7unDv+6pw//u6YP/7umDv+7pg3/u6YN/7qlDv+5pRD/uaUQ/7qkEP+6pRD/uqUR/7qkEP+6pA//wq8v/9rPgv/29OT//v37/////+////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///17////j/v7+///////+/v7///////7+/v/+/v7//v7+/////9H///9G////Pv7+/tX9/fr/181v/8CuGP/Arhb/wK8V/8CvFv+/rhb/v64W/76uFv++rhb/v68Y/8a3Mf/e1or/9/Xj/93Uhv/BsB7/vawS/76rE/++rBP/vawS/76rE/++qxP/vaoS/72qEf+9qhH/vakR/72qEf+9qhH/vakQ/72pEf+8qRH/vKkR/7ypD/+8qA7/vKgO/7unDv+8qA//vKgO/7unD/+7pw//u6cP/7umD/+7pg7/uqUN/7qlDf+5pA//uqUQ/7mkEP+5pRD/uqUR/7yoG//JuUb/49qe//n36v/+/v7/////7////4/+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wj+/v4i////OP///1r+/v5m/v7+Zv///2z///98////sf7+/rn+/v6X/v7+nf///+H9/fr/181v/7+vGf/Arxj/wK4X/7+uFv+/rhb/v64W/7+uFv+/rhb/v64W/7+uFv/CsSH/29F7/9vQev/FtSz/vqwT/76sE/++rBP/vqwS/72rE/+9qxP/vasS/72qEf+9qhH/vaoR/7ypEP+9qhH/vaoR/72pEP+9qRD/vKkR/7ypEf+8qA7/vKgO/7yoDv+8qA//vKgO/7unD/+7pw//u6cP/7unD/+7pg//u6YO/7qlDf+6pQ7/uqUP/7qlEP+6pRH/wa4r/9PFZ//w68z//Pv2//7+/v3////R////UP///xD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////av7+/uX+/v7//v7+//7+/v////////////7+/v/9/fv/185w/8CwGf/Arxr/wK8b/8CvGf/Arxj/wK8X/7+uF/+/rhf/v64X/7+uF/+/rhf/v60X/9XJZv/b0Xv/y7xC/8CvHf++rBP/vawT/76sE/++rBP/vqsS/76rE/+9qxL/vaoR/72qEf+9qhH/vakQ/72qEf+9qRH/vKkR/72pEf+8qRD/vKkP/7yoDv+8qA7/vKgP/7uoD/+7qA//u6cO/7unD/+7pw//u6cP/7umDf+6pg7/u6YQ/8GtJv/Lu0z/6eK1//38+P///////v7+6/7+/qf///8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////4/7+/f/59+n/7+vG/+3ovf/u6sH/7unA/+7qwf/s57v/2tF5/9DFVv/Sx13/0sdd/9LGXf/Sxlz/0sZb/9LGW//Sxlv/0sZb/9LGW//SxVr/0cRX/+jirf/7+vD/7+rE/9nPdv/Mvkb/wrIl/72sE/+9qxL/vqwT/76sE/+9qxP/vqsS/72qEf+8qhD/vaoR/72qEf+9qhD/vakR/72pEf+9qRH/vKgR/7yoD/+8qA7/vKgO/7yoDv+8qA//u6cP/7unD/+7pw//u6cP/7unEv/EsjD/z8BW/+LZmf/39OP//fz5//////f////J////ZP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/v7++/39+//r5rb/zsJM/8i7Nf/JvDn/ybs4/8m7Of/Iujb/29J8//Xy2v/39eT/9/Xj//f14v/39eL/9/Xi//f14v/39eL/9/Xi//f14v/39eL/9vTg//v68v///////fz5//n36//x7cz/3tWJ/9HEWf/Juj3/wrEj/72sEv+9qxL/vqsT/72rEv+8qhD/vKkQ/7yqEP+8qhD/vKkQ/72pEf+9qRH/vKkR/7ypEP+8qA7/u6gO/7yoDv+8qA//vKgP/72pE//CsSj/yrtF/9PGZv/m36j/9fPe//v68v/+/v3/////+f///7f///8+/v7+BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/n4aj/yLs2/8GyG//AsRr/wbEa/8GwGf/BsRv/3NN9//r57v/+/v7//v7+/////////////v7+/////////////////////////////v7+//////3////t////9f/////+/vz/+vnw//f15P/s573/3dSF/8/DVf/Juz3/xbYv/8KxI/+/rRj/vaoS/72qEf+9qhH/vaoR/72pEP+8qRH/vakR/7ypEf+8qRL/vqwZ/8GwI//FszD/yrpB/9PGYf/h2Zf/8u7S//j26f/8+/b////+///////////h/v7+XP///yD///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/o4qv/ybw6/8GyHP/Ashr/wbEa/8GxGf/BsRv/29J8//n47P///////v7+dP7+/kb///9G////Rv///0b///9G////Rv///0b///9G////TP///yT///8I////Hv///43+/v7X////5/7+/vv+/v3//v37//38+P/29OH/6+a5/+Pbmv/a0Hv/1cln/9DCVP/MvUf/y7xD/8u8Q//LvEX/zb5M/9HDWv/Wym3/3NKD/+Tdof/u6cP/+vnu//39+v/+/vz//v7+//7+/vX////f////wf///1b+/v4M/v7+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/o4qz/yrw7/8GyHP/BsRr/wbIb/8GyGv/Bshz/29J8//n47P///////v7+VP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr///8Y/v7+Gv///xj///8g////Vv///5v///+3////5/7+/v/+/v7//v79//7+/P/+/vz//fz5//r58P/49+n/9/Xk//f14//49ub/+fjr//z79P/9/fv//v37//7+/P/+/v3//v7+//7+/vn+/v7R////r////3z///8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M/v7++/39+v/o4qr/yrw5/8KyG//Bshv/wbIb/8GyG//Bsh3/29J8//n46///////////VP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8W////ZP7+/pX///+n////qf7+/qf///+r////o/7+/of+/v5U////dv///+n+/v7//v7+/////////////v7+//7+/v/+/v7////+/////v/+/v7///////////////////////7+/v//////////+f///7v///9E/v7+CP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/n4qj/yLoy/8KyG//Cshv/wbIb/8CxGv/Bsh3/2dB1//n46v//////////Vv///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5w/v7+6f7+/v/+/v7///////7+/v////////////////v////N/v7+JP7+/jz///9K/v7+Sv///0z+/v5M/v7+Tv///2D+/v67/////f/////////r////jf///1b///9O/v7+TP///0z+/v5K/v7+Rv7+/ij///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4I////9/79+//v7Mb/2M5t/9HFVf/UyF3/08hc/9LIW//QxVX/5d6f//v68v///////v7+Sv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wz+/v6r/v7+//b03//s57n/6uWz/+vltv/p5LL/7unC//r47f/////9////UgAAAAD///8A/v7+AP///wD+/v4A/v7+AP7+/gT///8Q/v7+Gv///xr///8W/v7+Cv///wL///8A////AP///wD+/v4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////FP///73+/v77//////7+/v/+/v7//v7+//7+/v/////p////aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///yj///9a/v7+h/7+/rH////B/v7+of7+/mb///9C////DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Cv7+/hD+/v4U////Dv///wT///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////4D/////////////+AA/////////////wAA////////////+AAA////////////4AAA////////////wAAA////////////gAAA///////////+AAAA///////////8AAAA///////////4AAAA///////////wAAAA///////////gAAAA///////////AAAAA//////////+AAAAA//////////8AAAAA//////////8AAAAA//////////4AAAAA//////////wAAAAA//////////wAAAAA//////////gAAAAA//////////gAAAAH//////////AAAAB///////////AAAAD///////////AAAAf//////////+AAAA///////////+AAAB///////////8AAAD///////////8AAAH///////////8AAAH///////////8AAAP///////////8AAAf///////////4AAAf///////////4AAAf///////////4AAA////////////4AAA/////wAAH///4AAA/////gAAH///4AAA/////gAAD///4AAA/////gAAD///4AAA/////gAAD///4AAAf////gAAD///4AAAf////AAAD///8AAAf////AAAD///8AAAP////AAAH///8AAAH///+AAAH///8AAAH///8AAAH///8AAAD///8AAAH///+AAAD///4AAAP///+AAAB///4AAAP////AAAA///gAAAP////AAAAH/+AAAAf////AAAAD/8AAAAf////AAAAAfgAAAA/////AAAAAAAAAAA/////AAAAAAAAAAA///wHAAAAAAAAAAB///gDADgAAAAAAAD///ABADgAAAAAAAD///ABABgAAAAAAAH///ABAAgAAAAAAAH///ABAAAAAAAAAAP///ABAAAAAAAAAA////ABAAAAAAAAAB////ABAAAAAAAAAB////gDAAAAAAAAAD/////wAAAAAAAAAP/////AAAAAAAAAAf////+AAAAAAAAAB/////+AAAAAAAAAD/////+AAAAAAAAAP/////+AB//AAAAA//////+AB//4AAAH//////+AB/4DAAAf//////+AB/wB/g////////+AB/gB//////////+AB/gA///////////AB/gA//////////////gA//////////v///gA/////////4B///gB/////////4A///gB/////////4A///gB/////////4A///wB/////////4A//////////////4A//////////////4B//////////////+H/////////////////////////////////////////////////////////////////////////////////////////////8LAAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJhd2luZy5CaXRtYXABAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAACkAAAKJUE5HDQoaCgAAAA1JSERSAAAAdgAAAHYIBgAAAB2nZxEAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAIcPAACMDwAA/VIAAIFAAAB9eQAA6YsAADzlAAAZzHM8hXcAAAo5aUNDUFBob3Rvc2hvcCBJQ0MgcHJvZmlsZQAASMedlndUVNcWh8+9d3qhzTDSGXqTLjCA9C4gHQRRGGYGGMoAwwxNbIioQEQREQFFkKCAAaOhSKyIYiEoqGAPSBBQYjCKqKhkRtZKfHl57+Xl98e939pn73P32XuftS4AJE8fLi8FlgIgmSfgB3o401eFR9Cx/QAGeIABpgAwWempvkHuwUAkLzcXerrICfyL3gwBSPy+ZejpT6eD/0/SrFS+AADIX8TmbE46S8T5Ik7KFKSK7TMipsYkihlGiZkvSlDEcmKOW+Sln30W2VHM7GQeW8TinFPZyWwx94h4e4aQI2LER8QFGVxOpohvi1gzSZjMFfFbcWwyh5kOAIoktgs4rHgRm4iYxA8OdBHxcgBwpLgvOOYLFnCyBOJDuaSkZvO5cfECui5Lj25qbc2ge3IykzgCgaE/k5XI5LPpLinJqUxeNgCLZ/4sGXFt6aIiW5paW1oamhmZflGo/7r4NyXu7SK9CvjcM4jW94ftr/xS6gBgzIpqs+sPW8x+ADq2AiB3/w+b5iEAJEV9a7/xxXlo4nmJFwhSbYyNMzMzjbgclpG4oL/rfzr8DX3xPSPxdr+Xh+7KiWUKkwR0cd1YKUkpQj49PZXJ4tAN/zzE/zjwr/NYGsiJ5fA5PFFEqGjKuLw4Ubt5bK6Am8Kjc3n/qYn/MOxPWpxrkSj1nwA1yghI3aAC5Oc+gKIQARJ5UNz13/vmgw8F4psXpjqxOPefBf37rnCJ+JHOjfsc5xIYTGcJ+RmLa+JrCdCAACQBFcgDFaABdIEhMANWwBY4AjewAviBYBAO1gIWiAfJgA8yQS7YDApAEdgF9oJKUAPqQSNoASdABzgNLoDL4Dq4Ce6AB2AEjIPnYAa8AfMQBGEhMkSB5CFVSAsygMwgBmQPuUE+UCAUDkVDcRAPEkK50BaoCCqFKqFaqBH6FjoFXYCuQgPQPWgUmoJ+hd7DCEyCqbAyrA0bwwzYCfaGg+E1cBycBufA+fBOuAKug4/B7fAF+Dp8Bx6Bn8OzCECICA1RQwwRBuKC+CERSCzCRzYghUg5Uoe0IF1IL3ILGUGmkXcoDIqCoqMMUbYoT1QIioVKQ21AFaMqUUdR7age1C3UKGoG9QlNRiuhDdA2aC/0KnQcOhNdgC5HN6Db0JfQd9Dj6DcYDIaG0cFYYTwx4ZgEzDpMMeYAphVzHjOAGcPMYrFYeawB1g7rh2ViBdgC7H7sMew57CB2HPsWR8Sp4sxw7rgIHA+XhyvHNeHO4gZxE7h5vBReC2+D98Oz8dn4Enw9vgt/Az+OnydIE3QIdoRgQgJhM6GC0EK4RHhIeEUkEtWJ1sQAIpe4iVhBPE68QhwlviPJkPRJLqRIkpC0k3SEdJ50j/SKTCZrkx3JEWQBeSe5kXyR/Jj8VoIiYSThJcGW2ChRJdEuMSjxQhIvqSXpJLlWMkeyXPKk5A3JaSm8lLaUixRTaoNUldQpqWGpWWmKtKm0n3SydLF0k/RV6UkZrIy2jJsMWyZf5rDMRZkxCkLRoLhQWJQtlHrKJco4FUPVoXpRE6hF1G+o/dQZWRnZZbKhslmyVbJnZEdoCE2b5kVLopXQTtCGaO+XKC9xWsJZsmNJy5LBJXNyinKOchy5QrlWuTty7+Xp8m7yifK75TvkHymgFPQVAhQyFQ4qXFKYVqQq2iqyFAsVTyjeV4KV9JUCldYpHVbqU5pVVlH2UE5V3q98UXlahabiqJKgUqZyVmVKlaJqr8pVLVM9p/qMLkt3oifRK+g99Bk1JTVPNaFarVq/2ry6jnqIep56q/ojDYIGQyNWo0yjW2NGU1XTVzNXs1nzvhZei6EVr7VPq1drTltHO0x7m3aH9qSOnI6XTo5Os85DXbKug26abp3ubT2MHkMvUe+A3k19WN9CP16/Sv+GAWxgacA1OGAwsBS91Hopb2nd0mFDkqGTYYZhs+GoEc3IxyjPqMPohbGmcYTxbuNe408mFiZJJvUmD0xlTFeY5pl2mf5qpm/GMqsyu21ONnc332jeaf5ymcEyzrKDy+5aUCx8LbZZdFt8tLSy5Fu2WE5ZaVpFW1VbDTOoDH9GMeOKNdra2Xqj9WnrdzaWNgKbEza/2BraJto22U4u11nOWV6/fMxO3Y5pV2s3Yk+3j7Y/ZD/ioObAdKhzeOKo4ch2bHCccNJzSnA65vTC2cSZ79zmPOdi47Le5bwr4urhWuja7ybjFuJW6fbYXd09zr3ZfcbDwmOdx3lPtKe3527PYS9lL5ZXo9fMCqsV61f0eJO8g7wrvZ/46Pvwfbp8Yd8Vvnt8H67UWslb2eEH/Lz89vg98tfxT/P/PgAT4B9QFfA00DQwN7A3iBIUFdQU9CbYObgk+EGIbogwpDtUMjQytDF0Lsw1rDRsZJXxqvWrrocrhHPDOyOwEaERDRGzq91W7109HmkRWRA5tEZnTdaaq2sV1iatPRMlGcWMOhmNjg6Lbor+wPRj1jFnY7xiqmNmWC6sfaznbEd2GXuKY8cp5UzE2sWWxk7G2cXtiZuKd4gvj5/munAruS8TPBNqEuYS/RKPJC4khSW1JuOSo5NP8WR4ibyeFJWUrJSBVIPUgtSRNJu0vWkzfG9+QzqUvia9U0AV/Uz1CXWFW4WjGfYZVRlvM0MzT2ZJZ/Gy+rL1s3dkT+S453y9DrWOta47Vy13c+7oeqf1tRugDTEbujdqbMzfOL7JY9PRzYTNiZt/yDPJK817vSVsS1e+cv6m/LGtHlubCyQK+AXD22y31WxHbedu799hvmP/jk+F7MJrRSZF5UUfilnF174y/ariq4WdsTv7SyxLDu7C7OLtGtrtsPtoqXRpTunYHt897WX0ssKy13uj9l4tX1Zes4+wT7hvpMKnonO/5v5d+z9UxlfeqXKuaq1Wqt5RPXeAfWDwoOPBlhrlmqKa94e4h+7WetS212nXlR/GHM44/LQ+tL73a8bXjQ0KDUUNH4/wjowcDTza02jV2Nik1FTSDDcLm6eORR67+Y3rN50thi21rbTWouPguPD4s2+jvx064X2i+yTjZMt3Wt9Vt1HaCtuh9uz2mY74jpHO8M6BUytOdXfZdrV9b/T9kdNqp6vOyJ4pOUs4m3924VzOudnzqeenL8RdGOuO6n5wcdXF2z0BPf2XvC9duex++WKvU++5K3ZXTl+1uXrqGuNax3XL6+19Fn1tP1j80NZv2d9+w+pG503rm10DywfODjoMXrjleuvyba/b1++svDMwFDJ0dzhyeOQu++7kvaR7L+9n3J9/sOkh+mHhI6lH5Y+VHtf9qPdj64jlyJlR19G+J0FPHoyxxp7/lP7Th/H8p+Sn5ROqE42TZpOnp9ynbj5b/Wz8eerz+emCn6V/rn6h++K7Xxx/6ZtZNTP+kv9y4dfiV/Kvjrxe9rp71n/28ZvkN/NzhW/l3x59x3jX+z7s/cR85gfsh4qPeh+7Pnl/eriQvLDwG/eE8/vi5h3CAAAACXBIWXMAAAsTAAALEwEAmpwYAAAeMUlEQVR4Xu2dCXxdVZ3HAzPjjBstbZqkCy1bCwKFIlDAwRE7CKOCuIA4ggug4jCIbIqK4qCgqIw64s5SKHTf6Zo2zd4sTdKkTZN0S9p0Tem+0ZaC//n9zrvn5pz7znvv3pcESXn/z+f7uenJy3uv75v/Of9z77knWSKS4QTE2Zih9+NszND7cTZm6P04GzP0fpyNGXo/zsYAI8Gd4GkwBfwfuBm8C7gen+FtgLPR4z/BPpAsqsEHgevnM/wdcTZ6pJKqg3JdP5/h74izEbD7VbH6wGGZtLlDHm1qlbvrV8v/NLfKyv0H5fU3/+Y9QsW7Tl9QnhVk2PzyrMGvlIKSpAyaXZI1cFZxdGYWZ+WBnAgMmF6U1W/qkqxTyZQETNYUZPUFp4A+kxxMXJzVF/B4yoTFWe8HfUDf8YsUp4J+3rHPyzi+nJ/V76UY/UE2wGfXIzgbwaeBivyOXUroZYXL5ILFlXJ1SZ1M2bxDDr/xhvcIFe87HRI1Z4Bh88qyhswpg7juE4vX4bh+KsgF/T1yQDZ4t0tkkHe62K8CFVO37JAbKhoEwhTn5lfIn1o3y4Hjltg+ttRySKVQjVuoJpVYPD/HcXb5qaIWXOYSqnmni/0cUDEfGfu1umY5f1GlEjt6yTLVNSfKWJ2pg3yp3SI2jFQdtS6hmne62IuAiuYDh2T8pu3yvcZ1cntNk3y/cb2s3OcYY+eXYUxF1zsXIpmt3ZSxfO7YS4h6zX2vH5dXjx6TPcdeV+w8+rrsxvHIG296j1KRsFt+p4slB0CYqKZU4gvtXrHnxV5GZA0Kud+tbZcHMOY/2dymeLhhrfxkVauU79zrPUrFx1xSSUasyK0glVw1jz1ddb+G0O4Vy/m0ipko2sYU1sjZc8vk3LnlMgKcOacM/y6XX7Rs8B6l4jGXVJIR2wm75bvAX8E88BfwJaDOPLH7HWJ2v2mIJYnk4jVuByomtW+XS/IrBdMcwTRHBgDIUvwYQ4QRT5kyNZSaPa0QYgszYlMxZC4KJU8k/n0yeA94r3c0eR/4Z3CSSyzhvNQhlj2HiunI2CsXVyupEOWLHTy7RJ5oavMepeIJUygZMKMoqz+EkozYEHhCLwRLQdgoByMtscjYQRDJEw5KsAcex95BxdRNHXL5oirJNaQSZvBPMc4a8WQORGqYqf2RqRmx0RgN6kDUKLfEekCaBR73ldjDRSa3d8il+VW+UMWMIsVjdlf8yzipGbGR8aVyBvQaph2c4/Jocuj4G3LszTfFmiQ5umXKhDAfPIZXklTM3vKqjF5UrYQOmV0qQ2aVKKnM2Kfs4unROKkZsZHg2KmC8p5p2yI3VayQT5TWyy0VK+Vmj88tbZCPl9TJE5iecA5qRJ4vFV1xLrpiU6ondmDsoaLmrBW79sn8bTulcMduKezYLQv5NY4bD70We1AsxgyYbghNIhaPPUmTEdtJH6DiwPHjcnddi6AKDlDi83lIb7UFjBgCqYOYqUGpXlfqyV0Te3io2JrtScXXFMaC7h/AP3r8E+D75oUOjvVmqLEf8Pus+vlY/gx/ns9z0jtS7D3LV8vweUsNqbbYr1avkvUHLbHnMFPzZpVkoRhKJnYMCCN3K/gUcEnrrlDy3zliXz8u99evkXPmm2I7pZLbl62SDXbGns0pjfPSmxZrC+aVnH8DvPp0nQdF8ngmYIZeCUJL5ZiviRB8/ivAye8wsbZQMghzTWZsnFgICyXWxHgMnoPd5OUgTiZlvfm3v8kb4LgHzzfvx3vdcvgIeo/Dsnr/IWned0gd1x84LFtfO6q+z0KPj+XP8Of5PAnkc5r3IXDSCS62PE7qQEglDrHXh+QGwOr4fMrkyQZ8zTNiFSBh8MJANYqt8Ru2yc+b2uSemma5pWyFXLOkVi5dUCkXzF0q580p9xmJf4+eXyn/vrhGPltSL9+oWiWPrVwv49q2SsWre9UFiBTBX66RJ5zY/0bxNHyeLZaZqsXesawpKDad2AOs00w6mFHLIPLZ9VvkPryXz6I6v7pgmXwQEke8UiZDMC3KnlooqHzdTO6k3+QCyZtWKGdiSnURhF+1sFquL6yTu6qa5Per29XrMIsTRAu4+oQSa0kFWir5UlVj8AJ9l4PdZO3u/Urmd9Fj3IhMG4kCDlWxDYVONSS6UEJjR0xzBNMcBQoli7NnlcoNRXXy3brV8uzazVK1c1+ibroBXNkbxb4bqGC3N6F9u9yJAulWCPxmbbN8A10f+a/aFrmtcqV8G+J5Ir8Ic9DFHbtk0fZw5AOenOA4qGMbxsLKnXvlz+s2y01lDZIdFGkCqf2SSfVk6kz1pUIiCYpVTFysOBV8Cpn85zWblOBdmGsHohFc1dvEEi5HCRVPr20XVMGKocjmochiMgTwRL4Puj8TnlnC2Cr3I0N4Ub0VU6YfYewbMafMLdJESQ3X/cbolJpMKEFFrEBFrDhnZqk8tapNNuD9HYwfjx/vbWIvA6Hk/ry5zRc7GLIGAV6pyTWBwCCUmjO9SD5fvkIeQnd75aJqyUNbqiyNkqnEzNSwUlEJ+2JREcuAiQUyYnqx/BqC9x2Lk7sT3PR2FcszMlzVwGr1RvBJ7/hx8CCYCRaASYB3DhAVXPFAqaZQTFviTujHAamPNbbKL5o3yL8V1LhFmmihIaSy6w12v8mkaqH8mjK12D7jFwkqYZ/h04rlGhRc0zdu9/73VjzwdhIbdqUgg9OQi1Aw8eceVy0IJRYCiXnZLZnU09AVU+j2I0flhdatci6mJU6ZGi9TnTJNDLGU2ieCVKKlKrEBqSiWFKiI5Yo5S+WxhnWyxqgPvFgBOP8Nfs7dgrMxAVFWCjIqBs6KF6szNYzYy/Kr5Hdr2v1pxXOofM/GtMUpVEOpEcSa1W8YsSpTgS8VmFK1WEol/Dez+evljVK4bZf6fxhBuReD4GfdZZyNDqyVglxUtphXVlCt6uMSVLodR46p6YcRPCvki+UYGyfVIZRcDqkvtvHUb2c8s35z8oJJdcHhC6WU1a8n0pLqCdVSg12wma089n0ZYgEKJ7l0dpksRHXPqaERVcD1mXcJZ6MDrrxXwctuDzaskWFzS62TD6fjA5+A8eSgPU99P/DF/gxiU2Upi6WLF1TKHHwAwUgoFjJjUj2BLgJS06l+tVCXVC1US2UbhfaFUEolKJpkIH7uBcx9A8t3JwDX5542zkYHeUAFxX5reYucMbfMOvnAlYMvIMN4ntUInsBwiw0I1Vwwb6nko8s6inlxMJxifakpul/I5MmHdAolojOVRyUVJJLKo0uq5qzJhfKbxriTZ+WAV6Vcn39knI0OfLE7IPZezCfPmlveKRaV7giIHbdhW/DM0ikgXqxDKPkAnnPe1p34bbak1njHeLGe0H4ukRojS7taKOksdWWqHlODUk2hBNWw4nxUzb9BpR+IZeAS4HIQCWejA38VA8dRnjpUYr05KRkeNmMdQgnP5T7fusV7pB+Uek/sy4BYlamGwCCG0BhepkJeWKnMSi2VJBtPU0nVQhXjFsoAMAKZ+5fmjcHTkZTb5YLK2ejAEnsPxOpM1ZyGf4+F2JQZ65B6FqT+cMU671F+qMXoIKHYdE8+hBHLoxbqd78Ql0gsj6rdK5QSicXcVUkl/cCwCQUyAz3dMXvo6XJB5Wx0wFsXVfDS1e/XbZKPLFmmVuXfVN6gjtcW1arzv8F7aECn2KZ4sYNnlsjXq5uC51j/mDM9thgNX8eLDSlVj6npniY0xSaVCpmxTI2XamUq0FKZtf1exBFcOLVYSlBXBAqqfwVBD6FxNiZgFVDBi89cvKZXI/JI7PcltRDHn0ssdnqRXFdYJwWYMgW6o5MgTy08w9edYtdBLLI7TKHUCcR1o1Qt1JcKkhVKQanZlAqZWirJAV8oqJX6XdYmAiuB+flHwtmYgA8DX26KiN2nmkRsLqTmziiWsa1b8cthdd+sDgcbWGKHQ6xTJgkIjVoo8WstVQt1SQ2OqVpoIqm6+6VUCjWlDvAYiud5tKZF9tvnl7m4IOghFM7GJIwClSBZcKnIhZiP6qUrP1WtCK5i0FLRzcrtVatk0+Ej3ndTx18h9uzZpSmEknBS86YUyggMBSPxyzLylXJ8XaraUnW9hG1hCiXK9LtfCNRisz0oNefFBYqReO1xazZ5/1sVPFXFiyxBDylxNoaASzK5pljfo8MjORmFVFbuzM71SWj7NVDxo5Xr/C74ikXVatlKlHgR2T1itiNjA2L9QskQm43HXTqvQj5bXC93Y0x/fOV6+ePqdnlx/RaZjOJlEhiH52fbk5iG3FvVJF/AY6+aXymD+bxBqTw6xlRTrJmp5phqZqopNhfcsKBK1u476P2PVbD3i7wzj7MxChQZJCD2B0DFb1dvVCcgeGbpB6iC2w6+pk548KJ5MrYDPu43LRtTZmyw+j0HvwhjFi2Te5e1yETI44K1sLHt8FGZt/lVeaRujfwHnmPUrDLJRjbrbHVJNcX6mRqQqjPVFEupuS8skDPHL5YHK1ahCLWGJ84Q4j77ZDgboxAnlUJRzWrwGC4XVbEKv4lPo6v5IbLlvrrV8mMcH2lYJw8sXy3fqV9js7yTh8ETyKJPFS+XvGlFTqExYlKZobkosC7HL9Cf8HqBc7NpBQvG2e0dEFwjAyctkWzIDSUV4hJlqpaqxEJqDhgAzsPzL92+O3iiRt22GhZnYxRCiGW3rYIfDldAcNXgGcg8XpIbgjGOF9159JlBimUwGDQ9Br/OhVT/LFNAqJmpeVOL5LfI7h2Yc7MwC1TcjA7Asf8+8DVwm8cd4NvgURB3zo+nObk9wlS8/9EYk4MyTanJCiUt08xUCs0eiyM4A73BA0sbZTfevxHXgrjPPxHOxiiYUnkbJO+Z4c3FJnicv8KC99h8sriu87RgEG+OGuY0IeeowXO/t5Q2yIKtO9UvkCNYcQ9H4aQWeRNUw/5qflTDChRPavkoHsuq/DPAP63JeO34G1L56l55GN27KdQ6+WAIdRVKiaTmgoH49zno8su3W5f5eP7R+uyT4WyMgimWYyrkWOAx/mZgPHnBi+VKoAtIJU6ZJoZY1f2qrrdIHqxdLfV7Eu6uQKkjTampxGrwc5cCSy5j86Ej8tTKVhmBalZXv6pQgkAtNuF46pCa44nNHTtf8Uhlk2zHOG9E6CLK2RgFZqmSioKpX0AqwWP4gapo3HtQbi5rcEslKlujXSTnlOZ0dN3fQYHzqt11MZrBR0DnzVSexChiURGr9cF4Hue9wH9o3iAjpxXHMtWRrYnEKqmU6wml2Jjc+ZIHLp1cJMVbuEzKj9BFlLMxChTrylSC7/NeGhUc53iSn2Movhddqiezk1j3y2LqIW/1ohFclf4VX6aJJzEdsTxi3sr/1ydAO19Ix+9WtcmZ6DkSSbW6YMhkoaSlapkmA5+P8fSK1rSKKGdjFCjVlakE3+8HVLDo4C0WaI8TGpMKWS6hJCDVHFNvr2iUln3WeiLelTfGKZV4ErsilqAi5v9vrHpFBE/i/2T5Wl+qU6gn1czUoFRmqpY6CHy9cLm02MPLBcBy4MLZGIVEUgm+z0pOBW9O/lhhrVNqyjVKvtTOM0qQJJfMq5DSHXtUtW3ER+JkmngSu0MsKmL+H3mZTUUzhpo7Sxp8qTEcUiFTSzXF5nlCtVRyxZRimbPBWul4E7AcuHA2RiFJtnLDEb/g+F9MP4ZieoPv+VKTXiQ3MjQolZk6AAULz0QdtbupSqdME09iV8USTywvjKvgeq/ibbvkoqmYmo3LV0J9sRCq5qkhpGqxA5+bL0PwvZ+hKDSiCVgOXDgbo2DKNMH3/F1kOP/7amVjXLYmzdSAWL/7BZR6U0m96t6NYOaMcso08SR2ReypEIrpTVb/cflZ2QCv69/1dxhToZ/Xr5PBLy3yiyTVFXvZSqmxyrdTLLtfitVZqqSCXIjNfW6e3LmkTvbalzU5xFkegjgbo6BFmqCdt/Wr4NLRJoyBHzUXeqts9QS6SCQVmUounrtUFiMzAisiL3GKDOJJTFvseGTquIVZuS8uzEJXq8Br85bO5epdIDYcOCxXzSqTQaiQo46pGi2VXD+nQiq27/aeXQUrfctDEGdjFEyhGrRz2akKfviTNm6XSxZUGlLDjqmkUyrEqIvnt5ZzOa4VFXECE+FJTFfsqZ7YHEOsJ5c3X6vgL/MTy9fIuRPRu3hSOa4Gu18SlMqv8zypeWAguHJKkUywr/rwbzRYHoI4G6MQlErQbp1G5OU6XiCPJtV96W3knHL569rN3rOrUHcdWPKS4UlMRyy61CxkoBO8B+uXuRQ9CrM24ZhqSNViOabqTNVSB4FzXsqXJ2utLTg4zFkegjgbowBZcaDdP9vE/+TtGF9zp0fpfu3ThBDi8wmMN832Za3wUoknMaxYVr+YjyqQfVkYK53gfVhzdo61txbUurvfgNBOqbGu15RKhuD7D5SuCN5ozeHOcmHibIxCArH+2SZu3HUNxlenTGIJJZ5USNRAiM/9NS3C/SGMeFdQVhRSiWXlS6FhwHvx/9+Mx2pWyzBkWyqpuuvVmFIHPxvjlvlVsss+szYAWC5MnI1RQNdqgTbrN5dbE1w8v8ItlQTEBgslU2oOqmFuE2BEdVBUVBKJ5SYhOltdEl3g/VjbEE1Zv1WunF7SKRVoqVosj2b3G8xWLfa6mWWyZo/VU50PLBcmzsYoqB3ODNBmja9Vu/bJORHWKekxNSiVjML4Oq2dV9z8+EJQVFSSZSxl5T6PrnZsePCeuLpQRfWOPfKZBVW+WFNoMFu1UJdU8rEZZVLTwe03/Eh6p56zMQqQY4G2fwEqOH/llniRlrM4hComLpbr0KWXdFhl/xhTUjokEjsAhRK6zSwIiQTe0wdib03UEpfbMM4mytSgVC00KJV8dFqJFGza4T2zCt6XbLkwcTZGgTJN0Gbsr/iGzNjUIcODy1ksqYkLJVMq+Vzxcqndtd97dhWjtaB00WJPIeMXq0JIZapDWhjwnk6LvTWRrYeOyB0o9kyhSqoSGl4quXJykUxbZ90pwe1+LRcmzsYoaKEatPEOOxW8827Chm3x65QCUoNTGpdUfPjyZcxfm/Za48xILaYr4HXUlCYXXSkEKJit6YD35O+kw6Wk36tYJadhHnve+MUyauISuWjCErlwAqZtgMeLwCjNeDfD8MvAjH2lbZv3zCo+DywXJs7GKGihGrRZYl/GmzlrVmKxKlNDir1j6crgneHnMuu6wimTUCRRKrJ08HPzfLHpgvdkzWerMC4+27RRJmLuPRUZNwVM9uDXhO3JeL5pg8rWjfuthXhnAcuFibMxClqoBm2WWK5vUmJ9mTHMTHVK9YQSSiW3lSFj7TnsBXpcDAvHT/PffbxMHfScW1Q64H0l3TGuG4Kpa3kI4myMgkMs1xer4CR9KqpYbnhliw2XpaZUCJFPFy2XGnst8uWmpChwPCWsel1yugLeV8rtALsQlMrNXCwPQZyNUYAoC7RZm3rxzvQRs8rUOV4StlDSQrVUyJBrF8dXxczAKLx/YoG6QpMLATkodjguuuR0B3h/7JZ5a8y9gCsgv5wm3wIslpJ2vybOxig4xPr7VfAMUTFEUCyzNGymaqHq355USJHzMW2abF90vlWfIQrFhNiZJM43KZRVbE+KDYKKOAtTnCxUwwpUxHGfZ3fhbIxCv8kFFmgLXLI7KOe/Uhap+lVSPZmUSnhLBTfH4sZYRiyPXXEJR9+Ji7Kyxy2Mfbje9CQjNgHIwjjQ7l9k33n0mIxeUBmp+uVRC9XZqm+SuqdylRq7jXivS6ITdMEDXliouuGM2BQgC+NAO5fFqODSleuL6pCxS9xSPZFaKjEz1ZRKrsmvlmr779h92CnRoB+EEkrN8U4RZsSmIIFY63zxfTUtMmR6cXpSgZYKSf4+hUZw5cKFvF7qoj8LpRe9E/UQSjJiQwBBcaDdmqT/ChNs3vWG78VJ1UL5dTBLzUylVMK73a5HdRzojpe6pJKM2DTRMk3QbhVQvJfmsvmVCaWamRrsek2pEKU4b2aJ2nwycOH5Co6hRC8yIwPU+qSM2MiYQjVot67JcqcZrnzA95xio+xNyK9zUB1fm79MNtnb0NeDi5VYbx0SUctZMmKjYwo1wfes1QT3LGuW/iig4qR6Qv1sDYg1s5VHtumbjp9qbFUrNIyo4jw1I7ZnxVqrCZ5dt1nOnVVqidUnH1xStVBTamzPh5hUVLkyfEqhLNkat43OLWrVQ0as+xthgaSE4Pv8o0Mq+Fcvrl9S62eqFupLhbjUUu3dWXhP6o0opGp3WuePeQnkyxmxjsYoQFJC8H3rvPH3l6+JZawhNNkmzi6pzFRK1QzCc9xZukJa7Ou0jHszYruAS6gJHuPfzT4FlSz/IILO1GTjqZbKrteXaggl+k7yoXieb0Duit3W6goG7wLnjWEnZ8RGJNj9BsFjuE+RitaDh+WOpY1+tvZNIpZH1T0bY6pLrN4eIBfHrxTXS6l9K4QZav+pjNiQQFJK8Dj/ksyEtm1qk6xkc1UeKTSdLXc+NKtc5rZ3BG/x10G5/KOGfTNiU+ASGQSP41+PVLF2/2G5BZnV38tWLdSU6iqUkkqFUPNOcoyt8lBlk6zff0jdDR44kaGDf+iIf3XkEXA1eI9LRnfSu8bY8YFrng7wOP6BXRWcmszetCMtqVqolqq23PEy1ZRKho1fLKNnlMojmD+vs+94TxbcX2K0S0p3cMKJJXgs9+BV0fHaUfliSb3kTSxQQl1STaGm1DBb7hBUw4oReI2Pz62Uu0oa5C9NG6WGf1XSvVWQjjqXlO6gV4mFkFDgsdw1WwW7xuWoYC+fszSSVL0zd5gtdwimOZLD+1K9e1MvnFwon1lQLfeUrpTHalrkj6va5LcN69UuaNy7yYge6ZZPSLEEj/cvwDN+2dgqQ71CKlWhZGUqgUAzWxOJpVTzpmMNCif/TvKHyhtl2yFrF9YhLjFd5UQWywvwvlzuKn5H2UoZMKEgZbZqqXpcTSkVMpmt6qZjfm0I1eDDVnwbc2DehW7EWaaQ7uKEFUvwM9aVH/71qGvzq+Ok+t0v8LvfgFRTaEKpgSzVMFPxYSuYsZsOWleKTqeEnuCEFUvwc/7FAZ5qnNS6VZ3QD0o19/tl1+uqfk2hWqoeU83u1yWU4MOWB8vixVJAT9ErxOr1RFHAz/HKj3+qkX/S5ZnV7ZKLcdaXCpm6+6VILdasfn2ZGk+qvTehO0splPAGqQcxHATF6g+/J3l7i30JstIAP8tTjfyDBip4yyV3NhuK6YmZqTpbE2WqLxXo7ldna2zbHU8qMIUqqYB3vT2QERuPS1pY8PO8SdiXy2nQ95a1yNmTCmKZSqk8elJdhZKVqR66+zUzNpipBN2iupXRlbH80N8K8Fo9grMxCi5hUcBzcGczf9s6xvchdxC65USZqqUqsRSppTqEqmz1pGqxPGqp+HCdYgfiQ38rwGv1CM7GKLhkRQXPY02DuNX7r1e2Ss44jLcppAbH1ERSdZa6bjp+yCF2ED70twK8Vo/gbIyCS1S64Pn8nbl2HT0m49ZullHcBzgo1JTKo0MqhcYVS55QUyo+3IxYFy5B6YLn44YZLUAFF5tPb9smty2pg1hbqup+IdLZ/RpCtVRmKmVqsVoqcYkd/Oy8rLcCvFaP4GyMgktQumCaw+fkJTRfLqNpzwF5qHKVXDajxK9+w85VdRecbMudjFgHLkHpQrGY6vB5nX+R66U1m2TMK0vl7Amomh1CE0k1CyUKNaXiw82IdeESlC5aLKY5WaiI+fxfBP5CJp6C5MqIn2G+e/pLi+wsBVqolspjmN1ZMmIduASlS1AsKmK1hBSvYy0+3330ddU9/6p+nVw4aYkaU8NUvy6pJCPWgUtQuiQRay0+17HzyDEp2bpLfo+p0c0LqmUIMlhLpUyXVHyYcWTEOnAJSpdEYrk3MIomvh43YOafXImL6o498oeVbXI/JH16XpWMYiZ7YhNlqubB0hXSbl+2OwPtThHdDV6rR3A2RsElKF1SicU0JwsVMV93DLA28NXBcbju1b3yTNMGuRfCbpxbIWNmlKrNnLkZ1rnj8uWssQtlKLIaH6ziW8UNQbFnmh9+T4LX6hGcjVFwCUqXsGKzeRyrBOeAbwJnUPKO145K6dad8lJLuzxe3SJ3F9bLzchobjp5xaRCJfbh8kYUZdYKisFBAT0FXqtHcDb2Uq4CceNwGsHb5V3P36twNvZyuEKD+/OnI5lSrwOu5+1VOBtPICg5D1wD7gK/BBNBIWgAGwCjDPDPjLqeo1fibMzQ+3E2Zuj9OBsz9H6cjRl6P87GDL0fZ2OG3o5k/T9RaI5u/XXBKQAAAABJRU5ErkJgggs= \ No newline at end of file diff --git a/MDL/State.cs b/MDL/State.cs new file mode 100644 index 0000000000000000000000000000000000000000..df8ef6a771e7c9f966441de509110e684a740593 --- /dev/null +++ b/MDL/State.cs @@ -0,0 +1,22 @@ +using MDL.Class; +using System.Windows.Forms; + +namespace MDL +{ + public class State : PictureBox + { + private StateInfo stateInfo; + + public StateInfo StateInfo + { + get + { + return stateInfo; + } + set + { + stateInfo = value; + } + } + } +} diff --git a/MDL/TextBoxEx.cs b/MDL/TextBoxEx.cs new file mode 100644 index 0000000000000000000000000000000000000000..98d035e26c146be0abd3b4614309baaa2fafbfe8 --- /dev/null +++ b/MDL/TextBoxEx.cs @@ -0,0 +1,26 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace MDL +{ + public class TextBoxEx : TextBox + { + public string PlaceHolderStr + { + get; + set; + } + + protected override void OnPaint(PaintEventArgs e) + { + if (!string.IsNullOrEmpty(PlaceHolderStr)) + { + e.Graphics.DrawString(PlaceHolderStr, Font, new SolidBrush(Color.LightGray), 0f, 0f); + } + else + { + base.OnPaint(e); + } + } + } +} diff --git a/MDL/TransfDelegate.cs b/MDL/TransfDelegate.cs new file mode 100644 index 0000000000000000000000000000000000000000..b5bf46d1ae74f8ee07da2264a9bd9439d1339ec1 --- /dev/null +++ b/MDL/TransfDelegate.cs @@ -0,0 +1,6 @@ +using MDL.Class; + +namespace MDL +{ + public delegate void TransfDelegate(Dataset value); +} diff --git a/NGIS.Model/EContactType.cs b/NGIS.Model/EContactType.cs new file mode 100644 index 0000000000000000000000000000000000000000..3c6c468c758d42ac191b03808ab5d9767c6316bb --- /dev/null +++ b/NGIS.Model/EContactType.cs @@ -0,0 +1,10 @@ +namespace NGIS.Model +{ + public enum EContactType + { + ECT_Unknown, + ECT_Email, + ECT_Fax, + ECT_Phone + } +} diff --git a/NGIS.Model/EExecutionStyle.cs b/NGIS.Model/EExecutionStyle.cs new file mode 100644 index 0000000000000000000000000000000000000000..592130f655fc3b23d87d5980b8d0492021577682 --- /dev/null +++ b/NGIS.Model/EExecutionStyle.cs @@ -0,0 +1,9 @@ +namespace NGIS.Model +{ + public enum EExecutionStyle + { + EES_STATE_SIMULATION, + EES_SIMPLE_CALCULATION, + EES_TIME_SERIES + } +} diff --git a/NGIS.Model/ELocalizationType.cs b/NGIS.Model/ELocalizationType.cs new file mode 100644 index 0000000000000000000000000000000000000000..b97c03bad68647e56570fd6cf0dc313ff0c63ccd --- /dev/null +++ b/NGIS.Model/ELocalizationType.cs @@ -0,0 +1,14 @@ +namespace NGIS.Model +{ + public enum ELocalizationType + { + ELT_ZH_CN, + ELT_EN_US, + ELT_DE_DE, + ELT_RU_RU, + ELT_AR, + ELT_ES, + ELT_OTHERS, + ELT_COUNT + } +} diff --git a/NGIS.Model/EMechanismItemType.cs b/NGIS.Model/EMechanismItemType.cs new file mode 100644 index 0000000000000000000000000000000000000000..93f1062d7eac0e4897e45b9d523381a3a5d1c154 --- /dev/null +++ b/NGIS.Model/EMechanismItemType.cs @@ -0,0 +1,10 @@ +namespace NGIS.Model +{ + public enum EMechanismItemType + { + EMIT_Unknown = 0, + EMIT_Text = 1, + EMIT_Algorithm = 2, + EMIT_Formula = 4 + } +} diff --git a/NGIS.Model/EModelDatasetItemType.cs b/NGIS.Model/EModelDatasetItemType.cs new file mode 100644 index 0000000000000000000000000000000000000000..b16e7cf902a8630e44f4a6853be29d4190eecb7d --- /dev/null +++ b/NGIS.Model/EModelDatasetItemType.cs @@ -0,0 +1,9 @@ +namespace NGIS.Model +{ + public enum EModelDatasetItemType + { + EMDIT_INTERNAL, + EMDIT_EXTERNAL, + EMDIT_RAW + } +} diff --git a/NGIS.Model/EModelEventType.cs b/NGIS.Model/EModelEventType.cs new file mode 100644 index 0000000000000000000000000000000000000000..9dd73349a767a4fabce460639933b25c31485330 --- /dev/null +++ b/NGIS.Model/EModelEventType.cs @@ -0,0 +1,9 @@ +namespace NGIS.Model +{ + public enum EModelEventType + { + EMET_RESPONSE, + EMET_NORESPONSE, + EMET_CONTROL + } +} diff --git a/NGIS.Model/EModelStateType.cs b/NGIS.Model/EModelStateType.cs new file mode 100644 index 0000000000000000000000000000000000000000..3aaf9931e9179a703fc3f7a0d1401a531402e240 --- /dev/null +++ b/NGIS.Model/EModelStateType.cs @@ -0,0 +1,8 @@ +namespace NGIS.Model +{ + public enum EModelStateType + { + EMST_BASIC, + EMST_GROUP + } +} diff --git a/NGIS.Model/ESpatiotemporalScaleType.cs b/NGIS.Model/ESpatiotemporalScaleType.cs new file mode 100644 index 0000000000000000000000000000000000000000..090de0af1602357b98b8e7f65ae53c48d5ef44b5 --- /dev/null +++ b/NGIS.Model/ESpatiotemporalScaleType.cs @@ -0,0 +1,11 @@ +namespace NGIS.Model +{ + public enum ESpatiotemporalScaleType + { + EMSST_Unknown, + EMSST_Global, + EMSST_Region_Large, + EMSST_Region_Middle, + EMSST_Region_Small + } +} diff --git a/NGIS.Model/HardwareRequirement.cs b/NGIS.Model/HardwareRequirement.cs new file mode 100644 index 0000000000000000000000000000000000000000..2ead8aa8dbeafd1054c174223b72670e9173d335 --- /dev/null +++ b/NGIS.Model/HardwareRequirement.cs @@ -0,0 +1,32 @@ +namespace NGIS.Model +{ + public struct HardwareRequirement + { + public string requirementKey; + + public string requirementValue; + + public bool compareOther(HardwareRequirement pRequirement) + { + if (requirementKey != pRequirement.requirementKey) + { + return false; + } + if (requirementValue != pRequirement.requirementValue) + { + return false; + } + return true; + } + + public static bool operator ==(HardwareRequirement pRequirementA, HardwareRequirement pRequirementB) + { + return pRequirementA.compareOther(pRequirementB); + } + + public static bool operator !=(HardwareRequirement pRequirementA, HardwareRequirement pRequirementB) + { + return !(pRequirementA == pRequirementB); + } + } +} diff --git a/NGIS.Model/IModelAttribute.cs b/NGIS.Model/IModelAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..bd51eb0ec6164677d488374e4a47d400e1286b20 --- /dev/null +++ b/NGIS.Model/IModelAttribute.cs @@ -0,0 +1,59 @@ +namespace NGIS.Model +{ + public interface IModelAttribute + { + int getLocalAttributeCount(); + + bool getLocalAttribute(int idx, ref LocalAttribute pLocalAttribute); + + bool getLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute); + + bool addLocalAttributeInfo(ref LocalAttribute pLocalAttribute); + + bool removeLocalAttribute(int idx); + + bool removeLocalAttribute(ref LocalAttribute pLocalAttribute); + + bool updateLocalAttribute(int idx, ref LocalAttribute pLocalAttribute); + + bool updateLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute); + + int getCategoryCount(); + + bool getCategory(int idx, ref ModelCategory pModelCategory); + + bool addCategoryInfo(ref ModelCategory pCategoryInfo); + + bool removeCategory(int idx); + + bool removeCategory(ref ModelCategory pCategoryInfo); + + bool updateCategory(int idx, ref ModelCategory pCategoryInfo); + + int getAuthorsCount(); + + bool getAuthor(int index, ref ModelUser author); + + bool addAuthor(ref ModelUser author); + + bool removeAuthor(int index); + + int getBuildersCount(); + + bool getBuilder(int index, ref ModelUser builder); + + bool addBuilder(ref ModelUser builder); + + bool removeBuilder(int index); + + int getWrappersCount(); + + bool getWrapper(int index, ref ModelUser wrapper); + + bool addWrapper(ref ModelUser wrapper); + + bool removeWrapper(int index); + + bool compareOther(IModelAttribute pAttribute, ref string obj, ref string name); + } +} diff --git a/NGIS.Model/IModelBehavior.cs b/NGIS.Model/IModelBehavior.cs new file mode 100644 index 0000000000000000000000000000000000000000..931e03311bb0eac1595493413e4c41890e0ef5a1 --- /dev/null +++ b/NGIS.Model/IModelBehavior.cs @@ -0,0 +1,73 @@ +namespace NGIS.Model +{ + public interface IModelBehavior + { + bool addModelDatasetItem(ref ModelDatasetItem pDataset); + + bool removeModelDatasetItem(ref ModelDatasetItem pDataset); + + int getModelDatasetItemCount(); + + bool getModelDatasetItem(int idx, ref ModelDatasetItem pDataset); + + bool getModelDatasetItem(string pName, ref ModelDatasetItem pDataset); + + bool updateModelDatasetItem(int idx, ref ModelDatasetItem pDataset); + + bool addModelState(ref ModelState pState); + + bool removeModelState(ref ModelState pState); + + int getModelStateCount(); + + bool getModelState(int idx, ref ModelState pState); + + bool getModelState(string pStateId, ref ModelState pState); + + bool updateModelState(int idx, ref ModelState pState); + + bool updateModelState(string pStateId, ref ModelState pState); + + bool addModelStateTransition(string pFromStateId, string pToStateId); + + bool addModelStateTransition(ref ModelState pFromState, ref ModelState pToState); + + bool removeModelStateTransition(string pFromStateId, string pToStateId); + + bool removeModelStateTransition(ref ModelState pFromState, ref ModelState pToState); + + int getModelStateTransitionCount(); + + bool getModelStateTransition(int idx, ref ModelState pFromState, ref ModelState pToState); + + bool getModelStateTransition(int idx, ref ModelStateTransition pStateTransition); + + bool existModelStatetTransition(string pFromStateId, string pToStateId); + + bool existModelStatetTransition(ref ModelState pFromState, ref ModelState pToState); + + bool updateModelStateTransition(int idx, string pFromStateId, string pToStateId); + + bool addProcessParameter(ModelParameter processparameter); + + bool getProcessParameter(string key, ref ModelParameter parameter); + + int getProcessParameterCount(); + + bool removeProcessParameter(ModelParameter processparameter); + + bool updateProcessParameter(ModelParameter processparameter); + + bool addControlParameter(ModelParameter processparameter); + + bool getControlParameter(string key, ref ModelParameter parameter); + + int getControlParameterCount(); + + bool removeControlParameter(ModelParameter controlparameter); + + bool updateControlParameter(ModelParameter controlparameter); + + bool compareOther(IModelBehavior pBehavior, ref string obj, ref string name); + } +} diff --git a/NGIS.Model/IModelClass.cs b/NGIS.Model/IModelClass.cs new file mode 100644 index 0000000000000000000000000000000000000000..7eaa552a3ed1f070d13114a9ae67121db2db4a6c --- /dev/null +++ b/NGIS.Model/IModelClass.cs @@ -0,0 +1,33 @@ +namespace NGIS.Model +{ + public interface IModelClass + { + void setName(string pName); + + string getName(); + + void setUID(string pUID); + + string getUID(); + + void setExecutionStyle(EExecutionStyle pStyle); + + EExecutionStyle getExecutionStyle(); + + ModelAttribute getModelAttribute(); + + ModelBehavior getModelBehavior(); + + ModelRuntime getModelRuntime(); + + bool LoadFromXmlFile(string fileName); + + bool FormatToXmlFile(string fileName); + + bool LoadFromXmlStream(string xmlStr); + + bool FormatToXmlStream(ref string xmlStr); + + bool compareOther(IModelClass pClass, bool withRuntime, ref string obj, ref string name); + } +} diff --git a/NGIS.Model/IModelRuntime.cs b/NGIS.Model/IModelRuntime.cs new file mode 100644 index 0000000000000000000000000000000000000000..3d6ee56b63036b86edae7c2e2183fedb749ab05b --- /dev/null +++ b/NGIS.Model/IModelRuntime.cs @@ -0,0 +1,63 @@ +namespace NGIS.Model +{ + public interface IModelRuntime + { + string getName(); + + void setName(string pName); + + string getVersion(); + + void setVersion(string pVersion); + + string getEntry(); + + void setEntry(string pEntry); + + string getBaseDirectory(); + + void setBaseDirectory(string pDirectory); + + bool addHardwareRequirement(ref HardwareRequirement pRequirement); + + bool addSoftwareRequirement(ref SoftwareRequirement pRequirement); + + bool addModelAssembly(ref ModelAssembly pRequirement); + + bool addSupportiveResource(ref SupportiveResource pRequirement); + + int getHardwareRequirementCount(); + + int getSoftwareRequirementCount(); + + int getModelAssemblyCount(); + + int getSupportiveResourceCount(); + + bool getHardwareRequirement(int idx, ref HardwareRequirement pRequirement); + + bool getSoftwareRequirement(int idx, ref SoftwareRequirement pRequirement); + + bool getModelAssembly(int idx, ref ModelAssembly pRequirement); + + bool getSupportiveResource(int idx, ref SupportiveResource pRequirement); + + bool removeHardwareRequirementref(HardwareRequirement pRequirement); + + bool removeSoftwareRequirement(ref SoftwareRequirement pRequirement); + + bool removeModelAssembly(ref ModelAssembly pRequirement); + + bool removeSupportiveResource(ref SupportiveResource pRequirement); + + bool removeHardwareRequirement(int idx); + + bool removeSoftwareRequirement(int idx); + + bool removeModelAssembly(int idx); + + bool removeSupportiveResource(int idx); + + bool compareOther(IModelRuntime pRuntime, ref string obj, ref string name); + } +} diff --git a/NGIS.Model/LocalAttribute.cs b/NGIS.Model/LocalAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..80dac560ca67ff909986237d8515ab3e76807c8a --- /dev/null +++ b/NGIS.Model/LocalAttribute.cs @@ -0,0 +1,108 @@ +using System.Collections.Generic; + +namespace NGIS.Model +{ + public struct LocalAttribute + { + public ELocalizationType localType; + + public string localName; + + public string abstractInfo; + + public string wikiUrl; + + public List keywords; + + public List mechanismItems; + + public ESpatiotemporalScaleType sptimeScaleType; + + public SpatiotemporalStepLength sslX; + + public SpatiotemporalStepLength sslY; + + public SpatiotemporalStepLength sslZ; + + public SpatiotemporalStepLength sslT; + + public SpatialScope spatialScope; + + public bool compareOther(LocalAttribute pLocal) + { + if (localType != pLocal.localType) + { + return false; + } + if (localName != pLocal.localName) + { + return false; + } + if (abstractInfo != pLocal.abstractInfo) + { + return false; + } + if (wikiUrl != pLocal.wikiUrl) + { + return false; + } + if (keywords.Count != pLocal.keywords.Count) + { + return false; + } + for (int i = 0; i < keywords.Count; i++) + { + if (keywords[i] != pLocal.keywords[i]) + { + return false; + } + } + if (mechanismItems.Count != pLocal.mechanismItems.Count) + { + return false; + } + foreach (ModelMechanismItem mechanismItem in mechanismItems) + { + if (!pLocal.mechanismItems.Contains(mechanismItem)) + { + return false; + } + } + if (sptimeScaleType != pLocal.sptimeScaleType) + { + return false; + } + if (sslX != pLocal.sslX) + { + return false; + } + if (sslY != pLocal.sslY) + { + return false; + } + if (sslZ != pLocal.sslZ) + { + return false; + } + if (sslT != pLocal.sslT) + { + return false; + } + if (spatialScope != pLocal.spatialScope) + { + return false; + } + return true; + } + + public static bool operator ==(LocalAttribute laA, LocalAttribute laB) + { + return laA.compareOther(laB); + } + + public static bool operator !=(LocalAttribute laA, LocalAttribute laB) + { + return !(laA == laB); + } + } +} diff --git a/NGIS.Model/LocalizationHelper.cs b/NGIS.Model/LocalizationHelper.cs new file mode 100644 index 0000000000000000000000000000000000000000..9685d6498153f39f19f5c159b7525750c0816ab0 --- /dev/null +++ b/NGIS.Model/LocalizationHelper.cs @@ -0,0 +1,204 @@ +using System.Collections.Generic; +using System.Xml; + +namespace NGIS.Model +{ + public class LocalizationHelper + { + public static string LocalizationType2String(ELocalizationType pType) + { + switch (pType) + { + case ELocalizationType.ELT_ZH_CN: + return "ZH_CN"; + case ELocalizationType.ELT_EN_US: + return "EN_US"; + case ELocalizationType.ELT_DE_DE: + return "DE_DE"; + case ELocalizationType.ELT_RU_RU: + return "RU_RU"; + case ELocalizationType.ELT_AR: + return "AR"; + case ELocalizationType.ELT_ES: + return "ES"; + default: + return "Unknown"; + } + } + + public static ELocalizationType String2LocalizationType(string pTypeStr) + { + if (pTypeStr == "ZH_CN") + { + return ELocalizationType.ELT_ZH_CN; + } + if (pTypeStr == "EN_US") + { + return ELocalizationType.ELT_EN_US; + } + if (pTypeStr == "DE_DE") + { + return ELocalizationType.ELT_DE_DE; + } + if (pTypeStr == "RU_RU") + { + return ELocalizationType.ELT_RU_RU; + } + if (pTypeStr == "AR") + { + return ELocalizationType.ELT_AR; + } + if (pTypeStr == "ES") + { + return ELocalizationType.ELT_ES; + } + return ELocalizationType.ELT_COUNT; + } + + public static string MechanismType2String(EMechanismItemType mType) + { + switch (mType) + { + case EMechanismItemType.EMIT_Algorithm: + return "Algorithm"; + case EMechanismItemType.EMIT_Formula: + return "Formula"; + case EMechanismItemType.EMIT_Text: + return "Text"; + default: + return "Unknown"; + } + } + + public static EMechanismItemType String2MechanismItemType(string sType) + { + if (sType == "Algorithm") + { + return EMechanismItemType.EMIT_Algorithm; + } + if (sType == "Formula") + { + return EMechanismItemType.EMIT_Formula; + } + if (sType == "Text") + { + return EMechanismItemType.EMIT_Text; + } + return EMechanismItemType.EMIT_Unknown; + } + + public static string SpatiotemporalScaleType2String(ESpatiotemporalScaleType ssType) + { + switch (ssType) + { + case ESpatiotemporalScaleType.EMSST_Global: + return "Global"; + case ESpatiotemporalScaleType.EMSST_Region_Large: + return "Region"; + case ESpatiotemporalScaleType.EMSST_Region_Middle: + return "Region"; + case ESpatiotemporalScaleType.EMSST_Region_Small: + return "Region"; + default: + return "Unknown"; + } + } + + public static string SpatiotemporalScale2String(ESpatiotemporalScaleType ssType) + { + switch (ssType) + { + case ESpatiotemporalScaleType.EMSST_Global: + return ""; + case ESpatiotemporalScaleType.EMSST_Region_Large: + return "Large"; + case ESpatiotemporalScaleType.EMSST_Region_Middle: + return "Middle"; + case ESpatiotemporalScaleType.EMSST_Region_Small: + return "Small"; + default: + return "Unknown"; + } + } + + public static ESpatiotemporalScaleType String2SpatiotemporalScaleType(string sType, string sScale) + { + if (sType == "Global") + { + return ESpatiotemporalScaleType.EMSST_Global; + } + if (sType == "Regional" && sScale == "Large") + { + return ESpatiotemporalScaleType.EMSST_Region_Large; + } + if (sType == "Regional" && sScale == "Middle") + { + return ESpatiotemporalScaleType.EMSST_Region_Middle; + } + if (sType == "Regional" && sScale == "Small") + { + return ESpatiotemporalScaleType.EMSST_Region_Small; + } + return ESpatiotemporalScaleType.EMSST_Unknown; + } + + public static EContactType String2ContactType(string sContact) + { + if (sContact == "Email") + { + return EContactType.ECT_Email; + } + if (sContact == "Fax") + { + return EContactType.ECT_Fax; + } + if (sContact == "Phone") + { + return EContactType.ECT_Phone; + } + return EContactType.ECT_Unknown; + } + + public static string ContactType2String(EContactType eContact) + { + switch (eContact) + { + case EContactType.ECT_Email: + return "Email"; + case EContactType.ECT_Fax: + return "Fax"; + case EContactType.ECT_Phone: + return "Phone"; + default: + return "Unknown"; + } + } + + public static List Xml2ModelUser(XmlElement mele) + { + List list = new List(); + foreach (XmlElement childNode in mele.ChildNodes) + { + string attribute = childNode.GetAttribute("name"); + string attribute2 = childNode.GetAttribute("account"); + XmlElement xmlElement2 = (XmlElement)mele.ChildNodes[0]; + string attribute3 = childNode.GetAttribute("name"); + string attribute4 = childNode.GetAttribute("country"); + string attribute5 = childNode.GetAttribute("city"); + string attribute6 = childNode.GetAttribute("address"); + ModelUserInstitution ins = new ModelUserInstitution(attribute3, attribute4, attribute5, attribute6); + XmlElement xmlElement3 = (XmlElement)mele.ChildNodes[0]; + List list2 = new List(); + foreach (XmlElement childNode2 in xmlElement3.ChildNodes) + { + string attribute7 = childNode2.GetAttribute("type"); + string attribute8 = childNode2.GetAttribute("value"); + list2.Add(new ModelUserContact(String2ContactType(attribute7), attribute8)); + } + ModelUser item = new ModelUser(attribute, attribute2, ins, list2); + list.Add(item); + } + return list; + } + } +} diff --git a/NGIS.Model/ModelAssembly.cs b/NGIS.Model/ModelAssembly.cs new file mode 100644 index 0000000000000000000000000000000000000000..d4c3272516b74e3fc3cb01e50aa365f11945d69f --- /dev/null +++ b/NGIS.Model/ModelAssembly.cs @@ -0,0 +1,32 @@ +namespace NGIS.Model +{ + public struct ModelAssembly + { + public string assemblyName; + + public string assemblyPath; + + public bool compareOther(ModelAssembly pAssembly) + { + if (assemblyName != pAssembly.assemblyName) + { + return false; + } + if (assemblyPath != pAssembly.assemblyPath) + { + return false; + } + return true; + } + + public static bool operator ==(ModelAssembly maA, ModelAssembly maB) + { + return maA.compareOther(maB); + } + + public static bool operator !=(ModelAssembly maA, ModelAssembly maB) + { + return !(maA == maB); + } + } +} diff --git a/NGIS.Model/ModelAttribute.cs b/NGIS.Model/ModelAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..9603235d2a9de40538b21390990fd6b4641c42ea --- /dev/null +++ b/NGIS.Model/ModelAttribute.cs @@ -0,0 +1,633 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml; + +namespace NGIS.Model +{ + public class ModelAttribute : IModelAttribute + { + private List mLocalAttributeList = new List(); + + private List mModelCategoryList = new List(); + + private List mAuthors = new List(); + + private List mBuilders = new List(); + + private List mWrappers = new List(); + + public bool loadFromXml(XmlElement pModelClassElement) + { + XmlElement xmlElement = (XmlElement)pModelClassElement.ChildNodes[0]; + XmlElement xmlElement2 = (XmlElement)xmlElement.ChildNodes[0]; + XmlElement xmlElement3 = (XmlElement)xmlElement.ChildNodes[1]; + foreach (object childNode in xmlElement2.ChildNodes) + { + XmlElement xmlElement4 = childNode as XmlElement; + ModelCategory item = default(ModelCategory); + item.principle = xmlElement4.GetAttribute("principle"); + item.path = xmlElement4.GetAttribute("path"); + mModelCategoryList.Add(item); + } + foreach (object childNode2 in xmlElement3.ChildNodes) + { + XmlElement xmlElement5 = childNode2 as XmlElement; + LocalAttribute item2 = default(LocalAttribute); + item2.localName = xmlElement5.GetAttribute("localName"); + item2.wikiUrl = xmlElement5.GetAttribute("wiki"); + string attribute = xmlElement5.GetAttribute("local"); + ELocalizationType eLocalizationType = item2.localType = LocalizationHelper.String2LocalizationType(attribute); + XmlElement xmlElement6 = (XmlElement)xmlElement5.ChildNodes[0]; + XmlElement xmlElement7 = (XmlElement)xmlElement5.ChildNodes[1]; + string innerText = xmlElement6.InnerText; + item2.abstractInfo = xmlElement7.InnerText; + List list = innerText.Split(';').ToList(); + item2.keywords = new List(); + for (int i = 0; i < list.Count; i++) + { + item2.keywords.Add(list[i]); + } + if (xmlElement5.ChildNodes.Count > 2) + { + XmlNodeList elementsByTagName = xmlElement5.GetElementsByTagName("Mechanism"); + if (elementsByTagName.Count > 0) + { + XmlElement xmlElement8 = (XmlElement)elementsByTagName[0]; + item2.mechanismItems = new List(); + foreach (XmlElement item4 in xmlElement8) + { + string attribute2 = item4.GetAttribute("name"); + EMechanismItemType eMechanismItemType = LocalizationHelper.String2MechanismItemType(item4.GetAttribute("type")); + string text = ""; + text = ((eMechanismItemType != EMechanismItemType.EMIT_Text) ? item4.GetAttribute("value") : item4.InnerText); + ModelMechanismItem item3 = new ModelMechanismItem(attribute2, eMechanismItemType, text); + item2.mechanismItems.Add(item3); + } + } + XmlNodeList elementsByTagName2 = xmlElement5.GetElementsByTagName("Application"); + if (elementsByTagName2.Count > 0) + { + XmlElement xmlElement10 = (XmlElement)elementsByTagName[0]; + XmlNodeList elementsByTagName3 = xmlElement10.GetElementsByTagName("SpatiotemporalScale"); + if (elementsByTagName3.Count > 0) + { + XmlElement xmlElement11 = (XmlElement)elementsByTagName3[0]; + ESpatiotemporalScaleType eSpatiotemporalScaleType = item2.sptimeScaleType = LocalizationHelper.String2SpatiotemporalScaleType(xmlElement11.GetAttribute("type"), xmlElement11.GetAttribute("scale")); + } + XmlNodeList elementsByTagName4 = xmlElement10.GetElementsByTagName("SpatiotemporalStepLength"); + if (elementsByTagName4.Count > 0) + { + XmlElement xmlElement12 = (XmlElement)elementsByTagName4[0]; + foreach (XmlElement childNode3 in xmlElement12.ChildNodes) + { + string name = childNode3.Name; + string attribute3 = childNode3.GetAttribute("step"); + string attribute4 = childNode3.GetAttribute("unit"); + SpatiotemporalStepLength spatiotemporalStepLength = new SpatiotemporalStepLength(attribute3, attribute4); + if (name == "X") + { + item2.sslX = new SpatiotemporalStepLength(attribute3, attribute4); + } + else if (name == "Y") + { + item2.sslY = new SpatiotemporalStepLength(attribute3, attribute4); + } + else if (name == "Z") + { + item2.sslZ = new SpatiotemporalStepLength(attribute3, attribute4); + } + else if (name == "T") + { + item2.sslT = new SpatiotemporalStepLength(attribute3, attribute4); + } + } + } + XmlNodeList elementsByTagName5 = xmlElement10.GetElementsByTagName("Scope"); + if (elementsByTagName5.Count > 0) + { + XmlElement xmlElement14 = (XmlElement)elementsByTagName5[0]; + item2.spatialScope = default(SpatialScope); + item2.spatialScope.Extents = new List(); + item2.spatialScope.AreaNames = new List(); + XmlElement xmlElement15 = (XmlElement)xmlElement14.ChildNodes[0]; + XmlElement xmlElement16 = (XmlElement)xmlElement14.ChildNodes[1]; + foreach (XmlElement childNode4 in xmlElement15.ChildNodes) + { + double xmin = Convert.ToDouble(childNode4.GetAttribute("xMin")); + double xmax = Convert.ToDouble(childNode4.GetAttribute("xMax")); + double ymin = Convert.ToDouble(childNode4.GetAttribute("yMin")); + double ymax = Convert.ToDouble(childNode4.GetAttribute("yMax")); + string attribute5 = childNode4.GetAttribute("spatialReference"); + item2.spatialScope.Extents.Add(new SpatialExtent(xmin, xmax, ymin, ymax, attribute5)); + } + foreach (XmlElement childNode5 in xmlElement16.ChildNodes) + { + string attribute6 = childNode5.GetAttribute("name"); + item2.spatialScope.AreaNames.Add(attribute6); + } + } + } + } + mLocalAttributeList.Add(item2); + } + if (xmlElement.ChildNodes.Count > 2) + { + XmlNodeList elementsByTagName6 = xmlElement.GetElementsByTagName("Authors"); + if (elementsByTagName6.Count > 0) + { + XmlElement mele = (XmlElement)elementsByTagName6[0]; + mAuthors = LocalizationHelper.Xml2ModelUser(mele); + } + XmlNodeList elementsByTagName7 = xmlElement.GetElementsByTagName("Builders"); + if (elementsByTagName7.Count > 0) + { + XmlElement mele2 = (XmlElement)elementsByTagName7[0]; + mBuilders = LocalizationHelper.Xml2ModelUser(mele2); + } + XmlNodeList elementsByTagName8 = xmlElement.GetElementsByTagName("Wrappers"); + if (elementsByTagName8.Count > 0) + { + XmlElement mele3 = (XmlElement)elementsByTagName8[0]; + mWrappers = LocalizationHelper.Xml2ModelUser(mele3); + } + } + return true; + } + + public bool formatToXml(XmlElement pModelClassElement) + { + XmlDocument ownerDocument = pModelClassElement.OwnerDocument; + XmlElement xmlElement = ownerDocument.CreateElement("AttributeSet"); + XmlElement xmlElement2 = ownerDocument.CreateElement("Categories"); + XmlElement xmlElement3 = ownerDocument.CreateElement("LocalAttributes"); + for (int i = 0; i < mModelCategoryList.Count; i++) + { + ModelCategory modelCategory = mModelCategoryList[i]; + XmlElement xmlElement4 = ownerDocument.CreateElement("Category"); + xmlElement4.SetAttribute("principle", modelCategory.principle); + xmlElement4.SetAttribute("path", modelCategory.path); + xmlElement2.AppendChild(xmlElement4); + } + for (int j = 0; j < mLocalAttributeList.Count; j++) + { + LocalAttribute localAttribute = mLocalAttributeList[j]; + XmlElement xmlElement5 = ownerDocument.CreateElement("LocalAttribute"); + xmlElement5.SetAttribute("local", LocalizationHelper.LocalizationType2String(localAttribute.localType)); + xmlElement5.SetAttribute("localName", localAttribute.localName); + xmlElement5.SetAttribute("wiki", localAttribute.wikiUrl); + XmlElement xmlElement6 = ownerDocument.CreateElement("Keywords"); + XmlElement xmlElement7 = ownerDocument.CreateElement("Abstract"); + XmlElement xmlElement8 = ownerDocument.CreateElement("Mechanism"); + XmlElement xmlElement9 = ownerDocument.CreateElement("Application"); + string text = ""; + for (int k = 0; k < localAttribute.keywords.Count; k++) + { + string str = localAttribute.keywords[k]; + text += str; + if (k != localAttribute.keywords.Count - 1) + { + text += "; "; + } + } + xmlElement6.InnerText = text; + xmlElement7.InnerText = localAttribute.abstractInfo; + if (localAttribute.mechanismItems != null) + { + for (int l = 0; l < localAttribute.mechanismItems.Count; l++) + { + XmlElement xmlElement10 = ownerDocument.CreateElement("Add"); + xmlElement10.SetAttribute("name", localAttribute.mechanismItems[l].Name); + xmlElement10.SetAttribute("type", LocalizationHelper.MechanismType2String(localAttribute.mechanismItems[l].Type)); + xmlElement10.SetAttribute("value", localAttribute.mechanismItems[l].Value); + xmlElement8.AppendChild(xmlElement10); + } + } + XmlElement xmlElement11 = ownerDocument.CreateElement("SpatiotemporalScale"); + xmlElement11.SetAttribute("type", LocalizationHelper.SpatiotemporalScaleType2String(localAttribute.sptimeScaleType)); + xmlElement11.SetAttribute("scale", LocalizationHelper.SpatiotemporalScale2String(localAttribute.sptimeScaleType)); + xmlElement9.AppendChild(xmlElement11); + XmlElement xmlElement12 = ownerDocument.CreateElement("SpatiotemporalStepLength"); + XmlElement xmlElement13 = ownerDocument.CreateElement("X"); + xmlElement13.SetAttribute("step", "[" + localAttribute.sslX.Min.ToString() + "," + localAttribute.sslX.Max.ToString() + "]"); + xmlElement13.SetAttribute("unit", localAttribute.sslX.Unit); + xmlElement12.AppendChild(xmlElement13); + XmlElement xmlElement14 = ownerDocument.CreateElement("Y"); + xmlElement14.SetAttribute("step", "[" + localAttribute.sslY.Min.ToString() + "," + localAttribute.sslY.Max.ToString() + "]"); + xmlElement14.SetAttribute("unit", localAttribute.sslY.Unit); + xmlElement12.AppendChild(xmlElement14); + XmlElement xmlElement15 = ownerDocument.CreateElement("Z"); + xmlElement15.SetAttribute("step", "[" + localAttribute.sslZ.Min.ToString() + "," + localAttribute.sslZ.Max.ToString() + "]"); + xmlElement15.SetAttribute("unit", localAttribute.sslZ.Unit); + xmlElement12.AppendChild(xmlElement15); + XmlElement xmlElement16 = ownerDocument.CreateElement("T"); + xmlElement16.SetAttribute("step", "[" + localAttribute.sslT.Min.ToString() + "," + localAttribute.sslT.Max.ToString() + "]"); + xmlElement16.SetAttribute("unit", localAttribute.sslT.Unit); + xmlElement12.AppendChild(xmlElement16); + xmlElement9.AppendChild(xmlElement12); + XmlElement xmlElement17 = ownerDocument.CreateElement("Scope"); + XmlElement xmlElement18 = ownerDocument.CreateElement("ExtentGroup"); + if (localAttribute.spatialScope.Extents != null) + { + foreach (SpatialExtent extent in localAttribute.spatialScope.Extents) + { + XmlElement xmlElement19 = ownerDocument.CreateElement("Extent"); + double xMin = extent.XMin; + xmlElement19.SetAttribute("xMin", xMin.ToString()); + xMin = extent.XMax; + xmlElement19.SetAttribute("xMax", xMin.ToString()); + xMin = extent.YMin; + xmlElement19.SetAttribute("yMin", xMin.ToString()); + xMin = extent.YMax; + xmlElement19.SetAttribute("yMax", xMin.ToString()); + xmlElement19.SetAttribute("spatialReference", extent.SpatialReference.ToString()); + xmlElement18.AppendChild(xmlElement19); + } + } + xmlElement17.AppendChild(xmlElement18); + XmlElement xmlElement20 = ownerDocument.CreateElement("AreaGroup"); + if (localAttribute.spatialScope.AreaNames != null) + { + foreach (string areaName in localAttribute.spatialScope.AreaNames) + { + XmlElement xmlElement21 = ownerDocument.CreateElement("Area"); + xmlElement21.SetAttribute("name", areaName); + xmlElement20.AppendChild(xmlElement21); + } + } + xmlElement17.AppendChild(xmlElement20); + xmlElement9.AppendChild(xmlElement17); + xmlElement5.AppendChild(xmlElement6); + xmlElement5.AppendChild(xmlElement7); + xmlElement5.AppendChild(xmlElement8); + xmlElement5.AppendChild(xmlElement9); + xmlElement3.AppendChild(xmlElement5); + } + xmlElement.AppendChild(xmlElement2); + xmlElement.AppendChild(xmlElement3); + XmlElement xmlElement22 = ownerDocument.CreateElement("Authors"); + foreach (ModelUser mAuthor in mAuthors) + { + XmlElement xmlElement23 = ownerDocument.CreateElement("Author"); + xmlElement23.SetAttribute("name", mAuthor.Name); + xmlElement23.SetAttribute("account", mAuthor.Account); + XmlElement xmlElement24 = ownerDocument.CreateElement("Institution"); + xmlElement24.SetAttribute("name", mAuthor.Institution.Name); + xmlElement24.SetAttribute("country", mAuthor.Institution.Country); + xmlElement24.SetAttribute("city", mAuthor.Institution.City); + xmlElement24.SetAttribute("address", mAuthor.Institution.Address); + xmlElement23.AppendChild(xmlElement24); + XmlElement xmlElement25 = ownerDocument.CreateElement("Contacts"); + foreach (ModelUserContact contact in mAuthor.Contacts) + { + XmlElement xmlElement26 = ownerDocument.CreateElement("Add"); + xmlElement26.SetAttribute("type", LocalizationHelper.ContactType2String(contact.Type)); + xmlElement26.SetAttribute("value", contact.Value); + xmlElement25.AppendChild(xmlElement26); + } + xmlElement23.AppendChild(xmlElement25); + xmlElement22.AppendChild(xmlElement23); + } + xmlElement.AppendChild(xmlElement22); + XmlElement xmlElement27 = ownerDocument.CreateElement("Builders"); + foreach (ModelUser mBuilder in mBuilders) + { + XmlElement xmlElement28 = ownerDocument.CreateElement("Builder"); + xmlElement28.SetAttribute("name", mBuilder.Name); + xmlElement28.SetAttribute("account", mBuilder.Account); + XmlElement xmlElement29 = ownerDocument.CreateElement("Institution"); + xmlElement29.SetAttribute("name", mBuilder.Institution.Name); + xmlElement29.SetAttribute("country", mBuilder.Institution.Country); + xmlElement29.SetAttribute("city", mBuilder.Institution.City); + xmlElement29.SetAttribute("address", mBuilder.Institution.Address); + xmlElement28.AppendChild(xmlElement29); + XmlElement xmlElement30 = ownerDocument.CreateElement("Contacts"); + foreach (ModelUserContact contact2 in mBuilder.Contacts) + { + XmlElement xmlElement31 = ownerDocument.CreateElement("Add"); + xmlElement31.SetAttribute("type", LocalizationHelper.ContactType2String(contact2.Type)); + xmlElement31.SetAttribute("value", contact2.Value); + xmlElement30.AppendChild(xmlElement31); + } + xmlElement28.AppendChild(xmlElement30); + xmlElement27.AppendChild(xmlElement28); + } + xmlElement.AppendChild(xmlElement27); + XmlElement newChild = ownerDocument.CreateElement("Wrappers"); + foreach (ModelUser mWrapper in mWrappers) + { + XmlElement xmlElement32 = ownerDocument.CreateElement("Wrapper"); + xmlElement32.SetAttribute("name", mWrapper.Name); + xmlElement32.SetAttribute("account", mWrapper.Account); + XmlElement xmlElement33 = ownerDocument.CreateElement("Institution"); + xmlElement33.SetAttribute("name", mWrapper.Institution.Name); + xmlElement33.SetAttribute("country", mWrapper.Institution.Country); + xmlElement33.SetAttribute("city", mWrapper.Institution.City); + xmlElement33.SetAttribute("address", mWrapper.Institution.Address); + xmlElement32.AppendChild(xmlElement33); + XmlElement xmlElement34 = ownerDocument.CreateElement("Contacts"); + foreach (ModelUserContact contact3 in mWrapper.Contacts) + { + XmlElement xmlElement35 = ownerDocument.CreateElement("Add"); + xmlElement35.SetAttribute("type", LocalizationHelper.ContactType2String(contact3.Type)); + xmlElement35.SetAttribute("value", contact3.Value); + xmlElement34.AppendChild(xmlElement35); + } + xmlElement32.AppendChild(xmlElement34); + xmlElement27.AppendChild(xmlElement32); + } + xmlElement.AppendChild(newChild); + pModelClassElement.AppendChild(xmlElement); + return true; + } + + public int getLocalAttributeCount() + { + return mLocalAttributeList.Count; + } + + public bool getLocalAttribute(int idx, ref LocalAttribute pLocalAttribute) + { + if (idx < 0 || idx >= mLocalAttributeList.Count) + { + return false; + } + pLocalAttribute = mLocalAttributeList[idx]; + return true; + } + + public bool getLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute) + { + for (int i = 0; i < mLocalAttributeList.Count; i++) + { + if (mLocalAttributeList[i].localType == pLocalType) + { + pLocalAttribute = mLocalAttributeList[i]; + return true; + } + } + return false; + } + + public bool addLocalAttributeInfo(ref LocalAttribute pLocalAttribute) + { + for (int i = 0; i < mLocalAttributeList.Count; i++) + { + if (mLocalAttributeList[i].localType == pLocalAttribute.localType) + { + return false; + } + } + mLocalAttributeList.Add(pLocalAttribute); + return true; + } + + public bool removeLocalAttribute(int idx) + { + if (idx < 0 || idx >= mLocalAttributeList.Count) + { + return false; + } + mLocalAttributeList.RemoveAt(idx); + return true; + } + + public bool removeLocalAttribute(ref LocalAttribute pLocalAttribute) + { + if (mLocalAttributeList.Contains(pLocalAttribute)) + { + mLocalAttributeList.Remove(pLocalAttribute); + return true; + } + return false; + } + + public bool updateLocalAttribute(int idx, ref LocalAttribute pLocalAttribute) + { + if (idx < 0 || idx >= mLocalAttributeList.Count) + { + return false; + } + mLocalAttributeList[idx] = pLocalAttribute; + return true; + } + + public bool updateLocalAttribute(ELocalizationType pLocalType, ref LocalAttribute pLocalAttribute) + { + for (int i = 0; i < mLocalAttributeList.Count; i++) + { + if (mLocalAttributeList[i].localType == pLocalType) + { + mLocalAttributeList[i] = pLocalAttribute; + return true; + } + } + return false; + } + + public int getCategoryCount() + { + return mModelCategoryList.Count; + } + + public bool getCategory(int idx, ref ModelCategory pModelCategory) + { + if (idx < 0 || idx >= mModelCategoryList.Count) + { + return false; + } + pModelCategory = mModelCategoryList[idx]; + return true; + } + + public bool addCategoryInfo(ref ModelCategory pCategoryInfo) + { + for (int i = 0; i < mModelCategoryList.Count; i++) + { + ModelCategory modelCategory = mModelCategoryList[i]; + if (modelCategory.principle == pCategoryInfo.principle && modelCategory.path == pCategoryInfo.path) + { + return false; + } + } + mModelCategoryList.Add(pCategoryInfo); + return true; + } + + public bool removeCategory(int idx) + { + if (idx < 0 || idx >= mModelCategoryList.Count) + { + return false; + } + mModelCategoryList.RemoveAt(idx); + return true; + } + + public bool removeCategory(ref ModelCategory pCategoryInfo) + { + if (mModelCategoryList.Contains(pCategoryInfo)) + { + mModelCategoryList.Remove(pCategoryInfo); + return true; + } + return false; + } + + public bool updateCategory(int idx, ref ModelCategory pCategoryInfo) + { + if (idx < 0 || idx >= mModelCategoryList.Count) + { + return false; + } + mModelCategoryList[idx] = pCategoryInfo; + return true; + } + + public bool compareOther(IModelAttribute pAttribute, ref string obj, ref string name) + { + if (pAttribute.getCategoryCount() != mModelCategoryList.Count) + { + obj = "Categories"; + name = "CategoryCount"; + return false; + } + for (int i = 0; i < mModelCategoryList.Count; i++) + { + ModelCategory modelCategory = mModelCategoryList[i]; + ModelCategory pModelCategory = default(ModelCategory); + pAttribute.getCategory(i, ref pModelCategory); + if (!modelCategory.compareOther(pModelCategory)) + { + obj = "Category"; + name = modelCategory.principle + "<->" + pModelCategory.principle; + return false; + } + } + if (pAttribute.getLocalAttributeCount() != mLocalAttributeList.Count) + { + obj = "LocalAttributes"; + name = "LocalAttributeCount"; + return false; + } + for (int j = 0; j < mLocalAttributeList.Count; j++) + { + LocalAttribute localAttribute = mLocalAttributeList[j]; + LocalAttribute pLocalAttribute = default(LocalAttribute); + pAttribute.getLocalAttribute(j, ref pLocalAttribute); + if (!localAttribute.compareOther(pLocalAttribute)) + { + obj = "Category"; + name = localAttribute.localType + "<->" + pLocalAttribute.localType; + return false; + } + } + return true; + } + + public int getAuthorsCount() + { + return mAuthors.Count; + } + + public bool getAuthor(int index, ref ModelUser author) + { + if (mAuthors.Count - 1 < index) + { + return false; + } + author = mAuthors[index]; + return true; + } + + public bool addAuthor(ref ModelUser author) + { + if (!mAuthors.Contains(author)) + { + mAuthors.Add(author); + return true; + } + return false; + } + + public bool removeAuthor(int index) + { + if (mAuthors.Count - 1 < index) + { + return false; + } + mAuthors.RemoveAt(index); + return true; + } + + public int getBuildersCount() + { + return mBuilders.Count; + } + + public bool getBuilder(int index, ref ModelUser builder) + { + if (mBuilders.Count - 1 < index) + { + return false; + } + builder = mBuilders[index]; + return true; + } + + public bool addBuilder(ref ModelUser builder) + { + if (!mBuilders.Contains(builder)) + { + mBuilders.Add(builder); + return true; + } + return false; + } + + public bool removeBuilder(int index) + { + if (mBuilders.Count - 1 < index) + { + return false; + } + mBuilders.RemoveAt(index); + return true; + } + + public int getWrappersCount() + { + return mWrappers.Count; + } + + public bool getWrapper(int index, ref ModelUser wrapper) + { + if (mWrappers.Count - 1 < index) + { + return false; + } + wrapper = mWrappers[index]; + return true; + } + + public bool addWrapper(ref ModelUser wrapper) + { + if (!mWrappers.Contains(wrapper)) + { + mWrappers.Add(wrapper); + return true; + } + return false; + } + + public bool removeWrapper(int index) + { + if (mWrappers.Count - 1 < index) + { + return false; + } + mWrappers.RemoveAt(index); + return true; + } + } +} diff --git a/NGIS.Model/ModelBehavior.cs b/NGIS.Model/ModelBehavior.cs new file mode 100644 index 0000000000000000000000000000000000000000..074375fc27150a41dd8c80cd21e1c99989f75fc6 --- /dev/null +++ b/NGIS.Model/ModelBehavior.cs @@ -0,0 +1,680 @@ +using NGIS.Data.Schema; +using System; +using System.Collections.Generic; +using System.Xml; + +namespace NGIS.Model +{ + public class ModelBehavior : IModelBehavior + { + private List mModelDatasetItemList = new List(); + + private List mModelStateList = new List(); + + private List mModelStateTransitionList = new List(); + + private List mProcessParameters = new List(); + + private List mControlParameters = new List(); + + public bool loadFromXml(XmlElement pModelClassElement) + { + XmlElement xmlElement = (XmlElement)pModelClassElement.ChildNodes[1]; + XmlNodeList elementsByTagName = xmlElement.GetElementsByTagName("RelatedDatasets"); + if (elementsByTagName.Count > 0) + { + XmlElement xmlElement2 = (XmlElement)elementsByTagName[0]; + for (int i = 0; i < xmlElement2.ChildNodes.Count; i++) + { + XmlElement xmlElement3 = (XmlElement)xmlElement2.ChildNodes[i]; + ModelDatasetItem pDataset = default(ModelDatasetItem); + pDataset.datasetName = xmlElement3.GetAttribute("name"); + pDataset.datasetItemDescription = xmlElement3.GetAttribute("description"); + string attribute = xmlElement3.GetAttribute("type"); + if (attribute == "internal") + { + pDataset.datasetItemType = EModelDatasetItemType.EMDIT_INTERNAL; + pDataset.externalId = ""; + UdxDatasetSchema udxDatasetSchema = new UdxDatasetSchema(null, "UdxDeclaration"); + udxDatasetSchema.LoadFromXmlElement(xmlElement3.FirstChild as XmlElement); + pDataset.datasetItem = udxDatasetSchema; + } + else if (attribute == "external") + { + pDataset.datasetItemType = EModelDatasetItemType.EMDIT_EXTERNAL; + pDataset.externalId = xmlElement3.GetAttribute("externalId"); + pDataset.datasetItem = null; + } + else if (attribute == "raw") + { + pDataset.datasetItemType = EModelDatasetItemType.EMDIT_RAW; + pDataset.externalId = ""; + pDataset.datasetItem = null; + } + addModelDatasetItem(ref pDataset); + } + } + XmlNodeList elementsByTagName2 = xmlElement.GetElementsByTagName("RelatedDatasets"); + if (elementsByTagName.Count > 0) + { + XmlElement xmlElement4 = (XmlElement)elementsByTagName2[0]; + XmlElement xmlElement5 = (XmlElement)xmlElement4.FirstChild; + for (int j = 0; j < xmlElement5.ChildNodes.Count; j++) + { + XmlElement xmlElement6 = (XmlElement)xmlElement5.ChildNodes[j]; + ModelState pState = default(ModelState); + pState.stateId = xmlElement6.GetAttribute("id"); + pState.stateName = xmlElement6.GetAttribute("name"); + pState.stateDecription = xmlElement6.GetAttribute("description"); + string attribute2 = xmlElement6.GetAttribute("type"); + if (attribute2 == "basic") + { + pState.stateType = EModelStateType.EMST_BASIC; + } + else if (attribute2 == "group") + { + pState.stateType = EModelStateType.EMST_GROUP; + } + for (int k = 0; k < xmlElement6.ChildNodes.Count; k++) + { + XmlElement xmlElement7 = (XmlElement)xmlElement6.ChildNodes[k]; + ModelEvent item = default(ModelEvent); + item.eventName = xmlElement7.GetAttribute("name"); + item.eventDescription = xmlElement7.GetAttribute("description"); + string attribute3 = xmlElement7.GetAttribute("type"); + if (attribute3 == "response") + { + item.eventType = EModelEventType.EMET_RESPONSE; + } + else if (attribute3 == "noresponse") + { + item.eventType = EModelEventType.EMET_NORESPONSE; + } + else if (attribute3 == "control") + { + item.eventType = EModelEventType.EMET_CONTROL; + } + XmlElement xmlElement8 = (XmlElement)xmlElement7.FirstChild; + if (xmlElement8.HasAttribute("description")) + { + item.parameterDescription = xmlElement8.GetAttribute("description"); + } + else + { + item.parameterDescription = ""; + } + item.datasetReference = xmlElement8.GetAttribute("datasetReference"); + string attribute4 = xmlElement7.GetAttribute("optional"); + if (attribute4 == "") + { + item.optional = false; + } + else + { + item.optional = Convert.ToBoolean(attribute4); + } + pState.modelEvents = new List(); + pState.modelEvents.Add(item); + } + addModelState(ref pState); + } + XmlElement xmlElement9 = (XmlElement)xmlElement4.ChildNodes[1]; + for (int l = 0; l < xmlElement9.ChildNodes.Count; l++) + { + XmlElement xmlElement10 = (XmlElement)xmlElement9.ChildNodes[l]; + string attribute5 = xmlElement10.GetAttribute("from"); + string attribute6 = xmlElement10.GetAttribute("to"); + addModelStateTransition(attribute5, attribute6); + } + } + XmlNodeList elementsByTagName3 = xmlElement.GetElementsByTagName("RelatedDatasets"); + if (elementsByTagName.Count > 0) + { + XmlElement xmlElement11 = (XmlElement)elementsByTagName3[0]; + XmlElement xmlElement12 = (XmlElement)xmlElement11.ChildNodes[0]; + foreach (XmlElement childNode in xmlElement12.ChildNodes) + { + ModelParameter item2 = default(ModelParameter); + item2.Key = childNode.GetAttribute("key"); + item2.Description = childNode.GetAttribute("description"); + item2.DefaultValue = childNode.GetAttribute("defaultValue"); + mProcessParameters.Add(item2); + } + XmlElement xmlElement14 = (XmlElement)xmlElement11.ChildNodes[1]; + foreach (XmlElement childNode2 in xmlElement14.ChildNodes) + { + ModelParameter item3 = default(ModelParameter); + item3.Key = childNode2.GetAttribute("key"); + item3.Description = childNode2.GetAttribute("description"); + item3.DefaultValue = childNode2.GetAttribute("defaultValue"); + mProcessParameters.Add(item3); + } + } + return true; + } + + public bool formatToXml(XmlElement pModelClassElement) + { + XmlDocument ownerDocument = pModelClassElement.OwnerDocument; + XmlElement xmlElement = ownerDocument.CreateElement("Behavior"); + XmlElement xmlElement2 = ownerDocument.CreateElement("RelatedDatasets"); + XmlElement xmlElement3 = ownerDocument.CreateElement("StateGroup"); + XmlElement xmlElement4 = ownerDocument.CreateElement("Parameters"); + for (int i = 0; i < mModelDatasetItemList.Count; i++) + { + ModelDatasetItem modelDatasetItem = mModelDatasetItemList[i]; + XmlElement xmlElement5 = ownerDocument.CreateElement("DatasetItem"); + xmlElement5.SetAttribute("name", modelDatasetItem.datasetName); + if (modelDatasetItem.datasetItemType == EModelDatasetItemType.EMDIT_EXTERNAL) + { + xmlElement5.SetAttribute("type", "external"); + xmlElement5.SetAttribute("externalId", modelDatasetItem.externalId); + xmlElement5.SetAttribute("description", modelDatasetItem.datasetItemDescription); + } + else if (modelDatasetItem.datasetItemType == EModelDatasetItemType.EMDIT_INTERNAL) + { + xmlElement5.SetAttribute("type", "internal"); + xmlElement5.SetAttribute("description", modelDatasetItem.datasetItemDescription); + if (modelDatasetItem.datasetItem != null) + { + modelDatasetItem.datasetItem.FormatToXmlElement(ref xmlElement5); + } + } + else if (modelDatasetItem.datasetItemType == EModelDatasetItemType.EMDIT_RAW) + { + xmlElement5.SetAttribute("type", "raw"); + xmlElement5.SetAttribute("description", modelDatasetItem.datasetItemDescription); + } + xmlElement2.AppendChild(xmlElement5); + } + XmlElement xmlElement6 = ownerDocument.CreateElement("States"); + xmlElement3.AppendChild(xmlElement6); + for (int j = 0; j < mModelStateList.Count; j++) + { + ModelState modelState = mModelStateList[j]; + XmlElement xmlElement7 = ownerDocument.CreateElement("State"); + xmlElement7.SetAttribute("id", modelState.stateId); + xmlElement7.SetAttribute("name", modelState.stateName); + if (modelState.stateType == EModelStateType.EMST_BASIC) + { + xmlElement7.SetAttribute("type", "basic"); + } + else if (modelState.stateType == EModelStateType.EMST_GROUP) + { + xmlElement7.SetAttribute("type", "group"); + } + else + { + xmlElement7.SetAttribute("type", "unknown"); + } + xmlElement7.SetAttribute("description", modelState.stateDecription); + for (int k = 0; k < modelState.modelEvents.Count; k++) + { + ModelEvent modelEvent = modelState.modelEvents[k]; + EModelEventType eventType = modelEvent.eventType; + XmlElement xmlElement8 = ownerDocument.CreateElement("Event"); + xmlElement8.SetAttribute("name", modelEvent.eventName); + switch (eventType) + { + case EModelEventType.EMET_RESPONSE: + { + xmlElement8.SetAttribute("type", "response"); + XmlElement xmlElement11 = ownerDocument.CreateElement("ResponseParameter"); + xmlElement11.SetAttribute("datasetReference", modelEvent.datasetReference); + xmlElement11.SetAttribute("description", modelEvent.parameterDescription); + xmlElement8.AppendChild(xmlElement11); + break; + } + case EModelEventType.EMET_NORESPONSE: + { + xmlElement8.SetAttribute("type", "noresponse"); + XmlElement xmlElement10 = ownerDocument.CreateElement("DispatchParameter"); + xmlElement10.SetAttribute("datasetReference", modelEvent.datasetReference); + xmlElement10.SetAttribute("description", modelEvent.parameterDescription); + xmlElement8.AppendChild(xmlElement10); + break; + } + case EModelEventType.EMET_CONTROL: + { + xmlElement8.SetAttribute("type", "control"); + XmlElement xmlElement9 = ownerDocument.CreateElement("ControlParameter"); + xmlElement9.SetAttribute("datasetReference", modelEvent.datasetReference); + xmlElement9.SetAttribute("description", modelEvent.parameterDescription); + xmlElement8.AppendChild(xmlElement9); + break; + } + } + xmlElement8.SetAttribute("optional", modelEvent.optional.ToString()); + xmlElement8.SetAttribute("description", modelEvent.eventDescription); + xmlElement7.AppendChild(xmlElement8); + } + xmlElement6.AppendChild(xmlElement7); + } + XmlElement xmlElement12 = ownerDocument.CreateElement("StateTransitions"); + xmlElement3.AppendChild(xmlElement12); + foreach (ModelStateTransition mModelStateTransition in mModelStateTransitionList) + { + string stateId = mModelStateTransition.fromState.stateId; + string stateId2 = mModelStateTransition.toState.stateId; + XmlElement xmlElement13 = ownerDocument.CreateElement("Add"); + xmlElement13.SetAttribute("from", stateId); + xmlElement13.SetAttribute("to", stateId2); + xmlElement12.AppendChild(xmlElement13); + } + XmlElement xmlElement14 = ownerDocument.CreateElement("ProcessParameters"); + foreach (ModelParameter mProcessParameter in mProcessParameters) + { + XmlElement xmlElement15 = ownerDocument.CreateElement("Add"); + xmlElement15.SetAttribute("key", mProcessParameter.Key); + xmlElement15.SetAttribute("description", mProcessParameter.Description); + xmlElement15.SetAttribute("defaultValue", mProcessParameter.DefaultValue); + xmlElement14.AppendChild(xmlElement15); + } + xmlElement4.AppendChild(xmlElement14); + XmlElement xmlElement16 = ownerDocument.CreateElement("ControlParameters"); + foreach (ModelParameter mControlParameter in mControlParameters) + { + XmlElement xmlElement17 = ownerDocument.CreateElement("Add"); + xmlElement17.SetAttribute("key", mControlParameter.Key); + xmlElement17.SetAttribute("description", mControlParameter.Description); + xmlElement17.SetAttribute("defaultValue", mControlParameter.DefaultValue); + xmlElement16.AppendChild(xmlElement17); + } + xmlElement4.AppendChild(xmlElement16); + xmlElement.AppendChild(xmlElement2); + xmlElement.AppendChild(xmlElement3); + xmlElement.AppendChild(xmlElement4); + pModelClassElement.AppendChild(xmlElement); + return true; + } + + public bool addModelDatasetItem(ref ModelDatasetItem pDataset) + { + for (int i = 0; i < mModelDatasetItemList.Count; i++) + { + if (mModelDatasetItemList[i].datasetName == pDataset.datasetName) + { + return false; + } + } + mModelDatasetItemList.Add(pDataset); + return true; + } + + public bool removeModelDatasetItem(ref ModelDatasetItem pDataset) + { + if (mModelDatasetItemList.Contains(pDataset)) + { + mModelDatasetItemList.Remove(pDataset); + return true; + } + return false; + } + + public int getModelDatasetItemCount() + { + return mModelDatasetItemList.Count; + } + + public bool getModelDatasetItem(int idx, ref ModelDatasetItem pDataset) + { + if (idx < 0 || idx >= mModelDatasetItemList.Count) + { + return false; + } + pDataset = mModelDatasetItemList[idx]; + return true; + } + + public bool getModelDatasetItem(string pName, ref ModelDatasetItem pDataset) + { + for (int i = 0; i < mModelDatasetItemList.Count; i++) + { + if (mModelDatasetItemList[i].datasetName == pName) + { + pDataset = mModelDatasetItemList[i]; + return true; + } + } + return false; + } + + public bool updateModelDatasetItem(int idx, ref ModelDatasetItem pDataset) + { + if (idx < 0 || idx >= mModelDatasetItemList.Count) + { + return false; + } + mModelDatasetItemList[idx] = pDataset; + return true; + } + + public bool addModelState(ref ModelState pState) + { + for (int i = 0; i < mModelStateList.Count; i++) + { + if (mModelStateList[i].stateId == pState.stateId) + { + return false; + } + } + mModelStateList.Add(pState); + return true; + } + + public bool removeModelState(ref ModelState pState) + { + if (mModelStateList.Contains(pState)) + { + mModelStateList.Remove(pState); + } + return false; + } + + public int getModelStateCount() + { + return mModelStateList.Count; + } + + public bool getModelState(int idx, ref ModelState pState) + { + if (idx < 0 || idx >= mModelStateList.Count) + { + return false; + } + pState = mModelStateList[idx]; + return true; + } + + public bool getModelState(string pStateId, ref ModelState pState) + { + for (int i = 0; i < mModelStateList.Count; i++) + { + if (mModelStateList[i].stateId == pStateId) + { + pState = mModelStateList[i]; + return true; + } + } + return false; + } + + public bool updateModelState(int idx, ref ModelState pState) + { + if (idx < 0 || idx >= mModelStateList.Count) + { + return false; + } + mModelStateList[idx] = pState; + return true; + } + + public bool updateModelState(string pStateId, ref ModelState pState) + { + for (int i = 0; i < mModelStateList.Count; i++) + { + if (mModelStateList[i].stateId == pStateId) + { + mModelStateList[i] = pState; + return true; + } + } + return false; + } + + public bool addModelStateTransition(string pFromStateId, string pToStateId) + { + ModelState pState = default(ModelState); + ModelState pState2 = default(ModelState); + bool modelState = getModelState(pFromStateId, ref pState); + bool modelState2 = getModelState(pToStateId, ref pState2); + if (modelState && modelState2) + { + for (int i = 0; i < mModelStateTransitionList.Count; i++) + { + if (mModelStateTransitionList[i].fromState.stateId == pFromStateId && mModelStateTransitionList[i].toState.stateId == pToStateId) + { + return false; + } + } + ModelStateTransition item = default(ModelStateTransition); + item.fromState = pState; + item.toState = pState2; + mModelStateTransitionList.Add(item); + return true; + } + return false; + } + + public bool addModelStateTransition(ref ModelState pFromState, ref ModelState pToState) + { + return addModelStateTransition(pFromState.stateId, pToState.stateId); + } + + public bool removeModelStateTransition(string pFromStateId, string pToStateId) + { + for (int i = 0; i < mModelStateTransitionList.Count; i++) + { + ModelStateTransition item = mModelStateTransitionList[i]; + if (item.fromState.stateId == pFromStateId && item.toState.stateId == pToStateId) + { + mModelStateTransitionList.Remove(item); + return true; + } + } + return false; + } + + public bool removeModelStateTransition(ref ModelState pFromState, ref ModelState pToState) + { + return removeModelStateTransition(pFromState.stateId, pToState.stateId); + } + + public int getModelStateTransitionCount() + { + return mModelStateTransitionList.Count; + } + + public bool getModelStateTransition(int idx, ref ModelState pFromState, ref ModelState pToState) + { + if (idx < 0 || idx >= mModelStateTransitionList.Count) + { + return false; + } + ModelStateTransition modelStateTransition = mModelStateTransitionList[idx]; + pFromState = modelStateTransition.fromState; + pToState = modelStateTransition.toState; + return true; + } + + public bool getModelStateTransition(int idx, ref ModelStateTransition pStateTransition) + { + if (idx < 0 || idx >= mModelStateTransitionList.Count) + { + return false; + } + pStateTransition = mModelStateTransitionList[idx]; + return true; + } + + public bool existModelStatetTransition(string pFromStateId, string pToStateId) + { + for (int i = 0; i < mModelStateTransitionList.Count; i++) + { + ModelStateTransition modelStateTransition = mModelStateTransitionList[i]; + if (modelStateTransition.fromState.stateId == pFromStateId && modelStateTransition.toState.stateId == pToStateId) + { + return true; + } + } + return false; + } + + public bool existModelStatetTransition(ref ModelState pFromState, ref ModelState pToState) + { + return existModelStatetTransition(pFromState.stateId, pToState.stateId); + } + + public bool updateModelStateTransition(int idx, string pFromStateId, string pToStateId) + { + if (idx < 0 || idx >= mModelStateTransitionList.Count) + { + return false; + } + ModelStateTransition pStateTransition = default(ModelStateTransition); + getModelStateTransition(idx, ref pStateTransition); + removeModelStateTransition(ref pStateTransition.fromState, ref pStateTransition.toState); + addModelStateTransition(pFromStateId, pToStateId); + return true; + } + + public bool compareOther(IModelBehavior pBehavior, ref string obj, ref string name) + { + if (mModelDatasetItemList.Count != pBehavior.getModelDatasetItemCount()) + { + obj = "RelatedDatasets"; + name = "DatasetItemCount"; + return false; + } + for (int i = 0; i < mModelDatasetItemList.Count; i++) + { + ModelDatasetItem modelDatasetItem = mModelDatasetItemList[i]; + ModelDatasetItem pDataset = default(ModelDatasetItem); + pBehavior.getModelDatasetItem(i, ref pDataset); + if (!modelDatasetItem.compareOther(pDataset)) + { + obj = "DatasetItem"; + name = modelDatasetItem.datasetName + "<->" + pDataset.datasetName; + return false; + } + } + if (mModelStateList.Count != pBehavior.getModelStateCount()) + { + obj = "States"; + name = "StateCount"; + return false; + } + for (int j = 0; j < mModelStateList.Count; j++) + { + ModelState modelState = mModelStateList[j]; + ModelState pState = default(ModelState); + pBehavior.getModelState(j, ref pState); + if (!modelState.compareOther(pState)) + { + obj = "State"; + name = modelState.stateName + "<->" + pState.stateName; + return false; + } + } + if (mModelStateTransitionList.Count != pBehavior.getModelStateTransitionCount()) + { + obj = "StateTransitions"; + name = "StateTransitionCount"; + return false; + } + for (int k = 0; k < mModelStateTransitionList.Count; k++) + { + ModelStateTransition modelStateTransition = mModelStateTransitionList[k]; + ModelStateTransition pStateTransition = default(ModelStateTransition); + pBehavior.getModelStateTransition(k, ref pStateTransition); + if (!modelStateTransition.compareOther(pStateTransition)) + { + obj = "StateTransition"; + name = modelStateTransition.fromState.stateId + "<->" + pStateTransition.fromState.stateId; + return false; + } + } + return true; + } + + public bool addProcessParameter(ModelParameter processparameter) + { + if (!mProcessParameters.Contains(processparameter)) + { + mProcessParameters.Add(processparameter); + } + return true; + } + + public bool getProcessParameter(string key, ref ModelParameter parameter) + { + for (int i = 0; i < mProcessParameters.Count; i++) + { + if (mProcessParameters[i].Key == key) + { + parameter = mProcessParameters[i]; + return true; + } + } + return false; + } + + public int getProcessParameterCount() + { + return mProcessParameters.Count; + } + + public bool removeProcessParameter(ModelParameter processparameter) + { + return mProcessParameters.Remove(processparameter); + } + + public bool updateProcessParameter(ModelParameter processparameter) + { + for (int i = 0; i < mProcessParameters.Count; i++) + { + if (mProcessParameters[i].Key == processparameter.Key) + { + mProcessParameters[i] = processparameter; + return true; + } + } + return false; + } + + public bool addControlParameter(ModelParameter controlparameter) + { + if (!mControlParameters.Contains(controlparameter)) + { + mControlParameters.Add(controlparameter); + } + return true; + } + + public bool getControlParameter(string key, ref ModelParameter parameter) + { + for (int i = 0; i < mControlParameters.Count; i++) + { + if (mControlParameters[i].Key == key) + { + parameter = mControlParameters[i]; + return true; + } + } + return false; + } + + public int getControlParameterCount() + { + return mControlParameters.Count; + } + + public bool removeControlParameter(ModelParameter controlparameter) + { + return mControlParameters.Remove(controlparameter); + } + + public bool updateControlParameter(ModelParameter controlparameter) + { + for (int i = 0; i < mControlParameters.Count; i++) + { + if (mControlParameters[i].Key == controlparameter.Key) + { + mControlParameters[i] = controlparameter; + return true; + } + } + return false; + } + } +} diff --git a/NGIS.Model/ModelCategory.cs b/NGIS.Model/ModelCategory.cs new file mode 100644 index 0000000000000000000000000000000000000000..974f8b7b3a368c8d85b517a69ebc39d23551a8f8 --- /dev/null +++ b/NGIS.Model/ModelCategory.cs @@ -0,0 +1,38 @@ +namespace NGIS.Model +{ + public struct ModelCategory + { + public string principle; + + public string path; + + public ModelCategory(string pPrinciple, string pPath) + { + principle = pPrinciple; + path = pPath; + } + + public bool compareOther(ModelCategory pCategory) + { + if (principle != pCategory.principle) + { + return false; + } + if (path != pCategory.path) + { + return false; + } + return true; + } + + public static bool operator ==(ModelCategory mcA, ModelCategory mcB) + { + return mcA.compareOther(mcB); + } + + public static bool operator !=(ModelCategory mcA, ModelCategory mcB) + { + return !(mcA == mcB); + } + } +} diff --git a/NGIS.Model/ModelClass.cs b/NGIS.Model/ModelClass.cs new file mode 100644 index 0000000000000000000000000000000000000000..433d19014e9fa5b32328accbbac8e1dce4b94934 --- /dev/null +++ b/NGIS.Model/ModelClass.cs @@ -0,0 +1,205 @@ +using System.Xml; + +namespace NGIS.Model +{ + public class ModelClass : IModelClass + { + private string mName; + + private string mUID; + + private EExecutionStyle mExecutionStyle; + + private ModelAttribute mModelAttribute; + + private ModelBehavior mModelBehavior; + + private ModelRuntime mModelRuntime; + + public ModelClass() + { + mName = "Model Name"; + mUID = ""; + mExecutionStyle = EExecutionStyle.EES_SIMPLE_CALCULATION; + mModelAttribute = new ModelAttribute(); + mModelBehavior = new ModelBehavior(); + mModelRuntime = new ModelRuntime(); + } + + public void setName(string pName) + { + mName = pName; + } + + public string getName() + { + return mName; + } + + public void setUID(string pUID) + { + mUID = pUID; + } + + public string getUID() + { + return mUID; + } + + public void setExecutionStyle(EExecutionStyle pStyle) + { + mExecutionStyle = pStyle; + } + + public EExecutionStyle getExecutionStyle() + { + return mExecutionStyle; + } + + public ModelAttribute getModelAttribute() + { + return mModelAttribute; + } + + public ModelBehavior getModelBehavior() + { + return mModelBehavior; + } + + public ModelRuntime getModelRuntime() + { + return mModelRuntime; + } + + public bool LoadFromXmlFile(string fileName) + { + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.Prefix = ""; + xmlDocument.Load(fileName); + XmlElement documentElement = xmlDocument.DocumentElement; + mName = documentElement.GetAttribute("name"); + mUID = documentElement.GetAttribute("uid"); + string a = ""; + if (documentElement.HasAttribute("style")) + { + a = documentElement.GetAttribute("style"); + } + else if (documentElement.HasAttribute("type")) + { + a = documentElement.GetAttribute("type"); + } + if (a == "SimpleCalculation") + { + mExecutionStyle = EExecutionStyle.EES_SIMPLE_CALCULATION; + } + else if (a == "TimeSeries") + { + mExecutionStyle = EExecutionStyle.EES_TIME_SERIES; + } + else + { + mExecutionStyle = EExecutionStyle.EES_STATE_SIMULATION; + } + mModelAttribute.loadFromXml(documentElement); + mModelBehavior.loadFromXml(documentElement); + mModelRuntime.loadFromXml(documentElement); + return true; + } + + public bool FormatToXmlFile(string fileName) + { + XmlDocument xmlDocument = new XmlDocument(); + XmlElement xmlElement = xmlDocument.CreateElement("ModelClass"); + xmlElement.SetAttribute("name", mName); + xmlElement.SetAttribute("uid", mUID); + if (mExecutionStyle == EExecutionStyle.EES_SIMPLE_CALCULATION) + { + xmlElement.SetAttribute("style", "SimpleCalculation"); + } + else if (mExecutionStyle == EExecutionStyle.EES_TIME_SERIES) + { + xmlElement.SetAttribute("style", "TimeSeries"); + } + else + { + xmlElement.SetAttribute("style", "StateSimulation"); + } + xmlDocument.AppendChild(xmlElement); + mModelAttribute.formatToXml(xmlElement); + mModelBehavior.formatToXml(xmlElement); + mModelRuntime.formatToXml(xmlElement); + xmlDocument.Save(fileName); + return true; + } + + public bool LoadFromXmlStream(string xmlStr) + { + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(xmlStr); + XmlElement documentElement = xmlDocument.DocumentElement; + mName = documentElement.GetAttribute("name"); + mUID = documentElement.GetAttribute("uid"); + string attribute = documentElement.GetAttribute("style"); + if (attribute == "SimpleCalculation") + { + mExecutionStyle = EExecutionStyle.EES_SIMPLE_CALCULATION; + } + else if (attribute == "TimeSeries") + { + mExecutionStyle = EExecutionStyle.EES_TIME_SERIES; + } + else + { + mExecutionStyle = EExecutionStyle.EES_STATE_SIMULATION; + } + mModelAttribute.loadFromXml(documentElement); + mModelBehavior.loadFromXml(documentElement); + mModelRuntime.loadFromXml(documentElement); + return true; + } + + public bool FormatToXmlStream(ref string xmlStr) + { + XmlDocument xmlDocument = new XmlDocument(); + XmlElement xmlElement = xmlDocument.CreateElement("ModelClass"); + xmlElement.SetAttribute("name", mName); + xmlElement.SetAttribute("uid", mUID); + if (mExecutionStyle == EExecutionStyle.EES_SIMPLE_CALCULATION) + { + xmlElement.SetAttribute("style", "SimpleCalculation"); + } + else if (mExecutionStyle == EExecutionStyle.EES_TIME_SERIES) + { + xmlElement.SetAttribute("style", "TimeSeries"); + } + else + { + xmlElement.SetAttribute("style", "StateSimulation"); + } + xmlDocument.AppendChild(xmlElement); + mModelAttribute.formatToXml(xmlElement); + mModelBehavior.formatToXml(xmlElement); + mModelRuntime.formatToXml(xmlElement); + xmlStr = xmlDocument.InnerXml; + return true; + } + + public bool compareOther(IModelClass pClass, bool withRuntime, ref string obj, ref string name) + { + bool flag = false; + if (mModelAttribute != null && !mModelAttribute.compareOther(pClass.getModelAttribute(), ref obj, ref name)) + { + return false; + } + if (mModelBehavior != null && !mModelBehavior.compareOther(pClass.getModelBehavior(), ref obj, ref name)) + { + return false; + } + if (withRuntime && mModelRuntime != null && !mModelRuntime.compareOther(pClass.getModelRuntime(), ref obj, ref name)) + { + return false; + } + return true; + } + } +} diff --git a/NGIS.Model/ModelDatasetItem.cs b/NGIS.Model/ModelDatasetItem.cs new file mode 100644 index 0000000000000000000000000000000000000000..60e80b7fc950bf7e68590599083b4ca41249b3c6 --- /dev/null +++ b/NGIS.Model/ModelDatasetItem.cs @@ -0,0 +1,46 @@ +using NGIS.Data.Schema; + +namespace NGIS.Model +{ + public struct ModelDatasetItem + { + public UdxDatasetSchema datasetItem; + + public string datasetName; + + public EModelDatasetItemType datasetItemType; + + public string datasetItemDescription; + + public string externalId; + + public bool compareOther(ModelDatasetItem pDatasetItem) + { + if ((datasetItem == null && pDatasetItem.datasetItem != null) || (datasetItem != null && pDatasetItem.datasetItem == null)) + { + return false; + } + if (datasetItem != null && pDatasetItem.datasetItem != null && !datasetItem.compareOther(pDatasetItem.datasetItem)) + { + return false; + } + if (datasetName != pDatasetItem.datasetName) + { + return false; + } + if (datasetItemType != pDatasetItem.datasetItemType) + { + return false; + } + if (datasetItemDescription != pDatasetItem.datasetItemDescription) + { + return false; + } + if (externalId != pDatasetItem.externalId) + { + return false; + } + return true; + } + } +} diff --git a/NGIS.Model/ModelEvent.cs b/NGIS.Model/ModelEvent.cs new file mode 100644 index 0000000000000000000000000000000000000000..eb147a436b1298e99cd45adfc6de16bb58d57528 --- /dev/null +++ b/NGIS.Model/ModelEvent.cs @@ -0,0 +1,46 @@ +namespace NGIS.Model +{ + public struct ModelEvent + { + public string eventName; + + public EModelEventType eventType; + + public string eventDescription; + + public string datasetReference; + + public string parameterDescription; + + public bool optional; + + public bool compareOther(ModelEvent pEvent) + { + if (eventName != pEvent.eventName) + { + return false; + } + if (eventType != pEvent.eventType) + { + return false; + } + if (eventDescription != pEvent.eventDescription) + { + return false; + } + if (datasetReference != pEvent.datasetReference) + { + return false; + } + if (parameterDescription != pEvent.parameterDescription) + { + return false; + } + if (optional != pEvent.optional) + { + return false; + } + return true; + } + } +} diff --git a/NGIS.Model/ModelMechanismItem.cs b/NGIS.Model/ModelMechanismItem.cs new file mode 100644 index 0000000000000000000000000000000000000000..2455b45ecf92a35d513762765cad12914df725fe --- /dev/null +++ b/NGIS.Model/ModelMechanismItem.cs @@ -0,0 +1,32 @@ +namespace NGIS.Model +{ + public struct ModelMechanismItem + { + public string Name; + + public EMechanismItemType Type; + + public string Value; + + public ModelMechanismItem(string name, EMechanismItemType type, string value) + { + Name = name; + Type = type; + Value = value; + } + + public static bool operator ==(ModelMechanismItem itemA, ModelMechanismItem itemB) + { + if (itemA.Name == itemB.Name && itemA.Type == itemB.Type && itemA.Value == itemB.Value) + { + return true; + } + return false; + } + + public static bool operator !=(ModelMechanismItem itemA, ModelMechanismItem itemB) + { + return !(itemA == itemB); + } + } +} diff --git a/NGIS.Model/ModelParameter.cs b/NGIS.Model/ModelParameter.cs new file mode 100644 index 0000000000000000000000000000000000000000..1d94063a314ee9b4f5e23e41a6f58e17dd165750 --- /dev/null +++ b/NGIS.Model/ModelParameter.cs @@ -0,0 +1,32 @@ +namespace NGIS.Model +{ + public struct ModelParameter + { + public string Key; + + public string Description; + + public string DefaultValue; + + public ModelParameter(string key, string description, string defaultValue) + { + Key = key; + Description = description; + DefaultValue = defaultValue; + } + + public static bool operator ==(ModelParameter mpA, ModelParameter mpB) + { + if (mpA.Key == mpB.Key && mpA.Description == mpB.Description && mpA.DefaultValue == mpB.DefaultValue) + { + return true; + } + return false; + } + + public static bool operator !=(ModelParameter mpA, ModelParameter mpB) + { + return !(mpA != mpB); + } + } +} diff --git a/NGIS.Model/ModelRuntime.cs b/NGIS.Model/ModelRuntime.cs new file mode 100644 index 0000000000000000000000000000000000000000..5f77f8ff090ed45a6b5965c7c2b9928b16fbc176 --- /dev/null +++ b/NGIS.Model/ModelRuntime.cs @@ -0,0 +1,453 @@ +using System.Collections.Generic; +using System.Xml; + +namespace NGIS.Model +{ + public class ModelRuntime : IModelRuntime + { + private string mName; + + private string mVersion; + + private string mEntry; + + private string mBaseDirectory; + + private List mHardwareRequirementList = new List(); + + private List mSoftwareRequirementList = new List(); + + private List mModelAssemblyList = new List(); + + private List mSupportiveResourceList = new List(); + + public bool loadFromXml(XmlElement pModelClassElement) + { + XmlElement xmlElement = pModelClassElement.ChildNodes[2] as XmlElement; + mName = xmlElement.GetAttribute("name"); + mVersion = xmlElement.GetAttribute("version"); + mBaseDirectory = xmlElement.GetAttribute("baseDir"); + mEntry = xmlElement.GetAttribute("entry"); + XmlElement xmlElement2 = xmlElement.ChildNodes[0] as XmlElement; + XmlElement xmlElement3 = xmlElement.ChildNodes[1] as XmlElement; + XmlElement xmlElement4 = xmlElement.ChildNodes[2] as XmlElement; + XmlElement xmlElement5 = xmlElement.ChildNodes[3] as XmlElement; + foreach (object childNode in xmlElement2.ChildNodes) + { + XmlElement xmlElement6 = childNode as XmlElement; + HardwareRequirement item = default(HardwareRequirement); + item.requirementKey = xmlElement6.GetAttribute("key"); + item.requirementValue = xmlElement6.GetAttribute("value"); + mHardwareRequirementList.Add(item); + } + foreach (object childNode2 in xmlElement3.ChildNodes) + { + XmlElement xmlElement7 = childNode2 as XmlElement; + SoftwareRequirement item2 = default(SoftwareRequirement); + item2.requirementKey = xmlElement7.GetAttribute("key"); + item2.requirementValue = xmlElement7.GetAttribute("value"); + item2.requirementPlatform = xmlElement7.GetAttribute("platform"); + mSoftwareRequirementList.Add(item2); + } + foreach (object childNode3 in xmlElement4.ChildNodes) + { + XmlElement xmlElement8 = childNode3 as XmlElement; + ModelAssembly item3 = default(ModelAssembly); + item3.assemblyName = xmlElement8.GetAttribute("name"); + item3.assemblyPath = xmlElement8.GetAttribute("path"); + mModelAssemblyList.Add(item3); + } + foreach (object childNode4 in xmlElement5.ChildNodes) + { + XmlElement xmlElement9 = childNode4 as XmlElement; + SupportiveResource item4 = default(SupportiveResource); + item4.resourceType = xmlElement9.GetAttribute("type"); + item4.resourceName = xmlElement9.GetAttribute("name"); + mSupportiveResourceList.Add(item4); + } + return true; + } + + public bool formatToXml(XmlElement pModelClassElement) + { + XmlDocument ownerDocument = pModelClassElement.OwnerDocument; + XmlElement xmlElement = ownerDocument.CreateElement("Runtime"); + xmlElement.SetAttribute("name", mName); + xmlElement.SetAttribute("version", mVersion); + xmlElement.SetAttribute("baseDir", mBaseDirectory); + xmlElement.SetAttribute("entry", mEntry); + XmlElement xmlElement2 = ownerDocument.CreateElement("HardwareConfigures"); + XmlElement xmlElement3 = ownerDocument.CreateElement("SoftwareConfigures"); + XmlElement xmlElement4 = ownerDocument.CreateElement("Assemblies"); + XmlElement xmlElement5 = ownerDocument.CreateElement("SupportiveResources"); + for (int i = 0; i < mHardwareRequirementList.Count; i++) + { + XmlElement xmlElement6 = ownerDocument.CreateElement("Add"); + xmlElement6.SetAttribute("key", mHardwareRequirementList[i].requirementKey); + xmlElement6.SetAttribute("value", mHardwareRequirementList[i].requirementValue); + xmlElement2.AppendChild(xmlElement6); + } + for (int j = 0; j < mSoftwareRequirementList.Count; j++) + { + XmlElement xmlElement7 = ownerDocument.CreateElement("Add"); + xmlElement7.SetAttribute("key", mSoftwareRequirementList[j].requirementKey); + xmlElement7.SetAttribute("value", mSoftwareRequirementList[j].requirementValue); + xmlElement7.SetAttribute("platform", mSoftwareRequirementList[j].requirementPlatform); + xmlElement3.AppendChild(xmlElement7); + } + for (int k = 0; k < mModelAssemblyList.Count; k++) + { + XmlElement xmlElement8 = ownerDocument.CreateElement("Assembly"); + xmlElement8.SetAttribute("name", mModelAssemblyList[k].assemblyName); + xmlElement8.SetAttribute("path", mModelAssemblyList[k].assemblyPath); + xmlElement4.AppendChild(xmlElement8); + } + for (int l = 0; l < mSupportiveResourceList.Count; l++) + { + XmlElement xmlElement9 = ownerDocument.CreateElement("Add"); + xmlElement9.SetAttribute("type", mSupportiveResourceList[l].resourceType); + xmlElement9.SetAttribute("name", mSupportiveResourceList[l].resourceName); + xmlElement5.AppendChild(xmlElement9); + } + xmlElement.AppendChild(xmlElement2); + xmlElement.AppendChild(xmlElement3); + xmlElement.AppendChild(xmlElement4); + xmlElement.AppendChild(xmlElement5); + pModelClassElement.AppendChild(xmlElement); + return true; + } + + public string getName() + { + return mName; + } + + public void setName(string pName) + { + mName = pName; + } + + public string getVersion() + { + return mVersion; + } + + public void setVersion(string pVersion) + { + mVersion = pVersion; + } + + public string getEntry() + { + return mEntry; + } + + public void setEntry(string pEntry) + { + mEntry = pEntry; + } + + public string getBaseDirectory() + { + return mBaseDirectory; + } + + public void setBaseDirectory(string pDirectory) + { + mBaseDirectory = pDirectory; + } + + public bool addHardwareRequirement(ref HardwareRequirement pRequirement) + { + for (int i = 0; i < mHardwareRequirementList.Count; i++) + { + if (mHardwareRequirementList[i].requirementKey == pRequirement.requirementKey && mHardwareRequirementList[i].requirementValue == pRequirement.requirementValue) + { + return false; + } + } + mHardwareRequirementList.Add(pRequirement); + return true; + } + + public bool addSoftwareRequirement(ref SoftwareRequirement pRequirement) + { + for (int i = 0; i < mSoftwareRequirementList.Count; i++) + { + if (mSoftwareRequirementList[i].requirementKey == pRequirement.requirementKey && mSoftwareRequirementList[i].requirementValue == pRequirement.requirementValue) + { + return false; + } + } + mSoftwareRequirementList.Add(pRequirement); + return true; + } + + public bool addModelAssembly(ref ModelAssembly pRequirement) + { + for (int i = 0; i < mModelAssemblyList.Count; i++) + { + if (mModelAssemblyList[i].assemblyName == pRequirement.assemblyName && mModelAssemblyList[i].assemblyPath == pRequirement.assemblyPath) + { + return false; + } + } + mModelAssemblyList.Add(pRequirement); + return true; + } + + public bool addSupportiveResource(ref SupportiveResource pRequirement) + { + for (int i = 0; i < mSupportiveResourceList.Count; i++) + { + if (mSupportiveResourceList[i].resourceType == pRequirement.resourceType && mSupportiveResourceList[i].resourceName == pRequirement.resourceName) + { + return false; + } + } + mSupportiveResourceList.Add(pRequirement); + return true; + } + + public int getHardwareRequirementCount() + { + return mHardwareRequirementList.Count; + } + + public int getSoftwareRequirementCount() + { + return mSoftwareRequirementList.Count; + } + + public int getModelAssemblyCount() + { + return mModelAssemblyList.Count; + } + + public int getSupportiveResourceCount() + { + return mSupportiveResourceList.Count; + } + + public bool getHardwareRequirement(int idx, ref HardwareRequirement pRequirement) + { + if (idx < 0 || idx >= mHardwareRequirementList.Count) + { + return false; + } + pRequirement = mHardwareRequirementList[idx]; + return true; + } + + public bool getSoftwareRequirement(int idx, ref SoftwareRequirement pRequirement) + { + if (idx < 0 || idx >= mSoftwareRequirementList.Count) + { + return false; + } + pRequirement = mSoftwareRequirementList[idx]; + return true; + } + + public bool getModelAssembly(int idx, ref ModelAssembly pRequirement) + { + if (idx < 0 || idx >= mModelAssemblyList.Count) + { + return false; + } + pRequirement = mModelAssemblyList[idx]; + return true; + } + + public bool getSupportiveResource(int idx, ref SupportiveResource pRequirement) + { + if (idx < 0 || idx >= mSupportiveResourceList.Count) + { + return false; + } + pRequirement = mSupportiveResourceList[idx]; + return true; + } + + public bool removeHardwareRequirementref(HardwareRequirement pRequirement) + { + if (mHardwareRequirementList.Contains(pRequirement)) + { + mHardwareRequirementList.Remove(pRequirement); + return true; + } + return false; + } + + public bool removeSoftwareRequirement(ref SoftwareRequirement pRequirement) + { + if (mSoftwareRequirementList.Contains(pRequirement)) + { + mSoftwareRequirementList.Remove(pRequirement); + return true; + } + return false; + } + + public bool removeModelAssembly(ref ModelAssembly pRequirement) + { + if (mModelAssemblyList.Contains(pRequirement)) + { + mModelAssemblyList.Remove(pRequirement); + return true; + } + return false; + } + + public bool removeSupportiveResource(ref SupportiveResource pRequirement) + { + if (mSupportiveResourceList.Contains(pRequirement)) + { + mSupportiveResourceList.Remove(pRequirement); + return true; + } + return false; + } + + public bool removeHardwareRequirement(int idx) + { + if (idx < 0 || idx >= mHardwareRequirementList.Count) + { + return false; + } + mHardwareRequirementList.RemoveAt(idx); + return true; + } + + public bool removeSoftwareRequirement(int idx) + { + if (idx < 0 || idx >= mSoftwareRequirementList.Count) + { + return false; + } + mSoftwareRequirementList.RemoveAt(idx); + return true; + } + + public bool removeModelAssembly(int idx) + { + if (idx < 0 || idx >= mModelAssemblyList.Count) + { + return false; + } + mModelAssemblyList.RemoveAt(idx); + return true; + } + + public bool removeSupportiveResource(int idx) + { + if (idx < 0 || idx >= mSupportiveResourceList.Count) + { + return false; + } + mSupportiveResourceList.RemoveAt(idx); + return true; + } + + public bool compareOther(IModelRuntime pRuntime, ref string obj, ref string name) + { + if (mName != pRuntime.getName()) + { + obj = "Runtime"; + name = "name"; + return false; + } + if (mVersion != pRuntime.getVersion()) + { + obj = "Runtime"; + name = "version"; + return false; + } + if (mEntry != pRuntime.getEntry()) + { + obj = "Runtime"; + name = "entry"; + return false; + } + if (mBaseDirectory != pRuntime.getBaseDirectory()) + { + obj = "Runtime"; + name = "baseDir"; + return false; + } + if (mHardwareRequirementList.Count != pRuntime.getHardwareRequirementCount()) + { + obj = "HardwareConfigures"; + name = "HardwareRequirementCount"; + return false; + } + for (int i = 0; i < mHardwareRequirementList.Count; i++) + { + HardwareRequirement hardwareRequirement = mHardwareRequirementList[i]; + HardwareRequirement pRequirement = default(HardwareRequirement); + pRuntime.getHardwareRequirement(i, ref pRequirement); + if (!hardwareRequirement.compareOther(pRequirement)) + { + obj = "Hardware"; + name = hardwareRequirement.requirementKey + "<-->" + pRequirement.requirementKey; + return false; + } + } + if (mSoftwareRequirementList.Count != pRuntime.getSoftwareRequirementCount()) + { + obj = "SoftwareConfigures"; + name = "SoftwareRequirementCount"; + return false; + } + for (int j = 0; j < mSoftwareRequirementList.Count; j++) + { + SoftwareRequirement softwareRequirement = mSoftwareRequirementList[j]; + SoftwareRequirement pRequirement2 = default(SoftwareRequirement); + pRuntime.getSoftwareRequirement(j, ref pRequirement2); + if (!softwareRequirement.compareOther(pRequirement2)) + { + obj = "Software"; + name = softwareRequirement.requirementKey + "<-->" + pRequirement2.requirementKey; + return false; + } + } + if (mModelAssemblyList.Count != pRuntime.getModelAssemblyCount()) + { + obj = "Assemblies"; + name = "AssemblyCount"; + return false; + } + for (int k = 0; k < mModelAssemblyList.Count; k++) + { + ModelAssembly modelAssembly = mModelAssemblyList[k]; + ModelAssembly pRequirement3 = default(ModelAssembly); + pRuntime.getModelAssembly(k, ref pRequirement3); + if (!modelAssembly.compareOther(pRequirement3)) + { + obj = "Assembly"; + name = modelAssembly.assemblyName + "<-->" + pRequirement3.assemblyName; + return false; + } + } + if (mSupportiveResourceList.Count != pRuntime.getSupportiveResourceCount()) + { + obj = "SupportiveResources"; + name = "SupportiveResourceCount"; + return false; + } + for (int l = 0; l < mSupportiveResourceList.Count; l++) + { + SupportiveResource supportiveResource = mSupportiveResourceList[l]; + SupportiveResource pRequirement4 = default(SupportiveResource); + pRuntime.getSupportiveResource(l, ref pRequirement4); + if (!supportiveResource.compareOther(pRequirement4)) + { + obj = "SupportiveResource"; + name = supportiveResource.resourceName + "<-->" + pRequirement4.resourceName; + return false; + } + } + return true; + } + } +} diff --git a/NGIS.Model/ModelState.cs b/NGIS.Model/ModelState.cs new file mode 100644 index 0000000000000000000000000000000000000000..b3983968ae777044b9af14513597f56081881c1a --- /dev/null +++ b/NGIS.Model/ModelState.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; + +namespace NGIS.Model +{ + public struct ModelState + { + public string stateId; + + public string stateName; + + public EModelStateType stateType; + + public string stateDecription; + + public List modelEvents; + + public bool compareOther(ModelState pState) + { + if (stateId != pState.stateId) + { + return false; + } + if (stateName != pState.stateName) + { + return false; + } + if (stateType != pState.stateType) + { + return false; + } + if (stateDecription != pState.stateDecription) + { + return false; + } + if (modelEvents.Count != pState.modelEvents.Count) + { + return false; + } + for (int i = 0; i < modelEvents.Count; i++) + { + ModelEvent modelEvent = modelEvents[i]; + ModelEvent pEvent = pState.modelEvents[i]; + if (!modelEvent.compareOther(pEvent)) + { + return false; + } + } + return true; + } + } +} diff --git a/NGIS.Model/ModelStateTransition.cs b/NGIS.Model/ModelStateTransition.cs new file mode 100644 index 0000000000000000000000000000000000000000..6f0675470ff7deaf75b0005b84d582cda07bf118 --- /dev/null +++ b/NGIS.Model/ModelStateTransition.cs @@ -0,0 +1,22 @@ +namespace NGIS.Model +{ + public struct ModelStateTransition + { + public ModelState fromState; + + public ModelState toState; + + public bool compareOther(ModelStateTransition pTrans) + { + if (!fromState.compareOther(pTrans.fromState)) + { + return false; + } + if (!toState.compareOther(pTrans.toState)) + { + return false; + } + return true; + } + } +} diff --git a/NGIS.Model/ModelUser.cs b/NGIS.Model/ModelUser.cs new file mode 100644 index 0000000000000000000000000000000000000000..5791f6b1330bb6b1511f56a110298b372de16dfa --- /dev/null +++ b/NGIS.Model/ModelUser.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; + +namespace NGIS.Model +{ + public struct ModelUser + { + public string Name; + + public string Account; + + public ModelUserInstitution Institution; + + public List Contacts; + + public ModelUser(string name, string account, ModelUserInstitution ins, List contacts) + { + Name = name; + Account = account; + Institution = ins; + Contacts = contacts; + } + + public static bool operator ==(ModelUser userA, ModelUser userB) + { + if (userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name && userA.Name == userB.Name) + { + return true; + } + return false; + } + + public static bool operator !=(ModelUser userA, ModelUser userB) + { + return !(userA != userB); + } + } +} diff --git a/NGIS.Model/ModelUserContact.cs b/NGIS.Model/ModelUserContact.cs new file mode 100644 index 0000000000000000000000000000000000000000..197b95fcc03a1ea5d010e4e0a3961f34a449f6b3 --- /dev/null +++ b/NGIS.Model/ModelUserContact.cs @@ -0,0 +1,29 @@ +namespace NGIS.Model +{ + public struct ModelUserContact + { + public EContactType Type; + + public string Value; + + public ModelUserContact(EContactType type, string value) + { + Type = type; + Value = value; + } + + public static bool operator ==(ModelUserContact mucA, ModelUserContact mucB) + { + if (mucA.Type == mucB.Type && mucA.Value == mucB.Value) + { + return true; + } + return false; + } + + public static bool operator !=(ModelUserContact mucA, ModelUserContact mucB) + { + return !(mucA == mucB); + } + } +} diff --git a/NGIS.Model/ModelUserInstitution.cs b/NGIS.Model/ModelUserInstitution.cs new file mode 100644 index 0000000000000000000000000000000000000000..48fd0168290f5f8ca8ef9398eb73e7c8049a5bd5 --- /dev/null +++ b/NGIS.Model/ModelUserInstitution.cs @@ -0,0 +1,35 @@ +namespace NGIS.Model +{ + public struct ModelUserInstitution + { + public string Name; + + public string Country; + + public string City; + + public string Address; + + public ModelUserInstitution(string name, string country, string city, string address) + { + Name = name; + Country = country; + City = city; + Address = address; + } + + public static bool operator ==(ModelUserInstitution insA, ModelUserInstitution insB) + { + if (insA.Name == insB.Name && insA.Country == insB.Country && insA.City == insB.City && insA.Address == insB.Address) + { + return true; + } + return false; + } + + public static bool operator !=(ModelUserInstitution insA, ModelUserInstitution insB) + { + return !(insA == insB); + } + } +} diff --git a/NGIS.Model/SoftwareRequirement.cs b/NGIS.Model/SoftwareRequirement.cs new file mode 100644 index 0000000000000000000000000000000000000000..c182704e394c79dc4bd10157fe15dc9c7a00b387 --- /dev/null +++ b/NGIS.Model/SoftwareRequirement.cs @@ -0,0 +1,38 @@ +namespace NGIS.Model +{ + public struct SoftwareRequirement + { + public string requirementKey; + + public string requirementValue; + + public string requirementPlatform; + + public bool compareOther(SoftwareRequirement pRequirement) + { + if (requirementKey != pRequirement.requirementKey) + { + return false; + } + if (requirementValue != pRequirement.requirementValue) + { + return false; + } + if (requirementPlatform != pRequirement.requirementPlatform) + { + return false; + } + return true; + } + + public static bool operator ==(SoftwareRequirement srA, SoftwareRequirement srB) + { + return srA.compareOther(srB); + } + + public static bool operator !=(SoftwareRequirement srA, SoftwareRequirement srB) + { + return !(srA == srB); + } + } +} diff --git a/NGIS.Model/SpatialExtent.cs b/NGIS.Model/SpatialExtent.cs new file mode 100644 index 0000000000000000000000000000000000000000..8b0d95efa4aefbd72969dc9c53e5b8d369f69b58 --- /dev/null +++ b/NGIS.Model/SpatialExtent.cs @@ -0,0 +1,38 @@ +namespace NGIS.Model +{ + public struct SpatialExtent + { + public double XMin; + + public double XMax; + + public double YMin; + + public double YMax; + + public string SpatialReference; + + public SpatialExtent(double xmin, double xmax, double ymin, double ymax, string sreference) + { + XMin = xmin; + XMax = xmax; + YMin = ymin; + YMax = ymax; + SpatialReference = sreference; + } + + public static bool operator ==(SpatialExtent seA, SpatialExtent seB) + { + if (seA.XMin == seB.XMin && seA.XMax == seB.XMax && seA.YMin == seB.YMin && seA.YMax == seB.YMax && seA.SpatialReference == seB.SpatialReference) + { + return true; + } + return false; + } + + public static bool operator !=(SpatialExtent seA, SpatialExtent seB) + { + return !(seA == seB); + } + } +} diff --git a/NGIS.Model/SpatialScope.cs b/NGIS.Model/SpatialScope.cs new file mode 100644 index 0000000000000000000000000000000000000000..1379c4bf6086dede19f18bd6cdb9693e5c79a5dc --- /dev/null +++ b/NGIS.Model/SpatialScope.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; + +namespace NGIS.Model +{ + public struct SpatialScope + { + public List Extents; + + public List AreaNames; + + public static bool operator ==(SpatialScope ssA, SpatialScope ssB) + { + if (ssA.Extents.Count != ssB.Extents.Count) + { + return false; + } + for (int i = 0; i < ssA.Extents.Count; i++) + { + if (!ssB.Extents.Contains(ssA.Extents[i])) + { + return false; + } + } + if (ssA.AreaNames.Count != ssB.AreaNames.Count) + { + return false; + } + for (int j = 0; j < ssA.AreaNames.Count; j++) + { + if (!ssB.AreaNames.Contains(ssA.AreaNames[j])) + { + return false; + } + } + return true; + } + + public static bool operator !=(SpatialScope ssA, SpatialScope ssB) + { + return !(ssA == ssB); + } + } +} diff --git a/NGIS.Model/SpatiotemporalStepLength.cs b/NGIS.Model/SpatiotemporalStepLength.cs new file mode 100644 index 0000000000000000000000000000000000000000..5803c9338d3d9d1b6a52aeb4ad0e36b6d8bb972c --- /dev/null +++ b/NGIS.Model/SpatiotemporalStepLength.cs @@ -0,0 +1,51 @@ +using System; + +namespace NGIS.Model +{ + public struct SpatiotemporalStepLength + { + public double Min; + + public double Max; + + public string Unit; + + public SpatiotemporalStepLength(double min, double max, string unit) + { + Min = min; + Max = max; + Unit = unit; + } + + public SpatiotemporalStepLength(string step, string unit) + { + if (step.Trim() == "") + { + Min = 0.0; + Max = 0.0; + } + else + { + string text = step.Substring(1, step.Length - 2); + string[] array = text.Split(','); + Min = Convert.ToDouble(array[0]); + Max = Convert.ToDouble(array[1]); + } + Unit = unit; + } + + public static bool operator ==(SpatiotemporalStepLength sslA, SpatiotemporalStepLength sslB) + { + if (sslA.Min == sslB.Min && sslA.Max == sslB.Max && sslA.Unit == sslB.Unit) + { + return true; + } + return false; + } + + public static bool operator !=(SpatiotemporalStepLength sslA, SpatiotemporalStepLength sslB) + { + return !(sslA == sslB); + } + } +} diff --git a/NGIS.Model/SupportiveResource.cs b/NGIS.Model/SupportiveResource.cs new file mode 100644 index 0000000000000000000000000000000000000000..7d9831209713c87adbf7e47a7e1dea2e07df85db --- /dev/null +++ b/NGIS.Model/SupportiveResource.cs @@ -0,0 +1,32 @@ +namespace NGIS.Model +{ + public struct SupportiveResource + { + public string resourceType; + + public string resourceName; + + public bool compareOther(SupportiveResource pResource) + { + if (resourceType != pResource.resourceType) + { + return false; + } + if (resourceName != pResource.resourceName) + { + return false; + } + return true; + } + + public static bool operator ==(SupportiveResource srA, SupportiveResource srB) + { + return srA.compareOther(srB); + } + + public static bool operator !=(SupportiveResource srA, SupportiveResource srB) + { + return !(srA == srB); + } + } +} diff --git a/view/DataReference.cs b/view/DataReference.cs new file mode 100644 index 0000000000000000000000000000000000000000..446f4ae0d68b5aee3e4130fb69ce30634d1c1a61 --- /dev/null +++ b/view/DataReference.cs @@ -0,0 +1,183 @@ +using MDL.Class; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace MDL +{ + public class DataReference : Form + { + private Dataset dataset; + + private IContainer components = null; + + private ComboBox comboBox3; + + private TextBox textBox4; + + private Label label6; + + private Label label8; + + private TextBox textBox6; + + private Label label9; + + private Button button2; + + private Button button1; + + private TextBox textBox1; + + private Label label1; + + public event TransfDelegate TransfEvent; + + public DataReference(Dataset d, string type) + { + dataset = d; + InitializeComponent(); + textBox6.Text = dataset.Name; + comboBox3.Text = dataset.Type; + textBox4.Text = dataset.Description; + textBox1.Text = dataset.ExternalId; + if (type == "response(input)") + { + label1.Text = "Schema:"; + } + else + { + label1.Text = "ExternalId:"; + } + } + + private void button1_Click(object sender, EventArgs e) + { + dataset.Name = textBox6.Text; + dataset.Type = comboBox3.Text; + dataset.Description = textBox4.Text; + dataset.ExternalId = textBox1.Text; + this.TransfEvent(dataset); + Close(); + } + + private void button2_Click(object sender, EventArgs e) + { + Close(); + } + + protected override void Dispose(bool disposing) + { + if (disposing && components != null) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MDL.DataReference)); + comboBox3 = new System.Windows.Forms.ComboBox(); + textBox4 = new System.Windows.Forms.TextBox(); + label6 = new System.Windows.Forms.Label(); + label8 = new System.Windows.Forms.Label(); + textBox6 = new System.Windows.Forms.TextBox(); + label9 = new System.Windows.Forms.Label(); + button2 = new System.Windows.Forms.Button(); + button1 = new System.Windows.Forms.Button(); + textBox1 = new System.Windows.Forms.TextBox(); + label1 = new System.Windows.Forms.Label(); + SuspendLayout(); + comboBox3.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + comboBox3.FormattingEnabled = true; + comboBox3.Items.AddRange(new object[2] + { + "internal", + "external" + }); + comboBox3.Location = new System.Drawing.Point(74, 84); + comboBox3.Name = "comboBox3"; + comboBox3.Size = new System.Drawing.Size(261, 20); + comboBox3.TabIndex = 24; + textBox4.Location = new System.Drawing.Point(23, 152); + textBox4.Multiline = true; + textBox4.Name = "textBox4"; + textBox4.Size = new System.Drawing.Size(312, 76); + textBox4.TabIndex = 23; + label6.AutoSize = true; + label6.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + label6.Location = new System.Drawing.Point(20, 128); + label6.Name = "label6"; + label6.Size = new System.Drawing.Size(104, 16); + label6.TabIndex = 22; + label6.Text = "Description:"; + label8.AutoSize = true; + label8.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + label8.Location = new System.Drawing.Point(20, 84); + label8.Name = "label8"; + label8.Size = new System.Drawing.Size(48, 16); + label8.TabIndex = 19; + label8.Text = "Type:"; + textBox6.Location = new System.Drawing.Point(74, 33); + textBox6.Name = "textBox6"; + textBox6.Size = new System.Drawing.Size(262, 21); + textBox6.TabIndex = 18; + label9.AutoSize = true; + label9.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + label9.Location = new System.Drawing.Point(20, 35); + label9.Name = "label9"; + label9.Size = new System.Drawing.Size(48, 16); + label9.TabIndex = 17; + label9.Text = "Name:"; + button2.Font = new System.Drawing.Font("宋体", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + button2.Location = new System.Drawing.Point(218, 379); + button2.Name = "button2"; + button2.Size = new System.Drawing.Size(75, 23); + button2.TabIndex = 26; + button2.Text = "Cancel"; + button2.UseVisualStyleBackColor = true; + button2.Click += new System.EventHandler(button2_Click); + button1.Font = new System.Drawing.Font("宋体", 10f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + button1.Location = new System.Drawing.Point(58, 379); + button1.Name = "button1"; + button1.Size = new System.Drawing.Size(75, 23); + button1.TabIndex = 25; + button1.Text = "Save"; + button1.UseVisualStyleBackColor = true; + button1.Click += new System.EventHandler(button1_Click); + textBox1.Location = new System.Drawing.Point(23, 274); + textBox1.Multiline = true; + textBox1.Name = "textBox1"; + textBox1.Size = new System.Drawing.Size(312, 75); + textBox1.TabIndex = 28; + label1.AutoSize = true; + label1.Font = new System.Drawing.Font("Times New Roman", 12f, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 134); + label1.Location = new System.Drawing.Point(20, 250); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(96, 16); + label1.TabIndex = 27; + label1.Text = "ExternalId:"; + base.AutoScaleDimensions = new System.Drawing.SizeF(6f, 12f); + base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + BackColor = System.Drawing.SystemColors.GradientActiveCaption; + base.ClientSize = new System.Drawing.Size(358, 422); + base.Controls.Add(textBox1); + base.Controls.Add(label1); + base.Controls.Add(button2); + base.Controls.Add(button1); + base.Controls.Add(comboBox3); + base.Controls.Add(textBox4); + base.Controls.Add(label6); + base.Controls.Add(label8); + base.Controls.Add(textBox6); + base.Controls.Add(label9); + base.Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon"); + base.Name = "DataReference"; + Text = "Data Reference"; + ResumeLayout(false); + PerformLayout(); + } + } +} diff --git a/view/DataReference.resx b/view/DataReference.resx new file mode 100644 index 0000000000000000000000000000000000000000..9d61c9f5a2e9b4efe4475c7a1969bb966f6b6630 --- /dev/null +++ b/view/DataReference.resx @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +text/microsoft-resx1.3System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0uRHJhd2luZy5JY29uAgAAAAhJY29uRGF0YQhJY29uU2l6ZQcEAhNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAIAAAAJAwAAAAX8////E1N5c3RlbS5EcmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgCAAAAAAAAAAAAAAAPAwAAAL6UAAACAAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Bv///wz///8Q/v7+FP7+/hj///8a/v7+Hv7+/hT+/v4GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+Ev///0D+/v5U////cv///5H///+z////yf///9n+/v7n/v7++f///7////9q/v7+JP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/7yoEf+8qBH/vKgP/8GuH//Ux2X/7+rH//z79f///////////////+////98////EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4E/v7+Iv///3L////d/v7+//7+/P/49uf/5t6q/8azPv+6pBf/uKIT/7iiFP+4oRT/uKES/7egE/+3oBP/uKEU/7ehFf+3oRb/t6EW/7egFv+3oBb/t58U/7efFP+2nxb/tp8Y/8KvPv/u6Mn//v37/////+3+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///6f+/v79/Pv1/+/rxv/PwlL/wrEh/8GwH//BsB7/wbAf/8GwH//Brx//wK8e/8CuHf/Arh3/wa8e/7+sF/+9qhH/vKkR/7ypEf+8qRH/vKkQ/7yoDv+9qhT/xrQx/+fgqf/49+n//f35//7+/v/+/v7z////2f///53+/v5s////Xv///1j///9a/v7+ZP///3b+/v7J/v7+4/////H+/v79+/rz//Lu0//Wynb/wKwq/7mjE/+5oxL/uKIT/7iiE/+4ohT/uKET/7ihEv+4oRL/uKAT/7egFP+3oBX/t6AV/7ehFv+3oBb/t6AW/7efFP+2nxT/uaMf/9jMhf/6+PH///////7+/n7///8EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////JP///8P+/vz/6uSz/9nOc//YzG//4NeN/+HZlP/f147/4NiP/+DYj//g2I//4NeP/+DXj//g15D/4tqZ/87AT/++qxf/vaoQ/7ypEf+9qRH/vagQ/7ypEf+8qQ//vKgP/7+sG//Ov1D/5+Cr//Tx2P/5+Oz//f35//7+/v///////v7+///////////////////////+/v3/+/r0//f15f/y7tP/29CE/8OwLv+7pRT/uaQR/7mjEf+4ohH/uaMS/7mjEv+4ohP/uKIU/7ehFP+3oRL/uKES/7ihE/+3oBT/uKEU/7ihFf+3oRX/t6AW/7agFv+3oBf/wa03//Pv2f/+/vz/////9////zz///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+AP///wT///8E////BP///wT///8C/v7+AAAAAAAAAAAA/v7+Pv7+/tX9/fr/181x/8KyI//Mvkf/7Oe6//v68f/6+fD/+vnw//r58P/6+fD/+vnw//r58P/6+fD/+/rx/9vRf//Arh3/vaoR/72qEP+9qRD/vakR/72pEf+8qRD/vKgO/7uoDf+9qhT/wrAm/8q6Qv/a0H7/5+Gs/+7qxv/x7dD/8/DX//Tx2v/08dj/8u/U//DszP/r5bv/4diY/9LEZP/Fszf/vqog/7qlEv+5pA//uaQQ/7mjEf+5oxH/uaIS/7mjEv+5oxL/uKIT/7iiFP+4oRT/uKES/7ehEv+4oRP/uKEU/7ihFf+3oRX/t6AW/7egFv+9qCn/3NGO//39+//////3////s////yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/gL///80/v7+if7+/p////+f/v7+n////5////+f////g/7+/iAAAAAA/v7+QP///9f9/fr/1str/7+tFv/BsB3/2M5y//n47P/////////////////////////////////+/v7//v79/9zThP/Arh3/vaoR/72qEf+9qRH/vakR/72pEf+8qRH/vKgQ/7ypD/+8qA7/vKcO/7yoEP/ArR//xLIs/8a2OP/KukX/zsBV/9DDXf/Qwln/zL1N/8i3Pv/DsTL/wK0n/7yoGf+6pRH/uaQR/7mkEf+5pBD/uqQP/7mkEP+4oxH/uKMR/7iiEf+4ohL/uaMT/7iiE/+4ohT/uKIU/7ehEv+3oBL/uKET/7ihFP+3oBX/t6EW/7ijHP/Nvl//9PHd//7+/v3+/v7B/v7+Ov7+/gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zD+/v7D////+f/////+/v7///////7+/v/+/v7/////9/7+/qX///8e////Pv7+/tX9/fr/18xt/7+tFv+/rRb/wrEi/+rks//9/fr///////7+/t////9W/v7+SP///2b+/v7V/v79/9zSgv/Arh3/vKoR/72qEf+9qRH/vKkR/72pEf+9qRH/vKkQ/7ypEP+8qA//u6gO/7yoDv+8qA//u6gO/7unD/+7pxD/vKgT/7ypFf+8qBT/u6cR/7umDf+6pQ7/uqUP/7mkD/+5pBD/uqUR/7mkEf+5pBH/uqQQ/7mkD/+4oxH/uaMR/7ijEf+4oxL/uaMS/7iiE/+4ohP/uKIU/7ehE/+3oBH/uKES/7egE/+3oBT/uKEX/8SyQf/p4rf//fz5//7+/uP+/v5K/v7+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///7/+/v7//Pv0//bz3v/z8db/9fLZ//Px1//49uX//f36//7+/vn///+X////QP///9X9/fr/18xt/7+uFv+/rRb/v60W/8/BUP/w7Mj//v79///////+/v4u////AP///zL+/v7L/v79/9zSg//Brx7/vaoR/7yqEf+8qhH/vKkQ/72pEP+9qRD/vKkR/7yoEf+8qBH/vKgP/7yoDv+8pw7/vKgO/7yoD/+7pw//u6cP/7qnD/+7pw//u6YP/7umDv+6pQ3/uqUN/7qlDv+6pQ//uqUQ/7qlEP+5pBD/uqUR/7mkEf+5pA//uaQQ/7mjEP+5oxH/uaMS/7miEv+5ohP/uKIT/7iiFP+4oRP/uKES/7ihEv+4oRP/v6sv/+DWmv/6+O///v7+/f///5X+/v4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////DP7+/t/9/fr/7urB/8/EUv/HuDP/ybw8/8e5NP/a0Xn/9/Xi//7+/v////+5////RP7+/tX9/fr/18xt/7+tFv+/rRb/v64W/8KxIf/ZznX/9/Xj///////+/v65////OP7+/jz////L/v79/9zTg//BsB7/vasS/72qEf+9qhH/vaoQ/72qEf+9qhH/vakQ/72pEf+8qRH/vKkR/7ypD/+8qA7/u6gO/7yoDv+8qA//u6cP/7unDv+7pw//u6cP/7umD/+6pg7/u6YM/7umDf+6pQ7/uqUP/7mkEP+5pRD/uaQQ/7mkEf+6pBD/uaQP/7mkEP+5oxD/uaMR/7mjEv+5oxL/uaMS/7iiE/+4ohT/uKIU/7ihEv+6pBz/18p8//f15v/+/v3//v7+6////x4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EP///9/9/fn/6uWz/8q8PP/AsBr/wLAZ/8CwG//VymX/9fLb//7+/f////+5/v7+Rv7+/tX9/fr/181t/7+tFv+/rhb/v64V/7+uFv/FtSz/4NeP//r57//+/v79////zf///3r////L/v79/9zTg//BsB7/vasT/72qEv+9qhH/vKoQ/72qEf+8qhH/vakQ/7ypEf+9qRH/vakR/7ypEP+8qA7/vKgO/7yoDv+8qA//vKgP/7yoD/+7pw7/u6cP/7unD/+7pg//u6YN/7umDf+7pQ3/uqUP/7qlEP+5pBD/uqUQ/7mkEf+5pBH/uaUR/7mkD/+5pBD/uaMR/7iiEf+4ohH/uaMS/7ijE/+4ohP/uKIU/7qkGv/QwWT/9vPi//7+/f/+/v7t/v7+hwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EP///9/9/fn/6uW0/8u9P//BsRv/wLAY/8GxHf/Vy2j/9fPb//7+/f////+5////Rv///9X9/fr/181t/7+uFf++rRX/v64W/7+uFv+/rhf/xrcy/+bfpP/8+/b/////+/7+/tP////j/v79/9zTg//BsB7/vqsT/72rE/+9qhH/vaoR/72qEP+9qRH/vKkR/7ypEP+8qRD/vakR/7ypEf+7qBH/vKgP/7uoDv+7qA7/vKgP/7yoD/+7pw7/u6cP/7unD/+6pg//u6YP/7qmDv+6pg3/uqUO/7qlD/+5pQ//uqUQ/7mlEP+6pRH/uqUR/7qkEP+5pA//uaMQ/7mjEf+5oxL/uaIS/7miEv+4ohP/u6Yc/86+XP/z8Nr////+//7+/u3///+J/v7+GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////EP///9/9/fn/6ua1/8q+Pv/BsRr/wLAZ/8GxHP/Vymf/9fLb//7+/f/+/v65////Rv7+/tX9/fr/181t/7+uFv+/rhb/v64W/7+uFv++rhb/v64W/8W1LP/n4Kn//Pv1//////3+/v79/v79/9zTg//BsB7/vqwT/76rE/+9qxL/vaoS/72qEf+9qhH/vaoR/72qEf+9qRH/vKkQ/7ypEP+8qRH/vKkR/7yoD/+8qA7/vKgO/7uoDv+7pw7/u6cP/7unD/+7pg//u6cP/7umD/+7pg7/uqUN/7qlDf+6pQ7/uqUP/7mkEP+6pBD/uqUR/7mkEf+5pBH/uaQP/7mjEP+4oxH/uaMR/7mjEv+7phz/0MFi//Pv2P/+/v7/////5f///3r///8W////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////DP///9/9/fv/7+zG/9XLZv/NwUj/zcBH/83BSf/e1of/+Pbl//7+/v////+5////RP7+/tX9/fr/181t/8CuFv/ArhX/v64V/7+uFv++rhX/v64W/76uFv/Gti//5t+m//r58P///////v79/9zTg//BsB7/vawT/76sE/++qxP/vasT/72rEv+9qhH/vaoR/72qEf+9qhH/vKoR/72pEf+9qRH/vKkR/7ypEf+8qQ//vKgO/7yoDv+8qA7/u6gO/7unD/+7pw//u6cO/7umD/+7pw//u6YN/7umDf+7pg3/uqUO/7qlD/+5pBD/uqUQ/7mkEP+5pRH/uaQQ/7mkD/+5pBD/uaQQ/72pIf/Txm3/9PHb//7+/f/////n////VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///8n+/v7//Pv1//f04f/18tr/9fLa//Xy2v/49+j//f36//7+/v3+/v6j////QP///9X9/fr/181u/8CvFv/ArxX/wK8V/7+uFv+/rhb/v64V/7+uFv+/rhf/ybo6/+LbmP/5+Ov//v79/9zTg//Brx7/vqwT/76sEv+9qxP/vqwT/72rEv++qxL/vaoR/7yqEP+8qhH/vaoR/72qEf+9qRH/vakR/7ypEf+8qBD/vKgO/7yoDv+7qA7/vKgO/7yoDv+7pw//u6cP/7unDv+6pw//u6YP/7umDv+7pg3/u6YN/7qlDv+5pRD/uaUQ/7qkEP+6pRD/uqUR/7qkEP+6pA//wq8v/9rPgv/29OT//v37/////+////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///17////j/v7+///////+/v7///////7+/v/+/v7//v7+/////9H///9G////Pv7+/tX9/fr/181v/8CuGP/Arhb/wK8V/8CvFv+/rhb/v64W/76uFv++rhb/v68Y/8a3Mf/e1or/9/Xj/93Uhv/BsB7/vawS/76rE/++rBP/vawS/76rE/++qxP/vaoS/72qEf+9qhH/vakR/72qEf+9qhH/vakQ/72pEf+8qRH/vKkR/7ypD/+8qA7/vKgO/7unDv+8qA//vKgO/7unD/+7pw//u6cP/7umD/+7pg7/uqUN/7qlDf+5pA//uqUQ/7mkEP+5pRD/uqUR/7yoG//JuUb/49qe//n36v/+/v7/////7////4/+/v4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wj+/v4i////OP///1r+/v5m/v7+Zv///2z///98////sf7+/rn+/v6X/v7+nf///+H9/fr/181v/7+vGf/Arxj/wK4X/7+uFv+/rhb/v64W/7+uFv+/rhb/v64W/7+uFv/CsSH/29F7/9vQev/FtSz/vqwT/76sE/++rBP/vqwS/72rE/+9qxP/vasS/72qEf+9qhH/vaoR/7ypEP+9qhH/vaoR/72pEP+9qRD/vKkR/7ypEf+8qA7/vKgO/7yoDv+8qA//vKgO/7unD/+7pw//u6cP/7unD/+7pg//u6YO/7qlDf+6pQ7/uqUP/7qlEP+6pRH/wa4r/9PFZ//w68z//Pv2//7+/v3////R////UP///xD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////av7+/uX+/v7//v7+//7+/v////////////7+/v/9/fv/185w/8CwGf/Arxr/wK8b/8CvGf/Arxj/wK8X/7+uF/+/rhf/v64X/7+uF/+/rhf/v60X/9XJZv/b0Xv/y7xC/8CvHf++rBP/vawT/76sE/++rBP/vqsS/76rE/+9qxL/vaoR/72qEf+9qhH/vakQ/72qEf+9qRH/vKkR/72pEf+8qRD/vKkP/7yoDv+8qA7/vKgP/7uoD/+7qA//u6cO/7unD/+7pw//u6cP/7umDf+6pg7/u6YQ/8GtJv/Lu0z/6eK1//38+P///////v7+6/7+/qf///8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////4/7+/f/59+n/7+vG/+3ovf/u6sH/7unA/+7qwf/s57v/2tF5/9DFVv/Sx13/0sdd/9LGXf/Sxlz/0sZb/9LGW//Sxlv/0sZb/9LGW//SxVr/0cRX/+jirf/7+vD/7+rE/9nPdv/Mvkb/wrIl/72sE/+9qxL/vqwT/76sE/+9qxP/vqsS/72qEf+8qhD/vaoR/72qEf+9qhD/vakR/72pEf+9qRH/vKgR/7yoD/+8qA7/vKgO/7yoDv+8qA//u6cP/7unD/+7pw//u6cP/7unEv/EsjD/z8BW/+LZmf/39OP//fz5//////f////J////ZP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K/v7++/39+//r5rb/zsJM/8i7Nf/JvDn/ybs4/8m7Of/Iujb/29J8//Xy2v/39eT/9/Xj//f14v/39eL/9/Xi//f14v/39eL/9/Xi//f14v/39eL/9vTg//v68v///////fz5//n36//x7cz/3tWJ/9HEWf/Juj3/wrEj/72sEv+9qxL/vqsT/72rEv+8qhD/vKkQ/7yqEP+8qhD/vKkQ/72pEf+9qRH/vKkR/7ypEP+8qA7/u6gO/7yoDv+8qA//vKgP/72pE//CsSj/yrtF/9PGZv/m36j/9fPe//v68v/+/v3/////+f///7f///8+/v7+BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/n4aj/yLs2/8GyG//AsRr/wbEa/8GwGf/BsRv/3NN9//r57v/+/v7//v7+/////////////v7+/////////////////////////////v7+//////3////t////9f/////+/vz/+vnw//f15P/s573/3dSF/8/DVf/Juz3/xbYv/8KxI/+/rRj/vaoS/72qEf+9qhH/vaoR/72pEP+8qRH/vakR/7ypEf+8qRL/vqwZ/8GwI//FszD/yrpB/9PGYf/h2Zf/8u7S//j26f/8+/b////+///////////h/v7+XP///yD///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/o4qv/ybw6/8GyHP/Ashr/wbEa/8GxGf/BsRv/29J8//n47P///////v7+dP7+/kb///9G////Rv///0b///9G////Rv///0b///9G////TP///yT///8I////Hv///43+/v7X////5/7+/vv+/v3//v37//38+P/29OH/6+a5/+Pbmv/a0Hv/1cln/9DCVP/MvUf/y7xD/8u8Q//LvEX/zb5M/9HDWv/Wym3/3NKD/+Tdof/u6cP/+vnu//39+v/+/vz//v7+//7+/vX////f////wf///1b+/v4M/v7+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M////+/39+v/o4qz/yrw7/8GyHP/BsRr/wbIb/8GyGv/Bshz/29J8//n47P///////v7+VP7+/gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr///8Y/v7+Gv///xj///8g////Vv///5v///+3////5/7+/v/+/v7//v79//7+/P/+/vz//fz5//r58P/49+n/9/Xk//f14//49ub/+fjr//z79P/9/fv//v37//7+/P/+/v3//v7+//7+/vn+/v7R////r////3z///8cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4M/v7++/39+v/o4qr/yrw5/8KyG//Bshv/wbIb/8GyG//Bsh3/29J8//n46///////////VP///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8W////ZP7+/pX///+n////qf7+/qf///+r////o/7+/of+/v5U////dv///+n+/v7//v7+/////////////v7+//7+/v/+/v7////+/////v/+/v7///////////////////////7+/v//////////+f///7v///9E/v7+CP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8M/v7++/39+v/n4qj/yLoy/8KyG//Cshv/wbIb/8CxGv/Bsh3/2dB1//n46v//////////Vv///wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v5w/v7+6f7+/v/+/v7///////7+/v////////////////v////N/v7+JP7+/jz///9K/v7+Sv///0z+/v5M/v7+Tv///2D+/v67/////f/////////r////jf///1b///9O/v7+TP///0z+/v5K/v7+Rv7+/ij///8GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4I////9/79+//v7Mb/2M5t/9HFVf/UyF3/08hc/9LIW//QxVX/5d6f//v68v///////v7+Sv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wz+/v6r/v7+//b03//s57n/6uWz/+vltv/p5LL/7unC//r47f/////9////UgAAAAD///8A/v7+AP///wD+/v4A/v7+AP7+/gT///8Q/v7+Gv///xr///8W/v7+Cv///wL///8A////AP///wD+/v4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////FP///73+/v77//////7+/v/+/v7//v7+//7+/v/////p////aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7+BP///yj///9a/v7+h/7+/rH////B/v7+of7+/mb///9C////DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8C////Cv7+/hD+/v4U////Dv///wT///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////4D/////////////+AA/////////////wAA////////////+AAA////////////4AAA////////////wAAA////////////gAAA///////////+AAAA///////////8AAAA///////////4AAAA///////////wAAAA///////////gAAAA///////////AAAAA//////////+AAAAA//////////8AAAAA//////////8AAAAA//////////4AAAAA//////////wAAAAA//////////wAAAAA//////////gAAAAA//////////gAAAAH//////////AAAAB///////////AAAAD///////////AAAAf//////////+AAAA///////////+AAAB///////////8AAAD///////////8AAAH///////////8AAAH///////////8AAAP///////////8AAAf///////////4AAAf///////////4AAAf///////////4AAA////////////4AAA/////wAAH///4AAA/////gAAH///4AAA/////gAAD///4AAA/////gAAD///4AAA/////gAAD///4AAAf////gAAD///4AAAf////AAAD///8AAAf////AAAD///8AAAP////AAAH///8AAAH///+AAAH///8AAAH///8AAAH///8AAAD///8AAAH///+AAAD///4AAAP///+AAAB///4AAAP////AAAA///gAAAP////AAAAH/+AAAAf////AAAAD/8AAAAf////AAAAAfgAAAA/////AAAAAAAAAAA/////AAAAAAAAAAA///wHAAAAAAAAAAB///gDADgAAAAAAAD///ABADgAAAAAAAD///ABABgAAAAAAAH///ABAAgAAAAAAAH///ABAAAAAAAAAAP///ABAAAAAAAAAA////ABAAAAAAAAAB////ABAAAAAAAAAB////gDAAAAAAAAAD/////wAAAAAAAAAP/////AAAAAAAAAAf////+AAAAAAAAAB/////+AAAAAAAAAD/////+AAAAAAAAAP/////+AB//AAAAA//////+AB//4AAAH//////+AB/4DAAAf//////+AB/wB/g////////+AB/gB//////////+AB/gA///////////AB/gA//////////////gA//////////v///gA/////////4B///gB/////////4A///gB/////////4A///gB/////////4A///wB/////////4A//////////////4A//////////////4B//////////////+H/////////////////////////////////////////////////////////////////////////////////////////////8L \ No newline at end of file diff --git a/view/StateInfomation.cs b/view/StateInfomation.cs new file mode 100644 index 0000000000000000000000000000000000000000..2b634a03e2eb81fd06424f8d58689969206b1cda --- /dev/null +++ b/view/StateInfomation.cs @@ -0,0 +1,327 @@ +using MDL.Class; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace MDL +{ + public class StateInfomation : Form + { + public static StateInfo stateInfo; + + private List tabPages; + + private IContainer components = null; + + private Label label1; + + private TextBox textBox1; + + private TextBox textBox2; + + private Label label2; + + private Label label3; + + private ComboBox comboBox1; + + private Label label4; + + private TextBox textBox3; + + private Button button1; + + private Button button2; + + private Label label5; + + private Button button3; + + private TabControl tabControl1; + + private Button button4; + + public StateInfomation(StateInfo s) + { + InitializeComponent(); + stateInfo = s; + tabPages = new List(); + textBox1.Text = stateInfo.ID; + textBox2.Text = stateInfo.Name; + comboBox1.Text = stateInfo.Type; + textBox3.Text = stateInfo.Description; + Event[] events = stateInfo.Events; + if (events.Length == 0) + { + button3_Click(null, null); + return; + } + for (int i = 0; i < events.Length; i++) + { + EventPage eventPage = new EventPage(); + eventPage.Init(i + 1); + eventPage.Name = events[i].Name; + eventPage.Type = events[i].Type; + eventPage.Description = events[i].Description; + eventPage.Optional = events[i].Optional; + eventPage.Dataset = events[i].DatasetReference; + tabControl1.Controls.Add(eventPage.getPage()); + tabPages.Add(eventPage); + } + } + + private void button1_Click(object sender, EventArgs e) + { + List states = frm_mdl.States; + List