aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-12-05 20:50:44 +0000
committerJustin Clark-Casey (justincc)2011-12-05 20:50:44 +0000
commitaf9ccfa15c60a889851c228ca175daa429ca966a (patch)
tree8fa21a0d15b197689bfc6fa911bc7ea8d0d1c80b /OpenSim/Region
parentImplement IOSHttpRequest and IOSHttpResponse http interfaces and use instead ... (diff)
parentMerge branch 'master' of melanie@opensimulator.org:/var/git/opensim (diff)
downloadopensim-SC_OLD-af9ccfa15c60a889851c228ca175daa429ca966a.zip
opensim-SC_OLD-af9ccfa15c60a889851c228ca175daa429ca966a.tar.gz
opensim-SC_OLD-af9ccfa15c60a889851c228ca175daa429ca966a.tar.bz2
opensim-SC_OLD-af9ccfa15c60a889851c228ca175daa429ca966a.tar.xz
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs82
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs36
4 files changed, 67 insertions, 65 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs
index f2c8b3d..18bd018 100644
--- a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs
@@ -355,7 +355,7 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture
355 // I'm pretty sure noone whats to set fullbright true if it wasn't true before. 355 // I'm pretty sure noone whats to set fullbright true if it wasn't true before.
356 // tmptex.DefaultTexture.Fullbright = true; 356 // tmptex.DefaultTexture.Fullbright = true;
357 357
358 part.UpdateTexture(tmptex); 358 part.UpdateTextureEntry(tmptex.GetBytes());
359 } 359 }
360 360
361 if (oldID != UUID.Zero && ((Disp & DISP_EXPIRE) != 0)) 361 if (oldID != UUID.Zero && ((Disp & DISP_EXPIRE) != 0))
@@ -437,4 +437,4 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture
437 437
438 #endregion 438 #endregion
439 } 439 }
440} \ No newline at end of file 440}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index dcbcfa3..c8b39a4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3178,7 +3178,10 @@ namespace OpenSim.Region.Framework.Scenes
3178 /// <param name="face"></param> 3178 /// <param name="face"></param>
3179 public void SetFaceColor(Vector3 color, int face) 3179 public void SetFaceColor(Vector3 color, int face)
3180 { 3180 {
3181 Primitive.TextureEntry tex = Shape.Textures; 3181 // The only way to get a deep copy/ If we don't do this, we can
3182 // mever detect color changes further down.
3183 Byte[] buf = Shape.Textures.GetBytes();
3184 Primitive.TextureEntry tex = new Primitive.TextureEntry(buf, 0, buf.Length);
3182 Color4 texcolor; 3185 Color4 texcolor;
3183 if (face >= 0 && face < GetNumberOfSides()) 3186 if (face >= 0 && face < GetNumberOfSides())
3184 { 3187 {
@@ -3187,8 +3190,7 @@ namespace OpenSim.Region.Framework.Scenes
3187 texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f); 3190 texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f);
3188 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); 3191 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f);
3189 tex.FaceTextures[face].RGBA = texcolor; 3192 tex.FaceTextures[face].RGBA = texcolor;
3190 UpdateTexture(tex); 3193 UpdateTextureEntry(tex.GetBytes());
3191 TriggerScriptChangedEvent(Changed.COLOR);
3192 return; 3194 return;
3193 } 3195 }
3194 else if (face == ALL_SIDES) 3196 else if (face == ALL_SIDES)
@@ -3209,8 +3211,7 @@ namespace OpenSim.Region.Framework.Scenes
3209 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); 3211 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f);
3210 tex.DefaultTexture.RGBA = texcolor; 3212 tex.DefaultTexture.RGBA = texcolor;
3211 } 3213 }
3212 UpdateTexture(tex); 3214 UpdateTextureEntry(tex.GetBytes());
3213 TriggerScriptChangedEvent(Changed.COLOR);
3214 return; 3215 return;
3215 } 3216 }
3216 } 3217 }
@@ -4538,48 +4539,49 @@ namespace OpenSim.Region.Framework.Scenes
4538 } 4539 }
4539 4540
4540 /// <summary> 4541 /// <summary>
4541 /// Update the textures on the part.
4542 /// </summary>
4543 /// <remarks>
4544 /// Added to handle bug in libsecondlife's TextureEntry.ToBytes()
4545 /// not handling RGBA properly. Cycles through, and "fixes" the color
4546 /// info
4547 /// </remarks>
4548 /// <param name="tex"></param>
4549 public void UpdateTexture(Primitive.TextureEntry tex)
4550 {
4551 //Color4 tmpcolor;
4552 //for (uint i = 0; i < 32; i++)
4553 //{
4554 // if (tex.FaceTextures[i] != null)
4555 // {
4556 // tmpcolor = tex.GetFace((uint) i).RGBA;
4557 // tmpcolor.A = tmpcolor.A*255;
4558 // tmpcolor.R = tmpcolor.R*255;
4559 // tmpcolor.G = tmpcolor.G*255;
4560 // tmpcolor.B = tmpcolor.B*255;
4561 // tex.FaceTextures[i].RGBA = tmpcolor;
4562 // }
4563 //}
4564 //tmpcolor = tex.DefaultTexture.RGBA;
4565 //tmpcolor.A = tmpcolor.A*255;
4566 //tmpcolor.R = tmpcolor.R*255;
4567 //tmpcolor.G = tmpcolor.G*255;
4568 //tmpcolor.B = tmpcolor.B*255;
4569 //tex.DefaultTexture.RGBA = tmpcolor;
4570 UpdateTextureEntry(tex.GetBytes());
4571 }
4572
4573 /// <summary>
4574 /// Update the texture entry for this part. 4542 /// Update the texture entry for this part.
4575 /// </summary> 4543 /// </summary>
4576 /// <param name="textureEntry"></param> 4544 /// <param name="textureEntry"></param>
4577 public void UpdateTextureEntry(byte[] textureEntry) 4545 public void UpdateTextureEntry(byte[] textureEntry)
4578 { 4546 {
4579 m_shape.TextureEntry = textureEntry; 4547 Primitive.TextureEntry newTex = new Primitive.TextureEntry(textureEntry, 0, textureEntry.Length);
4580 TriggerScriptChangedEvent(Changed.TEXTURE); 4548 Primitive.TextureEntry oldTex = Shape.Textures;
4549
4550 Changed changeFlags = 0;
4581 4551
4552 for (int i = 0 ; i < GetNumberOfSides(); i++)
4553 {
4554 Primitive.TextureEntryFace newFace = newTex.DefaultTexture;
4555 Primitive.TextureEntryFace oldFace = oldTex.DefaultTexture;
4556
4557 if (oldTex.FaceTextures[i] != null)
4558 oldFace = oldTex.FaceTextures[i];
4559 if (newTex.FaceTextures[i] != null)
4560 newFace = newTex.FaceTextures[i];
4561
4562 Color4 oldRGBA = oldFace.RGBA;
4563 Color4 newRGBA = newFace.RGBA;
4564
4565 if (oldRGBA.R != newRGBA.R ||
4566 oldRGBA.G != newRGBA.G ||
4567 oldRGBA.B != newRGBA.B ||
4568 oldRGBA.A != newRGBA.A)
4569 changeFlags |= Changed.COLOR;
4570
4571 if (oldFace.TextureID != newFace.TextureID)
4572 changeFlags |= Changed.TEXTURE;
4573
4574 // Max change, skip the rest of testing
4575 if (changeFlags == (Changed.TEXTURE | Changed.COLOR))
4576 break;
4577 }
4578
4579 m_shape.TextureEntry = textureEntry;
4580 if (changeFlags != 0)
4581 TriggerScriptChangedEvent(changeFlags);
4582 UpdateFlag = UpdateRequired.FULL;
4582 ParentGroup.HasGroupChanged = true; 4583 ParentGroup.HasGroupChanged = true;
4584
4583 //This is madness.. 4585 //This is madness..
4584 //ParentGroup.ScheduleGroupForFullUpdate(); 4586 //ParentGroup.ScheduleGroupForFullUpdate();
4585 //This is sparta 4587 //This is sparta
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs
index 0cba6af..cea738c 100644
--- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectMaterial.cs
@@ -55,7 +55,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
55 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); 55 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
56 texface.RGBA = new Color4(value.R,value.G,value.B,value.A); 56 texface.RGBA = new Color4(value.R,value.G,value.B,value.A);
57 tex.FaceTextures[m_face] = texface; 57 tex.FaceTextures[m_face] = texface;
58 m_parent.UpdateTexture(tex); 58 m_parent.UpdateTextureEntry(tex.GetBytes());
59 } 59 }
60 } 60 }
61 61
@@ -72,7 +72,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
72 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); 72 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
73 texface.TextureID = value; 73 texface.TextureID = value;
74 tex.FaceTextures[m_face] = texface; 74 tex.FaceTextures[m_face] = texface;
75 m_parent.UpdateTexture(tex); 75 m_parent.UpdateTextureEntry(tex.GetBytes());
76 } 76 }
77 } 77 }
78 78
@@ -97,7 +97,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
97 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); 97 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
98 texface.Fullbright = value; 98 texface.Fullbright = value;
99 tex.FaceTextures[m_face] = texface; 99 tex.FaceTextures[m_face] = texface;
100 m_parent.UpdateTexture(tex); 100 m_parent.UpdateTextureEntry(tex.GetBytes());
101 } 101 }
102 } 102 }
103 103
@@ -110,7 +110,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
110 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); 110 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
111 texface.Glow = (float) value; 111 texface.Glow = (float) value;
112 tex.FaceTextures[m_face] = texface; 112 tex.FaceTextures[m_face] = texface;
113 m_parent.UpdateTexture(tex); 113 m_parent.UpdateTextureEntry(tex.GetBytes());
114 } 114 }
115 } 115 }
116 116
@@ -123,7 +123,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
123 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face); 123 Primitive.TextureEntryFace texface = tex.CreateFace((uint)m_face);
124 texface.Shiny = value ? Shininess.High : Shininess.None; 124 texface.Shiny = value ? Shininess.High : Shininess.None;
125 tex.FaceTextures[m_face] = texface; 125 tex.FaceTextures[m_face] = texface;
126 m_parent.UpdateTexture(tex); 126 m_parent.UpdateTextureEntry(tex.GetBytes());
127 } 127 }
128 } 128 }
129 129
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 6c418df..6d067b0 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1424,7 +1424,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1424 { 1424 {
1425 tex.CreateFace((uint) face); 1425 tex.CreateFace((uint) face);
1426 tex.FaceTextures[face].TexMapType = textype; 1426 tex.FaceTextures[face].TexMapType = textype;
1427 part.UpdateTexture(tex); 1427 part.UpdateTextureEntry(tex.GetBytes());
1428 return; 1428 return;
1429 } 1429 }
1430 else if (face == ScriptBaseClass.ALL_SIDES) 1430 else if (face == ScriptBaseClass.ALL_SIDES)
@@ -1437,7 +1437,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1437 } 1437 }
1438 tex.DefaultTexture.TexMapType = textype; 1438 tex.DefaultTexture.TexMapType = textype;
1439 } 1439 }
1440 part.UpdateTexture(tex); 1440 part.UpdateTextureEntry(tex.GetBytes());
1441 return; 1441 return;
1442 } 1442 }
1443 } 1443 }
@@ -1449,7 +1449,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1449 { 1449 {
1450 tex.CreateFace((uint) face); 1450 tex.CreateFace((uint) face);
1451 tex.FaceTextures[face].Glow = glow; 1451 tex.FaceTextures[face].Glow = glow;
1452 part.UpdateTexture(tex); 1452 part.UpdateTextureEntry(tex.GetBytes());
1453 return; 1453 return;
1454 } 1454 }
1455 else if (face == ScriptBaseClass.ALL_SIDES) 1455 else if (face == ScriptBaseClass.ALL_SIDES)
@@ -1462,7 +1462,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1462 } 1462 }
1463 tex.DefaultTexture.Glow = glow; 1463 tex.DefaultTexture.Glow = glow;
1464 } 1464 }
1465 part.UpdateTexture(tex); 1465 part.UpdateTextureEntry(tex.GetBytes());
1466 return; 1466 return;
1467 } 1467 }
1468 } 1468 }
@@ -1497,7 +1497,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1497 tex.CreateFace((uint) face); 1497 tex.CreateFace((uint) face);
1498 tex.FaceTextures[face].Shiny = sval; 1498 tex.FaceTextures[face].Shiny = sval;
1499 tex.FaceTextures[face].Bump = bump; 1499 tex.FaceTextures[face].Bump = bump;
1500 part.UpdateTexture(tex); 1500 part.UpdateTextureEntry(tex.GetBytes());
1501 return; 1501 return;
1502 } 1502 }
1503 else if (face == ScriptBaseClass.ALL_SIDES) 1503 else if (face == ScriptBaseClass.ALL_SIDES)
@@ -1512,7 +1512,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1512 tex.DefaultTexture.Shiny = sval; 1512 tex.DefaultTexture.Shiny = sval;
1513 tex.DefaultTexture.Bump = bump; 1513 tex.DefaultTexture.Bump = bump;
1514 } 1514 }
1515 part.UpdateTexture(tex); 1515 part.UpdateTextureEntry(tex.GetBytes());
1516 return; 1516 return;
1517 } 1517 }
1518 } 1518 }
@@ -1524,7 +1524,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1524 { 1524 {
1525 tex.CreateFace((uint) face); 1525 tex.CreateFace((uint) face);
1526 tex.FaceTextures[face].Fullbright = bright; 1526 tex.FaceTextures[face].Fullbright = bright;
1527 part.UpdateTexture(tex); 1527 part.UpdateTextureEntry(tex.GetBytes());
1528 return; 1528 return;
1529 } 1529 }
1530 else if (face == ScriptBaseClass.ALL_SIDES) 1530 else if (face == ScriptBaseClass.ALL_SIDES)
@@ -1537,7 +1537,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1537 } 1537 }
1538 } 1538 }
1539 tex.DefaultTexture.Fullbright = bright; 1539 tex.DefaultTexture.Fullbright = bright;
1540 part.UpdateTexture(tex); 1540 part.UpdateTextureEntry(tex.GetBytes());
1541 return; 1541 return;
1542 } 1542 }
1543 } 1543 }
@@ -1593,7 +1593,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1593 texcolor = tex.CreateFace((uint)face).RGBA; 1593 texcolor = tex.CreateFace((uint)face).RGBA;
1594 texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f); 1594 texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f);
1595 tex.FaceTextures[face].RGBA = texcolor; 1595 tex.FaceTextures[face].RGBA = texcolor;
1596 part.UpdateTexture(tex); 1596 part.UpdateTextureEntry(tex.GetBytes());
1597 return; 1597 return;
1598 } 1598 }
1599 else if (face == ScriptBaseClass.ALL_SIDES) 1599 else if (face == ScriptBaseClass.ALL_SIDES)
@@ -1617,7 +1617,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1617 tex.DefaultTexture.RGBA = texcolor; 1617 tex.DefaultTexture.RGBA = texcolor;
1618 } 1618 }
1619 1619
1620 part.UpdateTexture(tex); 1620 part.UpdateTextureEntry(tex.GetBytes());
1621 return; 1621 return;
1622 } 1622 }
1623 } 1623 }
@@ -1774,7 +1774,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1774 Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); 1774 Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
1775 texface.TextureID = textureID; 1775 texface.TextureID = textureID;
1776 tex.FaceTextures[face] = texface; 1776 tex.FaceTextures[face] = texface;
1777 part.UpdateTexture(tex); 1777 part.UpdateTextureEntry(tex.GetBytes());
1778 return; 1778 return;
1779 } 1779 }
1780 else if (face == ScriptBaseClass.ALL_SIDES) 1780 else if (face == ScriptBaseClass.ALL_SIDES)
@@ -1787,7 +1787,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1787 } 1787 }
1788 } 1788 }
1789 tex.DefaultTexture.TextureID = textureID; 1789 tex.DefaultTexture.TextureID = textureID;
1790 part.UpdateTexture(tex); 1790 part.UpdateTextureEntry(tex.GetBytes());
1791 return; 1791 return;
1792 } 1792 }
1793 } 1793 }
@@ -1809,7 +1809,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1809 texface.RepeatU = (float)u; 1809 texface.RepeatU = (float)u;
1810 texface.RepeatV = (float)v; 1810 texface.RepeatV = (float)v;
1811 tex.FaceTextures[face] = texface; 1811 tex.FaceTextures[face] = texface;
1812 part.UpdateTexture(tex); 1812 part.UpdateTextureEntry(tex.GetBytes());
1813 return; 1813 return;
1814 } 1814 }
1815 if (face == ScriptBaseClass.ALL_SIDES) 1815 if (face == ScriptBaseClass.ALL_SIDES)
@@ -1824,7 +1824,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1824 } 1824 }
1825 tex.DefaultTexture.RepeatU = (float)u; 1825 tex.DefaultTexture.RepeatU = (float)u;
1826 tex.DefaultTexture.RepeatV = (float)v; 1826 tex.DefaultTexture.RepeatV = (float)v;
1827 part.UpdateTexture(tex); 1827 part.UpdateTextureEntry(tex.GetBytes());
1828 return; 1828 return;
1829 } 1829 }
1830 } 1830 }
@@ -1845,7 +1845,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1845 texface.OffsetU = (float)u; 1845 texface.OffsetU = (float)u;
1846 texface.OffsetV = (float)v; 1846 texface.OffsetV = (float)v;
1847 tex.FaceTextures[face] = texface; 1847 tex.FaceTextures[face] = texface;
1848 part.UpdateTexture(tex); 1848 part.UpdateTextureEntry(tex.GetBytes());
1849 return; 1849 return;
1850 } 1850 }
1851 if (face == ScriptBaseClass.ALL_SIDES) 1851 if (face == ScriptBaseClass.ALL_SIDES)
@@ -1860,7 +1860,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1860 } 1860 }
1861 tex.DefaultTexture.OffsetU = (float)u; 1861 tex.DefaultTexture.OffsetU = (float)u;
1862 tex.DefaultTexture.OffsetV = (float)v; 1862 tex.DefaultTexture.OffsetV = (float)v;
1863 part.UpdateTexture(tex); 1863 part.UpdateTextureEntry(tex.GetBytes());
1864 return; 1864 return;
1865 } 1865 }
1866 } 1866 }
@@ -1880,7 +1880,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1880 Primitive.TextureEntryFace texface = tex.CreateFace((uint)face); 1880 Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
1881 texface.Rotation = (float)rotation; 1881 texface.Rotation = (float)rotation;
1882 tex.FaceTextures[face] = texface; 1882 tex.FaceTextures[face] = texface;
1883 part.UpdateTexture(tex); 1883 part.UpdateTextureEntry(tex.GetBytes());
1884 return; 1884 return;
1885 } 1885 }
1886 if (face == ScriptBaseClass.ALL_SIDES) 1886 if (face == ScriptBaseClass.ALL_SIDES)
@@ -1893,7 +1893,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1893 } 1893 }
1894 } 1894 }
1895 tex.DefaultTexture.Rotation = (float)rotation; 1895 tex.DefaultTexture.Rotation = (float)rotation;
1896 part.UpdateTexture(tex); 1896 part.UpdateTextureEntry(tex.GetBytes());
1897 return; 1897 return;
1898 } 1898 }
1899 } 1899 }