On a mad coding spree.

* Implemented AvatarManager, added the async functions
* Rebuilt the key2name functionality
* Fixed and cleaned up a lot of the teleporting code
* More functions implemented in GroupManager
* Renamed SecondLife.Avatar to SecondLife.Self
* Updated the groupmanager example to list group members
* Renamed Form1.cs to AnimationSample.cs

git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@386 52acb1d6-8a22-11de-b505-999d5b087335
This commit is contained in:
John Hurliman
2006-10-24 11:16:26 +00:00
parent f079a2b342
commit 9830bf85e4
21 changed files with 636 additions and 649 deletions

View File

@@ -1,152 +1,152 @@
namespace AnimationSample
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
try
{
client.Network.Logout();
}
catch
{
//ignore
}
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.txtLast = new System.Windows.Forms.TextBox();
this.txtFirst = new System.Windows.Forms.TextBox();
this.txtPassword = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.btnLogin = new System.Windows.Forms.Button();
this.btnPlay = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// txtLast
//
this.txtLast.Location = new System.Drawing.Point(162, 33);
this.txtLast.Name = "txtLast";
this.txtLast.Size = new System.Drawing.Size(133, 20);
this.txtLast.TabIndex = 0;
this.txtLast.Text = "Malthus";
//
// txtFirst
//
this.txtFirst.Location = new System.Drawing.Point(23, 33);
this.txtFirst.Name = "txtFirst";
this.txtFirst.Size = new System.Drawing.Size(133, 20);
this.txtFirst.TabIndex = 0;
this.txtFirst.Text = "Jesse";
//
// txtPassword
//
this.txtPassword.Location = new System.Drawing.Point(301, 33);
this.txtPassword.Name = "txtPassword";
this.txtPassword.PasswordChar = '*';
this.txtPassword.Size = new System.Drawing.Size(133, 20);
this.txtPassword.TabIndex = 0;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(159, 17);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(58, 13);
this.label1.TabIndex = 1;
this.label1.Text = "Last Name";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(20, 17);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(57, 13);
this.label2.TabIndex = 1;
this.label2.Text = "First Name";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(298, 17);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 13);
this.label3.TabIndex = 1;
this.label3.Text = "Password";
//
// btnLogin
//
this.btnLogin.Location = new System.Drawing.Point(305, 61);
this.btnLogin.Name = "btnLogin";
this.btnLogin.Size = new System.Drawing.Size(128, 29);
this.btnLogin.TabIndex = 2;
this.btnLogin.Text = "Login";
this.btnLogin.UseVisualStyleBackColor = true;
this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
//
// btnPlay
//
this.btnPlay.Location = new System.Drawing.Point(162, 131);
this.btnPlay.Name = "btnPlay";
this.btnPlay.Size = new System.Drawing.Size(133, 42);
this.btnPlay.TabIndex = 3;
this.btnPlay.Text = "Play \"dance1\" animation";
this.btnPlay.UseVisualStyleBackColor = true;
this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(464, 196);
this.Controls.Add(this.btnPlay);
this.Controls.Add(this.btnLogin);
this.Controls.Add(this.label2);
this.Controls.Add(this.label3);
this.Controls.Add(this.label1);
this.Controls.Add(this.txtPassword);
this.Controls.Add(this.txtFirst);
this.Controls.Add(this.txtLast);
this.Name = "Form1";
this.Text = "LibSL Animation Example";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox txtLast;
private System.Windows.Forms.TextBox txtFirst;
private System.Windows.Forms.TextBox txtPassword;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button btnLogin;
private System.Windows.Forms.Button btnPlay;
}
}
namespace AnimationSample
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
try
{
client.Network.Logout();
}
catch
{
//ignore
}
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.txtLast = new System.Windows.Forms.TextBox();
this.txtFirst = new System.Windows.Forms.TextBox();
this.txtPassword = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.btnLogin = new System.Windows.Forms.Button();
this.btnPlay = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// txtLast
//
this.txtLast.Location = new System.Drawing.Point(162, 33);
this.txtLast.Name = "txtLast";
this.txtLast.Size = new System.Drawing.Size(133, 20);
this.txtLast.TabIndex = 0;
this.txtLast.Text = "Malthus";
//
// txtFirst
//
this.txtFirst.Location = new System.Drawing.Point(23, 33);
this.txtFirst.Name = "txtFirst";
this.txtFirst.Size = new System.Drawing.Size(133, 20);
this.txtFirst.TabIndex = 0;
this.txtFirst.Text = "Jesse";
//
// txtPassword
//
this.txtPassword.Location = new System.Drawing.Point(301, 33);
this.txtPassword.Name = "txtPassword";
this.txtPassword.PasswordChar = '*';
this.txtPassword.Size = new System.Drawing.Size(133, 20);
this.txtPassword.TabIndex = 0;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(159, 17);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(58, 13);
this.label1.TabIndex = 1;
this.label1.Text = "Last Name";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(20, 17);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(57, 13);
this.label2.TabIndex = 1;
this.label2.Text = "First Name";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(298, 17);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 13);
this.label3.TabIndex = 1;
this.label3.Text = "Password";
//
// btnLogin
//
this.btnLogin.Location = new System.Drawing.Point(305, 61);
this.btnLogin.Name = "btnLogin";
this.btnLogin.Size = new System.Drawing.Size(128, 29);
this.btnLogin.TabIndex = 2;
this.btnLogin.Text = "Login";
this.btnLogin.UseVisualStyleBackColor = true;
this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
//
// btnPlay
//
this.btnPlay.Location = new System.Drawing.Point(162, 131);
this.btnPlay.Name = "btnPlay";
this.btnPlay.Size = new System.Drawing.Size(133, 42);
this.btnPlay.TabIndex = 3;
this.btnPlay.Text = "Play \"dance1\" animation";
this.btnPlay.UseVisualStyleBackColor = true;
this.btnPlay.Click += new System.EventHandler(this.btnPlay_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(464, 196);
this.Controls.Add(this.btnPlay);
this.Controls.Add(this.btnLogin);
this.Controls.Add(this.label2);
this.Controls.Add(this.label3);
this.Controls.Add(this.label1);
this.Controls.Add(this.txtPassword);
this.Controls.Add(this.txtFirst);
this.Controls.Add(this.txtLast);
this.Name = "Form1";
this.Text = "LibSL Animation Example";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox txtLast;
private System.Windows.Forms.TextBox txtFirst;
private System.Windows.Forms.TextBox txtPassword;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button btnLogin;
private System.Windows.Forms.Button btnPlay;
}
}

View File

@@ -1,71 +1,71 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using libsecondlife;
using libsecondlife.Packets;
using System.Collections;
namespace AnimationSample
{
public partial class Form1 : Form
{
SecondLife client;
public Form1()
{
InitializeComponent();
//Create the SecondLife client object
client = new SecondLife();
}
private void btnPlay_Click(object sender, EventArgs e)
{
//Build an animation packet
AgentAnimationPacket packet = new AgentAnimationPacket();
//create an AgentData block
AgentAnimationPacket.AgentDataBlock agentdata = new AgentAnimationPacket.AgentDataBlock();
//Fill in its values
agentdata.AgentID = client.Avatar.ID;
agentdata.SessionID = client.Network.SessionID;
//Add it in the packet
packet.AgentData = agentdata;
//Create an AnimationList block
AgentAnimationPacket.AnimationListBlock anims = new AgentAnimationPacket.AnimationListBlock();
//Set the UUID of the animation to avatar_dance1.bvh, a standard animation
anims.AnimID = new LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d");
//Start the animation
anims.StartAnim = true;
//Add it to the packet. SInce it's a Variable number block, we have to construct an array.
packet.AnimationList = new AgentAnimationPacket.AnimationListBlock[] { anims };
//Send the packet
client.Network.SendPacket(packet);
}
private void btnLogin_Click(object sender, EventArgs e)
{
//Login information
Dictionary<string, object> loginParams = NetworkManager.DefaultLoginValues(txtFirst.Text, txtLast.Text, txtPassword.Text, "00:00:00:00:00:00",
"last", 1, 12, 12, 12, "Win", "0", "animationsample", "jessemalthus@gmail.com");
Hashtable loginReply = new Hashtable();
// Login
if (!client.Network.Login(loginParams))
{
// Login failed
MessageBox.Show("We're sorry, but login failed. Error: \n " + client.Network.LoginError);
}
else
{
MessageBox.Show("Login succeded. You're at " + client.Avatar.Position + " on " + client.Network.CurrentSim.Region.Name);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using libsecondlife;
using libsecondlife.Packets;
using System.Collections;
namespace AnimationSample
{
public partial class Form1 : Form
{
SecondLife client;
public Form1()
{
InitializeComponent();
//Create the SecondLife client object
client = new SecondLife();
}
private void btnPlay_Click(object sender, EventArgs e)
{
//Build an animation packet
AgentAnimationPacket packet = new AgentAnimationPacket();
//create an AgentData block
AgentAnimationPacket.AgentDataBlock agentdata = new AgentAnimationPacket.AgentDataBlock();
//Fill in its values
agentdata.AgentID = client.Self.ID;
agentdata.SessionID = client.Network.SessionID;
//Add it in the packet
packet.AgentData = agentdata;
//Create an AnimationList block
AgentAnimationPacket.AnimationListBlock anims = new AgentAnimationPacket.AnimationListBlock();
//Set the UUID of the animation to avatar_dance1.bvh, a standard animation
anims.AnimID = new LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d");
//Start the animation
anims.StartAnim = true;
//Add it to the packet. SInce it's a Variable number block, we have to construct an array.
packet.AnimationList = new AgentAnimationPacket.AnimationListBlock[] { anims };
//Send the packet
client.Network.SendPacket(packet);
}
private void btnLogin_Click(object sender, EventArgs e)
{
//Login information
Dictionary<string, object> loginParams = NetworkManager.DefaultLoginValues(txtFirst.Text, txtLast.Text, txtPassword.Text, "00:00:00:00:00:00",
"last", 1, 12, 12, 12, "Win", "0", "animationsample", "jessemalthus@gmail.com");
Hashtable loginReply = new Hashtable();
// Login
if (!client.Network.Login(loginParams))
{
// Login failed
MessageBox.Show("We're sorry, but login failed. Error: \n " + client.Network.LoginError);
}
else
{
MessageBox.Show("Login succeded. You're at " + client.Self.Position + " on " + client.Network.CurrentSim.Region.Name);
}
}
}
}

View File

@@ -14,7 +14,7 @@
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<OutputPath>..\..\..\bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
@@ -36,17 +36,17 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Form1.cs">
<Compile Include="AnimationSample.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
<Compile Include="AnimationSample.Designer.cs">
<DependentUpon>AnimationSample.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<EmbeddedResource Include="AnimationSample.resx">
<SubType>Designer</SubType>
<DependentUpon>Form1.cs</DependentUpon>
<DependentUpon>AnimationSample.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>

View File

@@ -1,120 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>