diff --git a/.hgtags b/.hgtags
index 1187586eb8229b6103941618a35c8dedc4b81dad..f32e71f85c18d79eb615a75554124fb4a32fb74e 100644
--- a/.hgtags
+++ b/.hgtags
@@ -105,8 +105,12 @@ d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
 d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1
 0630e977504af5ea320c58d33cae4e1ddee793e9 DRTVWR-48_2.6.3-beta2
 0630e977504af5ea320c58d33cae4e1ddee793e9 2.6.3-beta2
-74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start
-74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start
-f632f87bb71b0f13d21f2f64b0c42cedb008c749 2.6.4-start
+7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd DRTVWR-50_2.6.5-beta1
+7db558aaa7c176f2022b3e9cfe38ac72f6d1fccd 2.6.5-beta1
 800cefce8d364ffdd2f383cbecb91294da3ea424 2.6.6-start
-ce588bc1ae8e3a90ee5e1f5de71a346886a9fd8b 2.6.7-start
+bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 DRTVWR-52_2.6.6-beta1
+bb1075286b3b147b1dae2e3d6b2d56f04ff03f35 2.6.6-beta1
+5e349dbe9cc84ea5795af8aeb6d473a0af9d4953 2.6.8-start
+11d5d8080e67c3955914caf98f2eb116af30e55a 2.6.9-start
+11d5d8080e67c3955914caf98f2eb116af30e55a 2.6.9-start
+e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
diff --git a/BuildParams b/BuildParams
index 2b374e133c78a763829ec0f9bab62b318dd3b20a..0a193803da75dc9da03e5ac2552757a424868617 100644
--- a/BuildParams
+++ b/BuildParams
@@ -201,13 +201,6 @@ viewer-tut-teamcity.email = enus@lindenlab.com
 viewer-tut-teamcity.build_server = false
 viewer-tut-teamcity.build_server_tests = false
 
-# ========================================
-# experience
-# ========================================
-viewer-experience.public_build = false
-viewer-experience.viewer_channel = "Second Life SkyLight Viewer"
-viewer-experience.login_channel = "Second Life SkyLight Viewer"
-
 # =================================================================
 # asset delivery 2010 projects
 # =================================================================
diff --git a/autobuild.xml b/autobuild.xml
index 04f789ef01f8d5f7cb621625efaea9d7f0a63f13..2c8a254a75faa4d79fdeddfd4d7f69f2eab550c1 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1,2519 +1,2491 @@
-<?xml version="1.0" ?>
-<llsd>
-<map>
-    <key>installables</key>
-    <map>
-      <key>GLOD</key>
-      <map>
-        <key>license</key>
-        <string>GLOD</string>
-        <key>license_file</key>
-        <string>LICENSES/glod.txt</string>
-        <key>name</key>
-        <string>GLOD</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>7c546f54f6ed654f713c778af3925dd4</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226566/arch/Darwin/installer/glod-1.0pre4-darwin-20110413.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>18c708163d2a669bc3c030b05b4ebe61</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226657/arch/Linux/installer/glod-1.0pre4-linux-20110414.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>c4ae6cddc04e0b2908a301726a53922c</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/226194/arch/CYGWIN/installer/glod-1.0pre4-windows-20110408.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>SDL</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/SDL.txt</string>
-        <key>name</key>
-        <string>SDL</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>69ae3b1c9cdb0ebc0d0e1ac8413e3eb7</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.14-linux-20110309.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>apr_suite</key>
-      <map>
-        <key>license</key>
-        <string>apache</string>
-        <key>license_file</key>
-        <string>LICENSES/apr_suite.txt</string>
-        <key>name</key>
-        <string>apr_suite</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>9868bfa0b6954e4884c49c6f30068c80</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-darwin-20110217.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>ff62946c518a247c86e1066c1e9a5855</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-linux-20110309.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>73785c200a5b4ef74a1230b028bb680d</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-windows-20110217.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>ares</key>
-      <map>
-        <key>license</key>
-        <string>c-ares</string>
-        <key>license_file</key>
-        <string>LICENSES/c-ares.txt</string>
-        <key>name</key>
-        <string>ares</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>e6caaeea16131e1f2343ecd7765e3147</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20110217.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>0745872db83d45f4ab3bdc697d98e264</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/223275/arch/Linux/installer/ares-1.7.1-linux-20110310.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>1dcec6babd249a2597114d4ac226c461</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/220963/arch/CYGWIN/installer/ares-1.7.1-windows-20110211.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>boost</key>
-      <map>
-        <key>license</key>
-        <string>boost</string>
-        <key>license_file</key>
-        <string>LICENSES/boost.txt</string>
-        <key>name</key>
-        <string>boost</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>d98078791ce345bf6168ce9ba53ca2d7</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/222752/arch/Darwin/installer/boost-1.45.0-darwin-20110304.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>a34e7fffdb94a6a4d8a2966b1f216da3</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.45.0-linux-20110310.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>98be22c8833aa2bca184b9fa09fbb82b</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.45.0-windows-20110124.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>colladadom</key>
-      <map>
-        <key>license</key>
-        <string>scea</string>
-        <key>license_file</key>
-        <string>LICENSES/collada.txt</string>
-        <key>name</key>
-        <string>colladadom</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>480b27a0cb39a4adfcdeabef895de3e1</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/227230/arch/Darwin/installer/colladadom-2.2-darwin-20110420.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>d05be8fc196e9ce7b6636b931cf13dff</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226716/arch/Linux/installer/colladadom-2.2-linux-20110415.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>a9f548eb6f9aaf292508a8b09c7f2f73</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/CYGWIN/installer/colladadom-2.2-windows-20110413.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>curl</key>
-      <map>
-        <key>license</key>
-        <string>curl</string>
-        <key>license_file</key>
-        <string>LICENSES/curl.txt</string>
-        <key>name</key>
-        <string>curl</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>aaea644191807f51051cefa2fac11069</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-darwin-20110316.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>2d9377951d99a1aa4735cea8d4b5aa71</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-linux-20110316.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>fea96aa2a7d513397317194f3d6c979b</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-windows-20110211.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>db</key>
-      <map>
-        <key>license</key>
-        <string>bsd</string>
-        <key>license_file</key>
-        <string>LICENSES/db.txt</string>
-        <key>name</key>
-        <string>db</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>8f57c413e0786681cbcb9ed2fb8a6d37</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/db-5.1.25-linux-20110309.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>dbusglib</key>
-      <map>
-        <key>license</key>
-        <string>AFL2.1</string>
-        <key>license_file</key>
-        <string>LICENSES/dbus-glib.txt</string>
-        <key>name</key>
-        <string>dbusglib</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>94b058b9a81114dc4567bd78e4335425</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbus_glib-0.76-linux-20110310.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>elfio</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/elfio.txt</string>
-        <key>name</key>
-        <string>elfio</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>031e6315a5c0829c9b9a2ec18aeb7ae3</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-elfio/rev/222074/arch/Linux/installer/elfio-1.0.3-linux-20110225.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>expat</key>
-      <map>
-        <key>license</key>
-        <string>mit</string>
-        <key>license_file</key>
-        <string>LICENSES/expat.txt</string>
-        <key>name</key>
-        <string>expat</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>180e03d0be1f1acfc3244e78742d7bef</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-expat/rev/221695/arch/Darwin/installer/expat-2.0.1-darwin-20110218.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>9bd79781b58e556ab1c36084ec4a1c0c</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-expat/rev/221695/arch/Linux/installer/expat-2.0.1-linux-20110219.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>e72db1bda49b205ebdf4945d4ed2b8f8</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-2.0.1-windows-20110215.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>fmod</key>
-      <map>
-        <key>license</key>
-        <string>fmod</string>
-        <key>license_file</key>
-        <string>LICENSES/fmod.txt</string>
-        <key>name</key>
-        <string>fmod</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>61ead113e6479452e6b690c84b4e9d30</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>0c61d643db54d2e5999be8254569d8b3</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Linux/installer/fmod-3.75-linux-20110223.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>d9a9a6ad86895353bcd63374a4c1a91d</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/CYGWIN/installer/fmod-3.75-windows-20110222.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>fontconfig</key>
-      <map>
-        <key>license</key>
-        <string>mit</string>
-        <key>license_file</key>
-        <string>LICENSES/fontconfig.txt</string>
-        <key>name</key>
-        <string>fontconfig</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>d8b08b657247566bde5fd853c7622478</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.8.0-linux-20110311.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>freeglut</key>
-      <map>
-        <key>license</key>
-        <string>mit</string>
-        <key>license_file</key>
-        <string>LICENSES/freeglut.txt</string>
-        <key>name</key>
-        <string>freeglut</string>
-        <key>platforms</key>
-        <map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>825d5a9bafcc5bfe28dc4c1c4f87c576</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freeglut/rev/221064/arch/CYGWIN/installer/freeglut-2.6.0-windows-20110214.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>freetype</key>
-      <map>
-        <key>license</key>
-        <string>freetype</string>
-        <key>license_file</key>
-        <string>LICENSES/freetype.txt</string>
-        <key>name</key>
-        <string>freetype</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>c0eacb6348e032fbc69cfdc4bd215ee4</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-darwin-20110307.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>9f8a9dc39fd7c3da0fb3533782d1fddf</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/226814/arch/Linux/installer/freetype-2.3.9-linux-20110418.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>271349827b939406162ce42e42cd18e0</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-windows-20110218.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>glext</key>
-      <map>
-        <key>license</key>
-        <string>glext</string>
-        <key>license_file</key>
-        <string>LICENSES/glext.txt</string>
-        <key>name</key>
-        <string>glext</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>5de58ca0fe19abf68b25956762ee0d29</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>5de58ca0fe19abf68b25956762ee0d29</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>glh_linear</key>
-      <map>
-        <key>license</key>
-        <string>glh_linear</string>
-        <key>license_file</key>
-        <string>LICENSES/glh_linear.txt</string>
-        <key>name</key>
-        <string>glh_linear</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>366f940f2634b0e05954646927620bfd</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-darwin-20101004.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>26f2df1f0b0fa01e94e0253e322f3583</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20101001.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>57f8be28bbaa2505ae3b59deb2c77cdf</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-windows-20101011.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>glui</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/glui.txt</string>
-        <key>name</key>
-        <string>glui</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>bd2f84ef8bd308570e2e532a371dc2ef</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-darwin-20110309.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>e006635a741420a15f40bbdac13bd8d7</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-windows-20110214.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>google_breakpad</key>
-      <map>
-        <key>license</key>
-        <string>bsd</string>
-        <key>license_file</key>
-        <string>LICENSES/google_breakpad.txt</string>
-        <key>name</key>
-        <string>google_breakpad</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>21babc394dbf8572830f2e85adec7b9f</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>204b02a9480c411232255798839431a2</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110311.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>627c51136e14e64c5d39933f3abd3bdf</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-windows-20110218.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>googlemock</key>
-      <map>
-        <key>license</key>
-        <string>bsd</string>
-        <key>license_file</key>
-        <string>LICENSES/googlemock.txt</string>
-        <key>name</key>
-        <string>googlemock</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>886ee428f058005ab7f90f61784ec9d9</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-darwin-20101004.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>782ca04e56d8eab755adcae297cafa7c</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-linux-20101001.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>212701468920519f3989677cea9ca4f1</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gmock-1.5.0-windows-20110224.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>gstreamer</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/gstreamer.txt</string>
-        <key>name</key>
-        <string>gstreamer</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>ddbc0a64ad788107877fee777403592c</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20101013.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>gtk-atk-pango-glib</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/gtk-atk-pango-glib.txt</string>
-        <key>name</key>
-        <string>gtk-atk-pango-glib</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>03694ade27f53199229c03cbbda89214</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20101001.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>c257d718abdde8cfe8a0af26175161a7</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-windows-20101001a.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>jpeglib</key>
-      <map>
-        <key>license</key>
-        <string>jpeglib</string>
-        <key>license_file</key>
-        <string>LICENSES/jpeglib.txt</string>
-        <key>name</key>
-        <string>jpeglib</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>71bd6efbf508e1f2e7d98a6195a93e9e</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-darwin-20110228.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>dcca1db348831cdb7c6b26dc4076c597</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/224895/arch/Linux/installer/jpeglib-8c-linux-20110323.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>a202ec58cef9097c94acfa958ed6da8d</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-windows-20110217.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>jsoncpp</key>
-      <map>
-        <key>license</key>
-        <string>jsoncpp</string>
-        <key>license_file</key>
-        <string>LICENSES/jsoncpp.txt</string>
-        <key>name</key>
-        <string>jsoncpp</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>de8b96120c274e052abb4f692861be46</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-darwin-20110131.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>840cd9455638c0ea52c613cfddd07d5b</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-linux-20110315.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>afff2018e6a887c281b072eecdd9343e</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-windows-20110208.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>kdu</key>
-      <map>
-        <key>license</key>
-        <string>kdu</string>
-        <key>license_file</key>
-        <string>LICENSES/kdu.txt</string>
-        <key>name</key>
-        <string>kdu</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>d91e1f483209cd3eba04135c6a59e829</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/Darwin/installer/kdu-6.4.1-darwin-20110218.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>fbf8a4f78dff986d7c16b3a0437e033e</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/223538/arch/Linux/installer/kdu-6.4.1-linux-20110311.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>6cd9f36465ef73a3df34bf2b3bba2ced</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/CYGWIN/installer/kdu-6.4.1-windows-20110218.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>libpng</key>
-      <map>
-        <key>license</key>
-        <string>libpng</string>
-        <key>license_file</key>
-        <string>LICENSES/libpng.txt</string>
-        <key>name</key>
-        <string>libpng</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>6fe1adf12d98bce9111f60ee762007b9</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-darwin-20110222.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>0681ab7e1988dfdbdad7dd9edb7760ee</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-linux-20110223.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>f194ba857ca8dd86483a3ef24535d0db</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/226532/arch/CYGWIN/installer/libpng-1.5.1-windows-20110413.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>libuuid</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/libuuid.txt</string>
-        <key>name</key>
-        <string>libuuid</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>873e8e99d29711df2efa30646dca1795</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/uuid-1.6.2-linux-20110315.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>libxml</key>
-      <map>
-        <key>license</key>
-        <string>mit</string>
-        <key>license_file</key>
-        <string>LICENSES/libxml.txt</string>
-        <key>name</key>
-        <string>libxml</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>6414642528f42dac1cd9a012c99cd748</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20101013.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>llconvexdecomposition</key>
-      <map>
-        <key>license</key>
-        <string>havok</string>
-        <key>license_file</key>
-        <string>on_file</string>
-        <key>name</key>
-        <string>llconvexdecomposition</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>bfa0e1ce006302f6d90b712b20e2d96e</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110415.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>d6207290496f4b464996924b6319932e</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/226714/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110415.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>95a1d483f3d01f480b55801e841b2151</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecomposition/rev/227989/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110428.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>llconvexdecompositionstub</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/lgpl.txt</string>
-        <key>name</key>
-        <string>llconvexdecompositionstub</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>bc1388fc28dbb3bba1fe7cb8d09f49b4</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Darwin/installer/llconvexdecompositionstub-0.3-darwin-20110421.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>3295bd4a0514b7c15dda9044f40c175e</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Linux/installer/llconvexdecompositionstub-0.3-linux-20110422.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>92f1dff3249024c1534b55343ed79ea3</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/CYGWIN/installer/llconvexdecompositionstub-0.3-windows-20110421.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>llqtwebkit</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/llqtwebkit.txt</string>
-        <key>name</key>
-        <string>llqtwebkit</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>76c1015eafcba5ca9932c3009533b51c</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225273/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110329.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>c05a33ee8b6f253b5a744596dfc3707d</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20101013.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>1b1b8e104e39c542d69eb37b5ee81818</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225249/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110329.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>mesa</key>
-      <map>
-        <key>license</key>
-        <string>mesa</string>
-        <key>license_file</key>
-        <string>LICENSES/mesa.txt</string>
-        <key>name</key>
-        <string>mesa</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>1f600840463c7327ea17486821425750</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20100930.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>ndofdev</key>
-      <map>
-        <key>license</key>
-        <string>linden</string>
-        <key>license_file</key>
-        <string>LICENSES/libndofdev.txt</string>
-        <key>name</key>
-        <string>ndofdev</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>674d37d2ba76a2df7f18c47bf50b5d03</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libndofdev-0.1-darwin-20110308.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>c81bacf922bb3b540d92b660364c48ce</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-0.2-20101013.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>3a4bec9562ed6ac53e85abcb1afc5fc0</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libndofdev-0.1-windows-20110223.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>ogg-vorbis</key>
-      <map>
-        <key>license</key>
-        <string>ogg-vorbis</string>
-        <key>license_file</key>
-        <string>LICENSES/ogg-vorbis.txt</string>
-        <key>name</key>
-        <string>ogg-vorbis</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>57f32a1a670f06a4dc036eb1164ad9d7</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-darwin-20110222.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>17c000ceef32c0623d038b4c73791bee</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-linux-20110307.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>c8fccf7eeb25fd45cb7e04399c0b83ee</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg_vorbis-1.1.3-1.2.0-windows-20110222.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>openSSL</key>
-      <map>
-        <key>license</key>
-        <string>openSSL</string>
-        <key>license_file</key>
-        <string>LICENSES/openssl.txt</string>
-        <key>name</key>
-        <string>openSSL</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>facee34b8bd57ad602157e65a5af1a49</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openssl-0.9.8q-darwin-20110211.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>3d40be8566fa4b9df9a38e2a0f9ea467</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/226882/arch/Linux/installer/openssl-1.0.0d-linux-20110418.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>774c7f0a0312bee3054757a623e227bc</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/220986/arch/CYGWIN/installer/openssl-0.9.8q-windows-20110211.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>openal_soft</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/OPENAL.txt</string>
-        <key>name</key>
-        <string>openal_soft</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>fccdca18a950ac9363c6fb39118b80e1</string>
-              <key>hash_algorithm</key>
-              <string>md5</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>04df406f3e5d04cf176660bdac66c3a1</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-        <key>version</key>
-        <string>3ad86a1c</string>
-      </map>
-      <key>openjpeg</key>
-      <map>
-        <key>license</key>
-        <string>openjpeg</string>
-        <key>license_file</key>
-        <string>LICENSES/openjpeg.txt</string>
-        <key>name</key>
-        <string>openjpeg</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>4be51c7cca7d84831e30b63279df7ae5</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-darwin-20110302.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>fb2382014c79e0049746e4e29bd834f9</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-linux-20110314.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>ca5765af55f798724d601720afdf6953</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-windows-20110302.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>pcre</key>
-      <map>
-        <key>license</key>
-        <string>bsd</string>
-        <key>license_file</key>
-        <string>LICENSES/pcre-license.txt</string>
-        <key>name</key>
-        <string>pcre</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>cb04654cdfe93e3c8d16fef0c475e2bb</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/226370/arch/Darwin/installer/pcre-7.6-darwin-20110411.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>18854c815c6f960e22add25cf1ff93d4</string>
-              <key>url</key>
-              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-pcre/rev/226572/arch/Linux/installer/pcre-7.6-linux-20110413.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-        </map>
-      </map>
-      <key>pth</key>
-      <map>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>license_file</key>
-        <string>LICENSES/pth.txt</string>
-        <key>name</key>
-        <string>pth</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>2172379794217d0ffba0db09b2ac17bf</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20110303.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-        </map>
-      </map>
-      <key>quicktime</key>
-      <map>
-        <key>license</key>
-        <string>quicktime</string>
-        <key>license_file</key>
-        <string>LICENSES/quicktime.txt</string>
-        <key>name</key>
-        <string>quicktime</string>
-        <key>platforms</key>
-        <map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>52e49ab6937b09882389da0dbaec17f5</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/quicktime-7.3-windows-20110127.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>slvoice</key>
-      <map>
-        <key>license</key>
-        <string>vivox</string>
-        <key>license_file</key>
-        <string>LICENSES/slvoice.txt</string>
-        <key>name</key>
-        <string>slvoice</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>e19576af3c0affc71293d8f0bcce2606</string>
-              <key>url</key>
-              <string> http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-darwin-20110120.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>53fefed8120d7c6a0eb6778edae6fa32</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-linux-20110120.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>44f84b3b45f7067a104a7c34d50d62f0</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-windows-20110120.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>tcmalloc</key>
-      <map>
-        <key>license</key>
-        <string>bsd</string>
-        <key>license_file</key>
-        <string>LICENSES/google-perftools.txt</string>
-        <key>name</key>
-        <string>tcmalloc</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>dde928cb24d22a267004a8c17669ba65</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226426/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>8308f7bd68bb7083655753b7abe7225f</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>tut</key>
-      <map>
-        <key>license</key>
-        <string>bsd</string>
-        <key>license_file</key>
-        <string>LICENSES/tut.txt</string>
-        <key>name</key>
-        <string>tut</string>
-        <key>platforms</key>
-        <map>
-          <key>common</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>5c6d3e606f027e78f056cb77b20f228e</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2008-11-30-common-20101001.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>common</string>
-          </map>
-        </map>
-      </map>
-      <key>xmlrpc-epi</key>
-      <map>
-        <key>license</key>
-        <string>xmlrpc-epi</string>
-        <key>license_file</key>
-        <string>LICENSES/xmlrpc-epi.txt</string>
-        <key>name</key>
-        <string>xmlrpc-epi</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>a3e0fb4b4a51b01690a99747a1cca531</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-darwin-20110307.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>174ab797440157956eda7061dae37564</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-linux-20110314.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>5181d1a8f2516928ac064d72acf164a4</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-windows-20110224.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-      <key>zlib</key>
-      <map>
-        <key>license</key>
-        <string>zlib</string>
-        <key>license_file</key>
-        <string>LICENSES/zlib.txt</string>
-        <key>name</key>
-        <string>zlib</string>
-        <key>platforms</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>49b8de20f3bb43537f51311894a72de1</string>
-              <key>url</key>
-              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.5-darwin-20110211.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>darwin</string>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>7b4cf3aa2c04937d0a20761516587896</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-zlib/rev/223739/arch/Linux/installer/zlib-1.2.5-linux-20110314.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>5852192646681817fc3c3a8c95e91c1e</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-zlib/rev/220983/arch/CYGWIN/installer/zlib-1.2.5-windows-20110211.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
-    </map>
-    <key>package_description</key>
-    <map>
-      <key>name</key>
-      <string>viewer_development</string>
-      <key>platforms</key>
-      <map>
-        <key>common</key>
-        <map>
-          <key>configurations</key>
-          <map>
-            <key>Debug</key>
-            <map>
-              <key>build</key>
-              <map>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>command</key>
-                <string>cmake</string>
-                <key>options</key>
-                <array>
-                  <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
-                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
-                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Debug</string>
-            </map>
-            <key>DebugOS</key>
-            <map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>command</key>
-                <string>cmake</string>
-                <key>options</key>
-                <array>
-                  <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
-                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
-                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>DebugOS</string>
-            </map>
-            <key>RelWithDebInfo</key>
-            <map>
-              <key>build</key>
-              <map>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>command</key>
-                <string>cmake</string>
-                <key>options</key>
-                <array>
-                  <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
-                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
-                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>RelWithDebInfo</string>
-            </map>
-            <key>RelWithDebInfoOS</key>
-            <map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>command</key>
-                <string>cmake</string>
-                <key>options</key>
-                <array>
-                  <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
-                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
-                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>RelWithDebInfoOS</string>
-            </map>
-            <key>Release</key>
-            <map>
-              <key>build</key>
-              <map>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>command</key>
-                <string>cmake</string>
-                <key>options</key>
-                <array>
-                  <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
-                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
-                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Release</string>
-            </map>
-            <key>ReleaseOS</key>
-            <map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>command</key>
-                <string>cmake</string>
-                <key>options</key>
-                <array>
-                  <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
-                  <string>-DWORD_SIZE:STRING=32</string>
-                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
-                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>ReleaseOS</string>
-            </map>
-          </map>
-          <key>name</key>
-          <string>common</string>
-        </map>
-        <key>darwin</key>
-        <map>
-          <key>build_directory</key>
-          <string>build-darwin-i386</string>
-          <key>configurations</key>
-          <map>
-            <key>Debug</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
-                  <string>setenv</string>
-                </array>
-                <key>command</key>
-                <string>xcodebuild</string>
-                <key>options</key>
-                <array>
-                  <string>-configuration Debug</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Xcode'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Debug</string>
-            </map>
-            <key>DebugOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>xcodebuild</string>
-                <key>options</key>
-                <array>
-                  <string>-configuration Debug</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Xcode'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>DebugOS</string>
-            </map>
-            <key>RelWithDebInfo</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
-                  <string>setenv</string>
-                </array>
-                <key>command</key>
-                <string>xcodebuild</string>
-                <key>options</key>
-                <array>
-                  <string>-configuration RelWithDebInfo</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Xcode'</string>
-                </array>
-              </map>
-              <key>default</key>
-              <string>True</string>
-              <key>name</key>
-              <string>RelWithDebInfo</string>
-            </map>
-            <key>RelWithDebInfoOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>xcodebuild</string>
-                <key>options</key>
-                <array>
-                  <string>-configuration RelWithDebInfo</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Xcode'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>RelWithDebInfoOS</string>
-            </map>
-            <key>Release</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
-                  <string>setenv</string>
-                </array>
-                <key>command</key>
-                <string>xcodebuild</string>
-                <key>options</key>
-                <array>
-                  <string>-configuration Release</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Xcode'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Release</string>
-            </map>
-            <key>ReleaseOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>xcodebuild</string>
-                <key>options</key>
-                <array>
-                  <string>-configuration Release</string>
-                  <string>-project SecondLife.xcodeproj</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Xcode'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>ReleaseOS</string>
-            </map>
-          </map>
-          <key>name</key>
-          <string>darwin</string>
-        </map>
-        <key>linux</key>
-        <map>
-          <key>build_directory</key>
-          <string>build-linux-i686</string>
-          <key>configurations</key>
-          <map>
-            <key>Debug</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>make</string>
-                <key>options</key>
-                <array>
-                  <string>-j 12</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Unix Makefiles'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Debug</string>
-            </map>
-            <key>DebugOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>make</string>
-                <key>options</key>
-                <array>
-                  <string>-j 2</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Unix Makefiles'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>DebugOS</string>
-            </map>
-            <key>RelWithDebInfo</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>make</string>
-                <key>options</key>
-                <array>
-                  <string>-j 12</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Unix Makefiles'</string>
-                </array>
-              </map>
-              <key>default</key>
-              <string>True</string>
-              <key>name</key>
-              <string>RelWithDebInfo</string>
-            </map>
-            <key>RelWithDebInfoOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>make</string>
-                <key>options</key>
-                <array>
-                  <string>-j 2</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Unix Makefiles'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>RelWithDebInfoOS</string>
-            </map>
-            <key>Release</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>make</string>
-                <key>options</key>
-                <array>
-                  <string>-j 12</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>../indra</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Unix Makefiles'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Release</string>
-            </map>
-            <key>ReleaseOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>command</key>
-                <string>make</string>
-                <key>options</key>
-                <array>
-                  <string>-j 2</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>'Unix Makefiles'</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>ReleaseOS</string>
-            </map>
-            <key>default</key>
-            <map>
-              <key>build</key>
-              <map>
-              </map>
-              <key>name</key>
-              <string>default</string>
-            </map>
-          </map>
-          <key>name</key>
-          <string>linux</string>
-        </map>
-        <key>windows</key>
-        <map>
-          <key>build_directory</key>
-          <string>build-vc100</string>
-          <key>configurations</key>
-          <map>
-            <key>Debug</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>SecondLife.sln</string>
-                </array>
-                <key>command</key>
-                <string>BuildConsole</string>
-                <key>options</key>
-                <array>
-                  <string>/build</string>
-                  <string>"/cfg=Debug|Win32"</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>..\indra</string>
-                  <string>&amp;&amp;</string>
-                  <string>..\indra\tools\vstool\VSTool.exe</string>
-                  <string>--solution</string>
-                  <string>SecondLife.sln</string>
-                  <string>--config</string>
-                  <string>Debug</string>
-                  <string>--startup</string>
-                  <string>secondlife-bin</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>"Visual Studio 10"</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Debug</string>
-            </map>
-            <key>DebugOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>SecondLife.sln</string>
-                </array>
-                <key>command</key>
-                <string>msbuild.exe</string>
-                <key>options</key>
-                <array>
-                  <string>/p:Configuration=Debug</string>
-                  <string>/p:Platform=Win32</string>
-                  <string>/t:Build</string>
-                  <string>/p:useenv=true</string>
-                  <string>/verbosity:minimal</string>
-                  <string>/toolsversion:4.0</string>
-                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>"Visual Studio 10"</string>
-                  <string>-DUNATTENDED:BOOL=ON</string>
-                  <string>-DUSE_PRECOMPILED_HEADERS=ON</string>
-                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
-                  <string>-DUSE_KDU=FALSE</string>
-                  <string>-DFMOD=FALSE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>DebugOS</string>
-            </map>
-            <key>RelWithDebInfo</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>SecondLife.sln</string>
-                </array>
-                <key>command</key>
-                <string>BuildConsole</string>
-                <key>options</key>
-                <array>
-                  <string>/build</string>
-                  <string>"/cfg=RelWithDebInfo|Win32"</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>..\indra</string>
-                  <string>&amp;&amp;</string>
-                  <string>..\indra\tools\vstool\VSTool.exe</string>
-                  <string>--solution</string>
-                  <string>SecondLife.sln</string>
-                  <string>--config</string>
-                  <string>RelWithDebInfo</string>
-                  <string>--startup</string>
-                  <string>secondlife-bin</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>"Visual Studio 10"</string>
-                </array>
-              </map>
-              <key>default</key>
-              <string>True</string>
-              <key>name</key>
-              <string>RelWithDebInfo</string>
-            </map>
-            <key>RelWithDebInfoOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>SecondLife.sln</string>
-                </array>
-                <key>command</key>
-                <string>msbuild.exe</string>
-                <key>options</key>
-                <array>
-                  <string>/p:Configuration=RelWithDebInfo</string>
-                  <string>/p:Platform=Win32</string>
-                  <string>/t:Build</string>
-                  <string>/p:useenv=true</string>
-                  <string>/verbosity:minimal</string>
-                  <string>/toolsversion:4.0</string>
-                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>"Visual Studio 10"</string>
-                  <string>-DUNATTENDED:BOOL=ON</string>
-                  <string>-DUSE_PRECOMPILED_HEADERS=ON</string>
-                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
-                  <string>-DUSE_KDU=FALSE</string>
-                  <string>-DFMOD=FALSE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>RelWithDebInfoOS</string>
-            </map>
-            <key>Release</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>SecondLife.sln</string>
-                </array>
-                <key>command</key>
-                <string>BuildConsole</string>
-                <key>options</key>
-                <array>
-                  <string>/build</string>
-                  <string>"/cfg=Release|Win32"</string>
-                  <string>"/CL_ADD=/m:1"</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>..\indra</string>
-                  <string>&amp;&amp;</string>
-                  <string>..\indra\tools\vstool\VSTool.exe</string>
-                  <string>--solution</string>
-                  <string>SecondLife.sln</string>
-                  <string>--config</string>
-                  <string>Release</string>
-                  <string>--startup</string>
-                  <string>secondlife-bin</string>
-                </array>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>"Visual Studio 10"</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>Release</string>
-            </map>
-            <key>ReleaseOS</key>
-            <map>
-              <key>build</key>
-              <map>
-                <key>arguments</key>
-                <array>
-                  <string>SecondLife.sln</string>
-                </array>
-                <key>command</key>
-                <string>msbuild.exe</string>
-                <key>options</key>
-                <array>
-                  <string>/p:Configuration=Release</string>
-                  <string>/p:Platform=Win32</string>
-                  <string>/t:Build</string>
-                  <string>/p:useenv=true</string>
-                  <string>/verbosity:minimal</string>
-                  <string>/toolsversion:4.0</string>
-                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
-                </array>
-              </map>
-              <key>configure</key>
-              <map>
-                <key>options</key>
-                <array>
-                  <string>-G</string>
-                  <string>"Visual Studio 10"</string>
-                  <string>-DUNATTENDED:BOOL=ON</string>
-                  <string>-DUSE_PRECOMPILED_HEADERS=ON</string>
-                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
-                  <string>-DUSE_KDU=FALSE</string>
-                  <string>-DFMOD=FALSE</string>
-                </array>
-              </map>
-              <key>name</key>
-              <string>ReleaseOS</string>
-            </map>
-          </map>
-          <key>name</key>
-          <string>windows</string>
-        </map>
-      </map>
-    </map>
-    <key>type</key>
-    <string>autobuild</string>
-    <key>version</key>
-    <string>1.2</string>
-  </map>
-</llsd>
+<?xml version="1.0" ?>
+<llsd>
+<map>
+    <key>installables</key>
+    <map>
+      <key>GLOD</key>
+      <map>
+        <key>license</key>
+        <string>GLOD</string>
+        <key>license_file</key>
+        <string>LICENSES/glod.txt</string>
+        <key>name</key>
+        <string>GLOD</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>930bdd987a321eda1838caba8cd6098f</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/Darwin/installer/glod-1.0pre4-darwin-20110519.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fb33b6cac2e6b98f93c5efa2af2e5a00</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/Linux/installer/glod-1.0pre4-linux-20110519.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>388cf0e292f756b4bb37696622f0bbc5</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-glod/rev/230348/arch/CYGWIN/installer/glod-1.0pre4-windows-20110519.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>SDL</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/SDL.txt</string>
+        <key>name</key>
+        <string>SDL</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>69ae3b1c9cdb0ebc0d0e1ac8413e3eb7</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.14-linux-20110309.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>apr_suite</key>
+      <map>
+        <key>license</key>
+        <string>apache</string>
+        <key>license_file</key>
+        <string>LICENSES/apr_suite.txt</string>
+        <key>name</key>
+        <string>apr_suite</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>9868bfa0b6954e4884c49c6f30068c80</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-darwin-20110217.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>ff62946c518a247c86e1066c1e9a5855</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-linux-20110309.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>73785c200a5b4ef74a1230b028bb680d</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.4.2-windows-20110217.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>ares</key>
+      <map>
+        <key>license</key>
+        <string>c-ares</string>
+        <key>license_file</key>
+        <string>LICENSES/c-ares.txt</string>
+        <key>name</key>
+        <string>ares</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e6caaeea16131e1f2343ecd7765e3147</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20110217.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>0745872db83d45f4ab3bdc697d98e264</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/223275/arch/Linux/installer/ares-1.7.1-linux-20110310.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>1dcec6babd249a2597114d4ac226c461</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ares/rev/220963/arch/CYGWIN/installer/ares-1.7.1-windows-20110211.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>boost</key>
+      <map>
+        <key>license</key>
+        <string>boost</string>
+        <key>license_file</key>
+        <string>LICENSES/boost.txt</string>
+        <key>name</key>
+        <string>boost</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d98078791ce345bf6168ce9ba53ca2d7</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-boost/rev/222752/arch/Darwin/installer/boost-1.45.0-darwin-20110304.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a34e7fffdb94a6a4d8a2966b1f216da3</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.45.0-linux-20110310.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>98be22c8833aa2bca184b9fa09fbb82b</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.45.0-windows-20110124.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>colladadom</key>
+      <map>
+        <key>license</key>
+        <string>scea</string>
+        <key>license_file</key>
+        <string>LICENSES/collada.txt</string>
+        <key>name</key>
+        <string>colladadom</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>480b27a0cb39a4adfcdeabef895de3e1</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/227230/arch/Darwin/installer/colladadom-2.2-darwin-20110420.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d05be8fc196e9ce7b6636b931cf13dff</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226716/arch/Linux/installer/colladadom-2.2-linux-20110415.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a9f548eb6f9aaf292508a8b09c7f2f73</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-colladadom/rev/226584/arch/CYGWIN/installer/colladadom-2.2-windows-20110413.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>curl</key>
+      <map>
+        <key>license</key>
+        <string>curl</string>
+        <key>license_file</key>
+        <string>LICENSES/curl.txt</string>
+        <key>name</key>
+        <string>curl</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>aaea644191807f51051cefa2fac11069</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-darwin-20110316.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>2d9377951d99a1aa4735cea8d4b5aa71</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-linux-20110316.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fea96aa2a7d513397317194f3d6c979b</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.21.1-windows-20110211.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>db</key>
+      <map>
+        <key>license</key>
+        <string>bsd</string>
+        <key>license_file</key>
+        <string>LICENSES/db.txt</string>
+        <key>name</key>
+        <string>db</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>8f57c413e0786681cbcb9ed2fb8a6d37</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/db-5.1.25-linux-20110309.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>dbusglib</key>
+      <map>
+        <key>license</key>
+        <string>AFL2.1</string>
+        <key>license_file</key>
+        <string>LICENSES/dbus-glib.txt</string>
+        <key>name</key>
+        <string>dbusglib</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>94b058b9a81114dc4567bd78e4335425</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/dbus_glib-0.76-linux-20110310.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>elfio</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/elfio.txt</string>
+        <key>name</key>
+        <string>elfio</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>031e6315a5c0829c9b9a2ec18aeb7ae3</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-elfio/rev/222074/arch/Linux/installer/elfio-1.0.3-linux-20110225.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>expat</key>
+      <map>
+        <key>license</key>
+        <string>mit</string>
+        <key>license_file</key>
+        <string>LICENSES/expat.txt</string>
+        <key>name</key>
+        <string>expat</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>180e03d0be1f1acfc3244e78742d7bef</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-expat/rev/221695/arch/Darwin/installer/expat-2.0.1-darwin-20110218.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>9bd79781b58e556ab1c36084ec4a1c0c</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-expat/rev/221695/arch/Linux/installer/expat-2.0.1-linux-20110219.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e72db1bda49b205ebdf4945d4ed2b8f8</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-2.0.1-windows-20110215.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>fmod</key>
+      <map>
+        <key>license</key>
+        <string>fmod</string>
+        <key>license_file</key>
+        <string>LICENSES/fmod.txt</string>
+        <key>name</key>
+        <string>fmod</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>61ead113e6479452e6b690c84b4e9d30</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Darwin/installer/fmod-3.75-darwin-20110222.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>0c61d643db54d2e5999be8254569d8b3</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/Linux/installer/fmod-3.75-linux-20110223.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d9a9a6ad86895353bcd63374a4c1a91d</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmod-private/rev/221852/arch/CYGWIN/installer/fmod-3.75-windows-20110222.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>fontconfig</key>
+      <map>
+        <key>license</key>
+        <string>mit</string>
+        <key>license_file</key>
+        <string>LICENSES/fontconfig.txt</string>
+        <key>name</key>
+        <string>fontconfig</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d8b08b657247566bde5fd853c7622478</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.8.0-linux-20110311.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>freeglut</key>
+      <map>
+        <key>license</key>
+        <string>mit</string>
+        <key>license_file</key>
+        <string>LICENSES/freeglut.txt</string>
+        <key>name</key>
+        <string>freeglut</string>
+        <key>platforms</key>
+        <map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>825d5a9bafcc5bfe28dc4c1c4f87c576</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freeglut/rev/221064/arch/CYGWIN/installer/freeglut-2.6.0-windows-20110214.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>freetype</key>
+      <map>
+        <key>license</key>
+        <string>freetype</string>
+        <key>license_file</key>
+        <string>LICENSES/freetype.txt</string>
+        <key>name</key>
+        <string>freetype</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>c0eacb6348e032fbc69cfdc4bd215ee4</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-darwin-20110307.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>9f8a9dc39fd7c3da0fb3533782d1fddf</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/226814/arch/Linux/installer/freetype-2.3.9-linux-20110418.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>271349827b939406162ce42e42cd18e0</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.4.4-windows-20110218.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>glext</key>
+      <map>
+        <key>license</key>
+        <string>glext</string>
+        <key>license_file</key>
+        <string>LICENSES/glext.txt</string>
+        <key>name</key>
+        <string>glext</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5de58ca0fe19abf68b25956762ee0d29</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5de58ca0fe19abf68b25956762ee0d29</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glext-68-windows-20110406.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>glh_linear</key>
+      <map>
+        <key>license</key>
+        <string>glh_linear</string>
+        <key>license_file</key>
+        <string>LICENSES/glh_linear.txt</string>
+        <key>name</key>
+        <string>glh_linear</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>366f940f2634b0e05954646927620bfd</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-darwin-20101004.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>26f2df1f0b0fa01e94e0253e322f3583</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20101001.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>57f8be28bbaa2505ae3b59deb2c77cdf</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-windows-20101011.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>glui</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/glui.txt</string>
+        <key>name</key>
+        <string>glui</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>bd2f84ef8bd308570e2e532a371dc2ef</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-darwin-20110309.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e006635a741420a15f40bbdac13bd8d7</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glui-2.36-windows-20110214.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>google_breakpad</key>
+      <map>
+        <key>license</key>
+        <string>bsd</string>
+        <key>license_file</key>
+        <string>LICENSES/google_breakpad.txt</string>
+        <key>name</key>
+        <string>google_breakpad</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>21babc394dbf8572830f2e85adec7b9f</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>204b02a9480c411232255798839431a2</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110311.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>627c51136e14e64c5d39933f3abd3bdf</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-windows-20110218.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>googlemock</key>
+      <map>
+        <key>license</key>
+        <string>bsd</string>
+        <key>license_file</key>
+        <string>LICENSES/googlemock.txt</string>
+        <key>name</key>
+        <string>googlemock</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>886ee428f058005ab7f90f61784ec9d9</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-darwin-20101004.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>782ca04e56d8eab755adcae297cafa7c</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/googlemock-1.1.0-linux-20101001.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>212701468920519f3989677cea9ca4f1</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gmock-1.5.0-windows-20110224.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>gstreamer</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/gstreamer.txt</string>
+        <key>name</key>
+        <string>gstreamer</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>ddbc0a64ad788107877fee777403592c</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20101013.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>gtk-atk-pango-glib</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/gtk-atk-pango-glib.txt</string>
+        <key>name</key>
+        <string>gtk-atk-pango-glib</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>03694ade27f53199229c03cbbda89214</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20101001.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>c257d718abdde8cfe8a0af26175161a7</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-windows-20101001a.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>jpeglib</key>
+      <map>
+        <key>license</key>
+        <string>jpeglib</string>
+        <key>license_file</key>
+        <string>LICENSES/jpeglib.txt</string>
+        <key>name</key>
+        <string>jpeglib</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>71bd6efbf508e1f2e7d98a6195a93e9e</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-darwin-20110228.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>dcca1db348831cdb7c6b26dc4076c597</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-jpeglib/rev/224895/arch/Linux/installer/jpeglib-8c-linux-20110323.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a202ec58cef9097c94acfa958ed6da8d</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-8c-windows-20110217.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>jsoncpp</key>
+      <map>
+        <key>license</key>
+        <string>jsoncpp</string>
+        <key>license_file</key>
+        <string>LICENSES/jsoncpp.txt</string>
+        <key>name</key>
+        <string>jsoncpp</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>de8b96120c274e052abb4f692861be46</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-darwin-20110131.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>840cd9455638c0ea52c613cfddd07d5b</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-linux-20110315.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>afff2018e6a887c281b072eecdd9343e</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jsoncpp-0.5.0-windows-20110208.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>kdu</key>
+      <map>
+        <key>license</key>
+        <string>kdu</string>
+        <key>license_file</key>
+        <string>LICENSES/kdu.txt</string>
+        <key>name</key>
+        <string>kdu</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>d91e1f483209cd3eba04135c6a59e829</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/Darwin/installer/kdu-6.4.1-darwin-20110218.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fbf8a4f78dff986d7c16b3a0437e033e</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/223538/arch/Linux/installer/kdu-6.4.1-linux-20110311.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>6cd9f36465ef73a3df34bf2b3bba2ced</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-kdu-private/rev/221672/arch/CYGWIN/installer/kdu-6.4.1-windows-20110218.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>libpng</key>
+      <map>
+        <key>license</key>
+        <string>libpng</string>
+        <key>license_file</key>
+        <string>LICENSES/libpng.txt</string>
+        <key>name</key>
+        <string>libpng</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>6fe1adf12d98bce9111f60ee762007b9</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-darwin-20110222.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>0681ab7e1988dfdbdad7dd9edb7760ee</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.5.1-linux-20110223.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>f194ba857ca8dd86483a3ef24535d0db</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-libpng/rev/226532/arch/CYGWIN/installer/libpng-1.5.1-windows-20110413.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>libuuid</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/libuuid.txt</string>
+        <key>name</key>
+        <string>libuuid</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>873e8e99d29711df2efa30646dca1795</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/uuid-1.6.2-linux-20110315.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>libxml</key>
+      <map>
+        <key>license</key>
+        <string>mit</string>
+        <key>license_file</key>
+        <string>LICENSES/libxml.txt</string>
+        <key>name</key>
+        <string>libxml</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>6414642528f42dac1cd9a012c99cd748</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20101013.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>llconvexdecomposition</key>
+      <map>
+        <key>license</key>
+        <string>havok</string>
+        <key>license_file</key>
+        <string>on_file</string>
+        <key>name</key>
+        <string>llconvexdecomposition</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>6e45ad68506cd1ba49fd35a3201f0478</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/Darwin/installer/llconvexdecomposition-0.1-darwin-20110504.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>00ff5144612c2e261a0811a4503ce3ba</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/Linux/installer/llconvexdecomposition-0.1-linux-20110504.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a4635dcbbe0915ce023dd41d3b848d4c</string>
+              <key>url</key>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-llconvexdecomposition/rev/228821/arch/CYGWIN/installer/llconvexdecomposition-0.1-windows-20110504.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>llconvexdecompositionstub</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/lgpl.txt</string>
+        <key>name</key>
+        <string>llconvexdecompositionstub</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>bc1388fc28dbb3bba1fe7cb8d09f49b4</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Darwin/installer/llconvexdecompositionstub-0.3-darwin-20110421.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>3295bd4a0514b7c15dda9044f40c175e</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/Linux/installer/llconvexdecompositionstub-0.3-linux-20110422.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>92f1dff3249024c1534b55343ed79ea3</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llconvexdecompositionstub/rev/227399/arch/CYGWIN/installer/llconvexdecompositionstub-0.3-windows-20110421.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>llqtwebkit</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/llqtwebkit.txt</string>
+        <key>name</key>
+        <string>llqtwebkit</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>76c1015eafcba5ca9932c3009533b51c</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225273/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20110329.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>c05a33ee8b6f253b5a744596dfc3707d</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20101013.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>1b1b8e104e39c542d69eb37b5ee81818</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/225249/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20110329.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>mesa</key>
+      <map>
+        <key>license</key>
+        <string>mesa</string>
+        <key>license_file</key>
+        <string>LICENSES/mesa.txt</string>
+        <key>name</key>
+        <string>mesa</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>1f600840463c7327ea17486821425750</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20100930.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>ndofdev</key>
+      <map>
+        <key>license</key>
+        <string>linden</string>
+        <key>license_file</key>
+        <string>LICENSES/libndofdev.txt</string>
+        <key>name</key>
+        <string>ndofdev</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>674d37d2ba76a2df7f18c47bf50b5d03</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libndofdev-0.1-darwin-20110308.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>c81bacf922bb3b540d92b660364c48ce</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-0.2-20101013.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>3a4bec9562ed6ac53e85abcb1afc5fc0</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libndofdev-0.1-windows-20110223.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>ogg-vorbis</key>
+      <map>
+        <key>license</key>
+        <string>ogg-vorbis</string>
+        <key>license_file</key>
+        <string>LICENSES/ogg-vorbis.txt</string>
+        <key>name</key>
+        <string>ogg-vorbis</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e849bc2b779fb7cc5e81aeb021a542c0</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Darwin/installer/ogg_vorbis-1.2.2-1.3.2-darwin-20110510.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>71eaa462eb0bf8842277a3436483a354</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2-linux-20110511.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>291dbba89dd8162b76f2c2d82e908c6f</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-ogvorbis/rev/229529/arch/CYGWIN/installer/ogg_vorbis-1.2.2-1.3.2-windows-20110510.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>openSSL</key>
+      <map>
+        <key>license</key>
+        <string>openSSL</string>
+        <key>license_file</key>
+        <string>LICENSES/openssl.txt</string>
+        <key>name</key>
+        <string>openSSL</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>facee34b8bd57ad602157e65a5af1a49</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openssl-0.9.8q-darwin-20110211.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>3d40be8566fa4b9df9a38e2a0f9ea467</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/226882/arch/Linux/installer/openssl-1.0.0d-linux-20110418.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>774c7f0a0312bee3054757a623e227bc</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-openssl/rev/220986/arch/CYGWIN/installer/openssl-0.9.8q-windows-20110211.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>openal_soft</key>
+      <map>
+        <key>license</key>
+        <string>lgpl</string>
+        <key>license_file</key>
+        <string>LICENSES/OPENAL.txt</string>
+        <key>name</key>
+        <string>openal_soft</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fccdca18a950ac9363c6fb39118b80e1</string>
+              <key>hash_algorithm</key>
+              <string>md5</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-3ad86a1c-linux-20110114.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>04df406f3e5d04cf176660bdac66c3a1</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openal-1.12.854-1.1.0-windows-20110301.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+        <key>version</key>
+        <string>3ad86a1c</string>
+      </map>
+      <key>openjpeg</key>
+      <map>
+        <key>license</key>
+        <string>openjpeg</string>
+        <key>license_file</key>
+        <string>LICENSES/openjpeg.txt</string>
+        <key>name</key>
+        <string>openjpeg</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>4be51c7cca7d84831e30b63279df7ae5</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-darwin-20110302.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>fb2382014c79e0049746e4e29bd834f9</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-linux-20110314.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>ca5765af55f798724d601720afdf6953</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.4-windows-20110302.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>pcre</key>
+      <map>
+        <key>license</key>
+        <string>bsd</string>
+        <key>license_file</key>
+        <string>LICENSES/pcre-license.txt</string>
+        <key>name</key>
+        <string>pcre</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a8e74694a0f4248228c13c845ed0a6f8</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Darwin/installer/pcre-7.6-darwin-20110504.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>bb0abe962b3b8208ed2dab0424aab33d</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-pcre/rev/228822/arch/Linux/installer/pcre-7.6-linux-20110504.tar.bz2</string>              
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+        </map>
+      </map>
+      <key>quicktime</key>
+      <map>
+        <key>license</key>
+        <string>quicktime</string>
+        <key>license_file</key>
+        <string>LICENSES/quicktime.txt</string>
+        <key>name</key>
+        <string>quicktime</string>
+        <key>platforms</key>
+        <map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>52e49ab6937b09882389da0dbaec17f5</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/quicktime-7.3-windows-20110127.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>slvoice</key>
+      <map>
+        <key>license</key>
+        <string>vivox</string>
+        <key>license_file</key>
+        <string>LICENSES/slvoice.txt</string>
+        <key>name</key>
+        <string>slvoice</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>e19576af3c0affc71293d8f0bcce2606</string>
+              <key>url</key>
+              <string> http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-darwin-20110120.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>53fefed8120d7c6a0eb6778edae6fa32</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-linux-20110120.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>44f84b3b45f7067a104a7c34d50d62f0</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-windows-20110120.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>tcmalloc</key>
+      <map>
+        <key>license</key>
+        <string>bsd</string>
+        <key>license_file</key>
+        <string>LICENSES/google-perftools.txt</string>
+        <key>name</key>
+        <string>tcmalloc</string>
+        <key>platforms</key>
+        <map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>dde928cb24d22a267004a8c17669ba65</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226426/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>8308f7bd68bb7083655753b7abe7225f</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>tut</key>
+      <map>
+        <key>license</key>
+        <string>bsd</string>
+        <key>license_file</key>
+        <string>LICENSES/tut.txt</string>
+        <key>name</key>
+        <string>tut</string>
+        <key>platforms</key>
+        <map>
+          <key>common</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5c6d3e606f027e78f056cb77b20f228e</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-2008-11-30-common-20101001.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>common</string>
+          </map>
+        </map>
+      </map>
+      <key>xmlrpc-epi</key>
+      <map>
+        <key>license</key>
+        <string>xmlrpc-epi</string>
+        <key>license_file</key>
+        <string>LICENSES/xmlrpc-epi.txt</string>
+        <key>name</key>
+        <string>xmlrpc-epi</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>a3e0fb4b4a51b01690a99747a1cca531</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-darwin-20110307.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>174ab797440157956eda7061dae37564</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-linux-20110314.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5181d1a8f2516928ac064d72acf164a4</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc_epi-0.54.1-windows-20110224.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+      <key>zlib</key>
+      <map>
+        <key>license</key>
+        <string>zlib</string>
+        <key>license_file</key>
+        <string>LICENSES/zlib.txt</string>
+        <key>name</key>
+        <string>zlib</string>
+        <key>platforms</key>
+        <map>
+          <key>darwin</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>49b8de20f3bb43537f51311894a72de1</string>
+              <key>url</key>
+              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.2.5-darwin-20110211.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>darwin</string>
+          </map>
+          <key>linux</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>7b4cf3aa2c04937d0a20761516587896</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-zlib/rev/223739/arch/Linux/installer/zlib-1.2.5-linux-20110314.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>linux</string>
+          </map>
+          <key>windows</key>
+          <map>
+            <key>archive</key>
+            <map>
+              <key>hash</key>
+              <string>5852192646681817fc3c3a8c95e91c1e</string>
+              <key>url</key>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-zlib/rev/220983/arch/CYGWIN/installer/zlib-1.2.5-windows-20110211.tar.bz2</string>
+            </map>
+            <key>name</key>
+            <string>windows</string>
+          </map>
+        </map>
+      </map>
+    </map>
+    <key>package_description</key>
+    <map>
+      <key>name</key>
+      <string>viewer_development</string>
+      <key>platforms</key>
+      <map>
+        <key>common</key>
+        <map>
+          <key>configurations</key>
+          <map>
+            <key>Debug</key>
+            <map>
+              <key>build</key>
+              <map>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>command</key>
+                <string>cmake</string>
+                <key>options</key>
+                <array>
+                  <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string>
+                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Debug</string>
+            </map>
+            <key>DebugOS</key>
+            <map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>command</key>
+                <string>cmake</string>
+                <key>options</key>
+                <array>
+                  <string>-DCMAKE_BUILD_TYPE:STRING=Debug</string>
+                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>DebugOS</string>
+            </map>
+            <key>RelWithDebInfo</key>
+            <map>
+              <key>build</key>
+              <map>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>command</key>
+                <string>cmake</string>
+                <key>options</key>
+                <array>
+                  <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
+                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>RelWithDebInfo</string>
+            </map>
+            <key>RelWithDebInfoOS</key>
+            <map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>command</key>
+                <string>cmake</string>
+                <key>options</key>
+                <array>
+                  <string>-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo</string>
+                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>RelWithDebInfoOS</string>
+            </map>
+            <key>Release</key>
+            <map>
+              <key>build</key>
+              <map>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>command</key>
+                <string>cmake</string>
+                <key>options</key>
+                <array>
+                  <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
+                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+                  <string>-DINSTALL_PROPRIETARY=TRUE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Release</string>
+            </map>
+            <key>ReleaseOS</key>
+            <map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>command</key>
+                <string>cmake</string>
+                <key>options</key>
+                <array>
+                  <string>-DCMAKE_BUILD_TYPE:STRING=Release</string>
+                  <string>-DWORD_SIZE:STRING=32</string>
+                  <string>-DROOT_PROJECT_NAME:STRING=SecondLife</string>
+                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>ReleaseOS</string>
+            </map>
+          </map>
+          <key>name</key>
+          <string>common</string>
+        </map>
+        <key>darwin</key>
+        <map>
+          <key>build_directory</key>
+          <string>build-darwin-i386</string>
+          <key>configurations</key>
+          <map>
+            <key>Debug</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>|</string>
+                  <string>grep</string>
+                  <string>-v</string>
+                  <string>setenv</string>
+                </array>
+                <key>command</key>
+                <string>xcodebuild</string>
+                <key>options</key>
+                <array>
+                  <string>-configuration Debug</string>
+                  <string>-project SecondLife.xcodeproj</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Xcode'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Debug</string>
+            </map>
+            <key>DebugOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>xcodebuild</string>
+                <key>options</key>
+                <array>
+                  <string>-configuration Debug</string>
+                  <string>-project SecondLife.xcodeproj</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Xcode'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>DebugOS</string>
+            </map>
+            <key>RelWithDebInfo</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>|</string>
+                  <string>grep</string>
+                  <string>-v</string>
+                  <string>setenv</string>
+                </array>
+                <key>command</key>
+                <string>xcodebuild</string>
+                <key>options</key>
+                <array>
+                  <string>-configuration RelWithDebInfo</string>
+                  <string>-project SecondLife.xcodeproj</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Xcode'</string>
+                </array>
+              </map>
+              <key>default</key>
+              <string>True</string>
+              <key>name</key>
+              <string>RelWithDebInfo</string>
+            </map>
+            <key>RelWithDebInfoOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>xcodebuild</string>
+                <key>options</key>
+                <array>
+                  <string>-configuration RelWithDebInfo</string>
+                  <string>-project SecondLife.xcodeproj</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Xcode'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>RelWithDebInfoOS</string>
+            </map>
+            <key>Release</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>|</string>
+                  <string>grep</string>
+                  <string>-v</string>
+                  <string>setenv</string>
+                </array>
+                <key>command</key>
+                <string>xcodebuild</string>
+                <key>options</key>
+                <array>
+                  <string>-configuration Release</string>
+                  <string>-project SecondLife.xcodeproj</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Xcode'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Release</string>
+            </map>
+            <key>ReleaseOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>xcodebuild</string>
+                <key>options</key>
+                <array>
+                  <string>-configuration Release</string>
+                  <string>-project SecondLife.xcodeproj</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Xcode'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>ReleaseOS</string>
+            </map>
+          </map>
+          <key>name</key>
+          <string>darwin</string>
+        </map>
+        <key>linux</key>
+        <map>
+          <key>build_directory</key>
+          <string>build-linux-i686</string>
+          <key>configurations</key>
+          <map>
+            <key>Debug</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>make</string>
+                <key>options</key>
+                <array>
+                  <string>-j 12</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Unix Makefiles'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Debug</string>
+            </map>
+            <key>DebugOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>make</string>
+                <key>options</key>
+                <array>
+                  <string>-j 2</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Unix Makefiles'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>DebugOS</string>
+            </map>
+            <key>RelWithDebInfo</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>make</string>
+                <key>options</key>
+                <array>
+                  <string>-j 12</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Unix Makefiles'</string>
+                </array>
+              </map>
+              <key>default</key>
+              <string>True</string>
+              <key>name</key>
+              <string>RelWithDebInfo</string>
+            </map>
+            <key>RelWithDebInfoOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>make</string>
+                <key>options</key>
+                <array>
+                  <string>-j 2</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Unix Makefiles'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>RelWithDebInfoOS</string>
+            </map>
+            <key>Release</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>make</string>
+                <key>options</key>
+                <array>
+                  <string>-j 12</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>../indra</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Unix Makefiles'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Release</string>
+            </map>
+            <key>ReleaseOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>command</key>
+                <string>make</string>
+                <key>options</key>
+                <array>
+                  <string>-j 2</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>'Unix Makefiles'</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>ReleaseOS</string>
+            </map>
+            <key>default</key>
+            <map>
+              <key>build</key>
+              <map>
+              </map>
+              <key>name</key>
+              <string>default</string>
+            </map>
+          </map>
+          <key>name</key>
+          <string>linux</string>
+        </map>
+        <key>windows</key>
+        <map>
+          <key>build_directory</key>
+          <string>build-vc100</string>
+          <key>configurations</key>
+          <map>
+            <key>Debug</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>SecondLife.sln</string>
+                </array>
+                <key>command</key>
+                <string>BuildConsole</string>
+                <key>options</key>
+                <array>
+                  <string>/build</string>
+                  <string>"/cfg=Debug|Win32"</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>..\indra</string>
+                  <string>&amp;&amp;</string>
+                  <string>..\indra\tools\vstool\VSTool.exe</string>
+                  <string>--solution</string>
+                  <string>SecondLife.sln</string>
+                  <string>--config</string>
+                  <string>Debug</string>
+                  <string>--startup</string>
+                  <string>secondlife-bin</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>"Visual Studio 10"</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Debug</string>
+            </map>
+            <key>DebugOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>SecondLife.sln</string>
+                </array>
+                <key>command</key>
+                <string>msbuild.exe</string>
+                <key>options</key>
+                <array>
+                  <string>/p:Configuration=Debug</string>
+                  <string>/p:Platform=Win32</string>
+                  <string>/t:Build</string>
+                  <string>/p:useenv=true</string>
+                  <string>/verbosity:minimal</string>
+                  <string>/toolsversion:4.0</string>
+                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>"Visual Studio 10"</string>
+                  <string>-DUNATTENDED:BOOL=ON</string>
+                  <string>-DUSE_KDU=FALSE</string>
+                  <string>-DFMOD=FALSE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>DebugOS</string>
+            </map>
+            <key>RelWithDebInfo</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>SecondLife.sln</string>
+                </array>
+                <key>command</key>
+                <string>BuildConsole</string>
+                <key>options</key>
+                <array>
+                  <string>/build</string>
+                  <string>"/cfg=RelWithDebInfo|Win32"</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>..\indra</string>
+                  <string>&amp;&amp;</string>
+                  <string>..\indra\tools\vstool\VSTool.exe</string>
+                  <string>--solution</string>
+                  <string>SecondLife.sln</string>
+                  <string>--config</string>
+                  <string>RelWithDebInfo</string>
+                  <string>--startup</string>
+                  <string>secondlife-bin</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>"Visual Studio 10"</string>
+                </array>
+              </map>
+              <key>default</key>
+              <string>True</string>
+              <key>name</key>
+              <string>RelWithDebInfo</string>
+            </map>
+            <key>RelWithDebInfoOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>SecondLife.sln</string>
+                </array>
+                <key>command</key>
+                <string>msbuild.exe</string>
+                <key>options</key>
+                <array>
+                  <string>/p:Configuration=RelWithDebInfo</string>
+                  <string>/p:Platform=Win32</string>
+                  <string>/t:Build</string>
+                  <string>/p:useenv=true</string>
+                  <string>/verbosity:minimal</string>
+                  <string>/toolsversion:4.0</string>
+                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>"Visual Studio 10"</string>
+                  <string>-DUNATTENDED:BOOL=ON</string>
+                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
+                  <string>-DUSE_KDU=FALSE</string>
+                  <string>-DFMOD=FALSE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>RelWithDebInfoOS</string>
+            </map>
+            <key>Release</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>SecondLife.sln</string>
+                </array>
+                <key>command</key>
+                <string>BuildConsole</string>
+                <key>options</key>
+                <array>
+                  <string>/build</string>
+                  <string>"/cfg=Release|Win32"</string>
+                  <string>"/CL_ADD=/m:1"</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>..\indra</string>
+                  <string>&amp;&amp;</string>
+                  <string>..\indra\tools\vstool\VSTool.exe</string>
+                  <string>--solution</string>
+                  <string>SecondLife.sln</string>
+                  <string>--config</string>
+                  <string>Release</string>
+                  <string>--startup</string>
+                  <string>secondlife-bin</string>
+                </array>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>"Visual Studio 10"</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>Release</string>
+            </map>
+            <key>ReleaseOS</key>
+            <map>
+              <key>build</key>
+              <map>
+                <key>arguments</key>
+                <array>
+                  <string>SecondLife.sln</string>
+                </array>
+                <key>command</key>
+                <string>msbuild.exe</string>
+                <key>options</key>
+                <array>
+                  <string>/p:Configuration=Release</string>
+                  <string>/p:Platform=Win32</string>
+                  <string>/t:Build</string>
+                  <string>/p:useenv=true</string>
+                  <string>/verbosity:minimal</string>
+                  <string>/toolsversion:4.0</string>
+                  <string>/p:"VCBuildAdditionalOptions= /incremental"</string>
+                </array>
+              </map>
+              <key>configure</key>
+              <map>
+                <key>options</key>
+                <array>
+                  <string>-G</string>
+                  <string>"Visual Studio 10"</string>
+                  <string>-DUNATTENDED:BOOL=ON</string>
+                  <string>-DINSTALL_PROPRIETARY=FALSE</string>
+                  <string>-DUSE_KDU=FALSE</string>
+                  <string>-DFMOD=FALSE</string>
+                </array>
+              </map>
+              <key>name</key>
+              <string>ReleaseOS</string>
+            </map>
+          </map>
+          <key>name</key>
+          <string>windows</string>
+        </map>
+      </map>
+    </map>
+    <key>type</key>
+    <string>autobuild</string>
+    <key>version</key>
+    <string>1.2</string>
+  </map>
+</llsd>
diff --git a/build.sh b/build.sh
index f00d403ad49880cfec866f7ba30d5dbe2d95380b..4268c76e78affe3e73432526d3f3e8b0056cce7e 100755
--- a/build.sh
+++ b/build.sh
@@ -32,19 +32,23 @@ build_dir_CYGWIN()
 
 installer_Darwin()
 {
-  ls -1td "$(build_dir_Darwin Release)/newview/"*.dmg 2>/dev/null | sed 1q
+  ls -1td "$(build_dir_Darwin ${last_built_variant:-Release})/newview/"*.dmg 2>/dev/null | sed 1q
 }
 
 installer_Linux()
 {
-  ls -1td "$(build_dir_Linux Release)/newview/"*.tar.bz2 2>/dev/null | sed 1q
+  ls -1td "$(build_dir_Linux ${last_built_variant:-Release})/newview/"*.tar.bz2 2>/dev/null | sed 1q
 }
 
 installer_CYGWIN()
 {
-  d=$(build_dir_CYGWIN Release)
-  p=$(sed 's:.*=::' "$d/newview/Release/touched.bat")
-  echo "$d/newview/Release/$p"
+  v=${last_built_variant:-Release}
+  d=$(build_dir_CYGWIN $v)
+  if [ -r "$d/newview/$v/touched.bat" ]
+  then
+    p=$(sed 's:.*=::' "$d/newview/$v/touched.bat")
+    echo "$d/newview/$v/$p"
+  fi
 }
 
 pre_build()
@@ -58,7 +62,6 @@ pre_build()
     "$AUTOBUILD" configure -c $variant -- \
      -DPACKAGE:BOOL=ON \
      -DRELEASE_CRASH_REPORTING:BOOL=ON \
-     -DUSE_PRECOMPILED_HEADERS=FALSE \
      -DVIEWER_CHANNEL:STRING="\"$viewer_channel\"" \
      -DVIEWER_LOGIN_CHANNEL:STRING="\"$viewer_login_channel\"" \
      -DGRID:STRING="\"$viewer_grid\"" \
@@ -125,6 +128,7 @@ if test -f scripts/update_version_files.py ; then
                 --verbose \
          | sed -n -e "s,Setting viewer channel/version: '\([^']*\)' / '\([^']*\)',VIEWER_CHANNEL='\1';VIEWER_VERSION='\2',p")\
   || fail update_version_files.py
+  echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json
   end_section UpdateVer
 fi
 
@@ -262,9 +266,7 @@ then
     else
       upload_item installer "$package" binary/octet-stream
       upload_item quicklink "$package" binary/octet-stream
-
-      echo "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_VERSION}\"}" > summary.json
-      upload_item installer summary.json text/plain
+      [ -f summary.json ] && upload_item installer summary.json text/plain
 
       # Upload crash reporter files.
       case "$last_built_variant" in
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 6f9cf353a6f8d4786a2dc8a9082e53d4c5b9fb6d..dfbccb5a6c9147218f9650bf8257610f08e7cba6 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -158,6 +158,7 @@ Ann Congrejo
 Ansariel Hiller
 	STORM-1101
 Ardy Lay
+	STORM-859
 	VWR-19499
 	VWR-24917
 Argent Stonecutter
@@ -254,6 +255,8 @@ Dale Glass
 	VWR-2502
 	VWR-1358
 	VWR-2041
+Draconis Neurocam
+	STORM-1259
 Drew Dri
 	VWR-19683
 Drewan Keats
@@ -364,6 +367,10 @@ Ian Kas
 	[NO JIRA] (Ukranian localization)
 	CT-322
 	CT-325
+Ima Mechanique
+	OPEN-50
+	OPEN-61
+	STORM-1175
 Irene Muni
 	CT-324
 	CT-352
@@ -431,6 +438,8 @@ Jonathan Yap
 	STORM-1128
 	STORM-956
 	STORM-1095
+	STORM-1236
+	STORM-1259
 Kage Pixel
 	VWR-11
 Ken March
@@ -448,6 +457,7 @@ Kitty Barnett
 	STORM-799
 	STORM-800
 	STORM-1001
+	STORM-1175
     VWR-24217
 Kunnis Basiat
 	VWR-82
@@ -456,6 +466,8 @@ Lance Corrimal
 	VWR-25269
 Latif Khalifa
 	VWR-5370
+leliel Mirihi
+	STORM-1100
 Lisa Lowe
 	CT-218
 	CT-219
@@ -758,6 +770,8 @@ Strife Onizuka
 	VWR-2265
 	VWR-4111
 	SNOW-691
+TankMaster Finesmith
+	STORM-1100
 Tayra Dagostino
 	SNOW-517
 	SNOW-543
@@ -819,6 +833,8 @@ Tofu Buzzard
 	VWR-24509
 TraductoresAnonimos Alter
 	CT-324
+TriloByte Zanzibar
+	STORM-1100
 Tue Torok
 	CT-68
 	CT-69
@@ -885,6 +901,7 @@ WolfPup Lowenhar
 	STORM-674
 	STORM-776
 	STORM-825
+	STORM-859
 	STORM-1098
 	VWR-20741
 	VWR-20933
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt
index 310e6cbdd42a7b16c70b5fe227d95b674e0d811a..d1042d6e8693ff4692a105d24885081e6a4a233d 100644
--- a/indra/CMakeLists.txt
+++ b/indra/CMakeLists.txt
@@ -35,8 +35,10 @@ endif (NOT CMAKE_BUILD_TYPE)
 
 # For the library installation process;
 # see cmake/Prebuild.cmake for the counterpart code.
-file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp)
-file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0")
+if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed")
+  file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/temp)
+  file(WRITE ${CMAKE_BINARY_DIR}/temp/sentinel_installed "0")
+endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${CMAKE_BINARY_DIR}/temp/sentinel_installed")
 add_subdirectory(cmake)
 
 add_subdirectory(${LIBS_OPEN_PREFIX}llaudio)
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 6d5860657ddd1e704b28e415eb609a69a29b44aa..2c974fb4ff27ba5edab1aa868354e29972eeea3f 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -36,6 +36,13 @@ if (WINDOWS)
   # Don't build DLLs.
   set(BUILD_SHARED_LIBS OFF)
 
+  # for "backwards compatibility", cmake sneaks in the Zm1000 option which royally
+  # screws incredibuild. this hack disables it.
+  # for details see: http://connect.microsoft.com/VisualStudio/feedback/details/368107/clxx-fatal-error-c1027-inconsistent-values-for-ym-between-creation-and-use-of-precompiled-headers
+  # http://www.ogre3d.org/forums/viewtopic.php?f=2&t=60015
+  # http://www.cmake.org/pipermail/cmake/2009-September/032143.html
+  string(REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP -D_SCL_SECURE_NO_WARNINGS=1"
       CACHE STRING "C++ compiler debug options" FORCE)
   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO 
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 881d4caa7859fa59993a65a6789f328085bf16b0..d9efc8f40d2a20865ff3ece415e23e5c222a36fd 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -131,7 +131,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010
         PATHS
         ${MSVC_DEBUG_REDIST_PATH}
          [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/Debug_NonRedist/x86/Microsoft.VC100.DebugCRT
-        NO_DEFAULT_PATH
+        [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64
+        [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32
         NO_DEFAULT_PATH
         )
 
@@ -155,7 +156,8 @@ elseif (MSVC_VERSION EQUAL 1600) # VisualStudio 2010
         PATHS
         ${MSVC_REDIST_PATH}
          [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\Setup\\VC;ProductDir]/redist/x86/Microsoft.VC100.CRT
-        NO_DEFAULT_PATH
+        [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/SysWOW64
+        [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Windows;Directory]/System32
         NO_DEFAULT_PATH
         )
 
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index 3f259f6382e078b92dff9fe223058e501df6f51a..08feab6e36998c559cadb4ce01006787759c4537 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -95,7 +95,7 @@ INCLUDE(GoogleMock)
     IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
       SET(${name}_test_additional_INCLUDE_DIRS "")
     ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
-    INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS )
+    INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${${name}_test_additional_INCLUDE_DIRS} )
     IF(LL_TEST_VERBOSE)
       MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")
     ENDIF(LL_TEST_VERBOSE)
diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake
index 1b60d176f11d141269c664a50b71a189a2e1448a..dbb4dfc46c7f034c792224ac52a33269be1e8028 100644
--- a/indra/cmake/Prebuilt.cmake
+++ b/indra/cmake/Prebuilt.cmake
@@ -1,35 +1,49 @@
 # -*- cmake -*-
 
 include(FindAutobuild)
+if(INSTALL_PROPRIETARY)
+  include(FindSCP)
+endif(INSTALL_PROPRIETARY)
 
+# The use_prebuilt_binary macro handles automated installation of package
+# dependencies using autobuild.  The goal is that 'autobuild install' should
+# only be run when we know we need to install a new package.  This should be
+# the case in a clean checkout, or if autobuild.xml has been updated since the
+# last run (encapsulated by the file ${CMAKE_BINARY_DIR}/temp/sentinel_installed),
+# or if a previous attempt to install the package has failed (the exit status
+# of previous attempts is serialized in the file
+# ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
 macro (use_prebuilt_binary _binary)
   if (NOT DEFINED STANDALONE_${_binary})
     set(STANDALONE_${_binary} ${STANDALONE})
   endif (NOT DEFINED STANDALONE_${_binary})
 
   if (NOT STANDALONE_${_binary})
-    if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
-      if(INSTALL_PROPRIETARY)
-        include(FindSCP)
-      endif(INSTALL_PROPRIETARY)
-	  if(DEBUG_PREBUILT)
-		message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
-		--install-dir=${AUTOBUILD_INSTALL_DIR}
-		--skip-license-check
-		${_binary} ")
-	  endif(DEBUG_PREBUILT)
-	  execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
-		install
-		--install-dir=${AUTOBUILD_INSTALL_DIR}
-		--skip-license-check
-		${_binary}
-		WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
-		RESULT_VARIABLE ${_binary}_installed
-		)
+    if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed")
+      file(READ ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${_binary}_installed")
+      if(DEBUG_PREBUILT)
+        message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"")
+      endif(DEBUG_PREBUILT)
+    endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${CMAKE_BINARY_DIR}/temp/${_binary}_installed")
+
+    if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
+      if(DEBUG_PREBUILT)
+        message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
+        --install-dir=${AUTOBUILD_INSTALL_DIR}
+        --skip-license-check
+        ${_binary} ")
+      endif(DEBUG_PREBUILT)
+      execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
+        install
+        --install-dir=${AUTOBUILD_INSTALL_DIR}
+        --skip-license-check
+        ${_binary}
+        WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
+        RESULT_VARIABLE ${_binary}_installed
+        )
       file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}")
-    else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
-      set(${_binary}_installed 0)
-    endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
+    endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0)
+
     if(NOT ${_binary}_installed EQUAL 0)
       message(FATAL_ERROR
               "Failed to download or unpack prebuilt '${_binary}'."
diff --git a/indra/cmake/Pth.cmake b/indra/cmake/Pth.cmake
deleted file mode 100644
index a28f6ec696efdbbcaeb8c1ee34dfb7dd7d436421..0000000000000000000000000000000000000000
--- a/indra/cmake/Pth.cmake
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- cmake -*-
-include(Prebuilt)
-
-set(PTH_FIND_QUIETLY ON)
-set(PTH_FIND_REQUIRED ON)
-
-if (STANDALONE)
-#  ?? How would I construct FindPTH.cmake? This file was cloned from
-#  CURL.cmake, which uses include(FindCURL), but there's no FindCURL.cmake?
-#  include(FindPTH)
-else (STANDALONE)
-  # This library is only needed to support Boost.Coroutine, and only on Mac.
-  if (DARWIN)
-    use_prebuilt_binary(pth)
-    set(PTH_LIBRARIES pth)
-    set(PTH_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
-  else (DARWIN)
-    set(PTH_LIBRARIES)
-    set(PTH_INCLUDE_DIRS)
-  endif (DARWIN)
-endif (STANDALONE)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index 1a8b16dec7264be22b972aa0aa9b9f8a21a9dcdf..cfccd29deff3db0b5ec60b8a8aa61bce2b31b89e 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -152,7 +152,7 @@ For more information, please see JIRA DEV-14943 - Cmake Linux cannot build both
 endif (LINUX AND SERVER AND VIEWER)
 
 
-set(USE_PRECOMPILED_HEADERS OFF CACHE BOOL "Enable use of precompiled header directives where supported.")
+set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.")
 
 source_group("CMake Rules" FILES CMakeLists.txt)
 
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index 320a9be8abb9aaeaadaaa6a4491913211aafcad5..ce2d1e0386b4a3ca3d36623d0b5be6b5a974e491 100755
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -109,6 +109,8 @@ def main(command, libpath=[], vars={}):
     os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
     # Run the child process.
     print "Running: %s" % " ".join(command)
+    # Make sure we see all relevant output *before* child-process output.
+    sys.stdout.flush()
     return subprocess.call(command)
 
 if __name__ == "__main__":
diff --git a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
index 60ddf63b218992e25fc0eb6a258209c5f7ada6e5..976aae08bb0a7ec5ccf7ba49e2411a5bc08c6b1c 100644
--- a/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
+++ b/indra/integration_tests/llimage_libtest/llimage_libtest.cpp
@@ -70,6 +70,10 @@ static const char USAGE[] = "\n"
 "        be used. Blocks must be smaller than precincts. Like precincts, this option adds\n"
 "        PLT, tile markers and uses RPCL.\n"
 "        Only valid for output j2c images. Default is 64.\n"
+" -l, --levels <n>\n"
+"        Number of decomposition levels (aka discard levels) in the output image.\n"
+"        The maximum number of levels authorized is 32.\n"
+"        Only valid for output j2c images. Default is 5.\n"
 " -rev, --reversible\n"
 "        Set the compression to be lossless (reversible in j2c parlance).\n"
 "        Only valid for output j2c images.\n"
@@ -147,7 +151,7 @@ LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_le
 }
 
 // Save a raw image instance into a file
-bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, bool reversible, bool output_stats)
+bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, int levels, bool reversible, bool output_stats)
 {
 	LLPointer<LLImageFormatted> image = create_image(dest_filename);
 	
@@ -156,9 +160,9 @@ bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_imag
 	{
 		// That method doesn't exist (and likely, doesn't make sense) for any other image file format
 		// hence the required cryptic cast.
-		if ((blocks_size != -1) || (precincts_size != -1))
+		if ((blocks_size != -1) || (precincts_size != -1) || (levels != 0))
 		{
-			((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size);
+			((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size, levels);
 		}
 		((LLImageJ2C*)(image.get()))->setReversible(reversible);
 	}
@@ -306,6 +310,7 @@ int main(int argc, char** argv)
 	int discard_level = -1;
 	int precincts_size = -1;
 	int blocks_size = -1;
+	int levels = 0;
 	bool reversible = false;
 
 	// Init whatever is necessary
@@ -403,7 +408,6 @@ int main(int argc, char** argv)
 			else
 			{
 				precincts_size = atoi(value_str.c_str());
-				// *TODO: make sure precincts_size is a power of 2
 			}
 		}
 		else if (!strcmp(argv[arg], "--blocks") || !strcmp(argv[arg], "-b"))
@@ -420,7 +424,22 @@ int main(int argc, char** argv)
 			else
 			{
 				blocks_size = atoi(value_str.c_str());
-				// *TODO: make sure blocks_size is a power of 2
+			}
+		}
+		else if (!strcmp(argv[arg], "--levels") || !strcmp(argv[arg], "-l"))
+		{
+			std::string value_str;
+			if ((arg + 1) < argc)
+			{
+				value_str = argv[arg+1];
+			}
+			if (((arg + 1) >= argc) || (value_str[0] == '-'))
+			{
+				std::cout << "No valid --levels argument given, default (5) will be used" << std::endl;
+			}
+			else
+			{
+				levels = atoi(value_str.c_str());
 			}
 		}
 		else if (!strcmp(argv[arg], "--reversible") || !strcmp(argv[arg], "-rev"))
@@ -499,7 +518,7 @@ int main(int argc, char** argv)
 		// Save file
 		if (out_file != out_end)
 		{
-			if (!save_image(*out_file, raw_image, blocks_size, precincts_size, reversible, image_stats))
+			if (!save_image(*out_file, raw_image, blocks_size, precincts_size, levels, reversible, image_stats))
 			{
 				std::cout << "Error: Image " << *out_file << " could not be saved" << std::endl;
 			}
diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp
index c34115ee8064a6d8a63b3ad03ad85e7d44b5dfed..217e26c3ca527380c91fd8bbc1e1d42d3debc83b 100644
--- a/indra/integration_tests/llui_libtest/llui_libtest.cpp
+++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp
@@ -33,6 +33,7 @@
 // linden library includes
 #include "llcontrol.h"		// LLControlGroup
 #include "lldir.h"
+#include "lldiriterator.h"
 #include "llerrorcontrol.h"
 #include "llfloater.h"
 #include "llfontfreetype.h"
@@ -174,7 +175,9 @@ void export_test_floaters()
 	std::string delim = gDirUtilp->getDirDelimiter();
 	std::string xui_dir = get_xui_dir() + "en" + delim;
 	std::string filename;
-	while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename))
+
+	LLDirIterator iter(xui_dir, "floater_test_*.xml");
+	while (iter.next(filename))
 	{
 		if (filename.find("_new.xml") != std::string::npos)
 		{
diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp
index a81de0223c8f432b3740894fbc6dce824f5b3089..eed00ac06ec2606b3204869b6679e47f3ea97180 100644
--- a/indra/linux_updater/linux_updater.cpp
+++ b/indra/linux_updater/linux_updater.cpp
@@ -33,6 +33,7 @@
 #include "llerrorcontrol.h"
 #include "llfile.h"
 #include "lldir.h"
+#include "lldiriterator.h"
 #include "llxmlnode.h"
 #include "lltrans.h"
 
@@ -55,6 +56,8 @@ typedef struct _updater_app_state {
 	std::string strings_dirs;
 	std::string strings_file;
 
+	LLDirIterator *image_dir_iter;
+
 	GtkWidget *window;
 	GtkWidget *progress_bar;
 	GtkWidget *image;
@@ -115,7 +118,7 @@ bool translate_init(std::string comma_delim_path_list,
 void updater_app_ui_init(void);
 void updater_app_quit(UpdaterAppState *app_state);
 void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state);
-std::string next_image_filename(std::string& image_path);
+std::string next_image_filename(std::string& image_path, LLDirIterator& iter);
 void display_error(GtkWidget *parent, std::string title, std::string message);
 BOOL install_package(std::string package_file, std::string destination);
 BOOL spawn_viewer(UpdaterAppState *app_state);
@@ -181,7 +184,7 @@ void updater_app_ui_init(UpdaterAppState *app_state)
 
 		// load the first image
 		app_state->image = gtk_image_new_from_file
-			(next_image_filename(app_state->image_dir).c_str());
+			(next_image_filename(app_state->image_dir, *app_state->image_dir_iter).c_str());
 		gtk_widget_set_size_request(app_state->image, 340, 310);
 		gtk_container_add(GTK_CONTAINER(frame), app_state->image);
 
@@ -212,7 +215,7 @@ gboolean rotate_image_cb(gpointer data)
 	llassert(data != NULL);
 	app_state = (UpdaterAppState *) data;
 
-	filename = next_image_filename(app_state->image_dir);
+	filename = next_image_filename(app_state->image_dir, *app_state->image_dir_iter);
 
 	gdk_threads_enter();
 	gtk_image_set_from_file(GTK_IMAGE(app_state->image), filename.c_str());
@@ -221,10 +224,10 @@ gboolean rotate_image_cb(gpointer data)
 	return TRUE;
 }
 
-std::string next_image_filename(std::string& image_path)
+std::string next_image_filename(std::string& image_path, LLDirIterator& iter)
 {
 	std::string image_filename;
-	gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename);
+	iter.next(image_filename);
 	return image_path + "/" + image_filename;
 }
 
@@ -748,6 +751,7 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state)
 		else if ((!strcmp(argv[i], "--image-dir")) && (++i < argc))
 		{
 			app_state->image_dir = argv[i];
+			app_state->image_dir_iter = new LLDirIterator(argv[i], "/*.jpg");
 		}
 		else if ((!strcmp(argv[i], "--dest")) && (++i < argc))
 		{
@@ -832,6 +836,7 @@ int main(int argc, char **argv)
 	}
 
 	bool success = !app_state->failure;
+	delete app_state->image_dir_iter;
 	delete app_state;
 	return success ? 0 : 1;
 }
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 22e0705036f3622239fa5ebb7ae498df6f566180..9910281b649b472107be29397c4293f80377ab53 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -7,7 +7,6 @@ include(00-Common)
 include(LLCommon)
 include(Linking)
 include(Boost)
-include(Pth)
 include(LLSharedLibs)
 include(GoogleBreakpad)
 include(GooglePerfTools)
@@ -18,7 +17,6 @@ include_directories(
     ${EXPAT_INCLUDE_DIRS}
     ${LLCOMMON_INCLUDE_DIRS}
     ${ZLIB_INCLUDE_DIRS}
-    ${PTH_INCLUDE_DIRS}
     )
 
 # add_executable(lltreeiterators lltreeiterators.cpp)
@@ -117,6 +115,7 @@ set(llcommon_HEADER_FILES
     indra_constants.h
     linden_common.h
     linked_lists.h
+    llaccountingquota.h
     llallocator.h
     llallocator_heap_profile.h
     llagentconstants.h
@@ -268,6 +267,10 @@ if(LLCOMMON_LINK_SHARED)
       add_definitions(-fPIC)
     endif(WINDOWS)
   endif(NOT WORD_SIZE EQUAL 32)
+  if(WINDOWS)
+    # always generate llcommon.pdb, even for "Release" builds
+    set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG")
+  endif(WINDOWS)
   ll_stage_sharedlib(llcommon)
 else(LLCOMMON_LINK_SHARED)
     add_library (llcommon ${llcommon_SOURCE_FILES})
@@ -283,10 +286,15 @@ target_link_libraries(
     ${WINDOWS_LIBRARIES}
     ${BOOST_PROGRAM_OPTIONS_LIBRARY}
     ${BOOST_REGEX_LIBRARY}
-    ${PTH_LIBRARIES}
     ${GOOGLE_PERFTOOLS_LIBRARIES}
     )
 
+if (DARWIN)
+  include(CMakeFindFrameworks)
+  find_library(CARBON_LIBRARY Carbon)
+  target_link_libraries(llcommon ${CARBON_LIBRARY})
+endif (DARWIN)
+
 add_dependencies(llcommon stage_third_party_libs)
 
 if (LL_TESTS)
diff --git a/indra/llcommon/llaccountingquota.h b/indra/llcommon/llaccountingquota.h
new file mode 100644
index 0000000000000000000000000000000000000000..f52d94f868392eb3f5e3e2ed1a57c004d94d28f3
--- /dev/null
+++ b/indra/llcommon/llaccountingquota.h
@@ -0,0 +1,78 @@
+/** 
+ * @file llaccountingquota.h
+ * @
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCOUNTINGQUOTA_H
+#define LL_ACCOUNTINGQUOTA_H
+
+struct ParcelQuota
+{
+	ParcelQuota( F32 ownerRenderCost, F32 ownerPhysicsCost, F32 ownerNetworkCost, F32 ownerSimulationCost,
+				F32 groupRenderCost, F32 groupPhysicsCost, F32 groupNetworkCost, F32 groupSimulationCost,
+				F32 otherRenderCost, F32 otherPhysicsCost, F32 otherNetworkCost, F32 otherSimulationCost,
+				F32 totalRenderCost, F32 totalPhysicsCost, F32 totalNetworkCost, F32 totalSimulationCost)
+	: mOwnerRenderCost( ownerRenderCost ), mOwnerPhysicsCost( ownerPhysicsCost ) 
+	, mOwnerNetworkCost( ownerNetworkCost ), mOwnerSimulationCost( ownerSimulationCost )
+	, mGroupRenderCost( groupRenderCost ), mGroupPhysicsCost( groupPhysicsCost )
+	, mGroupNetworkCost( groupNetworkCost ), mGroupSimulationCost( groupSimulationCost )
+	, mOtherRenderCost( otherRenderCost ), mOtherPhysicsCost( otherPhysicsCost )
+	, mOtherNetworkCost( otherNetworkCost ), mOtherSimulationCost( otherSimulationCost )
+	, mTotalRenderCost( totalRenderCost ), mTotalPhysicsCost( totalPhysicsCost ) 
+	, mTotalNetworkCost( totalNetworkCost ), mTotalSimulationCost( totalSimulationCost )
+	{
+	}
+	ParcelQuota(){}			
+	F32 mOwnerRenderCost, mOwnerPhysicsCost, mOwnerNetworkCost, mOwnerSimulationCost;
+	F32 mGroupRenderCost, mGroupPhysicsCost, mGroupNetworkCost, mGroupSimulationCost;
+	F32 mOtherRenderCost, mOtherPhysicsCost, mOtherNetworkCost, mOtherSimulationCost;
+	F32 mTotalRenderCost, mTotalPhysicsCost, mTotalNetworkCost, mTotalSimulationCost;
+};
+
+struct SelectionQuota
+{
+	SelectionQuota( S32 localId, F32 renderCost, F32 physicsCost, F32 networkCost, F32 simulationCost )
+	: mLocalId( localId)
+	, mRenderCost( renderCost )
+	, mPhysicsCost( physicsCost )
+	, mNetworkCost( networkCost )
+	, mSimulationCost( simulationCost )
+	{
+	}
+	SelectionQuota() {}
+	
+	F32 mRenderCost, mPhysicsCost, mNetworkCost, mSimulationCost;	
+	S32 mLocalId;
+};
+
+#endif
+
+
+
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 39daefd1ad63ce8b29827972473dadfab53d3c5c..ed192a9975125106a8ffafb4d1f72b84d59f0917 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -24,6 +24,10 @@
  * $/LicenseInfo$
  */
 
+#include "linden_common.h"
+
+#include "llapp.h"
+
 #include <cstdlib>
 
 #ifdef LL_DARWIN
@@ -32,9 +36,6 @@
 #include <sys/sysctl.h>
 #endif
 
-#include "linden_common.h"
-#include "llapp.h"
-
 #include "llcommon.h"
 #include "llapr.h"
 #include "llerrorcontrol.h"
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 0adb78236ea24ca8fbe5b8fccecbe2723f1b57f5..3bd14035768e31b1859e33645f4924d8319cffed 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -28,7 +28,7 @@
 
 #include "llmemtype.h"
 
-#if 0  //DON'T use ll_aligned_foo now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals)
+#if LL_DEBUG
 inline void* ll_aligned_malloc( size_t size, int align )
 {
 	void* mem = malloc( size + (align - 1) + sizeof(void*) );
@@ -95,7 +95,15 @@ inline void ll_aligned_free_32(void *p)
 	free(p); // posix_memalign() is compatible with heap deallocator
 #endif
 }
-#endif
+#else // LL_DEBUG
+// ll_aligned_foo are noops now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals)
+#define ll_aligned_malloc( size, align ) malloc(size)
+#define ll_aligned_free( ptr ) free(ptr)
+#define ll_aligned_malloc_16 malloc
+#define ll_aligned_free_16 free
+#define ll_aligned_malloc_32 malloc
+#define ll_aligned_free_32 free
+#endif // LL_DEBUG
 
 class LL_COMMON_API LLMemory
 {
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 10cdc7087b3395a121c4b49a41988e63cc67ade8..ca2d3f918156a7f59e2905baa1f29c394c3856a1 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -46,6 +46,7 @@
 #	include <sys/sysctl.h>
 #	include <sys/utsname.h>
 #	include <stdint.h>
+#	include <Carbon/Carbon.h>
 #elif LL_LINUX
 #	include <errno.h>
 #	include <sys/utsname.h>
@@ -318,7 +319,58 @@ LLOSInfo::LLOSInfo() :
 	}
 	mOSString += compatibility_mode;
 
+#elif LL_DARWIN
+	
+	// Initialize mOSStringSimple to something like:
+	// "Mac OS X 10.6.7"
+	{
+		const char * DARWIN_PRODUCT_NAME = "Mac OS X";
+		
+		SInt32 major_version, minor_version, bugfix_version;
+		OSErr r1 = Gestalt(gestaltSystemVersionMajor, &major_version);
+		OSErr r2 = Gestalt(gestaltSystemVersionMinor, &minor_version);
+		OSErr r3 = Gestalt(gestaltSystemVersionBugFix, &bugfix_version);
+
+		if((r1 == noErr) && (r2 == noErr) && (r3 == noErr))
+		{
+			mMajorVer = major_version;
+			mMinorVer = minor_version;
+			mBuild = bugfix_version;
+
+			std::stringstream os_version_string;
+			os_version_string << DARWIN_PRODUCT_NAME << " " << mMajorVer << "." << mMinorVer << "." << mBuild;
+			
+			// Put it in the OS string we are compiling
+			mOSStringSimple.append(os_version_string.str());
+		}
+		else
+		{
+			mOSStringSimple.append("Unable to collect OS info");
+		}
+	}
+	
+	// Initialize mOSString to something like:
+	// "Mac OS X 10.6.7 Darwin Kernel Version 10.7.0: Sat Jan 29 15:17:16 PST 2011; root:xnu-1504.9.37~1/RELEASE_I386 i386"
+	struct utsname un;
+	if(uname(&un) != -1)
+	{		
+		mOSString = mOSStringSimple;
+		mOSString.append(" ");
+		mOSString.append(un.sysname);
+		mOSString.append(" ");
+		mOSString.append(un.release);
+		mOSString.append(" ");
+		mOSString.append(un.version);
+		mOSString.append(" ");
+		mOSString.append(un.machine);
+	}
+	else
+	{
+		mOSString = mOSStringSimple;
+	}
+	
 #else
+	
 	struct utsname un;
 	if(uname(&un) != -1)
 	{
@@ -334,15 +386,7 @@ LLOSInfo::LLOSInfo() :
 
 		// Simplify 'Simple'
 		std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0));
-		if (ostype == "Darwin")
-		{
-			// Only care about major Darwin versions, truncate at first '.'
-			S32 idx1 = mOSStringSimple.find_first_of(".", 0);
-			std::string simple = mOSStringSimple.substr(0, idx1);
-			if (simple.length() > 0)
-				mOSStringSimple = simple;
-		}
-		else if (ostype == "Linux")
+		if (ostype == "Linux")
 		{
 			// Only care about major and minor Linux versions, truncate at second '.'
 			std::string::size_type idx1 = mOSStringSimple.find_first_of(".", 0);
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 08026c38a6344d9ae6461d1251e34eec6d181ede..7703132d903d8eb956de2ffc3f7f8265116b82b1 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -28,8 +28,8 @@
 #define LL_LLVERSIONVIEWER_H
 
 const S32 LL_VERSION_MAJOR = 2;
-const S32 LL_VERSION_MINOR = 6;
-const S32 LL_VERSION_PATCH = 8;
+const S32 LL_VERSION_MINOR = 7;
+const S32 LL_VERSION_PATCH = 0;
 const S32 LL_VERSION_BUILD = 0;
 
 const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 18444f393415b572c4e20140409ea8bf753b8eb9..c464c3b2b67e01fe2a692331978bd9771d282852 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -35,8 +35,21 @@
 
 const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2
 const S32 MAX_IMAGE_MIP = 11; // 2048x2048
+
+// *TODO : Use MAX_IMAGE_MIP as max discard level and modify j2c management so that the number 
+// of levels is read from the header's file, not inferred from its size.
 const S32 MAX_DISCARD_LEVEL = 5;
 
+// JPEG2000 size constraints
+// Those are declared here as they are germane to other image constraints used in the viewer
+// and declared right here. Some come from the JPEG2000 spec, some conventions specific to SL.
+const S32 MAX_DECOMPOSITION_LEVELS = 32;	// Number of decomposition levels cannot exceed 32 according to jpeg2000 spec
+const S32 MIN_DECOMPOSITION_LEVELS = 5;		// the SL viewer will *crash* trying to decode images with fewer than 5 decomposition levels (unless image is small that is)
+const S32 MAX_PRECINCT_SIZE = 2048;			// No reason to be bigger than MAX_IMAGE_SIZE 
+const S32 MIN_PRECINCT_SIZE = 4;			// Can't be smaller than MIN_BLOCK_SIZE
+const S32 MAX_BLOCK_SIZE = 64;				// Max total block size is 4096, hence 64x64 when using square blocks
+const S32 MIN_BLOCK_SIZE = 4;				// Min block dim is 4 according to jpeg2000 spec
+
 const S32 MIN_IMAGE_SIZE = (1<<MIN_IMAGE_MIP); // 4, only used for expand/contract power of 2
 const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048
 const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE;
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index a90df0f1c17139eb320d40e4dd8d22873a07dc8b..44e6b89dd34ac5072c74c87c26b0e26a58b8976c 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -144,9 +144,9 @@ BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* regio
 	return mImpl->initDecode(*this,raw_image,discard_level,region);
 }
 
-BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size)
+BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
 {
-	return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size);
+	return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels);
 }
 
 BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h
index 6bba81aab539a54b1264bc7dfa2ea0ccf2339267..914174fc57fd092ddfdd2e436e79ebdebd87b4fa 100644
--- a/indra/llimage/llimagej2c.h
+++ b/indra/llimage/llimagej2c.h
@@ -57,7 +57,7 @@ class LLImageJ2C : public LLImageFormatted
 	/*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());
 	
 	BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region);
-	BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size);
+	BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);
 	
 	// Encode with comment text 
 	BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
@@ -120,7 +120,7 @@ class LLImageJ2CImpl
 	virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
 							BOOL reversible=FALSE) = 0;
 	virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0;
-	virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1) = 0;
+	virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;
 
 	friend class LLImageJ2C;
 };
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index 8288fa1f5c383270ec326ebf0d6632768f083c68..d15824ce5afd7da462e19ba7f823f33d92d67c4f 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -113,7 +113,7 @@ BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disca
 	return FALSE;
 }
 
-BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size)
+BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
 {
 	// No specific implementation for this method in the OpenJpeg case
 	return FALSE;
diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h
index 9c7cc09fcbcacdd1c35222d05f01f28aa58b606c..40ad4edb00fef16f726be93416fef5d216f4719a 100644
--- a/indra/llimagej2coj/llimagej2coj.h
+++ b/indra/llimagej2coj/llimagej2coj.h
@@ -40,7 +40,7 @@ class LLImageJ2COJ : public LLImageJ2CImpl
 	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
 								BOOL reversible = FALSE);
 	/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
-	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1);
+	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
 };
 
 #endif
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 0a4cd51ea091a7e44a7a6faeb66e86b9e0658a4c..e8cd871157bfed75cc51a11b2f5f1ebd39a68d01 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -1348,3 +1348,12 @@ LLParcel::ECategory category_ui_string_to_category(const std::string& s)
     // is a distinct option from "None" and "Other"
     return LLParcel::C_ANY;
 }
+
+void LLParcel::updateQuota( const LLUUID& objectId,  const ParcelQuota& quota )
+{
+	if ( mID == objectId )
+	{
+		mQuota = quota;
+	}
+}
+
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 71b65d99ced3c90a4a879b443d9bb481f68590dc..48933379677ba94c429eb46fb611cd3ffab6655d 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -34,7 +34,7 @@
 #include "llpermissions.h"
 #include "lltimer.h"
 #include "v3math.h"
-
+#include "llaccountingquota.h"
 
 // Grid out of which parcels taken is stepped every 4 meters.
 const F32 PARCEL_GRID_STEP_METERS	= 4.f;
@@ -586,7 +586,11 @@ class LLParcel
 	LLUUID	getPreviousOwnerID() const		{ return mPreviousOwnerID; }
 	BOOL	getPreviouslyGroupOwned() const	{ return mPreviouslyGroupOwned; }
 	BOOL	getSellWithObjects() const		{ return (mParcelFlags & PF_SELL_PARCEL_OBJECTS) ? TRUE : FALSE; }
-
+	
+	
+			void		 updateQuota( const LLUUID& objectId, const ParcelQuota& quota );
+	const	ParcelQuota& getQuota( void ) { return mQuota; }	
+	
 protected:
 	LLUUID mID;
 	LLUUID				mOwnerID;
@@ -657,8 +661,9 @@ class LLParcel
 	BOOL				mRegionPushOverride;
 	BOOL				mRegionDenyAnonymousOverride;
 	BOOL				mRegionDenyAgeUnverifiedOverride;
-
-
+	
+	ParcelQuota			mQuota;
+	
 public:
 	// HACK, make private
 	S32					mLocalID;
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
index ae456a48be68fafbd283cc3fc7627cec0d596fd4..39ae09650e1abd53e5635f3bbcb37eb6fd31de18 100644
--- a/indra/llkdu/llimagej2ckdu.cpp
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -29,6 +29,7 @@
 
 #include "lltimer.h"
 #include "llpointer.h"
+#include "llmath.h"
 #include "llkdumem.h"
 
 
@@ -192,7 +193,8 @@ mTileIndicesp(NULL),
 mRawImagep(NULL),
 mDecodeState(NULL),
 mBlocksSize(-1),
-mPrecinctsSize(-1)
+mPrecinctsSize(-1),
+mLevels(0)
 {
 }
 
@@ -328,10 +330,29 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int disc
 	return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region);
 }
 
-BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size)
+BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
 {
-	mBlocksSize = blocks_size;
 	mPrecinctsSize = precincts_size;
+	if (mPrecinctsSize != -1)
+	{
+		mPrecinctsSize = get_lower_power_two(mPrecinctsSize,MAX_PRECINCT_SIZE);
+		mPrecinctsSize = llmax(mPrecinctsSize,MIN_PRECINCT_SIZE);
+	}
+	mBlocksSize = blocks_size;
+	if (mBlocksSize != -1)
+	{
+		mBlocksSize = get_lower_power_two(mBlocksSize,MAX_BLOCK_SIZE);
+		mBlocksSize = llmax(mBlocksSize,MIN_BLOCK_SIZE);
+		if (mPrecinctsSize != -1)
+		{
+			mBlocksSize = llmin(mBlocksSize,mPrecinctsSize);	// blocks *must* be smaller than precincts
+		}
+	}
+	mLevels = levels;
+	if (mLevels != 0)
+	{
+		mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MIN_DECOMPOSITION_LEVELS);		
+	}
 	return TRUE;
 }
 
@@ -373,10 +394,12 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 
 		// Resize raw_image according to the image to be decoded
 		kdu_dims dims; mCodeStreamp->get_dims(0,dims);
+		// *TODO: Use the real number of levels read from the file throughout the code instead of relying on an infered value from dimensions
+		//S32 levels = mCodeStreamp->get_min_dwt_levels();
 		S32 channels = base.getComponents() - first_channel;
 		channels = llmin(channels,max_channel_count);
 		raw_image.resize(dims.size.x, dims.size.y, channels);
-		//	llinfos << "Resizing raw_image to " << dims.size.x << ":" << dims.size.y << llendl;
+		//llinfos << "j2c image dimension: width = " << dims.size.x << ", height = " << dims.size.y << ", channels = " << channels << ", levels = " << levels << llendl;
 
 		if (!mTileIndicesp)
 		{
@@ -653,6 +676,11 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
 			std::string Parts_string = llformat("ORGtparts=R");
 			codestream.access_siz()->parse_string(Parts_string.c_str());
 		}
+		if (mLevels != 0)
+		{
+			std::string levels_string = llformat("Clevels=%d",mLevels);
+			codestream.access_siz()->parse_string(levels_string.c_str());
+		}
 		
 		codestream.access_siz()->finalize_all();
 		codestream.change_appearance(transpose,vflip,hflip);
diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h
index 9fce58b76258a3ea77512d606755e5f22ad2f96b..1489dbf7043ba08a21a30152ebc0fb121a535233 100644
--- a/indra/llkdu/llimagej2ckdu.h
+++ b/indra/llkdu/llimagej2ckdu.h
@@ -59,7 +59,7 @@ class LLImageJ2CKDU : public LLImageJ2CImpl
 	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
 								BOOL reversible=FALSE);
 	/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
-	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1);
+	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
 
 private:
 	BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL);
@@ -73,6 +73,7 @@ class LLImageJ2CKDU : public LLImageJ2CImpl
 	kdu_dims *mTileIndicesp;
 	int mBlocksSize;
 	int mPrecinctsSize;
+	int mLevels;
 
 	// Temporary variables for in-progress decodes...
 	LLImageRaw *mRawImagep;
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
index 7ac24a969a09cccd04710710951e67ede9504ded..ab60ab6d502d05ee3bb0dcb21d43bf4eac151095 100644
--- a/indra/llkdu/tests/llimagej2ckdu_test.cpp
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -134,6 +134,7 @@ kdu_params* kdu_params::access_cluster(const char*) { return NULL; }
 void kdu_codestream::set_fast() { }
 void kdu_codestream::set_fussy() { }
 void kdu_codestream::get_dims(int, kdu_dims&, bool ) { }
+int kdu_codestream::get_min_dwt_levels() { return 5; }
 void kdu_codestream::change_appearance(bool, bool, bool) { }
 void kdu_codestream::get_tile_dims(kdu_coords, int, kdu_dims&, bool ) { }
 void kdu_codestream::destroy() { }
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 70e1e1f312e5b17c3351bcc9732ed665f0cf3987..c504215ee5252f9c7ccf315395e4b721ef5b1bbe 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -51,6 +51,7 @@
 #include "llsdserialize.h"
 #include "llvector4a.h"
 #include "llmatrix4a.h"
+#include "lltimer.h"
 
 #define DEBUG_SILHOUETTE_BINORMALS 0
 #define DEBUG_SILHOUETTE_NORMALS 0 // TomY: Use this to display normals using the silhouette
@@ -1883,9 +1884,9 @@ LLVolume::~LLVolume()
 	mProfilep = NULL;
 	mVolumeFaces.clear();
 
-	free(mHullPoints);
+	ll_aligned_free_16(mHullPoints);
 	mHullPoints = NULL;
-	free(mHullIndices);
+	ll_aligned_free_16(mHullIndices);
 	mHullIndices = NULL;
 }
 
@@ -2007,7 +2008,7 @@ void LLVolumeFace::VertexData::init()
 {
 	if (!mData)
 	{
-		mData = (LLVector4a*) malloc(sizeof(LLVector4a)*2);
+		mData = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*2);
 	}
 }
 
@@ -2036,7 +2037,7 @@ const LLVolumeFace::VertexData& LLVolumeFace::VertexData::operator=(const LLVolu
 
 LLVolumeFace::VertexData::~VertexData()
 {
-	free(mData);
+	ll_aligned_free_16(mData);
 	mData = NULL;
 }
 
@@ -2183,7 +2184,8 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
 			}
 
 			U16* indices = (U16*) &(idx[0]);
-			for (U32 j = 0; j < idx.size()/2; ++j)
+			U32 count = idx.size()/2;
+			for (U32 j = 0; j < count; ++j)
 			{
 				face.mIndices[j] = indices[j];
 			}
@@ -2192,6 +2194,81 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
 			U32 num_verts = pos.size()/(3*2);
 			face.resizeVertices(num_verts);
 
+			LLVector3 minp;
+			LLVector3 maxp;
+			LLVector2 min_tc; 
+			LLVector2 max_tc; 
+		
+			minp.setValue(mdl[i]["PositionDomain"]["Min"]);
+			maxp.setValue(mdl[i]["PositionDomain"]["Max"]);
+			LLVector4a min_pos, max_pos;
+			min_pos.load3(minp.mV);
+			max_pos.load3(maxp.mV);
+
+			min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]);
+			max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]);
+
+			LLVector4a pos_range;
+			pos_range.setSub(max_pos, min_pos);
+			LLVector2 tc_range2 = max_tc - min_tc;
+			LLVector4a tc_range;
+			tc_range.set(tc_range2[0], tc_range2[1], tc_range2[0], tc_range2[1]);
+			LLVector4a min_tc4(min_tc[0], min_tc[1], min_tc[0], min_tc[1]);
+
+			LLVector4a* pos_out = face.mPositions;
+			LLVector4a* norm_out = face.mNormals;
+			LLVector4a* tc_out = (LLVector4a*) face.mTexCoords;
+
+			{
+				U16* v = (U16*) &(pos[0]);
+				for (U32 j = 0; j < num_verts; ++j)
+				{
+					pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]);
+					pos_out->div(65535.f);
+					pos_out->mul(pos_range);
+					pos_out->add(min_pos);
+					pos_out++;
+					v += 3;
+				}
+
+			}
+
+			{
+				U16* n = (U16*) &(norm[0]);
+				for (U32 j = 0; j < num_verts; ++j)
+				{
+					norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]);
+					norm_out->div(65535.f);
+					norm_out->mul(2.f);
+					norm_out->sub(1.f);
+					norm_out++;
+					n += 3;
+				}
+			}
+
+			{
+				U16* t = (U16*) &(tc[0]);
+				for (U32 j = 0; j < num_verts; j+=2)
+				{
+					if (j < num_verts-1)
+					{
+						tc_out->set((F32) t[0], (F32) t[1], (F32) t[2], (F32) t[3]);
+					}
+					else
+					{
+						tc_out->set((F32) t[0], (F32) t[1], 0.f, 0.f);
+					}
+
+					t += 4;
+
+					tc_out->div(65535.f);
+					tc_out->mul(tc_range);
+					tc_out->add(min_tc4);
+
+					tc_out++;
+				}
+			}
+
 			if (mdl[i].has("Weights"))
 			{
 				face.allocateWeights(num_verts);
@@ -2239,56 +2316,6 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
 					
 			}
 
-			LLVector3 minp;
-			LLVector3 maxp;
-			LLVector2 min_tc; 
-			LLVector2 max_tc; 
-		
-			minp.setValue(mdl[i]["PositionDomain"]["Min"]);
-			maxp.setValue(mdl[i]["PositionDomain"]["Max"]);
-			LLVector4a min_pos, max_pos;
-			min_pos.load3(minp.mV);
-			max_pos.load3(maxp.mV);
-
-			min_tc.setValue(mdl[i]["TexCoord0Domain"]["Min"]);
-			max_tc.setValue(mdl[i]["TexCoord0Domain"]["Max"]);
-
-			LLVector4a pos_range;
-			pos_range.setSub(max_pos, min_pos);
-			LLVector2 tc_range = max_tc - min_tc;
-
-			LLVector4a* pos_out = face.mPositions;
-			LLVector4a* norm_out = face.mNormals;
-			LLVector2* tc_out = face.mTexCoords;
-
-			for (U32 j = 0; j < num_verts; ++j)
-			{
-				U16* v = (U16*) &(pos[j*3*2]);
-
-				pos_out->set((F32) v[0], (F32) v[1], (F32) v[2]);
-				pos_out->div(65535.f);
-				pos_out->mul(pos_range);
-				pos_out->add(min_pos);
-
-				pos_out++;
-
-				U16* n = (U16*) &(norm[j*3*2]);
-
-				norm_out->set((F32) n[0], (F32) n[1], (F32) n[2]);
-				norm_out->div(65535.f);
-				norm_out->mul(2.f);
-				norm_out->sub(1.f);
-				norm_out++;
-
-				U16* t = (U16*) &(tc[j*2*2]);
-
-				tc_out->mV[0] = (F32) t[0] / 65535.f * tc_range.mV[0] + min_tc.mV[0];
-				tc_out->mV[1] =	(F32) t[1] / 65535.f * tc_range.mV[1] + min_tc.mV[1];
-
-				tc_out++;
-			}
-
-			
 			// modifier flags?
 			bool do_mirror = (mParams.getSculptType() & LL_SCULPT_FLAG_MIRROR);
 			bool do_invert = (mParams.getSculptType() &LL_SCULPT_FLAG_INVERT);
@@ -2361,7 +2388,7 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
 			}
 		}
 	}
-
+	
 	mSculptLevel = 0;  // success!
 
 	cacheOptimize();
@@ -5192,7 +5219,7 @@ LLVolumeFace::LLVolumeFace() :
 	mWeights(NULL),
 	mOctree(NULL)
 {
-	mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3);
+	mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
 	mCenter = mExtents+2;
 }
 
@@ -5213,7 +5240,7 @@ LLVolumeFace::LLVolumeFace(const LLVolumeFace& src)
 	mWeights(NULL),
 	mOctree(NULL)
 { 
-	mExtents = (LLVector4a*) malloc(sizeof(LLVector4a)*3);
+	mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3);
 	mCenter = mExtents+2;
 	*this = src;
 }
@@ -5263,7 +5290,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
 		}
 		else
 		{
-			free(mBinormals);
+			ll_aligned_free_16(mBinormals);
 			mBinormals = NULL;
 		}
 
@@ -5274,7 +5301,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
 		}
 		else
 		{
-			free(mWeights);
+			ll_aligned_free_16(mWeights);
 			mWeights = NULL;
 		}
 	}
@@ -5292,7 +5319,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)
 
 LLVolumeFace::~LLVolumeFace()
 {
-	free(mExtents);
+	ll_aligned_free_16(mExtents);
 	mExtents = NULL;
 
 	freeData();
@@ -5300,17 +5327,17 @@ LLVolumeFace::~LLVolumeFace()
 
 void LLVolumeFace::freeData()
 {
-	free(mPositions);
+	ll_aligned_free_16(mPositions);
 	mPositions = NULL;
-	free( mNormals);
+	ll_aligned_free_16( mNormals);
 	mNormals = NULL;
-	free(mTexCoords);
+	ll_aligned_free_16(mTexCoords);
 	mTexCoords = NULL;
-	free(mIndices);
+	ll_aligned_free_16(mIndices);
 	mIndices = NULL;
-	free(mBinormals);
+	ll_aligned_free_16(mBinormals);
 	mBinormals = NULL;
-	free(mWeights);
+	ll_aligned_free_16(mWeights);
 	mWeights = NULL;
 
 	delete mOctree;
@@ -5827,21 +5854,21 @@ void LLVolumeFace::cacheOptimize()
 	
 	//allocate space for new buffer
 	S32 num_verts = mNumVertices;
-	LLVector4a* pos = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
-	LLVector4a* norm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
+	LLVector4a* pos = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
+	LLVector4a* norm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
 	S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
-	LLVector2* tc = (LLVector2*) malloc(size);
+	LLVector2* tc = (LLVector2*) ll_aligned_malloc_16(size);
 
 	LLVector4a* wght = NULL;
 	if (mWeights)
 	{
-		wght = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
+		wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
 	}
 
 	LLVector4a* binorm = NULL;
 	if (mBinormals)
 	{
-		binorm = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
+		binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
 	}
 
 	//allocate mapping of old indices to new indices
@@ -5878,11 +5905,11 @@ void LLVolumeFace::cacheOptimize()
 		mIndices[i] = new_idx[mIndices[i]];
 	}
 	
-	free(mPositions);
-	free(mNormals);
-	free(mTexCoords);
-	free(mWeights);
-	free(mBinormals);
+	ll_aligned_free_16(mPositions);
+	ll_aligned_free_16(mNormals);
+	ll_aligned_free_16(mTexCoords);
+	ll_aligned_free_16(mWeights);
+	ll_aligned_free_16(mBinormals);
 
 	mPositions = pos;
 	mNormals = norm;
@@ -6603,23 +6630,23 @@ void LLVolumeFace::createBinormals()
 
 void LLVolumeFace::resizeVertices(S32 num_verts)
 {
-	free(mPositions);
-	free(mNormals);
-	free(mBinormals);
-	free(mTexCoords);
+	ll_aligned_free_16(mPositions);
+	ll_aligned_free_16(mNormals);
+	ll_aligned_free_16(mBinormals);
+	ll_aligned_free_16(mTexCoords);
 
 	mBinormals = NULL;
 
 	if (num_verts)
 	{
-		mPositions = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
+		mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
 		assert_aligned(mPositions, 16);
-		mNormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
+		mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
 		assert_aligned(mNormals, 16);
 
 		//pad texture coordinate block end to allow for QWORD reads
 		S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF;
-		mTexCoords = (LLVector2*) malloc(size);
+		mTexCoords = (LLVector2*) ll_aligned_malloc_16(size);
 		assert_aligned(mTexCoords, 16);
 	}
 	else
@@ -6655,7 +6682,7 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
 	
 
 	//just clear binormals
-	free(mBinormals);
+	ll_aligned_free_16(mBinormals);
 	mBinormals = NULL;
 
 	mPositions[mNumVertices] = pos;
@@ -6667,26 +6694,26 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con
 
 void LLVolumeFace::allocateBinormals(S32 num_verts)
 {
-	free(mBinormals);
-	mBinormals = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
+	ll_aligned_free_16(mBinormals);
+	mBinormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
 }
 
 void LLVolumeFace::allocateWeights(S32 num_verts)
 {
-	free(mWeights);
-	mWeights = (LLVector4a*) malloc(sizeof(LLVector4a)*num_verts);
+	ll_aligned_free_16(mWeights);
+	mWeights = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);
 }
 
 void LLVolumeFace::resizeIndices(S32 num_indices)
 {
-	free(mIndices);
+	ll_aligned_free_16(mIndices);
 	
 	if (num_indices)
 	{
 		//pad index block end to allow for QWORD reads
 		S32 size = ((num_indices*sizeof(U16)) + 0xF) & ~0xF;
 		
-		mIndices = (U16*) malloc(size);
+		mIndices = (U16*) ll_aligned_malloc_16(size);
 	}
 	else
 	{
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index b0f68df2e81e2ac406ce049357ab776e62b4fe43..7c8b7e3584b6818309a3c5936dc768a3cdb43278 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -769,15 +769,7 @@ void LLCurl::Multi::removeEasy(Easy* easy)
 //static
 std::string LLCurl::strerror(CURLcode errorcode)
 {
-#if LL_DARWIN
-	// curl_easy_strerror was added in libcurl 7.12.0.  Unfortunately, the version in the Mac OS X 10.3.9 SDK is 7.10.2...
-	// There's a problem with the custom curl headers in our build that keeps me from #ifdefing this on the libcurl version number
-	// (the correct check would be #if LIBCURL_VERSION_NUM >= 0x070c00).  We'll fix the header problem soon, but for now
-	// just punt and print the numeric error code on the Mac.
-	return llformat("%d", errorcode);
-#else // LL_DARWIN
 	return std::string(curl_easy_strerror(errorcode));
-#endif // LL_DARWIN
 }
 
 ////////////////////////////////////////////////////////////////////////////
diff --git a/indra/llmessage/tests/commtest.h b/indra/llmessage/tests/commtest.h
index 32035783e2b9210de164c056b8c5235e264a9f8a..0fef596df26a4930dd634dd4230a2f6b61c97d6a 100644
--- a/indra/llmessage/tests/commtest.h
+++ b/indra/llmessage/tests/commtest.h
@@ -35,6 +35,13 @@
 #include "llhost.h"
 #include "stringize.h"
 #include <string>
+#include <stdexcept>
+#include <boost/lexical_cast.hpp>
+
+struct CommtestError: public std::runtime_error
+{
+    CommtestError(const std::string& what): std::runtime_error(what) {}
+};
 
 /**
  * This struct is shared by a couple of standalone comm tests (ADD_COMM_BUILD_TEST).
@@ -55,13 +62,24 @@ struct commtest_data
         replyPump("reply"),
         errorPump("error"),
         success(false),
-        host("127.0.0.1", 8000),
+        host("127.0.0.1", getport("PORT")),
         server(STRINGIZE("http://" << host.getString() << "/"))
     {
         replyPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, true));
         errorPump.listen("self", boost::bind(&commtest_data::outcome, this, _1, false));
     }
 
+    static int getport(const std::string& var)
+    {
+        const char* port = getenv(var.c_str());
+        if (! port)
+        {
+            throw CommtestError("missing $PORT environment variable");
+        }
+        // This will throw, too, if the value of PORT isn't numeric.
+        return boost::lexical_cast<int>(port);
+    }
+
     bool outcome(const LLSD& _result, bool _success)
     {
 //      std::cout << "commtest_data::outcome(" << _result << ", " << _success << ")\n";
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index 580ee7f8b44cb7ece17ee60077238883dce8bd78..cea503211107d300538153a87b50515fe1e6088b 100644
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -38,7 +38,7 @@
 sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
 from indra.util.fastest_elementtree import parse as xml_parse
 from indra.base import llsd
-from testrunner import run, debug
+from testrunner import freeport, run, debug
 
 class TestHTTPRequestHandler(BaseHTTPRequestHandler):
     """This subclass of BaseHTTPRequestHandler is to receive and echo
@@ -97,6 +97,10 @@ def answer(self, data):
             self.wfile.write(response)
         else:                           # fail requested
             status = data.get("status", 500)
+            # self.responses maps an int status to a (short, long) pair of
+            # strings. We want the longer string. That's why we pass a string
+            # pair to get(): the [1] will select the second string, whether it
+            # came from self.responses or from our default pair.
             reason = data.get("reason",
                                self.responses.get(status,
                                                   ("fail requested",
@@ -113,11 +117,17 @@ def log_error(self, format, *args):
         # Suppress error output as well
         pass
 
-class TestHTTPServer(Thread):
-    def run(self):
-        httpd = HTTPServer(('127.0.0.1', 8000), TestHTTPRequestHandler)
-        debug("Starting HTTP server...\n")
-        httpd.serve_forever()
-
 if __name__ == "__main__":
-    sys.exit(run(server=TestHTTPServer(name="httpd"), *sys.argv[1:]))
+    # Instantiate an HTTPServer(TestHTTPRequestHandler) on the first free port
+    # in the specified port range. Doing this inline is better than in a
+    # daemon thread: if it blows up here, we'll get a traceback. If it blew up
+    # in some other thread, the traceback would get eaten and we'd run the
+    # subject test program anyway.
+    httpd, port = freeport(xrange(8000, 8020),
+                           lambda port: HTTPServer(('127.0.0.1', port), TestHTTPRequestHandler))
+    # Pass the selected port number to the subject test program via the
+    # environment. We don't want to impose requirements on the test program's
+    # command-line parsing -- and anyway, for C++ integration tests, that's
+    # performed in TUT code rather than our own.
+    os.environ["PORT"] = str(port)
+    sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), *sys.argv[1:]))
diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py
index b70ce91ee7beecc1e68471c6e51e380a4a352b3f..8ff13e04262f6688d809374f0eb020d25a399e9e 100644
--- a/indra/llmessage/tests/testrunner.py
+++ b/indra/llmessage/tests/testrunner.py
@@ -29,6 +29,8 @@
 
 import os
 import sys
+import errno
+import socket
 
 def debug(*args):
     sys.stdout.writelines(args)
@@ -36,6 +38,85 @@ def debug(*args):
 # comment out the line below to enable debug output
 debug = lambda *args: None
 
+def freeport(portlist, expr):
+    """
+    Find a free server port to use. Specifically, evaluate 'expr' (a
+    callable(port)) until it stops raising EADDRINUSE exception.
+
+    Pass:
+
+    portlist: an iterable (e.g. xrange()) of ports to try. If you exhaust the
+    range, freeport() lets the socket.error exception propagate. If you want
+    unbounded, you could pass itertools.count(baseport), though of course in
+    practice the ceiling is 2^16-1 anyway. But it seems prudent to constrain
+    the range much more sharply: if we're iterating an absurd number of times,
+    probably something else is wrong.
+
+    expr: a callable accepting a port number, specifically one of the items
+    from portlist. If calling that callable raises socket.error with
+    EADDRINUSE, freeport() retrieves the next item from portlist and retries.
+
+    Returns: (expr(port), port)
+
+    port: the value from portlist for which expr(port) succeeded
+
+    Raises:
+
+    Any exception raised by expr(port) other than EADDRINUSE.
+
+    socket.error if, for every item from portlist, expr(port) raises
+    socket.error. The exception you see is the one from the last item in
+    portlist.
+
+    StopIteration if portlist is completely empty.
+
+    Example:
+
+    server, port = freeport(xrange(8000, 8010),
+                            lambda port: HTTPServer(("localhost", port),
+                                                    MyRequestHandler))
+    # pass 'port' to client code
+    # call server.serve_forever()
+    """
+    # If portlist is completely empty, let StopIteration propagate: that's an
+    # error because we can't return meaningful values. We have no 'port',
+    # therefore no 'expr(port)'.
+    portiter = iter(portlist)
+    port = portiter.next()
+
+    while True:
+        try:
+            # If this value of port works, return as promised.
+            return expr(port), port
+
+        except socket.error, err:
+            # Anything other than 'Address already in use', propagate
+            if err.args[0] != errno.EADDRINUSE:
+                raise
+
+            # Here we want the next port from portiter. But on StopIteration,
+            # we want to raise the original exception rather than
+            # StopIteration. So save the original exc_info().
+            type, value, tb = sys.exc_info()
+            try:
+                try:
+                    port = portiter.next()
+                except StopIteration:
+                    raise type, value, tb
+            finally:
+                # Clean up local traceback, see docs for sys.exc_info()
+                del tb
+
+        # Recap of the control flow above:
+        # If expr(port) doesn't raise, return as promised.
+        # If expr(port) raises anything but EADDRINUSE, propagate that
+        # exception.
+        # If portiter.next() raises StopIteration -- that is, if the port
+        # value we just passed to expr(port) was the last available -- reraise
+        # the EADDRINUSE exception.
+        # If we've actually arrived at this point, portiter.next() delivered a
+        # new port value. Loop back to pass that to expr(port).
+
 def run(*args, **kwds):
     """All positional arguments collectively form a command line, executed as
     a synchronous child process.
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 5af1122451fe1da818510d5c69c25d8fe145b86b..57ac7a143f3f6206e192f264378b580d4cc0aaad 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -232,27 +232,16 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
 	domPRef p = tri->getP();
 	domListOfUInts& idx = p->getValue();
 	
-	domListOfFloats v;
-	domListOfFloats tc;
-	domListOfFloats n;
+	domListOfFloats  dummy ;
+	domListOfFloats& v = pos_source ? pos_source->getFloat_array()->getValue() : dummy ;
+	domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
+	domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
 
 	if (pos_source)
 	{
-		v = pos_source->getFloat_array()->getValue();
 		face.mExtents[0].set(v[0], v[1], v[2]);
 		face.mExtents[1].set(v[0], v[1], v[2]);
 	}
-
-	if (tc_source)
-	{
-		tc = tc_source->getFloat_array()->getValue();
-	}
-
-	if (norm_source)
-	{
-		n = norm_source->getFloat_array()->getValue();
-	}
-
 	
 	LLVolumeFace::VertexMapData::PointMap point_map;
 	
@@ -1002,6 +991,9 @@ void LLModel::normalizeVolumeFaces()
 		scale.splat(1.f);
 		scale.div(size);
 
+		LLVector4a inv_scale(1.f);
+		inv_scale.div(scale);
+
 		for (U32 i = 0; i < mVolumeFaces.size(); ++i)
 		{
 			LLVolumeFace& face = mVolumeFaces[i];
@@ -1018,10 +1010,14 @@ void LLModel::normalizeVolumeFaces()
 			// For all the positions, we scale
 			// the positions to fit within the unit cube.
 			LLVector4a* pos = (LLVector4a*) face.mPositions;
+			LLVector4a* norm = (LLVector4a*) face.mNormals;
+
 			for (U32 j = 0; j < face.mNumVertices; ++j)
 			{
 			 	pos[j].add(trans);
 				pos[j].mul(scale);
+				norm[j].mul(inv_scale);
+				norm[j].normalize3();
 			}
 		}
 
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 99a1e5c82634b57d662fea37a9078ee74b0d15d1..a460912e70d080b98d97416f9ce308d3aebd2f61 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -105,7 +105,6 @@ LLMatrix4 gGLObliqueProjectionInverse;
 
 #define LL_GL_NAME_POOLING 0
 
-LLGLNamePool::pool_list_t LLGLNamePool::sInstances;
 std::list<LLGLUpdate*> LLGLUpdate::sGLQ;
 
 #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS)  && !LL_MESA_HEADLESS
@@ -329,6 +328,7 @@ LLGLManager::LLGLManager() :
 	mHasShaderObjects(FALSE),
 	mHasVertexShader(FALSE),
 	mHasFragmentShader(FALSE),
+	mNumTextureImageUnits(0),
 	mHasOcclusionQuery(FALSE),
 	mHasOcclusionQuery2(FALSE),
 	mHasPointParameters(FALSE),
@@ -535,6 +535,13 @@ bool LLGLManager::initGL()
 		return false;
 	}
 	
+	if (mHasFragmentShader)
+	{
+		GLint num_tex_image_units;
+		glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units);
+		mNumTextureImageUnits = num_tex_image_units;
+	}
+	
 	setToDebugGPU();
 
 	initGLStates();
@@ -879,11 +886,13 @@ void LLGLManager::initExtensions()
 		LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL;
 		mHasMipMapGeneration = FALSE;
 	}
+#if !LL_DARWIN
 	if (mIsATI && mHasMipMapGeneration)
 	{
 		LL_INFOS("RenderInit") << "Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL;
 		mHasMipMapGeneration = FALSE;
 	}
+#endif
 	
 	// Misc
 	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
@@ -1945,22 +1954,8 @@ LLGLNamePool::LLGLNamePool()
 {
 }
 
-void LLGLNamePool::registerPool(LLGLNamePool* pool)
-{
-	pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), pool);
-	if (iter == sInstances.end())
-	{
-		sInstances.push_back(pool);
-	}
-}
-
 LLGLNamePool::~LLGLNamePool()
 {
-	pool_list_t::iterator iter = std::find(sInstances.begin(), sInstances.end(), this);
-	if (iter != sInstances.end())
-	{
-		sInstances.erase(iter);
-	}
 }
 
 void LLGLNamePool::upkeep()
@@ -2029,20 +2024,22 @@ void LLGLNamePool::release(GLuint name)
 void LLGLNamePool::upkeepPools()
 {
 	LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS);
-	for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+	tracker_t::LLInstanceTrackerScopedGuard guard;
+	for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
 	{
-		LLGLNamePool* pool = *iter;
-		pool->upkeep();
+		LLGLNamePool & pool = *iter;
+		pool.upkeep();
 	}
 }
 
 //static
 void LLGLNamePool::cleanupPools()
 {
-	for (pool_list_t::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+	tracker_t::LLInstanceTrackerScopedGuard guard;
+	for (tracker_t::instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ++iter)
 	{
-		LLGLNamePool* pool = *iter;
-		pool->cleanup();
+		LLGLNamePool & pool = *iter;
+		pool.cleanup();
 	}
 }
 
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index c77d85ba2b4e5c9c4b34f2776ea6811f3ffd50aa..1d7ab188fcef1991a22e8e38342cdd20041433d7 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -40,6 +40,7 @@
 #include "v4math.h"
 #include "llplane.h"
 #include "llgltypes.h"
+#include "llinstancetracker.h"
 
 #include "llglheaders.h"
 #include "glh/glh_linear.h"
@@ -90,6 +91,7 @@ class LLGLManager
 	BOOL mHasShaderObjects;
 	BOOL mHasVertexShader;
 	BOOL mHasFragmentShader;
+	S32  mNumTextureImageUnits;
 	BOOL mHasOcclusionQuery;
 	BOOL mHasOcclusionQuery2;
 	BOOL mHasPointParameters;
@@ -332,9 +334,11 @@ class LLGLSquashToFarClip
 	Generic pooling scheme for things which use GL names (used for occlusion queries and vertex buffer objects).
 	Prevents thrashing of GL name caches by avoiding calls to glGenFoo and glDeleteFoo.
 */
-class LLGLNamePool
+class LLGLNamePool : public LLInstanceTracker<LLGLNamePool>
 {
 public:
+	typedef LLInstanceTracker<LLGLNamePool> tracker_t;
+
 	struct NameEntry
 	{
 		GLuint name;
@@ -361,13 +365,11 @@ class LLGLNamePool
 	GLuint allocate();
 	void release(GLuint name);
 	
-	static void registerPool(LLGLNamePool* pool);
 	static void upkeepPools();
 	static void cleanupPools();
 
 protected:
 	typedef std::vector<LLGLNamePool*> pool_list_t;
-	static pool_list_t sInstances;
 	
 	virtual GLuint allocateName() = 0;
 	virtual void releaseName(GLuint name) = 0;
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 49e10c47902911dc082f79f96bbf16df966dbe63..c37139ac4c41a32da4ea4aaf364ac7a3bb40edfa 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -119,14 +119,29 @@ void LLTexUnit::refreshState(void)
 	gGL.flush();
 	
 	glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
+
+	//
+	// Per apple spec, don't call glEnable/glDisable when index exceeds max texture units
+	// http://www.mailinglistarchive.com/html/mac-opengl@lists.apple.com/2008-07/msg00653.html
+	//
+	bool enableDisable = (mIndex < gGLManager.mNumTextureUnits);
+		
 	if (mCurrTexType != TT_NONE)
 	{
-		glEnable(sGLTextureType[mCurrTexType]);
+		if (enableDisable)
+		{
+			glEnable(sGLTextureType[mCurrTexType]);
+		}
+		
 		glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture);
 	}
 	else
 	{
-		glDisable(GL_TEXTURE_2D);
+		if (enableDisable)
+		{
+			glDisable(GL_TEXTURE_2D);
+		}
+		
 		glBindTexture(GL_TEXTURE_2D, 0);	
 	}
 
@@ -167,7 +182,11 @@ void LLTexUnit::enable(eTextureType type)
 		mCurrTexType = type;
 
 		gGL.flush();
-		glEnable(sGLTextureType[type]);
+		
+		if (mIndex < gGLManager.mNumTextureUnits)
+		{
+			glEnable(sGLTextureType[type]);
+		}
 	}
 }
 
@@ -180,7 +199,12 @@ void LLTexUnit::disable(void)
 		activate();
 		unbind(mCurrTexType);
 		gGL.flush();
-		glDisable(sGLTextureType[mCurrTexType]);
+		
+		if (mIndex < gGLManager.mNumTextureUnits)
+		{
+			glDisable(sGLTextureType[mCurrTexType]);
+		}
+		
 		mCurrTexType = TT_NONE;
 	}
 }
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index cd2556d435526757eb4a652244eefd7c53940f92..da1e94df64e5e0546a1f9fec67b8272bc67a1c5f 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -44,6 +44,7 @@ void check_framebuffer_status()
 		case GL_FRAMEBUFFER_COMPLETE:
 			break;
 		default:
+			llwarns << "check_framebuffer_status failed -- " << std::hex << status << llendl;
 			ll_fail("check_framebuffer_status failed");	
 			break;
 		}
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 21b02fdb715f40222cf6bf450780c86aff14668a..98a0a93084e1762281ba02da11ec5daff2490b6e 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -315,7 +315,7 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns)
 		}
 		else
 		{
-			LL_DEBUGS("ShaderLoading") << log << LL_ENDL;
+			LL_INFOS("ShaderLoading") << log << LL_ENDL;
 		}
 	}
 }
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 73efbfc9998ea399056523caca5ac5555e589cc0..8c9171ccf45cedbb24fe1cb3890948f17093f190 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -383,10 +383,6 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
 	}
 
 	sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
-	LLGLNamePool::registerPool(&sDynamicVBOPool);
-	LLGLNamePool::registerPool(&sDynamicIBOPool);
-	LLGLNamePool::registerPool(&sStreamVBOPool);
-	LLGLNamePool::registerPool(&sStreamIBOPool);
 }
 
 //static 
@@ -633,7 +629,7 @@ void LLVertexBuffer::createGLBuffer()
 	{
 		static int gl_buffer_idx = 0;
 		mGLBuffer = ++gl_buffer_idx;
-		mMappedData = (U8*) malloc(size);
+		mMappedData = (U8*) ll_aligned_malloc_16(size);
 	}
 }
 
@@ -667,7 +663,7 @@ void LLVertexBuffer::createGLIndices()
 	}
 	else
 	{
-		mMappedIndexData = (U8*) malloc(size);
+		mMappedIndexData = (U8*) ll_aligned_malloc_16(size);
 		static int gl_buffer_idx = 0;
 		mGLIndices = ++gl_buffer_idx;
 	}
@@ -690,7 +686,7 @@ void LLVertexBuffer::destroyGLBuffer()
 		}
 		else
 		{
-			free(mMappedData);
+			ll_aligned_free_16(mMappedData);
 			mMappedData = NULL;
 			mEmpty = TRUE;
 		}
@@ -719,7 +715,7 @@ void LLVertexBuffer::destroyGLIndices()
 		}
 		else
 		{
-			free(mMappedIndexData);
+			ll_aligned_free_16(mMappedIndexData);
 			mMappedIndexData = NULL;
 			mEmpty = TRUE;
 		}
@@ -852,8 +848,8 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
 			{
 				if (!useVBOs())
 				{
-					free(mMappedData);
-					mMappedData = (U8*) malloc(newsize);
+					ll_aligned_free_16(mMappedData);
+					mMappedData = (U8*) ll_aligned_malloc_16(newsize);
 				}
 				mResized = TRUE;
 			}
@@ -873,8 +869,8 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
 			{
 				if (!useVBOs())
 				{
-					free(mMappedIndexData);
-					mMappedIndexData = (U8*) malloc(new_index_size);
+					ll_aligned_free_16(mMappedIndexData);
+					mMappedIndexData = (U8*) ll_aligned_malloc_16(new_index_size);
 				}
 				mResized = TRUE;
 			}
@@ -915,8 +911,8 @@ void LLVertexBuffer::freeClientBuffer()
 {
 	if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData))
 	{
-		free(mMappedData) ;
-		free(mMappedIndexData) ;
+		ll_aligned_free_16(mMappedData) ;
+		ll_aligned_free_16(mMappedIndexData) ;
 		mMappedData = NULL ;
 		mMappedIndexData = NULL ;
 	}
@@ -926,7 +922,7 @@ void LLVertexBuffer::allocateClientVertexBuffer()
 {
 	if(!mMappedData)
 	{
-		mMappedData = (U8*)malloc(getSize());
+		mMappedData = (U8*)ll_aligned_malloc_16(getSize());
 	}
 }
 
@@ -934,7 +930,7 @@ void LLVertexBuffer::allocateClientIndexBuffer()
 {
 	if(!mMappedIndexData)
 	{
-		mMappedIndexData = (U8*)malloc(getIndicesSize());
+		mMappedIndexData = (U8*)ll_aligned_malloc_16(getIndicesSize());
 	}
 }
 
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 16aa49b65342f77e4df25e615c10eb58e13f0c96..0cfc393e05053f56a72ecec85d6fcc14adebe779 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -27,7 +27,6 @@
 #ifndef LL_LLBUTTON_H
 #define LL_LLBUTTON_H
 
-#include "lluuid.h"
 #include "llcontrol.h"
 #include "lluictrl.h"
 #include "v4color.h"
@@ -53,6 +52,8 @@ S32 round_up(S32 grid, S32 value);
 
 
 class LLUICtrlFactory;
+class LLUIImage;
+class LLUUID;
 
 //
 // Classes
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index 94387fb41a5b18e2b065eaf36eddc04c9b0b4a2d..8414b92113d9646864e4715dbc37c70213ea91fa 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -27,14 +27,9 @@
 #define LLFLOATERREG_H
 
 /// llcommon
-#include "llboost.h"
 #include "llrect.h"
-#include "llstl.h"
 #include "llsd.h"
 
-/// llui
-#include "lluictrl.h"
-
 #include <boost/function.hpp>
 
 //*******************************************************
@@ -43,6 +38,7 @@
 //
 
 class LLFloater;
+class LLUICtrl;
 
 typedef boost::function<LLFloater* (const LLSD& key)> LLFloaterBuildFunc;
 
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 43e5f6b051d4f344c7e65f91a2fabc6bc67ab4dc..724d190307dcb841f96d6ebf7f30219d098eb9b8 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -113,6 +113,16 @@ boost::signals2::connection	LLFocusableElement::setTopLostCallback(const focus_s
 
 
 
+typedef std::list<LLHandle<LLView> > view_handle_list_t;
+typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t;
+struct LLFocusMgr::Impl
+{
+	// caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost
+	view_handle_list_t mCachedKeyboardFocusList;
+
+	focus_history_map_t mFocusHistory;
+};
+
 LLFocusMgr gFocusMgr;
 
 LLFocusMgr::LLFocusMgr()
@@ -123,10 +133,17 @@ LLFocusMgr::LLFocusMgr()
 	mDefaultKeyboardFocus( NULL ),
 	mKeystrokesOnly(FALSE),
 	mTopCtrl( NULL ),
-	mAppHasFocus(TRUE)   // Macs don't seem to notify us that we've gotten focus, so default to true
+	mAppHasFocus(TRUE),   // Macs don't seem to notify us that we've gotten focus, so default to true
+	mImpl(new LLFocusMgr::Impl)
 {
 }
 
+LLFocusMgr::~LLFocusMgr()
+{
+	mImpl->mFocusHistory.clear();
+	delete mImpl;
+	mImpl = NULL;
+}
 
 void LLFocusMgr::releaseFocusIfNeeded( LLView* view )
 {
@@ -179,7 +196,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
 		mKeyboardFocus = new_focus;
 
 		// list of the focus and it's ancestors
-		view_handle_list_t old_focus_list = mCachedKeyboardFocusList;
+		view_handle_list_t old_focus_list = mImpl->mCachedKeyboardFocusList;
 		view_handle_list_t new_focus_list;
 
 		// walk up the tree to root and add all views to the new_focus_list
@@ -206,7 +223,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
 			LLView* old_focus_view = old_focus_iter->get();
 			if (old_focus_view)
 			{
-				mCachedKeyboardFocusList.pop_front();
+				mImpl->mCachedKeyboardFocusList.pop_front();
 				old_focus_view->onFocusLost();
 			}
 		}
@@ -219,7 +236,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
 			LLView* new_focus_view = new_focus_riter->get();
 			if (new_focus_view)
 			{
-                mCachedKeyboardFocusList.push_front(new_focus_view->getHandle());
+                mImpl->mCachedKeyboardFocusList.push_front(new_focus_view->getHandle());
 				new_focus_view->onFocusReceived();
 			}
 		}
@@ -254,7 +271,7 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
 		if (focus_subtree)
 		{
 			LLView* focused_view = dynamic_cast<LLView*>(mKeyboardFocus);
-			mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>(); 
+			mImpl->mFocusHistory[focus_subtree->getHandle()] = focused_view ? focused_view->getHandle() : LLHandle<LLView>(); 
 		}
 	}
 	
@@ -456,8 +473,8 @@ LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const
 {
 	if (subtree_root)
 	{
-		focus_history_map_t::const_iterator found_it = mFocusHistory.find(subtree_root->getHandle());
-		if (found_it != mFocusHistory.end())
+		focus_history_map_t::const_iterator found_it = mImpl->mFocusHistory.find(subtree_root->getHandle());
+		if (found_it != mImpl->mFocusHistory.end())
 		{
 			// found last focus for this subtree
 			return static_cast<LLUICtrl*>(found_it->second.get());
@@ -470,6 +487,6 @@ void LLFocusMgr::clearLastFocusForGroup(LLView* subtree_root)
 {
 	if (subtree_root)
 	{
-		mFocusHistory.erase(subtree_root->getHandle());
+		mImpl->mFocusHistory.erase(subtree_root->getHandle());
 	}
 }
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 22c1895075e70b8a5e1f5ee9d94841c79b507064..25ae1d2579d272126fa7690a476a87742c5b5785 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -74,7 +74,7 @@ class LLFocusMgr
 {
 public:
 	LLFocusMgr();
-	~LLFocusMgr() { mFocusHistory.clear(); }
+	~LLFocusMgr();
 
 	// Mouse Captor
 	void			setMouseCapture(LLMouseHandler* new_captor);	// new_captor = NULL to release the mouse.
@@ -120,6 +120,8 @@ class LLFocusMgr
 
 	bool			keyboardFocusHasAccelerators() const;
 
+	struct Impl;
+
 private:
 	LLUICtrl*			mLockedView;
 
@@ -132,10 +134,6 @@ class LLFocusMgr
 	LLFocusableElement*	mDefaultKeyboardFocus;
 	BOOL				mKeystrokesOnly;
 	
-	// caching list of keyboard focus ancestors for calling onFocusReceived and onFocusLost
-	typedef std::list<LLHandle<LLView> > view_handle_list_t;
-	view_handle_list_t mCachedKeyboardFocusList;
-
 	// Top View
 	LLUICtrl*			mTopCtrl;
 
@@ -143,8 +141,7 @@ class LLFocusMgr
 
 	BOOL				mAppHasFocus;
 
-	typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t;
-	focus_history_map_t mFocusHistory;
+	Impl * mImpl;
 };
 
 extern LLFocusMgr gFocusMgr;
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 669e126266adced8157b393ee4dd28dca1c905c0..efa0925a4a9364b493d44ab096ae723f100962a1 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -30,6 +30,7 @@
 #include "lluuid.h"
 #include "v4color.h"
 #include "lluictrl.h"
+#include "lluiimage.h"
 #include "stdenums.h"
 
 class LLTextBox;
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 7b5fa218f23ca775e306f395d22edfd533a67e86..fe191e59714aad3a261878628799d50b7ff0670f 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -41,6 +41,7 @@
 
 #include "lleditmenuhandler.h"
 #include "lluictrl.h"
+#include "lluiimage.h"
 #include "lluistring.h"
 #include "llviewborder.h"
 
diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h
index c0cb1cc74a9df96fc06566a07648e17c6e6cad24..4c47cc267cc96df4da59b263d4e6d51cd63f7d7c 100644
--- a/indra/llui/llloadingindicator.h
+++ b/indra/llui/llloadingindicator.h
@@ -28,6 +28,7 @@
 #define LL_LLLOADINGINDICATOR_H
 
 #include "lluictrl.h"
+#include "lluiimage.h"
 
 ///////////////////////////////////////////////////////////////////////////////
 // class LLLoadingIndicator
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index d4e6091ee037eb409fdacd391a61ef0a7913b4f8..f744e9db415dcb78f969f6c2e6ae62cb24b22bfd 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -35,6 +35,7 @@
 #include "llkeyboard.h"			// for the MASK constants
 #include "llcontrol.h"
 #include "lluictrlfactory.h"
+#include "lluiimage.h"
 
 #include <sstream>
 
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index bdac125eb06e8caf0164860353b3044066da736c..6085c61f9a2470155942bebce0cbc14cc87a43e9 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1532,7 +1532,7 @@ bool LLNotifications::loadVisibilityRules()
 // Add a simple notification (from XUI)
 void LLNotifications::addFromCallback(const LLSD& name)
 {
-	add(LLNotification::Params().name(name.asString()));	
+	add(name.asString(), LLSD(), LLSD());
 }
 
 LLNotificationPtr LLNotifications::add(const std::string& name, 
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index c1a1a06f39c02ed8ef36e6d3d4e4c108d0b04944..7bbbeaf709cacfa8f93c5cff9623ebd53d3f1bac 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -32,6 +32,7 @@
 #include "llcallbackmap.h"
 #include "lluictrl.h"
 #include "llviewborder.h"
+#include "lluiimage.h"
 #include "lluistring.h"
 #include "v4color.h"
 #include <list>
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index ead22686bc405d21191d5aa342350a93d1bc75fe..84a890edfa59268076cb46a410038a9374685b44 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -38,6 +38,7 @@
 
 #include "llfocusmgr.h"
 #include "lluictrlfactory.h"
+#include "lluiimage.h"
 
 static LLDefaultChildRegistry::Register<LLProgressBar> r("progress_bar");
 
diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h
index 3f308e749683feb09e748f9ef522d936ecc83e1a..a8ec83ea00434c169a0cd77bc955daf4a9a0e7e1 100644
--- a/indra/llui/llprogressbar.h
+++ b/indra/llui/llprogressbar.h
@@ -27,8 +27,9 @@
 #ifndef LL_LLPROGRESSBAR_H
 #define LL_LLPROGRESSBAR_H
 
-#include "lluictrl.h"
 #include "llframetimer.h"
+#include "lluictrl.h"
+#include "lluiimage.h"
 
 class LLProgressBar
 	: public LLUICtrl
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index 68823ed68e46b7619ec7c74250b1031734015997..700c17ea3e9c06ab34636eb732e5c3b7373de51a 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -29,6 +29,7 @@
 
 #include "llf32uictrl.h"
 #include "v4color.h"
+#include "lluiimage.h"
 
 class LLSlider : public LLF32UICtrl
 {
diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp
index 28a064e6b60c4e4ea8c8653ecd028c44cdc1e3fb..bb731f4f7e222a01ac3c339f36b7b552f26d9d85 100644
--- a/indra/llui/llstyle.cpp
+++ b/indra/llui/llstyle.cpp
@@ -88,7 +88,7 @@ void LLStyle::setVisible(BOOL is_visible)
 	mVisible = is_visible;
 }
 
-LLUIImagePtr LLStyle::getImage() const
+LLPointer<LLUIImage> LLStyle::getImage() const
 {
 	return mImagep;
 }
diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h
index 322edc343ce9ba1f94ac9cc73e23092e6e679ebc..9f1eba79d8c30ca56a1c9dac4fb984fda68eb95d 100644
--- a/indra/llui/llstyle.h
+++ b/indra/llui/llstyle.h
@@ -30,6 +30,7 @@
 #include "v4color.h"
 #include "llui.h"
 #include "llinitparam.h"
+#include "lluiimage.h"
 
 class LLFontGL;
 
@@ -72,7 +73,7 @@ class LLStyle : public LLRefCount
 	void setLinkHREF(const std::string& href);
 	BOOL isLink() const;
 
-	LLUIImagePtr getImage() const;
+	LLPointer<LLUIImage> getImage() const;
 	void setImage(const LLUUID& src);
 	void setImage(const std::string& name);
 
@@ -108,7 +109,7 @@ class LLStyle : public LLRefCount
 	const LLFontGL*		mFont;
 	std::string			mLink;
 	bool				mIsLink;
-	LLUIImagePtr		mImagep;
+	LLPointer<LLUIImage> mImagep;
 };
 
 typedef LLPointer<LLStyle> LLStyleSP;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 1c19a33c4edfee94763a4932be4db9c321bc59aa..1cc3cc04d61ca5f2449b24358109049baf4fd3f3 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1164,7 +1164,7 @@ void LLTextBase::reflow()
 	S32 first_line = getFirstVisibleLine();
 
 	// if scroll anchor not on first line, update it to first character of first line
-	if (!mLineInfoList.empty()
+	if ((first_line < mLineInfoList.size())
 		&&	(mScrollIndex <  mLineInfoList[first_line].mDocIndexStart
 			||	mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd))
 	{
diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp
index 9d0ff9d5cb17ecccee1f37da8a3b51207707f514..58fa8a0828245a856e4f5730f317a192824acd65 100644
--- a/indra/llui/lltransutil.cpp
+++ b/indra/llui/lltransutil.cpp
@@ -26,10 +26,11 @@
 
 #include "linden_common.h"
 
+#include "lltransutil.h"
+
 #include "lltrans.h"
 #include "lluictrlfactory.h"
-
-#include "lltransutil.h"
+#include "llxmlnode.h"
 
 
 bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<std::string>& default_args)
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 6a43477693b0f54b488ec8e0b1c0af75f4308faa..c583d58d5a5076645fc797bf4bc556eb36879deb 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -33,15 +33,12 @@
 #include "llrect.h"
 #include "llcontrol.h"
 #include "llcoord.h"
-#include "lluiimage.h"		// *TODO: break this dependency, need to add #include "lluiimage.h" to all widgets that hold an Optional<LLUIImage*> in their paramblocks
 #include "llinitparam.h"
 #include "llregistry.h"
 #include "lluicolor.h"
 #include "lluicolortable.h"
 #include <boost/signals2.hpp>
 #include "lllazyvalue.h"
-#include "llhandle.h"		// *TODO: remove this dependency, added as a 
-							// convenience when LLHandle moved to llhandle.h
 #include "llframetimer.h"
 
 // LLUIFactory
@@ -265,8 +262,6 @@ class LLUI
 
 // Moved LLLocalClipRect to lllocalcliprect.h
 
-// Moved all LLHandle-related code to llhandle.h
-
 //RN: maybe this needs to moved elsewhere?
 class LLImageProviderInterface
 {
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 9ab0797f9e597559d702a27e5de2aadcea375c91..594a5eec6be9b8927f45b76d66c9730ad326dae7 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -34,6 +34,7 @@
 #include "stdtypes.h"
 #include "llcoord.h"
 #include "llfontgl.h"
+#include "llhandle.h"
 #include "llmortician.h"
 #include "llmousehandler.h"
 #include "llstring.h"
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
index 89cd34c37c1c231650e3aaec7b0edecd4c947683..32d7ea7c25ae46fbb47c356f6858be8d8424d4ee 100644
--- a/indra/llui/llviewborder.cpp
+++ b/indra/llui/llviewborder.cpp
@@ -28,6 +28,7 @@
 #include "llrender.h"
 #include "llfocusmgr.h"
 #include "lluictrlfactory.h"
+#include "lluiimage.h"
 
 static LLDefaultChildRegistry::Register<LLViewBorder> r("view_border");
 
diff --git a/indra/llui/llwindowshade.h b/indra/llui/llwindowshade.h
index 00471959296dd0429d0f500f5911e6d9b28756ff..09ffc2cd54ba26fe487480c8244d726fd0ff0974 100644
--- a/indra/llui/llwindowshade.h
+++ b/indra/llui/llwindowshade.h
@@ -29,6 +29,7 @@
 
 #include "lluictrl.h"
 #include "llnotifications.h"
+#include "lluiimage.h"
 
 class LLWindowShade : public LLUICtrl
 {
diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt
index 569674ecf0318a4f07b0e1b001d96fcdb738f495..b6d1ce61e5ff5d15aeec971205a78611796f91d7 100644
--- a/indra/llvfs/CMakeLists.txt
+++ b/indra/llvfs/CMakeLists.txt
@@ -12,6 +12,7 @@ include_directories(
 
 set(llvfs_SOURCE_FILES
     lldir.cpp
+    lldiriterator.cpp
     lllfsthread.cpp
     llpidlock.cpp
     llvfile.cpp
@@ -24,6 +25,7 @@ set(llvfs_HEADER_FILES
 
     lldir.h
     lldirguard.h
+    lldiriterator.h
     lllfsthread.h
     llpidlock.h
     llvfile.h
@@ -60,6 +62,11 @@ list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES})
 
 add_library (llvfs ${llvfs_SOURCE_FILES})
 
+target_link_libraries(llvfs
+    ${BOOST_FILESYSTEM_LIBRARY}
+    ${BOOST_SYSTEM_LIBRARY}
+    )
+
 if (DARWIN)
   include(CMakeFindFrameworks)
   find_library(CARBON_LIBRARY Carbon)
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index 341c96f6ea7b9a4d9cd790cb6c71128dffbe2a7b..f3ac17d612b130fbb65e95162b0b22d169377353 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -40,6 +40,8 @@
 #include "lltimer.h"	// ms_sleep()
 #include "lluuid.h"
 
+#include "lldiriterator.h"
+
 #if LL_WINDOWS
 #include "lldir_win32.h"
 LLDir_Win32 gDirUtil;
@@ -83,7 +85,9 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
 	std::string filename; 
 	std::string fullpath;
 	S32 result;
-	while (getNextFileInDir(dirname, mask, filename))
+
+	LLDirIterator iter(dirname, mask);
+	while (iter.next(filename))
 	{
 		fullpath = dirname;
 		fullpath += getDirDelimiter();
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 42996fd051b9f5cc8ed949645fa7fda5c4c58f74..5ee8bdb542da2ebc4ee3d10ce114a7df3c1e20b6 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -75,31 +75,6 @@ class LLDir
 // pure virtual functions
 	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0;
 
-    /// Walk the files in a directory, with file pattern matching
-	virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash!
-                                  const std::string& mask,    ///< file pattern string (use "*" for all)
-                                  std::string& fname          ///< output: found file name
-                                  ) = 0;
-    /**<
-     * @returns true if a file was found, false if the entire directory has been scanned.
-     *
-     * @note that this function is NOT thread safe
-     *
-     * This function may not be used to scan part of a directory, then start a new search of a different
-     * directory, and then restart the first search where it left off; the entire search must run to
-     * completion or be abandoned - there is no restart.
-     *
-     * @bug: See http://jira.secondlife.com/browse/VWR-23697
-     *       and/or the tests in test/lldir_test.cpp
-     *       This is known to fail with patterns that have both:
-     *       a wildcard left of a . and more than one sequential ? right of a .
-     *       the pattern foo.??x appears to work
-     *       but *.??x or foo?.??x do not
-     *
-     * @todo this really should be rewritten as an iterator object, and the
-     *       filtering should be done in a platform-independent way.
-     */
-
 	virtual std::string getCurPath() = 0;
 	virtual BOOL fileExists(const std::string &filename) const = 0;
 
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index 72b54f538083c5937012865572526c1b8afca0b6..407f3b93fbe95ca3c03dbc3ae2dc793ff84398bf 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -242,68 +242,6 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &
 	return (file_count);
 }
 
-// get the next file in the directory
-BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
-	glob_t g;
-	BOOL result = FALSE;
-	fname = "";
-	
-	if(!(dirname == mCurrentDir))
-	{
-		// different dir specified, close old search
-		mCurrentDirIndex = -1;
-		mCurrentDirCount = -1;
-		mCurrentDir = dirname;
-	}
-	
-	std::string tmp_str;
-	tmp_str = dirname;
-	tmp_str += mask;
-
-	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
-	{
-		if(g.gl_pathc > 0)
-		{
-			if((int)g.gl_pathc != mCurrentDirCount)
-			{
-				// Number of matches has changed since the last search, meaning a file has been added or deleted.
-				// Reset the index.
-				mCurrentDirIndex = -1;
-				mCurrentDirCount = g.gl_pathc;
-			}
-	
-			mCurrentDirIndex++;
-	
-			if(mCurrentDirIndex < (int)g.gl_pathc)
-			{
-//				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
-				// The API wants just the filename, not the full path.
-				//fname = g.gl_pathv[mCurrentDirIndex];
-
-				char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-				
-				if(s == NULL)
-					s = g.gl_pathv[mCurrentDirIndex];
-				else if(s[0] == '/')
-					s++;
-					
-				fname = s;
-				
-				result = TRUE;
-			}
-		}
-		
-		globfree(&g);
-	}
-	
-	return(result);
-}
-
-
-
-
 std::string LLDir_Linux::getCurPath()
 {
 	char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */ 
diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h
index a34de1241d625afcb13aae9673c88f3c8831532c..76032398675ae3cdb8545be805b8bc89c7c88e82 100644
--- a/indra/llvfs/lldir_linux.h
+++ b/indra/llvfs/lldir_linux.h
@@ -47,7 +47,6 @@ class LLDir_Linux : public LLDir
 
 	virtual std::string getCurPath();
 	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
-	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
 	/*virtual*/ BOOL fileExists(const std::string &filename) const;
 
 	/*virtual*/ std::string getLLPluginLauncher();
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index f9369b043eb47e4583dd88af6c737871f9bf9bea..8f48f92e2a057bcde53eb437d5901fc8ec6de74c 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -258,67 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma
 	return (file_count);
 }
 
-// get the next file in the directory
-BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
-	glob_t g;
-	BOOL result = FALSE;
-	fname = "";
-	
-	if(!(dirname == mCurrentDir))
-	{
-		// different dir specified, close old search
-		mCurrentDirIndex = -1;
-		mCurrentDirCount = -1;
-		mCurrentDir = dirname;
-	}
-	
-	std::string tmp_str;
-	tmp_str = dirname;
-	tmp_str += mask;
-
-	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
-	{
-		if(g.gl_pathc > 0)
-		{
-			if(g.gl_pathc != mCurrentDirCount)
-			{
-				// Number of matches has changed since the last search, meaning a file has been added or deleted.
-				// Reset the index.
-				mCurrentDirIndex = -1;
-				mCurrentDirCount = g.gl_pathc;
-			}
-	
-			mCurrentDirIndex++;
-	
-			if(mCurrentDirIndex < g.gl_pathc)
-			{
-//				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
-				// The API wants just the filename, not the full path.
-				//fname = g.gl_pathv[mCurrentDirIndex];
-
-				char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-				
-				if(s == NULL)
-					s = g.gl_pathv[mCurrentDirIndex];
-				else if(s[0] == '/')
-					s++;
-					
-				fname = s;
-				
-				result = TRUE;
-			}
-		}
-		
-		globfree(&g);
-	}
-	
-	return(result);
-}
-
-
-
 S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask)
 {
 	glob_t g;
diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h
index b456d3afca989ef93f0cdc2b5c39f723e78763bb..bc3f0fac0012578dd58be36a7c42b6834e4df206 100644
--- a/indra/llvfs/lldir_mac.h
+++ b/indra/llvfs/lldir_mac.h
@@ -47,7 +47,6 @@ class LLDir_Mac : public LLDir
 	virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
 	virtual std::string getCurPath();
 	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
-	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
 	virtual BOOL fileExists(const std::string &filename) const;
 
 	/*virtual*/ std::string getLLPluginLauncher();
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index 515fd66b6e9a9f4d2aef1647ad78134a15419f0c..21f8c3acdbeefa56272bac597cf5b1d1858ba46c 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -260,68 +260,6 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string
 	return (file_count);
 }
 
-// get the next file in the directory
-BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
-	glob_t g;
-	BOOL result = FALSE;
-	fname = "";
-	
-	if(!(dirname == mCurrentDir))
-	{
-		// different dir specified, close old search
-		mCurrentDirIndex = -1;
-		mCurrentDirCount = -1;
-		mCurrentDir = dirname;
-	}
-	
-	std::string tmp_str;
-	tmp_str = dirname;
-	tmp_str += mask;
-
-	if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
-	{
-		if(g.gl_pathc > 0)
-		{
-			if((int)g.gl_pathc != mCurrentDirCount)
-			{
-				// Number of matches has changed since the last search, meaning a file has been added or deleted.
-				// Reset the index.
-				mCurrentDirIndex = -1;
-				mCurrentDirCount = g.gl_pathc;
-			}
-	
-			mCurrentDirIndex++;
-	
-			if(mCurrentDirIndex < (int)g.gl_pathc)
-			{
-//				llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl;
-
-				// The API wants just the filename, not the full path.
-				//fname = g.gl_pathv[mCurrentDirIndex];
-
-				char *s = strrchr(g.gl_pathv[mCurrentDirIndex], '/');
-				
-				if(s == NULL)
-					s = g.gl_pathv[mCurrentDirIndex];
-				else if(s[0] == '/')
-					s++;
-					
-				fname = s;
-				
-				result = TRUE;
-			}
-		}
-		
-		globfree(&g);
-	}
-	
-	return(result);
-}
-
-
-
-
 std::string LLDir_Solaris::getCurPath()
 {
 	char tmp_str[LL_MAX_PATH];	/* Flawfinder: ignore */ 
diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h
index 70fac6f8185941adef6aeba13d9f73b7181b8ceb..0b58a45b15e07582128d190b160c85788b7d0c05 100644
--- a/indra/llvfs/lldir_solaris.h
+++ b/indra/llvfs/lldir_solaris.h
@@ -47,7 +47,6 @@ class LLDir_Solaris : public LLDir
 
 	virtual std::string getCurPath();
 	virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
-	virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
 	/*virtual*/ BOOL fileExists(const std::string &filename) const;
 
 private:
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp
index 4e2a55f4b30789f9ce8ce8eb6dc8fe0c721caca3..7709945123637d75b7f773b0437c59459f157198 100644
--- a/indra/llvfs/lldir_win32.cpp
+++ b/indra/llvfs/lldir_win32.cpp
@@ -240,67 +240,6 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &
 	return (file_count);
 }
 
-
-// get the next file in the directory
-BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname)
-{
-    BOOL fileFound = FALSE;
-	fname = "";
-
-	WIN32_FIND_DATAW FileData;
-    llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask);
-
-	if (pathname != mCurrentDir)
-	{
-		// different dir specified, close old search
-		if (!mCurrentDir.empty())
-		{
-			FindClose(mDirSearch_h);
-		}
-		mCurrentDir = pathname;
-
-		// and open new one
-		// Check error opening Directory structure
-		if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE)   
-		{
-           fileFound = TRUE;
-		}
-	}
-
-    // Loop to skip over the current (.) and parent (..) directory entries
-    // (apparently returned in Win7 but not XP)
-    do
-    {
-       if (   fileFound
-           && (  (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0)
-               ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0)
-               )
-           )
-       {
-          fileFound = FALSE;
-       }
-    } while (   mDirSearch_h != INVALID_HANDLE_VALUE
-             && !fileFound
-             && (fileFound = FindNextFile(mDirSearch_h, &FileData)
-                 )
-             );
-
-    if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES)
-    {
-       // No more files, so reset to beginning of directory
-       FindClose(mDirSearch_h);
-       mCurrentDir[0] = '\000';
-    }
-
-    if (fileFound)
-    {
-        // convert from TCHAR to char
-        fname = utf16str_to_utf8str(FileData.cFileName);
-	}
-    
-	return fileFound;
-}
-
 std::string LLDir_Win32::getCurPath()
 {
 	WCHAR w_str[MAX_PATH];
diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h
index b170ebbcd7da551cb3f0182bd51bd7ad419e40a6..62fb4713abe53ef6257d910525da1bd0efc83798 100644
--- a/indra/llvfs/lldir_win32.h
+++ b/indra/llvfs/lldir_win32.h
@@ -44,15 +44,12 @@ class LLDir_Win32 : public LLDir
 
 	/*virtual*/ std::string getCurPath();
 	/*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask);
-	/*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname);
 	/*virtual*/ BOOL fileExists(const std::string &filename) const;
 
 	/*virtual*/ std::string getLLPluginLauncher();
 	/*virtual*/ std::string getLLPluginFilename(std::string base_name);
 
 private:
-	BOOL getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname);
-
 	void* mDirSearch_h;
 	llutf16string mCurrentDir;
 };
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
index 5536ed8f69a97c49721cf0242d8a97bf5d89ad1f..041436ed92f24ade177358ca0db1aca687d15cf4 100644
--- a/indra/llvfs/lldiriterator.cpp
+++ b/indra/llvfs/lldiriterator.cpp
@@ -55,7 +55,7 @@ LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
 	// Check if path exists.
 	if (!fs::exists(dir_path))
 	{
-		llerrs << "Invalid path: \"" << dir_path.string() << "\"" << llendl;
+		llwarns << "Invalid path: \"" << dir_path.string() << "\"" << llendl;
 		return;
 	}
 
@@ -100,7 +100,7 @@ bool LLDirIterator::Impl::next(std::string &fname)
 
 	if (!mIsValid)
 	{
-		llerrs << "The iterator is not correctly initialized." << llendl;
+		llwarns << "The iterator is not correctly initialized." << llendl;
 		return false;
 	}
 
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index 20e10041f43eb8a20200fd246500cff8dcee46be..82c926620a07960695337df7148752bdb9aa5f0a 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -26,6 +26,8 @@
 
 #include "linden_common.h"
 
+#include "llvfs.h"
+
 #include <sys/stat.h>
 #include <set>
 #include <map>
@@ -39,8 +41,6 @@
 #include <sys/file.h>
 #endif
     
-#include "llvfs.h"
-
 #include "llstl.h"
 #include "lltimer.h"
     
@@ -1711,7 +1711,8 @@ void LLVFS::audit()
     
 	BOOL vfs_corrupt = FALSE;
 	
-	std::vector<U8> buffer(index_size);
+	// since we take the address of element 0, we need to have at least one element.
+	std::vector<U8> buffer(llmax<size_t>(index_size,1U));
 
 	if (fread(&buffer[0], 1, index_size, mIndexFP) != index_size)
 	{
diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp
index 8788bd63e87d2b8030324ffcd0e0434057844151..ea321c5ae958829d739137eae3548f5cbf07c540 100644
--- a/indra/llvfs/tests/lldir_test.cpp
+++ b/indra/llvfs/tests/lldir_test.cpp
@@ -28,6 +28,7 @@
 #include "linden_common.h"
 
 #include "../lldir.h"
+#include "../lldiriterator.h"
 
 #include "../test/lltut.h"
 
@@ -259,13 +260,12 @@ namespace tut
 
    std::string makeTestFile( const std::string& dir, const std::string& file )
    {
-      std::string delim = gDirUtilp->getDirDelimiter();
-      std::string path = dir + delim + file;
+      std::string path = dir + file;
       LLFILE* handle = LLFile::fopen( path, "w" );
       ensure("failed to open test file '"+path+"'", handle != NULL );
       // Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs
       // returns EOF; otherwise, it returns some other, nonnegative value."
-      ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0);
+      ensure("failed to write to test file '"+path+"'", EOF != fputs("test file", handle) );
       fclose(handle);
       return path;
    }
@@ -290,7 +290,7 @@ namespace tut
    }
 
    static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" };
-   
+
    void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5])
    {
 
@@ -300,7 +300,8 @@ namespace tut
       bool  filesFound[5] = { false, false, false, false, false };
       //std::cerr << "searching '"+directory+"' for '"+pattern+"'\n";
 
-      while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) )
+      LLDirIterator iter(directory, pattern);
+      while ( found <= 5 && iter.next(scanResult) )
       {
          found++;
          //std::cerr << "  found '"+scanResult+"'\n";
@@ -334,15 +335,15 @@ namespace tut
    
    template<> template<>
    void LLDirTest_object_t::test<5>()
-      // getNextFileInDir
+      // LLDirIterator::next
    {
       std::string delim = gDirUtilp->getDirDelimiter();
       std::string dirTemp = LLFile::tmpdir();
 
       // Create the same 5 file names of the two directories
 
-      std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir");
-      std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir");
+      std::string dir1 = makeTestDir(dirTemp + "LLDirIterator");
+      std::string dir2 = makeTestDir(dirTemp + "LLDirIterator");
       std::string dir1files[5];
       std::string dir2files[5];
       for (int i=0; i<5; i++)
@@ -380,19 +381,17 @@ namespace tut
       scanTest(dir2, "file?.x?z", expected7);
 
       // Scan dir2 and see if any file?.??c files are found
-      // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW
-      //      bool  expected8[5] = { true, true, false, false, false };
-      //      scanTest(dir2, "file?.??c", expected8);
-      //      scanTest(dir2, "*.??c", expected8);
+      bool  expected8[5] = { true, true, false, false, false };
+      scanTest(dir2, "file?.??c", expected8);
+      scanTest(dir2, "*.??c", expected8);
 
       // Scan dir1 and see if any *.?n? files are found
       bool  expected9[5] = { false, false, false, false, true };
       scanTest(dir1, "*.?n?", expected9);
 
       // Scan dir1 and see if any *.???? files are found
-      // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW
-      // bool  expected10[5] = { false, false, false, false, false };
-      // scanTest(dir1, "*.????", expected10);
+      bool  expected10[5] = { false, false, false, false, false };
+      scanTest(dir1, "*.????", expected10);
 
       // Scan dir1 and see if any ?????.* files are found
       bool  expected11[5] = { true, true, true, true, true };
@@ -402,6 +401,15 @@ namespace tut
       bool  expected12[5] = { false, false, true, true, false };
       scanTest(dir1, "??l??.xyz", expected12);
 
+      bool expected13[5] = { true, false, true, false, false };
+      scanTest(dir1, "file1.{abc,xyz}", expected13);
+
+      bool expected14[5] = { true, true, false, false, false };
+      scanTest(dir1, "file[0-9].abc", expected14);
+
+      bool expected15[5] = { true, true, false, false, false };
+      scanTest(dir1, "file[!a-z].abc", expected15);
+
       // clean up all test files and directories
       for (int i=0; i<5; i++)
       {
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index affd7276cceca1ebb83c9aff24fa3ba32c774ec0..cb2abc5bc0442a53b594f862fa90ac62f5271edb 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -108,9 +108,6 @@ static long getDictLong (CFDictionaryRef refDict, CFStringRef key);
 static EventTypeSpec WindowHandlerEventList[] =
 {
 	// Window-related events
-	//	{ kEventClassWindow, kEventWindowCollapsing },
-	//	{ kEventClassWindow, kEventWindowCollapsed },
-	//	{ kEventClassWindow, kEventWindowShown },
 	{ kEventClassWindow, kEventWindowActivated },
 	{ kEventClassWindow, kEventWindowDeactivated },
 	{ kEventClassWindow, kEventWindowShown },
@@ -121,8 +118,7 @@ static EventTypeSpec WindowHandlerEventList[] =
 	{ kEventClassWindow, kEventWindowClose },
 	{ kEventClassWindow, kEventWindowBoundsChanging },
 	{ kEventClassWindow, kEventWindowBoundsChanged },
-	//	{ kEventClassWindow, kEventWindowZoomed },
-	//	{ kEventClassWindow, kEventWindowDrawContent },
+	{ kEventClassWindow, kEventWindowGetIdealSize },
 
 	// Mouse events
 	{ kEventClassMouse, kEventMouseDown },
@@ -248,6 +244,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
 	mCursorIgnoreNextDelta = FALSE;
 	mNeedsResize = FALSE;
 	mOverrideAspectRatio = 0.f;
+	mMaximized = FALSE;
 	mMinimized = FALSE;
 	mTSMDocument = NULL; // Just in case.
 	mLanguageTextInputAllowed = FALSE;
@@ -455,24 +452,23 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
 
 	if(!mFullscreen && (mWindow == NULL))
 	{
-		Rect			window_rect;
 		//int				displayWidth = CGDisplayPixelsWide(mDisplay);
 		//int				displayHeight = CGDisplayPixelsHigh(mDisplay);
 		//const int		menuBarPlusTitleBar = 44;   // Ugly magic number.
 
 		LL_DEBUGS("Window") << "createContext: creating window" << LL_ENDL;
 
-		window_rect.left = (long) x;
-		window_rect.right = (long) x + width;
-		window_rect.top = (long) y;
-		window_rect.bottom = (long) y + height;
+		mPreviousWindowRect.left = (long) x;
+		mPreviousWindowRect.right = (long) x + width;
+		mPreviousWindowRect.top = (long) y;
+		mPreviousWindowRect.bottom = (long) y + height;
 
 		//-----------------------------------------------------------------------
 		// Create the window
 		//-----------------------------------------------------------------------
 		mWindow = NewCWindow(
 			NULL,
-			&window_rect,
+			&mPreviousWindowRect,
 			mWindowTitle,
 			false,				// Create the window invisible.  Whoever calls createContext() should show it after any moving/resizing.
 			//		noGrowDocProc,		// Window with no grow box and no zoom box
@@ -481,8 +477,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
 			kFirstWindowOfClass,
 			true,
 			(long)this);
-
-
+		
 		if (!mWindow)
 		{
 			setupFailure("Window creation error", "Error", OSMB_OK);
@@ -541,20 +536,20 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
 				GLint fullscreenAttrib[] =
 				{
 					AGL_RGBA,
-						AGL_FULLSCREEN,
-						//			AGL_NO_RECOVERY,	// MBW -- XXX -- Not sure if we want this attribute
-						AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
-						AGL_SAMPLES_ARB, mFSAASamples,
-						AGL_DOUBLEBUFFER,
-						AGL_CLOSEST_POLICY,
-						AGL_ACCELERATED,
-						AGL_RED_SIZE, 8,
-						AGL_GREEN_SIZE, 8,
-						AGL_BLUE_SIZE, 8,
-						AGL_ALPHA_SIZE, 8,
-						AGL_DEPTH_SIZE, 24,
-						AGL_STENCIL_SIZE, 8,
-						AGL_NONE
+					AGL_FULLSCREEN,
+					AGL_NO_RECOVERY,
+					AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
+					AGL_SAMPLES_ARB, mFSAASamples,
+					AGL_DOUBLEBUFFER,
+					AGL_CLOSEST_POLICY,
+					AGL_ACCELERATED,
+					AGL_RED_SIZE, 8,
+					AGL_GREEN_SIZE, 8,
+					AGL_BLUE_SIZE, 8,
+					AGL_ALPHA_SIZE, 8,
+					AGL_DEPTH_SIZE, 24,
+					AGL_STENCIL_SIZE, 8,
+					AGL_NONE
 				};
 
 				LL_DEBUGS("Window") << "createContext: creating fullscreen pixelformat" << LL_ENDL;
@@ -567,21 +562,28 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
 			}
 			else
 			{
+				// NOTE from Leslie:
+				//
+				// AGL_NO_RECOVERY, when combined with AGL_ACCELERATED prevents software rendering
+				// fallback which means we won't hvae shaders that compile and link but then don't
+				// work.  The drawback is that our shader compilation will be a bit more finicky though.
+
 				GLint windowedAttrib[] =
 				{
 					AGL_RGBA,
-						AGL_DOUBLEBUFFER,
-						AGL_CLOSEST_POLICY,
-						AGL_ACCELERATED,
-						AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
-						AGL_SAMPLES_ARB, mFSAASamples,
-						AGL_RED_SIZE, 8,
-						AGL_GREEN_SIZE, 8,
-						AGL_BLUE_SIZE, 8,
-						AGL_ALPHA_SIZE, 8,
-						AGL_DEPTH_SIZE, 24,
-						AGL_STENCIL_SIZE, 8,
-						AGL_NONE
+					AGL_NO_RECOVERY,
+					AGL_DOUBLEBUFFER,
+					AGL_CLOSEST_POLICY,
+					AGL_ACCELERATED,
+					AGL_SAMPLE_BUFFERS_ARB, mFSAASamples > 0 ? 1 : 0,
+					AGL_SAMPLES_ARB, mFSAASamples,
+					AGL_RED_SIZE, 8,
+					AGL_GREEN_SIZE, 8,
+					AGL_BLUE_SIZE, 8,
+					AGL_ALPHA_SIZE, 8,
+					AGL_DEPTH_SIZE, 24,
+					AGL_STENCIL_SIZE, 8,
+					AGL_NONE
 				};
 
 				LL_DEBUGS("Window") << "createContext: creating windowed pixelformat" << LL_ENDL;
@@ -1093,31 +1095,22 @@ BOOL LLWindowMacOSX::getVisible()
 
 BOOL LLWindowMacOSX::getMinimized()
 {
-	BOOL result = FALSE;
-	
-	// Since the set of states where we want to act "minimized" is non-trivial, it's easier to
-	// track things locally than to try and retrieve the state from the window manager.
-	result = mMinimized;
-
-	return(result);
+	return mMinimized;
 }
 
 BOOL LLWindowMacOSX::getMaximized()
 {
-	BOOL result = FALSE;
-
-	if (mWindow)
-	{
-		// TODO
-	}
-
-	return(result);
+	return mMaximized;
 }
 
 BOOL LLWindowMacOSX::maximize()
 {
-	// TODO
-	return FALSE;
+	if (mWindow && !mMaximized)
+	{
+		ZoomWindow(mWindow, inContent, true);
+	}
+	
+	return mMaximized;
 }
 
 BOOL LLWindowMacOSX::getFullscreen()
@@ -2559,7 +2552,24 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
 
 				GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &currentBounds);
 				GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &previousBounds);
-
+				
+				// Put an offset into window un-maximize operation since the kEventWindowGetIdealSize
+				// event only allows the specification of size and not position.
+				if (mMaximized)
+				{
+					short leftOffset = mPreviousWindowRect.left - currentBounds.left;
+					currentBounds.left += leftOffset;
+					currentBounds.right += leftOffset;
+					
+					short topOffset = mPreviousWindowRect.top - currentBounds.top;
+					currentBounds.top += topOffset;
+					currentBounds.bottom += topOffset;
+				}
+				else
+				{
+					// Store off the size for future un-maximize operations
+					mPreviousWindowRect = previousBounds;
+				}
 
 				if ((currentBounds.right - currentBounds.left) < MIN_WIDTH)
 				{
@@ -2578,13 +2588,43 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
 
 		case kEventWindowBoundsChanged:
 			{
+				// Get new window bounds
 				Rect newBounds;
-
 				GetEventParameter(event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &newBounds);
+				
+				// Get previous window bounds
+				Rect oldBounds;
+				GetEventParameter(event, kEventParamPreviousBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &oldBounds);
+				
+				// Determine if the new size is larger than the old
+				bool newBoundsLarger = ((newBounds.right - newBounds.left) >= (oldBounds.right - oldBounds.left));
+				newBoundsLarger &= ((newBounds.bottom - newBounds.top) >= (oldBounds.bottom - oldBounds.top));
+				
+				// Check to see if this is a zoom event (+ button on window pane)
+				unsigned int eventParams;
+				GetEventParameter(event, kEventParamAttributes, typeUInt32, NULL, sizeof(int), NULL, &eventParams);
+				bool isZoomEvent = ((eventParams & kWindowBoundsChangeZoom) != 0);
+				
+				// Maximized flag is if zoom event and increasing window size
+				mMaximized = (isZoomEvent && newBoundsLarger);
+				
 				aglUpdateContext(mContext);
+				
 				mCallbacks->handleResize(this, newBounds.right - newBounds.left, newBounds.bottom - newBounds.top);
-
-
+			}
+			break;
+			
+		case kEventWindowGetIdealSize:
+			// Only recommend a new ideal size when un-maximizing
+			if (mMaximized == TRUE)
+			{
+				Point nonMaximizedSize;
+				
+				nonMaximizedSize.v = mPreviousWindowRect.bottom - mPreviousWindowRect.top;
+				nonMaximizedSize.h = mPreviousWindowRect.right - mPreviousWindowRect.left;
+				
+				SetEventParameter(event, kEventParamDimensions, typeQDPoint, sizeof(Point), &nonMaximizedSize);
+				result = noErr;
 			}
 			break;
 
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 6dc093b4be0e31a622b08e3993e1b143af1170a9..6c9e075a219b0d92adafdb9cb60f78d542106f32 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -156,7 +156,6 @@ class LLWindowMacOSX : public LLWindow
 	static pascal Boolean staticMoveEventComparator( EventRef event, void* data);
 	OSStatus eventHandler (EventHandlerCallRef myHandler, EventRef event);
 	void adjustCursorDecouple(bool warpingMouse = false);
-	void fixWindowSize(void);
 	void stopDockTileBounce();
 	static MASK modifiersToMask(SInt16 modifiers);
 	
@@ -182,6 +181,7 @@ class LLWindowMacOSX : public LLWindow
 	EventComparatorUPP  mMoveEventCampartorUPP;
 	
 	Rect		mOldMouseClip;  // Screen rect to which the mouse cursor was globally constrained before we changed it in clipMouse()
+	Rect		mPreviousWindowRect;  // Save previous window for un-maximize event
 	Str255 		mWindowTitle;
 	double		mOriginalAspectRatio;
 	BOOL		mSimulatedRightClick;
@@ -195,6 +195,7 @@ class LLWindowMacOSX : public LLWindow
 	BOOL		mNeedsResize;		// Constructor figured out the window is too big, it needs a resize.
 	LLCoordScreen   mNeedsResizeSize;
 	F32			mOverrideAspectRatio;
+	BOOL		mMaximized;
 	BOOL		mMinimized;
 	U32			mFSAASamples;
 	BOOL		mForceRebuild;
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 6e4364a20d294d27db4c4b84d8490fe7b2acd891..0809d956281c0fca42d8013aea2388a75094a010 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -837,9 +837,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
 
 U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values)
 {
-	std::string name;
 	LLSD settings;
-	LLSD control_map;
 	llifstream infile;
 	infile.open(filename);
 	if(!infile.is_open())
@@ -863,8 +861,8 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
 	for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr)
 	{
 		bool persist = true;
-		name = (*itr).first;
-		control_map = (*itr).second;
+		std::string const & name = itr->first;
+		LLSD const & control_map = itr->second;
 		
 		if(control_map.has("Persist")) 
 		{
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index e13d73c6401e48364932f838f6799eff8cf87a44..5388069c24910c2b5a2ca4a54790127f82e9b950 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -30,6 +30,8 @@
 
 #include "llfasttimer.h"	// for call count statistics
 #include "llxuiparser.h"
+#include "llsd.h"
+#include "llxmlnode.h"
 
 #include <map>
 
@@ -154,13 +156,28 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
 	}
 	else
 	{
-		LLSD args;
-		args["STRING_NAME"] = xml_desc;
 		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
+		return "MissingString("+xml_desc+")";
+	}
+}
 
-		//LLNotificationsUtil::add("MissingString", args); // *TODO: resurrect
-		//return xml_desc;
+//static
+std::string LLTrans::getString(const std::string &xml_desc, const LLSD& msg_args)
+{
+	// Don't care about time as much as call count.  Make sure we're not
+	// calling LLTrans::getString() in an inner loop. JC
+	LLFastTimer timer(FTM_GET_TRANS);
 
+	template_map_t::iterator iter = sStringTemplates.find(xml_desc);
+	if (iter != sStringTemplates.end())
+	{
+		std::string text = iter->second.mText;
+		LLStringUtil::format(text, msg_args);
+		return text;
+	}
+	else
+	{
+		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
 		return "MissingString("+xml_desc+")";
 	}
 }
@@ -182,11 +199,27 @@ bool LLTrans::findString(std::string &result, const std::string &xml_desc, const
 	}
 	else
 	{
-		LLSD args;
-		args["STRING_NAME"] = xml_desc;
-		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
-		//LLNotificationsUtil::add("MissingString", args);
-		
+		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;	
+		return false;
+	}
+}
+
+//static
+bool LLTrans::findString(std::string &result, const std::string &xml_desc, const LLSD& msg_args)
+{
+	LLFastTimer timer(FTM_GET_TRANS);
+
+	template_map_t::iterator iter = sStringTemplates.find(xml_desc);
+	if (iter != sStringTemplates.end())
+	{
+		std::string text = iter->second.mText;
+		LLStringUtil::format(text, msg_args);
+		result = text;
+		return true;
+	}
+	else
+	{
+		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;	
 		return false;
 	}
 }
diff --git a/indra/llxuixml/lltrans.h b/indra/llxuixml/lltrans.h
index 5b127b53cff94472f2f388448d7bcf430ee64dd8..128b51d3831dcd70f0c9a97edf1e93cebc41004d 100644
--- a/indra/llxuixml/lltrans.h
+++ b/indra/llxuixml/lltrans.h
@@ -29,8 +29,12 @@
 
 #include <map>
 
+#include "llpointer.h"
 #include "llstring.h"
-#include "llxmlnode.h"
+
+class LLXMLNode;
+
+class LLSD;
 
 /**
  * @brief String template loaded from strings.xml
@@ -61,9 +65,9 @@ class LLTrans
 	 * @param default_args Set of strings (expected to be in the file) to use as default replacement args, e.g. "SECOND_LIFE"
 	 * @returns true if the file was parsed successfully, true if something went wrong
 	 */
-	static bool parseStrings(LLXMLNodePtr& root, const std::set<std::string>& default_args);
+	static bool parseStrings(LLPointer<LLXMLNode> & root, const std::set<std::string>& default_args);
 
-	static bool parseLanguageStrings(LLXMLNodePtr &root);
+	static bool parseLanguageStrings(LLPointer<LLXMLNode> & root);
 
 	/**
 	 * @brief Returns a translated string
@@ -72,7 +76,9 @@ class LLTrans
 	 * @returns Translated string
 	 */
 	static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+	static std::string getString(const std::string &xml_desc, const LLSD& args);
 	static bool findString(std::string &result, const std::string &xml_desc, const LLStringUtil::format_map_t& args);
+	static bool findString(std::string &result, const std::string &xml_desc, const LLSD& args);
 
 	// Returns translated string with [COUNT] replaced with a number, following
 	// special per-language logic for plural nouns.  For example, some languages
diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h
index 7a748d8aea770562f7312b2686fbe74de0fb10b8..0c38c4da936b2feb28e4e58172f4db6c2c0f6b34 100644
--- a/indra/llxuixml/llxuiparser.h
+++ b/indra/llxuixml/llxuiparser.h
@@ -28,7 +28,6 @@
 #define LLXUIPARSER_H
 
 #include "llinitparam.h"
-#include "llfasttimer.h"
 #include "llregistry.h"
 #include "llpointer.h"
 
@@ -95,6 +94,7 @@ class LLXUIXSDWriter : public LLXSDWriter
 };
 
 
+class LLXUIParserImpl;
 
 class LLXUIParser : public LLInitParam::Parser
 {
@@ -176,6 +176,7 @@ LOG_CLASS(LLXUIParser);
 // ordering of child elements from base file to localized diff file.  Then we can use a pair
 // of coroutines to perform matching of xml nodes during parsing.  Not sure if the overhead
 // of coroutines would offset the gain from SAX parsing
+class LLSimpleXUIParserImpl;
 
 class LLSimpleXUIParser : public LLInitParam::Parser
 {
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 1d155add5175b968bc3808072bd3efde53db9021..769dcf845716dca6767f536f611f450a6e0a1757 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -76,6 +76,8 @@ include_directories(
     )
 
 set(viewer_SOURCE_FILES
+    groupchatlistener.cpp
+    llaccountingquotamanager.cpp
     llagent.cpp
     llagentaccess.cpp
     llagentcamera.cpp
@@ -222,6 +224,7 @@ set(viewer_SOURCE_FILES
     llfloatersettingsdebug.cpp
     llfloatersidetraytab.cpp
     llfloatersnapshot.cpp
+    llfloatersounddevices.cpp
     llfloatertelehub.cpp
     llfloatertestinspectors.cpp
     llfloatertestlistview.cpp
@@ -623,6 +626,8 @@ endif (LINUX)
 set(viewer_HEADER_FILES
     CMakeLists.txt
     ViewerInstall.cmake
+    groupchatlistener.h
+    llaccountingquotamanager.h
     llagent.h
     llagentaccess.h
     llagentcamera.h
@@ -771,6 +776,7 @@ set(viewer_HEADER_FILES
     llfloatersettingsdebug.h
     llfloatersidetraytab.h
     llfloatersnapshot.h
+    llfloatersounddevices.h
     llfloatertelehub.h
     llfloatertestinspectors.h
     llfloatertestlistview.h
diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml
index f1862f9d726e50180f7a62420ca1140828c2fe5e..5bc2e1b7e64f2cbed20033ab50f3d7fc6eea426a 100644
--- a/indra/newview/app_settings/high_graphics.xml
+++ b/indra/newview/app_settings/high_graphics.xml
@@ -4,15 +4,15 @@
 	<RenderAvatarCloth value="FALSE"/>
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="1.0"/>
-  <!--Default for now-->
-  <RenderAvatarPhysicsLODFactor value="0.9"/>
+	<!--Default for now-->
+	<RenderAvatarPhysicsLODFactor value="0.9"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
 	<RenderFarClip value="128"/>
 	<!--Default for now-->
 	<RenderFlexTimeFactor value="1"/>
-	<!--256... but they don't use this-->
+	<!--256... but they do not use this-->
 	<RenderGlowResolutionPow value="9"/>
 	<!--Low number-->
 	<RenderMaxPartCount value="4096"/>
@@ -34,11 +34,10 @@
 	<VertexShaderEnable value="TRUE"/>
 	<!--NO SHADERS-->
 	<WindLightUseAtmosShaders value="TRUE"/>
-  <!--Deferred Shading-->
-  <RenderDeferred value="FALSE"/>
-  <!--SSAO Disabled-->
-  <RenderDeferredSSAO value="FALSE"/>
-  <!--Sun Shadows-->
-  <RenderShadowDetail value="0"/>
-
+	<!--Deferred Shading-->
+	<RenderDeferred value="FALSE"/>
+	<!--SSAO Disabled-->
+	<RenderDeferredSSAO value="FALSE"/>
+	<!--Sun Shadows-->
+	<RenderShadowDetail value="0"/>
 </settings>
diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml
index ad0073dfac548cd8ac8b4e16f8381a7aa533585b..ca1dae0b86d4a97030806a6deebbafbc3877bd70 100644
--- a/indra/newview/app_settings/low_graphics.xml
+++ b/indra/newview/app_settings/low_graphics.xml
@@ -4,17 +4,17 @@
 	<RenderAvatarCloth value="FALSE"/>
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="0.5"/>
-  <!--Default for now-->
-  <RenderAvatarPhysicsLODFactor value="0.0"/>
-  <!--Default for now-->
-  <RenderAvatarMaxVisible value="3"/>
+	<!--Default for now-->
+	<RenderAvatarPhysicsLODFactor value="0.0"/>
+	<!--Default for now-->
+	<RenderAvatarMaxVisible value="3"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="FALSE"/>
 	<!--Short Range-->
 	<RenderFarClip value="64"/>
 	<!--Default for now-->
 	<RenderFlexTimeFactor value="0.5"/>
-	<!--256... but they don't use this-->
+	<!--256... but they do not use this-->
 	<RenderGlowResolutionPow value="8"/>
 	<!--Low number-->
 	<RenderMaxPartCount value="1024"/>
@@ -36,11 +36,10 @@
 	<VertexShaderEnable value="FALSE"/>
 	<!--NO SHADERS-->
 	<WindLightUseAtmosShaders value="FALSE"/>
-  <!--No Deferred Shading-->
-  <RenderDeferred value="FALSE"/>
-  <!--SSAO Disabled-->
-  <RenderDeferredSSAO value="FALSE"/>
-  <!--No Shadows-->
-  <RenderShadowDetail value="0"/>
-
+	<!--No Deferred Shading-->
+	<RenderDeferred value="FALSE"/>
+	<!--SSAO Disabled-->
+	<RenderDeferredSSAO value="FALSE"/>
+	<!--No Shadows-->
+	<RenderShadowDetail value="0"/>
 </settings>
diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml
index 6c4afbd7f014d3a5197627b5ac91cf7a16dd5216..01822fe64c9828db0af9e1b2517a0471dc0337e6 100644
--- a/indra/newview/app_settings/mid_graphics.xml
+++ b/indra/newview/app_settings/mid_graphics.xml
@@ -4,15 +4,15 @@
 	<RenderAvatarCloth value="FALSE"/>
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="0.5"/>
-  <!--Default for now-->
-  <RenderAvatarPhysicsLODFactor value="0.75"/>
+	<!--Default for now-->
+	<RenderAvatarPhysicsLODFactor value="0.75"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
 	<RenderFarClip value="96"/>
 	<!--Default for now-->
 	<RenderFlexTimeFactor value="1"/>
-	<!--256... but they don't use this-->
+	<!--256... but they do not use this-->
 	<RenderGlowResolutionPow value="8"/>
 	<!--Low number-->
 	<RenderMaxPartCount value="2048"/>
@@ -34,11 +34,10 @@
 	<VertexShaderEnable value="TRUE"/>
 	<!--NO SHADERS-->
 	<WindLightUseAtmosShaders value="FALSE"/>
-  <!--No Deferred Shading-->
-  <RenderDeferred value="FALSE"/>
-  <!--SSAO Disabled-->
-  <RenderDeferredSSAO value="FALSE"/>
-  <!--No Shadows-->
-  <RenderShadowDetail value="0"/>
-
+	<!--No Deferred Shading-->
+	<RenderDeferred value="FALSE"/>
+	<!--SSAO Disabled-->
+	<RenderDeferredSSAO value="FALSE"/>
+	<!--No Shadows-->
+	<RenderShadowDetail value="0"/>
 </settings>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c4af9e2ab6518c03bcd0da7a75f6bf1d0a0b7e46..78db307d648b196ceb70d18a6c7d555e1b98f6d9 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4356,6 +4356,39 @@
       <key>Value</key>
         <real>0.25</real>
       </map>
+	<key>Jpeg2000AdvancedCompression</key>
+	  <map>
+      <key>Comment</key>
+        <string>Use advanced Jpeg2000 compression options (precincts, blocks, ordering, markers)</string>
+      <key>Persist</key>
+        <integer>1</integer>
+      <key>Type</key>
+        <string>Boolean</string>
+      <key>Value</key>
+        <integer>0</integer>
+	  </map>
+	<key>Jpeg2000PrecinctsSize</key>
+	  <map>
+      <key>Comment</key>
+        <string>Size of image precincts. Assumed square and same for all levels. Must be power of 2.</string>
+      <key>Persist</key>
+        <integer>1</integer>
+      <key>Type</key>
+        <string>S32</string>
+      <key>Value</key>
+        <integer>256</integer>
+	  </map>
+	<key>Jpeg2000BlocksSize</key>
+	  <map>
+      <key>Comment</key>
+        <string>Size of encoding blocks. Assumed square and same for all levels. Must be power of 2. Max 64, Min 4.</string>
+      <key>Persist</key>
+        <integer>1</integer>
+      <key>Type</key>
+        <string>S32</string>
+      <key>Value</key>
+        <integer>64</integer>
+	  </map>
     <key>KeepAspectForSnapshot</key>
     <map>
       <key>Comment</key>
@@ -5545,6 +5578,17 @@
     <key>Value</key>
     <real>0</real>
   </map>
+  <key>MeshUseWholeModelUpload</key>
+  <map>
+    <key>Comment</key>
+    <string>Upload model in its entirety instead of mesh-by-mesh (new caps)</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <real>0</real>
+  </map>
   <key>MigrateCacheDirectory</key>
     <map>
       <key>Comment</key>
@@ -12100,10 +12144,10 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>VoiceCallsRejectAll</key>
+    <key>VoiceCallsRejectGroup</key>
     <map>
       <key>Comment</key>
-      <string>Silently reject all incoming voice calls.</string>
+      <string>Silently reject all incoming group voice calls.</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -12995,6 +13039,17 @@
       <string>Boolean</string>
       <key>Value</key>
       <integer>1</integer>
+    </map>    
+    <key>EnablePlaceProfile</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable viewing of place profile from web link</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
     </map>
     <key>EnablePicks</key>
     <map>
@@ -13161,5 +13216,27 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>OpenIMOnVoice</key>
+    <map>
+      <key>Comment</key>
+      <string>Open the corresponding IM window when connecting to a voice call.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+     <key>AllowBottomTrayButtonReordering</key>
+    <map>
+      <key>Comment</key>
+      <string>Allow user to move and hide bottom tray buttons</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
 </map>
 </llsd>
diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml
index bc97ec00e9bad376dc5a40e889a8e28c8f81a56c..70a75cb4ca96adb551d5b9eacd185080c5e85f90 100644
--- a/indra/newview/app_settings/settings_minimal.xml
+++ b/indra/newview/app_settings/settings_minimal.xml
@@ -45,15 +45,6 @@
         <key>Value</key>
             <integer>0</integer>
         </map>
-    <key>EnableVoiceChat</key>
-        <map>
-        <key>Comment</key>
-            <string>Enable talking to other residents with a microphone</string>
-        <key>Type</key>
-            <string>Boolean</string>
-        <key>Value</key>
-            <integer>0</integer>
-        </map>
     <key>HelpURLFormat</key>
         <map>
         <key>Comment</key>
@@ -117,10 +108,10 @@
         <key>Value</key>
             <integer>0</integer>
         </map>
-    <key>VoiceCallsRejectAll</key>
+    <key>VoiceCallsRejectGroup</key>
         <map>
         <key>Comment</key>
-            <string>Silently reject all incoming voice calls.</string>
+            <string>Silently reject all incoming group voice calls.</string>
         <key>Type</key>
             <string>Boolean</string>
         <key>Value</key>
@@ -133,7 +124,7 @@
         <key>Type</key>
             <string>Boolean</string>
         <key>Value</key>
-            <integer>1</integer>
+            <integer>0</integer>
         </map>
       <key>ScriptsCanShowUI</key>
       <map>
@@ -248,6 +239,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>EnablePlaceProfile</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable viewing of place profile from web link</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>EnablePicks</key>
     <map>
       <key>Comment</key>
@@ -290,7 +292,7 @@
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>0</integer>
+      <integer>1</integer>
     </map>
     <key>EnableAvatarShare</key>
     <map>
@@ -435,5 +437,27 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>OpenIMOnVoice</key>
+    <map>
+      <key>Comment</key>
+      <string>Open the corresponding IM window when connecting to a voice call.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>AllowBottomTrayButtonReordering</key>
+    <map>
+      <key>Comment</key>
+      <string>Allow user to move and hide bottom tray buttons</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
   </map>
 </llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 8efec1cff0726becb82fcb834a8d90e85f9a7331..ff24efaf2c5793583658c138a6dce87a1cbee828 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -44,6 +44,17 @@
         <key>Value</key>
             <integer>0</integer>
         </map>
+    <key>LastPostcardRecipient</key>
+      <map>
+        <key>Comment</key>
+          <string>Last recipient of postcard</string>
+        <key>Persist</key>
+          <integer>1</integer>
+        <key>Type</key>
+          <string>String</string>
+        <key>Value</key>
+          <string />
+      </map>
     <key>LogNearbyChat</key>
         <map>
         <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
index 4261f943fb8a93c932eadf9e5193c9bd2875c8a2..5addbbb1763ade3c49fd27dfdb8984578dbfb4f6 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl
@@ -12,7 +12,6 @@ mat4 getObjectSkinnedTransform();
 void calcAtmospherics(vec3 inPositionEye);
 
 float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
 
 vec3 atmosAmbient(vec3 light);
 vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -23,11 +22,36 @@ varying vec3 vary_position;
 varying vec3 vary_ambient;
 varying vec3 vary_directional;
 varying vec3 vary_normal;
-varying vec3 vary_light;
 varying vec3 vary_fragcoord;
+varying vec3 vary_pointlight_col;
 
 uniform float near_clip;
 
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+	//get light vector
+	vec3 lv = lp.xyz-v;
+	
+	//get distance
+	float d = length(lv);
+	
+	//normalize light vector
+	lv *= 1.0/d;
+	
+	//distance attenuation
+	float dist2 = d*d/(la*la);
+	float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+	// spotlight coefficient.
+	float spot = max(dot(-ln, lv), is_pointlight);
+	da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+	//angular attenuation
+	da *= calcDirectionalLight(n, lv);
+
+	return da;	
+}
+
 void main()
 {
 	gl_TexCoord[0] = gl_MultiTexCoord0;
@@ -53,20 +77,20 @@ void main()
 
 	vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
 
-	// Collect normal lights (need to be divided by two, as we later multiply by 2)
-	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
-	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
-	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
-	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
-	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
-	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
-	col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
-	col.rgb = scaleDownLight(col.rgb);
+	// Collect normal lights
+	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
 	
+	vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+	col.rgb = vec3(0,0,0);
+
 	// Add windlight lights
-	col.rgb += atmosAmbient(vec3(0.));
-	
-	vary_light = gl_LightSource[0].position.xyz;
+	col.rgb = atmosAmbient(vec3(0.));
 	
 	vary_ambient = col.rgb*gl_Color.rgb;
 	vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl
deleted file mode 100644
index 7d9d6cc0b25e5720530162d7e7e3a21ad9e33092..0000000000000000000000000000000000000000
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaF.glsl
+++ /dev/null
@@ -1,70 +0,0 @@
-/** 
- * @file avatarAlphaF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
-
-#version 120
-
-uniform sampler2D diffuseMap;
-uniform sampler2DShadow shadowMap0;
-uniform sampler2DShadow shadowMap1;
-uniform sampler2DShadow shadowMap2;
-uniform sampler2DShadow shadowMap3;
-uniform sampler2D noiseMap;
-
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec4 vary_position;
-varying vec3 vary_normal;
-
-void main() 
-{
-	float shadow = 1.0;
-	vec4 pos = vary_position;
-	vec3 norm = normalize(vary_normal);
-	
-	vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz;
-
-	if (pos.z > -shadow_clip.w)
-	{	
-		
-		if (pos.z < -shadow_clip.z)
-		{
-			vec4 lpos = shadow_matrix[3]*pos;
-			shadow = shadow2DProj(shadowMap3, lpos).x;
-		}
-		else if (pos.z < -shadow_clip.y)
-		{
-			vec4 lpos = shadow_matrix[2]*pos;
-			shadow = shadow2DProj(shadowMap2, lpos).x;
-		}
-		else if (pos.z < -shadow_clip.x)
-		{
-			vec4 lpos = shadow_matrix[1]*pos;
-			shadow = shadow2DProj(shadowMap1, lpos).x;
-		}
-		else
-		{
-			vec4 lpos = shadow_matrix[0]*pos;
-			shadow = shadow2DProj(shadowMap0, lpos).x;
-		}
-	}
-	
-	
-	vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a);	
-	vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
-	
-	color.rgb = atmosLighting(color.rgb);
-
-	color.rgb = scaleSoftClip(color.rgb);
-
-	gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
index 5dfbb913935da494700ea67c93ed4f959bf95deb..a2a7dea20d5cf6206d564605e01401f2e29804c3 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl
@@ -22,11 +22,36 @@ vec3 scaleUpLight(vec3 light);
 varying vec3 vary_position;
 varying vec3 vary_ambient;
 varying vec3 vary_directional;
-varying vec3 vary_normal;
 varying vec3 vary_fragcoord;
+varying vec3 vary_pointlight_col;
 
 uniform float near_clip;
 
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+	//get light vector
+	vec3 lv = lp.xyz-v;
+	
+	//get distance
+	float d = length(lv);
+	
+	//normalize light vector
+	lv *= 1.0/d;
+	
+	//distance attenuation
+	float dist2 = d*d/(la*la);
+	float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+	// spotlight coefficient.
+	float spot = max(dot(-ln, lv), is_pointlight);
+	da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+	//angular attenuation
+	da *= calcDirectionalLight(n, lv);
+
+	return da;	
+}
+
 void main()
 {
 	gl_TexCoord[0] = gl_MultiTexCoord0;
@@ -49,7 +74,6 @@ void main()
 	gl_Position = frag_pos;
 	
 	vary_position = pos.xyz;
-	vary_normal = norm;	
 	
 	calcAtmospherics(pos.xyz);
 
@@ -57,18 +81,20 @@ void main()
 
 	vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
 
-	// Collect normal lights (need to be divided by two, as we later multiply by 2)
-	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
-	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
-	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
-	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
-	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
-	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
-	col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
-	col.rgb = scaleDownLight(col.rgb);
+	// Collect normal lights
+	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
 	
+	vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+	col.rgb = vec3(0,0,0);
+
 	// Add windlight lights
-	col.rgb += atmosAmbient(vec3(0.));
+	col.rgb = atmosAmbient(vec3(0.));
 	
 	vary_ambient = col.rgb*gl_Color.rgb;
 	vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
index c5ddf31ac03b727b5e4370b0fd64e199ce2c52cd..609fc4f14ffa68aa634e0356d88891d022131ed7 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl
@@ -23,8 +23,9 @@ uniform float sun_wash;
 
 uniform int light_count;
 
-uniform vec4 light[16];
-uniform vec4 light_col[16];
+#define MAX_LIGHT_COUNT		16
+uniform vec4 light[MAX_LIGHT_COUNT];
+uniform vec4 light_col[MAX_LIGHT_COUNT];
 
 varying vec4 vary_fragcoord;
 uniform vec2 screen_res;
@@ -63,50 +64,56 @@ void main()
 	float noise = texture2D(noiseMap, frag.xy/128.0).b;
 	vec3 out_col = vec3(0,0,0);
 	vec3 npos = normalize(-pos);
-	
-	for (int i = 0; i < light_count; ++i)
+
+	// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
+	for (int i = 0; i < MAX_LIGHT_COUNT; ++i)
 	{
+		bool light_contrib = (i < light_count);
+		
 		vec3 lv = light[i].xyz-pos;
 		float dist2 = dot(lv,lv);
 		dist2 /= light[i].w;
 		if (dist2 > 1.0)
 		{
-			continue;
+			light_contrib = false;
 		}
 		
 		float da = dot(norm, lv);
 		if (da < 0.0)
 		{
-			continue;
+			light_contrib = false;
 		}
-				
-		lv = normalize(lv);
-		da = dot(norm, lv);
-				
-		float fa = light_col[i].a+1.0;
-		float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
-		dist_atten *= noise;
-
-		float lit = da * dist_atten;
 		
-		vec3 col = light_col[i].rgb*lit*diff;
-		//vec3 col = vec3(dist2, light_col[i].a, lit);
-		
-		if (spec.a > 0.0)
+		if (light_contrib)
 		{
-			//vec3 ref = dot(pos+lv, norm);
+			lv = normalize(lv);
+			da = dot(norm, lv);
+					
+			float fa = light_col[i].a+1.0;
+			float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+			dist_atten *= noise;
+
+			float lit = da * dist_atten;
 			
-			float sa = dot(normalize(lv+npos),norm);
+			vec3 col = light_col[i].rgb*lit*diff;
+			//vec3 col = vec3(dist2, light_col[i].a, lit);
 			
-			if (sa > 0.0)
+			if (spec.a > 0.0)
 			{
-				sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
-				sa *= noise;
-				col += da*sa*light_col[i].rgb*spec.rgb;
+				//vec3 ref = dot(pos+lv, norm);
+				
+				float sa = dot(normalize(lv+npos),norm);
+				
+				if (sa > 0.0)
+				{
+					sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
+					sa *= noise;
+					col += da*sa*light_col[i].rgb*spec.rgb;
+				}
 			}
+			
+			out_col += col;
 		}
-		
-		out_col += col;	
 	}
 	
 	if (dot(out_col, out_col) <= 0.0)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..2e3e84dd156fd62563fbd241cd02d38f9236fb50
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightV.glsl
@@ -0,0 +1,20 @@
+/** 
+ * @file multiPointLightV.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+
+#version 120
+
+varying vec4 vary_fragcoord;
+
+void main()
+{
+	//transform vertex
+	vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex;
+	vary_fragcoord = pos;
+
+	gl_Position = pos;
+	gl_FrontColor = gl_Color;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
index f377685045acc8d27401bac7a9c91ecb2e77423c..77f1b2224c20f04f66b79b948fc5be3a3844f6ea 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl
@@ -57,11 +57,11 @@ void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc)
 	
 	float sc = calc_cof(d);
 	
-	float wg = 1.0;
+	float wg = 0.25;
 		
 	vec4 s = texture2DRect(diffuseRect, tc);
 	// de-weight dull areas to make highlights 'pop'
-	wg *= s.r+s.g+s.b;
+	wg += s.r+s.g+s.b;
 	
 	diff += wg*s;
 	
@@ -77,11 +77,11 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ve
 	if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius
 	   || d < cur_depth) //sampled pixel is further away than current pixel
 	{
-		float wg = 1.0;
+		float wg = 0.25;
 		
 		vec4 s = texture2DRect(diffuseRect, tc);
 		// de-weight dull areas to make highlights 'pop'
-		wg *= s.r+s.g+s.b;
+		wg += s.r+s.g+s.b;
 	
 		diff += wg*s;
 		
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
new file mode 100644
index 0000000000000000000000000000000000000000..ab48d08bbb070342a2f48402b32859c8aaedf01a
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredNoDoFF.glsl
@@ -0,0 +1,24 @@
+/** 
+ * @file postDeferredF.glsl
+ *
+ * $LicenseInfo:firstyear=2007&license=viewerlgpl$
+ * $/LicenseInfo$
+ */
+ 
+#version 120
+
+#extension GL_ARB_texture_rectangle : enable
+
+uniform sampler2DRect diffuseRect;
+uniform sampler2D bloomMap;
+
+uniform vec2 screen_res;
+varying vec2 vary_fragcoord;
+
+void main() 
+{
+	vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy);
+	
+	vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res);
+	gl_FragColor = diff + bloom;
+}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
index 25ff958107f1368af1a248d798987ca33655d26e..cd91351ad411e91b425f478e65f6123f583ea01b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl
@@ -15,8 +15,6 @@ uniform sampler2DRect depthMap;
 uniform sampler2DRect normalMap;
 uniform sampler2D noiseMap;
 
-uniform sampler2D		lightFunc;
-
 
 // Inputs
 uniform mat4 shadow_matrix[6];
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index 88ca60318b5fd335622260e716422b0ee48e2491..6dfc1b952c1fc52bb82e8d690228c57d65d13457 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -28,7 +28,6 @@ varying vec3 vary_ambient;
 varying vec3 vary_directional;
 varying vec3 vary_fragcoord;
 varying vec3 vary_position;
-varying vec3 vary_light;
 varying vec3 vary_pointlight_col;
 
 uniform float shadow_bias;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
index 1da3d95069a05746ee90e95588c80ce4674e3ca8..d227346163e052e600adeb27bf51434921bc82fd 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl
@@ -11,7 +11,6 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
 void calcAtmospherics(vec3 inPositionEye);
 
 float calcDirectionalLight(vec3 n, vec3 l);
-float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight);
 mat4 getObjectSkinnedTransform();
 vec3 atmosAmbient(vec3 light);
 vec3 atmosAffectDirectionalLight(float lightIntensity);
@@ -22,12 +21,37 @@ varying vec3 vary_ambient;
 varying vec3 vary_directional;
 varying vec3 vary_fragcoord;
 varying vec3 vary_position;
-varying vec3 vary_light;
+varying vec3 vary_pointlight_col;
 
 uniform float near_clip;
 uniform float shadow_offset;
 uniform float shadow_bias;
 
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+	//get light vector
+	vec3 lv = lp.xyz-v;
+	
+	//get distance
+	float d = length(lv);
+	
+	//normalize light vector
+	lv *= 1.0/d;
+	
+	//distance attenuation
+	float dist2 = d*d/(la*la);
+	float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+	// spotlight coefficient.
+	float spot = max(dot(-ln, lv), is_pointlight);
+	da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+	//angular attenuation
+	da *= calcDirectionalLight(n, lv);
+
+	return da;	
+}
+
 void main()
 {
 	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
@@ -55,21 +79,21 @@ void main()
 	//vec4 color = calcLighting(pos.xyz, norm, gl_Color, vec4(0.));
 	vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
 
-	// Collect normal lights (need to be divided by two, as we later multiply by 2)
-	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
-	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
-	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
-	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
-	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
-	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
-	col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
-	col.rgb = scaleDownLight(col.rgb);
+	// Collect normal lights
+	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
 	
+	vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+	col.rgb = vec3(0,0,0);
+
 	// Add windlight lights
-	col.rgb += atmosAmbient(vec3(0.));
-	
-	vary_light = gl_LightSource[0].position.xyz;
-	
+	col.rgb = atmosAmbient(vec3(0.));
+		
 	vary_ambient = col.rgb*gl_Color.rgb;
 	vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
 	
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
index ea09d5bb095abcea0b7461fb3ddace91d2b53def..86f014df35f903b93b8eb89b37bcc63cd70f5020 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl
@@ -21,7 +21,6 @@ varying vec3 vary_ambient;
 varying vec3 vary_directional;
 varying vec3 vary_fragcoord;
 varying vec3 vary_position;
-varying vec3 vary_light;
 varying vec3 vary_pointlight_col;
 
 uniform float near_clip;
@@ -86,8 +85,6 @@ void main()
 	// Add windlight lights
 	col.rgb = atmosAmbient(vec3(0.));
 	
-	vary_light = gl_LightSource[0].position.xyz;
-	
 	vary_ambient = col.rgb*gl_Color.rgb;
 	vary_directional.rgb = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
 	
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl
deleted file mode 100644
index 4671a54078d5f42f5205f290feaec88d4ceaeb2c..0000000000000000000000000000000000000000
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaF.glsl
+++ /dev/null
@@ -1,100 +0,0 @@
-/** 
- * @file avatarAlphaF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * $/LicenseInfo$
- */
- 
-#version 120
-
-#extension GL_ARB_texture_rectangle : enable
-
-uniform sampler2D diffuseMap;
-uniform sampler2DRectShadow shadowMap0;
-uniform sampler2DRectShadow shadowMap1;
-uniform sampler2DRectShadow shadowMap2;
-uniform sampler2DRectShadow shadowMap3;
-uniform sampler2D noiseMap;
-
-uniform mat4 shadow_matrix[6];
-uniform vec4 shadow_clip;
-uniform vec2 screen_res;
-uniform vec2 shadow_res;
-
-vec3 atmosLighting(vec3 light);
-vec3 scaleSoftClip(vec3 light);
-
-varying vec3 vary_ambient;
-varying vec3 vary_directional;
-varying vec3 vary_position;
-varying vec3 vary_normal;
-
-uniform float shadow_bias;
-
-float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
-{
-	stc.xyz /= stc.w;
-	stc.z += shadow_bias;
-	
-	float cs = shadow2DRect(shadowMap, stc.xyz).x;
-	float shadow = cs;
-
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs);
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs);
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs);
-	shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs);
-			
-	return shadow/5.0;
-}
-
-void main() 
-{
-	float shadow = 1.0;
-	vec4 pos = vec4(vary_position, 1.0);
-	vec3 norm = normalize(vary_normal);
-	
-	//vec3 nz = texture2D(noiseMap, gl_FragCoord.xy/128.0).xyz;
-
-	vec4 spos = pos;
-	
-	if (spos.z > -shadow_clip.w)
-	{	
-		vec4 lpos;
-		
-		if (spos.z < -shadow_clip.z)
-		{
-			lpos = shadow_matrix[3]*spos;
-			lpos.xy *= shadow_res;
-			shadow = pcfShadow(shadowMap3, lpos, 1.5);
-			shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
-		}
-		else if (spos.z < -shadow_clip.y)
-		{
-			lpos = shadow_matrix[2]*spos;
-			lpos.xy *= shadow_res;
-			shadow = pcfShadow(shadowMap2, lpos, 1.5);
-		}
-		else if (spos.z < -shadow_clip.x)
-		{
-			lpos = shadow_matrix[1]*spos;
-			lpos.xy *= shadow_res;
-			shadow = pcfShadow(shadowMap1, lpos, 1.5);
-		}
-		else
-		{
-			lpos = shadow_matrix[0]*spos;
-			lpos.xy *= shadow_res;
-			shadow = pcfShadow(shadowMap0, lpos, 1.5);
-		}
-	}
-	
-	
-	vec4 col = vec4(vary_ambient + vary_directional*shadow, gl_Color.a);	
-	vec4 color = texture2D(diffuseMap, gl_TexCoord[0].xy) * col;
-	
-	color.rgb = atmosLighting(color.rgb);
-
-	color.rgb = scaleSoftClip(color.rgb);
-
-	gl_FragColor = color;
-}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
index 30954a86777c78ab833e64a1119e98fac8a8532d..495e86c8db084f43eace6d130f07536a127fde9a 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl
@@ -22,13 +22,38 @@ vec3 scaleUpLight(vec3 light);
 varying vec3 vary_position;
 varying vec3 vary_ambient;
 varying vec3 vary_directional;
-varying vec3 vary_normal;
 varying vec3 vary_fragcoord;
+varying vec3 vary_pointlight_col;
 
 uniform float near_clip;
 uniform float shadow_offset;
 uniform float shadow_bias;
 
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)
+{
+	//get light vector
+	vec3 lv = lp.xyz-v;
+	
+	//get distance
+	float d = length(lv);
+	
+	//normalize light vector
+	lv *= 1.0/d;
+	
+	//distance attenuation
+	float dist2 = d*d/(la*la);
+	float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
+
+	// spotlight coefficient.
+	float spot = max(dot(-ln, lv), is_pointlight);
+	da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+	//angular attenuation
+	da *= calcDirectionalLight(n, lv);
+
+	return da;	
+}
+
 void main()
 {
 	gl_TexCoord[0] = gl_MultiTexCoord0;
@@ -51,7 +76,6 @@ void main()
 	
 	float dp_directional_light = max(0.0, dot(norm, gl_LightSource[0].position.xyz));
 	vary_position = pos.xyz + gl_LightSource[0].position.xyz * (1.0-dp_directional_light)*shadow_offset;
-	vary_normal = norm;	
 	
 	calcAtmospherics(pos.xyz);
 
@@ -59,18 +83,20 @@ void main()
 
 	vec4 col = vec4(0.0, 0.0, 0.0, gl_Color.a);
 
-	// Collect normal lights (need to be divided by two, as we later multiply by 2)
-	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].specular.a);
-	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].specular.a);
-	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].specular.a);
-	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].specular.a);
-	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].specular.a);
-	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].specular.a);
-	col.rgb += gl_LightSource[1].diffuse.rgb*calcDirectionalLight(norm, gl_LightSource[1].position.xyz);
-	col.rgb = scaleDownLight(col.rgb);
+	// Collect normal lights
+	col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
+	col.rgb += gl_LightSource[3].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[3].position, gl_LightSource[3].spotDirection.xyz, gl_LightSource[3].linearAttenuation, gl_LightSource[3].quadraticAttenuation ,gl_LightSource[3].specular.a);
+	col.rgb += gl_LightSource[4].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[4].position, gl_LightSource[4].spotDirection.xyz, gl_LightSource[4].linearAttenuation, gl_LightSource[4].quadraticAttenuation, gl_LightSource[4].specular.a);
+	col.rgb += gl_LightSource[5].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[5].position, gl_LightSource[5].spotDirection.xyz, gl_LightSource[5].linearAttenuation, gl_LightSource[5].quadraticAttenuation, gl_LightSource[5].specular.a);
+	col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
+	col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
 	
+	vary_pointlight_col = col.rgb*gl_Color.rgb;
+
+	col.rgb = vec3(0,0,0);
+
 	// Add windlight lights
-	col.rgb += atmosAmbient(vec3(0.));
+	col.rgb = atmosAmbient(vec3(0.));
 	
 	vary_ambient = col.rgb*gl_Color.rgb;
 	vary_directional = gl_Color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-gl_Color.a)*(1.0-gl_Color.a)));
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
index 26bc83e0d49f8d9096bf46e8324fef1abe1b806a..4369b3b34ff8da6af4aabcf4b57e58b02024dd2b 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl
@@ -19,9 +19,6 @@ uniform sampler2DRectShadow shadowMap2;
 uniform sampler2DRectShadow shadowMap3;
 uniform sampler2DShadow shadowMap4;
 uniform sampler2DShadow shadowMap5;
-uniform sampler2D noiseMap;
-
-uniform sampler2D		lightFunc;
 
 
 // Inputs
diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
index 08b16d787fdf70b6a8c40e9427ae5fe598c66f66..847b36b1ace5722cf0a4cdec723bc75b2549c177 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl
@@ -21,8 +21,6 @@ uniform sampler2DShadow shadowMap4;
 uniform sampler2DShadow shadowMap5;
 uniform sampler2D noiseMap;
 
-uniform sampler2D		lightFunc;
-
 // Inputs
 uniform mat4 shadow_matrix[6];
 uniform vec4 shadow_clip;
diff --git a/indra/newview/app_settings/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml
index 3d588cf57d0d01cfd94994614bb6949a771831ca..71459e5470a6dddecbcaba616db74b87aebd2340 100644
--- a/indra/newview/app_settings/ultra_graphics.xml
+++ b/indra/newview/app_settings/ultra_graphics.xml
@@ -4,15 +4,15 @@
 	<RenderAvatarCloth value="TRUE"/>
 	<!--Default for now-->
 	<RenderAvatarLODFactor value="1.0"/>
-  <!--Default for now-->
-  <RenderAvatarPhysicsLODFactor value="1.0"/>
+	<!--Default for now-->
+	<RenderAvatarPhysicsLODFactor value="1.0"/>
 	<!--NO SHADERS-->
 	<RenderAvatarVP value="TRUE"/>
 	<!--Short Range-->
 	<RenderFarClip value="256"/>
 	<!--Default for now-->
 	<RenderFlexTimeFactor value="1"/>
-	<!--256... but they don't use this-->
+	<!--256... but they do not use this-->
 	<RenderGlowResolutionPow value="9"/>
 	<!--Low number-->
 	<RenderMaxPartCount value="4096"/>
@@ -34,11 +34,10 @@
 	<VertexShaderEnable value="TRUE"/>
 	<!--NO SHADERS-->
 	<WindLightUseAtmosShaders value="TRUE"/>
-  <!--Deferred Shading-->
-  <RenderDeferred value="TRUE"/>
-  <!--SSAO Enabled-->
-  <RenderDeferredSSAO value="TRUE"/>
-  <!--Full Shadows-->
-  <RenderShadowDetail value="2"/>
-
+	<!--Deferred Shading-->
+	<RenderDeferred value="TRUE"/>
+	<!--SSAO Enabled-->
+	<RenderDeferredSSAO value="TRUE"/>
+	<!--Full Shadows-->
+	<RenderShadowDetail value="2"/>
 </settings>
diff --git a/indra/newview/app_settings/windlight/postprocesseffects.xml b/indra/newview/app_settings/windlight/postprocesseffects.xml
index 4645215a471665f4ec9050066e7ac0dcdb19e30a..60fbfd348326bc75501b4aeb2d1bc9550dc0a3a4 100644
--- a/indra/newview/app_settings/windlight/postprocesseffects.xml
+++ b/indra/newview/app_settings/windlight/postprocesseffects.xml
@@ -1,2 +1 @@
 <llsd><map><key>Asi Weird</key><map><key>bloom_strength</key><real>4.5799999237060547</real><key>bloom_width</key><real>12.539999961853027</real><key>brightness</key><real>0.89999997615814209</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>0.22999998927116394</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.47999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NegativeSaturation</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><integer>1</integer><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>-1</real></map><key>NightVision</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><integer>1</integer><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>WGhost</key><map><key>bloom_strength</key><real>2.0399999618530273</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><integer>1</integer><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.22999998927116394</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map><key>default</key><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd>
-><map><key>bloom_strength</key><real>1.5</real><key>bloom_width</key><real>2.25</real><key>brightness</key><real>1</real><key>brightness_multiplier</key><real>3</real><key>contrast</key><real>1</real><key>contrast_base</key><array><real>1</real><real>1</real><real>1</real><real>0.5</real></array><key>enable_bloom</key><boolean>0</boolean><key>enable_color_filter</key><boolean>0</boolean><key>enable_night_vision</key><boolean>0</boolean><key>extract_high</key><real>1</real><key>extract_low</key><real>0.94999999999999996</real><key>noise_size</key><real>25</real><key>noise_strength</key><real>0.40000000000000002</real><key>saturation</key><real>1</real></map></map></llsd>
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index ce15c4b8f7e98cf6ad20ceaa6a7784da48274520..5d6b10c0470970367c0ea1b319ba4bf26217da07 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -11903,7 +11903,7 @@ render_pass="bump">
      edit_group="physics_breasts_updown"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -11956,7 +11956,7 @@ render_pass="bump">
      edit_group="physics_breasts_inout"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12044,7 +12044,7 @@ render_pass="bump">
      edit_group="physics_belly_updown"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12130,7 +12130,7 @@ render_pass="bump">
      edit_group="physics_butt_updown"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12179,7 +12179,7 @@ render_pass="bump">
      edit_group="physics_butt_leftright"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
@@ -12229,7 +12229,7 @@ render_pass="bump">
      edit_group="physics_breasts_leftright"
      value_default="0"
      value_min="0"
-     value_max="1">
+     value_max="3">
 	 <param_driver />
     </param>
     <param
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index e86663b748fb1b7e4313e51c288d1b45da7adecc..058bdcc7308bf9a35709c3304afb724491a06852 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -59,7 +59,6 @@ Disregard96DefaultDrawDistance	1	1
 RenderTextureMemoryMultiple		1	1.0
 SkyUseClassicClouds			1	1
 RenderShaderLightingMaxLevel		1	3
-RenderDeferred				1	0
 RenderDeferred				1	1
 RenderDeferredSSAO			1	1
 RenderShadowDetail			1	2
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index e715054c54e6a02568dbeb1abaf1f0b2750f6961..e2b979d9e9c235e84bc3e14694e2a86c2eb5748f 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 22
+version 23
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -24,11 +24,11 @@ version 22
 //
 list all
 RenderAnisotropic				1	0
-RenderAvatarCloth				0	0
+RenderAvatarCloth				1	1
 RenderAvatarLODFactor			1	1.0
 RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxVisible          1   12
-RenderAvatarVP					1	0
+RenderAvatarVP					1	1
 RenderCubeMap					1	1
 RenderDelayVBUpdate				1	0
 RenderFarClip					1	256
@@ -41,7 +41,7 @@ RenderLocalLights				1	1
 RenderMaxPartCount				1	8192
 RenderNightBrightness			1	1.0
 RenderObjectBump				1	1
-RenderReflectionDetail			1	3
+RenderReflectionDetail			1	4
 RenderTerrainDetail				1	1
 RenderTerrainLODFactor			1	2.0
 RenderTransparentWater			1	1
@@ -49,19 +49,21 @@ RenderTreeLODFactor				1	1.0
 RenderUseImpostors				1	1
 RenderVBOEnable					1	1
 RenderVolumeLODFactor			1	2.0
-RenderWaterReflections			1	1
+UseStartScreen				1	1
 UseOcclusion					1	1
 VertexShaderEnable				1	1
 WindLightUseAtmosShaders		1	1
 WLSkyDetail						1	128
-RenderUseCleverUI				1	1
 Disregard128DefaultDrawDistance	1	1
 Disregard96DefaultDrawDistance	1	1
 RenderTextureMemoryMultiple		1	0.5
-Disregard128DefaultDrawDistance	1	1
-Disregard96DefaultDrawDistance	1	1
+RenderShaderLightingMaxLevel	1	3
 SkyUseClassicClouds			1	1
+RenderDeferred				1	1
+RenderDeferredSSAO			1	1
+RenderShadowDetail			1	2
 WatchdogDisabled				1	1
+RenderUseStreamVBO			1	1
 
 //
 // Low Graphics Settings
@@ -86,11 +88,13 @@ RenderTransparentWater		1	0
 RenderTreeLODFactor			1	0
 RenderUseImpostors			1	1
 RenderVolumeLODFactor		1	0.5
-RenderWaterReflections		1	0
 VertexShaderEnable			1	0
 WindLightUseAtmosShaders	1	0
 WLSkyDetail					1	48
 SkyUseClassicClouds			1	0
+RenderDeferred				1	0
+RenderDeferredSSAO			1	0
+RenderShadowDetail			1	0
 
 //
 // Mid Graphics Settings
@@ -114,10 +118,12 @@ RenderTransparentWater		1	1
 RenderTreeLODFactor			1	0.5
 RenderUseImpostors			1	1
 RenderVolumeLODFactor		1	1.125
-RenderWaterReflections		1	0
 VertexShaderEnable			1	1
 WindLightUseAtmosShaders	1	0
 WLSkyDetail					1	48
+RenderDeferred				1	0
+RenderDeferredSSAO			1	0
+RenderShadowDetail			1	0
 
 //
 // High Graphics Settings (purty)
@@ -141,10 +147,12 @@ RenderTransparentWater		1	1
 RenderTreeLODFactor			1	0.5
 RenderUseImpostors			1	1
 RenderVolumeLODFactor		1	1.125
-RenderWaterReflections		1	0
 VertexShaderEnable			1	1
 WindLightUseAtmosShaders	1	1
 WLSkyDetail					1	48
+RenderDeferred				1	0
+RenderDeferredSSAO			1	0
+RenderShadowDetail			1	2
 
 //
 // Ultra graphics (REALLY PURTY!)
@@ -161,17 +169,19 @@ RenderGlowResolutionPow		1	9
 RenderLocalLights			1	1
 RenderMaxPartCount			1	8192
 RenderObjectBump			1	1
-RenderReflectionDetail		1	3
+RenderReflectionDetail		1	4
 RenderTerrainDetail			1	1
 RenderTerrainLODFactor		1	2.0
 RenderTransparentWater		1	1
 RenderTreeLODFactor			1	1.0
 RenderUseImpostors			1	1
 RenderVolumeLODFactor		1	2.0
-RenderWaterReflections		1	1
 VertexShaderEnable			1	1
 WindLightUseAtmosShaders	1	1
 WLSkyDetail					1	128
+RenderDeferred				1	0
+RenderDeferredSSAO			1	0
+RenderShadowDetail			1	2
 
 //
 // Class Unknown Hardware (unknown)
@@ -209,9 +219,12 @@ RenderVBOEnable				1	1
 list NoPixelShaders
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-RenderWaterReflections		0	0
+RenderReflectionDetail		0	0
 VertexShaderEnable			0	0
 WindLightUseAtmosShaders	0	0
+RenderDeferred				0	0
+RenderDeferredSSAO			0	0
+RenderShadowDetail			0	0
 
 //
 // No Vertex Shaders available
@@ -219,10 +232,14 @@ WindLightUseAtmosShaders	0	0
 list NoVertexShaders
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-RenderWaterReflections		0	0
+RenderReflectionDetail		0	0
 VertexShaderEnable			0	0
 WindLightUseAtmosShaders	0	0
+RenderDeferred				0	0
+RenderDeferredSSAO			0	0
+RenderShadowDetail			0	0
 
+//
 // "Default" setups for safe, low, medium, high
 //
 list safe
@@ -235,8 +252,11 @@ RenderMaxPartCount			1	1024
 RenderTerrainDetail 		1	0
 RenderUseImpostors			0	0
 RenderVBOEnable				1	0
-RenderWaterReflections		0	0
+RenderReflectionDetail		0	0
 WindLightUseAtmosShaders	0	0
+RenderDeferred				0	0
+RenderDeferredSSAO			0	0
+RenderShadowDetail			0	0
 
 //
 // CPU based feature masks
@@ -258,6 +278,12 @@ RenderObjectBump			0	0
 list OpenGLPre15
 RenderVBOEnable				1	0
 
+list TexUnit8orLess
+RenderDeferredSSAO			0	0
+
+list ATI
+RenderDeferredSSAO			0	0
+
 list Intel
 RenderAnisotropic			1	0
 RenderLocalLights			1	0
diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt
index 08fb67a0c87e0c048ca1bb888a1d335cfdf322e4..3339172a1a3d49ead0f4562b06c10af0974e05b6 100644
--- a/indra/newview/featuretable_xp.txt
+++ b/indra/newview/featuretable_xp.txt
@@ -152,7 +152,7 @@ WindLightUseAtmosShaders	1	1
 WLSkyDetail					1	48
 RenderDeferred				1	0
 RenderDeferredSSAO			1	0
-RenderShadowDetail			1	0
+RenderShadowDetail			1	2
 
 //
 // Ultra graphics (REALLY PURTY!)
@@ -181,7 +181,7 @@ WindLightUseAtmosShaders	1	1
 WLSkyDetail					1	128
 RenderDeferred				1	0
 RenderDeferredSSAO			1	0
-RenderShadowDetail			1	0
+RenderShadowDetail			1	2
 
 //
 // Class Unknown Hardware (unknown)
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 66b3b97f005441c7d9dd30ec6dc92e8efc4013fc..6ed4e3b7f7d9afabd182d15291ddcd60383ce0a3 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -1,10 +1,20 @@
-// 
+//
 // Categorizes graphics chips into various classes by name
 //
-// The table contains chip names regular expressions to match
+// The table contains regular expressions to match
 // against driver strings, a class number, and whether we claim
 // to support them or not.
 //
+// If you modify this table, use the (perl) gpu_table_tester
+// to compare the results of recognizing known cards (it is easy
+// to mess this up by putting things in the wrong order):
+//
+// perl ../../scripts/gpu_table_tester -g gpu_table.txt tests/gpus_seen.txt | diff - tests/gpus_results.txt
+//
+// Format:
+//   Fields are separated by one or more tab (not space) characters
+//   <recognizer name>	<regular expression>	<class>		<supported>
+//
 // Class Numbers:
 //		0 - Defaults to low graphics settings.  No shaders on by default
 //		1 - Defaults to mid graphics settings.  Basic shaders on by default
@@ -15,336 +25,495 @@
 //		0 - We claim to not support this card.
 //		1 - We claim to support this card.
 //
-// Format:
-//   <chip name>	<regexp>	<class>		<supported>
-//	
 
-3Dfx							.*3Dfx.*							0		0
-3Dlabs							.*3Dlabs.*							0		0
-ATI 3D-Analyze					.*ATI.*3D-Analyze.*					0		0
-ATI All-in-Wonder 7500			.*ATI.*All-in-Wonder 75.*			0		1
-ATI All-in-Wonder 8500			.*ATI.*All-in-Wonder 85.*			0		1
-ATI All-in-Wonder 9200			.*ATI.*All-in-Wonder 92.*			0		1
-ATI All-in-Wonder 9xxx			.*ATI.*All-in-Wonder 9.*			1		1
-ATI All-in-Wonder HD			.*ATI.*All-in-Wonder HD.*			1		1
-ATI All-in-Wonder X600			.*ATI.*All-in-Wonder X6.*			1		1
-ATI All-in-Wonder X800			.*ATI.*All-in-Wonder X8.*			2		1
-ATI All-in-Wonder X1800			.*ATI.*All-in-Wonder X18.*			3		1
-ATI All-in-Wonder X1900			.*ATI.*All-in-Wonder X19.*			3		1
-ATI All-in-Wonder PCI-E			.*ATI.*All-in-Wonder.*PCI-E.*		1		1
-ATI All-in-Wonder Radeon 		.*ATI.*All-in-Wonder Radeon.*		0		1
-ATI ASUS A9xxx					.*ATI.*ASUS.*A9.*					1		1
-ATI ASUS AH24xx					.*ATI.*ASUS.*AH24.*					1		1
-ATI ASUS AH26xx					.*ATI.*ASUS.*AH26.*					3		1
-ATI ASUS AH34xx					.*ATI.*ASUS.*AH34.*					1		1
-ATI ASUS AH36xx					.*ATI.*ASUS.*AH36.*					3		1
-ATI ASUS AH46xx					.*ATI.*ASUS.*AH46.*					3		1
-ATI ASUS AX3xx					.*ATI.*ASUS.*AX3.*					1		1
-ATI ASUS AX5xx					.*ATI.*ASUS.*AX5.*					1		1
-ATI ASUS AX8xx					.*ATI.*ASUS.*AX8.* 					2		1
-ATI ASUS EAH24xx				.*ATI.*ASUS.*EAH24.*				2		1
-ATI ASUS EAH26xx				.*ATI.*ASUS.*EAH26.*				3		1
-ATI ASUS EAH34xx				.*ATI.*ASUS.*EAH34.*				1		1
-ATI ASUS EAH36xx				.*ATI.*ASUS.*EAH36.*				3		1
-ATI ASUS EAH38xx				.*ATI.*ASUS.*EAH38.*				3		1
-ATI ASUS EAH43xx				.*ATI.*ASUS.*EAH43.*				1		1
-ATI ASUS EAH45xx				.*ATI.*ASUS.*EAH45.*				1		1
-ATI ASUS EAH48xx				.*ATI.*ASUS.*EAH48.*				3		1
-ATI ASUS EAH57xx				.*ATI.*ASUS.*EAH57.*				3		1
-ATI ASUS EAH58xx				.*ATI.*ASUS.*EAH58.*				3		1
-ATI Radeon X1xxx				.*ATI.*ASUS.*X1.*					3		1
-ATI Radeon X7xx					.*ATI.*ASUS.*X7.*					1		1
-ATI Radeon X500					.*ATI.*Diamond X5.*					1		1
-ATI Radeon X13xx				.*ATI.*Diamond X13.*				1		1
-ATI Radeon X16xx				.*ATI.*Diamond X16.*				1		1
-ATI Radeon X19xx				.*ATI.*Diamond X19.*				1		1
-ATI Display Adapter				.*ATI.*display adapter.*			0		1
-ATI FireGL 5200					.*ATI.*FireGL V52.*					0		1
-ATI FireGL 5xxx					.*ATI.*FireGL V5.*					1		1
-ATI FireGL						.*ATI.*Fire.*GL.*					0		1
-ATI FireMV						.*ATI.*FireMV.*						0		0
-ATI Generic						.*ATI.*Generic.*					0		0
-ATI Hercules 9800				.*ATI.*Hercules.*9800.*				1		1
-ATI IGP 340M					.*ATI.*IGP.*340M.*					0		0
-ATI M52							.*ATI.*M52.*						1		1
-ATI M54							.*ATI.*M54.*						1		1
-ATI M56							.*ATI.*M56.*						1		1
-ATI M71							.*ATI.*M71.*						1		1
-ATI M72							.*ATI.*M72.*						1		1
-ATI M76							.*ATI.*M76.*						3		1
-ATI Mobility Radeon 4100		.*ATI.*Mobility *41.*				0		1
-ATI Mobility Radeon 7xxx		.*ATI.*Mobility *Radeon 7.*			0		1
-ATI Mobility Radeon 8xxx		.*ATI.*Mobility *Radeon 8.*			0		1
-ATI Mobility Radeon 9800		.*ATI.*Mobility *98.*				0		1
-ATI Mobility Radeon 9700		.*ATI.*Mobility *97.*				0		1
-ATI Mobility Radeon 9600		.*ATI.*Mobility *96.*				0		1
-ATI Mobility Radeon HD 2300		.*ATI.*Mobility *HD *23.*			1		1
-ATI Mobility Radeon HD 2400		.*ATI.*Mobility *HD *24.*			1		1
-ATI Mobility Radeon HD 2600		.*ATI.*Mobility *HD *26.*			3		1
-ATI Mobility Radeon HD 3400		.*ATI.*Mobility *HD *34.*			1		1
-ATI Mobility Radeon HD 3600		.*ATI.*Mobility *HD *36.*			3		1
-ATI Mobility Radeon HD 3800		.*ATI.*Mobility *HD *38.*			3		1
-ATI Mobility Radeon HD 5400		.*ATI.*Mobility *HD *54.*			1		1
-ATI Mobility Radeon HD 5500		.*ATI.*Mobility *HD *55.*			1		1
-ATI Mobility Radeon X1xxx		.*ATI.*Mobility *X1.*				0		1
-ATI Mobility Radeon X2xxx		.*ATI.*Mobility *X2.*				0		1
-ATI Mobility Radeon X3xx		.*ATI.*Mobility *X3.*				1		1
-ATI Mobility Radeon X6xx		.*ATI.*Mobility *X6.*				1		1
-ATI Mobility Radeon X7xx		.*ATI.*Mobility *X7.*				1		1
-ATI Mobility Radeon Xxxx		.*ATI.*Mobility *X.*				0		1
-ATI Radeon HD 2300				.*ATI.*Radeon HD *23.*				0		1
-ATI Radeon HD 2400				.*ATI.*Radeon HD *24.*				1		1
-ATI Radeon HD 2600				.*ATI.*Radeon HD *26.*				2		1
-ATI Radeon HD 2900				.*ATI.*Radeon HD *29.*				3		1
-ATI Radeon HD 3200				.*ATI.*Radeon *HD *32.*				0		1
-ATI Radeon HD 3300				.*ATI.*Radeon HD *33.*				1		1
-ATI Radeon HD 3400				.*ATI.*Radeon HD *34.*				1		1
-ATI Radeon HD 3600				.*ATI.*Radeon HD *36.*				3		1
-ATI Radeon HD 3800				.*ATI.*Radeon HD *38.*				3		1
-ATI Radeon HD 4200				.*ATI.*Radeon HD *42.*				1		1
-ATI Radeon HD 4300				.*ATI.*Radeon HD *43.*				1		1
-ATI Radeon HD 4500				.*ATI.*Radeon HD *45.*				3		1
-ATI Radeon HD 4600				.*ATI.*Radeon HD *46.*				3		1
-ATI Radeon HD 4700				.*ATI.*Radeon HD *47.*				3		1
-ATI Radeon HD 4800				.*ATI.*Radeon.*HD *48.*				3		1
-ATI Radeon HD 5400				.*ATI.*Radeon.*HD *54.*				3		1
-ATI Radeon HD 5500				.*ATI.*Radeon.*HD *55.*				3		1
-ATI Radeon HD 5600				.*ATI.*Radeon.*HD *56.*				3		1
-ATI Radeon HD 5700				.*ATI.*Radeon.*HD *57.*				3		1
-ATI Radeon HD 5800				.*ATI.*Radeon.*HD *58.*				3		1
-ATI Radeon HD 5900				.*ATI.*Radeon.*HD *59.*				3		1
-ATI Radeon OpenGL				.*ATI.*Radeon OpenGL.* 				0		0
-ATI Radeon 2100					.*ATI.*Radeon 21.*					0		1
-ATI Radeon 3000					.*ATI.*Radeon 30.*					0		1
-ATI Radeon 3100					.*ATI.*Radeon 31.*					0		1
-ATI Radeon 7xxx					.*ATI.*Radeon 7.*					0		1
-ATI Radeon 8xxx					.*ATI.*Radeon 8.*					0		1
-ATI Radeon 9000					.*ATI.*Radeon 90.*					0		1
-ATI Radeon 9100					.*ATI.*Radeon 91.*					0		1
-ATI Radeon 9200					.*ATI.*Radeon 92.*					0		1
-ATI Radeon 9500					.*ATI.*Radeon 95.*					0		1
-ATI Radeon 9600					.*ATI.*Radeon 96.*					0		1
-ATI Radeon 9700					.*ATI.*Radeon 97.*					1		1
-ATI Radeon 9800					.*ATI.*Radeon 98.*					1		1
-ATI Radeon RV250				.*ATI.*RV250.*						0		1
-ATI Radeon RV600				.*ATI.*RV6.*						1		1
-ATI Radeon RX700				.*ATI.*RX70.*						1		1
-ATI Radeon RX800				.*ATI.*Radeon *RX80.*				2		1
-ATI Radeon RX9550				.*ATI.*RX9550.*						1		1
-ATI Radeon VE					.*ATI.*Radeon.*VE.*					0		0
-ATI Radeon X1000				.*ATI.*Radeon *X10.*				0		1
-ATI Radeon X1200				.*ATI.*Radeon *X12.*				0		1
-ATI Radeon X1300				.*ATI.*Radeon *X13.*				1		1
-ATI Radeon X1400				.*ATI.*Radeon *X14.*				1		1
-ATI Radeon X1500				.*ATI.*Radeon *X15.*				1		1
-ATI Radeon X1600				.*ATI.*Radeon *X16.*				1		1
-ATI Radeon X1700				.*ATI.*Radeon *X17.*				1		1
-ATI Radeon X1800				.*ATI.*Radeon *X18.*				3		1
-ATI Radeon X1900				.*ATI.*Radeon *X19.*				3		1
-ATI Radeon X300					.*ATI.*Radeon *X3.*					0		1
-ATI Radeon X400					.*ATI.*Radeon X4.*					0		1
-ATI Radeon X500					.*ATI.*Radeon X5.*					0		1
-ATI Radeon X600					.*ATI.*Radeon X6.*					1		1
-ATI Radeon X700					.*ATI.*Radeon X7.*					1		1
-ATI Radeon X800					.*ATI.*Radeon X8.*					2		1
-ATI Radeon X900					.*ATI.*Radeon X9.*					2		1
-ATI Radeon Xpress				.*ATI.*Radeon Xpress.*				0		0
-ATI Rage 128					.*ATI.*Rage 128.*					0		1
-ATI RV250						.*ATI.*RV250.*						0		1
-ATI RV380						.*ATI.*RV380.*						0		1
-ATI RV530						.*ATI.*RV530.*						1		1
-ATI RX700						.*ATI.*RX700.*						1		1
-Intel X3100						.*Intel.*X3100.*					0		1
-Intel 830M						.*Intel.*830M						0		0
-Intel 845G						.*Intel.*845G						0		0
-Intel 855GM						.*Intel.*855GM						0		0
-Intel 865G						.*Intel.*865G						0		0
-Intel 900						.*Intel.*900.*900					0		0
-Intel 915GM						.*Intel.*915GM						0		0
-Intel 915G						.*Intel.*915G						0		0
-Intel 945GM						.*Intel.*945GM.*					0		1
-Intel 945G						.*Intel.*945G.*						0		1
-Intel 950						.*Intel.*950.*						0		1
-Intel 965						.*Intel.*965.*						0		1
-Intel G33						.*Intel.*G33.*						0		0
-Intel G41						.*Intel.*G41.*						0		1
-Intel G45						.*Intel.*G45.*						0		1
-Intel Bear Lake					.*Intel.*Bear Lake.*				0		0
-Intel Broadwater 				.*Intel.*Broadwater.*				0		0
-Intel Brookdale					.*Intel.*Brookdale.*				0		0
-Intel Cantiga					.*Intel.*Cantiga.*					0		0
-Intel Eaglelake					.*Intel.*Eaglelake.*				0		1
-Intel Graphics Media HD			.*Intel(R) Graphics Media.*HD.*		0		1
-Intel HD Graphics				.*Intel(R) HD Graphics.*			0		1
-Intel Mobile 4 Series			.*Intel.*Mobile.*4 Series.*			0		1
-Intel Media Graphics HD			.*Intel Media Graphics HD.*			0		1
-Intel Montara					.*Intel.*Montara.*					0		0
-Intel Pineview					.*Intel.*Pineview.*					0		1
-Intel Springdale				.*Intel.*Springdale.*				0		0
-Matrox							.*Matrox.*							0		0
-Mesa							.*Mesa.*							0		0
-NVIDIA 310M						.*NVIDIA.*GeForce 310M.*			0		1
-NVIDIA 310						.*NVIDIA.*GeForce 310.*				0		1
-NVIDIA 320M						.*NVIDIA.*GeForce 320M.*			0		1
-NVIDIA G100M					.*NVIDIA.*GeForce G *100M.*			0		1
-NVIDIA G102M					.*NVIDIA.*GeForce G *102M.*			0		1
-NVIDIA G103M					.*NVIDIA.*GeForce G *103M.*			0		1
-NVIDIA G105M					.*NVIDIA.*GeForce G *105M.*			0		1
-NVIDIA G210M					.*NVIDIA.*GeForce G210M.*			0		1
-NVIDIA GT 120					.*NVIDIA.*GeForce GT 12.*			1		1
-NVIDIA GT 130					.*NVIDIA.*GeForce GT 13.*			1		1
-NVIDIA GT 220					.*NVIDIA.*GeForce GT 22.*			1		1
-NVIDIA GT 230					.*NVIDIA.*GeForce GT 23.*			1		1
-NVIDIA GT 240					.*NVIDIA.*GeForce GT 24.*			1		1
-NVIDIA GT 320					.*NVIDIA.*GeForce GT 32.*			0		1
-NVIDIA GT 330M					.*NVIDIA.*GeForce GT 330M.*			1		1
-NVIDIA GTS 240					.*NVIDIA.*GeForce GTS 24.*			1		1
-NVIDIA GTS 250					.*NVIDIA.*GeForce GTS 25.*			3		1
-NVIDIA GTS 360M					.*NVIDIA.*GeForce GTS 360M.*		3		1
-NVIDIA GTX 260					.*NVIDIA.*GeForce GTX 26.*			3		1
-NVIDIA GTX 270					.*NVIDIA.*GeForce GTX 27.*			3		1
-NVIDIA GTX 280					.*NVIDIA.*GeForce GTX 28.*			3		1
-NVIDIA GTX 290					.*NVIDIA.*GeForce GTX 29.*			3		1
-NVIDIA GTX 470					.*NVIDIA.*GeForce GTX 47.*			3		1
-NVIDIA GTX 480					.*NVIDIA.*GeForce GTX 48.*			3		1
-NVIDIA GTX 580					.*NVIDIA.*GeForce GTX 58.*			3		1
-NVIDIA C51						.*NVIDIA.*C51.*						0		1
-NVIDIA G72						.*NVIDIA.*G72.*						1		1
-NVIDIA G73						.*NVIDIA.*G73.*						1		1
-NVIDIA G84						.*NVIDIA.*G84.*						3		1
-NVIDIA G86						.*NVIDIA.*G86.*						3		1
-NVIDIA G92						.*NVIDIA.*G92.*						3		1
-NVIDIA GeForce					.*GeForce 256.*						0		0
-NVIDIA GeForce 2				.*GeForce2.*						0		1
-NVIDIA GeForce 3				.*GeForce3.*						0		1
-NVIDIA GeForce 4 Go				.*NVIDIA.*GeForce4.*Go.*			0		1
-NVIDIA GeForce 4 MX				.*NVIDIA.*GeForce4 MX.*				0		1
-NVIDIA GeForce 4 Ti				.*NVIDIA.*GeForce4 Ti.*				0		1
-NVIDIA GeForce 6100				.*NVIDIA.*GeForce 61.*				0		1
-NVIDIA GeForce 6200				.*NVIDIA.*GeForce 62.*				0		1
-NVIDIA GeForce 6500				.*NVIDIA.*GeForce 65.*				0		1
-NVIDIA GeForce 6600				.*NVIDIA.*GeForce 66.*				1		1
-NVIDIA GeForce 6700				.*NVIDIA.*GeForce 67.*				2		1
-NVIDIA GeForce 6800				.*NVIDIA.*GeForce 68.*				2		1
-NVIDIA GeForce 7000				.*NVIDIA.*GeForce 70.*				0		1
-NVIDIA GeForce 7100				.*NVIDIA.*GeForce 71.*				0		1
-NVIDIA GeForce 7200				.*NVIDIA.*GeForce 72.*				1		1
-NVIDIA GeForce 7300				.*NVIDIA.*GeForce 73.*				1		1
-NVIDIA GeForce 7500				.*NVIDIA.*GeForce 75.*				1		1
-NVIDIA GeForce 7600				.*NVIDIA.*GeForce 76.*				1		1
-NVIDIA GeForce 7800				.*NVIDIA.*GeForce 78.*				1		1
-NVIDIA GeForce 7900				.*NVIDIA.*GeForce 79.*				1		1
-NVIDIA GeForce 8100				.*NVIDIA.*GeForce 81.*				1		1
-NVIDIA GeForce 8200				.*NVIDIA.*GeForce 82.*				1		1
-NVIDIA GeForce 8300				.*NVIDIA.*GeForce 83.*				1		1
-NVIDIA GeForce 8400				.*NVIDIA.*GeForce 84.*				1		1
-NVIDIA GeForce 8500				.*GeForce 85.*						1		1
-NVIDIA GeForce 8600M			.*NVIDIA.*GeForce.*8600M.*			1		1
-NVIDIA GeForce 8600				.*NVIDIA.*GeForce 86.*				3		1
-NVIDIA GeForce 8700				.*NVIDIA.*GeForce 87.*				3		1
-NVIDIA GeForce 8800				.*NVIDIA.*GeForce 88.*				3		1
-NVIDIA GeForce 9100				.*NVIDIA.*GeForce 9100.*			0		1
-NVIDIA GeForce 9200				.*NVIDIA.*GeForce 9200.*			0		1
-NVIDIA GeForce 9300M			.*NVIDIA.*GeForce 9300M.*			1		1
-NVIDIA GeForce 9400M			.*NVIDIA.*GeForce 9400M.*			1		1
-NVIDIA GeForce 9500M			.*NVIDIA.*GeForce 9500M.*			2		1
-NVIDIA GeForce 9600M			.*NVIDIA.*GeForce 9600M.*			3		1
-NVIDIA GeForce 9700M			.*NVIDIA.*GeForce 9700M.*			3		1
-NVIDIA GeForce 9300				.*NVIDIA.*GeForce 93.*				1		1
-NVIDIA GeForce 9400				.*GeForce 94.*						1		1
-NVIDIA GeForce 9500				.*NVIDIA.*GeForce 95.*				2		1
-NVIDIA GeForce 9600				.*NVIDIA.*GeForce.*96.*				3		1
-NVIDIA GeForce 9800				.*NVIDIA.*GeForce.*98.*				3		1
-NVIDIA GeForce FX 5100			.*NVIDIA.*GeForce FX 51.*			0		1
-NVIDIA GeForce FX 5200			.*NVIDIA.*GeForce FX 52.*			0		1
-NVIDIA GeForce FX 5500			.*NVIDIA.*GeForce FX 55.*			0		1
-NVIDIA GeForce FX 5600			.*NVIDIA.*GeForce FX 56.*			0		1
-NVIDIA GeForce FX 5700			.*NVIDIA.*GeForce FX 57.*			1		1
-NVIDIA GeForce FX 5800			.*NVIDIA.*GeForce FX 58.*			1		1
-NVIDIA GeForce FX 5900			.*NVIDIA.*GeForce FX 59.*			1		1
-NVIDIA GeForce FX Go5100		.*NVIDIA.*GeForce FX Go51.*			0		1
-NVIDIA GeForce FX Go5200		.*NVIDIA.*GeForce FX Go52.*			0		1
-NVIDIA GeForce FX Go5300		.*NVIDIA.*GeForce FX Go53.*			0		1
-NVIDIA GeForce FX Go5500		.*NVIDIA.*GeForce FX Go55.*			0		1
-NVIDIA GeForce FX Go5600		.*NVIDIA.*GeForce FX Go56.*			0		1
-NVIDIA GeForce FX Go5700		.*NVIDIA.*GeForce FX Go57.*			1		1
-NVIDIA GeForce FX Go5800		.*NVIDIA.*GeForce FX Go58.*			1		1
-NVIDIA GeForce FX Go5900		.*NVIDIA.*GeForce FX Go59.*			1		1
-NVIDIA GeForce Go 6100			.*NVIDIA.*GeForce Go 61.*			0		1
-NVIDIA GeForce Go 6200			.*NVIDIA.*GeForce Go 62.*			0		1
-NVIDIA GeForce Go 6500			.*NVIDIA.*GeForce Go 65.*			1		1
-NVIDIA GeForce Go 6600			.*NVIDIA.*GeForce Go 66.*			1		1
-NVIDIA GeForce Go 6700			.*NVIDIA.*GeForce Go 67.*			1		1
-NVIDIA GeForce Go 6800			.*NVIDIA.*GeForce Go 68.*			1		1
-NVIDIA GeForce Go 7200			.*NVIDIA.*GeForce Go 72.*			1		1
-NVIDIA GeForce Go 7300			.*NVIDIA.*GeForce Go 73.*			1		1
-NVIDIA GeForce Go 7300 LE		.*NVIDIA.*GeForce Go 73.*LE.*		0		1
-NVIDIA GeForce Go 7400			.*NVIDIA.*GeForce Go 74.*			1		1
-NVIDIA GeForce Go 7600			.*NVIDIA.*GeForce Go 76.*			2		1
-NVIDIA GeForce Go 7700			.*NVIDIA.*GeForce Go 77.*			2		1
-NVIDIA GeForce Go 7800			.*NVIDIA.*GeForce Go 78.*			2		1
-NVIDIA GeForce Go 7900			.*NVIDIA.*GeForce Go 79.*			2		1
-NVIDIA D9M						.*D9M.*								1		1
-NVIDIA G84						.*G84.*								1		1
-NVIDIA G92						.*G92.*								3		1
-NVIDIA G94						.*G94.*								3		1
-NVIDIA GeForce Go 6				.*GeForce Go 6.*					1		1
-NVIDIA ION						.*NVIDIA ION.*						1		1
-NVIDIA NB9M						.*GeForce NB9M.*					1		1
-NVIDIA NB9P						.*GeForce NB9P.*					1		1
-NVIDIA GeForce PCX				.*GeForce PCX.*						0		1
-NVIDIA Generic					.*NVIDIA.*Unknown.*					0		0
-NVIDIA NV17						.*GeForce NV17.*					0		1
-NVIDIA NV34						.*NVIDIA.*NV34.*					0		1
-NVIDIA NV35						.*NVIDIA.*NV35.*					0		1
-NVIDIA NV36						.*GeForce NV36.*					1		1
-NVIDIA NV43						.*NVIDIA.*NV43.*					1		1
-NVIDIA NV44						.*NVIDIA.*NV44.*					1		1
-NVIDIA nForce					.*NVIDIA.*nForce.*					0		0
-NVIDIA MCP78					.*NVIDIA.*MCP78.*					1		1
-NVIDIA Quadro2					.*Quadro2.*				0		1
-NVIDIA Quadro4					.*Quadro4.*				0		1
-NVIDIA Quadro DCC				.*Quadro DCC.*				0		1
-NVIDIA Quadro FX 1400				.*Quadro.*FX.*1400.*			1		1
-NVIDIA Quadro FX 1500				.*Quadro.*FX.*1500.*			1		1
-NVIDIA Quadro FX 1700				.*Quadro.*FX.*1700.*			2		1
-NVIDIA Quadro FX 1800				.*Quadro.*FX.*1800.*			2		1
-NVIDIA Quadro FX 3400				.*Quadro.*FX.*3400.*			1		1
-NVIDIA Quadro FX 3450				.*Quadro.*FX.*3450.*			1		1
-NVIDIA Quadro FX 3500				.*Quadro.*FX.*3500.*			1		1
-NVIDIA Quadro FX 3700				.*Quadro.*FX.*3700.*			2		1
-NVIDIA Quadro FX 3800				.*Quadro.*FX.*3800.*			2		1
-NVIDIA Quadro FX 370				.*Quadro.*FX.*370.*			2		1
-NVIDIA Quadro FX 380				.*Quadro.*FX.*380.*			2		1
-NVIDIA Quadro FX 4000				.*Quadro.*FX.*4000.*			1		1
-NVIDIA Quadro FX 4500				.*Quadro.*FX.*4500.*			1		1
-NVIDIA Quadro FX 4600				.*Quadro.*FX.*4600.*			2		1
-NVIDIA Quadro FX 4700				.*Quadro.*FX.*4700.*			2		1
-NVIDIA Quadro FX 4800				.*Quadro.*FX.*4800.*			2		1
-NVIDIA Quadro FX 470				.*Quadro.*FX.*470.*			2		1
-NVIDIA Quadro FX 5500				.*Quadro.*FX.*5500.*			1		1
-NVIDIA Quadro FX 5600				.*Quadro.*FX.*5600.*			2		1
-NVIDIA Quadro FX 5700				.*Quadro.*FX.*5700.*			2		1
-NVIDIA Quadro FX 5800				.*Quadro.*FX.*5800.*			2		1
-NVIDIA Quadro FX 540				.*Quadro.*FX.*540.*			1		1
-NVIDIA Quadro FX 550				.*Quadro.*FX.*550.*			1		1
-NVIDIA Quadro FX 560				.*Quadro.*FX.*560.*			1		1
-NVIDIA Quadro FX 570				.*Quadro.*FX.*570.*			2		1
-NVIDIA Quadro FX 580				.*Quadro.*FX.*580.*			2		1
-NVIDIA Quadro FX				.*Quadro FX.*				0		1
-NVIDIA Quadro VX 200				.*Quadro VX.*200.*			2		1
-NVIDIA Quadro 2000				.*Quadro.*2000.*			2		1
-NVIDIA Quadro 4000				.*Quadro.*4000.*			2		1
-NVIDIA Quadro 5000				.*Quadro.*5000.*			2		1
-NVIDIA Quadro 6000				.*Quadro.*6000.*			2		1
-NVIDIA Quadro 600				.*Quadro.*600.*				2		1
-NVIDIA Quadro NVS				.*Quadro NVS.*				0		1
-NVIDIA RIVA TNT					.*RIVA TNT.*						0		0
-S3								.*S3 Graphics.*						0		0
-SiS								SiS.*								0		0
-Trident							Trident.*							0		0
-Tungsten Graphics				Tungsten.*							0		0
-XGI								XGI.*								0		0
-VIA								VIA.*								0		0
-Apple Generic					Apple.*Generic.*					0		0
-Apple Software Renderer			Apple.*Software Renderer.*			0		0
+3Dfx							.*3Dfx.*									0		0
+3Dlabs							.*3Dlabs.*									0		0
+ATI 3D-Analyze					.*ATI.*3D-Analyze.*							0		0
+ATI All-in-Wonder 7500			.*ATI.*All-in-Wonder 75.*					0		1
+ATI All-in-Wonder 8500			.*ATI.*All-in-Wonder 85.*					0		1
+ATI All-in-Wonder 9200			.*ATI.*All-in-Wonder 92.*					0		1
+ATI All-in-Wonder 9xxx			.*ATI.*All-in-Wonder 9.*					1		1
+ATI All-in-Wonder HD			.*ATI.*All-in-Wonder HD.*					1		1
+ATI All-in-Wonder X600			.*ATI.*All-in-Wonder X6.*					1		1
+ATI All-in-Wonder X800			.*ATI.*All-in-Wonder X8.*					2		1
+ATI All-in-Wonder X1800			.*ATI.*All-in-Wonder X18.*					3		1
+ATI All-in-Wonder X1900			.*ATI.*All-in-Wonder X19.*					3		1
+ATI All-in-Wonder PCI-E			.*ATI.*All-in-Wonder.*PCI-E.*				1		1
+ATI All-in-Wonder Radeon 		.*ATI.*All-in-Wonder Radeon.*				0		1
+ATI ASUS A9xxx					.*ATI.*ASUS.*A9.*							1		1
+ATI ASUS AH24xx					.*ATI.*ASUS.*AH24.*							1		1
+ATI ASUS AH26xx					.*ATI.*ASUS.*AH26.*							3		1
+ATI ASUS AH34xx					.*ATI.*ASUS.*AH34.*							1		1
+ATI ASUS AH36xx					.*ATI.*ASUS.*AH36.*							3		1
+ATI ASUS AH46xx					.*ATI.*ASUS.*AH46.*							3		1
+ATI ASUS AX3xx					.*ATI.*ASUS.*AX3.*							1		1
+ATI ASUS AX5xx					.*ATI.*ASUS.*AX5.*							1		1
+ATI ASUS AX8xx					.*ATI.*ASUS.*AX8.*							2		1
+ATI ASUS EAH24xx				.*ATI.*ASUS.*EAH24.*						2		1
+ATI ASUS EAH26xx				.*ATI.*ASUS.*EAH26.*						3		1
+ATI ASUS EAH34xx				.*ATI.*ASUS.*EAH34.*						1		1
+ATI ASUS EAH36xx				.*ATI.*ASUS.*EAH36.*						3		1
+ATI ASUS EAH38xx				.*ATI.*ASUS.*EAH38.*						3		1
+ATI ASUS EAH43xx				.*ATI.*ASUS.*EAH43.*						1		1
+ATI ASUS EAH45xx				.*ATI.*ASUS.*EAH45.*						1		1
+ATI ASUS EAH48xx				.*ATI.*ASUS.*EAH48.*						3		1
+ATI ASUS EAH57xx				.*ATI.*ASUS.*EAH57.*						3		1
+ATI ASUS EAH58xx				.*ATI.*ASUS.*EAH58.*						3		1
+ATI ASUS Radeon X1xxx			.*ATI.*ASUS.*X1.*							3		1
+ATI Radeon X7xx					.*ATI.*ASUS.*X7.*							1		1
+ATI Radeon X1xxx				.*ATI.*X1.*									0		1
+ATI Radeon X13xx				.*ATI.*Diamond X13.*						1		1
+ATI Radeon X16xx				.*ATI.*Diamond X16.*						1		1
+ATI Radeon X19xx				.*ATI.*Diamond X19.*						1		1
+ATI Display Adapter				.*ATI.*display adapter.*					0		1
+ATI FireGL 5200					.*ATI.*FireGL V52.*							0		1
+ATI FireGL 5xxx					.*ATI.*FireGL V5.*							1		1
+ATI FireGL						.*ATI.*Fire.*GL.*							0		1
+ATI FirePro M3900				.*ATI.*FirePro.*M39.*						2		1
+ATI FirePro M5800				.*ATI.*FirePro.*M58.*						3		1
+ATI FirePro M7740				.*ATI.*FirePro.*M77.*						3		1
+ATI FirePro M7820				.*ATI.*FirePro.*M78.*						3		1
+ATI FireMV						.*ATI.*FireMV.*								0		1
+ATI Geforce 9500 GT				.*ATI.*Geforce 9500 *GT						2		1
+ATI Geforce 9800 GT				.*ATI.*Geforce 9800 *GT						2		1
+ATI Generic						.*ATI.*Generic.*							0		0
+ATI Hercules 9800				.*ATI.*Hercules.*9800.*						1		1
+ATI IGP 340M					.*ATI.*IGP.*340M.*							0		0
+ATI M52							.*ATI.*M52.*								1		1
+ATI M54							.*ATI.*M54.*								1		1
+ATI M56							.*ATI.*M56.*								1		1
+ATI M71							.*ATI.*M71.*								1		1
+ATI M72							.*ATI.*M72.*								1		1
+ATI M76							.*ATI.*M76.*								3		1
+ATI Mobility Radeon 4100		.*ATI.*(Mobility|MOBILITY).*41.*			0		1
+ATI Mobility Radeon 7xxx		.*ATI.*(Mobility|MOBILITY).*Radeon 7.*		0		1
+ATI Mobility Radeon 8xxx		.*ATI.*(Mobility|MOBILITY).*Radeon 8.*		0		1
+ATI Mobility Radeon 9800		.*ATI.*(Mobility|MOBILITY).*98.*			1		1
+ATI Mobility Radeon 9700		.*ATI.*(Mobility|MOBILITY).*97.*			1		1
+ATI Mobility Radeon 9600		.*ATI.*(Mobility|MOBILITY).*96.*			0		1
+ATI Mobility Radeon HD 530v		.*ATI.*(Mobility|MOBILITY).*HD *530v.*		1		1
+ATI Mobility Radeon HD 540v		.*ATI.*(Mobility|MOBILITY).*HD *540v.*		2		1
+ATI Mobility Radeon HD 545v		.*ATI.*(Mobility|MOBILITY).*HD *545v.*		2		1
+ATI Mobility Radeon HD 550v		.*ATI.*(Mobility|MOBILITY).*HD *550v.*		2		1
+ATI Mobility Radeon HD 560v		.*ATI.*(Mobility|MOBILITY).*HD *560v.*		2		1
+ATI Mobility Radeon HD 565v		.*ATI.*(Mobility|MOBILITY).*HD *565v.*		2		1
+ATI Mobility Radeon HD 2300		.*ATI.*(Mobility|MOBILITY).*HD *23.*		1		1
+ATI Mobility Radeon HD 2400		.*ATI.*(Mobility|MOBILITY).*HD *24.*		1		1
+ATI Mobility Radeon HD 2600		.*ATI.*(Mobility|MOBILITY).*HD *26.*		3		1
+ATI Mobility Radeon HD 2700		.*ATI.*(Mobility|MOBILITY).*HD *27.*		3		1
+ATI Mobility Radeon HD 3100		.*ATI.*(Mobility|MOBILITY).*HD *31.*		0		1
+ATI Mobility Radeon HD 3200		.*ATI.*(Mobility|MOBILITY).*HD *32.*		0		1
+ATI Mobility Radeon HD 3400		.*ATI.*(Mobility|MOBILITY).*HD *34.*		2		1
+ATI Mobility Radeon HD 3600		.*ATI.*(Mobility|MOBILITY).*HD *36.*		3		1
+ATI Mobility Radeon HD 3800		.*ATI.*(Mobility|MOBILITY).*HD *38.*		3		1
+ATI Mobility Radeon HD 4200		.*ATI.*(Mobility|MOBILITY).*HD *42.*		2		1
+ATI Mobility Radeon HD 4300		.*ATI.*(Mobility|MOBILITY).*HD *43.*		2		1
+ATI Mobility Radeon HD 4500		.*ATI.*(Mobility|MOBILITY).*HD *45.*		3		1
+ATI Mobility Radeon HD 4600		.*ATI.*(Mobility|MOBILITY).*HD *46.*		3		1
+ATI Mobility Radeon HD 4800		.*ATI.*(Mobility|MOBILITY).*HD *48.*		3		1
+ATI Mobility Radeon HD 5100		.*ATI.*(Mobility|MOBILITY).*HD *51.*		2		1
+ATI Mobility Radeon HD 5300		.*ATI.*(Mobility|MOBILITY).*HD *53.*		2		1
+ATI Mobility Radeon HD 5400		.*ATI.*(Mobility|MOBILITY).*HD *54.*		2		1
+ATI Mobility Radeon HD 5500		.*ATI.*(Mobility|MOBILITY).*HD *55.*		2		1
+ATI Mobility Radeon HD 5600		.*ATI.*(Mobility|MOBILITY).*HD *56.*		2		1
+ATI Mobility Radeon HD 5700		.*ATI.*(Mobility|MOBILITY).*HD *57.*		3		1
+ATI Mobility Radeon HD 6200		.*ATI.*(Mobility|MOBILITY).*HD *62.*		2		1
+ATI Mobility Radeon HD 6300		.*ATI.*(Mobility|MOBILITY).*HD *63.*		2		1
+ATI Mobility Radeon HD 6400M	.*ATI.*(Mobility|MOBILITY).*HD *64.*		3		1
+ATI Mobility Radeon HD 6500M	.*ATI.*(Mobility|MOBILITY).*HD *65.*		3		1
+ATI Mobility Radeon HD 6600M	.*ATI.*(Mobility|MOBILITY).*HD *66.*		3		1
+ATI Mobility Radeon HD 6700M	.*ATI.*(Mobility|MOBILITY).*HD *67.*		3		1
+ATI Mobility Radeon HD 6800M	.*ATI.*(Mobility|MOBILITY).*HD *68.*		3		1
+ATI Mobility Radeon HD 6900M	.*ATI.*(Mobility|MOBILITY).*HD *69.*		3		1
+ATI Mobility Radeon X1xxx		.*ATI.*(Mobility|MOBILITY).*X1.*			0		1
+ATI Mobility Radeon X2xxx		.*ATI.*(Mobility|MOBILITY).*X2.*			0		1
+ATI Mobility Radeon X3xx		.*ATI.*(Mobility|MOBILITY).*X3.*			1		1
+ATI Mobility Radeon X6xx		.*ATI.*(Mobility|MOBILITY).*X6.*			1		1
+ATI Mobility Radeon X7xx		.*ATI.*(Mobility|MOBILITY).*X7.*			1		1
+ATI Mobility Radeon Xxxx		.*ATI.*(Mobility|MOBILITY).*X.*				0		1
+ATI Mobility Radeon				.*ATI.*(Mobility|MOBILITY).*				0		1
+ATI Radeon HD 2300				.*ATI.*(Radeon|RADEON) HD *23.*				0		1
+ATI Radeon HD 2400				.*ATI.*(Radeon|RADEON) HD *24.*				1		1
+ATI Radeon HD 2600				.*ATI.*(Radeon|RADEON) HD *26.*				2		1
+ATI Radeon HD 2900				.*ATI.*(Radeon|RADEON) HD *29.*				3		1
+ATI Radeon HD 3000				.*ATI.*(Radeon|RADEON) HD *30.*				0		1
+ATI Radeon HD 3100				.*ATI.*(Radeon|RADEON) HD *31.*				1		1
+ATI Radeon HD 3200				.*ATI.*(Radeon|RADEON) HD *32.*				0		1
+ATI Radeon HD 3300				.*ATI.*(Radeon|RADEON) HD *33.*				1		1
+ATI Radeon HD 3400				.*ATI.*(Radeon|RADEON) HD *34.*				1		1
+ATI Radeon HD 3500				.*ATI.*(Radeon|RADEON) HD *35.*				1		1
+ATI Radeon HD 3600				.*ATI.*(Radeon|RADEON) HD *36.*				3		1
+ATI Radeon HD 3700				.*ATI.*(Radeon|RADEON) HD *37.*				3		1
+ATI Radeon HD 3800				.*ATI.*(Radeon|RADEON) HD *38.*				3		1
+ATI Radeon HD 4200				.*ATI.*(Radeon|RADEON) HD *42.*				1		1
+ATI Radeon HD 4300				.*ATI.*(Radeon|RADEON) HD *43.*				1		1
+ATI Radeon HD 4400				.*ATI.*(Radeon|RADEON) HD *44.*				1		1
+ATI Radeon HD 4500				.*ATI.*(Radeon|RADEON) HD *45.*				3		1
+ATI Radeon HD 4600				.*ATI.*(Radeon|RADEON) HD *46.*				3		1
+ATI Radeon HD 4700				.*ATI.*(Radeon|RADEON) HD *47.*				3		1
+ATI Radeon HD 4800				.*ATI.*(Radeon|RADEON) HD *48.*				3		1
+ATI Radeon HD 5400				.*ATI.*(Radeon|RADEON) HD *54.*				3		1
+ATI Radeon HD 5500				.*ATI.*(Radeon|RADEON) HD *55.*				3		1
+ATI Radeon HD 5600				.*ATI.*(Radeon|RADEON) HD *56.*				3		1
+ATI Radeon HD 5700				.*ATI.*(Radeon|RADEON) HD *57.*				3		1
+ATI Radeon HD 5800				.*ATI.*(Radeon|RADEON) HD *58.*				3		1
+ATI Radeon HD 5900				.*ATI.*(Radeon|RADEON) HD *59.*				3		1
+ATI Radeon HD 6200				.*ATI.*(Radeon|RADEON) HD *62.*				2		1
+ATI Radeon HD 6300				.*ATI.*(Radeon|RADEON) HD *63.*				2		1
+ATI Radeon HD 6400				.*ATI.*(Radeon|RADEON) HD *64.*				3		1
+ATI Radeon HD 6500				.*ATI.*(Radeon|RADEON) HD *65.*				3		1
+ATI Radeon HD 66xx				.*ATI.*(Radeon|RADEON) HD *66.*				3		1
+ATI Radeon HD 6700				.*ATI.*(Radeon|RADEON) HD *67.*				3		1
+ATI Radeon HD 6800				.*ATI.*(Radeon|RADEON) HD *68.*				3		1
+ATI Radeon HD 6900				.*ATI.*(Radeon|RADEON) HD *69.*				3		1
+ATI Radeon OpenGL				.*ATI.*(Radeon|RADEON) OpenGL.* 			0		0
+ATI Radeon 2100					.*ATI.*(Radeon|RADEON) 21.*					0		1
+ATI Radeon 3000					.*ATI.*(Radeon|RADEON) 30.*					0		1
+ATI Radeon 3100					.*ATI.*(Radeon|RADEON) 31.*					1		1
+ATI Radeon 5xxx					.*ATI.*(Radeon|RADEON) 5.*					3		1
+ATI Radeon 7xxx					.*ATI.*(Radeon|RADEON) 7.*					0		1
+ATI Radeon 8xxx					.*ATI.*(Radeon|RADEON) 8.*					0		1
+ATI Radeon 9000					.*ATI.*(Radeon|RADEON) 90.*					0		1
+ATI Radeon 9100					.*ATI.*(Radeon|RADEON) 91.*					0		1
+ATI Radeon 9200					.*ATI.*(Radeon|RADEON) 92.*					0		1
+ATI Radeon 9500					.*ATI.*(Radeon|RADEON) 95.*					0		1
+ATI Radeon 9600					.*ATI.*(Radeon|RADEON) 96.*					0		1
+ATI Radeon 9700					.*ATI.*(Radeon|RADEON) 97.*					1		1
+ATI Radeon 9800					.*ATI.*(Radeon|RADEON) 98.*					1		1
+ATI Radeon RV250				.*ATI.*RV250.*								0		1
+ATI Radeon RV600				.*ATI.*RV6.*								1		1
+ATI Radeon RX700				.*ATI.*RX70.*								1		1
+ATI Radeon RX800				.*ATI.*(Radeon|RADEON) *RX80.*				2		1
+ATI RS880M						.*ATI.*RS880M								1		1
+ATI Radeon RX9550				.*ATI.*RX9550.*								1		1
+ATI Radeon VE					.*ATI.*(Radeon|RADEON).*VE.*				0		0
+ATI Radeon X1000				.*ATI.*(Radeon|RADEON) *X10.*				0		1
+ATI Radeon X1200				.*ATI.*(Radeon|RADEON) *X12.*				0		1
+ATI Radeon X1300				.*ATI.*(Radeon|RADEON) *X13.*				1		1
+ATI Radeon X1400				.*ATI.*(Radeon|RADEON) *X14.*				1		1
+ATI Radeon X1500				.*ATI.*(Radeon|RADEON) *X15.*				1		1
+ATI Radeon X1600				.*ATI.*(Radeon|RADEON) *X16.*				1		1
+ATI Radeon X1700				.*ATI.*(Radeon|RADEON) *X17.*				1		1
+ATI Radeon X1800				.*ATI.*(Radeon|RADEON) *X18.*				3		1
+ATI Radeon X1900				.*ATI.*(Radeon|RADEON) *X19.*				3		1
+ATI Radeon X300					.*ATI.*(Radeon|RADEON) *X3.*				0		1
+ATI Radeon X400					.*ATI.*(Radeon|RADEON) X4.*					0		1
+ATI Radeon X500					.*ATI.*(Radeon|RADEON) X5.*					0		1
+ATI Radeon X600					.*ATI.*(Radeon|RADEON) X6.*					1		1
+ATI Radeon X700					.*ATI.*(Radeon|RADEON) X7.*					1		1
+ATI Radeon X800					.*ATI.*(Radeon|RADEON) X8.*					2		1
+ATI Radeon X900					.*ATI.*(Radeon|RADEON) X9.*					2		1
+ATI Radeon Xpress				.*ATI.*(Radeon|RADEON) (Xpress|XPRESS).*	0		1
+ATI Rage 128					.*ATI.*Rage 128.*							0		1
+ATI R350 (9800)					.*(ATI)?.*R350.*							1		1
+ATI R580 (X1900)				.*(ATI)?.*R580.*							3		1
+ATI RC410 (Xpress 200)			.*(ATI)?.*RC410.*							0		0
+ATI RS48x (Xpress 200x)			.*(ATI)?.*RS48.*							0		0
+ATI RS600 (Xpress 3200)			.*(ATI)?.*RS600.*							0		0
+ATI RV350 (9600)				.*(ATI)?.*RV350.*							0		1
+ATI RV370 (X300)				.*(ATI)?.*RV370.*							0		1
+ATI RV410 (X700)				.*(ATI)?.*RV410.*							1		1
+ATI RV515						.*(ATI)?.*RV515.*							1		1
+ATI RV570 (X1900 GT/PRO)		.*(ATI)?.*RV570.*							3		1
+ATI RV380						.*(ATI)?.*RV380.*							0		1
+ATI RV530						.*(ATI)?.*RV530.*							1		1
+ATI RX480 (Xpress 200P)			.*(ATI)?.*RX480.*							0		1
+ATI RX700						.*(ATI)?.*RX700.*							1		1
+AMD ANTILLES (HD 6990)			.*(AMD|ATI).*(Antilles|ANTILLES).*			3		1
+AMD BARTS (HD 6800)				.*(AMD|ATI).*(Barts|BARTS).*				3		1
+AMD CAICOS (HD 6400)			.*(AMD|ATI).*(Caicos|CAICOS).*				3		1
+AMD CAYMAN (HD 6900)			.*(AMD|ATI).*(Cayman|CAYMAM).*				3		1
+AMD CEDAR (HD 5450)				.*(AMD|ATI).*(Cedar|CEDAR).*				2		1
+AMD CYPRESS (HD 5800)			.*(AMD|ATI).*(Cypress|CYPRESS).*			3		1
+AMD HEMLOCK (HD 5970)			.*(AMD|ATI).*(Hemlock|HEMLOCK).*			3		1
+AMD JUNIPER (HD 5700)			.*(AMD|ATI).*(Juniper|JUNIPER).*			3		1
+AMD PARK						.*(AMD|ATI).*(Park|PARK).*					3		1
+AMD REDWOOD (HD 5500/5600)		.*(AMD|ATI).*(Redwood|REDWOOD).*			3		1
+AMD TURKS (HD 6500/6600)		.*(AMD|ATI).*(Turks|TURKS).*				3		1
+AMD RS780 (HD 3200)				.*(AMD|ATI)?.*RS780.*						0		1
+AMD RS880 (HD 4200)				.*(AMD|ATI)?.*RS880.*						1		1
+AMD RV610 (HD 2400)				.*(AMD|ATI)?.*RV610.*						1		1
+AMD RV620 (HD 3400)				.*(AMD|ATI)?.*RV620.*						1		1
+AMD RV630 (HD 2600)				.*(AMD|ATI)?.*RV630.*						2		1
+AMD RV635 (HD 3600)				.*(AMD|ATI)?.*RV635.*						3		1
+AMD RV670 (HD 3800)				.*(AMD|ATI)?.*RV670.*						3		1
+AMD R680 (HD 3870 X2)			.*(AMD|ATI)?.*R680.*						3		1
+AMD R700 (HD 4800 X2)			.*(AMD|ATI)?.*R700.*						3		1
+AMD RV710 (HD 4300)				.*(AMD|ATI)?.*RV710.*						1		1
+AMD RV730 (HD 4600)				.*(AMD|ATI)?.*RV730.*						3		1
+AMD RV740 (HD 4700)				.*(AMD|ATI)?.*RV740.*						3		1
+AMD RV770 (HD 4800)				.*(AMD|ATI)?.*RV770.*						3		1
+AMD RV790 (HD 4800)				.*(AMD|ATI)?.*RV790.*						3		1
+ATI 760G/Radeon 3000			.*ATI.*AMD 760G.*							1		1
+ATI 780L/Radeon 3000			.*ATI.*AMD 780L.*							1		1
+ATI Radeon DDR					.*ATI.*(Radeon|RADEON) ?DDR.*				0		1
+ATI FirePro 2000				.*ATI.*FirePro 2.*							1		1
+ATI FirePro 3000				.*ATI.*FirePro V3.*							1		1
+ATI FirePro 4000				.*ATI.*FirePro V4.*							2		1
+ATI FirePro 5000				.*ATI.*FirePro V5.*							3		1
+ATI FirePro 7000				.*ATI.*FirePro V7.*							3		1
+ATI FirePro M					.*ATI.*FirePro M.*							3		1
+ATI Technologies				.*ATI *Technologies.*						0		1
+// This entry is last to work around the "R300" driver problem.
+ATI R300 (9700)					.*(ATI)?.*R300.*							1		1
+ATI Radeon 						.*ATI.*Radeon.*								0		1
+Intel X3100						.*Intel.*X3100.*							0		1
+Intel 830M						.*Intel.*830M								0		0
+Intel 845G						.*Intel.*845G								0		0
+Intel 855GM						.*Intel.*855GM								0		0
+Intel 865G						.*Intel.*865G								0		0
+Intel 900						.*Intel.*900.*900							0		0
+Intel 915GM						.*Intel.*915GM								0		0
+Intel 915G						.*Intel.*915G								0		0
+Intel 945GM						.*Intel.*945GM.*							0		1
+Intel 945G						.*Intel.*945G.*								0		1
+Intel 950						.*Intel.*950.*								0		1
+Intel 965						.*Intel.*965.*								0		1
+Intel G33						.*Intel.*G33.*								0		0
+Intel G41						.*Intel.*G41.*								0		1
+Intel G45						.*Intel.*G45.*								0		1
+Intel Bear Lake					.*Intel.*Bear Lake.*						0		0
+Intel Broadwater 				.*Intel.*Broadwater.*						0		0
+Intel Brookdale					.*Intel.*Brookdale.*						0		0
+Intel Cantiga					.*Intel.*Cantiga.*							0		0
+Intel Eaglelake					.*Intel.*Eaglelake.*						0		1
+Intel Graphics Media HD			.*Intel.*Graphics Media.*HD.*				0		1
+Intel HD Graphics				.*Intel.*HD Graphics.*						2		1
+Intel Mobile 4 Series			.*Intel.*Mobile *4 Series.*					0		1
+Intel Media Graphics HD			.*Intel.*Media Graphics HD.*				0		1
+Intel Montara					.*Intel.*Montara.*							0		0
+Intel Pineview					.*Intel.*Pineview.*							0		1
+Intel Springdale				.*Intel.*Springdale.*						0		0
+Intel HD Graphics 2000			.*Intel.*HD2000.*							1		1
+Intel HD Graphics 3000			.*Intel.*HD3000.*							2		1
+Matrox							.*Matrox.*									0		0
+Mesa							.*Mesa.*									0		0
+NVIDIA 205						.*NVIDIA.*GeForce 205.*						2		1
+NVIDIA 210						.*NVIDIA.*GeForce 210.*						2		1
+NVIDIA 310M						.*NVIDIA.*GeForce 310M.*					1		1
+NVIDIA 310						.*NVIDIA.*GeForce 310.*						3		1
+NVIDIA 315M						.*NVIDIA.*GeForce 315M.*					2		1
+NVIDIA 315						.*NVIDIA.*GeForce 315.*						3		1
+NVIDIA 320M						.*NVIDIA.*GeForce 320M.*					2		1
+NVIDIA G100M					.*NVIDIA *(GeForce)? *(G)? ?100M.*			0		1
+NVIDIA G100						.*NVIDIA *(GeForce)? *(G)? ?100.*			0		1
+NVIDIA G102M					.*NVIDIA *(GeForce)? *(G)? ?102M.*			0		1
+NVIDIA G103M					.*NVIDIA *(GeForce)? *(G)? ?103M.*			0		1
+NVIDIA G105M					.*NVIDIA *(GeForce)? *(G)? ?105M.*			0		1
+NVIDIA G 110M					.*NVIDIA *(GeForce)? *(G)? ?110M.*			0		1
+NVIDIA G 120M					.*NVIDIA *(GeForce)? *(G)? ?120M.*			1		1
+NVIDIA G 200					.*NVIDIA *(GeForce)? *(G)? ?200(M)?.*		0		1
+NVIDIA G 205M					.*NVIDIA *(GeForce)? *(G)? ?205(M)?.*		0		1
+NVIDIA G 210					.*NVIDIA *(GeForce)? *(G)? ?210(M)?.*		1		1
+NVIDIA 305M						.*NVIDIA *(GeForce)? *(G)? ?305(M)?.*		1		1
+NVIDIA G 310M					.*NVIDIA *(GeForce)? *(G)? ?310(M)?.*		2		1
+NVIDIA G 315					.*NVIDIA *(GeForce)? *(G)? ?315(M)?.*		2		1
+NVIDIA G 320M					.*NVIDIA *(GeForce)? *(G)? ?320(M)?.*		2		1
+NVIDIA G 405					.*NVIDIA *(GeForce)? *(G)? ?405(M)?.*		1		1
+NVIDIA G 410M					.*NVIDIA *(GeForce)? *(G)? ?410(M)?.*		1		1
+NVIDIA GT 120M					.*NVIDIA.*(GeForce)? *GT *120(M)?.*			2		1
+NVIDIA GT 120					.*NVIDIA.*GT.*120							2		1
+NVIDIA GT 130M					.*NVIDIA.*(GeForce)? *GT *130(M)?.*			2		1
+NVIDIA GT 140M					.*NVIDIA.*(GeForce)? *GT *140(M)?.*			2		1
+NVIDIA GT 150M					.*NVIDIA.*(GeForce)? *GT(S)? *150(M)?.*		2		1
+NVIDIA GT 160M					.*NVIDIA.*(GeForce)? *GT *160(M)?.*			2		1
+NVIDIA GT 220M					.*NVIDIA.*(GeForce)? *GT *220(M)?.*			2		1
+NVIDIA GT 230M					.*NVIDIA.*(GeForce)? *GT *230(M)?.*			2		1
+NVIDIA GT 240M					.*NVIDIA.*(GeForce)? *GT *240(M)?.*			2		1
+NVIDIA GT 250M					.*NVIDIA.*(GeForce)? *GT *250(M)?.*			2		1
+NVIDIA GT 260M					.*NVIDIA.*(GeForce)? *GT *260(M)?.*			2		1
+NVIDIA GT 320M					.*NVIDIA.*(GeForce)? *GT *320(M)?.*			2		1
+NVIDIA GT 325M					.*NVIDIA.*(GeForce)? *GT *325(M)?.*			0		1
+NVIDIA GT 330M					.*NVIDIA.*(GeForce)? *GT *330(M)?.*			3		1
+NVIDIA GT 335M					.*NVIDIA.*(GeForce)? *GT *335(M)?.*			1		1
+NVIDIA GT 340M					.*NVIDIA.*(GeForce)? *GT *340(M)?.*			2		1
+NVIDIA GT 415M					.*NVIDIA.*(GeForce)? *GT *415(M)?.*			2		1
+NVIDIA GT 420M					.*NVIDIA.*(GeForce)? *GT *420(M)?.*			2		1
+NVIDIA GT 425M					.*NVIDIA.*(GeForce)? *GT *425(M)?.*			3		1
+NVIDIA GT 430M					.*NVIDIA.*(GeForce)? *GT *430(M)?.*			3		1
+NVIDIA GT 435M					.*NVIDIA.*(GeForce)? *GT *435(M)?.*			3		1
+NVIDIA GT 440M					.*NVIDIA.*(GeForce)? *GT *440(M)?.*			3		1
+NVIDIA GT 445M					.*NVIDIA.*(GeForce)? *GT *445(M)?.*			3		1
+NVIDIA GT 450M					.*NVIDIA.*(GeForce)? *GT *450(M)?.*			3		1
+NVIDIA GT 520M					.*NVIDIA.*(GeForce)? *GT *520(M)?.*			3		1
+NVIDIA GT 525M					.*NVIDIA.*(GeForce)? *GT *525(M)?.*			3		1
+NVIDIA GT 540M					.*NVIDIA.*(GeForce)? *GT *540(M)?.*			3		1
+NVIDIA GT 550M					.*NVIDIA.*(GeForce)? *GT *550(M)?.*			3		1
+NVIDIA GT 555M					.*NVIDIA.*(GeForce)? *GT *555(M)?.*			3		1
+NVIDIA GTS 160M					.*NVIDIA.*(GeForce)? *GT(S)? *160(M)?.*		2		1
+NVIDIA GTS 240					.*NVIDIA.*(GeForce)? *GTS *24.*				3		1
+NVIDIA GTS 250					.*NVIDIA.*(GeForce)? *GTS *25.*				3		1
+NVIDIA GTS 350M					.*NVIDIA.*(GeForce)? *GTS *350M.*			3		1
+NVIDIA GTS 360M					.*NVIDIA.*(GeForce)? *GTS *360M.*			3		1
+NVIDIA GTS 360					.*NVIDIA.*(GeForce)? *GTS *360.*			3		1
+NVIDIA GTS 450					.*NVIDIA.*(GeForce)? *GTS *45.*				3		1
+NVIDIA GTX 260					.*NVIDIA.*(GeForce)? *GTX *26.*				3		1
+NVIDIA GTX 275					.*NVIDIA.*(GeForce)? *GTX *275.*			3		1
+NVIDIA GTX 270					.*NVIDIA.*(GeForce)? *GTX *27.*				3		1
+NVIDIA GTX 285					.*NVIDIA.*(GeForce)? *GTX *285.*			3		1
+NVIDIA GTX 280					.*NVIDIA.*(GeForce)? *GTX *280.*			3		1
+NVIDIA GTX 290					.*NVIDIA.*(GeForce)? *GTX *290.*			3		1
+NVIDIA GTX 295					.*NVIDIA.*(GeForce)? *GTX *295.*			3		1
+NVIDIA GTX 460M					.*NVIDIA.*(GeForce)? *GTX *460M.*			3		1
+NVIDIA GTX 465					.*NVIDIA.*(GeForce)? *GTX *465.*			3		1
+NVIDIA GTX 460					.*NVIDIA.*(GeForce)? *GTX *46.*				3		1
+NVIDIA GTX 470M					.*NVIDIA.*(GeForce)? *GTX *470M.*			3		1
+NVIDIA GTX 470					.*NVIDIA.*(GeForce)? *GTX *47.*				3		1
+NVIDIA GTX 480M					.*NVIDIA.*(GeForce)? *GTX *480M.*			3		1
+NVIDIA GTX 485M					.*NVIDIA.*(GeForce)? *GTX *485M.*			3		1
+NVIDIA GTX 480					.*NVIDIA.*(GeForce)? *GTX *48.*				3		1
+NVIDIA GTX 530					.*NVIDIA.*(GeForce)? *GTX *53.*				3		1
+NVIDIA GTX 550					.*NVIDIA.*(GeForce)? *GTX *55.*				3		1
+NVIDIA GTX 560					.*NVIDIA.*(GeForce)? *GTX *56.*				3		1
+NVIDIA GTX 570					.*NVIDIA.*(GeForce)? *GTX *57.*				3		1
+NVIDIA GTX 580M					.*NVIDIA.*(GeForce)? *GTX *580M.*			3		1
+NVIDIA GTX 580					.*NVIDIA.*(GeForce)? *GTX *58.*				3		1
+NVIDIA GTX 590					.*NVIDIA.*(GeForce)? *GTX *59.*				3		1
+NVIDIA C51						.*NVIDIA.*(GeForce)? *C51.*					0		1
+NVIDIA G72						.*NVIDIA.*(GeForce)? *G72.*					1		1
+NVIDIA G73						.*NVIDIA.*(GeForce)? *G73.*					1		1
+NVIDIA G84						.*NVIDIA.*(GeForce)? *G84.*					2		1
+NVIDIA G86						.*NVIDIA.*(GeForce)? *G86.*					3		1
+NVIDIA G92						.*NVIDIA.*(GeForce)? *G92.*					3		1
+NVIDIA GeForce					.*GeForce 256.*								0		0
+NVIDIA GeForce 2				.*GeForce ?2 ?.*							0		1
+NVIDIA GeForce 3				.*GeForce ?3 ?.*							0		1
+NVIDIA GeForce 3 Ti				.*GeForce ?3 Ti.*							0		1
+NVIDIA GeForce 4				.*NVIDIA.*GeForce ?4.*						0		1
+NVIDIA GeForce 4 Go				.*NVIDIA.*GeForce ?4.*Go.*					0		1
+NVIDIA GeForce 4 MX				.*NVIDIA.*GeForce ?4 MX.*					0		1
+NVIDIA GeForce 4 PCX			.*NVIDIA.*GeForce ?4 PCX.*					0		1
+NVIDIA GeForce 4 Ti				.*NVIDIA.*GeForce ?4 Ti.*					0		1
+NVIDIA GeForce 6100				.*NVIDIA.*GeForce 61.*						0		1
+NVIDIA GeForce 6200				.*NVIDIA.*GeForce 62.*						0		1
+NVIDIA GeForce 6500				.*NVIDIA.*GeForce 65.*						0		1
+NVIDIA GeForce 6600				.*NVIDIA.*GeForce 66.*						1		1
+NVIDIA GeForce 6700				.*NVIDIA.*GeForce 67.*						2		1
+NVIDIA GeForce 6800				.*NVIDIA.*GeForce 68.*						2		1
+NVIDIA GeForce 7000				.*NVIDIA.*GeForce 70.*						0		1
+NVIDIA GeForce 7100				.*NVIDIA.*GeForce 71.*						0		1
+NVIDIA GeForce 7200				.*NVIDIA.*GeForce 72.*						1		1
+NVIDIA GeForce 7300				.*NVIDIA.*GeForce 73.*						1		1
+NVIDIA GeForce 7500				.*NVIDIA.*GeForce 75.*						1		1
+NVIDIA GeForce 7600				.*NVIDIA.*GeForce 76.*						2		1
+NVIDIA GeForce 7800				.*NVIDIA.*GeForce 78.*						2		1
+NVIDIA GeForce 7900				.*NVIDIA.*GeForce 79.*						2		1
+NVIDIA GeForce 8100				.*NVIDIA.*GeForce 81.*						1		1
+NVIDIA GeForce 8200M			.*NVIDIA.*GeForce 8200M.*					1		1
+NVIDIA GeForce 8200				.*NVIDIA.*GeForce 82.*						1		1
+NVIDIA GeForce 8300				.*NVIDIA.*GeForce 83.*						1		1
+NVIDIA GeForce 8400M			.*NVIDIA.*GeForce 8400M.*					1		1
+NVIDIA GeForce 8400				.*NVIDIA.*GeForce 84.*						1		1
+NVIDIA GeForce 8500				.*NVIDIA.*GeForce 85.*						3		1
+NVIDIA GeForce 8600M			.*NVIDIA.*GeForce 8600M.*					1		1
+NVIDIA GeForce 8600				.*NVIDIA.*GeForce 86.*						3		1
+NVIDIA GeForce 8700M			.*NVIDIA.*GeForce 8700M.*					3		1
+NVIDIA GeForce 8700				.*NVIDIA.*GeForce 87.*						3		1
+NVIDIA GeForce 8800M			.*NVIDIA.*GeForce 8800M.*					3		1
+NVIDIA GeForce 8800				.*NVIDIA.*GeForce 88.*						3		1
+NVIDIA GeForce 9100M			.*NVIDIA.*GeForce 9100M.*					0		1
+NVIDIA GeForce 9100				.*NVIDIA.*GeForce 91.*						0		1
+NVIDIA GeForce 9200M			.*NVIDIA.*GeForce 9200M.*					1		1
+NVIDIA GeForce 9200				.*NVIDIA.*GeForce 92.*						1		1
+NVIDIA GeForce 9300M			.*NVIDIA.*GeForce 9300M.*					1		1
+NVIDIA GeForce 9300				.*NVIDIA.*GeForce 93.*						1		1
+NVIDIA GeForce 9400M			.*NVIDIA.*GeForce 9400M.*					1		1
+NVIDIA GeForce 9400				.*NVIDIA.*GeForce 94.*						1		1
+NVIDIA GeForce 9500M			.*NVIDIA.*GeForce 9500M.*					2		1
+NVIDIA GeForce 9500				.*NVIDIA.*GeForce 95.*						2		1
+NVIDIA GeForce 9600M			.*NVIDIA.*GeForce 9600M.*					3		1
+NVIDIA GeForce 9600				.*NVIDIA.*GeForce 96.*						2		1
+NVIDIA GeForce 9700M			.*NVIDIA.*GeForce 9700M.*					2		1
+NVIDIA GeForce 9800M			.*NVIDIA.*GeForce 9800M.*					3		1
+NVIDIA GeForce 9800				.*NVIDIA.*GeForce 98.*						3		1
+NVIDIA GeForce FX 5100			.*NVIDIA.*GeForce FX 51.*					0		1
+NVIDIA GeForce FX 5200			.*NVIDIA.*GeForce FX 52.*					0		1
+NVIDIA GeForce FX 5300			.*NVIDIA.*GeForce FX 53.*					0		1
+NVIDIA GeForce FX 5500			.*NVIDIA.*GeForce FX 55.*					0		1
+NVIDIA GeForce FX 5600			.*NVIDIA.*GeForce FX 56.*					0		1
+NVIDIA GeForce FX 5700			.*NVIDIA.*GeForce FX 57.*					1		1
+NVIDIA GeForce FX 5800			.*NVIDIA.*GeForce FX 58.*					1		1
+NVIDIA GeForce FX 5900			.*NVIDIA.*GeForce FX 59.*					1		1
+NVIDIA GeForce FX Go5100		.*NVIDIA.*GeForce FX Go51.*					0		1
+NVIDIA GeForce FX Go5200		.*NVIDIA.*GeForce FX Go52.*					0		1
+NVIDIA GeForce FX Go5300		.*NVIDIA.*GeForce FX Go53.*					0		1
+NVIDIA GeForce FX Go5500		.*NVIDIA.*GeForce FX Go55.*					0		1
+NVIDIA GeForce FX Go5600		.*NVIDIA.*GeForce FX Go56.*					0		1
+NVIDIA GeForce FX Go5700		.*NVIDIA.*GeForce FX Go57.*					1		1
+NVIDIA GeForce FX Go5800		.*NVIDIA.*GeForce FX Go58.*					1		1
+NVIDIA GeForce FX Go5900		.*NVIDIA.*GeForce FX Go59.*					1		1
+NVIDIA GeForce FX Go5xxx		.*NVIDIA.*GeForce FX Go.*					0		1
+NVIDIA GeForce Go 6100			.*NVIDIA.*GeForce Go 61.*					0		1
+NVIDIA GeForce Go 6200			.*NVIDIA.*GeForce Go 62.*					0		1
+NVIDIA GeForce Go 6400			.*NVIDIA.*GeForce Go 64.*					1		1
+NVIDIA GeForce Go 6500			.*NVIDIA.*GeForce Go 65.*					1		1
+NVIDIA GeForce Go 6600			.*NVIDIA.*GeForce Go 66.*					1		1
+NVIDIA GeForce Go 6700			.*NVIDIA.*GeForce Go 67.*					1		1
+NVIDIA GeForce Go 6800			.*NVIDIA.*GeForce Go 68.*					1		1
+NVIDIA GeForce Go 7200			.*NVIDIA.*GeForce Go 72.*					1		1
+NVIDIA GeForce Go 7300 LE		.*NVIDIA.*GeForce Go 73.*LE.*				0		1
+NVIDIA GeForce Go 7300			.*NVIDIA.*GeForce Go 73.*					1		1
+NVIDIA GeForce Go 7400			.*NVIDIA.*GeForce Go 74.*					1		1
+NVIDIA GeForce Go 7600			.*NVIDIA.*GeForce Go 76.*					2		1
+NVIDIA GeForce Go 7700			.*NVIDIA.*GeForce Go 77.*					2		1
+NVIDIA GeForce Go 7800			.*NVIDIA.*GeForce Go 78.*					2		1
+NVIDIA GeForce Go 7900			.*NVIDIA.*GeForce Go 79.*					2		1
+NVIDIA D9M						.*NVIDIA.*D9M.*								1		1
+NVIDIA G94						.*NVIDIA.*G94.*								3		1
+NVIDIA GeForce Go 6				.*GeForce Go 6.*							1		1
+NVIDIA ION 2					.*NVIDIA ION 2.*							2		1
+NVIDIA ION						.*NVIDIA ION.*								2		1
+NVIDIA NB9M						.*GeForce NB9M.*							1		1
+NVIDIA NB9P						.*GeForce NB9P.*							1		1
+NVIDIA GeForce PCX				.*GeForce PCX.*								0		1
+NVIDIA Generic					.*NVIDIA.*Unknown.*							0		0
+NVIDIA NV17						.*GeForce NV17.*							0		1
+NVIDIA NV34						.*NVIDIA.*NV34.*							0		1
+NVIDIA NV35						.*NVIDIA.*NV35.*							0		1
+NVIDIA NV36						.*GeForce NV36.*							1		1
+NVIDIA NV43						.*NVIDIA *NV43.*							1		1
+NVIDIA NV44						.*NVIDIA *NV44.*							1		1
+NVIDIA nForce					.*NVIDIA *nForce.*							0		0
+NVIDIA MCP78					.*NVIDIA *MCP78.*							1		1
+NVIDIA Quadro2					.*Quadro2.*									0		1
+NVIDIA Quadro 1000M				.*Quadro.*1000M.*							2		1
+NVIDIA Quadro 2000 M/D			.*Quadro.*2000(M|D)?.*						3		1
+NVIDIA Quadro 4000M				.*Quadro.*4000M.*							3		1
+NVIDIA Quadro 4000				.*Quadro *4000.*							3		1
+NVIDIA Quadro 50x0 M			.*Quadro.*50.0(M)?.*						3		1
+NVIDIA Quadro 6000				.*Quadro.*6000.*							3		1
+NVIDIA Quadro 400				.*Quadro.*400.*								2		1
+NVIDIA Quadro 600				.*Quadro.*600.*								2		1
+NVIDIA Quadro4					.*Quadro4.*									0		1
+NVIDIA Quadro DCC				.*Quadro DCC.*								0		1
+NVIDIA Quadro FX 770M			.*Quadro.*FX *770M.*						2		1
+NVIDIA Quadro FX 1500M			.*Quadro.*FX *1500M.*						1		1
+NVIDIA Quadro FX 1600M			.*Quadro.*FX *1600M.*						2		1
+NVIDIA Quadro FX 2500M			.*Quadro.*FX *2500M.*						2		1
+NVIDIA Quadro FX 2700M			.*Quadro.*FX *2700M.*						3		1
+NVIDIA Quadro FX 2800M			.*Quadro.*FX *2800M.*						3		1
+NVIDIA Quadro FX 3500			.*Quadro.*FX *3500.*						2		1
+NVIDIA Quadro FX 3600			.*Quadro.*FX *3600.*						3		1
+NVIDIA Quadro FX 3700			.*Quadro.*FX *3700.*						3		1
+NVIDIA Quadro FX 3800			.*Quadro.*FX *3800.*						3		1
+NVIDIA Quadro FX 4500			.*Quadro.*FX *45.*							3		1
+NVIDIA Quadro FX 880M			.*Quadro.*FX *880M.*						3		1
+NVIDIA Quadro FX 4800			.*NVIDIA.*Quadro *FX *4800.*				3		1
+NVIDIA Quadro FX				.*Quadro FX.*								1		1
+NVIDIA Quadro NVS 1xxM			.*Quadro NVS *1.[05]M.*						0		1
+NVIDIA Quadro NVS 300M			.*NVIDIA.*NVS *300M.*						2		1
+NVIDIA Quadro NVS 320M			.*NVIDIA.*NVS *320M.*						2		1
+NVIDIA Quadro NVS 2100M			.*NVIDIA.*NVS *2100M.*						2		1
+NVIDIA Quadro NVS 3100M			.*NVIDIA.*NVS *3100M.*						2		1
+NVIDIA Quadro NVS 4200M			.*NVIDIA.*NVS *4200M.*						2		1
+NVIDIA Quadro NVS 5100M			.*NVIDIA.*NVS *5100M.*						2		1
+NVIDIA Quadro NVS				.*NVIDIA.*NVS								0		1
+NVIDIA RIVA TNT					.*RIVA TNT.*								0		0
+S3								.*S3 Graphics.*								0		0
+SiS								SiS.*										0		0
+Trident							Trident.*									0		0
+Tungsten Graphics				Tungsten.*									0		0
+XGI								XGI.*										0		0
+VIA								VIA.*										0		0
+Apple Generic					Apple.*Generic.*							0		0
+Apple Software Renderer			Apple.*Software Renderer.*					0		0
diff --git a/indra/newview/groupchatlistener.cpp b/indra/newview/groupchatlistener.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3758896b85018599172efdbcad4ab82dc172166a
--- /dev/null
+++ b/indra/newview/groupchatlistener.cpp
@@ -0,0 +1,59 @@
+/**
+ * @file   groupchatlistener.cpp
+ * @author Nat Goodspeed
+ * @date   2011-04-11
+ * @brief  Implementation for groupchatlistener.
+ * 
+ * $LicenseInfo:firstyear=2011&license=internal$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "groupchatlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llgroupactions.h"
+#include "llimview.h"
+
+
+namespace {
+	void startIm_wrapper(LLSD const & event)
+	{
+		LLUUID session_id = LLGroupActions::startIM(event["id"].asUUID());
+		sendReply(LLSDMap("session_id", LLSD(session_id)), event);
+	}
+
+	void send_message_wrapper(const std::string& text, const LLUUID& session_id, const LLUUID& group_id)
+	{
+		LLIMModel::sendMessage(text, session_id, group_id, IM_SESSION_GROUP_START);
+	}
+}
+
+
+GroupChatListener::GroupChatListener():
+    LLEventAPI("GroupChat",
+               "API to enter, leave, send and intercept group chat messages")
+{
+    add("startIM",
+        "Enter a group chat in group with UUID [\"id\"]\n"
+        "Assumes the logged-in agent is already a member of this group.",
+        &startIm_wrapper);
+    add("endIM",
+        "Leave a group chat in group with UUID [\"id\"]\n"
+        "Assumes a prior successful startIM request.",
+        &LLGroupActions::endIM,
+        LLSDArray("id"));
+	add("sendIM",
+		"send a groupchat IM",
+		&send_message_wrapper,
+        LLSDArray("text")("session_id")("group_id"));
+}
+/*
+	static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
+								const LLUUID& other_participant_id, EInstantMessage dialog);
+*/
diff --git a/indra/newview/groupchatlistener.h b/indra/newview/groupchatlistener.h
new file mode 100644
index 0000000000000000000000000000000000000000..719e3e877f51df5233bb49ad1428f0bc5fe6c0e0
--- /dev/null
+++ b/indra/newview/groupchatlistener.h
@@ -0,0 +1,23 @@
+/**
+ * @file   groupchatlistener.h
+ * @author Nat Goodspeed
+ * @date   2011-04-11
+ * @brief  
+ * 
+ * $LicenseInfo:firstyear=2011&license=internal$
+ * Copyright (c) 2011, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_GROUPCHATLISTENER_H)
+#define LL_GROUPCHATLISTENER_H
+
+#include "lleventapi.h"
+
+class GroupChatListener: public LLEventAPI
+{
+public:
+    GroupChatListener();
+};
+
+#endif /* ! defined(LL_GROUPCHATLISTENER_H) */
diff --git a/indra/newview/licenses-mac.txt b/indra/newview/licenses-mac.txt
index 1324fa1a864edcc275b9e10e0d4c9241f1993685..af80bff5d954de09e148cdc9b297990ed6ee8f56 100644
--- a/indra/newview/licenses-mac.txt
+++ b/indra/newview/licenses-mac.txt
@@ -315,516 +315,6 @@ This product includes cryptographic software written by Eric Young
 Hudson (tjh@cryptsoft.com).
 
 
-===========
-Pth License
-===========
-   ____  _   _
-  |  _ \| |_| |__               ``Ian Fleming was a UNIX fan!
-  | |_) | __| '_ \                How do I know? Well, James Bond
-  |  __/| |_| | | |               had the (license to kill) number 007,
-  |_|    \__|_| |_|               i.e., he could execute anyone!''
-
-  GNU Pth - The GNU Portable Threads
-
-  LICENSE
-  =======
-
-  This library is free software; you can redistribute it and/or modify
-  it under the terms of the GNU Lesser General Public License as
-  published by the Free Software Foundation; either version 2.1 of the
-  License, or (at your option) any later version.
-
-  For some people, it is not clear, what is the real intention of the
-  author by using the GNU Lesser General Public License (LGPL) as the
-  distribution license for GNU Pth. This is, because the LGPL and the
-  GPL can be (and are often) interpreted very differently and some
-  interpretations seem to be not compatible with others. So an explicit
-  clarification for the use of the LGPL for GNU Pth from the authors
-  point of view might be useful.
-
-  The author places this library under the LGPL to make sure that it
-  can be used both commercially and non-commercially provided that
-  modifications to the code base are always donated back to the official
-  code base under the same license conditions. Please keep in mind that
-  especially using this library in code not staying under the GPL or
-  the LGPL _is_ allowed and that any taint or license creap into code
-  that uses the library is not the authors intention. It is just the
-  case that _including_ this library into the source tree of other
-  applications is a little bit more inconvinient because of the LGPL.
-  But it has to be this way for good reasons. And keep in mind that
-  inconvinient doesn't mean not allowed or even impossible.
-
-  Even if you want to use this library in some BSD-style licensed
-  packages, this _is_ possible as long as you are a little bit
-  carefully. Usually this means you have to make sure that the code is
-  still clearly separated into the source tree and that modifications to
-  this source area are done under the conditions of the LGPL. Read below
-  for more details on the conditions. Contact the author if you have
-  more questions.
-
-  The license text of the GNU Lesser General Public License follows:
-  __________________________________________________________________________
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL.  It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software.  For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
-                  GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                            NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-
 =======================
 Original SSLeay License
 =======================
diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ada74ea44ca33ed0551afe748ab36519063c78e1
--- /dev/null
+++ b/indra/newview/llaccountingquotamanager.cpp
@@ -0,0 +1,264 @@
+/** 
+ * @file LLAccountingQuotaManager.cpp
+ * @ Handles the setting and accessing for costs associated with mesh 
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2010, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llaccountingquotamanager.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+
+//===============================================================================
+LLAccountingQuotaManager::LLAccountingQuotaManager()
+{	
+}
+//===============================================================================
+class LLAccountingQuotaResponder : public LLCurl::Responder
+{
+public:
+	LLAccountingQuotaResponder( const LLSD& objectIDs )
+	: mObjectIDs( objectIDs )
+	{
+	}
+		
+	void clearPendingRequests ( void )
+	{
+		for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+		{
+			LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( iter->asUUID() );
+		}
+	}
+	
+	void error( U32 statusNum, const std::string& reason )
+	{
+		llwarns	<< "Transport error "<<reason<<llendl;	
+		//prep#do we really want to remove all because of one failure - verify
+		clearPendingRequests();
+	}
+	
+	void result( const LLSD& content )
+	{
+		if ( !content.isMap() || content.has("error") )
+		{
+			llwarns	<< "Error on fetched data"<< llendl;
+			//prep#do we really want to remove all because of one failure - verify
+			clearPendingRequests();
+			return;
+		}
+		
+		//Differentiate what the incoming caps could be from the data
+		//bool VOContent  = content.has("Objects");
+		bool containsParcel    = content.has("parcel");
+		bool containsSelection = content.has("selected");
+		//bool VORegion   = content.has("region");
+				
+		//Loop over the stored object ids checking against the incoming data
+		for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+		{
+			LLUUID objectID = iter->asUUID();
+						
+			LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+				
+			if ( containsParcel )
+			{
+					//Typically should be one
+					S32 dataCount = content["parcel"].size();
+					for(S32 i = 0; i < dataCount; i++)
+					{
+						//prep#todo verify that this is safe, otherwise just add a bool
+						S32 parcelId = 0;
+						S32 parcelOwner = 0;
+						if ( content["parcel"][i].has("parcel_id") )
+						{
+							parcelId = content["parcel"][i]["parcel_id"].asInteger();
+						}
+						if ( content["parcel"][i].has("parcel_owner") )
+						{
+							parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
+						}
+											
+						F32 ownerRenderCost		= 0;
+						F32 ownerPhysicsCost	= 0;
+						F32 ownerNetworkCost	= 0;
+						F32 ownerSimulationCost = 0;
+						
+						F32 groupRenderCost		= 0;
+						F32 groupPhysicsCost	= 0;
+						F32 groupNetworkCost	= 0;
+						F32 groupSimulationCost = 0;
+						
+						F32 otherRenderCost		= 0;
+						F32 otherPhysicsCost	= 0;
+						F32 otherNetworkCost	= 0;
+						F32 otherSimulationCost = 0;
+						
+						F32 totalRenderCost		= 0;
+						F32 totalPhysicsCost	= 0;
+						F32 totalNetworkCost	= 0;
+						F32 totalSimulationCost = 0;
+						
+						if ( content["parcel"][i].has("owner") )
+						{
+							ownerRenderCost		= content["parcel"][i]["owner"]["render"].asReal();
+							ownerPhysicsCost	= content["parcel"][i]["owner"]["physics"].asReal();
+							ownerNetworkCost	= content["parcel"][i]["owner"]["network"].asReal();
+							ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
+							
+						}
+						if ( content["parcel"][i].has("group") )
+						{
+							groupRenderCost		= content["parcel"][i]["group"]["render"].asReal();
+							groupPhysicsCost	= content["parcel"][i]["group"]["physics"].asReal();
+							groupNetworkCost	= content["parcel"][i]["group"]["network"].asReal();
+							groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
+							
+						}
+						if ( content["parcel"][i].has("other") )
+						{
+							otherRenderCost		= content["parcel"][i]["other"]["render"].asReal();
+							otherPhysicsCost	= content["parcel"][i]["other"]["physics"].asReal();
+							otherNetworkCost	= content["parcel"][i]["other"]["network"].asReal();
+							otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
+						}
+						
+						if ( content["parcel"][i].has("total") )
+						{
+							totalRenderCost		= content["parcel"][i]["total"]["render"].asReal();
+							totalPhysicsCost	= content["parcel"][i]["total"]["physics"].asReal();
+							totalNetworkCost	= content["parcel"][i]["total"]["network"].asReal();
+							totalSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+							
+						}
+						
+						ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
+												 groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
+												 otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
+												 totalRenderCost, totalPhysicsCost, totalNetworkCost, totalSimulationCost );
+						//Update the Parcel						
+						LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+						if ( pParcel )
+						{
+							pParcel->updateQuota( objectID, parcelQuota ); 
+						}
+					}					
+				}
+			else 
+			if ( containsSelection )
+			{
+				S32 dataCount = content["selected"].size();
+				for(S32 i = 0; i < dataCount; i++)
+				{
+					
+					F32 renderCost		= 0;
+					F32 physicsCost		= 0;
+					F32 networkCost		= 0;
+					F32 simulationCost	= 0;
+					
+					S32 localId = 0;
+					
+					localId			= content["selected"][i]["local_id"].asInteger();
+					renderCost		= content["selected"][i]["render"].asReal();
+					physicsCost		= content["selected"][i]["physics"].asReal();
+					networkCost		= content["selected"][i]["network"].asReal();
+					simulationCost	= content["selected"][i]["simulation"].asReal();
+					
+					SelectionQuota selectionQuota( localId, renderCost, physicsCost, networkCost, simulationCost );
+					
+					//Update the objects					
+					//gObjectList.updateQuota( localId, selectionQuota ); 
+					
+				}
+			}
+			else
+			{
+				//Nothing in string 
+				LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+			}
+		}
+	}
+	
+private:
+	//List of posted objects
+	LLSD mObjectIDs;
+};
+//===============================================================================
+void LLAccountingQuotaManager::fetchQuotas( const std::string& url )
+{
+	// Invoking system must have already determined capability availability
+	if ( !url.empty() )
+	{
+		LLSD objectList;
+		U32  objectIndex = 0;
+		IDIt IDIter = mUpdateObjectQuota.begin();
+		IDIt IDIterEnd = mUpdateObjectQuota.end();
+		
+		for ( ; IDIter != IDIterEnd; ++IDIter )
+		{
+			// Check to see if a request for this object has already been made.
+			if ( mPendingObjectQuota.find( *IDIter ) ==	mPendingObjectQuota.end() )
+			{
+				mPendingObjectQuota.insert( *IDIter );	
+				objectList[objectIndex++] = *IDIter;
+			}
+		}
+	
+		mUpdateObjectQuota.clear();
+		
+		//Post results
+		if ( objectList.size() > 0 )
+		{
+			LLSD dataToPost = LLSD::emptyMap();			
+			dataToPost["object_ids"] = objectList;
+			LLHTTPClient::post( url, dataToPost, new LLAccountingQuotaResponder( objectList ));
+		}
+	}
+	else
+	{
+		//url was empty - warn & continue
+		llwarns<<"Supplied url is empty "<<llendl;
+		mUpdateObjectQuota.clear();
+		mPendingObjectQuota.clear();
+	}
+}
+//===============================================================================
+void LLAccountingQuotaManager::updateObjectCost( const LLUUID& objectID )
+{
+	mUpdateObjectQuota.insert( objectID );
+}
+//===============================================================================
+void LLAccountingQuotaManager::removePendingObjectQuota( const LLUUID& objectID )
+{
+	mPendingObjectQuota.erase( objectID );
+}
+//===============================================================================
diff --git a/indra/newview/llaccountingquotamanager.h b/indra/newview/llaccountingquotamanager.h
new file mode 100644
index 0000000000000000000000000000000000000000..4c20561bce26101069a037eceef6b018cb6a7f35
--- /dev/null
+++ b/indra/newview/llaccountingquotamanager.h
@@ -0,0 +1,60 @@
+/** 
+ * @file lllAccountingQuotaManager.h
+ * @
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCOUNTINGQUOTAMANAGER_H
+#define LL_ACCOUNTINGQUOTAMANAGER_H
+//===============================================================================
+#include "llaccountingquota.h"
+//===============================================================================
+class LLAccountingQuotaManager : public LLSingleton<LLAccountingQuotaManager>
+{
+public:
+	//Ctor
+	LLAccountingQuotaManager();
+	//Store an object that will be eventually fetched
+	void updateObjectCost( const LLUUID& objectID );
+	//Request quotas for object list
+	void fetchQuotas( const std::string& url );
+	//Delete a specific object from the pending list
+	void removePendingObjectQuota( const LLUUID& objectID );
+	
+private:
+	//Set of objects that need to update their cost
+	std::set<LLUUID> mUpdateObjectQuota;
+	//During fetchQuota we move object into a the pending set to signify that 
+	//a fetch has been instigated.
+	std::set<LLUUID> mPendingObjectQuota;
+	typedef std::set<LLUUID>::iterator IDIt;
+};
+//===============================================================================
+
+#endif
\ No newline at end of file
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index f4023502f64533026f4a4fae59d7d7ca9f6aba01..08d71fc8fcbfcfcc80f921798f8097344b07500f 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -25,10 +25,12 @@
  */
 
 #include "llviewerprecompiledheaders.h"
+
 #include "llagent.h" 
 
 #include "pipeline.h"
 
+#include "llagentaccess.h"
 #include "llagentcamera.h"
 #include "llagentlistener.h"
 #include "llagentwearables.h"
@@ -36,6 +38,7 @@
 #include "llanimationstates.h"
 #include "llbottomtray.h"
 #include "llcallingcard.h"
+#include "llcapabilitylistener.h"
 #include "llchannelmanager.h"
 #include "llconsole.h"
 #include "llfirstuse.h"
@@ -55,13 +58,16 @@
 #include "llpaneltopinfobar.h"
 #include "llparcel.h"
 #include "llrendersphere.h"
+#include "llsdmessage.h"
 #include "llsdutil.h"
 #include "llsky.h"
+#include "llslurl.h"
 #include "llsmoothstep.h"
 #include "llstartup.h"
 #include "llstatusbar.h"
 #include "llteleportflags.h"
 #include "lltool.h"
+#include "lltoolpie.h"
 #include "lltoolmgr.h"
 #include "lltrans.h"
 #include "llurlentry.h"
@@ -73,6 +79,7 @@
 #include "llviewerobjectlist.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerstats.h"
+#include "llviewerwindow.h"
 #include "llvoavatarself.h"
 #include "llwindow.h"
 #include "llworld.h"
@@ -171,7 +178,8 @@ LLAgent::LLAgent() :
 	mbRunning(false),
 	mbTeleportKeepsLookAt(false),
 
-	mAgentAccess(gSavedSettings),
+	mAgentAccess(new LLAgentAccess(gSavedSettings)),
+	mTeleportSourceSLURL(new LLSLURL),
 	mTeleportState( TELEPORT_NONE ),
 	mRegionp(NULL),
 
@@ -208,7 +216,7 @@ LLAgent::LLAgent() :
 	mAutoPilotFinishedCallback(NULL),
 	mAutoPilotCallbackData(NULL),
 	
-	mEffectColor(LLColor4(0.f, 1.f, 1.f, 1.f)),
+	mEffectColor(new LLUIColor(LLColor4(0.f, 1.f, 1.f, 1.f))),
 
 	mHaveHomePosition(FALSE),
 	mHomeRegionHandle( 0 ),
@@ -250,7 +258,7 @@ void LLAgent::init()
 
 	setFlying( gSavedSettings.getBOOL("FlyingAtExit") );
 
-	mEffectColor = LLUIColorTable::instance().getColor("EffectColor");
+	*mEffectColor = LLUIColorTable::instance().getColor("EffectColor");
 
 	gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
 	gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2));
@@ -274,9 +282,16 @@ LLAgent::~LLAgent()
 	cleanup();
 
 	delete mMouselookModeInSignal;
+	mMouselookModeInSignal = NULL;
 	delete mMouselookModeOutSignal;
+	mMouselookModeOutSignal = NULL;
 
-	// *Note: this is where LLViewerCamera::getInstance() used to be deleted.
+	delete mAgentAccess;
+	mAgentAccess = NULL;
+	delete mEffectColor;
+	mEffectColor = NULL;
+	delete mTeleportSourceSLURL;
+	mTeleportSourceSLURL = NULL;
 }
 
 // Handle any actions that need to be performed when the main app gains focus
@@ -559,6 +574,8 @@ void LLAgent::setFlying(BOOL fly)
 // static
 void LLAgent::toggleFlying()
 {
+	LLToolPie::instance().stopClickToWalk();
+
 	BOOL fly = !gAgent.getFlying();
 
 	gAgent.mMoveTimer.reset();
@@ -2145,32 +2162,32 @@ void LLAgent::onAnimStop(const LLUUID& id)
 
 bool LLAgent::isGodlike() const
 {
-	return mAgentAccess.isGodlike();
+	return mAgentAccess->isGodlike();
 }
 
 bool LLAgent::isGodlikeWithoutAdminMenuFakery() const
 {
-	return mAgentAccess.isGodlikeWithoutAdminMenuFakery();
+	return mAgentAccess->isGodlikeWithoutAdminMenuFakery();
 }
 
 U8 LLAgent::getGodLevel() const
 {
-	return mAgentAccess.getGodLevel();
+	return mAgentAccess->getGodLevel();
 }
 
 bool LLAgent::wantsPGOnly() const
 {
-	return mAgentAccess.wantsPGOnly();
+	return mAgentAccess->wantsPGOnly();
 }
 
 bool LLAgent::canAccessMature() const
 {
-	return mAgentAccess.canAccessMature();
+	return mAgentAccess->canAccessMature();
 }
 
 bool LLAgent::canAccessAdult() const
 {
-	return mAgentAccess.canAccessAdult();
+	return mAgentAccess->canAccessAdult();
 }
 
 bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const
@@ -2205,37 +2222,37 @@ bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const
 
 bool LLAgent::prefersPG() const
 {
-	return mAgentAccess.prefersPG();
+	return mAgentAccess->prefersPG();
 }
 
 bool LLAgent::prefersMature() const
 {
-	return mAgentAccess.prefersMature();
+	return mAgentAccess->prefersMature();
 }
 	
 bool LLAgent::prefersAdult() const
 {
-	return mAgentAccess.prefersAdult();
+	return mAgentAccess->prefersAdult();
 }
 
 bool LLAgent::isTeen() const
 {
-	return mAgentAccess.isTeen();
+	return mAgentAccess->isTeen();
 }
 
 bool LLAgent::isMature() const
 {
-	return mAgentAccess.isMature();
+	return mAgentAccess->isMature();
 }
 
 bool LLAgent::isAdult() const
 {
-	return mAgentAccess.isAdult();
+	return mAgentAccess->isAdult();
 }
 
 void LLAgent::setTeen(bool teen)
 {
-	mAgentAccess.setTeen(teen);
+	mAgentAccess->setTeen(teen);
 }
 
 //static 
@@ -2280,37 +2297,37 @@ bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity)
 
 BOOL LLAgent::getAdminOverride() const	
 { 
-	return mAgentAccess.getAdminOverride(); 
+	return mAgentAccess->getAdminOverride(); 
 }
 
 void LLAgent::setMaturity(char text)
 {
-	mAgentAccess.setMaturity(text);
+	mAgentAccess->setMaturity(text);
 }
 
 void LLAgent::setAdminOverride(BOOL b)	
 { 
-	mAgentAccess.setAdminOverride(b);
+	mAgentAccess->setAdminOverride(b);
 }
 
 void LLAgent::setGodLevel(U8 god_level)	
 { 
-	mAgentAccess.setGodLevel(god_level);
+	mAgentAccess->setGodLevel(god_level);
 }
 
 void LLAgent::setAOTransition()
 {
-	mAgentAccess.setTransition();
+	mAgentAccess->setTransition();
 }
 
 const LLAgentAccess& LLAgent::getAgentAccess()
 {
-	return mAgentAccess;
+	return *mAgentAccess;
 }
 
 bool LLAgent::validateMaturity(const LLSD& newvalue)
 {
-	return mAgentAccess.canSetMaturity(newvalue.asInteger());
+	return mAgentAccess->canSetMaturity(newvalue.asInteger());
 }
 
 void LLAgent::handleMaturity(const LLSD& newvalue)
@@ -2642,12 +2659,12 @@ BOOL LLAgent::allowOperation(PermissionBit op,
 
 const LLColor4 &LLAgent::getEffectColor()
 {
-	return mEffectColor;
+	return *mEffectColor;
 }
 
 void LLAgent::setEffectColor(const LLColor4 &color)
 {
-	mEffectColor = color;
+	*mEffectColor = color;
 }
 
 void LLAgent::initOriginGlobal(const LLVector3d &origin_global)
@@ -3475,7 +3492,7 @@ void LLAgent::setTeleportState(ETeleportState state)
 
 		case TELEPORT_MOVING:
 		// We're outa here. Save "back" slurl.
-		LLAgentUI::buildSLURL(mTeleportSourceSLURL);
+		LLAgentUI::buildSLURL(*mTeleportSourceSLURL);
 			break;
 
 		case TELEPORT_ARRIVING:
@@ -3808,6 +3825,11 @@ void LLAgent::parseTeleportMessages(const std::string& xml_filename)
 	}//end for (all message sets in xml file)
 }
 
+const void LLAgent::getTeleportSourceSLURL(LLSLURL& slurl) const
+{
+	slurl = *mTeleportSourceSLURL;
+}
+
 void LLAgent::sendAgentUpdateUserInfo(bool im_via_email, const std::string& directory_visibility )
 {
 	gMessageSystem->newMessageFast(_PREHASH_UpdateUserInfo);
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 896408c0dd6a9cc0417ece00063cf1664dcd64a0..54c5649f97f3a35eea2f3487b35dc42f63a46d59 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -29,15 +29,11 @@
 
 #include "indra_constants.h"
 #include "llevent.h" 				// LLObservable base class
-#include "llagentaccess.h"
 #include "llagentconstants.h"
 #include "llagentdata.h" 			// gAgentID, gAgentSessionID
-#include "llcharacter.h" 			// LLAnimPauseRequest
+#include "llcharacter.h"
 #include "llcoordframe.h"			// for mFrameAgent
-#include "llpointer.h"
-#include "lluicolor.h"
 #include "llvoavatardefines.h"
-#include "llslurl.h"
 
 #include <boost/signals2.hpp>
 
@@ -56,6 +52,10 @@ class LLFriendObserver;
 class LLPickInfo;
 class LLViewerObject;
 class LLAgentDropGroupViewerNode;
+class LLAgentAccess;
+class LLSLURL;
+class LLPauseRequestHandle;
+class LLUIColor;
 
 //--------------------------------------------------------------------
 // Types
@@ -80,6 +80,8 @@ struct LLGroupData
 
 class LLAgentListener;
 
+class LLAgentImpl;
+
 //------------------------------------------------------------------------
 // LLAgent
 //------------------------------------------------------------------------
@@ -420,7 +422,7 @@ class LLAgent : public LLOldEvents::LLObservable
 	camera_signal_t* mMouselookModeInSignal;
 	camera_signal_t* mMouselookModeOutSignal;
 	BOOL            mCustomAnim; 		// Current animation is ANIM_AGENT_CUSTOMIZE ?
-	LLAnimPauseRequest mPauseRequest;
+	LLPointer<LLPauseRequestHandle> mPauseRequest;
 	BOOL			mViewsPushed; 		// Keep track of whether or not we have pushed views
 	
 /**                    Animation
@@ -515,13 +517,13 @@ class LLAgent : public LLOldEvents::LLObservable
 
 public:
 	static void 	parseTeleportMessages(const std::string& xml_filename);
-	const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; }
+	const void getTeleportSourceSLURL(LLSLURL& slurl) const;
 public:
 	// ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings.
 	static std::map<std::string, std::string> sTeleportErrorMessages;
 	static std::map<std::string, std::string> sTeleportProgressMessages;
 private:
-	LLSLURL	mTeleportSourceSLURL; 			// SLURL where last TP began
+	LLSLURL * mTeleportSourceSLURL; 			// SLURL where last TP began
 
 	//--------------------------------------------------------------------
 	// Teleport Actions
@@ -580,7 +582,7 @@ class LLAgent : public LLOldEvents::LLObservable
 	// ! BACKWARDS COMPATIBILITY ! This function can go away after the AO transition (see llstartup.cpp).
 	void 			setAOTransition();
 private:
-	LLAgentAccess 	mAgentAccess;
+	LLAgentAccess * mAgentAccess;
 	
 	//--------------------------------------------------------------------
 	// God
@@ -660,7 +662,7 @@ class LLAgent : public LLOldEvents::LLObservable
 	const LLColor4	&getEffectColor();
 	void			setEffectColor(const LLColor4 &color);
 private:
-	LLUIColor 		mEffectColor;
+	LLUIColor * mEffectColor;
 
 /**                    Rendering
  **                                                                            **
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index c6b5a0113ff9d2b2f3d0ea49916700e459144acf..80085dad9d2609d53f12cfdc6c7226ca76dec9e3 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -394,7 +394,9 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
 	LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
 	LLVector3 object_extents;	
 	const LLVector4a* oe4 = object->mDrawable->getSpatialExtents();
-	object_extents.set( oe4[1][0], oe4[1][1], oe4[1][2] );
+	LLVector4a size;
+	size.setSub(oe4[1], oe4[0]);
+	object_extents.set( size[0], size[1], size[2] );
 	
 	// make sure they object extents are non-zero
 	object_extents.clamp(0.001f, F32_MAX);
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index ed24febf417d49b1a698e3e58e3e4ad948e97568..9cea33c7c65cda661e34350a80b6cd4892c5bec3 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -64,6 +64,12 @@ LLAgentListener::LLAgentListener(LLAgent &agent)
         "[\"quat\"]:  array of [x, y, z, w] quaternion values",
         &LLAgentListener::getAxes,
         LLSDMap("reply", LLSD()));
+    add("getGroups",
+        "Send on [\"reply\"], in [\"groups\"], an array describing agent's groups:\n"
+        "[\"id\"]: UUID of group\n"
+        "[\"name\"]: name of group",
+        &LLAgentListener::getGroups,
+        LLSDMap("reply", LLSD()));
 }
 
 void LLAgentListener::requestTeleport(LLSD const & event_data) const
@@ -140,3 +146,21 @@ void LLAgentListener::getAxes(const LLSD& event) const
               ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
               event);
 }
+
+void LLAgentListener::getGroups(const LLSD& event) const
+{
+    LLSD reply(LLSD::emptyArray());
+    for (LLDynamicArray<LLGroupData>::const_iterator
+             gi(mAgent.mGroups.begin()), gend(mAgent.mGroups.end());
+         gi != gend; ++gi)
+    {
+        reply.append(LLSDMap
+                     ("id", gi->mID)
+                     ("name", gi->mName)
+                     ("insignia", gi->mInsigniaID)
+                     ("notices", bool(gi->mAcceptNotices))
+                     ("display", bool(gi->mListInProfile))
+                     ("contrib", gi->mContribution));
+    }
+    sendReply(LLSDMap("groups", reply), event);
+}
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index 0aa58d0b16fdaf06796a4c0546b605f4caa7657f..5a89a99f6a0fd99730ad9f10570ec70b758437f2 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -46,6 +46,7 @@ class LLAgentListener : public LLEventAPI
 	void requestStand(LLSD const & event_data) const;
 	void resetAxes(const LLSD& event) const;
 	void getAxes(const LLSD& event) const;
+	void getGroups(const LLSD& event) const;
 
 private:
 	LLAgent & mAgent;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index e304729839d1531c6f640a3021b0a1170a2c6ce1..75b6c18c57500319f59fa5430f0503705c1295ea 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -85,13 +85,14 @@
 #include "lltextutil.h"
 #include "lllogininstance.h"
 #include "llprogressview.h"
-
+#include "llvocache.h"
 #include "llweb.h"
 #include "llsecondlifeurls.h"
 #include "llupdaterservice.h"
 
 // Linden library includes
 #include "llavatarnamecache.h"
+#include "lldiriterator.h"
 #include "llimagej2c.h"
 #include "llmemory.h"
 #include "llprimitive.h"
@@ -135,7 +136,6 @@
 #include "lltoolmgr.h"
 #include "llassetstorage.h"
 #include "llpolymesh.h"
-#include "llcachename.h"
 #include "llaudioengine.h"
 #include "llstreamingaudio.h"
 #include "llviewermenu.h"
@@ -308,7 +308,7 @@ BOOL gLogoutInProgress = FALSE;
 
 ////////////////////////////////////////////////////////////
 // Internal globals... that should be removed.
-static std::string gArgs = "Mesh Beta";
+static std::string gArgs;
 
 const std::string MARKER_FILE_NAME("SecondLife.exec_marker");
 const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker");
@@ -3479,7 +3479,9 @@ void LLAppViewer::migrateCacheDirectory()
 			S32 file_count = 0;
 			std::string file_name;
 			std::string mask = delimiter + "*.*";
-			while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name))
+
+			LLDirIterator iter(old_cache_dir, mask);
+			while (iter.next(file_name))
 			{
 				if (file_name == "." || file_name == "..") continue;
 				std::string source_path = old_cache_dir + delimiter + file_name;
@@ -3700,7 +3702,8 @@ bool LLAppViewer::initCache()
 		dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
 
 		std::string found_file;
-		if (gDirUtilp->getNextFileInDir(dir, mask, found_file))
+		LLDirIterator iter(dir, mask);
+		if (iter.next(found_file))
 		{
 			old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file;
 
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 523c2e3adf8113425f6926c9434100d52a8688ef..714e0e6163b8a939ac3f9603cafc80a17e0f5d8f 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -30,6 +30,7 @@
 
 #include "llcommandlineparser.h"
 
+#include "lldiriterator.h"
 #include "llmemtype.h"
 #include "llurldispatcher.h"		// SLURL from other app instance
 #include "llviewernetwork.h"
@@ -504,7 +505,9 @@ std::string LLAppViewerLinux::generateSerialNumber()
 
 	// trawl /dev/disk/by-uuid looking for a good-looking UUID to grab
 	std::string this_name;
-	while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name))
+
+	LLDirIterator iter(uuiddir, "*");
+	while (iter.next(this_name))
 	{
 		if (this_name.length() > best.length() ||
 		    (this_name.length() == best.length() &&
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 54689ea808a6ed40e4987394e971b6822edcfc71..6396ca91ffa6521c4fb597ed6c439d6d23ba52a4 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -26,12 +26,6 @@
 
 #include "llviewerprecompiledheaders.h"
 
-#if defined(_DEBUG)
-# if _MSC_VER >= 1400 // Visual C++ 2005 or later
-#	define WINDOWS_CRT_MEM_CHECKS 1
-# endif
-#endif
-
 #include "llappviewerwin32.h"
 
 #include "llmemtype.h"
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index b6482e0ec473d7eec8ee85cdf935e374d0e726a8..f51552aae522a28255b0ccd6df3899631a0ebf2a 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -218,7 +218,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	mLandingTab(NULL),
 	mCheckForDrag(false)
 {
-	// Firstly add ourself to IMSession observers, so we catch session events
+	// Firstly add our self to IMSession observers, so we catch session events
 	// before chiclets do that.
 	LLIMMgr::getInstance()->addSessionObserver(this);
 
@@ -378,12 +378,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
 	}
 
 	// We have to enable/disable right and left parts of speak button separately (EXT-4648)
-	mSpeakBtn->setSpeakBtnEnabled(enable);
+	getChild<LLButton>("speak_btn")->setEnabled(enable);
+
 	// skipped to avoid button blinking
 	if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
 	{
 		bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
-		mSpeakBtn->setFlyoutBtnEnabled(voice_status);
+		getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status);
 		if (voice_status)
 		{
 			LLFirstUse::speak(true);
@@ -546,17 +547,27 @@ BOOL LLBottomTray::postBuild()
 	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
 
 	mSpeakPanel = getChild<LLPanel>("speak_panel");
-	mSpeakBtn = getChild<LLSpeakButton>("talk");
-	LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
+	mSpeakBtn = findChild<LLSpeakButton>("talk");
+	if (mSpeakBtn)
+	{
+		LLHints::registerHintTarget("speak_btn", mSpeakBtn->getHandle());
+
+		// Localization tool doesn't understand custom buttons like <talk_button>
+		mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
+		mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
+	}	
+	else
+	{
+		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("speak_btn"));
+		LLTransientFloaterMgr::getInstance()->addControlView(getChild<LLButton>("flyout_btn"));
+	}
+
 
 	// Both parts of speak button should be initially disabled because
 	// it takes some time between logging in to world and connecting to voice channel.
-	mSpeakBtn->setSpeakBtnEnabled(false);
-	mSpeakBtn->setFlyoutBtnEnabled(false);
+	getChild<LLButton>("speak_btn")->setEnabled(false);
+	getChild<LLButton>("speak_flyout_btn")->setEnabled(false);
 
-	// Localization tool doesn't understand custom buttons like <talk_button>
-	mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
-	mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
 
 	// Registering Chat Bar to receive Voice client status change notifications.
 	LLVoiceClient::getInstance()->addObserver(this);
@@ -740,6 +751,8 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
 
 void LLBottomTray::saveButtonsOrder()
 {
+	if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return;
+
 	std::string user_dir = gDirUtilp->getLindenUserDir();
 	if (user_dir.empty()) return;
 	
@@ -760,6 +773,8 @@ void LLBottomTray::saveButtonsOrder()
 
 void LLBottomTray::loadButtonsOrder()
 {
+	if (!gSavedSettings.getBOOL("AllowBottomTrayButtonReordering")) return;
+
 	// load per-resident sorting information
 	std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SORTING_DATA_FILE_NAME);
 
@@ -852,6 +867,10 @@ void LLBottomTray::draw()
 
 	getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible);
 
+	bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
+	bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
+	getChild<LLButton>("speak_btn")->setToggleState(openmic && voiceenabled);
+	getChild<LLOutputMonitorCtrl>("chat_zone_indicator")->setIsMuted(!voiceenabled);
 
 }
 
@@ -1309,7 +1328,11 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_
 
 			if (possible_shrink_width > 0)
 			{
-				mSpeakBtn->setLabelVisible(false);
+				if (mSpeakBtn)
+				{	
+					mSpeakBtn->setLabelVisible(false);
+				}
+
 				mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
 
 				required_width += possible_shrink_width;
@@ -1435,7 +1458,7 @@ bool LLBottomTray::processExtendSpeakButton(S32& available_width)
 		}
 
 		// Reshape the Speak button to its maximum width.
-		mSpeakBtn->setLabelVisible(true);
+		if (mSpeakBtn) mSpeakBtn->setLabelVisible(true);
 		mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
 
 		available_width -= required_headroom;
@@ -1510,21 +1533,35 @@ void LLBottomTray::initResizeStateContainers()
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel")));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel")));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_DESTINATIONS, getChild<LLPanel>("destinations_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_AVATARS, getChild<LLPanel>("avatar_panel")));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel")));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel")));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel")));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel")));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_1, getChild<LLPanel>("splitter_panel_1")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PEOPLE, getChild<LLPanel>("people_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_PROFILE, getChild<LLPanel>("profile_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPLITTER_2, getChild<LLPanel>("splitter_panel_2")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_HOWTO, getChild<LLPanel>("howto_panel")));
 
 	// init an order of processed buttons
-	mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
-	mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
-	mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
+	mButtonsProcessOrder.push_back(RS_BUTTON_DESTINATIONS);
+	mButtonsProcessOrder.push_back(RS_BUTTON_AVATARS);
 	mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT);
 	mButtonsProcessOrder.push_back(RS_BUTTON_BUILD);
 	mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH);
 	mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP);
 	mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP);
+	mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_1);
+	mButtonsProcessOrder.push_back(RS_BUTTON_PEOPLE);
+	mButtonsProcessOrder.push_back(RS_BUTTON_PROFILE);
+	mButtonsProcessOrder.push_back(RS_BUTTON_SPLITTER_2);
+	mButtonsProcessOrder.push_back(RS_BUTTON_HOWTO);
+	mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
+	mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
+	mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
 
 	mButtonsOrder.push_back(RS_BUTTON_SPEAK);
 	mButtonsOrder.insert(mButtonsOrder.end(), mButtonsProcessOrder.begin(), mButtonsProcessOrder.end());
@@ -1554,7 +1591,7 @@ void LLBottomTray::initResizeStateContainers()
 // because it resets chatbar's width according to resize logic.
 void LLBottomTray::initButtonsVisibility()
 {
-	setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat"));
+	setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat") || !mSpeakBtn );
 	setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
 	setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
 	setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
@@ -1568,7 +1605,12 @@ void LLBottomTray::initButtonsVisibility()
 
 void LLBottomTray::setButtonsControlsAndListeners()
 {
-	gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
+	// always show the speak panel if using the basic skin
+	if (mSpeakBtn)
+	{
+		gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
+	}	
+
 	gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));
 	gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));
 	gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2));
@@ -1857,26 +1899,36 @@ S32 LLBottomTray::getChicletPanelShrinkHeadroom() const
 // static
 std::string LLBottomTray::resizeStateToString(EResizeState state)
 {
+	const char *rs_string = "UNKNOWN_BUTTON";
+	
 	switch (state)
 	{
-	case RS_NORESIZE:				return "RS_NORESIZE";
-	case RS_CHICLET_PANEL:			return "RS_CHICLET_PANEL";
-	case RS_CHATBAR_INPUT:			return "RS_CHATBAR_INPUT";
-	case RS_BUTTON_SNAPSHOT:		return "RS_BUTTON_SNAPSHOT";
-	case RS_BUTTON_CAMERA:			return "RS_BUTTON_CAMERA";
-	case RS_BUTTON_MOVEMENT:		return "RS_BUTTON_MOVEMENT";
-	case RS_BUTTON_GESTURES:		return "RS_BUTTON_GESTURES";
-	case RS_BUTTON_SPEAK:			return "RS_BUTTON_SPEAK";
-	case RS_IM_WELL:				return "RS_IM_WELL";
-	case RS_NOTIFICATION_WELL:		return "RS_NOTIFICATION_WELL";
-	case RS_BUTTON_BUILD:			return "RS_BUTTON_BUILD";
-	case RS_BUTTON_SEARCH:			return "RS_BUTTON_SEARCH";
-	case RS_BUTTON_WORLD_MAP:		return "RS_BUTTON_WORLD_MAP";
-	case RS_BUTTON_MINI_MAP:		return "RS_BUTTON_MINI_MAP";
-	case RS_BUTTONS_CAN_BE_HIDDEN:	return "RS_BUTTONS_CAN_BE_HIDDEN";
-	// No default to track additions.
-	}
-	return "UNKNOWN_BUTTON";
+		case RS_NORESIZE:               rs_string = "RS_NORESIZE";              break;
+		case RS_CHICLET_PANEL:          rs_string = "RS_CHICLET_PANEL";         break;
+		case RS_CHATBAR_INPUT:          rs_string = "RS_CHATBAR_INPUT";         break;
+		case RS_BUTTON_SNAPSHOT:        rs_string = "RS_BUTTON_SNAPSHOT";       break;
+		case RS_BUTTON_CAMERA:          rs_string = "RS_BUTTON_CAMERA";         break;
+		case RS_BUTTON_MOVEMENT:        rs_string = "RS_BUTTON_MOVEMENT";       break;
+		case RS_BUTTON_GESTURES:        rs_string = "RS_BUTTON_GESTURES";       break;
+		case RS_BUTTON_SPEAK:           rs_string = "RS_BUTTON_SPEAK";          break;
+		case RS_IM_WELL:                rs_string = "RS_IM_WELL";               break;
+		case RS_NOTIFICATION_WELL:      rs_string = "RS_NOTIFICATION_WELL";     break;
+		case RS_BUTTON_BUILD:           rs_string = "RS_BUTTON_BUILD";          break;
+		case RS_BUTTON_SEARCH:          rs_string = "RS_BUTTON_SEARCH";         break;
+		case RS_BUTTON_WORLD_MAP:       rs_string = "RS_BUTTON_WORLD_MAP";      break;
+		case RS_BUTTON_MINI_MAP:        rs_string = "RS_BUTTON_MINI_MAP";       break;
+		case RS_BUTTON_DESTINATIONS:    rs_string = "RS_BUTTON_DESTINATIONS";   break;
+		case RS_BUTTON_AVATARS:         rs_string = "RS_BUTTON_AVATARS";        break;
+		case RS_BUTTON_PEOPLE:          rs_string = "RS_BUTTON_PEOPLE";         break;
+		case RS_BUTTON_PROFILE:         rs_string = "RS_BUTTON_PROFILE";        break;
+		case RS_BUTTON_HOWTO:           rs_string = "RS_BUTTON_HOWTO";          break;
+		case RS_BUTTON_SPLITTER_1:      rs_string = "RS_BUTTON_SPLITTER_1";     break;
+		case RS_BUTTON_SPLITTER_2:      rs_string = "RS_BUTTON_SPLITTER_2";     break;
+		case RS_BUTTONS_CAN_BE_HIDDEN:  rs_string = "RS_BUTTONS_CAN_BE_HIDDEN"; break;
+		// No default to track additions.
+	}
+
+	return rs_string;
 }
 
 // static
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 52bcd2ddacf90d3db0d72a885f366843794e6b57..d9c95d82e5eb1249352dc8aa3383de27678c552a 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -140,22 +140,29 @@ class LLBottomTray
 
 
 private:
-	typedef enum e_resize_status_type
+	typedef enum e_resize_state
 	{
-		  RS_NORESIZE			= 0x0000
-		, RS_CHICLET_PANEL		= 0x0001
-		, RS_CHATBAR_INPUT		= 0x0002
-		, RS_BUTTON_SNAPSHOT	= 0x0004
-		, RS_BUTTON_CAMERA		= 0x0008
-		, RS_BUTTON_MOVEMENT	= 0x0010
-		, RS_BUTTON_GESTURES	= 0x0020
-		, RS_BUTTON_SPEAK		= 0x0040
-		, RS_IM_WELL			= 0x0080
-		, RS_NOTIFICATION_WELL	= 0x0100
-		, RS_BUTTON_BUILD		= 0x0200
-		, RS_BUTTON_SEARCH		= 0x0400
-		, RS_BUTTON_WORLD_MAP	= 0x0800
-		, RS_BUTTON_MINI_MAP	= 0x1000
+		RS_NORESIZE				= 0x0000,
+		RS_CHICLET_PANEL		= 0x0001,
+		RS_CHATBAR_INPUT		= 0x0002,
+		RS_BUTTON_SNAPSHOT		= 0x0004,
+		RS_BUTTON_CAMERA		= 0x0008,
+		RS_BUTTON_MOVEMENT		= 0x0010,
+		RS_BUTTON_GESTURES		= 0x0020,
+		RS_BUTTON_SPEAK			= 0x0040,
+		RS_IM_WELL				= 0x0080,
+		RS_NOTIFICATION_WELL	= 0x0100,
+		RS_BUTTON_BUILD			= 0x0200,
+		RS_BUTTON_SEARCH		= 0x0400,
+		RS_BUTTON_WORLD_MAP		= 0x0800,
+		RS_BUTTON_MINI_MAP		= 0x1000,
+		RS_BUTTON_DESTINATIONS	= 0x2000,
+		RS_BUTTON_AVATARS		= 0x4000,
+		RS_BUTTON_PEOPLE		= 0x8000,
+		RS_BUTTON_PROFILE		= 0x10000,
+		RS_BUTTON_HOWTO			= 0x20000,
+		RS_BUTTON_SPLITTER_1	= 0x40000,
+		RS_BUTTON_SPLITTER_2	= 0x80000,
 
 		/*
 		Once new button that can be hidden on resize is added don't forget to update related places:
@@ -166,10 +173,11 @@ class LLBottomTray
 		/**
 		 * Specifies buttons which can be hidden when bottom tray is shrunk.
 		 * They are: Gestures, Movement (Move), Camera (View), Snapshot
-		 *		new: Build, Search, Map, World Map, Mini-Map.
+		 *		new: Build, Search, Map, World Map, Mini-Map, destinations, avatars
 		 */
-		, RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+		RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
 									| RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP
+									| RS_BUTTON_DESTINATIONS | RS_BUTTON_AVATARS
 	}EResizeState;
 
 	// Below are three methods that were introduced to handle drag'n'drop
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 885d5535247e86c3de6449e2d06fd110bd85b21e..3000209aadd228895e5d237e1935bb8c1601e8ac 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -483,8 +483,9 @@ void LLIMChiclet::setShowSpeaker(bool show)
 	if(needs_resize)
 	{		
 		mShowSpeaker = show;
-		toggleSpeakerControl();
 	}
+
+	toggleSpeakerControl();
 }
 
 void LLIMChiclet::enableCounterControl(bool enable) 
@@ -1183,6 +1184,10 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
 		if(chiclet)
 		{
 			chiclet->setShowSpeaker(true);
+			if (gSavedSettings.getBOOL("OpenIMOnVoice"))
+			{
+				LLIMFloater::show(chiclet->getSessionId());
+			}
 		}
 	}
 
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 2cfd3b0a33b87498d92abd907e1277ec232bf321..8b5a2ce78182d6e4147c73cb09430aaae7453f88 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -107,10 +107,14 @@ S32 LLDrawPoolAlpha::getNumPostDeferredPasses()
 	{ //skip depth buffer filling pass when rendering impostors
 		return 1;
 	}
-	else
+	else if (gSavedSettings.getBOOL("RenderDepthOfField"))
 	{
 		return 2; 
 	}
+	else
+	{
+		return 1;
+	}
 }
 
 void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) 
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 3f5cb4778e24841b3a425dd458711d9aa87d34f3..29b50761d8ebe48304392d4363b9e78c2adab207 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -889,6 +889,11 @@ void LLBumpImageList::destroyGL()
 
 void LLBumpImageList::restoreGL()
 {
+	if(!gTextureList.isInitialized())
+	{
+		return ;
+	}
+
 	LLStandardBumpmap::restoreGL();
 	// Images will be recreated as they are needed.
 }
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 6b45c5abb0a57c7aa497ec64416e09b7c76d128c..030d6e11107369865b0699351e70bbf4d530c512 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -63,6 +63,8 @@ void LLDrawPoolSky::prerender()
 
 void LLDrawPoolSky::render(S32 pass)
 {
+	gGL.flush();
+
 	if (mDrawFace.empty())
 	{
 		return;
@@ -111,13 +113,14 @@ void LLDrawPoolSky::render(S32 pass)
 
 	S32 face_count = (S32)mDrawFace.size();
 
+	LLVertexBuffer::unbind();
+	glColor4f(1,1,1,1);
+
 	for (S32 i = 0; i < llmin(6, face_count); ++i)
 	{
 		renderSkyCubeFace(i);
 	}
 
-	LLGLEnable blend(GL_BLEND);
-
 	glPopMatrix();
 }
 
diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h
index 697a70876201dd7232485aff80414557bbdaa0b1..3fee46c2f67a39832979db6cd74116b4bddcfb19 100644
--- a/indra/newview/lleventnotifier.h
+++ b/indra/newview/lleventnotifier.h
@@ -31,6 +31,7 @@
 #include "v3dmath.h"
 
 class LLEventNotification;
+class LLMessageSystem;
 
 
 class LLEventNotifier
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 9f0b34becc51d9f3edd880d146d272977d81882d..d1bff9f423370ed573a05d85ba9f424037e6fdd3 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -1,791 +1,807 @@
-/** 
- * @file llfeaturemanager.cpp
- * @brief LLFeatureManager class implementation
- *
- * $LicenseInfo:firstyear=2003&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include <iostream>
-#include <fstream>
-
-#include <boost/regex.hpp>
-
-#include "llfeaturemanager.h"
-#include "lldir.h"
-
-#include "llsys.h"
-#include "llgl.h"
-#include "llsecondlifeurls.h"
-
-#include "llappviewer.h"
-#include "llhttpclient.h"
-#include "llnotificationsutil.h"
-#include "llviewercontrol.h"
-#include "llworld.h"
-#include "lldrawpoolterrain.h"
-#include "llviewertexturelist.h"
-#include "llversioninfo.h"
-#include "llwindow.h"
-#include "llui.h"
-#include "llcontrol.h"
-#include "llboost.h"
-#include "llweb.h"
-
-#if LL_WINDOWS
-#include "lldxhardware.h"
-#endif
-
-
-#if LL_DARWIN
-const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
-#elif LL_LINUX
-const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
-#elif LL_SOLARIS
-const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt";
-#else
-const char FEATURE_TABLE_FILENAME[] = "featuretable%s.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable%s.%s.txt";
-#endif
-
-const char GPU_TABLE_FILENAME[] = "gpu_table.txt";
-const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt";
-
-LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level)
-	: mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level)
-{
-}
-
-LLFeatureList::LLFeatureList(const std::string& name)
-	: mName(name)
-{
-}
-
-LLFeatureList::~LLFeatureList()
-{
-}
-
-void LLFeatureList::addFeature(const std::string& name, const BOOL available, const F32 level)
-{
-	if (mFeatures.count(name))
-	{
-		LL_WARNS("RenderInit") << "LLFeatureList::Attempting to add preexisting feature " << name << LL_ENDL;
-	}
-
-	LLFeatureInfo fi(name, available, level);
-	mFeatures[name] = fi;
-}
-
-BOOL LLFeatureList::isFeatureAvailable(const std::string& name)
-{
-	if (mFeatures.count(name))
-	{
-		return mFeatures[name].mAvailable;
-	}
-
-	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
-	
-	// changing this to TRUE so you have to explicitly disable 
-	// something for it to be disabled
-	return TRUE;
-}
-
-F32 LLFeatureList::getRecommendedValue(const std::string& name)
-{
-	if (mFeatures.count(name) && isFeatureAvailable(name))
-	{
-		return mFeatures[name].mRecommendedLevel;
-	}
-
-	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
-	return 0;
-}
-
-BOOL LLFeatureList::maskList(LLFeatureList &mask)
-{
-	//llinfos << "Masking with " << mask.mName << llendl;
-	//
-	// Lookup the specified feature mask, and overlay it on top of the
-	// current feature mask.
-	//
-
-	LLFeatureInfo mask_fi;
-
-	feature_map_t::iterator feature_it;
-	for (feature_it = mask.mFeatures.begin(); feature_it != mask.mFeatures.end(); ++feature_it)
-	{
-		mask_fi = feature_it->second;
-		//
-		// Look for the corresponding feature
-		//
-		if (!mFeatures.count(mask_fi.mName))
-		{
-			LL_WARNS("RenderInit") << "Feature " << mask_fi.mName << " in mask not in top level!" << LL_ENDL;
-			continue;
-		}
-
-		LLFeatureInfo &cur_fi = mFeatures[mask_fi.mName];
-		if (mask_fi.mAvailable && !cur_fi.mAvailable)
-		{
-			LL_WARNS("RenderInit") << "Mask attempting to reenabling disabled feature, ignoring " << cur_fi.mName << LL_ENDL;
-			continue;
-		}
-		cur_fi.mAvailable = mask_fi.mAvailable;
-		cur_fi.mRecommendedLevel = llmin(cur_fi.mRecommendedLevel, mask_fi.mRecommendedLevel);
-		LL_DEBUGS("RenderInit") << "Feature mask " << mask.mName
-				<< " Feature " << mask_fi.mName
-				<< " Mask: " << mask_fi.mRecommendedLevel
-				<< " Now: " << cur_fi.mRecommendedLevel << LL_ENDL;
-	}
-
-	LL_DEBUGS("RenderInit") << "After applying mask " << mask.mName << std::endl;
-		// Will conditionally call dump only if the above message will be logged, thanks 
-		// to it being wrapped by the LL_DEBUGS and LL_ENDL macros.
-		dump();
-	LL_CONT << LL_ENDL;
-
-	return TRUE;
-}
-
-void LLFeatureList::dump()
-{
-	LL_DEBUGS("RenderInit") << "Feature list: " << mName << LL_ENDL;
-	LL_DEBUGS("RenderInit") << "--------------" << LL_ENDL;
-
-	LLFeatureInfo fi;
-	feature_map_t::iterator feature_it;
-	for (feature_it = mFeatures.begin(); feature_it != mFeatures.end(); ++feature_it)
-	{
-		fi = feature_it->second;
-		LL_DEBUGS("RenderInit") << fi.mName << "\t\t" << fi.mAvailable << ":" << fi.mRecommendedLevel << LL_ENDL;
-	}
-	LL_DEBUGS("RenderInit") << LL_ENDL;
-}
-
-LLFeatureList *LLFeatureManager::findMask(const std::string& name)
-{
-	if (mMaskList.count(name))
-	{
-		return mMaskList[name];
-	}
-
-	return NULL;
-}
-
-BOOL LLFeatureManager::maskFeatures(const std::string& name)
-{
-	LLFeatureList *maskp = findMask(name);
-	if (!maskp)
-	{
- 		LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL;
-		return FALSE;
-	}
-	LL_DEBUGS("RenderInit") << "Applying Feature Mask: " << name << LL_ENDL;
-	return maskList(*maskp);
-}
-
-BOOL LLFeatureManager::loadFeatureTables()
-{
-	// *TODO - if I or anyone else adds something else to the skipped list
-	// make this data driven.  Put it in the feature table and parse it
-	// correctly
-	mSkippedFeatures.insert("RenderAnisotropic");
-	mSkippedFeatures.insert("RenderGamma");
-	mSkippedFeatures.insert("RenderVBOEnable");
-	mSkippedFeatures.insert("RenderFogRatio");
-
-	// first table is install with app
-	std::string app_path = gDirUtilp->getAppRODataDir();
-	app_path += gDirUtilp->getDirDelimiter();
-
-	std::string filename;
-	std::string http_filename; 
-#if LL_WINDOWS
-	std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
-	if (os_string.find("Microsoft Windows XP") == 0)
-	{
-		filename = llformat(FEATURE_TABLE_FILENAME, "_xp");
-		http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "_xp", LLVersionInfo::getVersion().c_str());
-	}
-	else
-	{
-		filename = llformat(FEATURE_TABLE_FILENAME, "");
-		http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "", LLVersionInfo::getVersion().c_str());
-	}
-#else
-	filename = FEATURE_TABLE_FILENAME;
-	http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
-#endif
-
-	app_path += filename;
-
-	
-	// second table is downloaded with HTTP
-	std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
-
-	// use HTTP table if it exists
-	std::string path;
-	if (gDirUtilp->fileExists(http_path))
-	{
-		path = http_path;
-	}
-	else
-	{
-		path = app_path;
-	}
-
-	
-	return parseFeatureTable(path);
-}
-
-
-BOOL LLFeatureManager::parseFeatureTable(std::string filename)
-{
-	llinfos << "Looking for feature table in " << filename << llendl;
-
-	llifstream file;
-	std::string name;
-	U32		version;
-	
-	file.open(filename); 	 /*Flawfinder: ignore*/
-
-	if (!file)
-	{
-		LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL;
-		return FALSE;
-	}
-
-	// Check file version
-	file >> name;
-	file >> version;
-	if (name != "version")
-	{
-		LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL;
-		return FALSE;
-	}
-
-	mTableVersion = version;
-
-	LLFeatureList *flp = NULL;
-	while (file >> name)
-	{
-		char buffer[MAX_STRING];		 /*Flawfinder: ignore*/
-		
-		if (name.substr(0,2) == "//")
-		{
-			// This is a comment.
-			file.getline(buffer, MAX_STRING);
-			continue;
-		}
-
-		if (name == "list")
-		{
-			if (flp)
-			{
-				//flp->dump();
-			}
-			// It's a new mask, create it.
-			file >> name;
-			if (mMaskList.count(name))
-			{
-				LL_ERRS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL;
-			}
-
-			flp = new LLFeatureList(name);
-			mMaskList[name] = flp;
-		}
-		else
-		{
-			if (!flp)
-			{
-				LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
-				return FALSE;
-			}
-			S32 available;
-			F32 recommended;
-			file >> available >> recommended;
-			flp->addFeature(name, available, recommended);
-		}
-	}
-	file.close();
-
-	return TRUE;
-}
-
-void LLFeatureManager::loadGPUClass()
-{
-	// defaults
-	mGPUClass = GPU_CLASS_UNKNOWN;
-	mGPUString = gGLManager.getRawGLString();
-	mGPUSupported = FALSE;
-
-	// first table is in the app dir
-	std::string app_path = gDirUtilp->getAppRODataDir();
-	app_path += gDirUtilp->getDirDelimiter();
-	app_path += GPU_TABLE_FILENAME;
-	
-	// second table is downloaded with HTTP
-	std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
-	std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
-
-	// use HTTP table if it exists
-	std::string path;
-	if (gDirUtilp->fileExists(http_path))
-	{
-		path = http_path;
-	}
-	else
-	{
-		path = app_path;
-	}
-
-	parseGPUTable(path);
-}
-
-	
-void LLFeatureManager::parseGPUTable(std::string filename)
-{
-	llifstream file;
-		
-	file.open(filename);
-
-	if (!file)
-	{
-		LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL;
-		return;
-	}
-
-	std::string renderer = gGLManager.getRawGLString();
-	for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i)
-	{
-		*i = tolower(*i);
-	}
-	
-	while (!file.eof())
-	{
-		char buffer[MAX_STRING];		 /*Flawfinder: ignore*/
-		buffer[0] = 0;
-
-		file.getline(buffer, MAX_STRING);
-		
-		if (strlen(buffer) >= 2 && 	 /*Flawfinder: ignore*/
-			buffer[0] == '/' && 
-			buffer[1] == '/')
-		{
-			// This is a comment.
-			continue;
-		}
-
-		if (strlen(buffer) == 0)	 /*Flawfinder: ignore*/
-		{
-			// This is a blank line
-			continue;
-		}
-
-		// setup the tokenizer
-		std::string buf(buffer);
-		std::string cls, label, expr, supported;
-		boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n"));
-		boost_tokenizer::iterator token_iter = tokens.begin();
-
-		// grab the label, pseudo regular expression, and class
-		if(token_iter != tokens.end())
-		{
-			label = *token_iter++;
-		}
-		if(token_iter != tokens.end())
-		{
-			expr = *token_iter++;
-		}
-		if(token_iter != tokens.end())
-		{
-			cls = *token_iter++;
-		}
-		if(token_iter != tokens.end())
-		{
-			supported = *token_iter++;
-		}
-
-		if (label.empty() || expr.empty() || cls.empty() || supported.empty())
-		{
-			continue;
-		}
-	
-		for (U32 i = 0; i < expr.length(); i++)	 /*Flawfinder: ignore*/
-		{
-			expr[i] = tolower(expr[i]);
-		}
-
-		// run the regular expression against the renderer
-		boost::regex re(expr.c_str());
-		if(boost::regex_search(renderer, re))
-		{
-			// if we found it, stop!
-			file.close();
-			LL_INFOS("RenderInit") << "GPU is " << label << llendl;
-			mGPUString = label;
-			mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
-			mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
-			file.close();
-			return;
-		}
-	}
-	file.close();
-
-	LL_WARNS("RenderInit") << "Couldn't match GPU to a class: " << gGLManager.getRawGLString() << LL_ENDL;
-}
-
-// responder saves table into file
-class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder
-{
-public:
-
-	LLHTTPFeatureTableResponder(std::string filename) :
-		mFilename(filename)
-	{
-	}
-
-	
-	virtual void completedRaw(U32 status, const std::string& reason,
-							  const LLChannelDescriptors& channels,
-							  const LLIOPipe::buffer_ptr_t& buffer)
-	{
-		if (isGoodStatus(status))
-		{
-			// write to file
-
-			llinfos << "writing feature table to " << mFilename << llendl;
-			
-			S32 file_size = buffer->countAfter(channels.in(), NULL);
-			if (file_size > 0)
-			{
-				// read from buffer
-				U8* copy_buffer = new U8[file_size];
-				buffer->readAfter(channels.in(), NULL, copy_buffer, file_size);
-
-				// write to file
-				LLAPRFile out(mFilename, LL_APR_WB);
-				out.write(copy_buffer, file_size);
-				out.close();
-			}
-		}
-		
-	}
-	
-private:
-	std::string mFilename;
-};
-
-void fetch_feature_table(std::string table)
-{
-	const std::string base       = gSavedSettings.getString("FeatureManagerHTTPTable");
-
-#if LL_WINDOWS
-	std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
-	std::string filename;
-	if (os_string.find("Microsoft Windows XP") == 0)
-	{
-		filename = llformat(table.c_str(), "_xp", LLVersionInfo::getVersion().c_str());
-	}
-	else
-	{
-		filename = llformat(table.c_str(), "", LLVersionInfo::getVersion().c_str());
-	}
-#else
-	const std::string filename   = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
-#endif
-
-	const std::string url        = base + "/" + filename;
-
-	const std::string path       = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
-
-	llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
-	
-	LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
-}
-
-void fetch_gpu_table(std::string table)
-{
-	const std::string base       = gSavedSettings.getString("FeatureManagerHTTPTable");
-
-	const std::string filename   = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
-
-	const std::string url        = base + "/" + filename;
-
-	const std::string path       = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
-
-	llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
-	
-	LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
-}
-
-// fetch table(s) from a website (S3)
-void LLFeatureManager::fetchHTTPTables()
-{
-	fetch_feature_table(FEATURE_TABLE_VER_FILENAME);
-	fetch_gpu_table(GPU_TABLE_VER_FILENAME);
-}
-
-
-void LLFeatureManager::cleanupFeatureTables()
-{
-	std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
-	mMaskList.clear();
-}
-
-void LLFeatureManager::init()
-{
-	// load the tables
-	loadFeatureTables();
-
-	// get the gpu class
-	loadGPUClass();
-
-	// apply the base masks, so we know if anything is disabled
-	applyBaseMasks();
-}
-
-void LLFeatureManager::applyRecommendedSettings()
-{
-	// apply saved settings
-	// cap the level at 2 (high)
-	S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_2));
-
-	llinfos << "Applying Recommended Features" << llendl;
-
-	setGraphicsLevel(level, false);
-	gSavedSettings.setU32("RenderQualityPerformance", level);
-
-	// now apply the tweaks to draw distance
-	// these are double negatives, because feature masks only work by
-	// downgrading values, so i needed to make a true value go to false
-	// for certain cards, thus the awkward name, "Disregard..."
-	if(!gSavedSettings.getBOOL("Disregard96DefaultDrawDistance"))
-	{
-		gSavedSettings.setF32("RenderFarClip", 96.0f);
-	}
-	else if(!gSavedSettings.getBOOL("Disregard128DefaultDrawDistance"))
-	{
-		gSavedSettings.setF32("RenderFarClip", 128.0f);
-	}
-}
-
-void LLFeatureManager::applyFeatures(bool skipFeatures)
-{
-	// see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt
-
-#ifndef LL_RELEASE_FOR_DOWNLOAD
-	dump();
-#endif
-
-	// scroll through all of these and set their corresponding control value
-	for(feature_map_t::iterator mIt = mFeatures.begin(); 
-		mIt != mFeatures.end(); 
-		++mIt)
-	{
-		// skip features you want to skip
-		// do this for when you don't want to change certain settings
-		if(skipFeatures)
-		{
-			if(mSkippedFeatures.find(mIt->first) != mSkippedFeatures.end())
-			{
-				continue;
-			}
-		}
-
-		// get the control setting
-		LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
-		if(ctrl == NULL)
-		{
-			llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl;
-			continue;
-		}
-
-		// handle all the different types
-		if(ctrl->isType(TYPE_BOOLEAN))
-		{
-			gSavedSettings.setBOOL(mIt->first, (BOOL)getRecommendedValue(mIt->first));
-		}
-		else if (ctrl->isType(TYPE_S32))
-		{
-			gSavedSettings.setS32(mIt->first, (S32)getRecommendedValue(mIt->first));
-		}
-		else if (ctrl->isType(TYPE_U32))
-		{
-			gSavedSettings.setU32(mIt->first, (U32)getRecommendedValue(mIt->first));
-		}
-		else if (ctrl->isType(TYPE_F32))
-		{
-			gSavedSettings.setF32(mIt->first, (F32)getRecommendedValue(mIt->first));
-		}
-		else
-		{
-			llwarns << "AHHH! Control variable is not a numeric type!" << llendl;
-		}
-	}
-}
-
-void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
-{
-	applyBaseMasks();
-
-	switch (level)
-	{
-		case 0:
-			maskFeatures("Low");			
-			break;
-		case 1:
-			maskFeatures("Mid");
-			break;
-		case 2:
-			maskFeatures("High");
-			break;
-		case 3:
-			maskFeatures("Ultra");
-			break;
-		default:
-			maskFeatures("Low");
-			break;
-	}
-
-	applyFeatures(skipFeatures);
-}
-
-void LLFeatureManager::applyBaseMasks()
-{
-	// reapply masks
-	mFeatures.clear();
-
-	LLFeatureList* maskp = findMask("all");
-	if(maskp == NULL)
-	{
-		LL_WARNS("RenderInit") << "AHH! No \"all\" in feature table!" << LL_ENDL;
-		return;
-	}
-
-	mFeatures = maskp->getFeatures();
-
-	// mask class
-	if (mGPUClass >= 0 && mGPUClass < 4)
-	{
-		const char* class_table[] =
-		{
-			"Class0",
-			"Class1",
-			"Class2",
-			"Class3"
-		};
-
-		LL_INFOS("RenderInit") << "Setting GPU Class to " << class_table[mGPUClass] << LL_ENDL;
-		maskFeatures(class_table[mGPUClass]);
-	}
-	else
-	{
-		LL_INFOS("RenderInit") << "Setting GPU Class to Unknown" << LL_ENDL;
-		maskFeatures("Unknown");
-	}
-
-	// now all those wacky ones
-	if (!gGLManager.mHasFragmentShader)
-	{
-		maskFeatures("NoPixelShaders");
-	}
-	if (!gGLManager.mHasVertexShader)
-	{
-		maskFeatures("NoVertexShaders");
-	}
-	if (gGLManager.mIsNVIDIA)
-	{
-		maskFeatures("NVIDIA");
-	}
-	if (gGLManager.mIsGF2or4MX)
-	{
-		maskFeatures("GeForce2");
-	}
-	if (gGLManager.mIsATI)
-	{
-		maskFeatures("ATI");
-	}
-	if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256)
-	{
-		maskFeatures("ATIVramLT256");
-	}
-	if (gGLManager.mATIOldDriver)
-	{
-		maskFeatures("ATIOldDriver");
-	}
-	if (gGLManager.mIsGFFX)
-	{
-		maskFeatures("GeForceFX");
-	}
-	if (gGLManager.mIsIntel)
-	{
-		maskFeatures("Intel");
-	}
-	if (gGLManager.mGLVersion < 1.5f)
-	{
-		maskFeatures("OpenGLPre15");
-	}
-	if (gGLManager.mGLVersion < 3.f)
-	{
-		maskFeatures("OpenGLPre30");
-	}
-
-	// now mask by gpu string
-	// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
-	std::string gpustr = mGPUString;
-	for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter)
-	{
-		if (*iter == ' ')
-		{
-			*iter = '_';
-		}
-	}
-
-	//llinfos << "Masking features from gpu table match: " << gpustr << llendl;
-	maskFeatures(gpustr);
-
-	// now mask cpu type ones
-	if (gSysMemory.getPhysicalMemoryClamped() <= 256*1024*1024)
-	{
-		maskFeatures("RAM256MB");
-	}
-	
-#if LL_SOLARIS && defined(__sparc) 	//  even low MHz SPARCs are fast
-#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here?
-	if (gSysCPU.getMHz() < 800)
-#else
-	if (gSysCPU.getMHz() < 1100)
-#endif
-	{
-		maskFeatures("CPUSlow");
-	}
-
-	if (isSafe())
-	{
-		maskFeatures("safe");
-	}
-}
+/** 
+ * @file llfeaturemanager.cpp
+ * @brief LLFeatureManager class implementation
+ *
+ * $LicenseInfo:firstyear=2003&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/regex.hpp>
+
+#include "llfeaturemanager.h"
+#include "lldir.h"
+
+#include "llsys.h"
+#include "llgl.h"
+#include "llsecondlifeurls.h"
+
+#include "llappviewer.h"
+#include "llhttpclient.h"
+#include "llnotificationsutil.h"
+#include "llviewercontrol.h"
+#include "llworld.h"
+#include "lldrawpoolterrain.h"
+#include "llviewertexturelist.h"
+#include "llversioninfo.h"
+#include "llwindow.h"
+#include "llui.h"
+#include "llcontrol.h"
+#include "llboost.h"
+#include "llweb.h"
+
+#if LL_WINDOWS
+#include "lldxhardware.h"
+#endif
+
+
+#if LL_DARWIN
+const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
+#elif LL_LINUX
+const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
+#elif LL_SOLARIS
+const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt";
+#else
+const char FEATURE_TABLE_FILENAME[] = "featuretable%s.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable%s.%s.txt";
+#endif
+
+const char GPU_TABLE_FILENAME[] = "gpu_table.txt";
+const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt";
+
+LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level)
+	: mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level)
+{
+}
+
+LLFeatureList::LLFeatureList(const std::string& name)
+	: mName(name)
+{
+}
+
+LLFeatureList::~LLFeatureList()
+{
+}
+
+void LLFeatureList::addFeature(const std::string& name, const BOOL available, const F32 level)
+{
+	if (mFeatures.count(name))
+	{
+		LL_WARNS("RenderInit") << "LLFeatureList::Attempting to add preexisting feature " << name << LL_ENDL;
+	}
+
+	LLFeatureInfo fi(name, available, level);
+	mFeatures[name] = fi;
+}
+
+BOOL LLFeatureList::isFeatureAvailable(const std::string& name)
+{
+	if (mFeatures.count(name))
+	{
+		return mFeatures[name].mAvailable;
+	}
+
+	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
+	
+	// changing this to TRUE so you have to explicitly disable 
+	// something for it to be disabled
+	return TRUE;
+}
+
+F32 LLFeatureList::getRecommendedValue(const std::string& name)
+{
+	if (mFeatures.count(name) && isFeatureAvailable(name))
+	{
+		return mFeatures[name].mRecommendedLevel;
+	}
+
+	LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
+	return 0;
+}
+
+BOOL LLFeatureList::maskList(LLFeatureList &mask)
+{
+	//llinfos << "Masking with " << mask.mName << llendl;
+	//
+	// Lookup the specified feature mask, and overlay it on top of the
+	// current feature mask.
+	//
+
+	LLFeatureInfo mask_fi;
+
+	feature_map_t::iterator feature_it;
+	for (feature_it = mask.mFeatures.begin(); feature_it != mask.mFeatures.end(); ++feature_it)
+	{
+		mask_fi = feature_it->second;
+		//
+		// Look for the corresponding feature
+		//
+		if (!mFeatures.count(mask_fi.mName))
+		{
+			LL_WARNS("RenderInit") << "Feature " << mask_fi.mName << " in mask not in top level!" << LL_ENDL;
+			continue;
+		}
+
+		LLFeatureInfo &cur_fi = mFeatures[mask_fi.mName];
+		if (mask_fi.mAvailable && !cur_fi.mAvailable)
+		{
+			LL_WARNS("RenderInit") << "Mask attempting to reenabling disabled feature, ignoring " << cur_fi.mName << LL_ENDL;
+			continue;
+		}
+		cur_fi.mAvailable = mask_fi.mAvailable;
+		cur_fi.mRecommendedLevel = llmin(cur_fi.mRecommendedLevel, mask_fi.mRecommendedLevel);
+		LL_DEBUGS("RenderInit") << "Feature mask " << mask.mName
+				<< " Feature " << mask_fi.mName
+				<< " Mask: " << mask_fi.mRecommendedLevel
+				<< " Now: " << cur_fi.mRecommendedLevel << LL_ENDL;
+	}
+
+	LL_DEBUGS("RenderInit") << "After applying mask " << mask.mName << std::endl;
+		// Will conditionally call dump only if the above message will be logged, thanks 
+		// to it being wrapped by the LL_DEBUGS and LL_ENDL macros.
+		dump();
+	LL_CONT << LL_ENDL;
+
+	return TRUE;
+}
+
+void LLFeatureList::dump()
+{
+	LL_DEBUGS("RenderInit") << "Feature list: " << mName << LL_ENDL;
+	LL_DEBUGS("RenderInit") << "--------------" << LL_ENDL;
+
+	LLFeatureInfo fi;
+	feature_map_t::iterator feature_it;
+	for (feature_it = mFeatures.begin(); feature_it != mFeatures.end(); ++feature_it)
+	{
+		fi = feature_it->second;
+		LL_DEBUGS("RenderInit") << fi.mName << "\t\t" << fi.mAvailable << ":" << fi.mRecommendedLevel << LL_ENDL;
+	}
+	LL_DEBUGS("RenderInit") << LL_ENDL;
+}
+
+LLFeatureList *LLFeatureManager::findMask(const std::string& name)
+{
+	if (mMaskList.count(name))
+	{
+		return mMaskList[name];
+	}
+
+	return NULL;
+}
+
+BOOL LLFeatureManager::maskFeatures(const std::string& name)
+{
+	LLFeatureList *maskp = findMask(name);
+	if (!maskp)
+	{
+ 		LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL;
+		return FALSE;
+	}
+	LL_INFOS("RenderInit") << "Applying GPU Feature list: " << name << LL_ENDL;
+	return maskList(*maskp);
+}
+
+BOOL LLFeatureManager::loadFeatureTables()
+{
+	// *TODO - if I or anyone else adds something else to the skipped list
+	// make this data driven.  Put it in the feature table and parse it
+	// correctly
+	mSkippedFeatures.insert("RenderAnisotropic");
+	mSkippedFeatures.insert("RenderGamma");
+	mSkippedFeatures.insert("RenderVBOEnable");
+	mSkippedFeatures.insert("RenderFogRatio");
+
+	// first table is install with app
+	std::string app_path = gDirUtilp->getAppRODataDir();
+	app_path += gDirUtilp->getDirDelimiter();
+
+	std::string filename;
+	std::string http_filename; 
+#if LL_WINDOWS
+	std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+	if (os_string.find("Microsoft Windows XP") == 0)
+	{
+		filename = llformat(FEATURE_TABLE_FILENAME, "_xp");
+		http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "_xp", LLVersionInfo::getVersion().c_str());
+	}
+	else
+	{
+		filename = llformat(FEATURE_TABLE_FILENAME, "");
+		http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "", LLVersionInfo::getVersion().c_str());
+	}
+#else
+	filename = FEATURE_TABLE_FILENAME;
+	http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+#endif
+
+	app_path += filename;
+
+	
+	// second table is downloaded with HTTP
+	std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
+
+	// use HTTP table if it exists
+	std::string path;
+	if (gDirUtilp->fileExists(http_path))
+	{
+		path = http_path;
+	}
+	else
+	{
+		path = app_path;
+	}
+
+	
+	return parseFeatureTable(path);
+}
+
+
+BOOL LLFeatureManager::parseFeatureTable(std::string filename)
+{
+	llinfos << "Looking for feature table in " << filename << llendl;
+
+	llifstream file;
+	std::string name;
+	U32		version;
+	
+	file.open(filename); 	 /*Flawfinder: ignore*/
+
+	if (!file)
+	{
+		LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL;
+		return FALSE;
+	}
+
+	// Check file version
+	file >> name;
+	file >> version;
+	if (name != "version")
+	{
+		LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL;
+		return FALSE;
+	}
+
+	mTableVersion = version;
+
+	LLFeatureList *flp = NULL;
+	while (file >> name)
+	{
+		char buffer[MAX_STRING];		 /*Flawfinder: ignore*/
+		
+		if (name.substr(0,2) == "//")
+		{
+			// This is a comment.
+			file.getline(buffer, MAX_STRING);
+			continue;
+		}
+
+		if (name == "list")
+		{
+			if (flp)
+			{
+				//flp->dump();
+			}
+			// It's a new mask, create it.
+			file >> name;
+			if (mMaskList.count(name))
+			{
+				LL_ERRS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL;
+			}
+
+			flp = new LLFeatureList(name);
+			mMaskList[name] = flp;
+		}
+		else
+		{
+			if (!flp)
+			{
+				LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
+				return FALSE;
+			}
+			S32 available;
+			F32 recommended;
+			file >> available >> recommended;
+			flp->addFeature(name, available, recommended);
+		}
+	}
+	file.close();
+
+	return TRUE;
+}
+
+void LLFeatureManager::loadGPUClass()
+{
+	// defaults
+	mGPUClass = GPU_CLASS_UNKNOWN;
+	mGPUString = gGLManager.getRawGLString();
+	mGPUSupported = FALSE;
+
+	// first table is in the app dir
+	std::string app_path = gDirUtilp->getAppRODataDir();
+	app_path += gDirUtilp->getDirDelimiter();
+	app_path += GPU_TABLE_FILENAME;
+	
+	// second table is downloaded with HTTP
+	std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+	std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
+
+	// use HTTP table if it exists
+	std::string path;
+	if (gDirUtilp->fileExists(http_path))
+	{
+		path = http_path;
+	}
+	else
+	{
+		path = app_path;
+	}
+
+	parseGPUTable(path);
+}
+
+	
+void LLFeatureManager::parseGPUTable(std::string filename)
+{
+	llifstream file;
+		
+	file.open(filename);
+
+	if (!file)
+	{
+		LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL;
+		return;
+	}
+
+	std::string rawRenderer = gGLManager.getRawGLString();
+	std::string renderer = rawRenderer;
+	for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i)
+	{
+		*i = tolower(*i);
+	}
+
+	bool gpuFound;
+	U32 lineNumber;
+	for (gpuFound = false, lineNumber = 0; !gpuFound && !file.eof(); lineNumber++)
+	{
+		char buffer[MAX_STRING];		 /*Flawfinder: ignore*/
+		buffer[0] = 0;
+
+		file.getline(buffer, MAX_STRING);
+		
+		if (strlen(buffer) >= 2 && 	 /*Flawfinder: ignore*/
+			buffer[0] == '/' && 
+			buffer[1] == '/')
+		{
+			// This is a comment.
+			continue;
+		}
+
+		if (strlen(buffer) == 0)	 /*Flawfinder: ignore*/
+		{
+			// This is a blank line
+			continue;
+		}
+
+		// setup the tokenizer
+		std::string buf(buffer);
+		std::string cls, label, expr, supported;
+		boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n"));
+		boost_tokenizer::iterator token_iter = tokens.begin();
+
+		// grab the label, pseudo regular expression, and class
+		if(token_iter != tokens.end())
+		{
+			label = *token_iter++;
+		}
+		if(token_iter != tokens.end())
+		{
+			expr = *token_iter++;
+		}
+		if(token_iter != tokens.end())
+		{
+			cls = *token_iter++;
+		}
+		if(token_iter != tokens.end())
+		{
+			supported = *token_iter++;
+		}
+
+		if (label.empty() || expr.empty() || cls.empty() || supported.empty())
+		{
+			LL_WARNS("RenderInit") << "invald gpu_table.txt:" << lineNumber << ": '" << buffer << "'" << LL_ENDL;
+			continue;
+		}
+	
+		for (U32 i = 0; i < expr.length(); i++)	 /*Flawfinder: ignore*/
+		{
+			expr[i] = tolower(expr[i]);
+		}
+
+		// run the regular expression against the renderer
+		boost::regex re(expr.c_str());
+		if(boost::regex_search(renderer, re))
+		{
+			// if we found it, stop!
+			gpuFound = true;
+			mGPUString = label;
+			mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
+			mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
+		}
+	}
+	file.close();
+
+	if ( gpuFound )
+	{
+		LL_INFOS("RenderInit") << "GPU '" << rawRenderer << "' recognized as '" << mGPUString << "'" << LL_ENDL;
+		if (!mGPUSupported)
+		{
+			LL_INFOS("RenderInit") << "GPU '" << mGPUString << "' is not supported." << LL_ENDL;
+		}
+	}
+	else
+	{
+		LL_WARNS("RenderInit") << "GPU '" << rawRenderer << "' not recognized" << LL_ENDL;
+	}
+}
+
+// responder saves table into file
+class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder
+{
+public:
+
+	LLHTTPFeatureTableResponder(std::string filename) :
+		mFilename(filename)
+	{
+	}
+
+	
+	virtual void completedRaw(U32 status, const std::string& reason,
+							  const LLChannelDescriptors& channels,
+							  const LLIOPipe::buffer_ptr_t& buffer)
+	{
+		if (isGoodStatus(status))
+		{
+			// write to file
+
+			llinfos << "writing feature table to " << mFilename << llendl;
+			
+			S32 file_size = buffer->countAfter(channels.in(), NULL);
+			if (file_size > 0)
+			{
+				// read from buffer
+				U8* copy_buffer = new U8[file_size];
+				buffer->readAfter(channels.in(), NULL, copy_buffer, file_size);
+
+				// write to file
+				LLAPRFile out(mFilename, LL_APR_WB);
+				out.write(copy_buffer, file_size);
+				out.close();
+			}
+		}
+		
+	}
+	
+private:
+	std::string mFilename;
+};
+
+void fetch_feature_table(std::string table)
+{
+	const std::string base       = gSavedSettings.getString("FeatureManagerHTTPTable");
+
+#if LL_WINDOWS
+	std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+	std::string filename;
+	if (os_string.find("Microsoft Windows XP") == 0)
+	{
+		filename = llformat(table.c_str(), "_xp", LLVersionInfo::getVersion().c_str());
+	}
+	else
+	{
+		filename = llformat(table.c_str(), "", LLVersionInfo::getVersion().c_str());
+	}
+#else
+	const std::string filename   = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
+#endif
+
+	const std::string url        = base + "/" + filename;
+
+	const std::string path       = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
+
+	llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
+	
+	LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
+}
+
+void fetch_gpu_table(std::string table)
+{
+	const std::string base       = gSavedSettings.getString("FeatureManagerHTTPTable");
+
+	const std::string filename   = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
+
+	const std::string url        = base + "/" + filename;
+
+	const std::string path       = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
+
+	llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
+	
+	LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
+}
+
+// fetch table(s) from a website (S3)
+void LLFeatureManager::fetchHTTPTables()
+{
+	fetch_feature_table(FEATURE_TABLE_VER_FILENAME);
+	fetch_gpu_table(GPU_TABLE_VER_FILENAME);
+}
+
+
+void LLFeatureManager::cleanupFeatureTables()
+{
+	std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
+	mMaskList.clear();
+}
+
+void LLFeatureManager::init()
+{
+	// load the tables
+	loadFeatureTables();
+
+	// get the gpu class
+	loadGPUClass();
+
+	// apply the base masks, so we know if anything is disabled
+	applyBaseMasks();
+}
+
+void LLFeatureManager::applyRecommendedSettings()
+{
+	// apply saved settings
+	// cap the level at 2 (high)
+	S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_2));
+
+	llinfos << "Applying Recommended Features" << llendl;
+
+	setGraphicsLevel(level, false);
+	gSavedSettings.setU32("RenderQualityPerformance", level);
+
+	// now apply the tweaks to draw distance
+	// these are double negatives, because feature masks only work by
+	// downgrading values, so i needed to make a true value go to false
+	// for certain cards, thus the awkward name, "Disregard..."
+	if(!gSavedSettings.getBOOL("Disregard96DefaultDrawDistance"))
+	{
+		gSavedSettings.setF32("RenderFarClip", 96.0f);
+	}
+	else if(!gSavedSettings.getBOOL("Disregard128DefaultDrawDistance"))
+	{
+		gSavedSettings.setF32("RenderFarClip", 128.0f);
+	}
+}
+
+void LLFeatureManager::applyFeatures(bool skipFeatures)
+{
+	// see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+	dump();
+#endif
+
+	// scroll through all of these and set their corresponding control value
+	for(feature_map_t::iterator mIt = mFeatures.begin(); 
+		mIt != mFeatures.end(); 
+		++mIt)
+	{
+		// skip features you want to skip
+		// do this for when you don't want to change certain settings
+		if(skipFeatures)
+		{
+			if(mSkippedFeatures.find(mIt->first) != mSkippedFeatures.end())
+			{
+				continue;
+			}
+		}
+
+		// get the control setting
+		LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
+		if(ctrl == NULL)
+		{
+			llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl;
+			continue;
+		}
+
+		// handle all the different types
+		if(ctrl->isType(TYPE_BOOLEAN))
+		{
+			gSavedSettings.setBOOL(mIt->first, (BOOL)getRecommendedValue(mIt->first));
+		}
+		else if (ctrl->isType(TYPE_S32))
+		{
+			gSavedSettings.setS32(mIt->first, (S32)getRecommendedValue(mIt->first));
+		}
+		else if (ctrl->isType(TYPE_U32))
+		{
+			gSavedSettings.setU32(mIt->first, (U32)getRecommendedValue(mIt->first));
+		}
+		else if (ctrl->isType(TYPE_F32))
+		{
+			gSavedSettings.setF32(mIt->first, (F32)getRecommendedValue(mIt->first));
+		}
+		else
+		{
+			llwarns << "AHHH! Control variable is not a numeric type!" << llendl;
+		}
+	}
+}
+
+void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
+{
+	applyBaseMasks();
+
+	switch (level)
+	{
+		case 0:
+			maskFeatures("Low");			
+			break;
+		case 1:
+			maskFeatures("Mid");
+			break;
+		case 2:
+			maskFeatures("High");
+			break;
+		case 3:
+			maskFeatures("Ultra");
+			break;
+		default:
+			maskFeatures("Low");
+			break;
+	}
+
+	applyFeatures(skipFeatures);
+}
+
+void LLFeatureManager::applyBaseMasks()
+{
+	// reapply masks
+	mFeatures.clear();
+
+	LLFeatureList* maskp = findMask("all");
+	if(maskp == NULL)
+	{
+		LL_WARNS("RenderInit") << "AHH! No \"all\" in feature table!" << LL_ENDL;
+		return;
+	}
+
+	mFeatures = maskp->getFeatures();
+
+	// mask class
+	if (mGPUClass >= 0 && mGPUClass < 4)
+	{
+		const char* class_table[] =
+		{
+			"Class0",
+			"Class1",
+			"Class2",
+			"Class3"
+		};
+
+		LL_INFOS("RenderInit") << "Setting GPU Class to " << class_table[mGPUClass] << LL_ENDL;
+		maskFeatures(class_table[mGPUClass]);
+	}
+	else
+	{
+		LL_INFOS("RenderInit") << "Setting GPU Class to Unknown" << LL_ENDL;
+		maskFeatures("Unknown");
+	}
+
+	// now all those wacky ones
+	if (!gGLManager.mHasFragmentShader)
+	{
+		maskFeatures("NoPixelShaders");
+	}
+	if (!gGLManager.mHasVertexShader)
+	{
+		maskFeatures("NoVertexShaders");
+	}
+	if (gGLManager.mIsNVIDIA)
+	{
+		maskFeatures("NVIDIA");
+	}
+	if (gGLManager.mIsGF2or4MX)
+	{
+		maskFeatures("GeForce2");
+	}
+	if (gGLManager.mIsATI)
+	{
+		maskFeatures("ATI");
+	}
+	if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256)
+	{
+		maskFeatures("ATIVramLT256");
+	}
+	if (gGLManager.mATIOldDriver)
+	{
+		maskFeatures("ATIOldDriver");
+	}
+	if (gGLManager.mIsGFFX)
+	{
+		maskFeatures("GeForceFX");
+	}
+	if (gGLManager.mIsIntel)
+	{
+		maskFeatures("Intel");
+	}
+	if (gGLManager.mGLVersion < 1.5f)
+	{
+		maskFeatures("OpenGLPre15");
+	}
+	if (gGLManager.mGLVersion < 3.f)
+	{
+		maskFeatures("OpenGLPre30");
+	}
+	if (gGLManager.mNumTextureImageUnits <= 8)
+	{
+		maskFeatures("TexUnit8orLess");
+	}
+
+	// now mask by gpu string
+	// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
+	std::string gpustr = mGPUString;
+	for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter)
+	{
+		if (*iter == ' ')
+		{
+			*iter = '_';
+		}
+	}
+
+	//llinfos << "Masking features from gpu table match: " << gpustr << llendl;
+	maskFeatures(gpustr);
+
+	// now mask cpu type ones
+	if (gSysMemory.getPhysicalMemoryClamped() <= 256*1024*1024)
+	{
+		maskFeatures("RAM256MB");
+	}
+	
+#if LL_SOLARIS && defined(__sparc) 	//  even low MHz SPARCs are fast
+#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here?
+	if (gSysCPU.getMHz() < 800)
+#else
+	if (gSysCPU.getMHz() < 1100)
+#endif
+	{
+		maskFeatures("CPUSlow");
+	}
+
+	if (isSafe())
+	{
+		maskFeatures("safe");
+	}
+}
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 2c4153688a2709f1d875333857b8a5f2fa245ed1..a9f52282a502763bc56d92ba684c8c4e8ba2ec2a 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -131,7 +131,7 @@ void LLFirstUse::notMoving(bool enable)
 // static
 void LLFirstUse::viewPopup(bool enable)
 {
-	firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right"));
+//	firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right"));
 }
 
 // static
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 83105ef27cf7c2fe395f77c136ead52480748256..50b19a42218b36689bd31393892a1b870b37de21 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -459,10 +459,18 @@ void LLFloaterBuyLandUI::updateParcelInfo()
 			return;
 		}
 
-		if (!authorizedBuyer.isNull()  &&  buyer != authorizedBuyer)
+		if (!authorizedBuyer.isNull() && buyer != authorizedBuyer)
 		{
-			mCannotBuyReason = getString("set_to_sell_to_other");
-			return;
+			// Maybe the parcel is set for sale to a group we are in.
+			bool authorized_group =
+				gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_DEED)
+				&& gAgent.hasPowerInGroup(authorizedBuyer,GP_LAND_SET_SALE_INFO);
+
+			if (!authorized_group)
+			{
+				mCannotBuyReason = getString("set_to_sell_to_other");
+				return;
+			}
 		}
 	}
 	else
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 7be4ebc6908406a5904c2c1c4392ba18fcc69874..0d0c1f594dca2c7f1fbf450f5bf8186245ce3e10 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -38,6 +38,7 @@
 #include "message.h"
 
 #include "llagent.h"
+#include "llagentaccess.h"
 #include "llbutton.h"
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index a096fb64cdb2b39ebc890f16bc9bfcb98f58edb8..8a70fa24d87d2c319e07c7751478749642f8729b 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -43,11 +43,12 @@ class LLButton;
 class LLCheckBoxCtrl;
 class LLRadioGroup;
 class LLComboBox;
-class LLNameListCtrl;
-class LLSpinCtrl;
 class LLLineEditor;
+class LLMessageSystem;
+class LLNameListCtrl;
 class LLRadioGroup;
 class LLParcelSelectionObserver;
+class LLSpinCtrl;
 class LLTabContainer;
 class LLTextBox;
 class LLTextEditor;
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index c66b2255eb9081fd49f7f79a179a77daf3c7d26b..9dd5269a6b4811519a3558bc73d966e2d797a6f6 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -98,12 +98,14 @@
 #include "llvfile.h"
 #include "llvfs.h"
 #include "llcallbacklist.h"
-
+#include "llviewerobjectlist.h"
+#include "llanimationstates.h"
 #include "glod/glod.h"
 
 //static
 S32 LLFloaterModelPreview::sUploadAmount = 10;
 LLFloaterModelPreview* LLFloaterModelPreview::sInstance = NULL;
+std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList;
 
 const S32 PREVIEW_BORDER_WIDTH = 2;
 const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
@@ -111,8 +113,6 @@ const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
 const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
 const S32 PREVIEW_TEXTURE_HEIGHT = 300;
 
-const F32 MAXIMUM_PIVOT_OFFSET = 64.0f;
-
 void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
 
 
@@ -382,12 +382,6 @@ LLFloaterModelPreview::~LLFloaterModelPreview()
 {
 	sInstance = NULL;
 	
-	if ( mModelPreview && mModelPreview->getResetJointFlag() )
-	{		
-		gAgentAvatarp->resetJointPositions();
-	}
-
-	
 	if ( mModelPreview )
 	{
 		delete mModelPreview;
@@ -1087,6 +1081,15 @@ LLModelLoader::LLModelLoader( std::string filename, S32 lod, LLModelPreview* pre
 	{
 		mTrySLM = false;
 	}
+
+	assert_main_thread();
+	sActiveLoaderList.push_back(this) ;
+}
+
+LLModelLoader::~LLModelLoader()
+{
+	assert_main_thread();
+	sActiveLoaderList.remove(this);
 }
 
 void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, BOOL& first_transform)
@@ -1550,14 +1553,14 @@ bool LLModelLoader::doLoadModel()
 						//(which means we have all the joints that are required for an avatar versus
 						//a skinned asset attached to a node in a file that contains an entire skeleton,
 						//but does not use the skeleton).						
-						
+						buildJointToNodeMappingFromScene( root );
 						mPreview->critiqueRigForUploadApplicability( model->mSkinInfo.mJointNames );
 										
 						if ( !missingSkeletonOrScene )
 						{
 							//Set the joint translations on the avatar - if it's a full mapping
 							//The joints are reset in the dtor
-							if ( mPreview->getResetJointFlag() )
+							if ( mPreview->getRigWithSceneParity() )
 							{	
 								std::map<std::string, std::string> :: const_iterator masterJointIt = mJointMap.begin();
 								std::map<std::string, std::string> :: const_iterator masterJointItEnd = mJointMap.end();
@@ -1569,7 +1572,7 @@ bool LLModelLoader::doLoadModel()
 									{
 										//llinfos<<"joint "<<lookingForJoint.c_str()<<llendl;
 										LLMatrix4 jointTransform = mJointList[lookingForJoint];
-										LLJoint* pJoint = gAgentAvatarp->getJoint( lookingForJoint );
+										LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );
 										if ( pJoint )
 										{   
 											pJoint->storeCurrentXform( jointTransform.getTranslation() );												
@@ -1762,12 +1765,6 @@ bool LLModelLoader::doLoadModel()
 
 	processElement(scene);
 	
-	handlePivotPoint( root );
-
-	buildJointToNodeMappingFromScene( root );
-	
-	mPreview->critiqueJointToNodeMappingFromScene();
-
 	return true;
 }
 
@@ -1872,8 +1869,24 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)
 	return true;
 }
 
+//static
+bool LLModelLoader::isAlive(LLModelLoader* loader)
+{
+	if(!loader)
+	{
+		return false ;
+	}
+
+	std::list<LLModelLoader*>::iterator iter = sActiveLoaderList.begin() ;
+	for(; iter != sActiveLoaderList.end() && (*iter) != loader; ++iter) ;
+	
+	return *iter == loader ;
+}
+
 void LLModelLoader::loadModelCallback()
 {
+	assert_main_thread();
+
 	if (mPreview)
 	{
 		mPreview->loadModelCallback(mLod);	
@@ -1884,6 +1897,12 @@ void LLModelLoader::loadModelCallback()
 		apr_sleep(100);
 	}
 
+	//doubel check if "this" is valid before deleting it, in case it is aborted during running.
+	if(!isAlive(this))
+	{
+		return ;
+	}
+
 	//cleanup model loader
 	if (mPreview)
 	{
@@ -1935,55 +1954,14 @@ void LLModelLoader::processJointToNodeMapping( domNode* pNode )
 		}
 	}
 }
-//-----------------------------------------------------------------------------
-// handlePivotPoint()
-//-----------------------------------------------------------------------------
-void LLModelLoader::handlePivotPoint( daeElement* pRoot )
-{
-	//Import an optional pivot point - a pivot point is just a node in the visual scene named "AssetPivot"
-	//If no assetpivot is found then the asset will use the SL default
-	daeElement* pScene = pRoot->getDescendant("visual_scene");
-	if ( pScene )
-	{
-		daeTArray< daeSmartRef<daeElement> > children = pScene->getChildren();
-		S32 childCount = children.getCount();
-		for (S32 i = 0; i < childCount; ++i)
-		{
-			domNode* pNode = daeSafeCast<domNode>(children[i]);
-			if ( pNode && isNodeAPivotPoint( pNode ) )
-			{
-				LLMatrix4 workingTransform;
-				daeSIDResolver nodeResolver( pNode, "./translate" );
-				domTranslate* pTranslate = daeSafeCast<domTranslate>( nodeResolver.getElement() );
-				//Translation via SID was successful
-				//todo#extract via element as well
-				if ( pTranslate )
-				{
-					extractTranslation( pTranslate, workingTransform );
-					LLVector3 pivotTrans = workingTransform.getTranslation();
-					if ( pivotTrans[VX] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VX] < -MAXIMUM_PIVOT_OFFSET || 
-						 pivotTrans[VY] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VY] < -MAXIMUM_PIVOT_OFFSET || 
-						 pivotTrans[VZ] > MAXIMUM_PIVOT_OFFSET || pivotTrans[VZ] < -MAXIMUM_PIVOT_OFFSET ) 
-					{
-						llwarns<<"Asset Pivot Node contains an offset that is too large - values should be within (-"<<MAXIMUM_PIVOT_OFFSET<<","<<MAXIMUM_PIVOT_OFFSET<<")."<<llendl;
-						mPreview->setHasPivot( false );
-					}
-					else
-					{
-						mPreview->setModelPivot( pivotTrans );
-						mPreview->setHasPivot( true );					
-					}
-				}					
-			}
-		}
-	} 
-}
 
 //-----------------------------------------------------------------------------
 // critiqueRigForUploadApplicability()
 //-----------------------------------------------------------------------------
 void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset )
 {
+	critiqueJointToNodeMappingFromScene();
+	
 	//Determines the following use cases for a rig:
 	//1. It is suitable for upload with skin weights & joint positions, or
 	//2. It is suitable for upload as standard av with just skin weights
@@ -2002,7 +1980,7 @@ void LLModelPreview::critiqueRigForUploadApplicability( const std::vector<std::s
 		setLegacyRigValid( true );
 	}
 
-	if ( isJointPositionUploadOK )
+	if ( getRigWithSceneParity() && isJointPositionUploadOK )
 	{
 		setResetJointFlag( true );
 	}
@@ -2046,12 +2024,11 @@ void LLModelPreview::critiqueJointToNodeMappingFromScene( void  )
 	if ( result )
 	{		
 		setResetJointFlag( true );
-		//llinfos<<"Full"<<llendl;
+		setRigWithSceneParity( true );
 	}
 	else
 	{
 		setResetJointFlag( false );
-		//llinfos<<"Partial"<<llendl;
 	}	
 }
 //-----------------------------------------------------------------------------
@@ -2176,27 +2153,7 @@ bool LLModelLoader::isNodeAJoint( domNode* pNode )
 
 	return false;
 }
-//-----------------------------------------------------------------------------
-// isNodeAPivotPoint()
-//-----------------------------------------------------------------------------
-bool LLModelLoader::isNodeAPivotPoint( domNode* pNode )
-{
-	bool result = false;
-	
-	if ( pNode && pNode->getName() )
-	{
-		std::string name = pNode->getName();
-		if ( name == "AssetPivot" )
-		{
-			result = true;
-		}
-		else
-		{
-			result = false;
-		}
-	}	
-	return result;
-}
+
 //-----------------------------------------------------------------------------
 // extractTranslation()
 //-----------------------------------------------------------------------------
@@ -2618,6 +2575,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 , mLegacyRigValid( false )
 , mRigValidJointUpload( false )
 , mResetJoints( false )
+, mRigParityWithScene( false )
 , mLastJointUpdate( false )
 {
 	mNeedsUpdate = TRUE;
@@ -2634,6 +2592,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 	mLoading = false;
 	mLoadState = LLModelLoader::STARTING;
 	mGroup = 0;
+	mLODFrozen = false;
 	mBuildShareTolerance = 0.f;
 	mBuildQueueMode = GLOD_QUEUE_GREEDY;
 	mBuildBorderMode = GLOD_BORDER_UNLOCK;
@@ -2642,6 +2601,13 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 	for (U32 i = 0; i < LLModel::NUM_LODS; ++i)
 	{
 		mRequestedTriangleCount[i] = 0;
+		mRequestedCreaseAngle[i] = -1.f;
+		mRequestedLoDMode[i] = 0;
+		mRequestedErrorThreshold[i] = 0.f;
+		mRequestedBuildOperator[i] = 0;
+		mRequestedQueueMode[i] = 0;
+		mRequestedBorderMode[i] = 0;
+		mRequestedShareTolerance[i] = 0.f;
 	}
 
 	mViewOption["show_textures"] = false;
@@ -2686,6 +2652,8 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
 	mMasterLegacyJointList.push_front("mHipLeft");
 	mMasterLegacyJointList.push_front("mKneeLeft");
 	mMasterLegacyJointList.push_front("mFootLeft");
+
+	createPreviewAvatar();
 }
 
 LLModelPreview::~LLModelPreview()
@@ -2693,7 +2661,7 @@ LLModelPreview::~LLModelPreview()
 	if (mModelLoader)
 	{
 		delete mModelLoader;
-		mModelLoader->mPreview = NULL;
+		mModelLoader = NULL;
 	}
 	//*HACK : *TODO : turn this back on when we understand why this crashes
 	//glodShutdown();
@@ -2739,7 +2707,7 @@ U32 LLModelPreview::calcResourceCost()
 	
 	if ( mFMP && mFMP->childGetValue("upload_joints").asBoolean() )
 	{
-		gAgentAvatarp->setPelvisOffset( mPelvisZOffset );
+		getPreviewAvatar()->setPelvisOffset( mPelvisZOffset );
 	}
 
 	F32 streaming_cost = 0.f;
@@ -2822,27 +2790,6 @@ void LLFloaterModelPreview::setDetails(F32 x, F32 y, F32 z, F32 streaming_cost,
 	childSetTextArg("physics cost", "[COST]", llformat("%.3f", physics_cost));	
 }
 
-void LLModelPreview::alterModelsPivot( void )
-{
-	for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter)
-	{
-		if ( *iter )
-		{
-			(*iter)->offsetMesh( mModelPivot );
-		}
-	}
-	
-	for ( int i=0;i<LLModel::NUM_LODS;++i )
-	{
-		for (LLModelLoader::model_list::iterator iter = mModel[i].begin(); iter != mModel[i].end(); ++iter)
-		{
-			if ( *iter )
-			{
-				(*iter)->offsetMesh( mModelPivot );
-			}
-		}
-	}
-}
 
 void LLModelPreview::rebuildUploadData()
 {
@@ -3305,6 +3252,8 @@ void LLModelPreview::generateNormals()
 
 	F32 angle_cutoff = mFMP->childGetValue("crease_angle").asReal();
 
+	mRequestedCreaseAngle[which_lod] = angle_cutoff;
+
 	angle_cutoff *= DEG_TO_RAD;
 
 	if (which_lod == 3 && !mBaseModel.empty())
@@ -3324,7 +3273,7 @@ void LLModelPreview::generateNormals()
 
 	mVertexBuffer[which_lod].clear();
 	refresh();
-
+	updateStatusMessages();
 }
 
 void LLModelPreview::clearMaterials()
@@ -3400,6 +3349,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 	{
 		lod_mode = iface->getFirstSelectedIndex();
 	}
+	mRequestedLoDMode[mPreviewLOD] = lod_mode;
 
 	F32 lod_error_threshold = mFMP->childGetValue("lod_error_threshold").asReal();
 
@@ -3423,6 +3373,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 	{
 		build_operator = iface->getFirstSelectedIndex();
 	}
+	mRequestedBuildOperator[mPreviewLOD] = build_operator; 
 
 	if (build_operator == 0)
 	{
@@ -3439,6 +3390,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 	{
 		queue_mode = iface->getFirstSelectedIndex();
 	}
+	mRequestedQueueMode[mPreviewLOD] = queue_mode;
 
 	if (queue_mode == 0)
 	{
@@ -3460,6 +3412,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 	{
 		border_mode = iface->getFirstSelectedIndex();
 	}
+	mRequestedBorderMode[mPreviewLOD] = border_mode;
 
 	if (border_mode == 0)
 	{
@@ -3495,6 +3448,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 		mBuildShareTolerance = share_tolerance;
 		object_dirty = true;
 	}
+	mRequestedShareTolerance[mPreviewLOD] = share_tolerance;
 
 	if (mGroup == 0)
 	{
@@ -3603,6 +3557,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 		U32 submeshes = 0;
 
 		mRequestedTriangleCount[lod] = triangle_count;
+		mRequestedErrorThreshold[lod] = lod_error_threshold;
 
 		glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode);
 		stop_gloderror();
@@ -3613,21 +3568,19 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
 		glodGroupParameterf(mGroup, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, lod_error_threshold);
 		stop_gloderror();
 
-		glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0);
-		stop_gloderror();
-
-		glodAdaptGroup(mGroup);
-		stop_gloderror();
-
-		if (lod_mode == GLOD_TRIANGLE_BUDGET)
-		{ //SH-632 Always adapt to 0 before adapting to actual desired amount, and always
-			//add 1 to desired amount to avoid decimating below desired amount
+		if (lod_mode != GLOD_TRIANGLE_BUDGET)
+		{ 			
+			glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, 0);
+		}
+		else
+		{
+			//SH-632: always add 1 to desired amount to avoid decimating below desired amount
 			glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, triangle_count+1);
-			stop_gloderror();
-
-			glodAdaptGroup(mGroup);
-			stop_gloderror();
 		}
+			
+		stop_gloderror();
+		glodAdaptGroup(mGroup);
+		stop_gloderror();		
 
 		for (U32 mdl_idx = 0; mdl_idx < mBaseModel.size(); ++mdl_idx)
 		{
@@ -3892,6 +3845,18 @@ void LLModelPreview::updateStatusMessages()
 		}
 	}
 
+
+	//make sure no hulls have more than 256 points in them
+	for (U32 i = 0; upload_ok && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
+	{
+		LLModel* mdl = mModel[LLModel::LOD_PHYSICS][i];
+
+		for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j)
+		{
+			upload_ok = upload_ok && mdl->mPhysics.mHull[i].size() <= 256;
+		}
+	}
+
 	bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
 
 	bool skinAndRigOk = true;
@@ -3915,6 +3880,10 @@ void LLModelPreview::updateStatusMessages()
 	{
 		mFMP->childEnable("ok_btn");
 	}
+	else
+	{
+		mFMP->childDisable("ok_btn");
+	}
 	
 	//add up physics triangles etc
 	S32 start = 0;
@@ -4081,6 +4050,9 @@ void LLModelPreview::updateStatusMessages()
 		{	// auto generate, also the default case for wizard which has no radio selection
 			fmp->mLODMode[mPreviewLOD] = 1;
 
+			//don't actually regenerate lod when refreshing UI
+			mLODFrozen = true;
+
 			for (U32 i = 0; i < num_file_controls; ++i)
 			{
 				mFMP->childDisable(file_controls[i]);
@@ -4093,20 +4065,21 @@ void LLModelPreview::updateStatusMessages()
 
 			//if (threshold)
 			{	
-				U32 lod_mode = 0;
-				LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode");
-				if (iface)
-				{
-					lod_mode = iface->getFirstSelectedIndex();
-				}
-
 				LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold");
 				LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit");
 
 				limit->setMaxValue(mMaxTriangleLimit);
-				limit->setValue(mRequestedTriangleCount[mPreviewLOD]);
+				limit->forceSetValue(mRequestedTriangleCount[mPreviewLOD]);
+
+				threshold->forceSetValue(mRequestedErrorThreshold[mPreviewLOD]);
+
+				mFMP->getChild<LLComboBox>("lod_mode")->selectNthItem(mRequestedLoDMode[mPreviewLOD]);
+				mFMP->getChild<LLComboBox>("build_operator")->selectNthItem(mRequestedBuildOperator[mPreviewLOD]);
+				mFMP->getChild<LLComboBox>("queue_mode")->selectNthItem(mRequestedQueueMode[mPreviewLOD]);
+				mFMP->getChild<LLComboBox>("border_mode")->selectNthItem(mRequestedBorderMode[mPreviewLOD]);
+				mFMP->getChild<LLSpinCtrl>("share_tolerance")->setValue(mRequestedShareTolerance[mPreviewLOD]);
 
-				if (lod_mode == 0)
+				if (mRequestedLoDMode[mPreviewLOD] == 0)
 				{
 					limit->setVisible(true);
 					threshold->setVisible(false);
@@ -4120,6 +4093,8 @@ void LLModelPreview::updateStatusMessages()
 					threshold->setVisible(true);
 				}
 			}
+
+			mLODFrozen = false;
 		}
 	}
 
@@ -4135,6 +4110,20 @@ void LLModelPreview::updateStatusMessages()
 		mFMP->childDisable("physics_file");
 		mFMP->childDisable("physics_browse");
 	}
+
+	LLSpinCtrl* crease = mFMP->getChild<LLSpinCtrl>("crease_angle");
+	
+	if (mRequestedCreaseAngle[mPreviewLOD] == -1.f)
+	{
+		mFMP->childSetColor("crease_label", LLColor4::grey);
+		crease->forceSetValue(75.f);
+	}
+	else
+	{
+		mFMP->childSetColor("crease_label", LLColor4::white);
+		crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]);
+	}
+
 }
 
 void LLModelPreview::setPreviewTarget(F32 distance)
@@ -4301,42 +4290,6 @@ void LLModelPreview::update()
 
 }
 //-----------------------------------------------------------------------------
-// changeAvatarsJointPositions()
-//-----------------------------------------------------------------------------
-void LLModelPreview::changeAvatarsJointPositions( LLModel* pModel )
-{
-	if ( mMasterJointList.empty() )
-	{
-		return;
-	}
-
-	std::vector<std::string> :: const_iterator jointListItBegin = pModel->mSkinInfo.mJointNames.begin();
-	std::vector<std::string> :: const_iterator jointListItEnd = pModel->mSkinInfo.mJointNames.end();
-
-	S32 index = 0;
-	for ( ; jointListItBegin!=jointListItEnd; ++jointListItBegin, ++index )
-	{	
-		std::string elem = *jointListItBegin;
-		//llinfos<<"joint "<<elem<<llendl;
-
-		S32 matrixCnt = pModel->mSkinInfo.mAlternateBindMatrix.size();
-		if ( matrixCnt < 1 )
-		{
-			llinfos<<"Total WTF moment :"<<matrixCnt<<llendl;
-		}
-		else
-		{
-			LLMatrix4 jointTransform = pModel->mSkinInfo.mAlternateBindMatrix[index];
-
-			LLJoint* pJoint = gAgentAvatarp->getJoint( elem );
-			if ( pJoint )
-			{   
-				pJoint->storeCurrentXform( jointTransform.getTranslation() );												
-			}	
-		}
-	}
-}
-//-----------------------------------------------------------------------------
 // getTranslationForJointOffset()
 //-----------------------------------------------------------------------------
 LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
@@ -4349,6 +4302,30 @@ LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
 	}
 	return LLVector3(0.0f,0.0f,0.0f);								
 }
+//-----------------------------------------------------------------------------
+// createPreviewAvatar
+//-----------------------------------------------------------------------------
+void LLModelPreview::createPreviewAvatar( void )
+{
+	mPreviewAvatar = (LLVOAvatar*)gObjectList.createObjectViewer( LL_PCODE_LEGACY_AVATAR, gAgent.getRegion() );
+	if ( mPreviewAvatar )
+	{
+		mPreviewAvatar->createDrawable( &gPipeline );
+		mPreviewAvatar->mIsDummy = TRUE;
+		mPreviewAvatar->mSpecialRenderMode = 1;
+		mPreviewAvatar->setPositionAgent( LLVector3::zero );
+		mPreviewAvatar->slamPosition();
+		mPreviewAvatar->updateJointLODs();
+		mPreviewAvatar->updateGeometry( mPreviewAvatar->mDrawable );
+		mPreviewAvatar->startMotion( ANIM_AGENT_STAND );
+		mPreviewAvatar->hideSkirt();
+	}
+	else
+	{
+		llinfos<<"Failed to create preview avatar for upload model window"<<llendl;
+	}
+}
+
 //-----------------------------------------------------------------------------
 // render()
 //-----------------------------------------------------------------------------
@@ -4463,25 +4440,6 @@ BOOL LLModelPreview::render()
 	
 	mFMP->childSetEnabled("upload_joints", upload_skin);
 
-	//poke at avatar when we upload custom joints
-	/*	
-	if ( upload_joints )
-	{
-		for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
-		{
-			for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
-			{
-				LLModelInstance& instance = *model_iter;
-				LLModel* model = instance.mModel;
-				if ( !model->mSkinWeights.empty() )
-				{
-					changeAvatarsJointPositions( model );
-				}
-			}
-		}
-	}
-	*/
-	
 	F32 explode = mFMP->childGetValue("physics_explode").asReal();
 
 	glClear(GL_DEPTH_BUFFER_BIT);
@@ -4501,7 +4459,7 @@ BOOL LLModelPreview::render()
 
 	if (skin_weight)
 	{
-		target_pos = gAgentAvatarp->getPositionAgent();
+		target_pos = getPreviewAvatar()->getPositionAgent();
 		z_near = 0.01f;
 		z_far = 1024.f;
 		mCameraDistance = 16.f;
@@ -4721,8 +4679,7 @@ BOOL LLModelPreview::render()
 		}
 		else
 		{
-			LLVOAvatarSelf* avatar = gAgentAvatarp;
-			target_pos = avatar->getPositionAgent();
+			target_pos = getPreviewAvatar()->getPositionAgent();
 
 			LLViewerCamera::getInstance()->setOriginAndLookAt(
 															  target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot),		// camera
@@ -4731,7 +4688,7 @@ BOOL LLModelPreview::render()
 
 			if (joint_positions)
 			{
-				avatar->renderCollisionVolumes();
+				getPreviewAvatar()->renderCollisionVolumes();
 			}
 
 			for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
@@ -4762,7 +4719,7 @@ BOOL LLModelPreview::render()
 							LLMatrix4 mat[64];
 							for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
 							{
-								LLJoint* joint = avatar->getJoint(model->mSkinInfo.mJointNames[j]);
+								LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]);
 								if (joint)
 								{
 									mat[j] = model->mSkinInfo.mInvBindMatrix[j];
@@ -4943,11 +4900,6 @@ void LLFloaterModelPreview::onUpload(void* user_data)
 
 	LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data;
 
-	if ( mp && mp->mModelPreview->mHasPivot )
-	{
-		mp->mModelPreview->alterModelsPivot();
-	}
-	
 	mp->mModelPreview->rebuildUploadData();
 
 	bool upload_skinweights = mp->childGetValue("upload_skin").asBoolean();
@@ -4990,9 +4942,12 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture
 
 void LLModelPreview::onLODParamCommit(bool enforce_tri_limit)
 {
-	genLODs(mPreviewLOD, 3, enforce_tri_limit);
-	updateStatusMessages();
-	refresh();
+	if (!mLODFrozen)
+	{
+		genLODs(mPreviewLOD, 3, enforce_tri_limit);
+		updateStatusMessages();
+		refresh();
+	}
 }
 
 LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl)
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index 186bf114d1b26f6cdcc5d91d87753e8c7defeca9..f6d4a08d1f2af2cb53f5e28b680c7544db2bbf5e 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -80,7 +80,7 @@ class LLModelLoader : public LLThread
 	BOOL mFirstTransform;
 	LLVector3 mExtents[2];
 	bool mTrySLM;
-
+	
 	std::map<daeElement*, LLPointer<LLModel> > mModel;
 	
 	typedef std::vector<LLPointer<LLModel> > model_list;
@@ -99,6 +99,8 @@ class LLModelLoader : public LLThread
 
 	LLModelLoader( std::string filename, S32 lod, LLModelPreview* preview, JointTransformMap& jointMap, 
 				   std::deque<std::string>& jointsFromNodes );
+	~LLModelLoader() ;
+
 	virtual void run();
 	bool doLoadModel();
 	bool loadFromSLM(const std::string& filename);
@@ -118,9 +120,6 @@ class LLModelLoader : public LLThread
 	void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform );
 	void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform );
 	
-	void handlePivotPoint( daeElement* pRoot );
-	bool isNodeAPivotPoint( domNode* pNode );
-	
 	void setLoadState(U32 state);
 
 	void buildJointToNodeMappingFromScene( daeElement* pRoot );
@@ -131,6 +130,10 @@ class LLModelLoader : public LLThread
 	std::map<std::string, std::string> mJointMap;
 	JointTransformMap& mJointList;	
 	std::deque<std::string>& mJointsFromNode;
+
+private:
+	static std::list<LLModelLoader*> sActiveLoaderList;
+	static bool isAlive(LLModelLoader* loader) ;
 };
 
 class LLFloaterModelPreview : public LLFloater
@@ -292,7 +295,6 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	void loadModelCallback(S32 lod);
 	void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
 	void generateNormals();
-	void alterModelsPivot( void );
 	void clearMaterials();
 	U32 calcResourceCost();
 	void rebuildUploadData();
@@ -331,12 +333,17 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	
 	void setLoadState( U32 state ) { mLoadState = state; }
 	U32 getLoadState() { return mLoadState; }
-		
-	void setResetJointFlag( bool state ) { mResetJoints = state; }
-	bool getResetJointFlag( void ) { return mResetJoints; }
-
+	//setRestJointFlag: If an asset comes through that changes the joints, we want the reset to persist
+	void setResetJointFlag( bool state ) { if ( !mResetJoints ) mResetJoints = state; }
+	const bool getResetJointFlag( void ) const { return mResetJoints; }
+	void setRigWithSceneParity( bool state ) { mRigParityWithScene = state; }
+	const bool getRigWithSceneParity( void ) const { return mRigParityWithScene; }
+	
 	LLVector3 getTranslationForJointOffset( std::string joint );
 
+	void		createPreviewAvatar( void );
+	LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
+
  protected:
 	friend class LLModelLoader;
 	friend class LLFloaterModelPreview;
@@ -364,16 +371,25 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	bool		mLoading;
 	U32			mLoadState;
 	bool		mResetJoints;
+	bool		mRigParityWithScene;
+	
 	std::map<std::string, bool> mViewOption;
 
 	//GLOD object parameters (must rebuild object if these change)
+	bool mLODFrozen;
 	F32 mBuildShareTolerance;
 	U32 mBuildQueueMode;
 	U32 mBuildOperator;
 	U32 mBuildBorderMode;
+	U32 mRequestedLoDMode[LLModel::NUM_LODS];
 	S32 mRequestedTriangleCount[LLModel::NUM_LODS];
+	F32 mRequestedErrorThreshold[LLModel::NUM_LODS];
+	U32 mRequestedBuildOperator[LLModel::NUM_LODS];
+	U32 mRequestedQueueMode[LLModel::NUM_LODS];
+	U32 mRequestedBorderMode[LLModel::NUM_LODS];
+	F32 mRequestedShareTolerance[LLModel::NUM_LODS];
+	F32 mRequestedCreaseAngle[LLModel::NUM_LODS];
 
-	
 	LLModelLoader* mModelLoader;
 
 	LLModelLoader::scene mScene[LLModel::NUM_LODS];
@@ -409,6 +425,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	std::deque<std::string> mMasterLegacyJointList;
 	std::deque<std::string> mJointsFromNode;
 	JointTransformMap		mJointTransformMap;
+	LLPointer<LLVOAvatar>	mPreviewAvatar;
 };
 
 #endif  // LL_LLFLOATERMODELPREVIEW_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 18b7a48d7bdde443c33932cacd34cf8cde78d756..4b15695cbf6eca93c8a0ff42f127e8732804273a 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -987,9 +987,15 @@ void LLFloaterPreference::refreshEnabledState()
 	LLCheckBoxCtrl* ctrl_avatar_vp = getChild<LLCheckBoxCtrl>("AvatarVertexProgram");
 	// Avatar Render Mode
 	LLCheckBoxCtrl* ctrl_avatar_cloth = getChild<LLCheckBoxCtrl>("AvatarCloth");
+	
+	bool avatar_vp_enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP");
+	if (LLViewerShaderMgr::sInitialized)
+	{
+		S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
+		avatar_vp_enabled = (max_avatar_shader > 0) ? TRUE : FALSE;
+	}
 
-	S32 max_avatar_shader = LLViewerShaderMgr::instance()->mMaxAvatarShaderLevel;
-	ctrl_avatar_vp->setEnabled((max_avatar_shader > 0) ? TRUE : FALSE);
+	ctrl_avatar_vp->setEnabled(avatar_vp_enabled);
 	
 	if (gSavedSettings.getBOOL("VertexShaderEnable") == FALSE || 
 		gSavedSettings.getBOOL("RenderAvatarVP") == FALSE)
@@ -1006,7 +1012,7 @@ void LLFloaterPreference::refreshEnabledState()
 	LLCheckBoxCtrl* ctrl_shader_enable   = getChild<LLCheckBoxCtrl>("BasicShaders");
 	// radio set for terrain detail mode
 	LLRadioGroup*   mRadioTerrainDetail = getChild<LLRadioGroup>("TerrainDetailRadio");   // can be linked with control var
-
+	
 	ctrl_shader_enable->setEnabled(LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable"));
 	
 	BOOL shaders = ctrl_shader_enable->get();
diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp
index 94407e6da046ad0b903488d31a6e2cb7b133ff24..9f15e62d84fd6d15f33848965728efcb0312a21d 100644
--- a/indra/newview/llfloatersidetraytab.cpp
+++ b/indra/newview/llfloatersidetraytab.cpp
@@ -47,5 +47,6 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
 
 void LLFloaterSideTrayTab::onClose(bool app_quitting)
 {
-	LLSideTray::getInstance()->setTabDocked(getName(), true);
+	// The floater is already being closed, so don't toggle it once more (that may crash viewer).
+	LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false);
 }
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index add591895bceb2cab6cc7443a667973c5990cbe1..00dc7b1627500a411bb3421ec5d2bbf2b500dac5 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -53,6 +53,7 @@
 #include "llfloaterpostcard.h"
 #include "llcheckboxctrl.h"
 #include "llradiogroup.h"
+#include "llslurl.h"
 #include "lltoolfocus.h"
 #include "lltoolmgr.h"
 #include "llwebsharing.h"
diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9fe7c7f9dd831c3ea69318a12d3740da4919eedb
--- /dev/null
+++ b/indra/newview/llfloatersounddevices.cpp
@@ -0,0 +1,90 @@
+/** 
+ * @file llfloatersounddevices.cpp
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatersounddevices.h"
+
+#include "llbottomtray.h"
+#include "lldraghandle.h"
+
+#include "llpanelvoicedevicesettings.h"
+
+// Library includes
+#include "indra_constants.h"
+
+// protected
+LLFloaterSoundDevices::LLFloaterSoundDevices(const LLSD& key)
+:	LLTransientDockableFloater(NULL, false, key)
+{
+	LLTransientFloaterMgr::getInstance()->addControlView(this);
+
+	// force docked state since this floater doesn't save it between recreations
+	setDocked(true);
+}
+
+LLFloaterSoundDevices::~LLFloaterSoundDevices()
+{
+	LLTransientFloaterMgr::getInstance()->removeControlView(this);
+}
+
+// virtual
+BOOL LLFloaterSoundDevices::postBuild()
+{
+	LLTransientDockableFloater::postBuild();
+		
+	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("flyout_btn");
+	setDockControl(new LLDockControl(anchor_panel, this, getDockTongue(), LLDockControl::TOP));
+
+	setIsChrome(TRUE);
+	if (mDragHandle)
+		mDragHandle->setTitleVisible(TRUE);
+	updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
+
+	LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel");
+	if (panel)
+	{
+		panel->setUseTuningMode(false);
+	}
+	return TRUE;
+}
+
+//virtual
+void LLFloaterSoundDevices::setDocked(bool docked, bool pop_on_undock/* = true*/)
+{
+	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+}
+
+// virtual
+void LLFloaterSoundDevices::setFocus( BOOL b )
+{
+	LLTransientDockableFloater::setFocus(b);
+
+	// Force using active floater transparency
+	// We have to override setFocus() for because selecting an item of the
+	// combobox causes the floater to lose focus and thus become transparent.
+	updateTransparency(TT_ACTIVE);
+}
diff --git a/indra/newview/llfloatersounddevices.h b/indra/newview/llfloatersounddevices.h
new file mode 100644
index 0000000000000000000000000000000000000000..f09ee3b06931004e36bf25ed4f6236c301190a07
--- /dev/null
+++ b/indra/newview/llfloatersounddevices.h
@@ -0,0 +1,49 @@
+/** 
+ * @file llfloatersounddevices.h
+ * @author Leyla Farazha
+ * @brief Sound Preferences used for minimal skin
+ *
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERSOUNDDEVICES_H
+#define LL_LLFLOATERSOUNDDEVICES_H
+
+#include "lltransientdockablefloater.h"
+
+class LLFloaterSoundDevices : public LLTransientDockableFloater
+{
+public:
+
+	LOG_CLASS(LLFloaterSoundDevices);
+
+	LLFloaterSoundDevices(const LLSD& key);
+	~LLFloaterSoundDevices();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+	/*virtual*/ void setFocus( BOOL b );
+};
+
+
+#endif //LL_LLFLOATERSOUNDDEVICES_H
+
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 73c1f99fa04df5f167f70e598e2440589fd596a8..061a42ab571ad824460a863ecef8708df55de9b0 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -85,6 +85,7 @@
 #include "llviewerwindow.h"
 #include "llvovolume.h"
 #include "lluictrlfactory.h"
+#include "llaccountingquotamanager.h"
 
 // Globals
 LLFloaterTools *gFloaterTools = NULL;
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index 0d8601410a1413677a645d24a3143315722f41d0..4c9c4cb154af0c9b515c6d9daac139888cd7750f 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -35,6 +35,7 @@
 #include "llfloateruipreview.h"			// Own header
 
 // Internal utility
+#include "lldiriterator.h"
 #include "lleventtimer.h"
 #include "llexternaleditor.h"
 #include "llrender.h"
@@ -481,9 +482,11 @@ BOOL LLFloaterUIPreview::postBuild()
 	std::string language_directory;
 	std::string xui_dir = get_xui_dir();	// directory containing localizations -- don't forget trailing delim
 	mLanguageSelection->removeall();																				// clear out anything temporarily in list from XML
+
+	LLDirIterator iter(xui_dir, "*");
 	while(found)																									// for every directory
 	{
-		if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory)))							// get next directory
+		if((found = iter.next(language_directory)))							// get next directory
 		{
 			std::string full_path = xui_dir + language_directory;
 			if(LLFile::isfile(full_path.c_str()))																	// if it's not a directory, skip it
@@ -635,42 +638,51 @@ void LLFloaterUIPreview::refreshList()
 	mFileList->clearRows();		// empty list
 	std::string name;
 	BOOL found = TRUE;
+
+	LLDirIterator floater_iter(getLocalizedDirectory(), "floater_*.xml");
 	while(found)				// for every floater file that matches the pattern
 	{
-		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name)))	// get next file matching pattern
+		if((found = floater_iter.next(name)))	// get next file matching pattern
 		{
 			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)
 		}
 	}
 	found = TRUE;
+
+	LLDirIterator inspect_iter(getLocalizedDirectory(), "inspect_*.xml");
 	while(found)				// for every inspector file that matches the pattern
 	{
-		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name)))	// get next file matching pattern
+		if((found = inspect_iter.next(name)))	// get next file matching pattern
 		{
 			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)
 		}
 	}
 	found = TRUE;
+
+	LLDirIterator menu_iter(getLocalizedDirectory(), "menu_*.xml");
 	while(found)				// for every menu file that matches the pattern
 	{
-		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name)))	// get next file matching pattern
+		if((found = menu_iter.next(name)))	// get next file matching pattern
 		{
 			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)
 		}
 	}
 	found = TRUE;
+
+	LLDirIterator panel_iter(getLocalizedDirectory(), "panel_*.xml");
 	while(found)				// for every panel file that matches the pattern
 	{
-		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name)))	// get next file matching pattern
+		if((found = panel_iter.next(name)))	// get next file matching pattern
 		{
 			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)
 		}
 	}
-
 	found = TRUE;
+
+	LLDirIterator sidepanel_iter(getLocalizedDirectory(), "sidepanel_*.xml");
 	while(found)				// for every sidepanel file that matches the pattern
 	{
-		if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name)))	// get next file matching pattern
+		if((found = sidepanel_iter.next(name)))	// get next file matching pattern
 		{
 			addFloaterEntry(name.c_str());	// and add it to the list (file name only; localization code takes care of rest of path)
 		}
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index b3b1ce5743ceb3e5a583038d4f269c8c24488c99..3884b94b60e18a0a2fbf06d7b2860277dd482f51 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -301,18 +301,6 @@ BOOL LLFolderView::canFocusChildren() const
 	return FALSE;
 }
 
-void LLFolderView::checkTreeResortForModelChanged()
-{
-	if (mSortOrder & LLInventoryFilter::SO_DATE && !(mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME))
-	{
-		// This is the case where something got added or removed.  If we are date sorting
-		// everything including folders, then we need to rebuild the whole tree.
-		// Just set to something not SO_DATE to force the folder most resent date resort.
-		mSortOrder = mSortOrder & ~LLInventoryFilter::SO_DATE;
-		setSortOrder(mSortOrder | LLInventoryFilter::SO_DATE);
-	}
-}
-
 static LLFastTimer::DeclareTimer FTM_SORT("Sort Inventory");
 
 void LLFolderView::setSortOrder(U32 order)
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 210ba9eb3ccf22ca0e048d984f932644e0057347..1464a058d8c6cef20e415263502262757b5b9177 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -101,7 +101,6 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
 	// FolderViews default to sort by name.  This will change that,
 	// and resort the items if necessary.
 	void setSortOrder(U32 order);
-	void checkTreeResortForModelChanged();
 	void setFilterPermMask(PermissionMask filter_perm_mask);
 	void setAllowMultiSelect(BOOL allow) { mAllowMultiSelect = allow; }
 	
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 3c36248c1fd0d675d1a6ed32e88259db302d389d..e9d1ad3a9e306e7b6dbe398eb4bd54d0fb66438e 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -1835,7 +1835,7 @@ void LLFolderViewFolder::sortBy(U32 order)
 		return;
 	}
 
-	// Propegate this change to sub folders
+	// Propagate this change to sub folders
 	for (folders_t::iterator iter = mFolders.begin();
 		iter != mFolders.end();)
 	{
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 2006e094a822241648c2a5be69709065f58f4b45..fc941510ab2395382a72a7d6cb1a16eb8422507f 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -28,6 +28,7 @@
 
 #include "llview.h"
 #include "lldarray.h"  // *TODO: Eliminate, forward declare
+#include "lluiimage.h"
 
 class LLFontGL;
 class LLFolderView;
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index f990b9294d6f8aa37c088b716d7f0ec7af4c10be..30858871ec89146ff98eea17f34813298667d469 100644
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -311,6 +311,9 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im
 		std::string full_name;
 		if (gCacheName->getFullName(to_agent, full_name))
 		{
+			// Build a new format username or firstname_lastname for legacy names
+			// to use it for a history log filename.
+			full_name = LLCacheName::buildUsername(full_name);
 			LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im"));
 		}
 	}
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 7c56e610ce5906a61c708431fdd5cab9d6250034..97fa5514417c91f9f63974f33e3a942c58bcf777 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -40,10 +40,12 @@
 #include "llsidetray.h"
 #include "llstatusbar.h"	// can_afford_transaction()
 #include "llimfloater.h"
+#include "groupchatlistener.h"
 
 //
 // Globals
 //
+static GroupChatListener sGroupChatListener;
 
 class LLGroupHandler : public LLCommandHandler
 {
@@ -320,10 +322,9 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
 
 
 // static
-void LLGroupActions::startIM(const LLUUID& group_id)
+LLUUID LLGroupActions::startIM(const LLUUID& group_id)
 {
-	if (group_id.isNull())
-		return;
+	if (group_id.isNull()) return LLUUID::null;
 
 	LLGroupData group_data;
 	if (gAgent.getGroupData(group_id, group_data))
@@ -337,12 +338,14 @@ void LLGroupActions::startIM(const LLUUID& group_id)
 			LLIMFloater::show(session_id);
 		}
 		make_ui_sound("UISndStartIM");
+		return session_id;
 	}
 	else
 	{
 		// this should never happen, as starting a group IM session
 		// relies on you belonging to the group and hence having the group data
 		make_ui_sound("UISndInvalidOp");
+		return LLUUID::null;
 	}
 }
 
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index c52a25818b76bfc7c2e8a717f23d2c5a43ee6c13..3f9852f194550d302aa2db12c2002c431c50412f 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -87,7 +87,7 @@ class LLGroupActions
 	/**
 	 * Start group instant messaging session.
 	 */
-	static void startIM(const LLUUID& group_id);
+	static LLUUID startIM(const LLUUID& group_id);
 
 	/**
 	 * End group instant messaging session.
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index ec3fe481511cc3afb491c1cd3ae48761238f6f80..4de69765343f56bd2fcc1238bf4f23494e715358 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -195,7 +195,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	// set P2P type by default
 	mSessionType = P2P_SESSION;
 
-	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
+	if (IM_NOTHING_SPECIAL == mType || IM_SESSION_P2P_INVITE == mType)
 	{
 		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
 		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
@@ -249,7 +249,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 		new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT);
 	}
 
-	if (IM_NOTHING_SPECIAL == type)
+	if (IM_NOTHING_SPECIAL == mType)
 	{
 		mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
 		mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
@@ -269,10 +269,10 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	// Localizing name of ad-hoc session. STORM-153
 	// Changing name should happen here- after the history file was created, so that
 	// history files have consistent (English) names in different locales.
-	if (isAdHocSessionType() && IM_SESSION_INVITE == type)
+	if (isAdHocSessionType() && IM_SESSION_INVITE == mType)
 	{
-		LLAvatarNameCache::get(mOtherParticipantID, 
-							   boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache, 
+		LLAvatarNameCache::get(mOtherParticipantID,
+							   boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache,
 							   this, _2));
 	}
 }
@@ -553,23 +553,10 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
 	return !mOtherParticipantIsAvatar;
 }
 
-void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name)
-{
-	if (av_name.mUsername.empty())
-	{
-		// display names is off, use mDisplayName which will be the legacy name
-		mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName);
-	}
-	else
-	{  
-		mHistoryFileName = av_name.mUsername;
-	}
-}
-
 void LLIMModel::LLIMSession::buildHistoryFileName()
 {
 	mHistoryFileName = mName;
-	
+
 	//ad-hoc requires sophisticated chat history saving schemes
 	if (isAdHoc())
 	{
@@ -583,17 +570,35 @@ void LLIMModel::LLIMSession::buildHistoryFileName()
 		{
 			std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end());
 			mHistoryFileName = mName + " hash" + generateHash(sorted_uuids);
-			return;
 		}
-		
-		//in case of incoming ad-hoc sessions
-		mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
+		else
+		{
+			//in case of incoming ad-hoc sessions
+			mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4);
+		}
 	}
-
-	// look up username to use as the log name
-	if (isP2P())
+	else if (isP2P()) // look up username to use as the log name
 	{
-		LLAvatarNameCache::get(mOtherParticipantID, boost::bind(&LLIMModel::LLIMSession::onAvatarNameCache, this, _1, _2));
+		LLAvatarName av_name;
+		// For outgoing sessions we already have a cached name
+		// so no need for a callback in LLAvatarNameCache::get()
+		if (LLAvatarNameCache::get(mOtherParticipantID, &av_name))
+		{
+			if (av_name.mUsername.empty())
+			{
+				// Display names are off, use mDisplayName which will be the legacy name
+				mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName);
+			}
+			else
+			{
+				mHistoryFileName =  av_name.mUsername;
+			}
+		}
+		else
+		{
+			// Incoming P2P sessions include a name that we can use to build a history file name
+			mHistoryFileName = LLCacheName::buildUsername(mName);
+		}
 	}
 }
 
@@ -615,7 +620,6 @@ std::string LLIMModel::LLIMSession::generateHash(const std::set<LLUUID>& sorted_
 	return participants_md5_hash.asString();
 }
 
-
 void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
 {
 	LLIMSession* session = findIMSession(old_session_id);
@@ -798,11 +802,6 @@ bool LLIMModel::logToFile(const std::string& file_name, const std::string& from,
 	}
 }
 
-bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
-{
-	return logToFile(LLIMModel::getInstance()->getHistoryFileName(session_id), from, from_id, utf8_text);
-}
-
 bool LLIMModel::proccessOnlineOfflineNotification(
 	const LLUUID& session_id, 
 	const std::string& utf8_text)
@@ -856,8 +855,11 @@ LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id,
 	}
 
 	addToHistory(session_id, from_name, from_id, utf8_text);
-	if (log2file) logToFile(session_id, from_name, from_id, utf8_text);
-
+	if (log2file)
+	{
+		logToFile(getHistoryFileName(session_id), from_name, from_id, utf8_text);
+	}
+	
 	session->mNumUnread++;
 
 	//update count of unread messages from real participant
@@ -2468,6 +2470,7 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
 			std::string session_name;
 			// since we select user to share item with - his name is already in cache
 			gCacheName->getFullName(args["user_id"], session_name);
+			session_name = LLCacheName::buildUsername(session_name);
 			LLIMModel::instance().logToFile(session_name, SYSTEM_FROM, LLUUID::null, message.getString());
 		}
 	}
@@ -2696,10 +2699,10 @@ void LLIMMgr::inviteToSession(
 
 	if (voice_invite)
 	{
-		if	(	// if we're rejecting all incoming call requests
-				gSavedSettings.getBOOL("VoiceCallsRejectAll")	
+		if	(	// if we are rejecting group calls 
+				(gSavedSettings.getBOOL("VoiceCallsRejectGroup") && notify_box_type == "VoiceInviteGroup") ||
 				// or we're rejecting non-friend voice calls and this isn't a friend	
-				|| (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
+				(gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL))
 			)
 		{
 			// silently decline the call
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index a15776c20791c4ab1aad7b9ead90491640203ae0..0ee56c8070488b5b6d22193bc1dce892ba7d55d0 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -98,13 +98,6 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 		/** ad-hoc sessions involve sophisticated chat history file naming schemes */
 		void buildHistoryFileName();
 
-		void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name);
-
-		void onAdHocNameCache(const LLAvatarName& av_name);
-
-		//*TODO make private
-		static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
-
 		LLUUID mSessionID;
 		std::string mName;
 		EInstantMessage mType;
@@ -139,6 +132,11 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 		//if IM session is created for a voice call
 		bool mStartedAsIMCall;
+
+	private:
+		void onAdHocNameCache(const LLAvatarName& av_name);
+
+		static std::string generateHash(const std::set<LLUUID>& sorted_uuids);
 	};
 	
 
@@ -293,12 +291,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	/**
 	 * Add message to a list of message associated with session specified by session_id
 	 */
-	bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text); 
-
-	/**
-	 * Save an IM message into a file
-	 */
-	bool logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+	bool addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
 };
 
 class LLIMSessionObserver
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index f488b2ed1bd8438fe1c611b6c91929cdb8de624a..39e6f797a24dae9c70933350fe7951d5d668e39b 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -66,10 +66,13 @@ class LLInventoryFilter
 		FILTERLINK_ONLY_LINKS		// only show links
 	};
 
-	// REFACTOR: Change this to an enum.
-	static const U32 SO_DATE = 1;
-	static const U32 SO_FOLDERS_BY_NAME = 2;
-	static const U32 SO_SYSTEM_FOLDERS_TO_TOP = 4;
+	enum ESortOrderType
+	{
+		SO_NAME = 0,						// Sort inventory by name
+		SO_DATE = 0x1,						// Sort inventory by date
+		SO_FOLDERS_BY_NAME = 0x1 << 1,		// Force folder sort by name
+		SO_SYSTEM_FOLDERS_TO_TOP = 0x1 << 2	// Force system folders to be on top
+	};
 
 	LLInventoryFilter(const std::string& name);
 	virtual ~LLInventoryFilter();
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 188fbf1f9badbebb43d7e733f424709c949a42d3..9fef42c5df11996246dd882ba1c4718f11533cb5 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -33,6 +33,7 @@
 #include <string>
 #include <map>
 #include <boost/function.hpp>
+#include <boost/signals2.hpp>
 
 class LLSD;
 /**
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 2df683861a92582c65628e6436456d92ba5ed0ae..efc4e2383881d2fb5aa57828a7707b7d6d3b4d35 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -32,6 +32,7 @@
 #include "lltrans.h"
 #include "llviewercontrol.h"
 
+#include "lldiriterator.h"
 #include "llinstantmessage.h"
 #include "llsingleton.h" // for LLSingleton
 
@@ -602,7 +603,8 @@ std::string LLLogChat::oldLogFileName(std::string filename)
 	//LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */
 	std::vector<std::string> allfiles;
 
-    while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult))
+	LLDirIterator iter(directory, pattern);
+	while (iter.next(scanResult))
     {
 		//LL_INFOS("") << "Found   :" << scanResult << LL_ENDL;
         allfiles.push_back(scanResult);
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 36c5d12897d55bebd0181e74e6a0427d92bfdb6f..00de6a86e1486f5d4cd5c179e7ffa958a9fecff3 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -608,6 +608,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
 	request_params["channel"] = LLVersionInfo::getChannel();
 	request_params["id0"] = mSerialNumber;
 	request_params["host_id"] = gSavedSettings.getString("HostID");
+	request_params["extended_errors"] = true; // request message_id and message_args
 
 	mRequestData.clear();
 	mRequestData["method"] = "login_to_simulator";
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 5007f1c17acb70b59236368c21afe62ab9841c16..b3ad9efeb242e7027892f83a0fc715adf99abbcf 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -68,7 +68,6 @@ LLMediaCtrl::Params::Params()
 :	start_url("start_url"),
 	border_visible("border_visible", true),
 	ignore_ui_scale("ignore_ui_scale", true),
-	hide_loading("hide_loading", false),
 	decouple_texture_size("decouple_texture_size", false),
 	texture_width("texture_width", 1024),
 	texture_height("texture_height", 1024),
@@ -97,8 +96,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
 	mCurrentNavUrl( "" ),
 	mStretchToFill( true ),
 	mMaintainAspectRatio ( true ),
-	mHideLoading (false),
-	mHidingInitialLoad (false),
 	mDecoupleTextureSize ( false ),
 	mTextureWidth ( 1024 ),
 	mTextureHeight ( 1024 ),
@@ -121,8 +118,6 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
 	
 	setBorderVisible(p.border_visible);
 	
-	mHideLoading = p.hide_loading;
-	
 	setDecoupleTextureSize(p.decouple_texture_size);
 	
 	setTextureSize(p.texture_width, p.texture_height);
@@ -684,11 +679,6 @@ bool LLMediaCtrl::ensureMediaSourceExists()
 				mMediaSource->clearCache();
 				mClearCache = false;
 			}
-			
-			if(mHideLoading)
-			{
-				mHidingInitialLoad = true;
-			}
 		}
 		else
 		{
@@ -756,11 +746,11 @@ void LLMediaCtrl::draw()
 		}
 	}
 	
-	if(mHidingInitialLoad)
-	{
-		// If we're hiding loading, don't draw at all.
-		draw_media = false;
-	}
+//	if(mHidingInitialLoad)
+//	{
+//		// If we're hiding loading, don't draw at all.
+//		draw_media = false;
+//	}
 	
 	bool background_visible = isBackgroundVisible();
 	bool background_opaque = isBackgroundOpaque();
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index e20e918a2a70f95bbb61dd5bea211e09296003bc..d9a58d56fe799009408b17de9bc26948034ddbd6 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -35,6 +35,7 @@
 #include "llappviewer.h"
 #include "llbufferstream.h"
 #include "llcurl.h"
+#include "lldatapacker.h"
 #include "llfasttimer.h"
 #include "llfloatermodelpreview.h"
 #include "llfloaterperms.h"
@@ -58,6 +59,8 @@
 #include "llworld.h"
 #include "material_codes.h"
 #include "pipeline.h"
+#include "llinventorymodel.h"
+#include "llfoldertype.h"
 
 #ifndef LL_WINDOWS
 #include "netdb.h"
@@ -82,6 +85,8 @@ U32 LLMeshRepository::sPeakKbps = 0;
 
 const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
 
+void dumpLLSDToFile(const LLSD& content, std::string filename);
+
 std::string header_lod[] = 
 {
 	"lowest_lod",
@@ -454,6 +459,69 @@ class LLMeshPhysicsShapeResponder : public LLCurl::Responder
 
 };
 
+class LLModelObjectUploadResponder: public LLCurl::Responder
+{
+	LLSD mObjectAsset;
+	LLMeshUploadThread* mThread;
+
+public:
+	LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
+		mThread(thread),
+		mObjectAsset(object_asset)
+	{
+	}
+
+	virtual void completedRaw(U32 status, const std::string& reason,
+							  const LLChannelDescriptors& channels,
+							  const LLIOPipe::buffer_ptr_t& buffer)
+	{
+		assert_main_thread();
+		
+		llinfos << "completed" << llendl;
+		mThread->mPendingUploads--;
+		mThread->mFinished = true;
+	}
+};
+
+class LLWholeModelFeeResponder: public LLCurl::Responder
+{
+	LLMeshUploadThread* mThread;
+public:
+	LLWholeModelFeeResponder(LLMeshUploadThread* thread):
+		mThread(thread)
+	{
+	}
+	virtual void completed(U32 status,
+						   const std::string& reason,
+						   const LLSD& content)
+	{
+		//assert_main_thread();
+		llinfos << "completed" << llendl;
+		mThread->mPendingUploads--;
+		dumpLLSDToFile(content,"whole_model_response.xml");
+
+		mThread->mWholeModelUploadURL = content["uploader"].asString(); 
+	}
+};
+
+class LLWholeModelUploadResponder: public LLCurl::Responder
+{
+	LLMeshUploadThread* mThread;
+public:
+	LLWholeModelUploadResponder(LLMeshUploadThread* thread):
+		mThread(thread)
+	{
+	}
+	virtual void completed(U32 status,
+						   const std::string& reason,
+						   const LLSD& content)
+	{
+		//assert_main_thread();
+		llinfos << "upload completed" << llendl;
+		mThread->mPendingUploads--;
+		dumpLLSDToFile(content,"whole_model_upload_response.xml");
+	}
+};
 
 LLMeshRepoThread::LLMeshRepoThread()
 : LLThread("mesh repo", NULL) 
@@ -1216,6 +1284,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
 	
 	mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
 	mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
+	mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
 
 	mOrigin += gAgent.getAtAxis() * scale.magVec();
 }
@@ -1307,17 +1376,47 @@ BOOL LLMeshUploadThread::isDiscarded()
 
 void LLMeshUploadThread::run()
 {
-	if(isDiscarded())
+	if (gSavedSettings.getBOOL("MeshUseWholeModelUpload"))
 	{
-		mFinished = true;
-		return ;
+		doWholeModelUpload();
 	}
-	
-	mCurlRequest = new LLCurlRequest();	
+	else
+	{
+		doIterativeUpload();
+	}
+}
+
+#if 1
+void dumpLLSDToFile(const LLSD& content, std::string filename)
+{
+	std::ofstream of(filename.c_str());
+	LLSDSerialize::toPrettyXML(content,of);
+}
+#endif
+
+void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
+{
+	// TODO where do textures go?
+
+	LLSD result;
 
+	LLSD res;
+	result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
+	result["asset_type"] = "mesh";
+	result["inventory_type"] = "object";
+	result["name"] = "your name here";
+	result["description"] = "your description here";
+
+	// TODO "optional" fields from the spec
+	
+	res["mesh_list"] = LLSD::emptyArray();
+// TODO Textures
+	//res["texture_list"] = LLSD::emptyArray();
+	S32 mesh_num = 0;
+	S32 texture_num = 0;
+	
 	std::set<LLViewerTexture* > textures;
 
-	//populate upload queue with relevant models
 	for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
 	{
 		LLMeshUploadData data;
@@ -1330,8 +1429,51 @@ void LLMeshUploadThread::run()
 			data.mModel[i] = instance.mLOD[i];
 		}
 
-		uploadModel(data);
+		std::stringstream ostr;
+
+		LLModel::Decomposition& decomp =
+			data.mModel[LLModel::LOD_PHYSICS].notNull() ? 
+			data.mModel[LLModel::LOD_PHYSICS]->mPhysics : 
+			data.mBaseModel->mPhysics;
+
+		decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+		LLSD mesh_header = LLModel::writeModel(
+			ostr,  
+			data.mModel[LLModel::LOD_PHYSICS],
+			data.mModel[LLModel::LOD_HIGH],
+			data.mModel[LLModel::LOD_MEDIUM],
+			data.mModel[LLModel::LOD_LOW],
+			data.mModel[LLModel::LOD_IMPOSTOR], 
+			decomp,
+			mUploadSkin,
+			mUploadJoints);
+
+		data.mAssetData = ostr.str();
+
+		LLSD mesh_entry;
+
+		LLVector3 pos, scale;
+		LLQuaternion rot;
+		LLMatrix4 transformation = instance.mTransform;
+		decomposeMeshMatrix(transformation,pos,rot,scale);
+
+#if 0
+		mesh_entry["childpos"] = ll_sd_from_vector3(pos);
+		mesh_entry["childrot"] = ll_sd_from_quaternion(rot);
+		mesh_entry["scale"] = ll_sd_from_vector3(scale);
+#endif
+		mesh_entry["position"] = ll_sd_from_vector3(LLVector3());
+		mesh_entry["rotation"] = ll_sd_from_quaternion(rot);
+		mesh_entry["scale"] = ll_sd_from_vector3(scale);
+
+		// TODO should be binary.
+		std::string str = ostr.str();
+		mesh_entry["mesh_data"] = LLSD::Binary(str.begin(),str.end()); 
+
+		res["mesh_list"][mesh_num] = mesh_entry;
 
+		// TODO how do textures in the list map to textures in the meshes?
 		if (mUploadTextures)
 		{
 			for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
@@ -1341,13 +1483,56 @@ void LLMeshUploadThread::run()
 				if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
 				{
 					textures.insert(material_iter->mDiffuseMap.get());
-					
-					LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
-					uploadTexture(data);
+
+					std::stringstream ostr;
+					if (include_textures) // otherwise data is blank.
+					{
+						LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
+						if (!data.mTexture->isRawImageValid())
+						{
+							data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
+						}
+						
+						LLPointer<LLImageJ2C> upload_file =
+							LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
+						ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
+					}
+					LLSD texture_entry;
+					texture_entry["texture_data"] = ostr.str();
+					res["texture_list"][texture_num] = texture_entry;
+					texture_num++;
 				}
 			}
 		}
 
+		mesh_num++;
+	}
+
+	result["asset_resources"] = res;
+#if 1	
+	dumpLLSDToFile(result,"whole_model.xml");
+#endif
+
+	dest = result;
+}
+
+void LLMeshUploadThread::doWholeModelUpload()
+{
+	mCurlRequest = new LLCurlRequest();	
+
+	// Queue up models for hull generation (viewer-side)
+	for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+	{
+		LLMeshUploadData data;
+		data.mBaseModel = iter->first;
+
+		LLModelInstance& instance = *(iter->second.begin());
+
+		for (S32 i = 0; i < 5; i++)
+		{
+			data.mModel[i] = instance.mLOD[i];
+		}
+
 		//queue up models for hull generation
 		LLModel* physics = NULL;
 
@@ -1378,6 +1563,87 @@ void LLMeshUploadThread::run()
 		apr_sleep(100);
 	}
 
+	bool do_include_textures = false; // not needed for initial cost/validation check.
+	LLSD model_data;
+	wholeModelToLLSD(model_data, do_include_textures);
+
+	mPendingUploads++;
+	LLCurlRequest::headers_t headers;
+	mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
+					   new LLWholeModelFeeResponder(this));
+
+	do
+	{
+		mCurlRequest->process();
+	} while (mCurlRequest->getQueued() > 0);
+
+	mCurlRequest->post(mWholeModelUploadURL, headers, model_data["asset_resources"], new LLWholeModelUploadResponder(this));
+	
+	do
+	{
+		mCurlRequest->process();
+	} while (mCurlRequest->getQueued() > 0);
+
+	delete mCurlRequest;
+	mCurlRequest = NULL;
+
+	// Currently a no-op.
+	mFinished = true;
+}
+
+void LLMeshUploadThread::doIterativeUpload()
+{
+	if(isDiscarded())
+	{
+		mFinished = true;
+		return ;
+	}
+	
+	mCurlRequest = new LLCurlRequest();	
+
+	std::set<LLViewerTexture* > textures;
+
+	//populate upload queue with relevant models
+	for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+	{
+		LLMeshUploadData data;
+		data.mBaseModel = iter->first;
+
+		LLModelInstance& instance = *(iter->second.begin());
+
+		for (S32 i = 0; i < 5; i++)
+		{
+			data.mModel[i] = instance.mLOD[i];
+		}
+
+		uploadModel(data);
+
+		if (mUploadTextures)
+		{
+			for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
+				material_iter != instance.mMaterial.end(); ++material_iter)
+			{
+
+				if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
+				{
+					textures.insert(material_iter->mDiffuseMap.get());
+					
+					LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
+					uploadTexture(data);
+				}
+			}
+		}
+
+		//queue up models for hull generation
+		DecompRequest* request = new DecompRequest(data.mModel[LLModel::LOD_HIGH], data.mBaseModel, this);
+		gMeshRepo.mDecompThread->submitRequest(request);
+	}
+
+	while (!mPhysicsComplete)
+	{
+		apr_sleep(100);
+	}
+
 	//upload textures
 	bool done = false;
 	do
@@ -1467,10 +1733,13 @@ void LLMeshUploadThread::run()
 
 	if(!isDiscarded())
 	{
-		LLHTTPClient::post(url, object_asset, new LLHTTPClient::Responder());
+		mPendingUploads++;
+		LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset));
+	}
+	else
+	{
+		mFinished = true;
 	}
-
-	mFinished = true;
 }
 
 void LLMeshUploadThread::uploadModel(LLMeshUploadData& data)
@@ -2761,6 +3030,47 @@ void LLMeshUploadThread::createObjects(LLMeshUploadData& data)
 	}
 }
 
+void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
+											 LLVector3& result_pos,
+											 LLQuaternion& result_rot,
+											 LLVector3& result_scale)
+{
+	// check for reflection
+	BOOL reflected = (transformation.determinant() < 0);
+
+	// compute position
+	LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+	// compute scale
+	LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
+	LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
+	LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
+	F32 x_length = x_transformed.normalize();
+	F32 y_length = y_transformed.normalize();
+	F32 z_length = z_transformed.normalize();
+	LLVector3 scale = LLVector3(x_length, y_length, z_length);
+
+    // adjust for "reflected" geometry
+	LLVector3 x_transformed_reflected = x_transformed;
+	if (reflected)
+	{
+		x_transformed_reflected *= -1.0;
+	}
+	
+	// compute rotation
+	LLMatrix3 rotation_matrix;
+	rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
+	LLQuaternion quat_rotation = rotation_matrix.quaternion();
+	quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal.  make it so here.
+	LLVector3 euler_rotation;
+	quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
+
+	result_pos = position + mOrigin;
+	result_scale = scale;
+	result_rot = quat_rotation; 
+}
+
+										 
 LLSD LLMeshUploadThread::createObject(LLModelInstance& instance)
 {
 	LLMatrix4 transformation = instance.mTransform;
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 5983a282a23a707da2518b569927c4bf8bf756ea..f859e29c0789778440fdb1158324024348dad163 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -387,6 +387,8 @@ class LLMeshUploadThread : public LLThread
 	LLHost			mHost;
 	std::string		mUploadObjectAssetCapability;
 	std::string		mNewInventoryCapability;
+	std::string		mWholeModelFeeCapability;
+	std::string		mWholeModelUploadURL;
 
 	std::queue<LLMeshUploadData> mUploadQ;
 	std::queue<LLMeshUploadData> mConfirmedQ;
@@ -420,6 +422,16 @@ class LLMeshUploadThread : public LLThread
 	void preStart();
 	void discard() ;
 	BOOL isDiscarded();
+
+	void doWholeModelUpload();
+	void doIterativeUpload();
+
+	void wholeModelToLLSD(LLSD& dest, bool include_textures);
+
+	void decomposeMeshMatrix(LLMatrix4& transformation,
+							 LLVector3& result_pos,
+							 LLQuaternion& result_rot,
+							 LLVector3& result_scale);
 };
 
 class LLMeshRepository
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 70d588db52249aba49d51a91309d354afd90504d..de90023f3b8bd2bbcf95e605ef47bba7870dfddc 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -27,13 +27,17 @@
 
 #include "llviewerprecompiledheaders.h" // must be first include
 
-#include "llnotificationhandler.h"
+#include "llavatarnamecache.h"
+
+#include "llfloaterreg.h"
 #include "llnotifications.h"
-#include "llimview.h"
+#include "llurlaction.h"
+
 #include "llagent.h"
-#include "llfloaterreg.h"
-#include "llnearbychat.h"
 #include "llimfloater.h"
+#include "llimview.h"
+#include "llnearbychat.h"
+#include "llnotificationhandler.h"
 
 using namespace LLNotificationsUI;
 
@@ -275,7 +279,11 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
 		{
 			from = SYSTEM_FROM;
 		}
-		LLIMModel::instance().logToFile(session_name, from, from_id, message);
+
+		// Build a new format username or firstname_lastname for legacy names
+		// to use it for a history log filename.
+		std::string user_name = LLCacheName::buildUsername(session_name);
+		LLIMModel::instance().logToFile(user_name, from, from_id, message);
 	}
 	else
 	{
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 026803584d8b663a457af66879d6b36f47ceea0f..2d23753d46edb1aba27085cb4f5d8c290c8fc322 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -31,6 +31,7 @@
 #include "llview.h"
 #include "llmutelist.h"
 #include "llspeakingindicatormanager.h"
+#include "lluiimage.h"
 
 class LLTextBox;
 class LLUICtrlFactory;
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 73c4722b828f15d512a36a3fc7b1251aa1cd7be6..d58a1cb66399f1e8b7c896082b139877784451f4 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -36,6 +36,7 @@
 #include "llimview.h"
 #include "llmenubutton.h"
 #include "llnotificationsutil.h"
+#include "llslurl.h"
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
 #include "lltoggleablemenu.h"
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index ec340dc258dff5964524d41dfad2889e1588f6b7..1576ccccdf3e5249bed0b605e2988e17066dc220 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -44,6 +44,7 @@
 #include "llnotificationsutil.h"
 #include "llscrolllistitem.h"
 #include "llspinctrl.h"
+#include "llslurl.h"
 #include "lltextbox.h"
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 3dbc637318a7eab48a77cc668a45ee554eaa7d88..fbe331c7ab925edef1c90a3faf5bd2e10cf21d76 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -42,6 +42,7 @@
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
 #include "llscrolllistcell.h"
+#include "llslurl.h"
 #include "lltabcontainer.h"
 #include "lltextbox.h"
 #include "lltexteditor.h"
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 979d96ca0de72147b920809c6c6a3894f278e4c9..d0810d0772e0b54f29a72dd3976709b8b8608d0b 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -34,6 +34,7 @@
 #include "llmd5.h"
 #include "llsecondlifeurls.h"
 #include "v4color.h"
+#include "llversionviewer.h"
 
 #include "llappviewer.h"
 #include "llbutton.h"
@@ -100,58 +101,6 @@ class LLLoginRefreshHandler : public LLCommandHandler
 	}
 };
 
-LLLoginRefreshHandler gLoginRefreshHandler;
-
-
-// helper class that trys to download a URL from a web site and calls a method 
-// on parent class indicating if the web server is working or not
-class LLIamHereLogin : public LLHTTPClient::Responder
-{
-	private:
-		LLIamHereLogin( LLPanelLogin* parent ) :
-		   mParent( parent )
-		{}
-
-		LLPanelLogin* mParent;
-
-	public:
-		static boost::intrusive_ptr< LLIamHereLogin > build( LLPanelLogin* parent )
-		{
-			return boost::intrusive_ptr< LLIamHereLogin >( new LLIamHereLogin( parent ) );
-		};
-
-		virtual void  setParent( LLPanelLogin* parentIn )
-		{
-			mParent = parentIn;
-		};
-
-		// We don't actually expect LLSD back, so need to override completedRaw
-		virtual void completedRaw(U32 status, const std::string& reason,
-								  const LLChannelDescriptors& channels,
-								  const LLIOPipe::buffer_ptr_t& buffer)
-		{
-			completed(status, reason, LLSD()); // will call result() or error()
-		}
-	
-		virtual void result( const LLSD& content )
-		{
-			if ( mParent )
-				mParent->setSiteIsAlive( true );
-		};
-
-		virtual void error( U32 status, const std::string& reason )
-		{
-			if ( mParent )
-				mParent->setSiteIsAlive( false );
-		};
-};
-
-// this is global and not a class member to keep crud out of the header file
-namespace {
-	boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
-};
-
-
 //---------------------------------------------------------------------------
 // Public methods
 //---------------------------------------------------------------------------
@@ -163,7 +112,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	mLogoImage(),
 	mCallback(callback),
 	mCallbackData(cb_data),
-	mHtmlAvailable( TRUE ),
 	mListener(new LLPanelLoginListener(this))
 {
 	setBackgroundVisible(FALSE);
@@ -193,21 +141,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 
 	buildFromFile( "panel_login.xml");
 	
-	// Legacy login web page is hidden under the menu bar.
-	// Adjust reg-in-client web browser widget to not be hidden.
-	if (gSavedSettings.getBOOL("RegInClient"))
-	{
-		reshape(rect.getWidth(), rect.getHeight() - MENU_BAR_HEIGHT);
-	}
-	else
-	{
-		reshape(rect.getWidth(), rect.getHeight());
-	}
+	reshape(rect.getWidth(), rect.getHeight());
 
 	getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
 
 	// change z sort of clickable text to be behind buttons
-	//sendChildToBack(getChildView("channel_text"));
 	sendChildToBack(getChildView("forgot_password_text"));
 
 	if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
@@ -252,16 +190,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
 	web_browser->addObserver(this);
 	
-	// Clear the browser's cache to avoid any potential for the cache messing up the login screen.
-	web_browser->clearCache();
-
 	reshapeBrowser();
 
-	// kick off a request to grab the url manually
-	gResponsePtr = LLIamHereLogin::build( this );
-
-	LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr );
-
+	loadLoginPage();
+			
 	// Show last logged in user favorites in "Start at" combo.
 	addUsersWithFavoritesToUsername();
 	getChild<LLComboBox>("username_combo")->setTextChangedCallback(boost::bind(&LLPanelLogin::addFavoritesToStartLocation, this));
@@ -344,46 +276,10 @@ void LLPanelLogin::reshapeBrowser()
 	reshape( rect.getWidth(), rect.getHeight(), 1 );
 }
 
-void LLPanelLogin::setSiteIsAlive( bool alive )
-{
-	LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
-	// if the contents of the site was retrieved
-	if ( alive )
-	{
-		if ( web_browser )
-		{
-			loadLoginPage();
-			
-			// mark as available
-			mHtmlAvailable = TRUE;
-		}
-	}
-	else
-	// the site is not available (missing page, server down, other badness)
-	{
-		if ( web_browser )
-		{
-			// hide browser control (revealing default one)
-			web_browser->setVisible( FALSE );
-
-			// mark as unavailable
-			mHtmlAvailable = FALSE;
-		}
-	}
-}
-
-
 LLPanelLogin::~LLPanelLogin()
 {
 	LLPanelLogin::sInstance = NULL;
 
-	// tell the responder we're not here anymore
-	if ( gResponsePtr )
-		gResponsePtr->setParent( 0 );
-
-	//// We know we're done with the image, so be rid of it.
-	//gTextureList.deleteImage( mLogoImage );
-
 	// Controls having keyboard focus by default
 	// must reset it on destroy. (EXT-2748)
 	gFocusMgr.setDefaultKeyboardFocus(NULL);
@@ -406,22 +302,13 @@ void LLPanelLogin::draw()
 		S32 width = getRect().getWidth();
 		S32 height = getRect().getHeight();
 
-		if ( mHtmlAvailable )
-		{
-			if (getChild<LLView>("login_widgets")->getVisible())
-			{
-				// draw a background box in black
-				gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
-				// draw the bottom part of the background image
-				// just the blue background to the native client UI
-				mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
-			}
-		}
-		else
+		if (getChild<LLView>("login_widgets")->getVisible())
 		{
-			// the HTML login page is not available so default to the original screen
-			S32 offscreen_part = height / 3;
-			mLogoImage->draw(0, -offscreen_part, width, height+offscreen_part);
+			// draw a background box in black
+			gl_rect_2d( 0, height - 264, width, 264, LLColor4::black );
+			// draw the bottom part of the background image
+			// just the blue background to the native client UI
+			mLogoImage->draw(0, -264, width + 8, mLogoImage->getHeight());
 		};
 	}
 	glPopMatrix();
@@ -861,12 +748,20 @@ void LLPanelLogin::loadLoginPage()
 								   LLVersionInfo::getShortVersion().c_str(),
 								   LLVersionInfo::getBuild());
 
-	char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
+	char* curl_channel ;
 	char* curl_version = curl_escape(version.c_str(), 0);
 
+	if(strcmp(LLVersionInfo::getChannel().c_str(), LL_CHANNEL))
+	{
+		curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0);
+	}
+	else //if LL_CHANNEL, direct it to "Second Life Beta Viewer".
+	{
+		curl_channel = curl_escape("Second Life Beta Viewer", 0);		
+	}
 	oStr << "&channel=" << curl_channel;
 	oStr << "&version=" << curl_version;
-
+	
 	curl_free(curl_channel);
 	curl_free(curl_version);
 
@@ -880,20 +775,10 @@ void LLPanelLogin::loadLoginPage()
 	oStr << "&os=" << os_info;
 	curl_free(os_info);
 	
-	
 	gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
-	gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
 	
 	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
-	// navigate to the "real" page
-	if (gSavedSettings.getBOOL("RegInClient"))
-	{
-		web_browser->setFocus(TRUE);
-		login_page = sInstance->getString("reg_in_client_url");
-		web_browser->navigateTo(login_page, "text/html");
-	}
-	else
+	if (web_browser->getCurrentNavUrl() != oStr.str())
 	{
 		web_browser->navigateTo( oStr.str(), "text/html" );
 	}
@@ -927,10 +812,6 @@ void LLPanelLogin::onClickConnect(void *)
 {
 	if (sInstance && sInstance->mCallback)
 	{
-		// tell the responder we're not here anymore
-		if ( gResponsePtr )
-			gResponsePtr->setParent( 0 );
-
 		// JC - Make sure the fields all get committed.
 		sInstance->setFocus(FALSE);
 
@@ -998,24 +879,6 @@ void LLPanelLogin::onClickConnect(void *)
 	}
 }
 
-/*
-// static
-bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	if (0 == option)
-	{
-		llinfos << "Going to account creation URL" << llendl;
-		LLWeb::loadURLExternal( LLNotifications::instance().getGlobalString("CREATE_ACCOUNT_URL")); 
-	}
-	else
-	{
-		sInstance->setFocus(TRUE);
-	}
-	return false;
-}
-*/
-
 // static
 void LLPanelLogin::onClickNewAccount(void*)
 {
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 9cc5e3456abea4664d1ca72151451135ab041bf9..11273453bae6788d01921a3aa344ff2ff1e1a19f 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -89,7 +89,6 @@ class LLPanelLogin:
 	void addUsersWithFavoritesToUsername();
 	static void onClickConnect(void*);
 	static void onClickNewAccount(void*);
-//	static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response);
 	static void onClickVersion(void*);
 	static void onClickForgotPassword(void*);
 	static void onClickHelp(void*);
@@ -114,7 +113,6 @@ class LLPanelLogin:
 
 	static LLPanelLogin* sInstance;
 	static BOOL		sCapslockDidNotification;
-	BOOL			mHtmlAvailable;
 };
 
 std::string load_password_from_disk(void);
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 85c57b490096ab8cef20205827d854d361d193be..bc4998dd0cfd170244cfc4a15a285525360704e0 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -139,6 +139,7 @@ BOOL LLPanelMainInventory::postBuild()
 		mActivePanel->getFilter()->markDefault();
 		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
 		mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+		mResortActivePanel = true;
 	}
 	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
 	if (recent_items_panel)
@@ -528,6 +529,17 @@ void LLPanelMainInventory::draw()
 	{
 		mFilterEditor->setText(mFilterSubString);
 	}	
+	if (mActivePanel && mResortActivePanel)
+	{
+		// EXP-756: Force resorting of the list the first time we draw the list: 
+		// In the case of date sorting, we don't have enough information at initialization time
+		// to correctly sort the folders. Later manual resort doesn't do anything as the order value is 
+		// set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order.
+		U32 order = mActivePanel->getSortOrder();
+		mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME);
+		mActivePanel->setSortOrder(order);
+		mResortActivePanel = false;
+	}
 	LLPanel::draw();
 	updateItemcountText();
 }
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index c2b78ff9ea0370e26a9fc9b5ddc13b6efdb317b7..2b2ee1c0c9fc17c83a01562dbfcb5b14b70bddf8 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -121,6 +121,7 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 	LLTabContainer*				mFilterTabs;
 	LLHandle<LLFloater>			mFinderHandle;
 	LLInventoryPanel*			mActivePanel;
+	bool						mResortActivePanel;
 	LLSaveFolderState*			mSavedFolderState;
 	std::string					mFilterText;
 	std::string					mFilterSubString;
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index 204c146f3c5c4b015d5f14b1f43579d18e65876f..74f48907d29a3f8d66d34c645e4beb78bb1c3892 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -1,1999 +1,1999 @@
-/** 
- * @file llpanelobject.cpp
- * @brief Object editing (position, scale, etc.) in the tools floater
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-// file include
-#include "llpanelobject.h"
-
-// linden library includes
-#include "lleconomy.h"
-#include "llerror.h"
-#include "llfontgl.h"
-#include "llpermissionsflags.h"
-#include "llstring.h"
-#include "llvolume.h"
-#include "m3math.h"
-
-// project includes
-#include "llagent.h"
-#include "llbutton.h"
-#include "llcheckboxctrl.h"
-#include "llcolorswatch.h"
-#include "llcombobox.h"
-#include "llfocusmgr.h"
-#include "llmanipscale.h"
-#include "llpreviewscript.h"
-#include "llresmgr.h"
-#include "llselectmgr.h"
-#include "llspinctrl.h"
-#include "lltexturectrl.h"
-#include "lltextbox.h"
-#include "lltool.h"
-#include "lltoolcomp.h"
-#include "lltoolmgr.h"
-#include "llui.h"
-#include "llviewerobject.h"
-#include "llviewerregion.h"
-#include "llviewerwindow.h"
-#include "llvovolume.h"
-#include "llworld.h"
-#include "pipeline.h"
-#include "llviewercontrol.h"
-#include "lluictrlfactory.h"
-//#include "llfirstuse.h"
-
-#include "lldrawpool.h"
-
-//
-// Constants
-//
-enum {
-	MI_BOX,
-	MI_CYLINDER,
-	MI_PRISM,
-	MI_SPHERE,
-	MI_TORUS,
-	MI_TUBE,
-	MI_RING,
-	MI_SCULPT,
-	MI_NONE,
-	MI_VOLUME_COUNT
-};
-
-enum {
-	MI_HOLE_SAME,
-	MI_HOLE_CIRCLE,
-	MI_HOLE_SQUARE,
-	MI_HOLE_TRIANGLE,
-	MI_HOLE_COUNT
-};
-
-//static const std::string LEGACY_FULLBRIGHT_DESC =LLTrans::getString("Fullbright");
-
-BOOL	LLPanelObject::postBuild()
-{
-	setMouseOpaque(FALSE);
-	
-	//--------------------------------------------------------
-	// Top
-	//--------------------------------------------------------
-	
-	// Lock checkbox
-	mCheckLock = getChild<LLCheckBoxCtrl>("checkbox locked");
-	childSetCommitCallback("checkbox locked",onCommitLock,this);
-
-	// Physical checkbox
-	mCheckPhysics = getChild<LLCheckBoxCtrl>("Physical Checkbox Ctrl");
-	childSetCommitCallback("Physical Checkbox Ctrl",onCommitPhysics,this);
-
-	// Temporary checkbox
-	mCheckTemporary = getChild<LLCheckBoxCtrl>("Temporary Checkbox Ctrl");
-	childSetCommitCallback("Temporary Checkbox Ctrl",onCommitTemporary,this);
-
-	// Phantom checkbox
-	mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
-	childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
-       
-
-	// Position
-	mLabelPosition = getChild<LLTextBox>("label position");
-	mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
-	childSetCommitCallback("Pos X",onCommitPosition,this);
-	mCtrlPosY = getChild<LLSpinCtrl>("Pos Y");
-	childSetCommitCallback("Pos Y",onCommitPosition,this);
-	mCtrlPosZ = getChild<LLSpinCtrl>("Pos Z");
-	childSetCommitCallback("Pos Z",onCommitPosition,this);
-
-	// Scale
-	mLabelSize = getChild<LLTextBox>("label size");
-	mCtrlScaleX = getChild<LLSpinCtrl>("Scale X");
-	childSetCommitCallback("Scale X",onCommitScale,this);
-
-	// Scale Y
-	mCtrlScaleY = getChild<LLSpinCtrl>("Scale Y");
-	childSetCommitCallback("Scale Y",onCommitScale,this);
-
-	// Scale Z
-	mCtrlScaleZ = getChild<LLSpinCtrl>("Scale Z");
-	childSetCommitCallback("Scale Z",onCommitScale,this);
-
-	// Rotation
-	mLabelRotation = getChild<LLTextBox>("label rotation");
-	mCtrlRotX = getChild<LLSpinCtrl>("Rot X");
-	childSetCommitCallback("Rot X",onCommitRotation,this);
-	mCtrlRotY = getChild<LLSpinCtrl>("Rot Y");
-	childSetCommitCallback("Rot Y",onCommitRotation,this);
-	mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z");
-	childSetCommitCallback("Rot Z",onCommitRotation,this);
-
-	//--------------------------------------------------------
-		
-	// Base Type
-	mComboBaseType = getChild<LLComboBox>("comboBaseType");
-	childSetCommitCallback("comboBaseType",onCommitParametric,this);
-
-	// Cut
-	mLabelCut = getChild<LLTextBox>("text cut");
-	mSpinCutBegin = getChild<LLSpinCtrl>("cut begin");
-	childSetCommitCallback("cut begin",onCommitParametric,this);
-	mSpinCutBegin->setValidateBeforeCommit( precommitValidate );
-	mSpinCutEnd = getChild<LLSpinCtrl>("cut end");
-	childSetCommitCallback("cut end",onCommitParametric,this);
-	mSpinCutEnd->setValidateBeforeCommit( &precommitValidate );
-
-	// Hollow / Skew
-	mLabelHollow = getChild<LLTextBox>("text hollow");
-	mLabelSkew = getChild<LLTextBox>("text skew");
-	mSpinHollow = getChild<LLSpinCtrl>("Scale 1");
-	childSetCommitCallback("Scale 1",onCommitParametric,this);
-	mSpinHollow->setValidateBeforeCommit( &precommitValidate );
-	mSpinSkew = getChild<LLSpinCtrl>("Skew");
-	childSetCommitCallback("Skew",onCommitParametric,this);
-	mSpinSkew->setValidateBeforeCommit( &precommitValidate );
-	mLabelHoleType = getChild<LLTextBox>("Hollow Shape");
-
-	// Hole Type
-	mComboHoleType = getChild<LLComboBox>("hole");
-	childSetCommitCallback("hole",onCommitParametric,this);
-
-	// Twist
-	mLabelTwist = getChild<LLTextBox>("text twist");
-	mSpinTwistBegin = getChild<LLSpinCtrl>("Twist Begin");
-	childSetCommitCallback("Twist Begin",onCommitParametric,this);
-	mSpinTwistBegin->setValidateBeforeCommit( precommitValidate );
-	mSpinTwist = getChild<LLSpinCtrl>("Twist End");
-	childSetCommitCallback("Twist End",onCommitParametric,this);
-	mSpinTwist->setValidateBeforeCommit( &precommitValidate );
-
-	// Scale
-	mSpinScaleX = getChild<LLSpinCtrl>("Taper Scale X");
-	childSetCommitCallback("Taper Scale X",onCommitParametric,this);
-	mSpinScaleX->setValidateBeforeCommit( &precommitValidate );
-	mSpinScaleY = getChild<LLSpinCtrl>("Taper Scale Y");
-	childSetCommitCallback("Taper Scale Y",onCommitParametric,this);
-	mSpinScaleY->setValidateBeforeCommit( &precommitValidate );
-
-	// Shear
-	mLabelShear = getChild<LLTextBox>("text topshear");
-	mSpinShearX = getChild<LLSpinCtrl>("Shear X");
-	childSetCommitCallback("Shear X",onCommitParametric,this);
-	mSpinShearX->setValidateBeforeCommit( &precommitValidate );
-	mSpinShearY = getChild<LLSpinCtrl>("Shear Y");
-	childSetCommitCallback("Shear Y",onCommitParametric,this);
-	mSpinShearY->setValidateBeforeCommit( &precommitValidate );
-
-	// Path / Profile
-	mCtrlPathBegin = getChild<LLSpinCtrl>("Path Limit Begin");
-	childSetCommitCallback("Path Limit Begin",onCommitParametric,this);
-	mCtrlPathBegin->setValidateBeforeCommit( &precommitValidate );
-	mCtrlPathEnd = getChild<LLSpinCtrl>("Path Limit End");
-	childSetCommitCallback("Path Limit End",onCommitParametric,this);
-	mCtrlPathEnd->setValidateBeforeCommit( &precommitValidate );
-
-	// Taper
-	mLabelTaper = getChild<LLTextBox>("text taper2");
-	mSpinTaperX = getChild<LLSpinCtrl>("Taper X");
-	childSetCommitCallback("Taper X",onCommitParametric,this);
-	mSpinTaperX->setValidateBeforeCommit( precommitValidate );
-	mSpinTaperY = getChild<LLSpinCtrl>("Taper Y");
-	childSetCommitCallback("Taper Y",onCommitParametric,this);
-	mSpinTaperY->setValidateBeforeCommit( precommitValidate );
-	
-	// Radius Offset / Revolutions
-	mLabelRadiusOffset = getChild<LLTextBox>("text radius delta");
-	mLabelRevolutions = getChild<LLTextBox>("text revolutions");
-	mSpinRadiusOffset = getChild<LLSpinCtrl>("Radius Offset");
-	childSetCommitCallback("Radius Offset",onCommitParametric,this);
-	mSpinRadiusOffset->setValidateBeforeCommit( &precommitValidate );
-	mSpinRevolutions = getChild<LLSpinCtrl>("Revolutions");
-	childSetCommitCallback("Revolutions",onCommitParametric,this);
-	mSpinRevolutions->setValidateBeforeCommit( &precommitValidate );
-
-	// Sculpt
-	mCtrlSculptTexture = getChild<LLTextureCtrl>("sculpt texture control");
-	if (mCtrlSculptTexture)
-	{
-		mCtrlSculptTexture->setDefaultImageAssetID(LLUUID(SCULPT_DEFAULT_TEXTURE));
-		mCtrlSculptTexture->setCommitCallback( boost::bind(&LLPanelObject::onCommitSculpt, this, _2 ));
-		mCtrlSculptTexture->setOnCancelCallback( boost::bind(&LLPanelObject::onCancelSculpt, this, _2 ));
-		mCtrlSculptTexture->setOnSelectCallback( boost::bind(&LLPanelObject::onSelectSculpt, this, _2 ));
-		mCtrlSculptTexture->setDropCallback( boost::bind(&LLPanelObject::onDropSculpt, this, _2 ));
-		// Don't allow (no copy) or (no transfer) textures to be selected during immediate mode
-		mCtrlSculptTexture->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
-		// Allow any texture to be used during non-immediate mode.
-		mCtrlSculptTexture->setNonImmediateFilterPermMask(PERM_NONE);
-		LLAggregatePermissions texture_perms;
-		if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms))
-		{
-			BOOL can_copy =
-				texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||
-				texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL;
-			BOOL can_transfer =
-				texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||
-				texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL;
-			mCtrlSculptTexture->setCanApplyImmediately(can_copy && can_transfer);
-		}
-		else
-		{
-			mCtrlSculptTexture->setCanApplyImmediately(FALSE);
-		}
-	}
-
-	mLabelSculptType = getChild<LLTextBox>("label sculpt type");
-	mCtrlSculptType = getChild<LLComboBox>("sculpt type control");
-	childSetCommitCallback("sculpt type control", onCommitSculptType, this);
-	mCtrlSculptMirror = getChild<LLCheckBoxCtrl>("sculpt mirror control");
-	childSetCommitCallback("sculpt mirror control", onCommitSculptType, this);
-	mCtrlSculptInvert = getChild<LLCheckBoxCtrl>("sculpt invert control");
-	childSetCommitCallback("sculpt invert control", onCommitSculptType, this);
-	
-	// Start with everyone disabled
-	clearCtrls();
-
-	return TRUE;
-}
-
-LLPanelObject::LLPanelObject()
-:	LLPanel(),
-	mIsPhysical(FALSE),
-	mIsTemporary(FALSE),
-	mIsPhantom(FALSE),
-	mCastShadows(TRUE),
-	mSelectedType(MI_BOX),
-	mSculptTextureRevert(LLUUID::null),
-	mSculptTypeRevert(0)
-{
-}
-
-
-LLPanelObject::~LLPanelObject()
-{
-	// Children all cleaned up by default view destructor.
-}
-
-void LLPanelObject::getState( )
-{
-	LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
-	LLViewerObject* root_objectp = objectp;
-	if(!objectp)
-	{
-		objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
-		// *FIX: shouldn't we just keep the child?
-		if (objectp)
-		{
-			LLViewerObject* parentp = objectp->getRootEdit();
-
-			if (parentp)
-			{
-				root_objectp = parentp;
-			}
-			else
-			{
-				root_objectp = objectp;
-			}
-		}
-	}
-
-	LLVOVolume *volobjp = NULL;
-	if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
-	{
-		volobjp = (LLVOVolume *)objectp;
-	}
-
-	if( !objectp )
-	{
-		//forfeit focus
-		if (gFocusMgr.childHasKeyboardFocus(this))
-		{
-			gFocusMgr.setKeyboardFocus(NULL);
-		}
-
-		// Disable all text input fields
-		clearCtrls();
-		return;
-	}
-
-	// can move or rotate only linked group with move permissions, or sub-object with move and modify perms
-	BOOL enable_move	= objectp->permMove() && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
-	BOOL enable_scale	= objectp->permMove() && objectp->permModify();
-	BOOL enable_rotate	= objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
-
-	S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
-	BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
-						 && (selected_count == 1);
-
-	if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1)
-	{
-		enable_move = FALSE;
-		enable_scale = FALSE;
-		enable_rotate = FALSE;
-	}
-
-	LLVector3 vec;
-	if (enable_move)
-	{
-		vec = objectp->getPositionEdit();
-		mCtrlPosX->set( vec.mV[VX] );
-		mCtrlPosY->set( vec.mV[VY] );
-		mCtrlPosZ->set( vec.mV[VZ] );
-	}
-	else
-	{
-		mCtrlPosX->clear();
-		mCtrlPosY->clear();
-		mCtrlPosZ->clear();
-	}
-
-
-	mLabelPosition->setEnabled( enable_move );
-	mCtrlPosX->setEnabled(enable_move);
-	mCtrlPosY->setEnabled(enable_move);
-	mCtrlPosZ->setEnabled(enable_move);
-
-	if (enable_scale)
-	{
-		vec = objectp->getScale();
-		mCtrlScaleX->set( vec.mV[VX] );
-		mCtrlScaleY->set( vec.mV[VY] );
-		mCtrlScaleZ->set( vec.mV[VZ] );
-	}
-	else
-	{
-		mCtrlScaleX->clear();
-		mCtrlScaleY->clear();
-		mCtrlScaleZ->clear();
-	}
-
-	mLabelSize->setEnabled( enable_scale );
-	mCtrlScaleX->setEnabled( enable_scale );
-	mCtrlScaleY->setEnabled( enable_scale );
-	mCtrlScaleZ->setEnabled( enable_scale );
-
-	LLQuaternion object_rot = objectp->getRotationEdit();
-	object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ]));
-	mCurEulerDegrees *= RAD_TO_DEG;
-	mCurEulerDegrees.mV[VX] = fmod(llround(mCurEulerDegrees.mV[VX], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
-	mCurEulerDegrees.mV[VY] = fmod(llround(mCurEulerDegrees.mV[VY], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
-	mCurEulerDegrees.mV[VZ] = fmod(llround(mCurEulerDegrees.mV[VZ], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
-
-	if (enable_rotate)
-	{
-		mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
-		mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
-		mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
-	}
-	else
-	{
-		mCtrlRotX->clear();
-		mCtrlRotY->clear();
-		mCtrlRotZ->clear();
-	}
-
-	mLabelRotation->setEnabled( enable_rotate );
-	mCtrlRotX->setEnabled( enable_rotate );
-	mCtrlRotY->setEnabled( enable_rotate );
-	mCtrlRotZ->setEnabled( enable_rotate );
-
-	BOOL owners_identical;
-	LLUUID owner_id;
-	std::string owner_name;
-	owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
-
-	// BUG? Check for all objects being editable?
-	S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
-	BOOL editable = root_objectp->permModify();
-
-	// Select Single Message
-	getChildView("select_single")->setVisible( FALSE);
-	getChildView("edit_object")->setVisible( FALSE);
-	if (!editable || single_volume || selected_count <= 1)
-	{
-		getChildView("edit_object")->setVisible( TRUE);
-		getChildView("edit_object")->setEnabled(TRUE);
-	}
-	else
-	{
-		getChildView("select_single")->setVisible( TRUE);
-		getChildView("select_single")->setEnabled(TRUE);
-	}
-	// Lock checkbox - only modifiable if you own the object.
-	BOOL self_owned = (gAgent.getID() == owner_id);
-	mCheckLock->setEnabled( roots_selected > 0 && self_owned );
-
-	// More lock and debit checkbox - get the values
-	BOOL valid;
-	U32 owner_mask_on;
-	U32 owner_mask_off;
-	valid = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, &owner_mask_on, &owner_mask_off);
-
-	if(valid)
-	{
-		if(owner_mask_on & PERM_MOVE)
-		{
-			// owner can move, so not locked
-			mCheckLock->set(FALSE);
-			mCheckLock->setTentative(FALSE);
-		}
-		else if(owner_mask_off & PERM_MOVE)
-		{
-			// owner can't move, so locked
-			mCheckLock->set(TRUE);
-			mCheckLock->setTentative(FALSE);
-		}
-		else
-		{
-			// some locked, some not locked
-			mCheckLock->set(FALSE);
-			mCheckLock->setTentative(TRUE);
-		}
-	}
-
-	BOOL is_flexible = volobjp && volobjp->isFlexible();
-
-	// Physics checkbox
-	mIsPhysical = root_objectp->usePhysics();
-	mCheckPhysics->set( mIsPhysical );
-	mCheckPhysics->setEnabled( roots_selected>0 
-								&& (editable || gAgent.isGodlike()) 
-								&& !is_flexible);
-
-	mIsTemporary = root_objectp->flagTemporaryOnRez();
-	mCheckTemporary->set( mIsTemporary );
-	mCheckTemporary->setEnabled( roots_selected>0 && editable );
-
-	mIsPhantom = root_objectp->flagPhantom();
-	mCheckPhantom->set( mIsPhantom );
-	mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
-
-       
-#if 0 // 1.9.2
-	mCastShadows = root_objectp->flagCastShadows();
-	mCheckCastShadows->set( mCastShadows );
-	mCheckCastShadows->setEnabled( roots_selected==1 && editable );
-#endif
-	
-	//----------------------------------------------------------------------------
-
-	S32 selected_item	= MI_BOX;
-	S32	selected_hole	= MI_HOLE_SAME;
-	BOOL enabled = FALSE;
-	BOOL hole_enabled = FALSE;
-	F32 scale_x=1.f, scale_y=1.f;
-	BOOL isMesh = FALSE;
-	
-	if( !objectp || !objectp->getVolume() || !editable || !single_volume)
-	{
-		// Clear out all geometry fields.
-		mComboBaseType->clear();
-		mSpinHollow->clear();
-		mSpinCutBegin->clear();
-		mSpinCutEnd->clear();
-		mCtrlPathBegin->clear();
-		mCtrlPathEnd->clear();
-		mSpinScaleX->clear();
-		mSpinScaleY->clear();
-		mSpinTwist->clear();
-		mSpinTwistBegin->clear();
-		mComboHoleType->clear();
-		mSpinShearX->clear();
-		mSpinShearY->clear();
-		mSpinTaperX->clear();
-		mSpinTaperY->clear();
-		mSpinRadiusOffset->clear();
-		mSpinRevolutions->clear();
-		mSpinSkew->clear();
-		
-		mSelectedType = MI_NONE;
-	}
-	else
-	{
-		// Only allowed to change these parameters for objects
-		// that you have permissions on AND are not attachments.
-		enabled = root_objectp->permModify();
-		
-		// Volume type
-		const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
-		U8 path = volume_params.getPathParams().getCurveType();
-		U8 profile_and_hole = volume_params.getProfileParams().getCurveType();
-		U8 profile	= profile_and_hole & LL_PCODE_PROFILE_MASK;
-		U8 hole		= profile_and_hole & LL_PCODE_HOLE_MASK;
-		
-		// Scale goes first so we can differentiate between a sphere and a torus,
-		// which have the same profile and path types.
-
-		// Scale
-		scale_x = volume_params.getRatioX();
-		scale_y = volume_params.getRatioY();
-
-		BOOL linear_path = (path == LL_PCODE_PATH_LINE) || (path == LL_PCODE_PATH_FLEXIBLE);
-		if ( linear_path && profile == LL_PCODE_PROFILE_CIRCLE )
-		{
-			selected_item = MI_CYLINDER;
-		}
-		else if ( linear_path && profile == LL_PCODE_PROFILE_SQUARE )
-		{
-			selected_item = MI_BOX;
-		}
-		else if ( linear_path && profile == LL_PCODE_PROFILE_ISOTRI )
-		{
-			selected_item = MI_PRISM;
-		}
-		else if ( linear_path && profile == LL_PCODE_PROFILE_EQUALTRI )
-		{
-			selected_item = MI_PRISM;
-		}
-		else if ( linear_path && profile == LL_PCODE_PROFILE_RIGHTTRI )
-		{
-			selected_item = MI_PRISM;
-		}
-		else if (path == LL_PCODE_PATH_FLEXIBLE) // shouldn't happen
-		{
-			selected_item = MI_CYLINDER; // reasonable default
-		}
-		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y > 0.75f)
-		{
-			selected_item = MI_SPHERE;
-		}
-		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y <= 0.75f)
-		{
-			selected_item = MI_TORUS;
-		}
-		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE_HALF)
-		{
-			selected_item = MI_SPHERE;
-		}
-		else if ( path == LL_PCODE_PATH_CIRCLE2 && profile == LL_PCODE_PROFILE_CIRCLE )
-		{
-			// Spirals aren't supported.  Make it into a sphere.  JC
-			selected_item = MI_SPHERE;
-		}
-		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_EQUALTRI )
-		{
-			selected_item = MI_RING;
-		}
-		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_SQUARE && scale_y <= 0.75f)
-		{
-			selected_item = MI_TUBE;
-		}
-		else
-		{
-			llinfos << "Unknown path " << (S32) path << " profile " << (S32) profile << " in getState" << llendl;
-			selected_item = MI_BOX;
-		}
-
-
-		if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
-		{
-			selected_item = MI_SCULPT;
-			//LLFirstUse::useSculptedPrim();
-		}
-
-		
-		mComboBaseType	->setCurrentByIndex( selected_item );
-		mSelectedType = selected_item;
-		
-		// Grab S path
-		F32 begin_s	= volume_params.getBeginS();
-		F32 end_s	= volume_params.getEndS();
-
-		// Compute cut and advanced cut from S and T
-		F32 begin_t = volume_params.getBeginT();
-		F32 end_t	= volume_params.getEndT();
-
-		// Hollowness
-		F32 hollow = volume_params.getHollow();
-		mSpinHollow->set( 100.f * hollow );
-
-		// All hollow objects allow a shape to be selected.
-		if (hollow > 0.f)
-		{
-			switch (hole)
-			{
-			case LL_PCODE_HOLE_CIRCLE:
-				selected_hole = MI_HOLE_CIRCLE;
-				break;
-			case LL_PCODE_HOLE_SQUARE:
-				selected_hole = MI_HOLE_SQUARE;
-				break;
-			case LL_PCODE_HOLE_TRIANGLE:
-				selected_hole = MI_HOLE_TRIANGLE;
-				break;
-			case LL_PCODE_HOLE_SAME:
-			default:
-				selected_hole = MI_HOLE_SAME;
-				break;
-			}
-			mComboHoleType->setCurrentByIndex( selected_hole );
-			hole_enabled = enabled;
-		}
-		else
-		{
-			mComboHoleType->setCurrentByIndex( MI_HOLE_SAME );
-			hole_enabled = FALSE;
-		}
-
-		// Cut interpretation varies based on base object type
-		F32 cut_begin, cut_end, adv_cut_begin, adv_cut_end;
-
-		if ( selected_item == MI_SPHERE || selected_item == MI_TORUS || 
-			 selected_item == MI_TUBE   || selected_item == MI_RING )
-		{
-			cut_begin		= begin_t;
-			cut_end			= end_t;
-			adv_cut_begin	= begin_s;
-			adv_cut_end		= end_s;
-		}
-		else
-		{
-			cut_begin       = begin_s;
-			cut_end         = end_s;
-			adv_cut_begin   = begin_t;
-			adv_cut_end     = end_t;
-		}
-
-		mSpinCutBegin	->set( cut_begin );
-		mSpinCutEnd		->set( cut_end );
-		mCtrlPathBegin	->set( adv_cut_begin );
-		mCtrlPathEnd	->set( adv_cut_end );
-
-		// Twist
-		F32 twist		= volume_params.getTwist();
-		F32 twist_begin = volume_params.getTwistBegin();
-		// Check the path type for conversion.
-		if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
-		{
-			twist		*= OBJECT_TWIST_LINEAR_MAX;
-			twist_begin	*= OBJECT_TWIST_LINEAR_MAX;
-		}
-		else
-		{
-			twist		*= OBJECT_TWIST_MAX;
-			twist_begin	*= OBJECT_TWIST_MAX;
-		}
-
-		mSpinTwist		->set( twist );
-		mSpinTwistBegin	->set( twist_begin );
-
-		// Shear
-		F32 shear_x = volume_params.getShearX();
-		F32 shear_y = volume_params.getShearY();
-		mSpinShearX->set( shear_x );
-		mSpinShearY->set( shear_y );
-
-		// Taper
-		F32 taper_x	= volume_params.getTaperX();
-		F32 taper_y = volume_params.getTaperY();
-		mSpinTaperX->set( taper_x );
-		mSpinTaperY->set( taper_y );
-
-		// Radius offset.
-		F32 radius_offset = volume_params.getRadiusOffset();
-		// Limit radius offset, based on taper and hole size y.
-		F32 radius_mag = fabs(radius_offset);
-		F32 hole_y_mag = fabs(scale_y);
-		F32 taper_y_mag  = fabs(taper_y);
-		// Check to see if the taper effects us.
-		if ( (radius_offset > 0.f && taper_y < 0.f) ||
-			 (radius_offset < 0.f && taper_y > 0.f) )
-		{
-			// The taper does not help increase the radius offset range.
-			taper_y_mag = 0.f;
-		}
-		F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
-		// Enforce the maximum magnitude.
-		if (radius_mag > max_radius_mag)
-		{
-			// Check radius offset sign.
-			if (radius_offset < 0.f)
-			{
-				radius_offset = -max_radius_mag;
-			}
-			else
-			{
-				radius_offset = max_radius_mag;
-			}
-		}
-		mSpinRadiusOffset->set( radius_offset);
-
-		// Revolutions
-		F32 revolutions = volume_params.getRevolutions();
-		mSpinRevolutions->set( revolutions );
-		
-		// Skew
-		F32 skew	= volume_params.getSkew();
-		// Limit skew, based on revolutions hole size x.
-		F32 skew_mag= fabs(skew);
-		F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
-		// Discontinuity; A revolution of 1 allows skews below 0.5.
-		if ( fabs(revolutions - 1.0f) < 0.001)
-			min_skew_mag = 0.0f;
-
-		// Clip skew.
-		if (skew_mag < min_skew_mag)
-		{
-			// Check skew sign.
-			if (skew < 0.0f)
-			{
-				skew = -min_skew_mag;
-			}
-			else 
-			{
-				skew = min_skew_mag;
-			}
-		}
-		mSpinSkew->set( skew );
-	}
-	
-	// Compute control visibility, label names, and twist range.
-	// Start with defaults.
-	BOOL cut_visible                = TRUE;
-	BOOL hollow_visible             = TRUE;
-	BOOL top_size_x_visible			= TRUE;
-	BOOL top_size_y_visible			= TRUE;
-	BOOL top_shear_x_visible		= TRUE;
-	BOOL top_shear_y_visible		= TRUE;
-	BOOL twist_visible				= TRUE;
-	BOOL advanced_cut_visible		= FALSE;
-	BOOL taper_visible				= FALSE;
-	BOOL skew_visible				= FALSE;
-	BOOL radius_offset_visible		= FALSE;
-	BOOL revolutions_visible		= FALSE;
-	BOOL sculpt_texture_visible     = FALSE;
-	F32	 twist_min					= OBJECT_TWIST_LINEAR_MIN;
-	F32	 twist_max					= OBJECT_TWIST_LINEAR_MAX;
-	F32	 twist_inc					= OBJECT_TWIST_LINEAR_INC;
-
-	BOOL advanced_is_dimple = FALSE;
-	BOOL advanced_is_slice = FALSE;
-	BOOL size_is_hole = FALSE;
-
-	// Tune based on overall volume type
-	switch (selected_item)
-	{
-	case MI_SPHERE:
-		top_size_x_visible		= FALSE;
-		top_size_y_visible		= FALSE;
-		top_shear_x_visible		= FALSE;
-		top_shear_y_visible		= FALSE;
-		//twist_visible			= FALSE;
-		advanced_cut_visible	= TRUE;
-		advanced_is_dimple		= TRUE;
-		twist_min				= OBJECT_TWIST_MIN;
-		twist_max				= OBJECT_TWIST_MAX;
-		twist_inc				= OBJECT_TWIST_INC;
-		break;
-
-	case MI_TORUS:
-	case MI_TUBE:	
-	case MI_RING:
-		//top_size_x_visible		= FALSE;
-		//top_size_y_visible		= FALSE;
-	  	size_is_hole 			= TRUE;
-		skew_visible			= TRUE;
-		advanced_cut_visible	= TRUE;
-		taper_visible			= TRUE;
-		radius_offset_visible	= TRUE;
-		revolutions_visible		= TRUE;
-		twist_min				= OBJECT_TWIST_MIN;
-		twist_max				= OBJECT_TWIST_MAX;
-		twist_inc				= OBJECT_TWIST_INC;
-
-		break;
-
-	case MI_SCULPT:
-		cut_visible             = FALSE;
-		hollow_visible          = FALSE;
-		twist_visible           = FALSE;
-		top_size_x_visible      = FALSE;
-		top_size_y_visible      = FALSE;
-		top_shear_x_visible     = FALSE;
-		top_shear_y_visible     = FALSE;
-		skew_visible            = FALSE;
-		advanced_cut_visible    = FALSE;
-		taper_visible           = FALSE;
-		radius_offset_visible   = FALSE;
-		revolutions_visible     = FALSE;
-		sculpt_texture_visible  = TRUE;
-
-		break;
-		
-	case MI_BOX:
-		advanced_cut_visible	= TRUE;
-		advanced_is_slice		= TRUE;
-		break;
-
-	case MI_CYLINDER:
-		advanced_cut_visible	= TRUE;
-		advanced_is_slice		= TRUE;
-		break;
-
-	case MI_PRISM:
-		advanced_cut_visible	= TRUE;
-		advanced_is_slice		= TRUE;
-		break;
-
-	default:
-		break;
-	}
-
-	// Check if we need to change top size/hole size params.
-	switch (selected_item)
-	{
-	case MI_SPHERE:
-	case MI_TORUS:
-	case MI_TUBE:
-	case MI_RING:
-		mSpinScaleX->set( scale_x );
-		mSpinScaleY->set( scale_y );
-		mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
-		mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
-		mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
-		mSpinScaleY->setMaxValue(OBJECT_MAX_HOLE_SIZE_Y);
-		break;
-	default:
-		if (editable)
-		{
-			mSpinScaleX->set( 1.f - scale_x );
-			mSpinScaleY->set( 1.f - scale_y );
-			mSpinScaleX->setMinValue(-1.f);
-			mSpinScaleX->setMaxValue(1.f);
-			mSpinScaleY->setMinValue(-1.f);
-			mSpinScaleY->setMaxValue(1.f);
-		}
-		break;
-	}
-
-	// Check if we need to limit the hollow based on the hole type.
-	if (  selected_hole == MI_HOLE_SQUARE && 
-		  ( selected_item == MI_CYLINDER || selected_item == MI_TORUS ||
-		    selected_item == MI_PRISM    || selected_item == MI_RING  ||
-			selected_item == MI_SPHERE ) )
-	{
-		mSpinHollow->setMinValue(0.f);
-		mSpinHollow->setMaxValue(70.f);
-	}
-	else 
-	{
-		mSpinHollow->setMinValue(0.f);
-		mSpinHollow->setMaxValue(95.f);
-	}
-
-	// Update field enablement
-	mComboBaseType	->setEnabled( enabled );
-
-	mLabelCut		->setEnabled( enabled );
-	mSpinCutBegin	->setEnabled( enabled );
-	mSpinCutEnd		->setEnabled( enabled );
-
-	mLabelHollow	->setEnabled( enabled );
-	mSpinHollow		->setEnabled( enabled );
-	mLabelHoleType	->setEnabled( hole_enabled );
-	mComboHoleType	->setEnabled( hole_enabled );
-
-	mLabelTwist		->setEnabled( enabled );
-	mSpinTwist		->setEnabled( enabled );
-	mSpinTwistBegin	->setEnabled( enabled );
-
-	mLabelSkew		->setEnabled( enabled );
-	mSpinSkew		->setEnabled( enabled );
-
-	getChildView("scale_hole")->setVisible( FALSE);
-	getChildView("scale_taper")->setVisible( FALSE);
-	if (top_size_x_visible || top_size_y_visible)
-	{
-		if (size_is_hole)
-		{
-			getChildView("scale_hole")->setVisible( TRUE);
-			getChildView("scale_hole")->setEnabled(enabled);
-		}
-		else
-		{
-			getChildView("scale_taper")->setVisible( TRUE);
-			getChildView("scale_taper")->setEnabled(enabled);
-		}
-	}
-	
-	mSpinScaleX		->setEnabled( enabled );
-	mSpinScaleY		->setEnabled( enabled );
-
-	mLabelShear		->setEnabled( enabled );
-	mSpinShearX		->setEnabled( enabled );
-	mSpinShearY		->setEnabled( enabled );
-
-	getChildView("advanced_cut")->setVisible( FALSE);
-	getChildView("advanced_dimple")->setVisible( FALSE);
-	getChildView("advanced_slice")->setVisible( FALSE);
-
-	if (advanced_cut_visible)
-	{
-		if (advanced_is_dimple)
-		{
-			getChildView("advanced_dimple")->setVisible( TRUE);
-			getChildView("advanced_dimple")->setEnabled(enabled);
-		}
-
-		else if (advanced_is_slice)
-		{
-			getChildView("advanced_slice")->setVisible( TRUE);
-			getChildView("advanced_slice")->setEnabled(enabled);
-		}
-		else
-		{
-			getChildView("advanced_cut")->setVisible( TRUE);
-			getChildView("advanced_cut")->setEnabled(enabled);
-		}
-	}
-	
-	mCtrlPathBegin	->setEnabled( enabled );
-	mCtrlPathEnd	->setEnabled( enabled );
-
-	mLabelTaper		->setEnabled( enabled );
-	mSpinTaperX		->setEnabled( enabled );
-	mSpinTaperY		->setEnabled( enabled );
-
-	mLabelRadiusOffset->setEnabled( enabled );
-	mSpinRadiusOffset ->setEnabled( enabled );
-
-	mLabelRevolutions->setEnabled( enabled );
-	mSpinRevolutions ->setEnabled( enabled );
-
-	// Update field visibility
-	mLabelCut		->setVisible( cut_visible );
-	mSpinCutBegin	->setVisible( cut_visible );
-	mSpinCutEnd		->setVisible( cut_visible ); 
-
-	mLabelHollow	->setVisible( hollow_visible );
-	mSpinHollow		->setVisible( hollow_visible );
-	mLabelHoleType	->setVisible( hollow_visible );
-	mComboHoleType	->setVisible( hollow_visible );
-	
-	mLabelTwist		->setVisible( twist_visible );
-	mSpinTwist		->setVisible( twist_visible );
-	mSpinTwistBegin	->setVisible( twist_visible );
-	mSpinTwist		->setMinValue(  twist_min );
-	mSpinTwist		->setMaxValue(  twist_max );
-	mSpinTwist		->setIncrement( twist_inc );
-	mSpinTwistBegin	->setMinValue(  twist_min );
-	mSpinTwistBegin	->setMaxValue(  twist_max );
-	mSpinTwistBegin	->setIncrement( twist_inc );
-
-	mSpinScaleX		->setVisible( top_size_x_visible );
-	mSpinScaleY		->setVisible( top_size_y_visible );
-
-	mLabelSkew		->setVisible( skew_visible );
-	mSpinSkew		->setVisible( skew_visible );
-
-	mLabelShear		->setVisible( top_shear_x_visible || top_shear_y_visible );
-	mSpinShearX		->setVisible( top_shear_x_visible );
-	mSpinShearY		->setVisible( top_shear_y_visible );
-
-	mCtrlPathBegin	->setVisible( advanced_cut_visible );
-	mCtrlPathEnd	->setVisible( advanced_cut_visible );
-
-	mLabelTaper		->setVisible( taper_visible );
-	mSpinTaperX		->setVisible( taper_visible );
-	mSpinTaperY		->setVisible( taper_visible );
-
-	mLabelRadiusOffset->setVisible( radius_offset_visible );
-	mSpinRadiusOffset ->setVisible( radius_offset_visible );
-
-	mLabelRevolutions->setVisible( revolutions_visible );
-	mSpinRevolutions ->setVisible( revolutions_visible );
-
-	mCtrlSculptTexture->setVisible(sculpt_texture_visible);
-	mLabelSculptType->setVisible(sculpt_texture_visible);
-	mCtrlSculptType->setVisible(sculpt_texture_visible);
-	mCtrlSculptMirror->setVisible(sculpt_texture_visible);
-	mCtrlSculptInvert->setVisible(sculpt_texture_visible);
-
-
-	// sculpt texture
-
-	if (selected_item == MI_SCULPT)
-	{
-
-
-		LLUUID id;
-		LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
-
-		
-		if (sculpt_params) // if we have a legal sculpt param block for this object:
-		{
-			if (mObject != objectp)  // we've just selected a new object, so save for undo
-			{
-				mSculptTextureRevert = sculpt_params->getSculptTexture();
-				mSculptTypeRevert    = sculpt_params->getSculptType();
-			}
-		
-			U8 sculpt_type = sculpt_params->getSculptType();
-			U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
-			BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
-			BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
-			isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
-
-			LLTextureCtrl*  mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
-			if(mTextureCtrl)
-			{
-				mTextureCtrl->setTentative(FALSE);
-				mTextureCtrl->setEnabled(editable && !isMesh);
-				if (editable)
-					mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture());
-				else
-					mTextureCtrl->setImageAssetID(LLUUID::null);
-			}
-
-			mComboBaseType->setEnabled(!isMesh);
-			
-			if (mCtrlSculptType)
-			{
-				mCtrlSculptType->setCurrentByIndex(sculpt_stitching);
-				mCtrlSculptType->setEnabled(editable && !isMesh);
-			}
-
-			if (mCtrlSculptMirror)
-			{
-				mCtrlSculptMirror->set(sculpt_mirror);
-				mCtrlSculptMirror->setEnabled(editable);
-			}
-
-			if (mCtrlSculptInvert)
-			{
-				mCtrlSculptInvert->set(sculpt_invert);
-				mCtrlSculptInvert->setEnabled(editable);
-			}
-
-			if (mLabelSculptType)
-			{
-				mLabelSculptType->setEnabled(TRUE);
-			}
-			
-		}
-	}
-	else
-	{
-		mSculptTextureRevert = LLUUID::null;		
-	}
-
-	//----------------------------------------------------------------------------
-
-	mObject = objectp;
-	mRootObject = root_objectp;
-}
-
-// static
-bool LLPanelObject::precommitValidate( const LLSD& data )
-{
-	// TODO: Richard will fill this in later.  
-	return TRUE; // FALSE means that validation failed and new value should not be commited.
-}
-
-void LLPanelObject::sendIsPhysical()
-{
-	BOOL value = mCheckPhysics->get();
-	if( mIsPhysical != value )
-	{
-		LLSelectMgr::getInstance()->selectionUpdatePhysics(value);
-		mIsPhysical = value;
-
-		llinfos << "update physics sent" << llendl;
-	}
-	else
-	{
-		llinfos << "update physics not changed" << llendl;
-	}
-}
-
-void LLPanelObject::sendIsTemporary()
-{
-	BOOL value = mCheckTemporary->get();
-	if( mIsTemporary != value )
-	{
-		LLSelectMgr::getInstance()->selectionUpdateTemporary(value);
-		mIsTemporary = value;
-
-		llinfos << "update temporary sent" << llendl;
-	}
-	else
-	{
-		llinfos << "update temporary not changed" << llendl;
-	}
-}
-
-
-void LLPanelObject::sendIsPhantom()
-{
-	BOOL value = mCheckPhantom->get();
-	if( mIsPhantom != value )
-	{
-		LLSelectMgr::getInstance()->selectionUpdatePhantom(value);
-		mIsPhantom = value;
-
-		llinfos << "update phantom sent" << llendl;
-	}
-	else
-	{
-		llinfos << "update phantom not changed" << llendl;
-	}
-}
-
-void LLPanelObject::sendCastShadows()
-{
-	BOOL value = mCheckCastShadows->get();
-	if( mCastShadows != value )
-	{
-		LLSelectMgr::getInstance()->selectionUpdateCastShadows(value);
-		mCastShadows = value;
-
-		llinfos << "update cast shadows sent" << llendl;
-	}
-	else
-	{
-		llinfos << "update cast shadows not changed" << llendl;
-	}
-}
-
-// static
-void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-
-	if (self->mObject.isNull())
-	{
-		return;
-	}
-
-	if (self->mObject->getPCode() != LL_PCODE_VOLUME)
-	{
-		// Don't allow modification of non-volume objects.
-		return;
-	}
-
-	LLVolume *volume = self->mObject->getVolume();
-	if (!volume)
-	{
-		return;
-	}
-
-	LLVolumeParams volume_params;
-	self->getVolumeParams(volume_params);
-	
-
-	
-	// set sculpting
-	S32 selected_type = self->mComboBaseType->getCurrentIndex();
-
-	if (selected_type == MI_SCULPT)
-	{
-		self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, TRUE, TRUE);
-		LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
-		if (sculpt_params)
-			volume_params.setSculptID(sculpt_params->getSculptTexture(), sculpt_params->getSculptType());
-	}
-	else
-	{
-		LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
-		if (sculpt_params)
-			self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, FALSE, TRUE);
-	}
-
-	// Update the volume, if necessary.
-	self->mObject->updateVolume(volume_params);
-
-
-	// This was added to make sure thate when changes are made, the UI
-	// adjusts to present valid options.
-	// *FIX: only some changes, ie, hollow or primitive type changes,
-	// require a refresh.
-	self->refresh();
-
-}
-
-void LLPanelObject::getVolumeParams(LLVolumeParams& volume_params)
-{
-	// Figure out what type of volume to make
-	S32 was_selected_type = mSelectedType;
-	S32 selected_type = mComboBaseType->getCurrentIndex();
-	U8 profile;
-	U8 path;
-	switch ( selected_type )
-	{
-	case MI_CYLINDER:
-		profile = LL_PCODE_PROFILE_CIRCLE;
-		path = LL_PCODE_PATH_LINE;
-		break;
-
-	case MI_BOX:
-		profile = LL_PCODE_PROFILE_SQUARE;
-		path = LL_PCODE_PATH_LINE;
-		break;
-
-	case MI_PRISM:
-		profile = LL_PCODE_PROFILE_EQUALTRI;
-		path = LL_PCODE_PATH_LINE;
-		break;
-
-	case MI_SPHERE:
-		profile = LL_PCODE_PROFILE_CIRCLE_HALF;
-		path = LL_PCODE_PATH_CIRCLE;
-		break;
-
-	case MI_TORUS:
-		profile = LL_PCODE_PROFILE_CIRCLE;
-		path = LL_PCODE_PATH_CIRCLE;
-		break;
-
-	case MI_TUBE:
-		profile = LL_PCODE_PROFILE_SQUARE;
-		path = LL_PCODE_PATH_CIRCLE;
-		break;
-
-	case MI_RING:
-		profile = LL_PCODE_PROFILE_EQUALTRI;
-		path = LL_PCODE_PATH_CIRCLE;
-		break;
-
-	case MI_SCULPT:
-		profile = LL_PCODE_PROFILE_CIRCLE;
-		path = LL_PCODE_PATH_CIRCLE;
-		break;
-		
-	default:
-		llwarns << "Unknown base type " << selected_type 
-			<< " in getVolumeParams()" << llendl;
-		// assume a box
-		selected_type = MI_BOX;
-		profile = LL_PCODE_PROFILE_SQUARE;
-		path = LL_PCODE_PATH_LINE;
-		break;
-	}
-
-
-	if (path == LL_PCODE_PATH_LINE)
-	{
-		LLVOVolume *volobjp = (LLVOVolume *)(LLViewerObject*)(mObject);
-		if (volobjp->isFlexible())
-		{
-			path = LL_PCODE_PATH_FLEXIBLE;
-		}
-	}
-	
-	S32 selected_hole = mComboHoleType->getCurrentIndex();
-	U8 hole;
-	switch (selected_hole)
-	{
-	case MI_HOLE_CIRCLE: 
-		hole = LL_PCODE_HOLE_CIRCLE;
-		break;
-	case MI_HOLE_SQUARE:
-		hole = LL_PCODE_HOLE_SQUARE;
-		break;
-	case MI_HOLE_TRIANGLE:
-		hole = LL_PCODE_HOLE_TRIANGLE;
-		break;
-	case MI_HOLE_SAME:
-	default:
-		hole = LL_PCODE_HOLE_SAME;
-		break;
-	}
-
-	volume_params.setType(profile | hole, path);
-	mSelectedType = selected_type;
-	
-	// Compute cut start/end
-	F32 cut_begin	= mSpinCutBegin->get();
-	F32 cut_end		= mSpinCutEnd->get();
-
-	// Make sure at least OBJECT_CUT_INC of the object survives
-	if (cut_begin > cut_end - OBJECT_MIN_CUT_INC)
-	{
-		cut_begin = cut_end - OBJECT_MIN_CUT_INC;
-		mSpinCutBegin->set(cut_begin);
-	}
-
-	F32 adv_cut_begin	= mCtrlPathBegin->get();
-	F32 adv_cut_end		= mCtrlPathEnd->get();
-
-	// Make sure at least OBJECT_CUT_INC of the object survives
-	if (adv_cut_begin > adv_cut_end - OBJECT_MIN_CUT_INC)
-	{
-		adv_cut_begin = adv_cut_end - OBJECT_MIN_CUT_INC;
-		mCtrlPathBegin->set(adv_cut_begin);
-	}
-
-	F32 begin_s, end_s;
-	F32 begin_t, end_t;
-
-	if (selected_type == MI_SPHERE || selected_type == MI_TORUS || 
-		selected_type == MI_TUBE   || selected_type == MI_RING)
-	{
-		begin_s = adv_cut_begin;
-		end_s	= adv_cut_end;
-
-		begin_t = cut_begin;
-		end_t	= cut_end;
-	}
-	else
-	{
-		begin_s = cut_begin;
-		end_s	= cut_end;
-
-		begin_t = adv_cut_begin;
-		end_t	= adv_cut_end;
-	}
-
-	volume_params.setBeginAndEndS(begin_s, end_s);
-	volume_params.setBeginAndEndT(begin_t, end_t);
-
-	// Hollowness
-	F32 hollow = mSpinHollow->get() / 100.f;
-
-	if (  selected_hole == MI_HOLE_SQUARE && 
-		( selected_type == MI_CYLINDER || selected_type == MI_TORUS ||
-		  selected_type == MI_PRISM    || selected_type == MI_RING  ||
-		  selected_type == MI_SPHERE ) )
-	{
-		if (hollow > 0.7f) hollow = 0.7f;
-	}
-
-	volume_params.setHollow( hollow );
-
-	// Twist Begin,End
-	F32 twist_begin = mSpinTwistBegin->get();
-	F32 twist		= mSpinTwist->get();
-	// Check the path type for twist conversion.
-	if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
-	{
-		twist_begin	/= OBJECT_TWIST_LINEAR_MAX;
-		twist		/= OBJECT_TWIST_LINEAR_MAX;
-	}
-	else
-	{
-		twist_begin	/= OBJECT_TWIST_MAX;
-		twist		/= OBJECT_TWIST_MAX;
-	}
-
-	volume_params.setTwistBegin(twist_begin);
-	volume_params.setTwist(twist);
-
-	// Scale X,Y
-	F32 scale_x = mSpinScaleX->get();
-	F32 scale_y = mSpinScaleY->get();
-	if ( was_selected_type == MI_BOX || was_selected_type == MI_CYLINDER || was_selected_type == MI_PRISM)
-	{
-		scale_x = 1.f - scale_x;
-		scale_y = 1.f - scale_y;
-	}
-	
-	// Skew
-	F32 skew = mSpinSkew->get();
-
-	// Taper X,Y
-	F32 taper_x = mSpinTaperX->get();
-	F32 taper_y = mSpinTaperY->get();
-
-	// Radius offset
-	F32 radius_offset = mSpinRadiusOffset->get();
-
-	// Revolutions
-	F32 revolutions	  = mSpinRevolutions->get();
-
-	if ( selected_type == MI_SPHERE )
-	{
-		// Snap values to valid sphere parameters.
-		scale_x			= 1.0f;
-		scale_y			= 1.0f;
-		skew			= 0.0f;
-		taper_x			= 0.0f;
-		taper_y			= 0.0f;
-		radius_offset	= 0.0f;
-		revolutions		= 1.0f;
-	}
-	else if ( selected_type == MI_TORUS || selected_type == MI_TUBE ||
-			  selected_type == MI_RING )
-	{
-		scale_x = llclamp(
-			scale_x,
-			OBJECT_MIN_HOLE_SIZE,
-			OBJECT_MAX_HOLE_SIZE_X);
-		scale_y = llclamp(
-			scale_y,
-			OBJECT_MIN_HOLE_SIZE,
-			OBJECT_MAX_HOLE_SIZE_Y);
-
-		// Limit radius offset, based on taper and hole size y.
-		F32 radius_mag = fabs(radius_offset);
-		F32 hole_y_mag = fabs(scale_y);
-		F32 taper_y_mag  = fabs(taper_y);
-		// Check to see if the taper effects us.
-		if ( (radius_offset > 0.f && taper_y < 0.f) ||
-			 (radius_offset < 0.f && taper_y > 0.f) )
-		{
-			// The taper does not help increase the radius offset range.
-			taper_y_mag = 0.f;
-		}
-		F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
-		// Enforce the maximum magnitude.
-		if (radius_mag > max_radius_mag)
-		{
-			// Check radius offset sign.
-			if (radius_offset < 0.f)
-			{
-				radius_offset = -max_radius_mag;
-			}
-			else
-			{
-				radius_offset = max_radius_mag;
-			}
-		}
-			
-		// Check the skew value against the revolutions.
-		F32 skew_mag= fabs(skew);
-		F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
-		// Discontinuity; A revolution of 1 allows skews below 0.5.
-		if ( fabs(revolutions - 1.0f) < 0.001)
-			min_skew_mag = 0.0f;
-
-		// Clip skew.
-		if (skew_mag < min_skew_mag)
-		{
-			// Check skew sign.
-			if (skew < 0.0f)
-			{
-				skew = -min_skew_mag;
-			}
-			else 
-			{
-				skew = min_skew_mag;
-			}
-		}
-	}
-
-	volume_params.setRatio( scale_x, scale_y );
-	volume_params.setSkew(skew);
-	volume_params.setTaper( taper_x, taper_y );
-	volume_params.setRadiusOffset(radius_offset);
-	volume_params.setRevolutions(revolutions);
-
-	// Shear X,Y
-	F32 shear_x = mSpinShearX->get();
-	F32 shear_y = mSpinShearY->get();
-	volume_params.setShear( shear_x, shear_y );
-
-	if (selected_type == MI_SCULPT)
-	{
-		volume_params.setSculptID(LLUUID::null, 0);
-		volume_params.setBeginAndEndT   (0, 1);
-		volume_params.setBeginAndEndS   (0, 1);
-		volume_params.setHollow         (0);
-		volume_params.setTwistBegin     (0);
-		volume_params.setTwistEnd       (0);
-		volume_params.setRatio          (1, 0.5);
-		volume_params.setShear          (0, 0);
-		volume_params.setTaper          (0, 0);
-		volume_params.setRevolutions    (1);
-		volume_params.setRadiusOffset   (0);
-		volume_params.setSkew           (0);
-	}
-
-}
-
-// BUG: Make work with multiple objects
-void LLPanelObject::sendRotation(BOOL btn_down)
-{
-	if (mObject.isNull()) return;
-
-	LLVector3 new_rot(mCtrlRotX->get(), mCtrlRotY->get(), mCtrlRotZ->get());
-	new_rot.mV[VX] = llround(new_rot.mV[VX], OBJECT_ROTATION_PRECISION);
-	new_rot.mV[VY] = llround(new_rot.mV[VY], OBJECT_ROTATION_PRECISION);
-	new_rot.mV[VZ] = llround(new_rot.mV[VZ], OBJECT_ROTATION_PRECISION);
-
-	// Note: must compare before conversion to radians
-	LLVector3 delta = new_rot - mCurEulerDegrees;
-
-	if (delta.magVec() >= 0.0005f)
-	{
-		mCurEulerDegrees = new_rot;
-		new_rot *= DEG_TO_RAD;
-
-		LLQuaternion rotation;
-		rotation.setQuat(new_rot.mV[VX], new_rot.mV[VY], new_rot.mV[VZ]);
-
-		if (mRootObject != mObject)
-		{
-			rotation = rotation * ~mRootObject->getRotationRegion();
-		}
-		std::vector<LLVector3>& child_positions = mObject->mUnselectedChildrenPositions ;
-		std::vector<LLQuaternion> child_rotations;
-		if (mObject->isRootEdit())
-		{
-			mObject->saveUnselectedChildrenRotation(child_rotations) ;
-			mObject->saveUnselectedChildrenPosition(child_positions) ;			
-		}
-
-		mObject->setRotation(rotation);
-		LLManip::rebuild(mObject) ;
-
-		// for individually selected roots, we need to counterrotate all the children
-		if (mObject->isRootEdit())
-		{			
-			mObject->resetChildrenRotationAndPosition(child_rotations, child_positions) ;			
-		}
-
-		if(!btn_down)
-		{
-			child_positions.clear() ;
-			LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION);
-		}
-	}
-}
-
-
-// BUG: Make work with multiple objects
-void LLPanelObject::sendScale(BOOL btn_down)
-{
-	if (mObject.isNull()) return;
-
-	LLVector3 newscale(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get());
-
-	LLVector3 delta = newscale - mObject->getScale();
-	if (delta.magVec() >= 0.0005f)
-	{
-		// scale changed by more than 1/2 millimeter
-
-		// check to see if we aren't scaling the textures
-		// (in which case the tex coord's need to be recomputed)
-		BOOL dont_stretch_textures = !LLManipScale::getStretchTextures();
-		if (dont_stretch_textures)
-		{
-			LLSelectMgr::getInstance()->saveSelectedObjectTransform(SELECT_ACTION_TYPE_SCALE);
-		}
-
-		mObject->setScale(newscale, TRUE);
-
-		if(!btn_down)
-		{
-			LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION);
-		}
-
-		LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, !dont_stretch_textures);
-//		llinfos << "scale sent" << llendl;
-	}
-	else
-	{
-//		llinfos << "scale not changed" << llendl;
-	}
-}
-
-
-void LLPanelObject::sendPosition(BOOL btn_down)
-{	
-	if (mObject.isNull()) return;
-
-	LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
-	LLViewerRegion* regionp = mObject->getRegion();
-
-	// Clamp the Z height
-	const F32 height = newpos.mV[VZ];
-	const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject, mObject->getPositionGlobal());
-	const F32 max_height = LLWorld::getInstance()->getRegionMaxHeight();
-
-	if (!mObject->isAttachment())
-	{
-		if ( height < min_height)
-		{
-			newpos.mV[VZ] = min_height;
-			mCtrlPosZ->set( min_height );
-		}
-		else if ( height > max_height )
-		{
-			newpos.mV[VZ] = max_height;
-			mCtrlPosZ->set( max_height );
-		}
-
-		// Grass is always drawn on the ground, so clamp its position to the ground
-		if (mObject->getPCode() == LL_PCODE_LEGACY_GRASS)
-		{
-			mCtrlPosZ->set(LLWorld::getInstance()->resolveLandHeightAgent(newpos) + 1.f);
-		}
-	}
-
-	// Make sure new position is in a valid region, so the object
-	// won't get dumped by the simulator.
-	LLVector3d new_pos_global = regionp->getPosGlobalFromRegion(newpos);
-
-	if ( LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global) )
-	{
-		// send only if the position is changed, that is, the delta vector is not zero
-		LLVector3d old_pos_global = mObject->getPositionGlobal();
-		LLVector3d delta = new_pos_global - old_pos_global;
-		// moved more than 1/2 millimeter
-		if (delta.magVec() >= 0.0005f)
-		{			
-			if (mRootObject != mObject)
-			{
-				newpos = newpos - mRootObject->getPositionRegion();
-				newpos = newpos * ~mRootObject->getRotationRegion();
-				mObject->setPositionParent(newpos);
-			}
-			else
-			{
-				mObject->setPositionEdit(newpos);
-			}			
-			
-			LLManip::rebuild(mObject) ;
-
-			// for individually selected roots, we need to counter-translate all unselected children
-			if (mObject->isRootEdit())
-			{								
-				// only offset by parent's translation
-				mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;				
-			}
-
-			if(!btn_down)
-			{
-				LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
-			}
-
-			LLSelectMgr::getInstance()->updateSelectionCenter();
-		}
-	}
-	else
-	{
-		// move failed, so we update the UI with the correct values
-		LLVector3 vec = mRootObject->getPositionRegion();
-		mCtrlPosX->set(vec.mV[VX]);
-		mCtrlPosY->set(vec.mV[VY]);
-		mCtrlPosZ->set(vec.mV[VZ]);
-	}
-}
-
-void LLPanelObject::sendSculpt()
-{
-	if (mObject.isNull())
-		return;
-	
-	LLSculptParams sculpt_params;
-
-	if (mCtrlSculptTexture)
-		sculpt_params.setSculptTexture(mCtrlSculptTexture->getImageAssetID());
-
-	U8 sculpt_type = 0;
-	
-	if (mCtrlSculptType)
-		sculpt_type |= mCtrlSculptType->getCurrentIndex();
-
-	bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH;
-
-	if (mCtrlSculptMirror)
-	{
-		mCtrlSculptMirror->setEnabled(enabled ? TRUE : FALSE);
-	}
-	if (mCtrlSculptInvert)
-	{
-		mCtrlSculptInvert->setEnabled(enabled ? TRUE : FALSE);
-	}
-	
-	if ((mCtrlSculptMirror) && (mCtrlSculptMirror->get()))
-		sculpt_type |= LL_SCULPT_FLAG_MIRROR;
-
-	if ((mCtrlSculptInvert) && (mCtrlSculptInvert->get()))
-		sculpt_type |= LL_SCULPT_FLAG_INVERT;
-	
-	sculpt_params.setSculptType(sculpt_type);
-	mObject->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
-}
-
-void LLPanelObject::refresh()
-{
-	getState();
-	if (mObject.notNull() && mObject->isDead())
-	{
-		mObject = NULL;
-	}
-
-	if (mRootObject.notNull() && mRootObject->isDead())
-	{
-		mRootObject = NULL;
-	}
-	
-	bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && 
-					   gAgent.getRegion() &&
-					   !gAgent.getRegion()->getCapability("GetMesh").empty();
-
-	F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
-
-	getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale);
-	getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale);
-	getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale);
-
-	BOOL found = mCtrlSculptType->itemExists("Mesh");
-	if (enable_mesh && !found)
-	{
-		mCtrlSculptType->add("Mesh");
-	}
-	else if (!enable_mesh && found)
-	{
-		mCtrlSculptType->remove("Mesh");
-	}
-}
-
-
-void LLPanelObject::draw()
-{
-	const LLColor4	white(	1.0f,	1.0f,	1.0f,	1);
-	const LLColor4	red(	1.0f,	0.25f,	0.f,	1);
-	const LLColor4	green(	0.f,	1.0f,	0.f,	1);
-	const LLColor4	blue(	0.f,	0.5f,	1.0f,	1);
-
-	// Tune the colors of the labels
-	LLTool* tool = LLToolMgr::getInstance()->getCurrentTool();
-
-	if (tool == LLToolCompTranslate::getInstance())
-	{
-		mCtrlPosX	->setLabelColor(red);
-		mCtrlPosY	->setLabelColor(green);
-		mCtrlPosZ	->setLabelColor(blue);
-
-		mCtrlScaleX	->setLabelColor(white);
-		mCtrlScaleY	->setLabelColor(white);
-		mCtrlScaleZ	->setLabelColor(white);
-
-		mCtrlRotX	->setLabelColor(white);
-		mCtrlRotY	->setLabelColor(white);
-		mCtrlRotZ	->setLabelColor(white);
-	}
-	else if ( tool == LLToolCompScale::getInstance() )
-	{
-		mCtrlPosX	->setLabelColor(white);
-		mCtrlPosY	->setLabelColor(white);
-		mCtrlPosZ	->setLabelColor(white);
-
-		mCtrlScaleX	->setLabelColor(red);
-		mCtrlScaleY	->setLabelColor(green);
-		mCtrlScaleZ	->setLabelColor(blue);
-
-		mCtrlRotX	->setLabelColor(white);
-		mCtrlRotY	->setLabelColor(white);
-		mCtrlRotZ	->setLabelColor(white);
-	}
-	else if ( tool == LLToolCompRotate::getInstance() )
-	{
-		mCtrlPosX	->setLabelColor(white);
-		mCtrlPosY	->setLabelColor(white);
-		mCtrlPosZ	->setLabelColor(white);
-
-		mCtrlScaleX	->setLabelColor(white);
-		mCtrlScaleY	->setLabelColor(white);
-		mCtrlScaleZ	->setLabelColor(white);
-
-		mCtrlRotX	->setLabelColor(red);
-		mCtrlRotY	->setLabelColor(green);
-		mCtrlRotZ	->setLabelColor(blue);
-	}
-	else
-	{
-		mCtrlPosX	->setLabelColor(white);
-		mCtrlPosY	->setLabelColor(white);
-		mCtrlPosZ	->setLabelColor(white);
-
-		mCtrlScaleX	->setLabelColor(white);
-		mCtrlScaleY	->setLabelColor(white);
-		mCtrlScaleZ	->setLabelColor(white);
-
-		mCtrlRotX	->setLabelColor(white);
-		mCtrlRotY	->setLabelColor(white);
-		mCtrlRotZ	->setLabelColor(white);
-	}
-
-	LLPanel::draw();
-}
-
-// virtual
-void LLPanelObject::clearCtrls()
-{
-	LLPanel::clearCtrls();
-
-	mCheckLock		->set(FALSE);
-	mCheckLock		->setEnabled( FALSE );
-	mCheckPhysics	->set(FALSE);
-	mCheckPhysics	->setEnabled( FALSE );
-	mCheckTemporary	->set(FALSE);
-	mCheckTemporary	->setEnabled( FALSE );
-	mCheckPhantom	->set(FALSE);
-	mCheckPhantom	->setEnabled( FALSE );
-	
-#if 0 // 1.9.2
-	mCheckCastShadows->set(FALSE);
-	mCheckCastShadows->setEnabled( FALSE );
-#endif
-	// Disable text labels
-	mLabelPosition	->setEnabled( FALSE );
-	mLabelSize		->setEnabled( FALSE );
-	mLabelRotation	->setEnabled( FALSE );
-	mLabelCut		->setEnabled( FALSE );
-	mLabelHollow	->setEnabled( FALSE );
-	mLabelHoleType	->setEnabled( FALSE );
-	mLabelTwist		->setEnabled( FALSE );
-	mLabelSkew		->setEnabled( FALSE );
-	mLabelShear		->setEnabled( FALSE );
-	mLabelTaper		->setEnabled( FALSE );
-	mLabelRadiusOffset->setEnabled( FALSE );
-	mLabelRevolutions->setEnabled( FALSE );
-
-	getChildView("select_single")->setVisible( FALSE);
-	getChildView("edit_object")->setVisible( TRUE);	
-	getChildView("edit_object")->setEnabled(FALSE);
-	
-	getChildView("scale_hole")->setEnabled(FALSE);
-	getChildView("scale_taper")->setEnabled(FALSE);
-	getChildView("advanced_cut")->setEnabled(FALSE);
-	getChildView("advanced_dimple")->setEnabled(FALSE);
-	getChildView("advanced_slice")->setVisible( FALSE);
-}
-
-//
-// Static functions
-//
-
-// static
-void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data)
-{
-	// Checkbox will have toggled itself
-	LLPanelObject *self = (LLPanelObject *)data;
-
-	if(self->mRootObject.isNull()) return;
-
-	BOOL new_state = self->mCheckLock->get();
-	
-	LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, !new_state, PERM_MOVE | PERM_MODIFY);
-}
-
-// static
-void LLPanelObject::onCommitPosition( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-	BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
-	self->sendPosition(btn_down);
-}
-
-// static
-void LLPanelObject::onCommitScale( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-	BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
-	self->sendScale(btn_down);
-}
-
-// static
-void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-	BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
-	self->sendRotation(btn_down);
-}
-
-// static
-void LLPanelObject::onCommitPhysics( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-	self->sendIsPhysical();
-}
-
-// static
-void LLPanelObject::onCommitTemporary( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-	self->sendIsTemporary();
-}
-
-// static
-void LLPanelObject::onCommitPhantom( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-	self->sendIsPhantom();
-}
-
-// static
-void LLPanelObject::onCommitCastShadows( LLUICtrl* ctrl, void* userdata )
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-	self->sendCastShadows();
-}
-
-
-void LLPanelObject::onSelectSculpt(const LLSD& data)
-{
-    LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
-
-	if (mTextureCtrl)
-	{
-		mSculptTextureRevert = mTextureCtrl->getImageAssetID();
-	}
-	
-	sendSculpt();
-}
-
-
-void LLPanelObject::onCommitSculpt( const LLSD& data )
-{
-	sendSculpt();
-}
-
-BOOL LLPanelObject::onDropSculpt(LLInventoryItem* item)
-{
-    LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
-
-	if (mTextureCtrl)
-	{
-		LLUUID asset = item->getAssetUUID();
-
-		mTextureCtrl->setImageAssetID(asset);
-		mSculptTextureRevert = asset;
-	}
-
-	return TRUE;
-}
-
-
-void LLPanelObject::onCancelSculpt(const LLSD& data)
-{
-	LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
-	if(!mTextureCtrl)
-		return;
-	
-	mTextureCtrl->setImageAssetID(mSculptTextureRevert);
-	
-	sendSculpt();
-}
-
-// static
-void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata)
-{
-	LLPanelObject* self = (LLPanelObject*) userdata;
-
-	self->sendSculpt();
-}
+/** 
+ * @file llpanelobject.cpp
+ * @brief Object editing (position, scale, etc.) in the tools floater
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+// file include
+#include "llpanelobject.h"
+
+// linden library includes
+#include "lleconomy.h"
+#include "llerror.h"
+#include "llfontgl.h"
+#include "llpermissionsflags.h"
+#include "llstring.h"
+#include "llvolume.h"
+#include "m3math.h"
+
+// project includes
+#include "llagent.h"
+#include "llbutton.h"
+#include "llcheckboxctrl.h"
+#include "llcolorswatch.h"
+#include "llcombobox.h"
+#include "llfocusmgr.h"
+#include "llmanipscale.h"
+#include "llpreviewscript.h"
+#include "llresmgr.h"
+#include "llselectmgr.h"
+#include "llspinctrl.h"
+#include "lltexturectrl.h"
+#include "lltextbox.h"
+#include "lltool.h"
+#include "lltoolcomp.h"
+#include "lltoolmgr.h"
+#include "llui.h"
+#include "llviewerobject.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llvovolume.h"
+#include "llworld.h"
+#include "pipeline.h"
+#include "llviewercontrol.h"
+#include "lluictrlfactory.h"
+//#include "llfirstuse.h"
+
+#include "lldrawpool.h"
+
+//
+// Constants
+//
+enum {
+	MI_BOX,
+	MI_CYLINDER,
+	MI_PRISM,
+	MI_SPHERE,
+	MI_TORUS,
+	MI_TUBE,
+	MI_RING,
+	MI_SCULPT,
+	MI_NONE,
+	MI_VOLUME_COUNT
+};
+
+enum {
+	MI_HOLE_SAME,
+	MI_HOLE_CIRCLE,
+	MI_HOLE_SQUARE,
+	MI_HOLE_TRIANGLE,
+	MI_HOLE_COUNT
+};
+
+//static const std::string LEGACY_FULLBRIGHT_DESC =LLTrans::getString("Fullbright");
+
+BOOL	LLPanelObject::postBuild()
+{
+	setMouseOpaque(FALSE);
+	
+	//--------------------------------------------------------
+	// Top
+	//--------------------------------------------------------
+	
+	// Lock checkbox
+	mCheckLock = getChild<LLCheckBoxCtrl>("checkbox locked");
+	childSetCommitCallback("checkbox locked",onCommitLock,this);
+
+	// Physical checkbox
+	mCheckPhysics = getChild<LLCheckBoxCtrl>("Physical Checkbox Ctrl");
+	childSetCommitCallback("Physical Checkbox Ctrl",onCommitPhysics,this);
+
+	// Temporary checkbox
+	mCheckTemporary = getChild<LLCheckBoxCtrl>("Temporary Checkbox Ctrl");
+	childSetCommitCallback("Temporary Checkbox Ctrl",onCommitTemporary,this);
+
+	// Phantom checkbox
+	mCheckPhantom = getChild<LLCheckBoxCtrl>("Phantom Checkbox Ctrl");
+	childSetCommitCallback("Phantom Checkbox Ctrl",onCommitPhantom,this);
+       
+
+	// Position
+	mLabelPosition = getChild<LLTextBox>("label position");
+	mCtrlPosX = getChild<LLSpinCtrl>("Pos X");
+	childSetCommitCallback("Pos X",onCommitPosition,this);
+	mCtrlPosY = getChild<LLSpinCtrl>("Pos Y");
+	childSetCommitCallback("Pos Y",onCommitPosition,this);
+	mCtrlPosZ = getChild<LLSpinCtrl>("Pos Z");
+	childSetCommitCallback("Pos Z",onCommitPosition,this);
+
+	// Scale
+	mLabelSize = getChild<LLTextBox>("label size");
+	mCtrlScaleX = getChild<LLSpinCtrl>("Scale X");
+	childSetCommitCallback("Scale X",onCommitScale,this);
+
+	// Scale Y
+	mCtrlScaleY = getChild<LLSpinCtrl>("Scale Y");
+	childSetCommitCallback("Scale Y",onCommitScale,this);
+
+	// Scale Z
+	mCtrlScaleZ = getChild<LLSpinCtrl>("Scale Z");
+	childSetCommitCallback("Scale Z",onCommitScale,this);
+
+	// Rotation
+	mLabelRotation = getChild<LLTextBox>("label rotation");
+	mCtrlRotX = getChild<LLSpinCtrl>("Rot X");
+	childSetCommitCallback("Rot X",onCommitRotation,this);
+	mCtrlRotY = getChild<LLSpinCtrl>("Rot Y");
+	childSetCommitCallback("Rot Y",onCommitRotation,this);
+	mCtrlRotZ = getChild<LLSpinCtrl>("Rot Z");
+	childSetCommitCallback("Rot Z",onCommitRotation,this);
+
+	//--------------------------------------------------------
+		
+	// Base Type
+	mComboBaseType = getChild<LLComboBox>("comboBaseType");
+	childSetCommitCallback("comboBaseType",onCommitParametric,this);
+
+	// Cut
+	mLabelCut = getChild<LLTextBox>("text cut");
+	mSpinCutBegin = getChild<LLSpinCtrl>("cut begin");
+	childSetCommitCallback("cut begin",onCommitParametric,this);
+	mSpinCutBegin->setValidateBeforeCommit( precommitValidate );
+	mSpinCutEnd = getChild<LLSpinCtrl>("cut end");
+	childSetCommitCallback("cut end",onCommitParametric,this);
+	mSpinCutEnd->setValidateBeforeCommit( &precommitValidate );
+
+	// Hollow / Skew
+	mLabelHollow = getChild<LLTextBox>("text hollow");
+	mLabelSkew = getChild<LLTextBox>("text skew");
+	mSpinHollow = getChild<LLSpinCtrl>("Scale 1");
+	childSetCommitCallback("Scale 1",onCommitParametric,this);
+	mSpinHollow->setValidateBeforeCommit( &precommitValidate );
+	mSpinSkew = getChild<LLSpinCtrl>("Skew");
+	childSetCommitCallback("Skew",onCommitParametric,this);
+	mSpinSkew->setValidateBeforeCommit( &precommitValidate );
+	mLabelHoleType = getChild<LLTextBox>("Hollow Shape");
+
+	// Hole Type
+	mComboHoleType = getChild<LLComboBox>("hole");
+	childSetCommitCallback("hole",onCommitParametric,this);
+
+	// Twist
+	mLabelTwist = getChild<LLTextBox>("text twist");
+	mSpinTwistBegin = getChild<LLSpinCtrl>("Twist Begin");
+	childSetCommitCallback("Twist Begin",onCommitParametric,this);
+	mSpinTwistBegin->setValidateBeforeCommit( precommitValidate );
+	mSpinTwist = getChild<LLSpinCtrl>("Twist End");
+	childSetCommitCallback("Twist End",onCommitParametric,this);
+	mSpinTwist->setValidateBeforeCommit( &precommitValidate );
+
+	// Scale
+	mSpinScaleX = getChild<LLSpinCtrl>("Taper Scale X");
+	childSetCommitCallback("Taper Scale X",onCommitParametric,this);
+	mSpinScaleX->setValidateBeforeCommit( &precommitValidate );
+	mSpinScaleY = getChild<LLSpinCtrl>("Taper Scale Y");
+	childSetCommitCallback("Taper Scale Y",onCommitParametric,this);
+	mSpinScaleY->setValidateBeforeCommit( &precommitValidate );
+
+	// Shear
+	mLabelShear = getChild<LLTextBox>("text topshear");
+	mSpinShearX = getChild<LLSpinCtrl>("Shear X");
+	childSetCommitCallback("Shear X",onCommitParametric,this);
+	mSpinShearX->setValidateBeforeCommit( &precommitValidate );
+	mSpinShearY = getChild<LLSpinCtrl>("Shear Y");
+	childSetCommitCallback("Shear Y",onCommitParametric,this);
+	mSpinShearY->setValidateBeforeCommit( &precommitValidate );
+
+	// Path / Profile
+	mCtrlPathBegin = getChild<LLSpinCtrl>("Path Limit Begin");
+	childSetCommitCallback("Path Limit Begin",onCommitParametric,this);
+	mCtrlPathBegin->setValidateBeforeCommit( &precommitValidate );
+	mCtrlPathEnd = getChild<LLSpinCtrl>("Path Limit End");
+	childSetCommitCallback("Path Limit End",onCommitParametric,this);
+	mCtrlPathEnd->setValidateBeforeCommit( &precommitValidate );
+
+	// Taper
+	mLabelTaper = getChild<LLTextBox>("text taper2");
+	mSpinTaperX = getChild<LLSpinCtrl>("Taper X");
+	childSetCommitCallback("Taper X",onCommitParametric,this);
+	mSpinTaperX->setValidateBeforeCommit( precommitValidate );
+	mSpinTaperY = getChild<LLSpinCtrl>("Taper Y");
+	childSetCommitCallback("Taper Y",onCommitParametric,this);
+	mSpinTaperY->setValidateBeforeCommit( precommitValidate );
+	
+	// Radius Offset / Revolutions
+	mLabelRadiusOffset = getChild<LLTextBox>("text radius delta");
+	mLabelRevolutions = getChild<LLTextBox>("text revolutions");
+	mSpinRadiusOffset = getChild<LLSpinCtrl>("Radius Offset");
+	childSetCommitCallback("Radius Offset",onCommitParametric,this);
+	mSpinRadiusOffset->setValidateBeforeCommit( &precommitValidate );
+	mSpinRevolutions = getChild<LLSpinCtrl>("Revolutions");
+	childSetCommitCallback("Revolutions",onCommitParametric,this);
+	mSpinRevolutions->setValidateBeforeCommit( &precommitValidate );
+
+	// Sculpt
+	mCtrlSculptTexture = getChild<LLTextureCtrl>("sculpt texture control");
+	if (mCtrlSculptTexture)
+	{
+		mCtrlSculptTexture->setDefaultImageAssetID(LLUUID(SCULPT_DEFAULT_TEXTURE));
+		mCtrlSculptTexture->setCommitCallback( boost::bind(&LLPanelObject::onCommitSculpt, this, _2 ));
+		mCtrlSculptTexture->setOnCancelCallback( boost::bind(&LLPanelObject::onCancelSculpt, this, _2 ));
+		mCtrlSculptTexture->setOnSelectCallback( boost::bind(&LLPanelObject::onSelectSculpt, this, _2 ));
+		mCtrlSculptTexture->setDropCallback( boost::bind(&LLPanelObject::onDropSculpt, this, _2 ));
+		// Don't allow (no copy) or (no transfer) textures to be selected during immediate mode
+		mCtrlSculptTexture->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+		// Allow any texture to be used during non-immediate mode.
+		mCtrlSculptTexture->setNonImmediateFilterPermMask(PERM_NONE);
+		LLAggregatePermissions texture_perms;
+		if (LLSelectMgr::getInstance()->selectGetAggregateTexturePermissions(texture_perms))
+		{
+			BOOL can_copy =
+				texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_EMPTY ||
+				texture_perms.getValue(PERM_COPY) == LLAggregatePermissions::AP_ALL;
+			BOOL can_transfer =
+				texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_EMPTY ||
+				texture_perms.getValue(PERM_TRANSFER) == LLAggregatePermissions::AP_ALL;
+			mCtrlSculptTexture->setCanApplyImmediately(can_copy && can_transfer);
+		}
+		else
+		{
+			mCtrlSculptTexture->setCanApplyImmediately(FALSE);
+		}
+	}
+
+	mLabelSculptType = getChild<LLTextBox>("label sculpt type");
+	mCtrlSculptType = getChild<LLComboBox>("sculpt type control");
+	childSetCommitCallback("sculpt type control", onCommitSculptType, this);
+	mCtrlSculptMirror = getChild<LLCheckBoxCtrl>("sculpt mirror control");
+	childSetCommitCallback("sculpt mirror control", onCommitSculptType, this);
+	mCtrlSculptInvert = getChild<LLCheckBoxCtrl>("sculpt invert control");
+	childSetCommitCallback("sculpt invert control", onCommitSculptType, this);
+	
+	// Start with everyone disabled
+	clearCtrls();
+
+	return TRUE;
+}
+
+LLPanelObject::LLPanelObject()
+:	LLPanel(),
+	mIsPhysical(FALSE),
+	mIsTemporary(FALSE),
+	mIsPhantom(FALSE),
+	mCastShadows(TRUE),
+	mSelectedType(MI_BOX),
+	mSculptTextureRevert(LLUUID::null),
+	mSculptTypeRevert(0)
+{
+}
+
+
+LLPanelObject::~LLPanelObject()
+{
+	// Children all cleaned up by default view destructor.
+}
+
+void LLPanelObject::getState( )
+{
+	LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
+	LLViewerObject* root_objectp = objectp;
+	if(!objectp)
+	{
+		objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+		// *FIX: shouldn't we just keep the child?
+		if (objectp)
+		{
+			LLViewerObject* parentp = objectp->getRootEdit();
+
+			if (parentp)
+			{
+				root_objectp = parentp;
+			}
+			else
+			{
+				root_objectp = objectp;
+			}
+		}
+	}
+
+	LLVOVolume *volobjp = NULL;
+	if ( objectp && (objectp->getPCode() == LL_PCODE_VOLUME))
+	{
+		volobjp = (LLVOVolume *)objectp;
+	}
+
+	if( !objectp )
+	{
+		//forfeit focus
+		if (gFocusMgr.childHasKeyboardFocus(this))
+		{
+			gFocusMgr.setKeyboardFocus(NULL);
+		}
+
+		// Disable all text input fields
+		clearCtrls();
+		return;
+	}
+
+	// can move or rotate only linked group with move permissions, or sub-object with move and modify perms
+	BOOL enable_move	= objectp->permMove() && !objectp->isAttachment() && (objectp->permModify() || !gSavedSettings.getBOOL("EditLinkedParts"));
+	BOOL enable_scale	= objectp->permMove() && objectp->permModify();
+	BOOL enable_rotate	= objectp->permMove() && ( (objectp->permModify() && !objectp->isAttachment()) || !gSavedSettings.getBOOL("EditLinkedParts"));
+
+	S32 selected_count = LLSelectMgr::getInstance()->getSelection()->getObjectCount();
+	BOOL single_volume = (LLSelectMgr::getInstance()->selectionAllPCode( LL_PCODE_VOLUME ))
+						 && (selected_count == 1);
+
+	if (LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() > 1)
+	{
+		enable_move = FALSE;
+		enable_scale = FALSE;
+		enable_rotate = FALSE;
+	}
+
+	LLVector3 vec;
+	if (enable_move)
+	{
+		vec = objectp->getPositionEdit();
+		mCtrlPosX->set( vec.mV[VX] );
+		mCtrlPosY->set( vec.mV[VY] );
+		mCtrlPosZ->set( vec.mV[VZ] );
+	}
+	else
+	{
+		mCtrlPosX->clear();
+		mCtrlPosY->clear();
+		mCtrlPosZ->clear();
+	}
+
+
+	mLabelPosition->setEnabled( enable_move );
+	mCtrlPosX->setEnabled(enable_move);
+	mCtrlPosY->setEnabled(enable_move);
+	mCtrlPosZ->setEnabled(enable_move);
+
+	if (enable_scale)
+	{
+		vec = objectp->getScale();
+		mCtrlScaleX->set( vec.mV[VX] );
+		mCtrlScaleY->set( vec.mV[VY] );
+		mCtrlScaleZ->set( vec.mV[VZ] );
+	}
+	else
+	{
+		mCtrlScaleX->clear();
+		mCtrlScaleY->clear();
+		mCtrlScaleZ->clear();
+	}
+
+	mLabelSize->setEnabled( enable_scale );
+	mCtrlScaleX->setEnabled( enable_scale );
+	mCtrlScaleY->setEnabled( enable_scale );
+	mCtrlScaleZ->setEnabled( enable_scale );
+
+	LLQuaternion object_rot = objectp->getRotationEdit();
+	object_rot.getEulerAngles(&(mCurEulerDegrees.mV[VX]), &(mCurEulerDegrees.mV[VY]), &(mCurEulerDegrees.mV[VZ]));
+	mCurEulerDegrees *= RAD_TO_DEG;
+	mCurEulerDegrees.mV[VX] = fmod(llround(mCurEulerDegrees.mV[VX], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+	mCurEulerDegrees.mV[VY] = fmod(llround(mCurEulerDegrees.mV[VY], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+	mCurEulerDegrees.mV[VZ] = fmod(llround(mCurEulerDegrees.mV[VZ], OBJECT_ROTATION_PRECISION) + 360.f, 360.f);
+
+	if (enable_rotate)
+	{
+		mCtrlRotX->set( mCurEulerDegrees.mV[VX] );
+		mCtrlRotY->set( mCurEulerDegrees.mV[VY] );
+		mCtrlRotZ->set( mCurEulerDegrees.mV[VZ] );
+	}
+	else
+	{
+		mCtrlRotX->clear();
+		mCtrlRotY->clear();
+		mCtrlRotZ->clear();
+	}
+
+	mLabelRotation->setEnabled( enable_rotate );
+	mCtrlRotX->setEnabled( enable_rotate );
+	mCtrlRotY->setEnabled( enable_rotate );
+	mCtrlRotZ->setEnabled( enable_rotate );
+
+	BOOL owners_identical;
+	LLUUID owner_id;
+	std::string owner_name;
+	owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
+
+	// BUG? Check for all objects being editable?
+	S32 roots_selected = LLSelectMgr::getInstance()->getSelection()->getRootObjectCount();
+	BOOL editable = root_objectp->permModify();
+
+	// Select Single Message
+	getChildView("select_single")->setVisible( FALSE);
+	getChildView("edit_object")->setVisible( FALSE);
+	if (!editable || single_volume || selected_count <= 1)
+	{
+		getChildView("edit_object")->setVisible( TRUE);
+		getChildView("edit_object")->setEnabled(TRUE);
+	}
+	else
+	{
+		getChildView("select_single")->setVisible( TRUE);
+		getChildView("select_single")->setEnabled(TRUE);
+	}
+	// Lock checkbox - only modifiable if you own the object.
+	BOOL self_owned = (gAgent.getID() == owner_id);
+	mCheckLock->setEnabled( roots_selected > 0 && self_owned );
+
+	// More lock and debit checkbox - get the values
+	BOOL valid;
+	U32 owner_mask_on;
+	U32 owner_mask_off;
+	valid = LLSelectMgr::getInstance()->selectGetPerm(PERM_OWNER, &owner_mask_on, &owner_mask_off);
+
+	if(valid)
+	{
+		if(owner_mask_on & PERM_MOVE)
+		{
+			// owner can move, so not locked
+			mCheckLock->set(FALSE);
+			mCheckLock->setTentative(FALSE);
+		}
+		else if(owner_mask_off & PERM_MOVE)
+		{
+			// owner can't move, so locked
+			mCheckLock->set(TRUE);
+			mCheckLock->setTentative(FALSE);
+		}
+		else
+		{
+			// some locked, some not locked
+			mCheckLock->set(FALSE);
+			mCheckLock->setTentative(TRUE);
+		}
+	}
+
+	BOOL is_flexible = volobjp && volobjp->isFlexible();
+
+	// Physics checkbox
+	mIsPhysical = root_objectp->usePhysics();
+	mCheckPhysics->set( mIsPhysical );
+	mCheckPhysics->setEnabled( roots_selected>0 
+								&& (editable || gAgent.isGodlike()) 
+								&& !is_flexible);
+
+	mIsTemporary = root_objectp->flagTemporaryOnRez();
+	mCheckTemporary->set( mIsTemporary );
+	mCheckTemporary->setEnabled( roots_selected>0 && editable );
+
+	mIsPhantom = root_objectp->flagPhantom();
+	mCheckPhantom->set( mIsPhantom );
+	mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible );
+
+       
+#if 0 // 1.9.2
+	mCastShadows = root_objectp->flagCastShadows();
+	mCheckCastShadows->set( mCastShadows );
+	mCheckCastShadows->setEnabled( roots_selected==1 && editable );
+#endif
+	
+	//----------------------------------------------------------------------------
+
+	S32 selected_item	= MI_BOX;
+	S32	selected_hole	= MI_HOLE_SAME;
+	BOOL enabled = FALSE;
+	BOOL hole_enabled = FALSE;
+	F32 scale_x=1.f, scale_y=1.f;
+	BOOL isMesh = FALSE;
+	
+	if( !objectp || !objectp->getVolume() || !editable || !single_volume)
+	{
+		// Clear out all geometry fields.
+		mComboBaseType->clear();
+		mSpinHollow->clear();
+		mSpinCutBegin->clear();
+		mSpinCutEnd->clear();
+		mCtrlPathBegin->clear();
+		mCtrlPathEnd->clear();
+		mSpinScaleX->clear();
+		mSpinScaleY->clear();
+		mSpinTwist->clear();
+		mSpinTwistBegin->clear();
+		mComboHoleType->clear();
+		mSpinShearX->clear();
+		mSpinShearY->clear();
+		mSpinTaperX->clear();
+		mSpinTaperY->clear();
+		mSpinRadiusOffset->clear();
+		mSpinRevolutions->clear();
+		mSpinSkew->clear();
+		
+		mSelectedType = MI_NONE;
+	}
+	else
+	{
+		// Only allowed to change these parameters for objects
+		// that you have permissions on AND are not attachments.
+		enabled = root_objectp->permModify();
+		
+		// Volume type
+		const LLVolumeParams &volume_params = objectp->getVolume()->getParams();
+		U8 path = volume_params.getPathParams().getCurveType();
+		U8 profile_and_hole = volume_params.getProfileParams().getCurveType();
+		U8 profile	= profile_and_hole & LL_PCODE_PROFILE_MASK;
+		U8 hole		= profile_and_hole & LL_PCODE_HOLE_MASK;
+		
+		// Scale goes first so we can differentiate between a sphere and a torus,
+		// which have the same profile and path types.
+
+		// Scale
+		scale_x = volume_params.getRatioX();
+		scale_y = volume_params.getRatioY();
+
+		BOOL linear_path = (path == LL_PCODE_PATH_LINE) || (path == LL_PCODE_PATH_FLEXIBLE);
+		if ( linear_path && profile == LL_PCODE_PROFILE_CIRCLE )
+		{
+			selected_item = MI_CYLINDER;
+		}
+		else if ( linear_path && profile == LL_PCODE_PROFILE_SQUARE )
+		{
+			selected_item = MI_BOX;
+		}
+		else if ( linear_path && profile == LL_PCODE_PROFILE_ISOTRI )
+		{
+			selected_item = MI_PRISM;
+		}
+		else if ( linear_path && profile == LL_PCODE_PROFILE_EQUALTRI )
+		{
+			selected_item = MI_PRISM;
+		}
+		else if ( linear_path && profile == LL_PCODE_PROFILE_RIGHTTRI )
+		{
+			selected_item = MI_PRISM;
+		}
+		else if (path == LL_PCODE_PATH_FLEXIBLE) // shouldn't happen
+		{
+			selected_item = MI_CYLINDER; // reasonable default
+		}
+		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y > 0.75f)
+		{
+			selected_item = MI_SPHERE;
+		}
+		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE && scale_y <= 0.75f)
+		{
+			selected_item = MI_TORUS;
+		}
+		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_CIRCLE_HALF)
+		{
+			selected_item = MI_SPHERE;
+		}
+		else if ( path == LL_PCODE_PATH_CIRCLE2 && profile == LL_PCODE_PROFILE_CIRCLE )
+		{
+			// Spirals aren't supported.  Make it into a sphere.  JC
+			selected_item = MI_SPHERE;
+		}
+		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_EQUALTRI )
+		{
+			selected_item = MI_RING;
+		}
+		else if ( path == LL_PCODE_PATH_CIRCLE && profile == LL_PCODE_PROFILE_SQUARE && scale_y <= 0.75f)
+		{
+			selected_item = MI_TUBE;
+		}
+		else
+		{
+			llinfos << "Unknown path " << (S32) path << " profile " << (S32) profile << " in getState" << llendl;
+			selected_item = MI_BOX;
+		}
+
+
+		if (objectp->getParameterEntryInUse(LLNetworkData::PARAMS_SCULPT))
+		{
+			selected_item = MI_SCULPT;
+			//LLFirstUse::useSculptedPrim();
+		}
+
+		
+		mComboBaseType	->setCurrentByIndex( selected_item );
+		mSelectedType = selected_item;
+		
+		// Grab S path
+		F32 begin_s	= volume_params.getBeginS();
+		F32 end_s	= volume_params.getEndS();
+
+		// Compute cut and advanced cut from S and T
+		F32 begin_t = volume_params.getBeginT();
+		F32 end_t	= volume_params.getEndT();
+
+		// Hollowness
+		F32 hollow = volume_params.getHollow();
+		mSpinHollow->set( 100.f * hollow );
+
+		// All hollow objects allow a shape to be selected.
+		if (hollow > 0.f)
+		{
+			switch (hole)
+			{
+			case LL_PCODE_HOLE_CIRCLE:
+				selected_hole = MI_HOLE_CIRCLE;
+				break;
+			case LL_PCODE_HOLE_SQUARE:
+				selected_hole = MI_HOLE_SQUARE;
+				break;
+			case LL_PCODE_HOLE_TRIANGLE:
+				selected_hole = MI_HOLE_TRIANGLE;
+				break;
+			case LL_PCODE_HOLE_SAME:
+			default:
+				selected_hole = MI_HOLE_SAME;
+				break;
+			}
+			mComboHoleType->setCurrentByIndex( selected_hole );
+			hole_enabled = enabled;
+		}
+		else
+		{
+			mComboHoleType->setCurrentByIndex( MI_HOLE_SAME );
+			hole_enabled = FALSE;
+		}
+
+		// Cut interpretation varies based on base object type
+		F32 cut_begin, cut_end, adv_cut_begin, adv_cut_end;
+
+		if ( selected_item == MI_SPHERE || selected_item == MI_TORUS || 
+			 selected_item == MI_TUBE   || selected_item == MI_RING )
+		{
+			cut_begin		= begin_t;
+			cut_end			= end_t;
+			adv_cut_begin	= begin_s;
+			adv_cut_end		= end_s;
+		}
+		else
+		{
+			cut_begin       = begin_s;
+			cut_end         = end_s;
+			adv_cut_begin   = begin_t;
+			adv_cut_end     = end_t;
+		}
+
+		mSpinCutBegin	->set( cut_begin );
+		mSpinCutEnd		->set( cut_end );
+		mCtrlPathBegin	->set( adv_cut_begin );
+		mCtrlPathEnd	->set( adv_cut_end );
+
+		// Twist
+		F32 twist		= volume_params.getTwist();
+		F32 twist_begin = volume_params.getTwistBegin();
+		// Check the path type for conversion.
+		if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
+		{
+			twist		*= OBJECT_TWIST_LINEAR_MAX;
+			twist_begin	*= OBJECT_TWIST_LINEAR_MAX;
+		}
+		else
+		{
+			twist		*= OBJECT_TWIST_MAX;
+			twist_begin	*= OBJECT_TWIST_MAX;
+		}
+
+		mSpinTwist		->set( twist );
+		mSpinTwistBegin	->set( twist_begin );
+
+		// Shear
+		F32 shear_x = volume_params.getShearX();
+		F32 shear_y = volume_params.getShearY();
+		mSpinShearX->set( shear_x );
+		mSpinShearY->set( shear_y );
+
+		// Taper
+		F32 taper_x	= volume_params.getTaperX();
+		F32 taper_y = volume_params.getTaperY();
+		mSpinTaperX->set( taper_x );
+		mSpinTaperY->set( taper_y );
+
+		// Radius offset.
+		F32 radius_offset = volume_params.getRadiusOffset();
+		// Limit radius offset, based on taper and hole size y.
+		F32 radius_mag = fabs(radius_offset);
+		F32 hole_y_mag = fabs(scale_y);
+		F32 taper_y_mag  = fabs(taper_y);
+		// Check to see if the taper effects us.
+		if ( (radius_offset > 0.f && taper_y < 0.f) ||
+			 (radius_offset < 0.f && taper_y > 0.f) )
+		{
+			// The taper does not help increase the radius offset range.
+			taper_y_mag = 0.f;
+		}
+		F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
+		// Enforce the maximum magnitude.
+		if (radius_mag > max_radius_mag)
+		{
+			// Check radius offset sign.
+			if (radius_offset < 0.f)
+			{
+				radius_offset = -max_radius_mag;
+			}
+			else
+			{
+				radius_offset = max_radius_mag;
+			}
+		}
+		mSpinRadiusOffset->set( radius_offset);
+
+		// Revolutions
+		F32 revolutions = volume_params.getRevolutions();
+		mSpinRevolutions->set( revolutions );
+		
+		// Skew
+		F32 skew	= volume_params.getSkew();
+		// Limit skew, based on revolutions hole size x.
+		F32 skew_mag= fabs(skew);
+		F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
+		// Discontinuity; A revolution of 1 allows skews below 0.5.
+		if ( fabs(revolutions - 1.0f) < 0.001)
+			min_skew_mag = 0.0f;
+
+		// Clip skew.
+		if (skew_mag < min_skew_mag)
+		{
+			// Check skew sign.
+			if (skew < 0.0f)
+			{
+				skew = -min_skew_mag;
+			}
+			else 
+			{
+				skew = min_skew_mag;
+			}
+		}
+		mSpinSkew->set( skew );
+	}
+	
+	// Compute control visibility, label names, and twist range.
+	// Start with defaults.
+	BOOL cut_visible                = TRUE;
+	BOOL hollow_visible             = TRUE;
+	BOOL top_size_x_visible			= TRUE;
+	BOOL top_size_y_visible			= TRUE;
+	BOOL top_shear_x_visible		= TRUE;
+	BOOL top_shear_y_visible		= TRUE;
+	BOOL twist_visible				= TRUE;
+	BOOL advanced_cut_visible		= FALSE;
+	BOOL taper_visible				= FALSE;
+	BOOL skew_visible				= FALSE;
+	BOOL radius_offset_visible		= FALSE;
+	BOOL revolutions_visible		= FALSE;
+	BOOL sculpt_texture_visible     = FALSE;
+	F32	 twist_min					= OBJECT_TWIST_LINEAR_MIN;
+	F32	 twist_max					= OBJECT_TWIST_LINEAR_MAX;
+	F32	 twist_inc					= OBJECT_TWIST_LINEAR_INC;
+
+	BOOL advanced_is_dimple = FALSE;
+	BOOL advanced_is_slice = FALSE;
+	BOOL size_is_hole = FALSE;
+
+	// Tune based on overall volume type
+	switch (selected_item)
+	{
+	case MI_SPHERE:
+		top_size_x_visible		= FALSE;
+		top_size_y_visible		= FALSE;
+		top_shear_x_visible		= FALSE;
+		top_shear_y_visible		= FALSE;
+		//twist_visible			= FALSE;
+		advanced_cut_visible	= TRUE;
+		advanced_is_dimple		= TRUE;
+		twist_min				= OBJECT_TWIST_MIN;
+		twist_max				= OBJECT_TWIST_MAX;
+		twist_inc				= OBJECT_TWIST_INC;
+		break;
+
+	case MI_TORUS:
+	case MI_TUBE:	
+	case MI_RING:
+		//top_size_x_visible		= FALSE;
+		//top_size_y_visible		= FALSE;
+	  	size_is_hole 			= TRUE;
+		skew_visible			= TRUE;
+		advanced_cut_visible	= TRUE;
+		taper_visible			= TRUE;
+		radius_offset_visible	= TRUE;
+		revolutions_visible		= TRUE;
+		twist_min				= OBJECT_TWIST_MIN;
+		twist_max				= OBJECT_TWIST_MAX;
+		twist_inc				= OBJECT_TWIST_INC;
+
+		break;
+
+	case MI_SCULPT:
+		cut_visible             = FALSE;
+		hollow_visible          = FALSE;
+		twist_visible           = FALSE;
+		top_size_x_visible      = FALSE;
+		top_size_y_visible      = FALSE;
+		top_shear_x_visible     = FALSE;
+		top_shear_y_visible     = FALSE;
+		skew_visible            = FALSE;
+		advanced_cut_visible    = FALSE;
+		taper_visible           = FALSE;
+		radius_offset_visible   = FALSE;
+		revolutions_visible     = FALSE;
+		sculpt_texture_visible  = TRUE;
+
+		break;
+		
+	case MI_BOX:
+		advanced_cut_visible	= TRUE;
+		advanced_is_slice		= TRUE;
+		break;
+
+	case MI_CYLINDER:
+		advanced_cut_visible	= TRUE;
+		advanced_is_slice		= TRUE;
+		break;
+
+	case MI_PRISM:
+		advanced_cut_visible	= TRUE;
+		advanced_is_slice		= TRUE;
+		break;
+
+	default:
+		break;
+	}
+
+	// Check if we need to change top size/hole size params.
+	switch (selected_item)
+	{
+	case MI_SPHERE:
+	case MI_TORUS:
+	case MI_TUBE:
+	case MI_RING:
+		mSpinScaleX->set( scale_x );
+		mSpinScaleY->set( scale_y );
+		mSpinScaleX->setMinValue(OBJECT_MIN_HOLE_SIZE);
+		mSpinScaleX->setMaxValue(OBJECT_MAX_HOLE_SIZE_X);
+		mSpinScaleY->setMinValue(OBJECT_MIN_HOLE_SIZE);
+		mSpinScaleY->setMaxValue(OBJECT_MAX_HOLE_SIZE_Y);
+		break;
+	default:
+		if (editable)
+		{
+			mSpinScaleX->set( 1.f - scale_x );
+			mSpinScaleY->set( 1.f - scale_y );
+			mSpinScaleX->setMinValue(-1.f);
+			mSpinScaleX->setMaxValue(1.f);
+			mSpinScaleY->setMinValue(-1.f);
+			mSpinScaleY->setMaxValue(1.f);
+		}
+		break;
+	}
+
+	// Check if we need to limit the hollow based on the hole type.
+	if (  selected_hole == MI_HOLE_SQUARE && 
+		  ( selected_item == MI_CYLINDER || selected_item == MI_TORUS ||
+		    selected_item == MI_PRISM    || selected_item == MI_RING  ||
+			selected_item == MI_SPHERE ) )
+	{
+		mSpinHollow->setMinValue(0.f);
+		mSpinHollow->setMaxValue(70.f);
+	}
+	else 
+	{
+		mSpinHollow->setMinValue(0.f);
+		mSpinHollow->setMaxValue(95.f);
+	}
+
+	// Update field enablement
+	mComboBaseType	->setEnabled( enabled );
+
+	mLabelCut		->setEnabled( enabled );
+	mSpinCutBegin	->setEnabled( enabled );
+	mSpinCutEnd		->setEnabled( enabled );
+
+	mLabelHollow	->setEnabled( enabled );
+	mSpinHollow		->setEnabled( enabled );
+	mLabelHoleType	->setEnabled( hole_enabled );
+	mComboHoleType	->setEnabled( hole_enabled );
+
+	mLabelTwist		->setEnabled( enabled );
+	mSpinTwist		->setEnabled( enabled );
+	mSpinTwistBegin	->setEnabled( enabled );
+
+	mLabelSkew		->setEnabled( enabled );
+	mSpinSkew		->setEnabled( enabled );
+
+	getChildView("scale_hole")->setVisible( FALSE);
+	getChildView("scale_taper")->setVisible( FALSE);
+	if (top_size_x_visible || top_size_y_visible)
+	{
+		if (size_is_hole)
+		{
+			getChildView("scale_hole")->setVisible( TRUE);
+			getChildView("scale_hole")->setEnabled(enabled);
+		}
+		else
+		{
+			getChildView("scale_taper")->setVisible( TRUE);
+			getChildView("scale_taper")->setEnabled(enabled);
+		}
+	}
+	
+	mSpinScaleX		->setEnabled( enabled );
+	mSpinScaleY		->setEnabled( enabled );
+
+	mLabelShear		->setEnabled( enabled );
+	mSpinShearX		->setEnabled( enabled );
+	mSpinShearY		->setEnabled( enabled );
+
+	getChildView("advanced_cut")->setVisible( FALSE);
+	getChildView("advanced_dimple")->setVisible( FALSE);
+	getChildView("advanced_slice")->setVisible( FALSE);
+
+	if (advanced_cut_visible)
+	{
+		if (advanced_is_dimple)
+		{
+			getChildView("advanced_dimple")->setVisible( TRUE);
+			getChildView("advanced_dimple")->setEnabled(enabled);
+		}
+
+		else if (advanced_is_slice)
+		{
+			getChildView("advanced_slice")->setVisible( TRUE);
+			getChildView("advanced_slice")->setEnabled(enabled);
+		}
+		else
+		{
+			getChildView("advanced_cut")->setVisible( TRUE);
+			getChildView("advanced_cut")->setEnabled(enabled);
+		}
+	}
+	
+	mCtrlPathBegin	->setEnabled( enabled );
+	mCtrlPathEnd	->setEnabled( enabled );
+
+	mLabelTaper		->setEnabled( enabled );
+	mSpinTaperX		->setEnabled( enabled );
+	mSpinTaperY		->setEnabled( enabled );
+
+	mLabelRadiusOffset->setEnabled( enabled );
+	mSpinRadiusOffset ->setEnabled( enabled );
+
+	mLabelRevolutions->setEnabled( enabled );
+	mSpinRevolutions ->setEnabled( enabled );
+
+	// Update field visibility
+	mLabelCut		->setVisible( cut_visible );
+	mSpinCutBegin	->setVisible( cut_visible );
+	mSpinCutEnd		->setVisible( cut_visible ); 
+
+	mLabelHollow	->setVisible( hollow_visible );
+	mSpinHollow		->setVisible( hollow_visible );
+	mLabelHoleType	->setVisible( hollow_visible );
+	mComboHoleType	->setVisible( hollow_visible );
+	
+	mLabelTwist		->setVisible( twist_visible );
+	mSpinTwist		->setVisible( twist_visible );
+	mSpinTwistBegin	->setVisible( twist_visible );
+	mSpinTwist		->setMinValue(  twist_min );
+	mSpinTwist		->setMaxValue(  twist_max );
+	mSpinTwist		->setIncrement( twist_inc );
+	mSpinTwistBegin	->setMinValue(  twist_min );
+	mSpinTwistBegin	->setMaxValue(  twist_max );
+	mSpinTwistBegin	->setIncrement( twist_inc );
+
+	mSpinScaleX		->setVisible( top_size_x_visible );
+	mSpinScaleY		->setVisible( top_size_y_visible );
+
+	mLabelSkew		->setVisible( skew_visible );
+	mSpinSkew		->setVisible( skew_visible );
+
+	mLabelShear		->setVisible( top_shear_x_visible || top_shear_y_visible );
+	mSpinShearX		->setVisible( top_shear_x_visible );
+	mSpinShearY		->setVisible( top_shear_y_visible );
+
+	mCtrlPathBegin	->setVisible( advanced_cut_visible );
+	mCtrlPathEnd	->setVisible( advanced_cut_visible );
+
+	mLabelTaper		->setVisible( taper_visible );
+	mSpinTaperX		->setVisible( taper_visible );
+	mSpinTaperY		->setVisible( taper_visible );
+
+	mLabelRadiusOffset->setVisible( radius_offset_visible );
+	mSpinRadiusOffset ->setVisible( radius_offset_visible );
+
+	mLabelRevolutions->setVisible( revolutions_visible );
+	mSpinRevolutions ->setVisible( revolutions_visible );
+
+	mCtrlSculptTexture->setVisible(sculpt_texture_visible);
+	mLabelSculptType->setVisible(sculpt_texture_visible);
+	mCtrlSculptType->setVisible(sculpt_texture_visible);
+
+
+	// sculpt texture
+	if (selected_item == MI_SCULPT)
+	{
+
+
+		LLUUID id;
+		LLSculptParams *sculpt_params = (LLSculptParams *)objectp->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+
+		
+		if (sculpt_params) // if we have a legal sculpt param block for this object:
+		{
+			if (mObject != objectp)  // we've just selected a new object, so save for undo
+			{
+				mSculptTextureRevert = sculpt_params->getSculptTexture();
+				mSculptTypeRevert    = sculpt_params->getSculptType();
+			}
+		
+			U8 sculpt_type = sculpt_params->getSculptType();
+			U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK;
+			BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT;
+			BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
+			isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH);
+
+			LLTextureCtrl*  mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+			if(mTextureCtrl)
+			{
+				mTextureCtrl->setTentative(FALSE);
+				mTextureCtrl->setEnabled(editable && !isMesh);
+				if (editable)
+					mTextureCtrl->setImageAssetID(sculpt_params->getSculptTexture());
+				else
+					mTextureCtrl->setImageAssetID(LLUUID::null);
+			}
+
+			mComboBaseType->setEnabled(!isMesh);
+			
+			if (mCtrlSculptType)
+			{
+				mCtrlSculptType->setCurrentByIndex(sculpt_stitching);
+				mCtrlSculptType->setEnabled(editable && !isMesh);
+			}
+
+			if (mCtrlSculptMirror)
+			{
+				mCtrlSculptMirror->set(sculpt_mirror);
+				mCtrlSculptMirror->setEnabled(editable && !isMesh);
+			}
+
+			if (mCtrlSculptInvert)
+			{
+				mCtrlSculptInvert->set(sculpt_invert);
+				mCtrlSculptInvert->setEnabled(editable);
+			}
+
+			if (mLabelSculptType)
+			{
+				mLabelSculptType->setEnabled(TRUE);
+			}
+			
+		}
+	}
+	else
+	{
+		mSculptTextureRevert = LLUUID::null;		
+	}
+
+	mCtrlSculptMirror->setVisible(sculpt_texture_visible && !isMesh);
+	mCtrlSculptInvert->setVisible(sculpt_texture_visible && !isMesh);
+
+	//----------------------------------------------------------------------------
+
+	mObject = objectp;
+	mRootObject = root_objectp;
+}
+
+// static
+bool LLPanelObject::precommitValidate( const LLSD& data )
+{
+	// TODO: Richard will fill this in later.  
+	return TRUE; // FALSE means that validation failed and new value should not be commited.
+}
+
+void LLPanelObject::sendIsPhysical()
+{
+	BOOL value = mCheckPhysics->get();
+	if( mIsPhysical != value )
+	{
+		LLSelectMgr::getInstance()->selectionUpdatePhysics(value);
+		mIsPhysical = value;
+
+		llinfos << "update physics sent" << llendl;
+	}
+	else
+	{
+		llinfos << "update physics not changed" << llendl;
+	}
+}
+
+void LLPanelObject::sendIsTemporary()
+{
+	BOOL value = mCheckTemporary->get();
+	if( mIsTemporary != value )
+	{
+		LLSelectMgr::getInstance()->selectionUpdateTemporary(value);
+		mIsTemporary = value;
+
+		llinfos << "update temporary sent" << llendl;
+	}
+	else
+	{
+		llinfos << "update temporary not changed" << llendl;
+	}
+}
+
+
+void LLPanelObject::sendIsPhantom()
+{
+	BOOL value = mCheckPhantom->get();
+	if( mIsPhantom != value )
+	{
+		LLSelectMgr::getInstance()->selectionUpdatePhantom(value);
+		mIsPhantom = value;
+
+		llinfos << "update phantom sent" << llendl;
+	}
+	else
+	{
+		llinfos << "update phantom not changed" << llendl;
+	}
+}
+
+void LLPanelObject::sendCastShadows()
+{
+	BOOL value = mCheckCastShadows->get();
+	if( mCastShadows != value )
+	{
+		LLSelectMgr::getInstance()->selectionUpdateCastShadows(value);
+		mCastShadows = value;
+
+		llinfos << "update cast shadows sent" << llendl;
+	}
+	else
+	{
+		llinfos << "update cast shadows not changed" << llendl;
+	}
+}
+
+// static
+void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+
+	if (self->mObject.isNull())
+	{
+		return;
+	}
+
+	if (self->mObject->getPCode() != LL_PCODE_VOLUME)
+	{
+		// Don't allow modification of non-volume objects.
+		return;
+	}
+
+	LLVolume *volume = self->mObject->getVolume();
+	if (!volume)
+	{
+		return;
+	}
+
+	LLVolumeParams volume_params;
+	self->getVolumeParams(volume_params);
+	
+
+	
+	// set sculpting
+	S32 selected_type = self->mComboBaseType->getCurrentIndex();
+
+	if (selected_type == MI_SCULPT)
+	{
+		self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, TRUE, TRUE);
+		LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+		if (sculpt_params)
+			volume_params.setSculptID(sculpt_params->getSculptTexture(), sculpt_params->getSculptType());
+	}
+	else
+	{
+		LLSculptParams *sculpt_params = (LLSculptParams *)self->mObject->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+		if (sculpt_params)
+			self->mObject->setParameterEntryInUse(LLNetworkData::PARAMS_SCULPT, FALSE, TRUE);
+	}
+
+	// Update the volume, if necessary.
+	self->mObject->updateVolume(volume_params);
+
+
+	// This was added to make sure thate when changes are made, the UI
+	// adjusts to present valid options.
+	// *FIX: only some changes, ie, hollow or primitive type changes,
+	// require a refresh.
+	self->refresh();
+
+}
+
+void LLPanelObject::getVolumeParams(LLVolumeParams& volume_params)
+{
+	// Figure out what type of volume to make
+	S32 was_selected_type = mSelectedType;
+	S32 selected_type = mComboBaseType->getCurrentIndex();
+	U8 profile;
+	U8 path;
+	switch ( selected_type )
+	{
+	case MI_CYLINDER:
+		profile = LL_PCODE_PROFILE_CIRCLE;
+		path = LL_PCODE_PATH_LINE;
+		break;
+
+	case MI_BOX:
+		profile = LL_PCODE_PROFILE_SQUARE;
+		path = LL_PCODE_PATH_LINE;
+		break;
+
+	case MI_PRISM:
+		profile = LL_PCODE_PROFILE_EQUALTRI;
+		path = LL_PCODE_PATH_LINE;
+		break;
+
+	case MI_SPHERE:
+		profile = LL_PCODE_PROFILE_CIRCLE_HALF;
+		path = LL_PCODE_PATH_CIRCLE;
+		break;
+
+	case MI_TORUS:
+		profile = LL_PCODE_PROFILE_CIRCLE;
+		path = LL_PCODE_PATH_CIRCLE;
+		break;
+
+	case MI_TUBE:
+		profile = LL_PCODE_PROFILE_SQUARE;
+		path = LL_PCODE_PATH_CIRCLE;
+		break;
+
+	case MI_RING:
+		profile = LL_PCODE_PROFILE_EQUALTRI;
+		path = LL_PCODE_PATH_CIRCLE;
+		break;
+
+	case MI_SCULPT:
+		profile = LL_PCODE_PROFILE_CIRCLE;
+		path = LL_PCODE_PATH_CIRCLE;
+		break;
+		
+	default:
+		llwarns << "Unknown base type " << selected_type 
+			<< " in getVolumeParams()" << llendl;
+		// assume a box
+		selected_type = MI_BOX;
+		profile = LL_PCODE_PROFILE_SQUARE;
+		path = LL_PCODE_PATH_LINE;
+		break;
+	}
+
+
+	if (path == LL_PCODE_PATH_LINE)
+	{
+		LLVOVolume *volobjp = (LLVOVolume *)(LLViewerObject*)(mObject);
+		if (volobjp->isFlexible())
+		{
+			path = LL_PCODE_PATH_FLEXIBLE;
+		}
+	}
+	
+	S32 selected_hole = mComboHoleType->getCurrentIndex();
+	U8 hole;
+	switch (selected_hole)
+	{
+	case MI_HOLE_CIRCLE: 
+		hole = LL_PCODE_HOLE_CIRCLE;
+		break;
+	case MI_HOLE_SQUARE:
+		hole = LL_PCODE_HOLE_SQUARE;
+		break;
+	case MI_HOLE_TRIANGLE:
+		hole = LL_PCODE_HOLE_TRIANGLE;
+		break;
+	case MI_HOLE_SAME:
+	default:
+		hole = LL_PCODE_HOLE_SAME;
+		break;
+	}
+
+	volume_params.setType(profile | hole, path);
+	mSelectedType = selected_type;
+	
+	// Compute cut start/end
+	F32 cut_begin	= mSpinCutBegin->get();
+	F32 cut_end		= mSpinCutEnd->get();
+
+	// Make sure at least OBJECT_CUT_INC of the object survives
+	if (cut_begin > cut_end - OBJECT_MIN_CUT_INC)
+	{
+		cut_begin = cut_end - OBJECT_MIN_CUT_INC;
+		mSpinCutBegin->set(cut_begin);
+	}
+
+	F32 adv_cut_begin	= mCtrlPathBegin->get();
+	F32 adv_cut_end		= mCtrlPathEnd->get();
+
+	// Make sure at least OBJECT_CUT_INC of the object survives
+	if (adv_cut_begin > adv_cut_end - OBJECT_MIN_CUT_INC)
+	{
+		adv_cut_begin = adv_cut_end - OBJECT_MIN_CUT_INC;
+		mCtrlPathBegin->set(adv_cut_begin);
+	}
+
+	F32 begin_s, end_s;
+	F32 begin_t, end_t;
+
+	if (selected_type == MI_SPHERE || selected_type == MI_TORUS || 
+		selected_type == MI_TUBE   || selected_type == MI_RING)
+	{
+		begin_s = adv_cut_begin;
+		end_s	= adv_cut_end;
+
+		begin_t = cut_begin;
+		end_t	= cut_end;
+	}
+	else
+	{
+		begin_s = cut_begin;
+		end_s	= cut_end;
+
+		begin_t = adv_cut_begin;
+		end_t	= adv_cut_end;
+	}
+
+	volume_params.setBeginAndEndS(begin_s, end_s);
+	volume_params.setBeginAndEndT(begin_t, end_t);
+
+	// Hollowness
+	F32 hollow = mSpinHollow->get() / 100.f;
+
+	if (  selected_hole == MI_HOLE_SQUARE && 
+		( selected_type == MI_CYLINDER || selected_type == MI_TORUS ||
+		  selected_type == MI_PRISM    || selected_type == MI_RING  ||
+		  selected_type == MI_SPHERE ) )
+	{
+		if (hollow > 0.7f) hollow = 0.7f;
+	}
+
+	volume_params.setHollow( hollow );
+
+	// Twist Begin,End
+	F32 twist_begin = mSpinTwistBegin->get();
+	F32 twist		= mSpinTwist->get();
+	// Check the path type for twist conversion.
+	if (path == LL_PCODE_PATH_LINE || path == LL_PCODE_PATH_FLEXIBLE)
+	{
+		twist_begin	/= OBJECT_TWIST_LINEAR_MAX;
+		twist		/= OBJECT_TWIST_LINEAR_MAX;
+	}
+	else
+	{
+		twist_begin	/= OBJECT_TWIST_MAX;
+		twist		/= OBJECT_TWIST_MAX;
+	}
+
+	volume_params.setTwistBegin(twist_begin);
+	volume_params.setTwist(twist);
+
+	// Scale X,Y
+	F32 scale_x = mSpinScaleX->get();
+	F32 scale_y = mSpinScaleY->get();
+	if ( was_selected_type == MI_BOX || was_selected_type == MI_CYLINDER || was_selected_type == MI_PRISM)
+	{
+		scale_x = 1.f - scale_x;
+		scale_y = 1.f - scale_y;
+	}
+	
+	// Skew
+	F32 skew = mSpinSkew->get();
+
+	// Taper X,Y
+	F32 taper_x = mSpinTaperX->get();
+	F32 taper_y = mSpinTaperY->get();
+
+	// Radius offset
+	F32 radius_offset = mSpinRadiusOffset->get();
+
+	// Revolutions
+	F32 revolutions	  = mSpinRevolutions->get();
+
+	if ( selected_type == MI_SPHERE )
+	{
+		// Snap values to valid sphere parameters.
+		scale_x			= 1.0f;
+		scale_y			= 1.0f;
+		skew			= 0.0f;
+		taper_x			= 0.0f;
+		taper_y			= 0.0f;
+		radius_offset	= 0.0f;
+		revolutions		= 1.0f;
+	}
+	else if ( selected_type == MI_TORUS || selected_type == MI_TUBE ||
+			  selected_type == MI_RING )
+	{
+		scale_x = llclamp(
+			scale_x,
+			OBJECT_MIN_HOLE_SIZE,
+			OBJECT_MAX_HOLE_SIZE_X);
+		scale_y = llclamp(
+			scale_y,
+			OBJECT_MIN_HOLE_SIZE,
+			OBJECT_MAX_HOLE_SIZE_Y);
+
+		// Limit radius offset, based on taper and hole size y.
+		F32 radius_mag = fabs(radius_offset);
+		F32 hole_y_mag = fabs(scale_y);
+		F32 taper_y_mag  = fabs(taper_y);
+		// Check to see if the taper effects us.
+		if ( (radius_offset > 0.f && taper_y < 0.f) ||
+			 (radius_offset < 0.f && taper_y > 0.f) )
+		{
+			// The taper does not help increase the radius offset range.
+			taper_y_mag = 0.f;
+		}
+		F32 max_radius_mag = 1.f - hole_y_mag * (1.f - taper_y_mag) / (1.f - hole_y_mag);
+		// Enforce the maximum magnitude.
+		if (radius_mag > max_radius_mag)
+		{
+			// Check radius offset sign.
+			if (radius_offset < 0.f)
+			{
+				radius_offset = -max_radius_mag;
+			}
+			else
+			{
+				radius_offset = max_radius_mag;
+			}
+		}
+			
+		// Check the skew value against the revolutions.
+		F32 skew_mag= fabs(skew);
+		F32 min_skew_mag = 1.0f - 1.0f / (revolutions * scale_x + 1.0f);
+		// Discontinuity; A revolution of 1 allows skews below 0.5.
+		if ( fabs(revolutions - 1.0f) < 0.001)
+			min_skew_mag = 0.0f;
+
+		// Clip skew.
+		if (skew_mag < min_skew_mag)
+		{
+			// Check skew sign.
+			if (skew < 0.0f)
+			{
+				skew = -min_skew_mag;
+			}
+			else 
+			{
+				skew = min_skew_mag;
+			}
+		}
+	}
+
+	volume_params.setRatio( scale_x, scale_y );
+	volume_params.setSkew(skew);
+	volume_params.setTaper( taper_x, taper_y );
+	volume_params.setRadiusOffset(radius_offset);
+	volume_params.setRevolutions(revolutions);
+
+	// Shear X,Y
+	F32 shear_x = mSpinShearX->get();
+	F32 shear_y = mSpinShearY->get();
+	volume_params.setShear( shear_x, shear_y );
+
+	if (selected_type == MI_SCULPT)
+	{
+		volume_params.setSculptID(LLUUID::null, 0);
+		volume_params.setBeginAndEndT   (0, 1);
+		volume_params.setBeginAndEndS   (0, 1);
+		volume_params.setHollow         (0);
+		volume_params.setTwistBegin     (0);
+		volume_params.setTwistEnd       (0);
+		volume_params.setRatio          (1, 0.5);
+		volume_params.setShear          (0, 0);
+		volume_params.setTaper          (0, 0);
+		volume_params.setRevolutions    (1);
+		volume_params.setRadiusOffset   (0);
+		volume_params.setSkew           (0);
+	}
+
+}
+
+// BUG: Make work with multiple objects
+void LLPanelObject::sendRotation(BOOL btn_down)
+{
+	if (mObject.isNull()) return;
+
+	LLVector3 new_rot(mCtrlRotX->get(), mCtrlRotY->get(), mCtrlRotZ->get());
+	new_rot.mV[VX] = llround(new_rot.mV[VX], OBJECT_ROTATION_PRECISION);
+	new_rot.mV[VY] = llround(new_rot.mV[VY], OBJECT_ROTATION_PRECISION);
+	new_rot.mV[VZ] = llround(new_rot.mV[VZ], OBJECT_ROTATION_PRECISION);
+
+	// Note: must compare before conversion to radians
+	LLVector3 delta = new_rot - mCurEulerDegrees;
+
+	if (delta.magVec() >= 0.0005f)
+	{
+		mCurEulerDegrees = new_rot;
+		new_rot *= DEG_TO_RAD;
+
+		LLQuaternion rotation;
+		rotation.setQuat(new_rot.mV[VX], new_rot.mV[VY], new_rot.mV[VZ]);
+
+		if (mRootObject != mObject)
+		{
+			rotation = rotation * ~mRootObject->getRotationRegion();
+		}
+		std::vector<LLVector3>& child_positions = mObject->mUnselectedChildrenPositions ;
+		std::vector<LLQuaternion> child_rotations;
+		if (mObject->isRootEdit())
+		{
+			mObject->saveUnselectedChildrenRotation(child_rotations) ;
+			mObject->saveUnselectedChildrenPosition(child_positions) ;			
+		}
+
+		mObject->setRotation(rotation);
+		LLManip::rebuild(mObject) ;
+
+		// for individually selected roots, we need to counterrotate all the children
+		if (mObject->isRootEdit())
+		{			
+			mObject->resetChildrenRotationAndPosition(child_rotations, child_positions) ;			
+		}
+
+		if(!btn_down)
+		{
+			child_positions.clear() ;
+			LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION);
+		}
+	}
+}
+
+
+// BUG: Make work with multiple objects
+void LLPanelObject::sendScale(BOOL btn_down)
+{
+	if (mObject.isNull()) return;
+
+	LLVector3 newscale(mCtrlScaleX->get(), mCtrlScaleY->get(), mCtrlScaleZ->get());
+
+	LLVector3 delta = newscale - mObject->getScale();
+	if (delta.magVec() >= 0.0005f)
+	{
+		// scale changed by more than 1/2 millimeter
+
+		// check to see if we aren't scaling the textures
+		// (in which case the tex coord's need to be recomputed)
+		BOOL dont_stretch_textures = !LLManipScale::getStretchTextures();
+		if (dont_stretch_textures)
+		{
+			LLSelectMgr::getInstance()->saveSelectedObjectTransform(SELECT_ACTION_TYPE_SCALE);
+		}
+
+		mObject->setScale(newscale, TRUE);
+
+		if(!btn_down)
+		{
+			LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION);
+		}
+
+		LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, !dont_stretch_textures);
+//		llinfos << "scale sent" << llendl;
+	}
+	else
+	{
+//		llinfos << "scale not changed" << llendl;
+	}
+}
+
+
+void LLPanelObject::sendPosition(BOOL btn_down)
+{	
+	if (mObject.isNull()) return;
+
+	LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get());
+	LLViewerRegion* regionp = mObject->getRegion();
+
+	// Clamp the Z height
+	const F32 height = newpos.mV[VZ];
+	const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject, mObject->getPositionGlobal());
+	const F32 max_height = LLWorld::getInstance()->getRegionMaxHeight();
+
+	if (!mObject->isAttachment())
+	{
+		if ( height < min_height)
+		{
+			newpos.mV[VZ] = min_height;
+			mCtrlPosZ->set( min_height );
+		}
+		else if ( height > max_height )
+		{
+			newpos.mV[VZ] = max_height;
+			mCtrlPosZ->set( max_height );
+		}
+
+		// Grass is always drawn on the ground, so clamp its position to the ground
+		if (mObject->getPCode() == LL_PCODE_LEGACY_GRASS)
+		{
+			mCtrlPosZ->set(LLWorld::getInstance()->resolveLandHeightAgent(newpos) + 1.f);
+		}
+	}
+
+	// Make sure new position is in a valid region, so the object
+	// won't get dumped by the simulator.
+	LLVector3d new_pos_global = regionp->getPosGlobalFromRegion(newpos);
+
+	if ( LLWorld::getInstance()->positionRegionValidGlobal(new_pos_global) )
+	{
+		// send only if the position is changed, that is, the delta vector is not zero
+		LLVector3d old_pos_global = mObject->getPositionGlobal();
+		LLVector3d delta = new_pos_global - old_pos_global;
+		// moved more than 1/2 millimeter
+		if (delta.magVec() >= 0.0005f)
+		{			
+			if (mRootObject != mObject)
+			{
+				newpos = newpos - mRootObject->getPositionRegion();
+				newpos = newpos * ~mRootObject->getRotationRegion();
+				mObject->setPositionParent(newpos);
+			}
+			else
+			{
+				mObject->setPositionEdit(newpos);
+			}			
+			
+			LLManip::rebuild(mObject) ;
+
+			// for individually selected roots, we need to counter-translate all unselected children
+			if (mObject->isRootEdit())
+			{								
+				// only offset by parent's translation
+				mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;				
+			}
+
+			if(!btn_down)
+			{
+				LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
+			}
+
+			LLSelectMgr::getInstance()->updateSelectionCenter();
+		}
+	}
+	else
+	{
+		// move failed, so we update the UI with the correct values
+		LLVector3 vec = mRootObject->getPositionRegion();
+		mCtrlPosX->set(vec.mV[VX]);
+		mCtrlPosY->set(vec.mV[VY]);
+		mCtrlPosZ->set(vec.mV[VZ]);
+	}
+}
+
+void LLPanelObject::sendSculpt()
+{
+	if (mObject.isNull())
+		return;
+	
+	LLSculptParams sculpt_params;
+
+	if (mCtrlSculptTexture)
+		sculpt_params.setSculptTexture(mCtrlSculptTexture->getImageAssetID());
+
+	U8 sculpt_type = 0;
+	
+	if (mCtrlSculptType)
+		sculpt_type |= mCtrlSculptType->getCurrentIndex();
+
+	bool enabled = sculpt_type != LL_SCULPT_TYPE_MESH;
+
+	if (mCtrlSculptMirror)
+	{
+		mCtrlSculptMirror->setEnabled(enabled ? TRUE : FALSE);
+	}
+	if (mCtrlSculptInvert)
+	{
+		mCtrlSculptInvert->setEnabled(enabled ? TRUE : FALSE);
+	}
+	
+	if ((mCtrlSculptMirror) && (mCtrlSculptMirror->get()))
+		sculpt_type |= LL_SCULPT_FLAG_MIRROR;
+
+	if ((mCtrlSculptInvert) && (mCtrlSculptInvert->get()))
+		sculpt_type |= LL_SCULPT_FLAG_INVERT;
+	
+	sculpt_params.setSculptType(sculpt_type);
+	mObject->setParameterEntry(LLNetworkData::PARAMS_SCULPT, sculpt_params, TRUE);
+}
+
+void LLPanelObject::refresh()
+{
+	getState();
+	if (mObject.notNull() && mObject->isDead())
+	{
+		mObject = NULL;
+	}
+
+	if (mRootObject.notNull() && mRootObject->isDead())
+	{
+		mRootObject = NULL;
+	}
+	
+	bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") && 
+					   gAgent.getRegion() &&
+					   !gAgent.getRegion()->getCapability("GetMesh").empty();
+
+	F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
+
+	getChild<LLSpinCtrl>("Scale X")->setMaxValue(max_scale);
+	getChild<LLSpinCtrl>("Scale Y")->setMaxValue(max_scale);
+	getChild<LLSpinCtrl>("Scale Z")->setMaxValue(max_scale);
+
+	BOOL found = mCtrlSculptType->itemExists("Mesh");
+	if (enable_mesh && !found)
+	{
+		mCtrlSculptType->add("Mesh");
+	}
+	else if (!enable_mesh && found)
+	{
+		mCtrlSculptType->remove("Mesh");
+	}
+}
+
+
+void LLPanelObject::draw()
+{
+	const LLColor4	white(	1.0f,	1.0f,	1.0f,	1);
+	const LLColor4	red(	1.0f,	0.25f,	0.f,	1);
+	const LLColor4	green(	0.f,	1.0f,	0.f,	1);
+	const LLColor4	blue(	0.f,	0.5f,	1.0f,	1);
+
+	// Tune the colors of the labels
+	LLTool* tool = LLToolMgr::getInstance()->getCurrentTool();
+
+	if (tool == LLToolCompTranslate::getInstance())
+	{
+		mCtrlPosX	->setLabelColor(red);
+		mCtrlPosY	->setLabelColor(green);
+		mCtrlPosZ	->setLabelColor(blue);
+
+		mCtrlScaleX	->setLabelColor(white);
+		mCtrlScaleY	->setLabelColor(white);
+		mCtrlScaleZ	->setLabelColor(white);
+
+		mCtrlRotX	->setLabelColor(white);
+		mCtrlRotY	->setLabelColor(white);
+		mCtrlRotZ	->setLabelColor(white);
+	}
+	else if ( tool == LLToolCompScale::getInstance() )
+	{
+		mCtrlPosX	->setLabelColor(white);
+		mCtrlPosY	->setLabelColor(white);
+		mCtrlPosZ	->setLabelColor(white);
+
+		mCtrlScaleX	->setLabelColor(red);
+		mCtrlScaleY	->setLabelColor(green);
+		mCtrlScaleZ	->setLabelColor(blue);
+
+		mCtrlRotX	->setLabelColor(white);
+		mCtrlRotY	->setLabelColor(white);
+		mCtrlRotZ	->setLabelColor(white);
+	}
+	else if ( tool == LLToolCompRotate::getInstance() )
+	{
+		mCtrlPosX	->setLabelColor(white);
+		mCtrlPosY	->setLabelColor(white);
+		mCtrlPosZ	->setLabelColor(white);
+
+		mCtrlScaleX	->setLabelColor(white);
+		mCtrlScaleY	->setLabelColor(white);
+		mCtrlScaleZ	->setLabelColor(white);
+
+		mCtrlRotX	->setLabelColor(red);
+		mCtrlRotY	->setLabelColor(green);
+		mCtrlRotZ	->setLabelColor(blue);
+	}
+	else
+	{
+		mCtrlPosX	->setLabelColor(white);
+		mCtrlPosY	->setLabelColor(white);
+		mCtrlPosZ	->setLabelColor(white);
+
+		mCtrlScaleX	->setLabelColor(white);
+		mCtrlScaleY	->setLabelColor(white);
+		mCtrlScaleZ	->setLabelColor(white);
+
+		mCtrlRotX	->setLabelColor(white);
+		mCtrlRotY	->setLabelColor(white);
+		mCtrlRotZ	->setLabelColor(white);
+	}
+
+	LLPanel::draw();
+}
+
+// virtual
+void LLPanelObject::clearCtrls()
+{
+	LLPanel::clearCtrls();
+
+	mCheckLock		->set(FALSE);
+	mCheckLock		->setEnabled( FALSE );
+	mCheckPhysics	->set(FALSE);
+	mCheckPhysics	->setEnabled( FALSE );
+	mCheckTemporary	->set(FALSE);
+	mCheckTemporary	->setEnabled( FALSE );
+	mCheckPhantom	->set(FALSE);
+	mCheckPhantom	->setEnabled( FALSE );
+	
+#if 0 // 1.9.2
+	mCheckCastShadows->set(FALSE);
+	mCheckCastShadows->setEnabled( FALSE );
+#endif
+	// Disable text labels
+	mLabelPosition	->setEnabled( FALSE );
+	mLabelSize		->setEnabled( FALSE );
+	mLabelRotation	->setEnabled( FALSE );
+	mLabelCut		->setEnabled( FALSE );
+	mLabelHollow	->setEnabled( FALSE );
+	mLabelHoleType	->setEnabled( FALSE );
+	mLabelTwist		->setEnabled( FALSE );
+	mLabelSkew		->setEnabled( FALSE );
+	mLabelShear		->setEnabled( FALSE );
+	mLabelTaper		->setEnabled( FALSE );
+	mLabelRadiusOffset->setEnabled( FALSE );
+	mLabelRevolutions->setEnabled( FALSE );
+
+	getChildView("select_single")->setVisible( FALSE);
+	getChildView("edit_object")->setVisible( TRUE);	
+	getChildView("edit_object")->setEnabled(FALSE);
+	
+	getChildView("scale_hole")->setEnabled(FALSE);
+	getChildView("scale_taper")->setEnabled(FALSE);
+	getChildView("advanced_cut")->setEnabled(FALSE);
+	getChildView("advanced_dimple")->setEnabled(FALSE);
+	getChildView("advanced_slice")->setVisible( FALSE);
+}
+
+//
+// Static functions
+//
+
+// static
+void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data)
+{
+	// Checkbox will have toggled itself
+	LLPanelObject *self = (LLPanelObject *)data;
+
+	if(self->mRootObject.isNull()) return;
+
+	BOOL new_state = self->mCheckLock->get();
+	
+	LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, !new_state, PERM_MOVE | PERM_MODIFY);
+}
+
+// static
+void LLPanelObject::onCommitPosition( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+	BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+	self->sendPosition(btn_down);
+}
+
+// static
+void LLPanelObject::onCommitScale( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+	BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+	self->sendScale(btn_down);
+}
+
+// static
+void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+	BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+	self->sendRotation(btn_down);
+}
+
+// static
+void LLPanelObject::onCommitPhysics( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+	self->sendIsPhysical();
+}
+
+// static
+void LLPanelObject::onCommitTemporary( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+	self->sendIsTemporary();
+}
+
+// static
+void LLPanelObject::onCommitPhantom( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+	self->sendIsPhantom();
+}
+
+// static
+void LLPanelObject::onCommitCastShadows( LLUICtrl* ctrl, void* userdata )
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+	self->sendCastShadows();
+}
+
+
+void LLPanelObject::onSelectSculpt(const LLSD& data)
+{
+    LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+
+	if (mTextureCtrl)
+	{
+		mSculptTextureRevert = mTextureCtrl->getImageAssetID();
+	}
+	
+	sendSculpt();
+}
+
+
+void LLPanelObject::onCommitSculpt( const LLSD& data )
+{
+	sendSculpt();
+}
+
+BOOL LLPanelObject::onDropSculpt(LLInventoryItem* item)
+{
+    LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+
+	if (mTextureCtrl)
+	{
+		LLUUID asset = item->getAssetUUID();
+
+		mTextureCtrl->setImageAssetID(asset);
+		mSculptTextureRevert = asset;
+	}
+
+	return TRUE;
+}
+
+
+void LLPanelObject::onCancelSculpt(const LLSD& data)
+{
+	LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("sculpt texture control");
+	if(!mTextureCtrl)
+		return;
+	
+	mTextureCtrl->setImageAssetID(mSculptTextureRevert);
+	
+	sendSculpt();
+}
+
+// static
+void LLPanelObject::onCommitSculptType(LLUICtrl *ctrl, void* userdata)
+{
+	LLPanelObject* self = (LLPanelObject*) userdata;
+
+	self->sendSculpt();
+}
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 00ac34efa5ce70cb9a6ba863fec87a190bbd3b35..46262832dcddf47347fec80ff247abf4b560ee5c 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -91,11 +91,18 @@ class LLParcelHandler : public LLCommandHandler
 	LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { }
 	bool handle(const LLSD& params, const LLSD& query_map,
 				LLMediaCtrl* web)
-	{
+	{		
 		if (params.size() < 2)
 		{
 			return false;
 		}
+
+		if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePlaceProfile"))
+		{
+			LLNotificationsUtil::add("NoPlaceInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
+			return true;
+		}
+
 		LLUUID parcel_id;
 		if (!parcel_id.set(params[0], FALSE))
 		{
diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index aef870d3524923813410103e8b43cad1f3d040c4..dc87bd007797dc76e215f22b6c71ddbd60b796e3 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -51,6 +51,7 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
 	mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
 	mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
 	mDevicesUpdated = FALSE;
+	mUseTuningMode = true;
 
 	// grab "live" mic volume level
 	mMicVolume = gSavedSettings.getF32("AudioLevelMic");
@@ -96,7 +97,7 @@ void LLPanelVoiceDeviceSettings::draw()
 
 	// let user know that volume indicator is not yet available
 	bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode();
-	getChildView("wait_text")->setVisible( !is_in_tuning_mode);
+	getChildView("wait_text")->setVisible( !is_in_tuning_mode && mUseTuningMode);
 
 	LLPanel::draw();
 
@@ -220,23 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh()
 				iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
 				iter++)
 			{
-				// Lets try to localize some system device names. EXT-8375
-				std::string device_name = *iter;
-				LLStringUtil::toLower(device_name); //compare in low case
-				if ("default system device" == device_name)
-				{
-					device_name = getString(device_name);
-				}
-				else if ("no device" == device_name)
-				{
-					device_name = getString(device_name);
-				}
-				else
-				{
-					// restore original value
-					device_name = *iter;
-				}
-				mCtrlInputDevices->add(device_name, ADD_BOTTOM );
+				mCtrlInputDevices->add( *iter, ADD_BOTTOM );
 			}
 
 			if(!mCtrlInputDevices->setSimple(mInputDevice))
@@ -253,23 +238,7 @@ void LLPanelVoiceDeviceSettings::refresh()
 			for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin(); 
 				iter !=  LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
 			{
-				// Lets try to localize some system device names. EXT-8375
-				std::string device_name = *iter;
-				LLStringUtil::toLower(device_name); //compare in low case
-				if ("default system device" == device_name)
-				{
-					device_name = getString(device_name);
-				}
-				else if ("no device" == device_name)
-				{
-					device_name = getString(device_name);
-				}
-				else
-				{
-					// restore original value
-					device_name = *iter;
-				}
-				mCtrlOutputDevices->add(device_name, ADD_BOTTOM );
+				mCtrlOutputDevices->add( *iter, ADD_BOTTOM );
 			}
 
 			if(!mCtrlOutputDevices->setSimple(mOutputDevice))
@@ -292,14 +261,20 @@ void LLPanelVoiceDeviceSettings::initialize()
 	LLVoiceClient::getInstance()->refreshDeviceLists();
 
 	// put voice client in "tuning" mode
-	LLVoiceClient::getInstance()->tuningStart();
-	LLVoiceChannel::suspend();
+	if (mUseTuningMode)
+	{
+		LLVoiceClient::getInstance()->tuningStart();
+		LLVoiceChannel::suspend();
+	}
 }
 
 void LLPanelVoiceDeviceSettings::cleanup()
 {
-	LLVoiceClient::getInstance()->tuningStop();
-	LLVoiceChannel::resume();
+	if (mUseTuningMode)
+	{
+		LLVoiceClient::getInstance()->tuningStop();
+		LLVoiceChannel::resume();
+	}
 }
 
 void LLPanelVoiceDeviceSettings::onCommitInputDevice()
@@ -316,6 +291,6 @@ void LLPanelVoiceDeviceSettings::onCommitOutputDevice()
 	if(LLVoiceClient::getInstance())
 	{
 		LLVoiceClient::getInstance()->setRenderDevice(
-			getChild<LLComboBox>("voice_input_device")->getValue().asString());
+			getChild<LLComboBox>("voice_output_device")->getValue().asString());
 	}
 }
diff --git a/indra/newview/llpanelvoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h
index 636b8b99481f9df8b25ed055a7da0fa62ab214dd..d09476d469742d94ae3d6c69ccb9b9c17b58269a 100644
--- a/indra/newview/llpanelvoicedevicesettings.h
+++ b/indra/newview/llpanelvoicedevicesettings.h
@@ -45,6 +45,8 @@ class LLPanelVoiceDeviceSettings : public LLPanel
 	void cleanup();
 
 	/*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+
+	void setUseTuningMode(bool use) { mUseTuningMode = use; };
 	
 protected:
 	void onCommitInputDevice();
@@ -56,6 +58,7 @@ class LLPanelVoiceDeviceSettings : public LLPanel
 	class LLComboBox		*mCtrlInputDevices;
 	class LLComboBox		*mCtrlOutputDevices;
 	BOOL mDevicesUpdated;
+	bool mUseTuningMode;
 };
 
 #endif // LL_LLPANELVOICEDEVICESETTINGS_H
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index 4b2c569cc3a79200dfbfd77494c966a4ba3a28e8..450f9b2be7238a61f594dee75d7a1a3416f3a46e 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -770,7 +770,7 @@ LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_
 		int nverts = mSharedData->mNumVertices;
 		int nfloats = nverts * (2*4 + 3*3 + 2 + 4);
 		//use 16 byte aligned vertex data to make LLPolyMesh SSE friendly
-		mVertexData = (F32*) malloc(nfloats*4);
+		mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4);
 		int offset = 0;
 		mCoords				= 	(LLVector4*)(mVertexData + offset); offset += 4*nverts;
 		mNormals			=	(LLVector4*)(mVertexData + offset); offset += 4*nverts;
@@ -799,7 +799,7 @@ LLPolyMesh::~LLPolyMesh()
                 mJointRenderData[i] = NULL;
         }
 
-		free(mVertexData);
+		ll_aligned_free_16(mVertexData);
 
 }
 
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 8e5beb33cef116dcd53e275a9a05a8a6ea966098..9f5c55bad124c673d14131a4cc262a23b198e822 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -34,6 +34,7 @@
 #include "llassetuploadresponders.h"
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
+#include "lldatapacker.h"
 #include "lldelayedgestureerror.h"
 #include "llfloaterreg.h"
 #include "llgesturemgr.h"
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index c8c6858b81d2f829a4a996fa8b1f4b19a3174350..fbd2f7ca83184c47bd1fadac32b3dc3b2dc7244f 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -39,6 +39,7 @@
 #include "llinventoryobserver.h"
 #include "lllineeditor.h"
 #include "llradiogroup.h"
+#include "llslurl.h"
 #include "llviewercontrol.h"
 #include "llviewerinventory.h"
 #include "llviewerobjectlist.h"
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index e4c2293938a2727df169ac997a2e9121dcd22c8f..631b244785cf67e48e96647ad6ee4eed7df9a8b5 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -127,8 +127,6 @@ class LLSideTrayTab: public LLPanel
 	void			undock(LLFloater* floater_tab);
 
 	LLSideTray*		getSideTray();
-
-	void			onFloaterClose(LLSD::Boolean app_quitting);
 	
 public:
 	virtual ~LLSideTrayTab();
@@ -146,7 +144,7 @@ class LLSideTrayTab: public LLPanel
 	
 	void			onOpen		(const LLSD& key);
 	
-	void			toggleTabDocked();
+	void			toggleTabDocked(bool toggle_floater = true);
 	void			setDocked(bool dock);
 	bool			isDocked() const;
 
@@ -160,7 +158,6 @@ class LLSideTrayTab: public LLPanel
 	std::string	mDescription;
 	
 	LLView*	mMainPanel;
-	boost::signals2::connection mFloaterCloseConn;
 };
 
 LLSideTrayTab::LLSideTrayTab(const Params& p)
@@ -196,8 +193,8 @@ BOOL LLSideTrayTab::postBuild()
 	
 	title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
 
-	getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
-	getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
+	getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false));
+	getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true));
 
 	return true;
 }
@@ -253,14 +250,16 @@ LLSideTray* LLSideTrayTab::getSideTray()
 	return side_tray;
 }
 
-void LLSideTrayTab::toggleTabDocked()
+void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */)
 {
+	// *FIX: Calling this method twice per frame would crash the viewer.
+
 	std::string tab_name = getName();
 
 	LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
 	if (!floater_tab) return;
 
-	bool docking = LLFloater::isShown(floater_tab);
+	bool docking = !isDocked();
 
 	// Hide the "Tear Off" button when a tab gets undocked
 	// and show "Dock" button instead.
@@ -278,7 +277,10 @@ void LLSideTrayTab::toggleTabDocked()
 
 	// Open/close the floater *after* we reparent the tab panel,
 	// so that it doesn't receive redundant visibility change notifications.
-	LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
+	if (toggle_floater)
+	{
+		LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
+	}
 }
 
 // Same as toggleTabDocked() apart from making sure that we do exactly what we want.
@@ -298,18 +300,6 @@ bool LLSideTrayTab::isDocked() const
 	return dynamic_cast<LLSideTray*>(getParent()) != NULL;
 }
 
-void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting)
-{
-	// If user presses Ctrl-Shift-W, handle that gracefully by docking all
-	// undocked tabs before their floaters get destroyed (STORM-1016).
-
-	// Don't dock on quit for the current dock state to be correctly saved.
-	if (app_quitting) return;
-
-	lldebugs << "Forcibly docking tab " << getName() << llendl;
-	setDocked(true);
-}
-
 BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
 {
 	// Let children handle the event
@@ -333,7 +323,6 @@ void LLSideTrayTab::dock(LLFloater* floater_tab)
 		return;
 	}
 
-	mFloaterCloseConn.disconnect();
 	setRect(side_tray->getLocalRect());
 	reshape(getRect().getWidth(), getRect().getHeight());
 
@@ -382,7 +371,6 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
 	}
 
 	floater_tab->addChild(this);
-	mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2));
 	floater_tab->setTitle(mTabTitle);
 	floater_tab->setName(getName());
 
@@ -510,7 +498,7 @@ class LLSideTrayButton : public LLButton
 			LLSideTrayTab* tab = side_tray->getTab(getName());
 			if (!tab) return FALSE;
 
-			tab->toggleTabDocked();
+			tab->setDocked(false);
 
 			LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName());
 			if (!floater_tab) return FALSE;
@@ -681,7 +669,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
 
 	if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
 	{
-		tab->toggleTabDocked();
+		tab->setDocked(false);
 		tab_attached = false;
 	}
 
@@ -1102,7 +1090,7 @@ void LLSideTray::detachTabs()
 		if (!is_visible) continue;
 
 		llassert(isTabAttached(tab->getName()));
-		tab->toggleTabDocked();
+		tab->setDocked(false);
 	}
 }
 
@@ -1354,8 +1342,9 @@ bool		LLSideTray::isPanelActive(const std::string& panel_name)
 	return (panel->getName() == panel_name);
 }
 
-void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
+void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/)
 {
+	// Lookup tab by name.
 	LLSideTrayTab* tab = getTab(tab_name);
 	if (!tab)
 	{	// not a docked tab, look through detached tabs
@@ -1372,20 +1361,12 @@ void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
 
 	}
 
-	if (tab)
-	{
-		bool tab_attached = isTabAttached(tab_name);
-		LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
-		if (!floater_tab) return;
+	llassert(tab != NULL);
 
-		if (dock && !tab_attached)
-		{
-			tab->dock(floater_tab);
-		}
-		else if (!dock && tab_attached)
-		{
-			tab->undock(floater_tab);
-		}
+	// Toggle its dock state.
+	if (tab && tab->isDocked() != dock)
+	{
+		tab->toggleTabDocked(toggle_floater);
 	}
 }
 
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 46765bfbcca57d84f66263a66892adeaa25b9148..24882411f44e509506d22b72fb7156803fb8c9e0 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -121,7 +121,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
     LLPanel*	getActivePanel	();
     bool		isPanelActive	(const std::string& panel_name);
 
-	void		setTabDocked(const std::string& tab_name, bool dock);
+	void		setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true);
 
 	/*
 	 * get the panel of given type T (don't show it or do anything else with it)
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 65f7d299bc92d5b7e5b01f65365fd31e809fd113..fa329eb0ae0271807132e0a46f576214dd5ebbd3 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -1742,8 +1742,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
 	mSlopRatio = 0.25f;
 	mInfiniteFarClip = FALSE;
 
-	LLGLNamePool::registerPool(&sQueryPool);
-
 	LLVector4a center, size;
 	center.splat(0.f);
 	size.splat(1.f);
@@ -3169,11 +3167,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
 					LLConvexDecomposition::getInstance()->generateSingleHullMeshFromMesh( &mesh, &res );
 
 					//copy res into phys_volume
-					phys_volume->mHullPoints = (LLVector4a*) malloc(sizeof(LLVector4a)*res.mNumVertices);
+					phys_volume->mHullPoints = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*res.mNumVertices);
 					phys_volume->mNumHullPoints = res.mNumVertices;
 
 					S32 idx_size = (res.mNumTriangles*3*2+0xF) & ~0xF;
-					phys_volume->mHullIndices = (U16*) malloc(idx_size);
+					phys_volume->mHullIndices = (U16*) ll_aligned_malloc_16(idx_size);
 					phys_volume->mNumHullIndices = res.mNumTriangles*3;
 
 					const F32* v = res.mVertexBase;
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index d52e0a6c8683c2214a138974eb73ed6c53b3e4fb..d3e96f8dfb308ed9684768c5c599b22d3f931456 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -54,26 +54,6 @@ LLSpeakButton::Params::Params()
 	// See widgets/talk_button.xml
 }
 
-void LLSpeakButton::draw()
-{
-	// LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
-	bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
-	bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
-	mSpeakBtn->setToggleState(openmic && voiceenabled);
-	mOutputMonitor->setIsMuted(!voiceenabled);
-	LLUICtrl::draw();
-}
-void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
-{
-	LLButton* speak_btn = getChild<LLButton>("speak_btn");
-	speak_btn->setEnabled(enabled);
-}
-void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
-{
-	LLButton* show_btn = getChild<LLBottomtrayButton>("speak_flyout_btn");
-	show_btn->setEnabled(enabled);
-}
-
 LLSpeakButton::LLSpeakButton(const Params& p)
 : LLUICtrl(p)
 , mOutputMonitor(NULL)
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index 2fdf80c1f2fe91257172b1bc8b11d10e237c4dc5..7db01112ef09dedc435f4c703680f26c2e694494 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -53,12 +53,7 @@ class LLSpeakButton : public LLUICtrl
 	};
 
 	/*virtual*/ ~LLSpeakButton();
-	/*virtual*/ void draw();
 	
-	// methods for enabling/disabling right and left parts of speak button separately(EXT-4648)
-	void setSpeakBtnEnabled(bool enabled);
-	void setFlyoutBtnEnabled(bool enabled);
-
 	// *HACK: Need to put tooltips in a translatable location,
 	// the panel that contains this button.
 	void setSpeakToolTip(const std::string& msg);
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 277d2430ce8dbb818387221f7c1ec130d4145901..141a81c7174881d765877d8ba29c54e40f775490 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -995,6 +995,7 @@ bool idle_startup()
 
 	if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState()) 
 	{
+		// Generic failure message
 		std::ostringstream emsg;
 		emsg << LLTrans::getString("LoginFailed") << "\n";
 		if(LLLoginInstance::getInstance()->authFailure())
@@ -1003,24 +1004,32 @@ bool idle_startup()
 			                      << LLLoginInstance::getInstance()->getResponse() << LL_ENDL;
 			LLSD response = LLLoginInstance::getInstance()->getResponse();
 			// Still have error conditions that may need some 
-			// sort of handling.
+			// sort of handling - dig up specific message
 			std::string reason_response = response["reason"];
 			std::string message_response = response["message"];
-	
-			if(!message_response.empty())
+			std::string message_id = response["message_id"];
+			std::string message; // actual string to show the user
+
+			if(!message_id.empty() && LLTrans::findString(message, message_id, response["message_args"]))
 			{
-				// XUI: fix translation for strings returned during login
-				// We need a generic table for translations
-				std::string big_reason = LLAgent::sTeleportErrorMessages[ message_response ];
-				if ( big_reason.size() == 0 )
-				{
-					emsg << message_response;
-				}
-				else
-				{
-					emsg << big_reason;
-				}
+				// message will be filled in with the template and arguments
 			}
+			else if(!message_response.empty())
+			{
+				// *HACK: "no_inventory_host" sent as the message itself.
+				// Remove this clause when server is sending message_id as well.
+				message = LLAgent::sTeleportErrorMessages[ message_response ];
+			}
+
+			if (message.empty())
+			{
+				// Fallback to server-supplied string; necessary since server
+				// may add strings that this viewer is not yet aware of
+				message = message_response;
+			}
+
+			emsg << message;
+
 
 			if(reason_response == "key")
 			{
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 09918c28d85f5b22115a445ba5110a739434603c..d23d2b3abdbab4f27a1b93b02bba4b228d7f66fc 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -35,7 +35,6 @@
 #include "llagentwearables.h"
 #include "llappearancemgr.h"
 #include "lldictionary.h"
-//#include "llfirstuse.h"
 #include "llfloaterreg.h"
 #include "llfloatertools.h"
 #include "llgesturemgr.h"
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 06e0d17b8c5041e6a14f877ec312b96f0b3c4361..9ec4d3303603c49d506b0e66982a44144f8335bb 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -688,6 +688,15 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 	return LLTool::handleMouseUp(x, y, mask);
 }
 
+void LLToolPie::stopClickToWalk()
+{
+	mPick.mPosGlobal = gAgent.getPositionGlobal();
+	handle_go_to();
+	if(mAutoPilotDestination) 
+	{ 
+		mAutoPilotDestination->markDead(); 
+	}
+}
 
 BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 22359a6db841d665a2053a6de8bb3ae7d671bf97..d7c79ee223425fd9cc16c69ae29ae73ceb5a4392 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -67,6 +67,7 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	LLObjectSelection*	getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
 	void 				resetSelection();
 	void				blockClickToWalk() { mBlockClickToWalk = true; }
+	void				stopClickToWalk();
 	
 	static void			selectionPropertiesReceived();
 
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 23b0845f318c8c31fd61e9907a90183687c2b85c..7f7366dd3d9ec50b2cf857c28c80e2c05e0938e3 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -756,6 +756,10 @@ LLVector3 LLViewerCamera::roundToPixel(const LLVector3 &pos_agent)
 
 BOOL LLViewerCamera::cameraUnderWater() const
 {
+	if(!gAgent.getRegion())
+	{
+		return FALSE ;
+	}
 	return getOrigin().mV[VZ] < gAgent.getRegion()->getWaterHeight();
 }
 
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index e7a0d17c3a42ed3e1e385437e51bd4595bfa9db8..e06fe7bda02b6466e473f2dbf651870d56fba80a 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -29,6 +29,8 @@
 
 // newview includes
 #include "llagent.h" 	// gAgent		
+#include "llslurl.h"
+#include "lluicolor.h"
 #include "lluicolortable.h"
 #include "llviewercontrol.h" // gSavedSettings
 #include "llviewerregion.h"
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index a60d7e0793028f08d373d49a12028ed1fd581ce8..e41773d27365d3d986fcd7bdb7d805b6adc90d37 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -825,7 +825,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		//}
 
 		LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;
-		LLPipeline::updateRenderDeferred();
+		LLPipeline::refreshRenderDeferred();
 		
 		stop_glerror();
 
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 11686740f78c808fe048de536ee8c201a5c11921..a1c2c926af55786d0f5b55b309065e7f751ba964 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -92,6 +92,7 @@
 #include "llfloatersettingsdebug.h"
 #include "llfloatersidetraytab.h"
 #include "llfloatersnapshot.h"
+#include "llfloatersounddevices.h"
 #include "llfloatertelehub.h"
 #include "llfloatertestinspectors.h"
 #include "llfloatertestlistview.h"
@@ -266,6 +267,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
 	LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
 	LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>);
+	LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>);
 	LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
 	LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);
 	LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h
index 925244e89bcc28295799df7f18b81ed064a1234c..ca73212ed1262f60737f545be5d333b5da02754d 100644
--- a/indra/newview/llviewerkeyboard.h
+++ b/indra/newview/llviewerkeyboard.h
@@ -28,6 +28,7 @@
 #define LL_LLVIEWERKEYBOARD_H
 
 #include "llkeyboard.h" // For EKeystate
+#include "llinitparam.h"
 
 const S32 MAX_NAMED_FUNCTIONS = 100;
 const S32 MAX_KEY_BINDINGS = 128; // was 60
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 9d2b2f38c5c46858ffc056dd38b610a5a52dbdbe..79c6c8db75b581b8764acf2450a9153181a86ddf 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -54,6 +54,7 @@
 #include "llfilepicker.h"
 #include "llnotifications.h"
 #include "lldir.h"
+#include "lldiriterator.h"
 #include "llevent.h"		// LLSimpleListener
 #include "llnotificationsutil.h"
 #include "lluuid.h"
@@ -1154,7 +1155,8 @@ void LLViewerMedia::clearAllCookies()
 	}
 	
 	// the hard part: iterate over all user directories and delete the cookie file from each one
-	while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename))
+	LLDirIterator dir_iter(base_dir, "*_*");
+	while (dir_iter.next(filename))
 	{
 		target = base_dir;
 		target += filename;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 1764db48a24347dfa3b0e1b2654a426274ae64d5..2ed208bad1ce8cb5f64a77819109f9514239cd6d 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -37,6 +37,7 @@
 
 // newview includes
 #include "llagent.h"
+#include "llagentaccess.h"
 #include "llagentcamera.h"
 #include "llagentwearables.h"
 #include "llagentpilot.h"
@@ -999,6 +1000,10 @@ U32 info_display_from_string(std::string info_display)
 	{
 		return LLPipeline::RENDER_DEBUG_AGENT_TARGET;
 	}
+	else if ("sculpt" == info_display)
+	{
+		return LLPipeline::RENDER_DEBUG_SCULPTED;
+	}
 	else
 	{
 		return 0;
@@ -5618,6 +5623,14 @@ class LLToggleHelp : public view_listener_t
 	}
 };
 
+class LLToggleSpeak : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		LLVoiceClient::getInstance()->toggleUserPTTState();
+		return true;
+	}
+};
 class LLShowSidetrayPanel : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -8214,6 +8227,7 @@ void initialize_menus()
 	commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
 	view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
 	view_listener_t::addMenu(new LLToggleHelp(), "ToggleHelp");
+	view_listener_t::addMenu(new LLToggleSpeak(), "ToggleSpeak");
 	view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
 	view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
 	view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 9c13a96b8127ddae9ecf21ba2d29675b8dcb4a77..86b56df556bd276ef8ae90ca16df7f55584089a3 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -344,6 +344,11 @@ void process_layer_data(LLMessageSystem *mesgsys, void **user_data)
 {
 	LLViewerRegion *regionp = LLWorld::getInstance()->getRegion(mesgsys->getSender());
 
+	if(!regionp)
+	{
+		llwarns << "Invalid region for layer data." << llendl;
+		return;
+	}
 	S32 size;
 	S8 type;
 
@@ -2208,7 +2213,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	name = clean_name_from_im(name, dialog);
 
 	BOOL is_busy = gAgent.getBusy();
-	BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat);
+	BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat)
+		// object IMs contain sender object id in session_id (STORM-1209)
+		|| dialog == IM_FROM_TASK && LLMuteList::getInstance()->isMuted(session_id);
 	BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
 	BOOL is_owned_by_me = FALSE;
 	BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true;
@@ -2596,6 +2603,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 		args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();;
 		LLSD payload;
 		payload["from_id"] = from_id;
+		// Passing the "SESSION_NAME" to use it for IM notification logging
+		// in LLTipHandler::processNotification(). See STORM-941.
+		payload["SESSION_NAME"] = name;
 		LLNotificationsUtil::add("InventoryAccepted", args, payload);
 		break;
 	}
@@ -5366,6 +5376,12 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
 	{
 		// notification was specified using the new mechanism, so we can just handle it here
 		std::string notificationID;
+		msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
+		if (!LLNotifications::getInstance()->templateExists(notificationID))
+		{
+			return false;
+		}
+
 		std::string llsdRaw;
 		LLSD llsdBlock;
 		msgsystem->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, notificationID);
@@ -5522,14 +5538,19 @@ void process_alert_core(const std::string& message, BOOL modal)
 	}
 	else
 	{
-		LLSD args;
-		std::string new_msg =LLNotifications::instance().getGlobalString(message);
+		// Hack fix for EXP-623 (blame fix on RN :)) to avoid a sim deploy
+		const std::string AUTOPILOT_CANCELED_MSG("Autopilot canceled");
+		if (message.find(AUTOPILOT_CANCELED_MSG) == std::string::npos )
+		{
+			LLSD args;
+			std::string new_msg =LLNotifications::instance().getGlobalString(message);
 
-		std::string localized_msg;
-		bool is_message_localized = LLTrans::findString(localized_msg, new_msg);
+			std::string localized_msg;
+			bool is_message_localized = LLTrans::findString(localized_msg, new_msg);
 
-		args["MESSAGE"] = is_message_localized ? localized_msg : new_msg;
-		LLNotificationsUtil::add("SystemMessageTip", args);
+			args["MESSAGE"] = is_message_localized ? localized_msg : new_msg;
+			LLNotificationsUtil::add("SystemMessageTip", args);
+		}
 	}
 }
 
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index f5fee662e61a3b2f394f8135bf3c677fac09b0e4..929f3ad18883b41b9030da668a9691c4b338d54e 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -1,5704 +1,5712 @@
-/** 
- * @file llviewerobject.cpp
- * @brief Base class for viewer objects
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llviewerobject.h"
-
-#include "llaudioengine.h"
-#include "imageids.h"
-#include "indra_constants.h"
-#include "llmath.h"
-#include "llflexibleobject.h"
-#include "llviewercontrol.h"
-#include "lldatapacker.h"
-#include "llfasttimer.h"
-#include "llfloaterreg.h"
-#include "llfontgl.h"
-#include "llframetimer.h"
-#include "llinventory.h"
-#include "llinventorydefines.h"
-#include "llmaterialtable.h"
-#include "llmutelist.h"
-#include "llnamevalue.h"
-#include "llprimitive.h"
-#include "llquantize.h"
-#include "llregionhandle.h"
-#include "llsdserialize.h"
-#include "lltree_common.h"
-#include "llxfermanager.h"
-#include "message.h"
-#include "object_flags.h"
-#include "timing.h"
-
-#include "llaudiosourcevo.h"
-#include "llagent.h"
-#include "llagentcamera.h"
-#include "llbbox.h"
-#include "llbox.h"
-#include "llcylinder.h"
-#include "lldrawable.h"
-#include "llface.h"
-#include "llfloaterproperties.h"
-#include "llfloatertools.h"
-#include "llfollowcam.h"
-#include "llhudtext.h"
-#include "llselectmgr.h"
-#include "llrendersphere.h"
-#include "lltooldraganddrop.h"
-#include "llviewercamera.h"
-#include "llviewertexturelist.h"
-#include "llviewerinventory.h"
-#include "llviewerobjectlist.h"
-#include "llviewerparceloverlay.h"
-#include "llviewerpartsource.h"
-#include "llviewerregion.h"
-#include "llviewerstats.h"
-#include "llviewertextureanim.h"
-#include "llviewerwindow.h" // For getSpinAxis
-#include "llvoavatar.h"
-#include "llvoavatarself.h"
-#include "llvoclouds.h"
-#include "llvograss.h"
-#include "llvoground.h"
-#include "llvolume.h"
-#include "llvolumemessage.h"
-#include "llvopartgroup.h"
-#include "llvosky.h"
-#include "llvosurfacepatch.h"
-#include "llvotextbubble.h"
-#include "llvotree.h"
-#include "llvovolume.h"
-#include "llvowater.h"
-#include "llworld.h"
-#include "llui.h"
-#include "pipeline.h"
-#include "llviewernetwork.h"
-#include "llvowlsky.h"
-#include "llmanip.h"
-#include "lltrans.h"
-#include "llsdutil.h"
-#include "llmediaentry.h"
-
-//#define DEBUG_UPDATE_TYPE
-
-BOOL		LLViewerObject::sVelocityInterpolate = TRUE;
-BOOL		LLViewerObject::sPingInterpolate = TRUE; 
-
-U32			LLViewerObject::sNumZombieObjects = 0;
-S32			LLViewerObject::sNumObjects = 0;
-BOOL		LLViewerObject::sMapDebug = TRUE;
-LLColor4	LLViewerObject::sEditSelectColor(	1.0f, 1.f, 0.f, 0.3f);	// Edit OK
-LLColor4	LLViewerObject::sNoEditSelectColor(	1.0f, 0.f, 0.f, 0.3f);	// Can't edit
-S32			LLViewerObject::sAxisArrowLength(50);
-BOOL		LLViewerObject::sPulseEnabled(FALSE);
-BOOL		LLViewerObject::sUseSharedDrawables(FALSE); // TRUE
-
-// sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime
-F64			LLViewerObject::sMaxUpdateInterpolationTime = 3.0;		// For motion interpolation: after X seconds with no updates, don't predict object motion
-F64			LLViewerObject::sPhaseOutUpdateInterpolationTime = 2.0;	// For motion interpolation: after Y seconds with no updates, taper off motion prediction
-
-
-static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object");
-
-// static
-LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-{
-	LLViewerObject *res = NULL;
-	LLFastTimer t1(FTM_CREATE_OBJECT);
-	
-	switch (pcode)
-	{
-	case LL_PCODE_VOLUME:
-	  res = new LLVOVolume(id, pcode, regionp); break;
-	case LL_PCODE_LEGACY_AVATAR:
-	{
-		if (id == gAgentID)
-		{
-			if (!gAgentAvatarp)
-			{
-				gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp);
-			}
-			else 
-			{
-				gAgentAvatarp->updateRegion(regionp);
-			}
-			res = gAgentAvatarp;
-		}
-		else
-		{
-			res = new LLVOAvatar(id, pcode, regionp); 
-		}
-		static_cast<LLVOAvatar*>(res)->initInstance();
-		break;
-	}
-	case LL_PCODE_LEGACY_GRASS:
-	  res = new LLVOGrass(id, pcode, regionp); break;
-	case LL_PCODE_LEGACY_PART_SYS:
-// 	  llwarns << "Creating old part sys!" << llendl;
-// 	  res = new LLVOPart(id, pcode, regionp); break;
-	  res = NULL; break;
-	case LL_PCODE_LEGACY_TREE:
-	  res = new LLVOTree(id, pcode, regionp); break;
-	case LL_PCODE_TREE_NEW:
-// 	  llwarns << "Creating new tree!" << llendl;
-// 	  res = new LLVOTree(id, pcode, regionp); break;
-	  res = NULL; break;
-	case LL_PCODE_LEGACY_TEXT_BUBBLE:
-	  res = new LLVOTextBubble(id, pcode, regionp); break;
-	case LL_VO_CLOUDS:
-	  res = new LLVOClouds(id, pcode, regionp); break;
-	case LL_VO_SURFACE_PATCH:
-	  res = new LLVOSurfacePatch(id, pcode, regionp); break;
-	case LL_VO_SKY:
-	  res = new LLVOSky(id, pcode, regionp); break;
-	case LL_VO_VOID_WATER:
-		res = new LLVOVoidWater(id, pcode, regionp); break;
-	case LL_VO_WATER:
-		res = new LLVOWater(id, pcode, regionp); break;
-	case LL_VO_GROUND:
-	  res = new LLVOGround(id, pcode, regionp); break;
-	case LL_VO_PART_GROUP:
-	  res = new LLVOPartGroup(id, pcode, regionp); break;
-	case LL_VO_HUD_PART_GROUP:
-	  res = new LLVOHUDPartGroup(id, pcode, regionp); break;
-	case LL_VO_WL_SKY:
-	  res = new LLVOWLSky(id, pcode, regionp); break;
-	default:
-	  llwarns << "Unknown object pcode " << (S32)pcode << llendl;
-	  res = NULL; break;
-	}
-	return res;
-}
-
-LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global)
-:	LLPrimitive(),
-	mChildList(),
-	mID(id),
-	mLocalID(0),
-	mTotalCRC(0),
-	mTEImages(NULL),
-	mGLName(0),
-	mbCanSelect(TRUE),
-	mFlags(0),
-	mPhysicsShapeType(0),
-	mPhysicsGravity(0),
-	mPhysicsFriction(0),
-	mPhysicsDensity(0),
-	mPhysicsRestitution(0),
-	mDrawable(),
-	mCreateSelected(FALSE),
-	mRenderMedia(FALSE),
-	mBestUpdatePrecision(0),
-	mText(),
-	mLastInterpUpdateSecs(0.f),
-	mLastMessageUpdateSecs(0.f),
-	mLatestRecvPacketID(0),
-	mData(NULL),
-	mAudioSourcep(NULL),
-	mAudioGain(1.f),
-	mAppAngle(0.f),
-	mPixelArea(1024.f),
-	mInventory(NULL),
-	mInventorySerialNum(0),
-	mRegionp( regionp ),
-	mInventoryPending(FALSE),
-	mInventoryDirty(FALSE),
-	mDead(FALSE),
-	mOrphaned(FALSE),
-	mUserSelected(FALSE),
-	mOnActiveList(FALSE),
-	mOnMap(FALSE),
-	mStatic(FALSE),
-	mNumFaces(0),
-	mTimeDilation(1.f),
-	mRotTime(0.f),
-	mJointInfo(NULL),
-	mState(0),
-	mMedia(NULL),
-	mClickAction(0),
-	mObjectCost(0),
-	mLinksetCost(0),
-	mPhysicsCost(0),
-	mLinksetPhysicsCost(0.f),
-	mCostStale(true),
-	mPhysicsShapeUnknown(true),
-	mAttachmentItemID(LLUUID::null),
-	mLastUpdateType(OUT_UNKNOWN),
-	mLastUpdateCached(FALSE)
-{
-	if (!is_global)
-	{
-		llassert(mRegionp);
-	}
-
-	LLPrimitive::init_primitive(pcode);
-
-	// CP: added 12/2/2005 - this was being initialised to 0, not the current frame time
-	mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
-
-	mPositionRegion = LLVector3(0.f, 0.f, 0.f);
-
-	if (!is_global && mRegionp)
-	{
-		mPositionAgent = mRegionp->getOriginAgent();
-	}
-
-	LLViewerObject::sNumObjects++;
-}
-
-LLViewerObject::~LLViewerObject()
-{
-	deleteTEImages();
-
-	if(mInventory)
-	{
-		mInventory->clear();  // will deref and delete entries
-		delete mInventory;
-		mInventory = NULL;
-	}
-
-	if (mJointInfo)
-	{
-		delete mJointInfo;
-		mJointInfo = NULL;
-	}
-
-	if (mPartSourcep)
-	{
-		mPartSourcep->setDead();
-		mPartSourcep = NULL;
-	}
-
-	// Delete memory associated with extra parameters.
-	std::map<U16, ExtraParameter*>::iterator iter;
-	for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
-	{
-		if(iter->second != NULL)
-		{
-			delete iter->second->data;
-			delete iter->second;
-		}
-	}
-	mExtraParameterList.clear();
-
-	for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ;
-	mNameValuePairs.clear();
-	
-	delete[] mData;
-	mData = NULL;
-
-	delete mMedia;
-	mMedia = NULL;
-
-	sNumObjects--;
-	sNumZombieObjects--;
-	llassert(mChildList.size() == 0);
-
-	clearInventoryListeners();
-}
-
-void LLViewerObject::deleteTEImages()
-{
-	delete[] mTEImages;
-	mTEImages = NULL;
-}
-
-void LLViewerObject::markDead()
-{
-	if (!mDead)
-	{
-		//llinfos << "Marking self " << mLocalID << " as dead." << llendl;
-		
-		// Root object of this hierarchy unlinks itself.
-		if (getParent())
-		{
-			((LLViewerObject *)getParent())->removeChild(this);
-			// go ahead and delete any jointinfo's that we find
-			delete mJointInfo;
-			mJointInfo = NULL;
-		}
-
-		// Mark itself as dead
-		mDead = TRUE;
-		gObjectList.cleanupReferences(this);
-
-		LLViewerObject *childp;
-		while (mChildList.size() > 0)
-		{
-			childp = mChildList.back();
-			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
-			{
-				//llinfos << "Marking child " << childp->getLocalID() << " as dead." << llendl;
-				childp->setParent(NULL); // LLViewerObject::markDead 1
-				childp->markDead();
-			}
-			else
-			{
-				// make sure avatar is no longer parented, 
-				// so we can properly set it's position
-				childp->setDrawableParent(NULL);
-				((LLVOAvatar*)childp)->getOffObject();
-				childp->setParent(NULL); // LLViewerObject::markDead 2
-			}
-			mChildList.pop_back();
-		}
-
-		if (mDrawable.notNull())
-		{
-			// Drawables are reference counted, mark as dead, then nuke the pointer.
-			mDrawable->markDead();
-			mDrawable = NULL;
-		}
-
-		if (mText)
-		{
-			mText->markDead();
-			mText = NULL;
-		}
-
-		if (mIcon)
-		{
-			mIcon->markDead();
-			mIcon = NULL;
-		}
-
-		if (mPartSourcep)
-		{
-			mPartSourcep->setDead();
-			mPartSourcep = NULL;
-		}
-
-		if (mAudioSourcep)
-		{
-			// Do some cleanup
-			if (gAudiop)
-			{
-				gAudiop->cleanupAudioSource(mAudioSourcep);
-			}
-			mAudioSourcep = NULL;
-		}
-
-		if (flagAnimSource())
-		{
-			if (isAgentAvatarValid())
-			{
-				// stop motions associated with this object
-				gAgentAvatarp->stopMotionFromSource(mID);
-			}
-		}
-
-		if (flagCameraSource())
-		{
-			LLFollowCamMgr::removeFollowCamParams(mID);
-		}
-
-		sNumZombieObjects++;
-	}
-}
-
-void LLViewerObject::dump() const
-{
-	llinfos << "Type: " << pCodeToString(mPrimitiveCode) << llendl;
-	llinfos << "Drawable: " << (LLDrawable *)mDrawable << llendl;
-	llinfos << "Update Age: " << LLFrameTimer::getElapsedSeconds() - mLastMessageUpdateSecs << llendl;
-
-	llinfos << "Parent: " << getParent() << llendl;
-	llinfos << "ID: " << mID << llendl;
-	llinfos << "LocalID: " << mLocalID << llendl;
-	llinfos << "PositionRegion: " << getPositionRegion() << llendl;
-	llinfos << "PositionAgent: " << getPositionAgent() << llendl;
-	llinfos << "PositionGlobal: " << getPositionGlobal() << llendl;
-	llinfos << "Velocity: " << getVelocity() << llendl;
-	if (mDrawable.notNull() && mDrawable->getNumFaces())
-	{
-		LLFacePool *poolp = mDrawable->getFace(0)->getPool();
-		if (poolp)
-		{
-			llinfos << "Pool: " << poolp << llendl;
-			llinfos << "Pool reference count: " << poolp->mReferences.size() << llendl;
-		}
-	}
-	//llinfos << "BoxTree Min: " << mDrawable->getBox()->getMin() << llendl;
-	//llinfos << "BoxTree Max: " << mDrawable->getBox()->getMin() << llendl;
-	/*
-	llinfos << "Velocity: " << getVelocity() << llendl;
-	llinfos << "AnyOwner: " << permAnyOwner() << " YouOwner: " << permYouOwner() << " Edit: " << mPermEdit << llendl;
-	llinfos << "UsePhysics: " << usePhysics() << " CanSelect " << mbCanSelect << " UserSelected " << mUserSelected << llendl;
-	llinfos << "AppAngle: " << mAppAngle << llendl;
-	llinfos << "PixelArea: " << mPixelArea << llendl;
-
-	char buffer[1000];
-	char *key;
-	for (key = mNameValuePairs.getFirstKey(); key; key = mNameValuePairs.getNextKey() )
-	{
-		mNameValuePairs[key]->printNameValue(buffer);
-		llinfos << buffer << llendl;
-	}
-	for (child_list_t::iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		llinfos << "  child " << child->getID() << llendl;
-	}
-	*/
-}
-
-void LLViewerObject::printNameValuePairs() const
-{
-	for (name_value_map_t::const_iterator iter = mNameValuePairs.begin();
-		 iter != mNameValuePairs.end(); iter++)
-	{
-		LLNameValue* nv = iter->second;
-		llinfos << nv->printNameValue() << llendl;
-	}
-}
-
-void LLViewerObject::initVOClasses()
-{
-	// Initialized shared class stuff first.
-	LLVOAvatar::initClass();
-	LLVOTree::initClass();
-	llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl;
-	LLVOGrass::initClass();
-	LLVOWater::initClass();
-	LLVOVolume::initClass();
-}
-
-void LLViewerObject::cleanupVOClasses()
-{
-	LLVOGrass::cleanupClass();
-	LLVOWater::cleanupClass();
-	LLVOTree::cleanupClass();
-	LLVOAvatar::cleanupClass();
-	LLVOVolume::cleanupClass();
-}
-
-// Replaces all name value pairs with data from \n delimited list
-// Does not update server
-void LLViewerObject::setNameValueList(const std::string& name_value_list)
-{
-	// Clear out the old
-	for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ;
-	mNameValuePairs.clear();
-
-	// Bring in the new
-	std::string::size_type length = name_value_list.length();
-	std::string::size_type start = 0;
-	while (start < length)
-	{
-		std::string::size_type end = name_value_list.find_first_of("\n", start);
-		if (end == std::string::npos) end = length;
-		if (end > start)
-		{
-			std::string tok = name_value_list.substr(start, end - start);
-			addNVPair(tok);
-		}
-		start = end+1;
-	}
-}
-
-
-// This method returns true if the object is over land owned by the
-// agent.
-bool LLViewerObject::isReturnable()
-{
-	if (isAttachment())
-	{
-		return false;
-	}
-	std::vector<LLBBox> boxes;
-	boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());
-	for (child_list_t::iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
-	}
-
-	return mRegionp
-		&& mRegionp->objectIsReturnable(getPositionRegion(), boxes);
-}
-
-BOOL LLViewerObject::setParent(LLViewerObject* parent)
-{
-	if(mParent != parent)
-	{
-		LLViewerObject* old_parent = (LLViewerObject*)mParent ;		
-		BOOL ret = LLPrimitive::setParent(parent);
-		if(ret && old_parent && parent)
-		{
-			old_parent->removeChild(this) ;
-		}
-		return ret ;
-	}
-
-	return FALSE ;
-}
-
-void LLViewerObject::addChild(LLViewerObject *childp)
-{
-	for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
-	{
-		if (*i == childp)
-		{	//already has child
-			return;
-		}
-	}
-	
-	if (!isAvatar())
-	{
-		// propagate selection properties
-		childp->mbCanSelect = mbCanSelect;
-	}
-
-	if(childp->setParent(this))
-	{
-		mChildList.push_back(childp);
-	}
-}
-
-void LLViewerObject::removeChild(LLViewerObject *childp)
-{
-	for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
-	{
-		if (*i == childp)
-		{
-			if (!childp->isAvatar() && mDrawable.notNull() && mDrawable->isActive() && childp->mDrawable.notNull() && !isAvatar())
-			{
-				gPipeline.markRebuild(childp->mDrawable, LLDrawable::REBUILD_VOLUME);
-			}
-
-			mChildList.erase(i);
-
-			if(childp->getParent() == this)
-			{
-				childp->setParent(NULL);			
-			}
-			break;
-		}
-	}
-	
-	if (childp->isSelected())
-	{
-		LLSelectMgr::getInstance()->deselectObjectAndFamily(childp);
-		BOOL add_to_end = TRUE;
-		LLSelectMgr::getInstance()->selectObjectAndFamily(childp, add_to_end);
-	}
-}
-
-void LLViewerObject::addThisAndAllChildren(std::vector<LLViewerObject*>& objects)
-{
-	objects.push_back(this);
-	for (child_list_t::iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		if (!child->isAvatar())
-		{
-			child->addThisAndAllChildren(objects);
-		}
-	}
-}
-
-void LLViewerObject::addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects)
-{
-	objects.push_back(this);
-	// don't add any attachments when temporarily selecting avatar
-	if (isAvatar())
-	{
-		return;
-	}
-	for (child_list_t::iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		if ( (!child->isAvatar()) && (!child->isJointChild()))
-		{
-			child->addThisAndNonJointChildren(objects);
-		}
-	}
-}
-
-BOOL LLViewerObject::isChild(LLViewerObject *childp) const
-{
-	for (child_list_t::const_iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* testchild = *iter;
-		if (testchild == childp)
-			return TRUE;
-	}
-	return FALSE;
-}
-
-
-// returns TRUE if at least one avatar is sitting on this object
-BOOL LLViewerObject::isSeat() const
-{
-	for (child_list_t::const_iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		if (child->isAvatar())
-		{
-			return TRUE;
-		}
-	}
-	return FALSE;
-
-}
-
-BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
-{
-	if (mDrawable.isNull())
-	{
-		return FALSE;
-	}
-
-	BOOL ret = mDrawable->mXform.setParent(parentp ? &parentp->mXform : NULL);
-	if(!ret)
-	{
-		return FALSE ;
-	}
-	LLDrawable* old_parent = mDrawable->mParent;
-	mDrawable->mParent = parentp; 
-		
-	gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
-	if(	(old_parent != parentp && old_parent)
-		|| (parentp && parentp->isActive()))
-	{
-		// *TODO we should not be relying on setDrawable parent to call markMoved
-		gPipeline.markMoved(mDrawable, FALSE);
-	}
-	else if (!mDrawable->isAvatar())
-	{
-		mDrawable->updateXform(TRUE);
-		/*if (!mDrawable->getSpatialGroup())
-		{
-			mDrawable->movePartition();
-		}*/
-	}
-	
-	return ret;
-}
-
-// Show or hide particles, icon and HUD
-void LLViewerObject::hideExtraDisplayItems( BOOL hidden )
-{
-	if( mPartSourcep.notNull() )
-	{
-		LLViewerPartSourceScript *partSourceScript = mPartSourcep.get();
-		partSourceScript->setSuspended( hidden );
-	}
-
-	if( mText.notNull() )
-	{
-		LLHUDText *hudText = mText.get();
-		hudText->setHidden( hidden );
-	}
-
-	if( mIcon.notNull() )
-	{
-		LLHUDIcon *hudIcon = mIcon.get();
-		hudIcon->setHidden( hidden );
-	}
-}
-
-U32 LLViewerObject::checkMediaURL(const std::string &media_url)
-{
-    U32 retval = (U32)0x0;
-    if (!mMedia && !media_url.empty())
-    {
-        retval |= MEDIA_URL_ADDED;
-        mMedia = new LLViewerObjectMedia;
-        mMedia->mMediaURL = media_url;
-        mMedia->mMediaType = LLViewerObject::MEDIA_SET;
-        mMedia->mPassedWhitelist = FALSE;
-    }
-    else if (mMedia)
-    {
-        if (media_url.empty())
-        {
-            retval |= MEDIA_URL_REMOVED;
-            delete mMedia;
-            mMedia = NULL;
-        }
-        else if (mMedia->mMediaURL != media_url) // <-- This is an optimization.  If they are equal don't bother with below's test.
-        {
-            /*if (! (LLTextureEntry::getAgentIDFromMediaVersionString(media_url) == gAgent.getID() &&
-                   LLTextureEntry::getVersionFromMediaVersionString(media_url) == 
-                        LLTextureEntry::getVersionFromMediaVersionString(mMedia->mMediaURL) + 1))
-			*/
-            {
-                // If the media URL is different and WE were not the one who
-                // changed it, mark dirty.
-                retval |= MEDIA_URL_UPDATED;
-            }
-            mMedia->mMediaURL = media_url;
-            mMedia->mPassedWhitelist = FALSE;
-        }
-    }
-    return retval;
-}
-
-U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
-					 void **user_data,
-					 U32 block_num,
-					 const EObjectUpdateType update_type,
-					 LLDataPacker *dp)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	U32 retval = 0x0;
-	
-	// Coordinates of objects on simulators are region-local.
-	U64 region_handle;
-	mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle);
-	
-	{
-		LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle);
-		if(regionp != mRegionp && regionp && mRegionp)//region cross
-		{
-			//this is the redundant position and region update, but it is necessary in case the viewer misses the following 
-			//position and region update messages from sim.
-			//this redundant update should not cause any problems.
-			LLVector3 delta_pos =  mRegionp->getOriginAgent() - regionp->getOriginAgent();
-			setPositionParent(getPosition() + delta_pos); //update to the new region position immediately.
-			setRegion(regionp) ; //change the region.
-		}
-		else
-		{
-			mRegionp = regionp ;
-		}
-	}	
-	
-	if (!mRegionp)
-	{
-		U32 x, y;
-		from_region_handle(region_handle, &x, &y);
-
-		llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl;
-		return retval;
-	}
-
-	U16 time_dilation16;
-	mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16);
-	F32 time_dilation = ((F32) time_dilation16) / 65535.f;
-	mTimeDilation = time_dilation;
-	mRegionp->setTimeDilation(time_dilation);
-
-	// this will be used to determine if we've really changed position
-	// Use getPosition, not getPositionRegion, since this is what we're comparing directly against.
-	LLVector3 test_pos_parent = getPosition();
-
-	U8  data[60+16]; // This needs to match the largest size below.
-#ifdef LL_BIG_ENDIAN
-	U16 valswizzle[4];
-#endif
-	U16	*val;
-	const F32 size = LLWorld::getInstance()->getRegionWidthInMeters();	
-	const F32 MAX_HEIGHT = LLWorld::getInstance()->getRegionMaxHeight();
-	const F32 MIN_HEIGHT = LLWorld::getInstance()->getRegionMinHeight();
-	S32 length;
-	S32	count;
-	S32 this_update_precision = 32;		// in bits
-
-	// Temporaries, because we need to compare w/ previous to set dirty flags...
-	LLVector3 new_pos_parent;
-	LLVector3 new_vel;
-	LLVector3 new_acc;
-	LLVector3 new_angv;
-	LLVector3 old_angv = getAngularVelocity();
-	LLQuaternion new_rot;
-	LLVector3 new_scale = getScale();
-
-	U32	parent_id = 0;
-	U8	material = 0;
-	U8 click_action = 0;
-	U32 crc = 0;
-
-	bool old_special_hover_cursor = specialHoverCursor();
-
-	LLViewerObject *cur_parentp = (LLViewerObject *)getParent();
-
-	if (cur_parentp)
-	{
-		parent_id = cur_parentp->mLocalID;
-	}
-
-	if (!dp)
-	{
-		switch(update_type)
-		{
-		case OUT_FULL:
-			{
-#ifdef DEBUG_UPDATE_TYPE
-				llinfos << "Full:" << getID() << llendl;
-#endif
-				//clear cost and linkset cost
-				mCostStale = true;
-				if (isSelected())
-				{
-					gFloaterTools->dirty();
-				}
-
-				LLUUID audio_uuid;
-				LLUUID owner_id;	// only valid if audio_uuid or particle system is not null
-				F32    gain;
-				U8     sound_flags;
-
-				mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_CRC, crc, block_num);
-				mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_ParentID, parent_id, block_num);
-				mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_Sound, audio_uuid, block_num );
-				// HACK: Owner id only valid if non-null sound id or particle system
-				mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id, block_num );
-				mesgsys->getF32Fast( _PREHASH_ObjectData, _PREHASH_Gain, gain, block_num );
-				mesgsys->getU8Fast(  _PREHASH_ObjectData, _PREHASH_Flags, sound_flags, block_num );
-				mesgsys->getU8Fast(  _PREHASH_ObjectData, _PREHASH_Material, material, block_num );
-				mesgsys->getU8Fast(  _PREHASH_ObjectData, _PREHASH_ClickAction, click_action, block_num); 
-				mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_Scale, new_scale, block_num );
-				length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData);
-				mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num);
-
-				mTotalCRC = crc;
-
-				// Owner ID used for sound muting or particle system muting
-				setAttachedSound(audio_uuid, owner_id, gain, sound_flags);
-
-				U8 old_material = getMaterial();
-				if (old_material != material)
-				{
-					setMaterial(material);
-					if (mDrawable.notNull())
-					{
-						gPipeline.markMoved(mDrawable, FALSE); // undamped
-					}
-				}
-				setClickAction(click_action);
-
-				count = 0;
-				LLVector4 collision_plane;
-				
-				switch(length)
-				{
-				case (60 + 16):
-					// pull out collision normal for avatar
-					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
-					((LLVOAvatar*)this)->setFootPlane(collision_plane);
-					count += sizeof(LLVector4);
-					// fall through
-				case 60:
-					this_update_precision = 32;
-					// this is a terse update
-					// pos
-					htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					count += sizeof(LLVector3);
-					// vel
-					htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					count += sizeof(LLVector3);
-					// acc
-					htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					count += sizeof(LLVector3);
-					// theta
-					{
-						LLVector3 vec;
-						htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-						new_rot.unpackFromVector3(vec);
-					}
-					count += sizeof(LLVector3);
-					// omega
-					htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					if (new_angv.isExactlyZero())
-					{
-						// reset rotation time
-						resetRot();
-					}
-					setAngularVelocity(new_angv);
-#if LL_DARWIN
-					if (length == 76)
-					{
-						setAngularVelocity(LLVector3::zero);
-					}
-#endif
-					break;
-				case(32 + 16):
-					// pull out collision normal for avatar
-					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
-					((LLVOAvatar*)this)->setFootPlane(collision_plane);
-					count += sizeof(LLVector4);
-					// fall through
-				case 32:
-					this_update_precision = 16;
-					test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
-
-					// This is a terse 16 update, so treat data as an array of U16's.
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*3;
-					new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*3;
-					setVelocity(LLVector3(U16_to_F32(val[VX], -size, size),
-													   U16_to_F32(val[VY], -size, size),
-													   U16_to_F32(val[VZ], -size, size)));
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*3;
-					setAcceleration(LLVector3(U16_to_F32(val[VX], -size, size),
-														   U16_to_F32(val[VY], -size, size),
-														   U16_to_F32(val[VZ], -size, size)));
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 4); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*4;
-					new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
-					new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
-					new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
-					new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					new_angv.setVec(U16_to_F32(val[VX], -size, size),
-										U16_to_F32(val[VY], -size, size),
-										U16_to_F32(val[VZ], -size, size));
-					if (new_angv.isExactlyZero())
-					{
-						// reset rotation time
-						resetRot();
-					}
-					setAngularVelocity(new_angv);
-					break;
-
-				case 16:
-					this_update_precision = 8;
-					test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
-					// this is a terse 8 update
-					new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT);
-
-					setVelocity(U8_to_F32(data[3], -size, size),
-								U8_to_F32(data[4], -size, size),
-								U8_to_F32(data[5], -size, size) );
-
-					setAcceleration(U8_to_F32(data[6], -size, size),
-									U8_to_F32(data[7], -size, size),
-									U8_to_F32(data[8], -size, size) );
-
-					new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f);
-					new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f);
-					new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
-					new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
-
-					new_angv.setVec(U8_to_F32(data[13], -size, size),
-										U8_to_F32(data[14], -size, size),
-										U8_to_F32(data[15], -size, size) );
-					if (new_angv.isExactlyZero())
-					{
-						// reset rotation time
-						resetRot();
-					}
-					setAngularVelocity(new_angv);
-					break;
-				}
-
-				////////////////////////////////////////////////////
-				//
-				// Here we handle data specific to the full message.
-				//
-
-				U32 flags;
-				mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num);
-				// clear all but local flags
-				mFlags &= FLAGS_LOCAL;
-				mFlags |= flags;
-
-				U8 state;
-				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num );
-				mState = state;
-
-				// ...new objects that should come in selected need to be added to the selected list
-				mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0);
-
-				// Set all name value pairs
-				S32 nv_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_NameValue);
-				if (nv_size > 0)
-				{
-					std::string name_value_list;
-					mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_NameValue, name_value_list, block_num);
-					setNameValueList(name_value_list);
-				}
-
-				// Clear out any existing generic data
-				if (mData)
-				{
-					delete [] mData;
-				}
-
-				// Check for appended generic data
-				S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data);
-				if (data_size <= 0)
-				{
-					mData = NULL;
-				}
-				else
-				{
-					// ...has generic data
-					mData = new U8[data_size];
-					mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, mData, data_size, block_num);
-				}
-
-				S32 text_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Text);
-				if (text_size > 1)
-				{
-					// Setup object text
-					if (!mText)
-					{
-						mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
-						mText->setFont(LLFontGL::getFontSansSerif());
-						mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
-						mText->setMaxLines(-1);
-						mText->setSourceObject(this);
-						mText->setOnHUDAttachment(isHUDAttachment());
-					}
-
-					std::string temp_string;
-					mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_Text, temp_string, block_num );
-					
-					LLColor4U coloru;
-					mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextColor, coloru.mV, 4, block_num);
-
-					// alpha was flipped so that it zero encoded better
-					coloru.mV[3] = 255 - coloru.mV[3];
-					mText->setColor(LLColor4(coloru));
-					mText->setString(temp_string);
-					
-					if (mDrawable.notNull())
-					{
-						setChanged(MOVED | SILHOUETTE);
-						gPipeline.markMoved(mDrawable, FALSE); // undamped
-					}
-				}
-				else if (mText.notNull())
-				{
-					mText->markDead();
-					mText = NULL;
-				}
-
-				std::string media_url;
-				mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_MediaURL, media_url, block_num);
-                retval |= checkMediaURL(media_url);
-                
-				//
-				// Unpack particle system data
-				//
-				unpackParticleSource(block_num, owner_id);
-
-				// Mark all extra parameters not used
-				std::map<U16, ExtraParameter*>::iterator iter;
-				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
-				{
-					iter->second->in_use = FALSE;
-				}
-
-				// Unpack extra parameters
-				S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ExtraParams);
-				if (size > 0)
-				{
-					U8 *buffer = new U8[size];
-					mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ExtraParams, buffer, size, block_num);
-					LLDataPackerBinaryBuffer dp(buffer, size);
-
-					U8 num_parameters;
-					dp.unpackU8(num_parameters, "num_params");
-					U8 param_block[MAX_OBJECT_PARAMS_SIZE];
-					for (U8 param=0; param<num_parameters; ++param)
-					{
-						U16 param_type;
-						S32 param_size;
-						dp.unpackU16(param_type, "param_type");
-						dp.unpackBinaryData(param_block, param_size, "param_data");
-						//llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl;
-						LLDataPackerBinaryBuffer dp2(param_block, param_size);
-						unpackParameterEntry(param_type, &dp2);
-					}
-					delete[] buffer;
-				}
-
-				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
-				{
-					if (!iter->second->in_use)
-					{
-						// Send an update message in case it was formerly in use
-						parameterChanged(iter->first, iter->second->data, FALSE, false);
-					}
-				}
-
-				U8 joint_type = 0;
-				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_JointType, joint_type, block_num);
-				if (joint_type)
-				{
-					// create new joint info 
-					if (!mJointInfo)
-					{
-						mJointInfo = new LLVOJointInfo;
-					}
-					mJointInfo->mJointType = (EHavokJointType) joint_type;
-					mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointPivot, mJointInfo->mPivot, block_num);
-					mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointAxisOrAnchor, mJointInfo->mAxisOrAnchor, block_num);
-				}
-				else if (mJointInfo)
-				{
-					// this joint info is no longer needed
-					delete mJointInfo;
-					mJointInfo = NULL;
-				}
-
-				break;
-			}
-
-		case OUT_TERSE_IMPROVED:
-			{
-#ifdef DEBUG_UPDATE_TYPE
-				llinfos << "TI:" << getID() << llendl;
-#endif
-				length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData);
-				mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num);
-				count = 0;
-				LLVector4 collision_plane;
-				
-				switch(length)
-				{
-				case(60 + 16):
-					// pull out collision normal for avatar
-					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
-					((LLVOAvatar*)this)->setFootPlane(collision_plane);
-					count += sizeof(LLVector4);
-					// fall through
-				case 60:
-					// this is a terse 32 update
-					// pos
-					this_update_precision = 32;
-					htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					count += sizeof(LLVector3);
-					// vel
-					htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					count += sizeof(LLVector3);
-					// acc
-					htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					count += sizeof(LLVector3);
-					// theta
-					{
-						LLVector3 vec;
-						htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-						new_rot.unpackFromVector3(vec);
-					}
-					count += sizeof(LLVector3);
-					// omega
-					htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
-					if (new_angv.isExactlyZero())
-					{
-						// reset rotation time
-						resetRot();
-					}
-					setAngularVelocity(new_angv);
-#if LL_DARWIN
-					if (length == 76)
-					{
-						setAngularVelocity(LLVector3::zero);
-					}
-#endif
-					break;
-				case(32 + 16):
-					// pull out collision normal for avatar
-					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
-					((LLVOAvatar*)this)->setFootPlane(collision_plane);
-					count += sizeof(LLVector4);
-					// fall through
-				case 32:
-					// this is a terse 16 update
-					this_update_precision = 16;
-					test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*3;
-					new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*3;
-					setVelocity(U16_to_F32(val[VX], -size, size),
-								U16_to_F32(val[VY], -size, size),
-								U16_to_F32(val[VZ], -size, size));
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*3;
-					setAcceleration(U16_to_F32(val[VX], -size, size),
-									U16_to_F32(val[VY], -size, size),
-									U16_to_F32(val[VZ], -size, size));
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 8); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					count += sizeof(U16)*4;
-					new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
-					new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
-					new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
-					new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
-
-#ifdef LL_BIG_ENDIAN
-					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
-					val = valswizzle;
-#else
-					val = (U16 *) &data[count];
-#endif
-					setAngularVelocity(	U16_to_F32(val[VX], -size, size),
-										U16_to_F32(val[VY], -size, size),
-										U16_to_F32(val[VZ], -size, size));
-					break;
-
-				case 16:
-					// this is a terse 8 update
-					this_update_precision = 8;
-					test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
-					new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size);
-					new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT);
-
-					setVelocity(U8_to_F32(data[3], -size, size),
-								U8_to_F32(data[4], -size, size),
-								U8_to_F32(data[5], -size, size) );
-
-					setAcceleration(U8_to_F32(data[6], -size, size),
-									U8_to_F32(data[7], -size, size),
-									U8_to_F32(data[8], -size, size) );
-
-					new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f);
-					new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f);
-					new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
-					new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
-
-					setAngularVelocity(	U8_to_F32(data[13], -size, size),
-										U8_to_F32(data[14], -size, size),
-										U8_to_F32(data[15], -size, size) );
-					break;
-				}
-
-				U8 state;
-				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num );
-				mState = state;
-				break;
-			}
-
-		default:
-			break;
-
-		}
-	}
-	else
-	{
-		// handle the compressed case
-		LLUUID sound_uuid;
-		LLUUID	owner_id;
-		F32    gain = 0;
-		U8     sound_flags = 0;
-		F32		cutoff = 0;
-
-		U16 val[4];
-
-		U8		state;
-
-		dp->unpackU8(state, "State");
-		mState = state;
-
-		switch(update_type)
-		{
-			case OUT_TERSE_IMPROVED:
-			{
-#ifdef DEBUG_UPDATE_TYPE
-				llinfos << "CompTI:" << getID() << llendl;
-#endif
-				U8		value;
-				dp->unpackU8(value, "agent");
-				if (value)
-				{
-					LLVector4 collision_plane;
-					dp->unpackVector4(collision_plane, "Plane");
-					((LLVOAvatar*)this)->setFootPlane(collision_plane);
-				}
-				test_pos_parent = getPosition();
-				dp->unpackVector3(new_pos_parent, "Pos");
-				dp->unpackU16(val[VX], "VelX");
-				dp->unpackU16(val[VY], "VelY");
-				dp->unpackU16(val[VZ], "VelZ");
-				setVelocity(U16_to_F32(val[VX], -128.f, 128.f),
-							U16_to_F32(val[VY], -128.f, 128.f),
-							U16_to_F32(val[VZ], -128.f, 128.f));
-				dp->unpackU16(val[VX], "AccX");
-				dp->unpackU16(val[VY], "AccY");
-				dp->unpackU16(val[VZ], "AccZ");
-				setAcceleration(U16_to_F32(val[VX], -64.f, 64.f),
-								U16_to_F32(val[VY], -64.f, 64.f),
-								U16_to_F32(val[VZ], -64.f, 64.f));
-
-				dp->unpackU16(val[VX], "ThetaX");
-				dp->unpackU16(val[VY], "ThetaY");
-				dp->unpackU16(val[VZ], "ThetaZ");
-				dp->unpackU16(val[VS], "ThetaS");
-				new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
-				new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
-				new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
-				new_rot.mQ[VS] = U16_to_F32(val[VS], -1.f, 1.f);
-				dp->unpackU16(val[VX], "AccX");
-				dp->unpackU16(val[VY], "AccY");
-				dp->unpackU16(val[VZ], "AccZ");
-				setAngularVelocity(	U16_to_F32(val[VX], -64.f, 64.f),
-									U16_to_F32(val[VY], -64.f, 64.f),
-									U16_to_F32(val[VZ], -64.f, 64.f));
-			}
-			break;
-			case OUT_FULL_COMPRESSED:
-			case OUT_FULL_CACHED:
-			{
-#ifdef DEBUG_UPDATE_TYPE
-				llinfos << "CompFull:" << getID() << llendl;
-#endif
-				mCostStale = true;
-
-				if (isSelected())
-				{
-					gFloaterTools->dirty();
-				}
-	
-				dp->unpackU32(crc, "CRC");
-				mTotalCRC = crc;
-				dp->unpackU8(material, "Material");
-				U8 old_material = getMaterial();
-				if (old_material != material)
-				{
-					setMaterial(material);
-					if (mDrawable.notNull())
-					{
-						gPipeline.markMoved(mDrawable, FALSE); // undamped
-					}
-				}
-				dp->unpackU8(click_action, "ClickAction");
-				setClickAction(click_action);
-				dp->unpackVector3(new_scale, "Scale");
-				dp->unpackVector3(new_pos_parent, "Pos");
-				LLVector3 vec;
-				dp->unpackVector3(vec, "Rot");
-				new_rot.unpackFromVector3(vec);
-				setAcceleration(LLVector3::zero);
-
-				U32 value;
-				dp->unpackU32(value, "SpecialCode");
-				dp->setPassFlags(value);
-				dp->unpackUUID(owner_id, "Owner");
-
-				if (value & 0x80)
-				{
-					dp->unpackVector3(vec, "Omega");
-					setAngularVelocity(vec);
-				}
-
-				if (value & 0x20)
-				{
-					dp->unpackU32(parent_id, "ParentID");
-				}
-				else
-				{
-					parent_id = 0;
-				}
-
-				S32 sp_size;
-				U32 size;
-				if (value & 0x2)
-				{
-					sp_size = 1;
-					delete [] mData;
-					mData = new U8[1];
-					dp->unpackU8(((U8*)mData)[0], "TreeData");
-				}
-				else if (value & 0x1)
-				{
-					dp->unpackU32(size, "ScratchPadSize");
-					delete [] mData;
-					mData = new U8[size];
-					dp->unpackBinaryData((U8 *)mData, sp_size, "PartData");
-				}
-				else
-				{
-					mData = NULL;
-				}
-
-				// Setup object text
-				if (!mText && (value & 0x4))
-				{
-					mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
-					mText->setFont(LLFontGL::getFontSansSerif());
-					mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
-					mText->setMaxLines(-1); // Set to match current agni behavior.
-					mText->setSourceObject(this);
-					mText->setOnHUDAttachment(isHUDAttachment());
-				}
-
-				if (value & 0x4)
-				{
-					std::string temp_string;
-					dp->unpackString(temp_string, "Text");
-					LLColor4U coloru;
-					dp->unpackBinaryDataFixed(coloru.mV, 4, "Color");
-					coloru.mV[3] = 255 - coloru.mV[3];
-					mText->setColor(LLColor4(coloru));
-					mText->setString(temp_string);
-
-					setChanged(TEXTURE);
-				}
-				else if(mText.notNull())
-				{
-					mText->markDead();
-					mText = NULL;
-				}
-
-                std::string media_url;
-				if (value & 0x200)
-				{
-					dp->unpackString(media_url, "MediaURL");
-				}
-                retval |= checkMediaURL(media_url);
-
-				//
-				// Unpack particle system data
-				//
-				if (value & 0x8)
-				{
-					unpackParticleSource(*dp, owner_id);
-				}
-				else
-				{
-					deleteParticleSource();
-				}
-				
-				// Mark all extra parameters not used
-				std::map<U16, ExtraParameter*>::iterator iter;
-				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
-				{
-					iter->second->in_use = FALSE;
-				}
-
-				// Unpack extra params
-				U8 num_parameters;
-				dp->unpackU8(num_parameters, "num_params");
-				U8 param_block[MAX_OBJECT_PARAMS_SIZE];
-				for (U8 param=0; param<num_parameters; ++param)
-				{
-					U16 param_type;
-					S32 param_size;
-					dp->unpackU16(param_type, "param_type");
-					dp->unpackBinaryData(param_block, param_size, "param_data");
-					//llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl;
-					LLDataPackerBinaryBuffer dp2(param_block, param_size);
-					unpackParameterEntry(param_type, &dp2);
-				}
-
-				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
-				{
-					if (!iter->second->in_use)
-					{
-						// Send an update message in case it was formerly in use
-						parameterChanged(iter->first, iter->second->data, FALSE, false);
-					}
-				}
-
-				if (value & 0x10)
-				{
-					dp->unpackUUID(sound_uuid, "SoundUUID");
-					dp->unpackF32(gain, "SoundGain");
-					dp->unpackU8(sound_flags, "SoundFlags");
-					dp->unpackF32(cutoff, "SoundRadius");
-				}
-
-				if (value & 0x100)
-				{
-					std::string name_value_list;
-					dp->unpackString(name_value_list, "NV");
-
-					setNameValueList(name_value_list);
-				}
-
-				mTotalCRC = crc;
-
-				setAttachedSound(sound_uuid, owner_id, gain, sound_flags);
-
-				// only get these flags on updates from sim, not cached ones
-				// Preload these five flags for every object.
-				// Finer shades require the object to be selected, and the selection manager
-				// stores the extended permission info.
-				U32 flags;
-				mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num);
-				// keep local flags and overwrite remote-controlled flags
-				mFlags = (mFlags & FLAGS_LOCAL) | flags;
-
-					// ...new objects that should come in selected need to be added to the selected list
-				mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0);
-			}
-			break;
-
-		default:
-			break;
-		}
-	}
-
-	//
-	// Fix object parenting.
-	//
-	BOOL b_changed_status = FALSE;
-
-	if (OUT_TERSE_IMPROVED != update_type)
-	{
-		// We only need to update parenting on full updates, terse updates
-		// don't send parenting information.
-		if (!cur_parentp)
-		{
-			if (parent_id == 0)
-			{
-				// No parent now, no parent in message -> do nothing
-			}
-			else
-			{
-				// No parent now, new parent in message -> attach to that parent if possible
-				LLUUID parent_uuid;
-				LLViewerObjectList::getUUIDFromLocal(parent_uuid,
-														parent_id,
-														mesgsys->getSenderIP(),
-														mesgsys->getSenderPort());
-
-				LLViewerObject *sent_parentp = gObjectList.findObject(parent_uuid);
-
-				//
-				// Check to see if we have the corresponding viewer object for the parent.
-				//
-				if (sent_parentp && sent_parentp->getParent() == this)
-				{
-					// Try to recover if we attempt to attach a parent to its child
-					llwarns << "Attempt to attach a parent to it's child: " << this->getID() << " to " << sent_parentp->getID() << llendl;
-					this->removeChild(sent_parentp);
-					sent_parentp->setDrawableParent(NULL);
-				}
-				
-				if (sent_parentp && (sent_parentp != this) && !sent_parentp->isDead())
-				{
-					//
-					// We have a viewer object for the parent, and it's not dead.
-					// Do the actual reparenting here.
-					//
-
-					// new parent is valid
-					b_changed_status = TRUE;
-					// ...no current parent, so don't try to remove child
-					if (mDrawable.notNull())
-					{
-						if (mDrawable->isDead() || !mDrawable->getVObj())
-						{
-							llwarns << "Drawable is dead or no VObj!" << llendl;
-							sent_parentp->addChild(this);
-						}
-						else
-						{
-							if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 1
-							{
-								// Bad, we got a cycle somehow.
-								// Kill both the parent and the child, and
-								// set cache misses for both of them.
-								llwarns << "Attempting to recover from parenting cycle!" << llendl;
-								llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl;
-								llwarns << "Adding to cache miss list" << llendl;
-								setParent(NULL);
-								sent_parentp->setParent(NULL);
-								getRegion()->addCacheMissFull(getLocalID());
-								getRegion()->addCacheMissFull(sent_parentp->getLocalID());
-								gObjectList.killObject(sent_parentp);
-								gObjectList.killObject(this);
-								return retval;
-							}
-							sent_parentp->addChild(this);
-							// make sure this object gets a non-damped update
-							if (sent_parentp->mDrawable.notNull())
-							{
-								gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped
-							}
-						}
-					}
-					else
-					{
-						sent_parentp->addChild(this);
-					}
-					
-					// Show particles, icon and HUD
-					hideExtraDisplayItems( FALSE );
-
-					setChanged(MOVED | SILHOUETTE);
-				}
-				else
-				{
-					//
-					// No corresponding viewer object for the parent, put the various
-					// pieces on the orphan list.
-					//
-					
-					//parent_id
-					U32 ip = mesgsys->getSenderIP();
-					U32 port = mesgsys->getSenderPort();
-					
-					gObjectList.orphanize(this, parent_id, ip, port);
-
-					// Hide particles, icon and HUD
-					hideExtraDisplayItems( TRUE );
-				}
-			}
-		}
-		else
-		{
-			// BUG: this is a bad assumption once border crossing is alowed
-			if (  (parent_id == cur_parentp->mLocalID)
-				&&(update_type == OUT_TERSE_IMPROVED))
-			{
-				// Parent now, same parent in message -> do nothing
-
-				// Debugging for suspected problems with local ids.
-				//LLUUID parent_uuid;
-				//LLViewerObjectList::getUUIDFromLocal(parent_uuid, parent_id, mesgsys->getSenderIP(), mesgsys->getSenderPort() );
-				//if (parent_uuid != cur_parentp->getID() )
-				//{
-				//	llerrs << "Local ID match but UUID mismatch of viewer object" << llendl;
-				//}
-			}
-			else
-			{
-				// Parented now, different parent in message
-				LLViewerObject *sent_parentp;
-				if (parent_id == 0)
-				{
-					//
-					// This object is no longer parented, we sent in a zero parent ID.
-					//
-					sent_parentp = NULL;
-				}
-				else
-				{
-					LLUUID parent_uuid;
-					LLViewerObjectList::getUUIDFromLocal(parent_uuid,
-														parent_id,
-														gMessageSystem->getSenderIP(),
-														gMessageSystem->getSenderPort());
-					sent_parentp = gObjectList.findObject(parent_uuid);
-					
-					if (isAvatar())
-					{
-						// This logic is meant to handle the case where a sitting avatar has reached a new sim
-						// ahead of the object she was sitting on (which is common as objects are transfered through
-						// a slower route than agents)...
-						// In this case, the local id for the object will not be valid, since the viewer has not received
-						// a full update for the object from that sim yet, so we assume that the agent is still sitting
-						// where she was originally. --RN
-						if (!sent_parentp)
-						{
-							sent_parentp = cur_parentp;
-						}
-					}
-					else if (!sent_parentp)
-					{
-						//
-						// Switching parents, but we don't know the new parent.
-						//
-						U32 ip = mesgsys->getSenderIP();
-						U32 port = mesgsys->getSenderPort();
-
-						// We're an orphan, flag things appropriately.
-						gObjectList.orphanize(this, parent_id, ip, port);
-					}
-				}
-
-				// Reattach if possible.
-				if (sent_parentp && sent_parentp != cur_parentp && sent_parentp != this)
-				{
-					// New parent is valid, detach and reattach
-					b_changed_status = TRUE;
-					if (mDrawable.notNull())
-					{
-						if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 2
-						{
-							// Bad, we got a cycle somehow.
-							// Kill both the parent and the child, and
-							// set cache misses for both of them.
-							llwarns << "Attempting to recover from parenting cycle!" << llendl;
-							llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl;
-							llwarns << "Adding to cache miss list" << llendl;
-							setParent(NULL);
-							sent_parentp->setParent(NULL);
-							getRegion()->addCacheMissFull(getLocalID());
-							getRegion()->addCacheMissFull(sent_parentp->getLocalID());
-							gObjectList.killObject(sent_parentp);
-							gObjectList.killObject(this);
-							return retval;
-						}
-						// make sure this object gets a non-damped update
-					}
-					cur_parentp->removeChild(this);
-					sent_parentp->addChild(this);
-					setChanged(MOVED | SILHOUETTE);
-					sent_parentp->setChanged(MOVED | SILHOUETTE);
-					if (sent_parentp->mDrawable.notNull())
-					{
-						gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped
-					}
-				}
-				else if (!sent_parentp)
-				{
-					bool remove_parent = true;
-					// No new parent, or the parent that we sent doesn't exist on the viewer.
-					LLViewerObject *parentp = (LLViewerObject *)getParent();
-					if (parentp)
-					{
-						if (parentp->getRegion() != getRegion())
-						{
-							// This is probably an object flying across a region boundary, the
-							// object probably ISN'T being reparented, but just got an object
-							// update out of order (child update before parent).
-							//llinfos << "Don't reparent object handoffs!" << llendl;
-							remove_parent = false;
-						}
-					}
-
-					if (remove_parent)
-					{
-						b_changed_status = TRUE;
-						if (mDrawable.notNull())
-						{
-							// clear parent to removeChild can put the drawable on the damped list
-							setDrawableParent(NULL); // LLViewerObject::processUpdateMessage 3
-						}
-
-						cur_parentp->removeChild(this);
-
-						if (mJointInfo && !parent_id)
-						{
-							// since this object is no longer parent-relative
-							// we make sure we delete any joint info
-							delete mJointInfo;
-							mJointInfo = NULL;
-						}
-
-						setChanged(MOVED | SILHOUETTE);
-
-						if (mDrawable.notNull())
-						{
-							// make sure this object gets a non-damped update
-							gPipeline.markMoved(mDrawable, FALSE); // undamped
-						}
-					}
-				}
-			}
-		}
-	}
-
-	new_rot.normQuat();
-
-	if (sPingInterpolate)
-	{ 
-		LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender());
-		if (cdp)
-		{
-			F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped);
-			LLVector3 diff = getVelocity() * ping_delay; 
-			new_pos_parent += diff;
-		}
-		else
-		{
-			llwarns << "findCircuit() returned NULL; skipping interpolation" << llendl;
-		}
-	}
-
-	//////////////////////////
-	//
-	// Set the generic change flags...
-	//
-	//
-
-	// WTF?   If we're going to skip this message, why are we 
-	// doing all the parenting, etc above?
-	U32 packet_id = mesgsys->getCurrentRecvPacketID(); 
-	if (packet_id < mLatestRecvPacketID && 
-		mLatestRecvPacketID - packet_id < 65536)
-	{
-		//skip application of this message, it's old
-		return retval;
-	}
-
-	mLatestRecvPacketID = packet_id;
-
-	// Set the change flags for scale
-	if (new_scale != getScale())
-	{
-		setChanged(SCALED | SILHOUETTE);
-		setScale(new_scale);  // Must follow setting permYouOwner()
-	}
-
-	// first, let's see if the new position is actually a change
-
-	//static S32 counter = 0;
-
-	F32 vel_mag_sq = getVelocity().magVecSquared();
-	F32 accel_mag_sq = getAcceleration().magVecSquared();
-
-	if (  ((b_changed_status)||(test_pos_parent != new_pos_parent))
-		||(  (!isSelected())
-		   &&(  (vel_mag_sq != 0.f)
-			  ||(accel_mag_sq != 0.f)
-			  ||(this_update_precision > mBestUpdatePrecision))))
-	{
-		mBestUpdatePrecision = this_update_precision;
-		
-		LLVector3 diff = new_pos_parent - test_pos_parent ;
-		F32 mag_sqr = diff.magVecSquared() ;
-		if(llfinite(mag_sqr)) 
-		{
-			setPositionParent(new_pos_parent);
-		}
-		else
-		{
-			llwarns << "Can not move the object/avatar to an infinite location!" << llendl ;	
-
-			retval |= INVALID_UPDATE ;
-		}
-
-		if (mParent && ((LLViewerObject*)mParent)->isAvatar())
-		{
-			// we have changed the position of an attachment, so we need to clamp it
-			LLVOAvatar *avatar = (LLVOAvatar*)mParent;
-
-			avatar->clampAttachmentPositions();
-		}
-		
-		// If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps
-		if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) )
-		{
-			LLViewerStats::getInstance()->mAgentPositionSnaps.push( diff.length() );
-		}
-	}
-
-	if (new_rot != mLastRot
-		|| new_angv != old_angv)
-	{
-		if (new_rot != mLastRot)
-		{
-			mLastRot = new_rot;
-			setRotation(new_rot);
-		}
-		
-		setChanged(ROTATED | SILHOUETTE);
-		
-		resetRot();
-	}
-
-
-	if ( gShowObjectUpdates )
-	{
-		if (!((mPrimitiveCode == LL_PCODE_LEGACY_AVATAR) && (((LLVOAvatar *) this)->isSelf()))
-			&& mRegionp)
-		{
-			LLViewerObject* object = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, mRegionp);
-			LLVOTextBubble* bubble = (LLVOTextBubble*) object;
-
-			if (update_type == OUT_TERSE_IMPROVED)
-			{
-				bubble->mColor.setVec(0.f, 0.f, 1.f, 1.f);
-			}
-			else
-			{
-				bubble->mColor.setVec(1.f, 0.f, 0.f, 1.f);
-			}
-			object->setPositionGlobal(getPositionGlobal());
-			gPipeline.addObject(object);
-		}
-	}
-
-	if ((0.0f == vel_mag_sq) && 
-		(0.0f == accel_mag_sq) &&
-		(0.0f == getAngularVelocity().magVecSquared()))
-	{
-		mStatic = TRUE; // This object doesn't move!
-	}
-	else
-	{
-		mStatic = FALSE;
-	}
-
-// BUG: This code leads to problems during group rotate and any scale operation.
-// Small discepencies between the simulator and viewer representations cause the 
-// selection center to creep, leading to objects moving around the wrong center.
-// 
-// Removing this, however, means that if someone else drags an object you have
-// selected, your selection center and dialog boxes will be wrong.  It also means
-// that higher precision information on selected objects will be ignored.
-//
-// I believe the group rotation problem is fixed.  JNC 1.21.2002
-//
-	// Additionally, if any child is selected, need to update the dialogs and selection
-	// center.
-	BOOL needs_refresh = mUserSelected;
-	for (child_list_t::iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		needs_refresh = needs_refresh || child->mUserSelected;
-	}
-
-	if (needs_refresh)
-	{
-		LLSelectMgr::getInstance()->updateSelectionCenter();
-		dialog_refresh_all();
-	} 
-
-
-	// Mark update time as approx. now, with the ping delay.
-	// Ping delay is off because it's not set for velocity interpolation, causing
-	// much jumping and hopping around...
-
-//	U32 ping_delay = mesgsys->mCircuitInfo.getPingDelay();
-	mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
-	mLastMessageUpdateSecs = mLastInterpUpdateSecs;
-	if (mDrawable.notNull())
-	{
-		// Don't clear invisibility flag on update if still orphaned!
-		if (mDrawable->isState(LLDrawable::FORCE_INVISIBLE) && !mOrphaned)
-		{
-// 			lldebugs << "Clearing force invisible: " << mID << ":" << getPCodeString() << ":" << getPositionAgent() << llendl;
-			mDrawable->setState(LLDrawable::CLEAR_INVISIBLE);
-		}
-	}
-
-	// Update special hover cursor status
-	bool special_hover_cursor = specialHoverCursor();
-	if (old_special_hover_cursor != special_hover_cursor
-		&& mDrawable.notNull())
-	{
-		mDrawable->updateSpecialHoverCursor(special_hover_cursor);
-	}
-
-	return retval;
-}
-
-BOOL LLViewerObject::isActive() const
-{
-	return TRUE;
-}
-
-
-
-BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
-{
-	static LLFastTimer::DeclareTimer ftm("Viewer Object");
-	LLFastTimer t(ftm);
-
-	if (mDead)
-	{
-		// It's dead.  Don't update it.
-		return TRUE;
-	}
-
-	// CRO - don't velocity interp linked objects!
-	// Leviathan - but DO velocity interp joints
-	if (!mStatic && sVelocityInterpolate && !isSelected())
-	{
-		// calculate dt from last update
-		F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
-		F32 dt = mTimeDilation * dt_raw;
-
-		if (!mJointInfo)
-		{
-			applyAngularVelocity(dt);
-		}
-
-		LLViewerObject *parentp = (LLViewerObject *) getParent();
-		if (mJointInfo)
-		{
-			if (parentp)
-			{
-				// do parent-relative stuff
-				LLVector3 ang_vel = getAngularVelocity();
-				F32 omega = ang_vel.magVecSquared();
-				F32 angle = 0.0f;
-				LLQuaternion dQ;
-				if (omega > 0.00001f)
-				{
-					omega = sqrt(omega);
-					angle = omega * dt;
-					dQ.setQuat(angle, ang_vel);
-				}
-				LLVector3 pos = getPosition();
-	
-				if (HJT_HINGE == mJointInfo->mJointType)
-				{
-					// hinge = uniform circular motion
-					LLVector3 parent_pivot = getVelocity();
-					LLVector3 parent_axis = getAcceleration();
-	
-					angle = dt * (ang_vel * mJointInfo->mAxisOrAnchor);	// AxisOrAnchor = axis
-					dQ.setQuat(angle, mJointInfo->mAxisOrAnchor);		// AxisOrAnchor = axis
-					LLVector3 pivot_offset = pos - mJointInfo->mPivot;	// pos in pivot-frame
-					pivot_offset = pivot_offset * dQ;					// new rotated pivot-frame pos
-					pos = mJointInfo->mPivot + pivot_offset;			// parent-frame
-					LLViewerObject::setPosition(pos);
-					LLQuaternion Q_PC = getRotation();
-					setRotation(Q_PC * dQ);
-					mLastInterpUpdateSecs = time;
-				}
-				else if (HJT_POINT == mJointInfo->mJointType)
-						// || HJT_LPOINT == mJointInfo->mJointType)
-				{
-					// point-to-point = spin about axis and uniform circular motion
-					// 					of axis about the pivot point
-					//
-					// NOTE: this interpolation scheme is not quite good enough to
-					// reduce the bandwidth -- needs a gravitational correction. 
-					// Similarly for hinges with axes that deviate from vertical.
-	
-					LLQuaternion Q_PC = getRotation();
-					Q_PC = Q_PC * dQ;
-					setRotation(Q_PC);
-
-					LLVector3 pivot_to_child = - mJointInfo->mAxisOrAnchor;	// AxisOrAnchor = anchor
-					pos = mJointInfo->mPivot + pivot_to_child * Q_PC;
-					LLViewerObject::setPosition(pos);
-					mLastInterpUpdateSecs = time;
-				}
-				/* else if (HJT_WHEEL == mJointInfo->mJointInfo)
-				{
-					// wheel = uniform rotation about axis, with linear
-					//		   velocity interpolation (if any)
-					LLVector3 parent_axis = getAcceleration();	// HACK -- accel stores the parent-axis (parent-frame)
-	
-					LLQuaternion Q_PC = getRotation();
-	
-					angle = dt * (parent_axis * ang_vel);
-					dQ.setQuat(angle, parent_axis);
-	
-					Q_PC = Q_PC * dQ;
-					setRotation(Q_PC);
-
-					pos = getPosition() + dt * getVelocity();
-					LLViewerObject::setPosition(pos);
-					mLastInterpUpdateSecs = time;
-				}*/
-			}
-		}
-		else if (isAttachment())
-		{
-			mLastInterpUpdateSecs = time;
-			return TRUE;
-		}
-		else
-		{	// Move object based on it's velocity and rotation
-			interpolateLinearMotion(time, dt);
-		}
-	}
-
-	updateDrawable(FALSE);
-
-	return TRUE;
-}
-
-
-// Move an object due to idle-time viewer side updates by iterpolating motion
-void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
-{
-	// linear motion
-	// PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object
-	// updates represents the average velocity of the last timestep, rather than the final velocity.
-	// the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically
-	// 
-	// *TODO: should also wrap linear accel/velocity in check
-	// to see if object is selected, instead of explicitly
-	// zeroing it out	
-
-	F64 time_since_last_update = time - mLastMessageUpdateSecs;
-	if (time_since_last_update <= 0.0 || dt <= 0.f)
-	{
-		return;
-	}
-
-	LLVector3 accel = getAcceleration();
-	LLVector3 vel 	= getVelocity();
-	
-	if (sMaxUpdateInterpolationTime <= 0.0)
-	{	// Old code path ... unbounded, simple interpolation
-		if (!(accel.isExactlyZero() && vel.isExactlyZero()))
-		{
-			LLVector3 pos   = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;  
-		
-			// region local  
-			setPositionRegion(pos + getPositionRegion());
-			setVelocity(vel + accel*dt);	
-			
-			// for objects that are spinning but not translating, make sure to flag them as having moved
-			setChanged(MOVED | SILHOUETTE);
-		}
-	}
-	else if (!accel.isExactlyZero() || !vel.isExactlyZero())		// object is moving
-	{	// Object is moving, and hasn't been too long since we got an update from the server
-		
-		// Calculate predicted position and velocity
-		LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;	
-		LLVector3 new_v = accel * dt;
-
-		if (time_since_last_update > sPhaseOutUpdateInterpolationTime &&
-			sPhaseOutUpdateInterpolationTime > 0.0)
-		{	// Haven't seen a viewer update in a while, check to see if the ciruit is still active
-			if (mRegionp)
-			{	// The simulator will NOT send updates if the object continues normally on the path
-				// predicted by the velocity and the acceleration (often gravity) sent to the viewer
-				// So check to see if the circuit is blocked, which means the sim is likely in a long lag
-				LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() );
-				if (cdp)
-				{
-					// Find out how many seconds since last packet arrived on the circuit
-					F64 time_since_last_packet = LLMessageSystem::getMessageTimeSeconds() - cdp->getLastPacketInTime();
-
-					if (!cdp->isAlive() ||		// Circuit is dead or blocked
-						 cdp->isBlocked() ||	// or doesn't seem to be getting any packets
-						 (time_since_last_packet > sPhaseOutUpdateInterpolationTime))
-					{
-						// Start to reduce motion interpolation since we haven't seen a server update in a while
-						F64 time_since_last_interpolation = time - mLastInterpUpdateSecs;
-						F64 phase_out = 1.0;
-						if (time_since_last_update > sMaxUpdateInterpolationTime)
-						{	// Past the time limit, so stop the object
-							phase_out = 0.0;
-							//llinfos << "Motion phase out to zero" << llendl;
-
-							// Kill angular motion as well.  Note - not adding this due to paranoia
-							// about stopping rotation for llTargetOmega objects and not having it restart
-							// setAngularVelocity(LLVector3::zero);
-						}
-						else if (mLastInterpUpdateSecs - mLastMessageUpdateSecs > sPhaseOutUpdateInterpolationTime)
-						{	// Last update was already phased out a bit
-							phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / 
-										(sMaxUpdateInterpolationTime - time_since_last_interpolation);
-							//llinfos << "Continuing motion phase out of " << (F32) phase_out << llendl;
-						}
-						else
-						{	// Phase out from full value
-							phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / 
-										(sMaxUpdateInterpolationTime - sPhaseOutUpdateInterpolationTime);
-							//llinfos << "Starting motion phase out of " << (F32) phase_out << llendl;
-						}
-						phase_out = llclamp(phase_out, 0.0, 1.0);
-
-						new_pos = new_pos * ((F32) phase_out);
-						new_v = new_v * ((F32) phase_out);
-					}
-				}
-			}
-		}
-
-		new_pos = new_pos + getPositionRegion();
-		new_v = new_v + vel;
-
-
-		// Clamp interpolated position to minimum underground and maximum region height
-		LLVector3d new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos);
-		F32 min_height;
-		if (isAvatar())
-		{	// Make a better guess about AVs not going underground
-			min_height = LLWorld::getInstance()->resolveLandHeightGlobal(new_pos_global);
-			min_height += (0.5f * getScale().mV[VZ]);
-		}
-		else
-		{	// This will put the object underground, but we can't tell if it will stop 
-			// at ground level or not
-			min_height = LLWorld::getInstance()->getMinAllowedZ(this, new_pos_global);
-		}
-
-		new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]);
-		new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]);
-
-		// Check to see if it's going off the region
-		LLVector3 temp(new_pos);
-		if (temp.clamp(0.f, mRegionp->getWidth()))
-		{	// Going off this region, so see if we might end up on another region
-			LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
-			new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos);		// Re-fetch in case it got clipped above
-
-			// Clip the positions to known regions
-			LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global);
-			if (clip_pos_global != new_pos_global)
-			{	// Was clipped, so this means we hit a edge where there is no region to enter
-				
-				//llinfos << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global)
-				//	<< " from " << new_pos << llendl;
-				new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global);
-				
-				// Stop motion and get server update for bouncing on the edge
-				new_v.clear();
-				setAcceleration(LLVector3::zero);
-			}
-			else
-			{	// Let predicted movement cross into another region
-				//llinfos << "Predicting region crossing to " << new_pos << llendl;
-			}
-		}
-
-		// Set new position and velocity
-		setPositionRegion(new_pos);
-		setVelocity(new_v);	
-		
-		// for objects that are spinning but not translating, make sure to flag them as having moved
-		setChanged(MOVED | SILHOUETTE);
-	}		
-
-	// Update the last time we did anything
-	mLastInterpUpdateSecs = time;
-}
-
-
-
-BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
-	delete [] mData;
-
-	if (datap)
-	{
-		mData = new U8[data_size];
-		if (!mData)
-		{
-			return FALSE;
-		}
-		memcpy(mData, datap, data_size);		/* Flawfinder: ignore */
-	}
-	return TRUE;
-}
-
-// delete an item in the inventory, but don't tell the server. This is
-// used internally by remove, update, and savescript.
-// This will only delete the first item with an item_id in the list
-void LLViewerObject::deleteInventoryItem(const LLUUID& item_id)
-{
-	if(mInventory)
-	{
-		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
-		LLInventoryObject::object_list_t::iterator end = mInventory->end();
-		for( ; it != end; ++it )
-		{
-			if((*it)->getUUID() == item_id)
-			{
-				// This is safe only because we return immediatly.
-				mInventory->erase(it); // will deref and delete it
-				return;
-			}
-		}
-		doInventoryCallback();
-	}
-}
-
-void LLViewerObject::doUpdateInventory(
-	LLPointer<LLViewerInventoryItem>& item,
-	U8 key,
-	bool is_new)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-
-	LLViewerInventoryItem* old_item = NULL;
-	if(TASK_INVENTORY_ITEM_KEY == key)
-	{
-		old_item = (LLViewerInventoryItem*)getInventoryObject(item->getUUID());
-	}
-	else if(TASK_INVENTORY_ASSET_KEY == key)
-	{
-		old_item = getInventoryItemByAsset(item->getAssetUUID());
-	}
-	LLUUID item_id;
-	LLUUID new_owner;
-	LLUUID new_group;
-	BOOL group_owned = FALSE;
-	if(old_item)
-	{
-		item_id = old_item->getUUID();
-		new_owner = old_item->getPermissions().getOwner();
-		new_group = old_item->getPermissions().getGroup();
-		group_owned = old_item->getPermissions().isGroupOwned();
-		old_item = NULL;
-	}
-	else
-	{
-		item_id = item->getUUID();
-	}
-	if(!is_new && mInventory)
-	{
-		// Attempt to update the local inventory. If we can get the
-		// object perm, we have perfect visibility, so we want the
-		// serial number to match. Otherwise, take our best guess and
-		// make sure that the serial number does not match.
-		deleteInventoryItem(item_id);
-		LLPermissions perm(item->getPermissions());
-		LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this);
-		bool is_atomic = ((S32)LLAssetType::AT_OBJECT == item->getType()) ? false : true;
-		if(obj_perm)
-		{
-			perm.setOwnerAndGroup(LLUUID::null, obj_perm->getOwner(), obj_perm->getGroup(), is_atomic);
-		}
-		else
-		{
-			if(group_owned)
-			{
-				perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic);
-			}
-			else if(!new_owner.isNull())
-			{
-				// The object used to be in inventory, so we can
-				// assume the owner and group will match what they are
-				// there.
-				perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic);
-			}
-			// *FIX: can make an even better guess by using the mPermGroup flags
-			else if(permYouOwner())
-			{
-				// best guess.
-				perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), item->getPermissions().getGroup(), is_atomic);
-				--mInventorySerialNum;
-			}
-			else
-			{
-				// dummy it up.
-				perm.setOwnerAndGroup(LLUUID::null, LLUUID::null, LLUUID::null, is_atomic);
-				--mInventorySerialNum;
-			}
-		}
-		LLViewerInventoryItem* oldItem = item;
-		LLViewerInventoryItem* new_item = new LLViewerInventoryItem(oldItem);
-		new_item->setPermissions(perm);
-		mInventory->push_front(new_item);
-		doInventoryCallback();
-		++mInventorySerialNum;
-	}
-}
-
-// save a script, which involves removing the old one, and rezzing
-// in the new one. This method should be called with the asset id
-// of the new and old script AFTER the bytecode has been saved.
-void LLViewerObject::saveScript(
-	const LLViewerInventoryItem* item,
-	BOOL active,
-	bool is_new)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-
-	/*
-	 * XXXPAM Investigate not making this copy.  Seems unecessary, but I'm unsure about the
-	 * interaction with doUpdateInventory() called below.
-	 */
-	lldebugs << "LLViewerObject::saveScript() " << item->getUUID() << " " << item->getAssetUUID() << llendl;
-	LLPointer<LLViewerInventoryItem> task_item =
-		new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
-								  item->getAssetUUID(), item->getType(),
-								  item->getInventoryType(),
-								  item->getName(), item->getDescription(),
-								  item->getSaleInfo(), item->getFlags(),
-								  item->getCreationDate());
-	task_item->setTransactionID(item->getTransactionID());
-
-	LLMessageSystem* msg = gMessageSystem;
-	msg->newMessageFast(_PREHASH_RezScript);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
-	msg->nextBlockFast(_PREHASH_UpdateBlock);
-	msg->addU32Fast(_PREHASH_ObjectLocalID, (mLocalID));
-	U8 enabled = active;
-	msg->addBOOLFast(_PREHASH_Enabled, enabled);
-	msg->nextBlockFast(_PREHASH_InventoryBlock);
-	task_item->packMessage(msg);
-	msg->sendReliable(mRegionp->getHost());
-
-	// do the internal logic
-	doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, is_new);
-}
-
-void LLViewerObject::moveInventory(const LLUUID& folder_id,
-								   const LLUUID& item_id)
-{
-	lldebugs << "LLViewerObject::moveInventory " << item_id << llendl;
-	LLMessageSystem* msg = gMessageSystem;
-	msg->newMessageFast(_PREHASH_MoveTaskInventory);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	msg->addUUIDFast(_PREHASH_FolderID, folder_id);
-	msg->nextBlockFast(_PREHASH_InventoryData);
-	msg->addU32Fast(_PREHASH_LocalID, mLocalID);
-	msg->addUUIDFast(_PREHASH_ItemID, item_id);
-	msg->sendReliable(mRegionp->getHost());
-
-	LLInventoryObject* inv_obj = getInventoryObject(item_id);
-	if(inv_obj)
-	{
-		LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_obj;
-		if(!item->getPermissions().allowCopyBy(gAgent.getID()))
-		{
-			deleteInventoryItem(item_id);
-			++mInventorySerialNum;
-		}
-	}
-}
-
-void LLViewerObject::dirtyInventory()
-{
-	// If there aren't any LLVOInventoryListeners, we won't be
-	// able to update our mInventory when it comes back from the
-	// simulator, so we should not clear the inventory either.
-	if(mInventory && !mInventoryCallbacks.empty())
-	{
-		mInventory->clear(); // will deref and delete entries
-		delete mInventory;
-		mInventory = NULL;
-		mInventoryDirty = TRUE;
-	}
-}
-
-void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
-	LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo;
-	info->mListener = listener;
-	info->mInventoryData = user_data;
-	mInventoryCallbacks.push_front(info);
-}
-
-void LLViewerObject::removeInventoryListener(LLVOInventoryListener* listener)
-{
-	if (listener == NULL)
-		return;
-	for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
-		 iter != mInventoryCallbacks.end(); )
-	{
-		callback_list_t::iterator curiter = iter++;
-		LLInventoryCallbackInfo* info = *curiter;
-		if (info->mListener == listener)
-		{
-			delete info;
-			mInventoryCallbacks.erase(curiter);
-			break;
-		}
-	}
-}
-
-void LLViewerObject::clearInventoryListeners()
-{
-	for_each(mInventoryCallbacks.begin(), mInventoryCallbacks.end(), DeletePointer());
-	mInventoryCallbacks.clear();
-}
-
-void LLViewerObject::requestInventory()
-{
-	mInventoryDirty = FALSE;
-	if(mInventory)
-	{
-		//mInventory->clear() // will deref and delete it
-		//delete mInventory;
-		//mInventory = NULL;
-		doInventoryCallback();
-	}
-	// throw away duplicate requests
-	else
-	{
-		fetchInventoryFromServer();
-	}
-}
-
-void LLViewerObject::fetchInventoryFromServer()
-{
-	if (!mInventoryPending)
-	{
-		delete mInventory;
-		mInventory = NULL;
-		mInventoryDirty = FALSE;
-		LLMessageSystem* msg = gMessageSystem;
-		msg->newMessageFast(_PREHASH_RequestTaskInventory);
-		msg->nextBlockFast(_PREHASH_AgentData);
-		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-		msg->nextBlockFast(_PREHASH_InventoryData);
-		msg->addU32Fast(_PREHASH_LocalID, mLocalID);
-		msg->sendReliable(mRegionp->getHost());
-
-		// this will get reset by dirtyInventory or doInventoryCallback
-		mInventoryPending = TRUE;
-	}
-}
-
-struct LLFilenameAndTask
-{
-	LLUUID mTaskID;
-	std::string mFilename;
-#ifdef _DEBUG
-	static S32 sCount;
-	LLFilenameAndTask()
-	{
-		++sCount;
-		lldebugs << "Constructing LLFilenameAndTask: " << sCount << llendl;
-	}
-	~LLFilenameAndTask()
-	{
-		--sCount;
-		lldebugs << "Destroying LLFilenameAndTask: " << sCount << llendl;
-	}
-private:
-	LLFilenameAndTask(const LLFilenameAndTask& rhs);
-	const LLFilenameAndTask& operator=(const LLFilenameAndTask& rhs) const;
-#endif
-};
-
-#ifdef _DEBUG
-S32 LLFilenameAndTask::sCount = 0;
-#endif
-
-// static
-void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
-	LLUUID task_id;
-	msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_TaskID, task_id);
-	LLViewerObject* object = gObjectList.findObject(task_id);
-	if(!object)
-	{
-		llwarns << "LLViewerObject::processTaskInv object "
-			<< task_id << " does not exist." << llendl;
-		return;
-	}
-
-	msg->getS16Fast(_PREHASH_InventoryData, _PREHASH_Serial, object->mInventorySerialNum);
-	LLFilenameAndTask* ft = new LLFilenameAndTask;
-	ft->mTaskID = task_id;
-
-	std::string unclean_filename;
-	msg->getStringFast(_PREHASH_InventoryData, _PREHASH_Filename, unclean_filename);
-	ft->mFilename = LLDir::getScrubbedFileName(unclean_filename);
-	
-	if(ft->mFilename.empty())
-	{
-		lldebugs << "Task has no inventory" << llendl;
-		// mock up some inventory to make a drop target.
-		if(object->mInventory)
-		{
-			object->mInventory->clear(); // will deref and delete it
-		}
-		else
-		{
-			object->mInventory = new LLInventoryObject::object_list_t();
-		}
-		LLPointer<LLInventoryObject> obj;
-		obj = new LLInventoryObject(object->mID, LLUUID::null,
-									LLAssetType::AT_CATEGORY,
-									LLTrans::getString("ViewerObjectContents").c_str());
-		object->mInventory->push_front(obj);
-		object->doInventoryCallback();
-		delete ft;
-		return;
-	}
-	gXferManager->requestFile(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ft->mFilename), 
-								ft->mFilename, LL_PATH_CACHE,
-								object->mRegionp->getHost(),
-								TRUE,
-								&LLViewerObject::processTaskInvFile,
-								(void**)ft,
-								LLXferManager::HIGH_PRIORITY);
-}
-
-void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status)
-{
-	LLFilenameAndTask* ft = (LLFilenameAndTask*)user_data;
-	LLViewerObject* object = NULL;
-	if(ft && (0 == error_code) &&
-	   (object = gObjectList.findObject(ft->mTaskID)))
-	{
-		object->loadTaskInvFile(ft->mFilename);
-	}
-	else
-	{
-		// This Occurs When to requests were made, and the first one
-		// has already handled it.
-		lldebugs << "Problem loading task inventory. Return code: "
-				 << error_code << llendl;
-	}
-	delete ft;
-}
-
-void LLViewerObject::loadTaskInvFile(const std::string& filename)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
-	std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename);
-	llifstream ifs(filename_and_local_path);
-	if(ifs.good())
-	{
-		char buffer[MAX_STRING];	/* Flawfinder: ignore */
-		// *NOTE: This buffer size is hard coded into scanf() below.
-		char keyword[MAX_STRING];	/* Flawfinder: ignore */
-		if(mInventory)
-		{
-			mInventory->clear(); // will deref and delete it
-		}
-		else
-		{
-			mInventory = new LLInventoryObject::object_list_t;
-		}
-		while(ifs.good())
-		{
-			ifs.getline(buffer, MAX_STRING);
-			sscanf(buffer, " %254s", keyword);	/* Flawfinder: ignore */
-			if(0 == strcmp("inv_item", keyword))
-			{
-				LLPointer<LLInventoryObject> inv = new LLViewerInventoryItem;
-				inv->importLegacyStream(ifs);
-				mInventory->push_front(inv);
-			}
-			else if(0 == strcmp("inv_object", keyword))
-			{
-				LLPointer<LLInventoryObject> inv = new LLInventoryObject;
-				inv->importLegacyStream(ifs);
-				inv->rename(LLTrans::getString("ViewerObjectContents").c_str());
-				mInventory->push_front(inv);
-			}
-			else
-			{
-				llwarns << "Unknown token in inventory file '"
-						<< keyword << "'" << llendl;
-			}
-		}
-		ifs.close();
-		LLFile::remove(filename_and_local_path);
-	}
-	else
-	{
-		llwarns << "unable to load task inventory: " << filename_and_local_path
-				<< llendl;
-	}
-	doInventoryCallback();
-}
-
-void LLViewerObject::doInventoryCallback()
-{
-	for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
-		 iter != mInventoryCallbacks.end(); )
-	{
-		callback_list_t::iterator curiter = iter++;
-		LLInventoryCallbackInfo* info = *curiter;
-		if (info->mListener != NULL)
-		{
-			info->mListener->inventoryChanged(this,
-								 mInventory,
-								 mInventorySerialNum,
-								 info->mInventoryData);
-		}
-		else
-		{
-			llinfos << "LLViewerObject::doInventoryCallback() deleting bad listener entry." << llendl;
-			delete info;
-			mInventoryCallbacks.erase(curiter);
-		}
-	}
-	mInventoryPending = FALSE;
-}
-
-void LLViewerObject::removeInventory(const LLUUID& item_id)
-{
-	// close any associated floater properties
-	LLFloaterReg::hideInstance("properties", item_id);
-
-	LLMessageSystem* msg = gMessageSystem;
-	msg->newMessageFast(_PREHASH_RemoveTaskInventory);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	msg->nextBlockFast(_PREHASH_InventoryData);
-	msg->addU32Fast(_PREHASH_LocalID, mLocalID);
-	msg->addUUIDFast(_PREHASH_ItemID, item_id);
-	msg->sendReliable(mRegionp->getHost());
-	deleteInventoryItem(item_id);
-	++mInventorySerialNum;
-}
-
-void LLViewerObject::updateInventory(
-	LLViewerInventoryItem* item,
-	U8 key,
-	bool is_new)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
-	// This slices the object into what we're concerned about on the
-	// viewer. The simulator will take the permissions and transfer
-	// ownership.
-	LLPointer<LLViewerInventoryItem> task_item =
-		new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
-								  item->getAssetUUID(), item->getType(),
-								  item->getInventoryType(),
-								  item->getName(), item->getDescription(),
-								  item->getSaleInfo(),
-								  item->getFlags(),
-								  item->getCreationDate());
-	task_item->setTransactionID(item->getTransactionID());
-	LLMessageSystem* msg = gMessageSystem;
-	msg->newMessageFast(_PREHASH_UpdateTaskInventory);
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	msg->nextBlockFast(_PREHASH_UpdateData);
-	msg->addU32Fast(_PREHASH_LocalID, mLocalID);
-	msg->addU8Fast(_PREHASH_Key, key);
-	msg->nextBlockFast(_PREHASH_InventoryData);
-	task_item->packMessage(msg);
-	msg->sendReliable(mRegionp->getHost());
-
-	// do the internal logic
-	doUpdateInventory(task_item, key, is_new);
-}
-
-void LLViewerObject::updateInventoryLocal(LLInventoryItem* item, U8 key)
-{
-	LLPointer<LLViewerInventoryItem> task_item =
-		new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
-								  item->getAssetUUID(), item->getType(),
-								  item->getInventoryType(),
-								  item->getName(), item->getDescription(),
-								  item->getSaleInfo(), item->getFlags(),
-								  item->getCreationDate());
-
-	// do the internal logic
-	const bool is_new = false;
-	doUpdateInventory(task_item, key, is_new);
-}
-
-LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)
-{
-	LLInventoryObject* rv = NULL;
-	if(mInventory)
-	{
-		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
-		LLInventoryObject::object_list_t::iterator end = mInventory->end();
-		for ( ; it != end; ++it)
-		{
-			if((*it)->getUUID() == item_id)
-			{
-				rv = *it;
-				break;
-			}
-		}		
-	}
-	return rv;
-}
-
-void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects)
-{
-	if(mInventory)
-	{
-		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
-		LLInventoryObject::object_list_t::iterator end = mInventory->end();
-		for( ; it != end; ++it)
-		{
-			if ((*it)->getType() != LLAssetType::AT_CATEGORY)
-			{
-				objects.push_back(*it);
-			}
-		}
-	}
-}
-
-LLInventoryObject* LLViewerObject::getInventoryRoot()
-{
-	if (!mInventory || !mInventory->size())
-	{
-		return NULL;
-	}
-	return mInventory->back();
-}
-
-LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& asset_id)
-{
-	if (mInventoryDirty)
-		llwarns << "Peforming inventory lookup for object " << mID << " that has dirty inventory!" << llendl;
-
-	LLViewerInventoryItem* rv = NULL;
-	if(mInventory)
-	{
-		LLViewerInventoryItem* item = NULL;
-
-		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
-		LLInventoryObject::object_list_t::iterator end = mInventory->end();
-		for( ; it != end; ++it)
-		{
-			LLInventoryObject* obj = *it;
-			if(obj->getType() != LLAssetType::AT_CATEGORY)
-			{
-				// *FIX: gank-ass down cast!
-				item = (LLViewerInventoryItem*)obj;
-				if(item->getAssetUUID() == asset_id)
-				{
-					rv = item;
-					break;
-				}
-			}
-		}		
-	}
-	return rv;
-}
-
-void LLViewerObject::updateViewerInventoryAsset(
-					const LLViewerInventoryItem* item,
-					const LLUUID& new_asset)
-{
-	LLPointer<LLViewerInventoryItem> task_item =
-		new LLViewerInventoryItem(item);
-	task_item->setAssetUUID(new_asset);
-
-	// do the internal logic
-	doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, false);
-}
-
-void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
-{
-	if (getVolume())
-	{	//volumes calculate pixel area and angle per face
-		return;
-	}
-	
-	LLVector3 viewer_pos_agent = gAgentCamera.getCameraPositionAgent();
-	LLVector3 pos_agent = getRenderPosition();
-
-	F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX];
-	F32 dy = viewer_pos_agent.mV[VY] - pos_agent.mV[VY];
-	F32 dz = viewer_pos_agent.mV[VZ] - pos_agent.mV[VZ];
-
-	F32 max_scale = getMaxScale();
-	F32 mid_scale = getMidScale();
-	F32 min_scale = getMinScale();
-
-	// IW: estimate - when close to large objects, computing range based on distance from center is no good
-	// to try to get a min distance from face, subtract min_scale/2 from the range.
-	// This means we'll load too much detail sometimes, but that's better than not enough
-	// I don't think there's a better way to do this without calculating distance per-poly
-	F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2;
-
-	LLViewerCamera* camera = LLViewerCamera::getInstance();
-	if (range < 0.001f || isHUDAttachment())		// range == zero
-	{
-		mAppAngle = 180.f;
-		mPixelArea = (F32)camera->getScreenPixelArea();
-	}
-	else
-	{
-		mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG;
-
-		F32 pixels_per_meter = camera->getPixelMeterRatio() / range;
-
-		mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale);
-		if (mPixelArea > camera->getScreenPixelArea())
-		{
-			mAppAngle = 180.f;
-			mPixelArea = (F32)camera->getScreenPixelArea();
-		}
-	}
-}
-
-BOOL LLViewerObject::updateLOD()
-{
-	return FALSE;
-}
-
-BOOL LLViewerObject::updateGeometry(LLDrawable *drawable)
-{
-	return TRUE;
-}
-
-void LLViewerObject::updateGL()
-{
-
-}
-
-void LLViewerObject::updateFaceSize(S32 idx)
-{
-	
-}
-
-LLDrawable* LLViewerObject::createDrawable(LLPipeline *pipeline)
-{
-	return NULL;
-}
-
-void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
-{
-	LLPrimitive::setScale(scale);
-	if (mDrawable.notNull())
-	{
-		//encompass completely sheared objects by taking 
-		//the most extreme point possible (<1,1,0.5>)
-		mDrawable->setRadius(LLVector3(1,1,0.5f).scaleVec(scale).magVec());
-		updateDrawable(damped);
-	}
-
-	if( (LL_PCODE_VOLUME == getPCode()) && !isDead() )
-	{
-		if (permYouOwner() || (scale.magVecSquared() > (7.5f * 7.5f)) )
-		{
-			if (!mOnMap)
-			{
-				llassert_always(LLWorld::getInstance()->getRegionFromHandle(getRegion()->getHandle()));
-
-				gObjectList.addToMap(this);
-				mOnMap = TRUE;
-			}
-		}
-		else
-		{
-			if (mOnMap)
-			{
-				gObjectList.removeFromMap(this);
-				mOnMap = FALSE;
-			}
-		}
-	}
-}
-
-void LLViewerObject::setObjectCost(F32 cost)
-{
-	mObjectCost = cost;
-	mCostStale = false;
-
-	if (isSelected())
-	{
-		gFloaterTools->dirty();
-	}
-}
-
-void LLViewerObject::setLinksetCost(F32 cost)
-{
-	mLinksetCost = cost;
-	mCostStale = false;
-	
-	if (isSelected())
-	{
-		gFloaterTools->dirty();
-	}
-}
-
-void LLViewerObject::setPhysicsCost(F32 cost)
-{
-	mPhysicsCost = cost;
-	mCostStale = false;
-
-	if (isSelected())
-	{
-		gFloaterTools->dirty();
-	}
-}
-
-void LLViewerObject::setLinksetPhysicsCost(F32 cost)
-{
-	mLinksetPhysicsCost = cost;
-	mCostStale = false;
-	
-	if (isSelected())
-	{
-		gFloaterTools->dirty();
-	}
-}
-
-
-F32 LLViewerObject::getObjectCost()
-{
-	if (mCostStale)
-	{
-		gObjectList.updateObjectCost(this);
-	}
-	
-	return mObjectCost;
-}
-
-F32 LLViewerObject::getLinksetCost()
-{
-	if (mCostStale)
-	{
-		gObjectList.updateObjectCost(this);
-	}
-
-	return mLinksetCost;
-}
-
-F32 LLViewerObject::getPhysicsCost()
-{
-	if (mCostStale)
-	{
-		gObjectList.updateObjectCost(this);
-	}
-	
-	return mPhysicsCost;
-}
-
-F32 LLViewerObject::getLinksetPhysicsCost()
-{
-	if (mCostStale)
-	{
-		gObjectList.updateObjectCost(this);
-	}
-
-	return mLinksetPhysicsCost;
-}
-
-F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes)
-{
-	return 0.f;
-}
-
-U32 LLViewerObject::getTriangleCount()
-{
-	return 0;
-}
-
-U32 LLViewerObject::getHighLODTriangleCount()
-{
-	return 0;
-}
-
-void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
-{
-	LLVector4a center;
-	center.load3(getRenderPosition().mV);
-	LLVector4a size;
-	size.load3(getScale().mV);
-	newMin.setSub(center, size);
-	newMax.setAdd(center, size);
-	
-	mDrawable->setPositionGroup(center);
-}
-
-F32 LLViewerObject::getBinRadius()
-{
-	if (mDrawable.notNull())
-	{
-		const LLVector4a* ext = mDrawable->getSpatialExtents();
-		LLVector4a diff;
-		diff.setSub(ext[1], ext[0]);
-		return diff.getLength3().getF32();
-	}
-	
-	return getScale().magVec();
-}
-
-F32 LLViewerObject::getMaxScale() const
-{
-	return llmax(getScale().mV[VX],getScale().mV[VY], getScale().mV[VZ]);
-}
-
-F32 LLViewerObject::getMinScale() const
-{
-	return llmin(getScale().mV[0],getScale().mV[1],getScale().mV[2]);
-}
-
-F32 LLViewerObject::getMidScale() const
-{
-	if (getScale().mV[VX] < getScale().mV[VY])
-	{
-		if (getScale().mV[VY] < getScale().mV[VZ])
-		{
-			return getScale().mV[VY];
-		}
-		else if (getScale().mV[VX] < getScale().mV[VZ])
-		{
-			return getScale().mV[VZ];
-		}
-		else
-		{
-			return getScale().mV[VX];
-		}
-	}
-	else if (getScale().mV[VX] < getScale().mV[VZ])
-	{
-		return getScale().mV[VX];
-	}
-	else if (getScale().mV[VY] < getScale().mV[VZ])
-	{
-		return getScale().mV[VZ];
-	}
-	else
-	{
-		return getScale().mV[VY];
-	}
-}
-
-
-void LLViewerObject::updateTextures()
-{
-}
-
-void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
-{
-	if (isDead())
-	{
-		return;
-	}
-
-	S32 i;
-	S32 tex_count = getNumTEs();
-	for (i = 0; i < tex_count; i++)
-	{
- 		getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
-	}
-
-	if (isSculpted() && !isMesh())
-	{
-		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
-		LLUUID sculpt_id = sculpt_params->getSculptTexture();
-		LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
-	}
-	
-	if (boost_children)
-	{
-		for (child_list_t::iterator iter = mChildList.begin();
-			 iter != mChildList.end(); iter++)
-		{
-			LLViewerObject* child = *iter;
-			child->boostTexturePriority();
-		}
-	}
-}
-
-
-void LLViewerObject::setLineWidthForWindowSize(S32 window_width)
-{
-	if (window_width < 700)
-	{
-		LLUI::setLineWidth(2.0f);
-	}
-	else if (window_width < 1100)
-	{
-		LLUI::setLineWidth(3.0f);
-	}
-	else if (window_width < 2000)
-	{
-		LLUI::setLineWidth(4.0f);
-	}
-	else
-	{
-		// _damn_, what a nice monitor!
-		LLUI::setLineWidth(5.0f);
-	}
-}
-
-void LLViewerObject::increaseArrowLength()
-{
-/* ???
-	if (mAxisArrowLength == 50)
-	{
-		mAxisArrowLength = 100;
-	}
-	else
-	{
-		mAxisArrowLength = 150;
-	}
-*/
-}
-
-
-void LLViewerObject::decreaseArrowLength()
-{
-/* ???
-	if (mAxisArrowLength == 150)
-	{
-		mAxisArrowLength = 100;
-	}
-	else
-	{
-		mAxisArrowLength = 50;
-	}
-*/
-}
-
-// Culled from newsim LLTask::addNVPair
-void LLViewerObject::addNVPair(const std::string& data)
-{
-	// cout << "LLViewerObject::addNVPair() with ---" << data << "---" << endl;
-	LLNameValue *nv = new LLNameValue(data.c_str());
-
-//	char splat[MAX_STRING];
-//	temp->printNameValue(splat);
-//	llinfos << "addNVPair " << splat << llendl;
-
-	name_value_map_t::iterator iter = mNameValuePairs.find(nv->mName);
-	if (iter != mNameValuePairs.end())
-	{
-		LLNameValue* foundnv = iter->second;
-		if (foundnv->mClass != NVC_READ_ONLY)
-		{
-			delete foundnv;
-			mNameValuePairs.erase(iter);
-		}
-		else
-		{
-			delete nv;
-//			llinfos << "Trying to write to Read Only NVPair " << temp->mName << " in addNVPair()" << llendl;
-			return;
-		}
-	}
-	mNameValuePairs[nv->mName] = nv;
-}
-
-BOOL LLViewerObject::removeNVPair(const std::string& name)
-{
-	char* canonical_name = gNVNameTable.addString(name);
-
-	lldebugs << "LLViewerObject::removeNVPair(): " << name << llendl;
-
-	name_value_map_t::iterator iter = mNameValuePairs.find(canonical_name);
-	if (iter != mNameValuePairs.end())
-	{
-		if( mRegionp )
-		{
-			LLNameValue* nv = iter->second;
-/*
-			std::string buffer = nv->printNameValue();
-			gMessageSystem->newMessageFast(_PREHASH_RemoveNameValuePair);
-			gMessageSystem->nextBlockFast(_PREHASH_TaskData);
-			gMessageSystem->addUUIDFast(_PREHASH_ID, mID);
-			
-			gMessageSystem->nextBlockFast(_PREHASH_NameValueData);
-			gMessageSystem->addStringFast(_PREHASH_NVPair, buffer);
-
-			gMessageSystem->sendReliable( mRegionp->getHost() );
-*/
-			// Remove the NV pair from the local list.
-			delete nv;
-			mNameValuePairs.erase(iter);
-			return TRUE;
-		}
-		else
-		{
-			lldebugs << "removeNVPair - No region for object" << llendl;
-		}
-	}
-	return FALSE;
-}
-
-
-LLNameValue *LLViewerObject::getNVPair(const std::string& name) const
-{
-	char		*canonical_name;
-
-	canonical_name = gNVNameTable.addString(name);
-
-	// If you access a map with a name that isn't in it, it will add the name and a null pointer.
-	// So first check if the data is in the map.
-	name_value_map_t::const_iterator iter = mNameValuePairs.find(canonical_name);
-	if (iter != mNameValuePairs.end())
-	{
-		return iter->second;
-	}
-	else
-	{
-		return NULL;
-	}
-}
-
-void LLViewerObject::updatePositionCaches() const
-{
-	if(mRegionp)
-	{
-		if (!isRoot())
-		{
-			mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
-			mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
-		}
-		else
-		{
-			mPositionRegion = getPosition();
-			mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
-		}
-	}
-}
-
-const LLVector3d LLViewerObject::getPositionGlobal() const
-{	
-	if(mRegionp)
-	{
-		LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
-
-		if (isAttachment())
-		{
-			position_global = gAgent.getPosGlobalFromAgent(getRenderPosition());
-		}		
-		return position_global;
-	}
-	else
-	{
-		LLVector3d position_global(getPosition());
-		return position_global;
-	}	
-}
-
-const LLVector3 &LLViewerObject::getPositionAgent() const
-{
-	if (mRegionp)
-	{
-		if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent()))
-		{
-			// Don't return cached position if you have a parent, recalc (until all dirtying is done correctly.
-			LLVector3 position_region;
-			position_region = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
-			mPositionAgent = mRegionp->getPosAgentFromRegion(position_region);
-		}
-		else
-		{
-			mPositionAgent = mRegionp->getPosAgentFromRegion(getPosition());
-		}
-	}
-	return mPositionAgent;
-}
-
-const LLVector3 &LLViewerObject::getPositionRegion() const
-{
-	if (!isRoot())
-	{
-		LLViewerObject *parent = (LLViewerObject *)getParent();
-		mPositionRegion = parent->getPositionRegion() + (getPosition() * parent->getRotation());
-	}
-	else
-	{
-		mPositionRegion = getPosition();
-	}
-
-	return mPositionRegion;
-}
-
-const LLVector3 LLViewerObject::getPositionEdit() const
-{
-	if (isRootEdit())
-	{
-		return getPosition();
-	}
-	else
-	{
-		LLViewerObject *parent = (LLViewerObject *)getParent();
-		LLVector3 position_edit = parent->getPositionEdit() + getPosition() * parent->getRotationEdit();
-		return position_edit;
-	}
-}
-
-const LLVector3 LLViewerObject::getRenderPosition() const
-{
-	if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
-	{
-		LLVOAvatar* avatar = getAvatar();
-		if (avatar)
-		{
-			return avatar->getPositionAgent();
-		}
-	}
-
-	if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
-	{
-		return getPositionAgent();
-	}
-	else
-	{
-		return mDrawable->getPositionAgent();
-	}
-}
-
-const LLVector3 LLViewerObject::getPivotPositionAgent() const
-{
-	return getRenderPosition();
-}
-
-const LLQuaternion LLViewerObject::getRenderRotation() const
-{
-	LLQuaternion ret;
-	if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
-	{
-		return ret;
-	}
-	
-	if (mDrawable.isNull() || mDrawable->isStatic())
-	{
-		ret = getRotationEdit();
-	}
-	else
-	{
-		if (!mDrawable->isRoot())
-		{
-			ret = getRotation() * LLQuaternion(mDrawable->getParent()->getWorldMatrix());
-		}
-		else
-		{
-			ret = LLQuaternion(mDrawable->getWorldMatrix());
-		}
-	}
-	
-	return ret;
-}
-
-const LLMatrix4 LLViewerObject::getRenderMatrix() const
-{
-	return mDrawable->getWorldMatrix();
-}
-
-const LLQuaternion LLViewerObject::getRotationRegion() const
-{
-	LLQuaternion global_rotation = getRotation();
-	if (!((LLXform *)this)->isRoot())
-	{
-		global_rotation = global_rotation * getParent()->getRotation();
-	}
-	return global_rotation;
-}
-
-const LLQuaternion LLViewerObject::getRotationEdit() const
-{
-	LLQuaternion global_rotation = getRotation();
-	if (!((LLXform *)this)->isRootEdit())
-	{
-		global_rotation = global_rotation * getParent()->getRotation();
-	}
-	return global_rotation;
-}
-
-void LLViewerObject::setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped )
-{
-	if (isAttachment())
-	{
-		LLVector3 new_pos = mRegionp->getPosRegionFromGlobal(pos_global);
-		if (isRootEdit())
-		{
-			new_pos -= mDrawable->mXform.getParent()->getWorldPosition();
-			LLQuaternion world_rotation = mDrawable->mXform.getParent()->getWorldRotation();
-			new_pos = new_pos * ~world_rotation;
-		}
-		else
-		{
-			LLViewerObject* parentp = (LLViewerObject*)getParent();
-			new_pos -= parentp->getPositionAgent();
-			new_pos = new_pos * ~parentp->getRotationRegion();
-		}
-		LLViewerObject::setPosition(new_pos);
-		
-		if (mParent && ((LLViewerObject*)mParent)->isAvatar())
-		{
-			// we have changed the position of an attachment, so we need to clamp it
-			LLVOAvatar *avatar = (LLVOAvatar*)mParent;
-
-			avatar->clampAttachmentPositions();
-		}
-	}
-	else
-	{
-		if( isRoot() )
-		{
-			setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
-		}
-		else
-		{
-			// the relative position with the parent is not constant
-			LLViewerObject* parent = (LLViewerObject *)getParent();
-			//RN: this assumes we are only calling this function from the edit tools
-			gPipeline.updateMoveNormalAsync(parent->mDrawable);
-
-			LLVector3 pos_local = mRegionp->getPosRegionFromGlobal(pos_global) - parent->getPositionRegion();
-			pos_local = pos_local * ~parent->getRotationRegion();
-			LLViewerObject::setPosition( pos_local );
-		}
-	}
-	//RN: assumes we always want to snap the object when calling this function
-	gPipeline.updateMoveNormalAsync(mDrawable);
-}
-
-void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped)
-{
-	if (getPosition() != pos)
-	{
-		setChanged(TRANSLATED | SILHOUETTE);
-	}
-		
-	LLXform::setPosition(pos);
-	updateDrawable(damped);
-	if (isRoot())
-	{
-		// position caches need to be up to date on root objects
-		updatePositionCaches();
-	}
-}
-
-void LLViewerObject::setPositionGlobal(const LLVector3d &pos_global, BOOL damped)
-{
-	if (isAttachment())
-	{
-		if (isRootEdit())
-		{
-			LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
-			newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
-
-			LLQuaternion invWorldRotation = mDrawable->mXform.getParent()->getWorldRotation();
-			invWorldRotation.transQuat();
-
-			newPos = newPos * invWorldRotation;
-			LLViewerObject::setPosition(newPos);
-		}
-		else
-		{
-			// assumes parent is root editable (root of attachment)
-			LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
-			newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
-			LLVector3 delta_pos = newPos - getPosition();
-
-			LLQuaternion invRotation = mDrawable->getRotation();
-			invRotation.transQuat();
-			
-			delta_pos = delta_pos * invRotation;
-
-			// *FIX: is this right?  Shouldn't we be calling the
-			// LLViewerObject version of setPosition?
-			LLVector3 old_pos = mDrawable->mXform.getParent()->getPosition();
-			mDrawable->mXform.getParent()->setPosition(old_pos + delta_pos);
-			setChanged(TRANSLATED | SILHOUETTE);
-		}
-		if (mParent && ((LLViewerObject*)mParent)->isAvatar())
-		{
-			// we have changed the position of an attachment, so we need to clamp it
-			LLVOAvatar *avatar = (LLVOAvatar*)mParent;
-
-			avatar->clampAttachmentPositions();
-		}
-	}
-	else
-	{
-		if (isRoot())
-		{
-			setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
-		}
-		else
-		{
-			// the relative position with the parent is constant, but the parent's position needs to be changed
-			LLVector3d position_offset;
-			position_offset.setVec(getPosition()*getParent()->getRotation());
-			LLVector3d new_pos_global = pos_global - position_offset;
-			((LLViewerObject *)getParent())->setPositionGlobal(new_pos_global);
-		}
-	}
-	updateDrawable(damped);
-}
-
-
-void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, BOOL damped)
-{
-	// Set position relative to parent, if no parent, relative to region
-	if (!isRoot())
-	{
-		LLViewerObject::setPosition(pos_parent, damped);
-		//updateDrawable(damped);
-	}
-	else
-	{
-		setPositionRegion(pos_parent, damped);
-	}
-}
-
-void LLViewerObject::setPositionRegion(const LLVector3 &pos_region, BOOL damped)
-{
-	if (!isRootEdit())
-	{
-		LLViewerObject* parent = (LLViewerObject*) getParent();
-		LLViewerObject::setPosition((pos_region-parent->getPositionRegion())*~parent->getRotationRegion());
-	}
-	else
-	{
-		LLViewerObject::setPosition(pos_region);
-		mPositionRegion = pos_region;
-		mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
-	}
-}
-
-void LLViewerObject::setPositionAgent(const LLVector3 &pos_agent, BOOL damped)
-{
-	LLVector3 pos_region = getRegion()->getPosRegionFromAgent(pos_agent);
-	setPositionRegion(pos_region, damped);
-}
-
-// identical to setPositionRegion() except it checks for child-joints 
-// and doesn't also move the joint-parent
-// TODO -- implement similar intelligence for joint-parents toward
-// their joint-children
-void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)
-{
-	if (!isRootEdit())
-	{
-		// the relative position with the parent is constant, but the parent's position needs to be changed
-		LLVector3 position_offset = getPosition() * getParent()->getRotation();
-
-		((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset);
-		updateDrawable(damped);
-	}
-	else if (isJointChild())
-	{
-		// compute new parent-relative position
-		LLViewerObject *parent = (LLViewerObject *) getParent();
-		LLQuaternion inv_parent_rot = parent->getRotation();
-		inv_parent_rot.transQuat();
-		LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot;
-		LLViewerObject::setPosition(pos_parent, damped);
-	}
-	else
-	{
-		LLViewerObject::setPosition(pos_edit, damped);
-		mPositionRegion = pos_edit;
-		mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
-	}	
-}
-
-
-LLViewerObject* LLViewerObject::getRootEdit() const
-{
-	const LLViewerObject* root = this;
-	while (root->mParent 
-		   && !(root->mJointInfo
-			   || ((LLViewerObject*)root->mParent)->isAvatar()) )
-	{
-		root = (LLViewerObject*)root->mParent;
-	}
-	return (LLViewerObject*)root;
-}
-
-
-BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
-										  S32 face,
-										  BOOL pick_transparent,
-										  S32* face_hit,
-										  LLVector3* intersection,
-										  LLVector2* tex_coord,
-										  LLVector3* normal,
-										  LLVector3* bi_normal)
-{
-	return false;
-}
-
-BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end)
-{
-	if (mDrawable.isNull() || mDrawable->isDead())
-	{
-		return FALSE;
-	}
-
-	const LLVector4a* ext = mDrawable->getSpatialExtents();
-
-	//VECTORIZE THIS
-	LLVector4a center;
-	center.setAdd(ext[1], ext[0]);
-	center.mul(0.5f);
-	LLVector4a size;
-	size.setSub(ext[1], ext[0]);
-	size.mul(0.5f);
-
-	LLVector4a starta, enda;
-	starta.load3(start.mV);
-	enda.load3(end.mV);
-
-	return LLLineSegmentBoxIntersect(starta, enda, center, size);
-}
-
-U8 LLViewerObject::getMediaType() const
-{
-	if (mMedia)
-	{
-		return mMedia->mMediaType;
-	}
-	else
-	{
-		return LLViewerObject::MEDIA_NONE;
-	}
-}
-
-void LLViewerObject::setMediaType(U8 media_type)
-{
-	if (!mMedia)
-	{
-		// TODO what if we don't have a media pointer?
-	}
-	else if (mMedia->mMediaType != media_type)
-	{
-		mMedia->mMediaType = media_type;
-
-		// TODO: update materials with new image
-	}
-}
-
-std::string LLViewerObject::getMediaURL() const
-{
-	if (mMedia)
-	{
-		return mMedia->mMediaURL;
-	}
-	else
-	{
-		return std::string();
-	}
-}
-
-void LLViewerObject::setMediaURL(const std::string& media_url)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
-	if (!mMedia)
-	{
-		mMedia = new LLViewerObjectMedia;
-		mMedia->mMediaURL = media_url;
-		mMedia->mPassedWhitelist = FALSE;
-
-		// TODO: update materials with new image
-	}
-	else if (mMedia->mMediaURL != media_url)
-	{
-		mMedia->mMediaURL = media_url;
-		mMedia->mPassedWhitelist = FALSE;
-
-		// TODO: update materials with new image
-	}
-}
-
-BOOL LLViewerObject::getMediaPassedWhitelist() const
-{
-	if (mMedia)
-	{
-		return mMedia->mPassedWhitelist;
-	}
-	else
-	{
-		return FALSE;
-	}
-}
-
-void LLViewerObject::setMediaPassedWhitelist(BOOL passed)
-{
-	if (mMedia)
-	{
-		mMedia->mPassedWhitelist = passed;
-	}
-}
-
-BOOL LLViewerObject::setMaterial(const U8 material)
-{
-	BOOL res = LLPrimitive::setMaterial(material);
-	if (res)
-	{
-		setChanged(TEXTURE);
-	}
-	return res;
-}
-
-void LLViewerObject::setNumTEs(const U8 num_tes)
-{
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
-	U32 i;
-	if (num_tes != getNumTEs())
-	{
-		if (num_tes)
-		{
-			LLPointer<LLViewerTexture> *new_images;
-			new_images = new LLPointer<LLViewerTexture>[num_tes];
-			for (i = 0; i < num_tes; i++)
-			{
-				if (i < getNumTEs())
-				{
-					new_images[i] = mTEImages[i];
-				}
-				else if (getNumTEs())
-				{
-					new_images[i] = mTEImages[getNumTEs()-1];
-				}
-				else
-				{
-					new_images[i] = NULL;
-				}
-			}
-
-			deleteTEImages();
-			
-			mTEImages = new_images;
-		}
-		else
-		{
-			deleteTEImages();
-		}
-		LLPrimitive::setNumTEs(num_tes);
-		setChanged(TEXTURE);
-
-		if (mDrawable.notNull())
-		{
-			gPipeline.markTextured(mDrawable);
-		}
-	}
-}
-
-void LLViewerObject::sendMaterialUpdate() const
-{
-	LLViewerRegion* regionp = getRegion();
-	if(!regionp) return;
-	gMessageSystem->newMessageFast(_PREHASH_ObjectMaterial);
-	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
-	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID,	mLocalID );
-	gMessageSystem->addU8Fast(_PREHASH_Material, getMaterial() );
-	gMessageSystem->sendReliable( regionp->getHost() );
-
-}
-
-// formerly send_object_rotation
-void LLViewerObject::sendRotationUpdate() const
-{
-	LLViewerRegion* regionp = getRegion();
-	if(!regionp) return;
-	gMessageSystem->newMessageFast(_PREHASH_ObjectRotation);
-	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
-	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID);
-	gMessageSystem->addQuatFast(_PREHASH_Rotation, getRotationEdit());
-	//llinfos << "Sent rotation " << getRotationEdit() << llendl;
-	gMessageSystem->sendReliable( regionp->getHost() );
-}
-
-/* Obsolete, we use MultipleObjectUpdate instead
-//// formerly send_object_position_global
-//void LLViewerObject::sendPositionUpdate() const
-//{
-//	gMessageSystem->newMessageFast(_PREHASH_ObjectPosition);
-//	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-//	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-//	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-//	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
-//	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID,	mLocalID );
-//	gMessageSystem->addVector3Fast(_PREHASH_Position, getPositionRegion());
-//	LLViewerRegion* regionp = getRegion();
-//	gMessageSystem->sendReliable(regionp->getHost());
-//}
-*/
-
-//formerly send_object_shape(LLViewerObject *object)
-void LLViewerObject::sendShapeUpdate()
-{
-	gMessageSystem->newMessageFast(_PREHASH_ObjectShape);
-	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
-	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
-
-	LLVolumeMessage::packVolumeParams(&getVolume()->getParams(), gMessageSystem);
-
-	LLViewerRegion *regionp = getRegion();
-	gMessageSystem->sendReliable( regionp->getHost() );
-}
-
-
-void LLViewerObject::sendTEUpdate() const
-{
-	LLMessageSystem* msg = gMessageSystem;
-	msg->newMessageFast(_PREHASH_ObjectImage);
-
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-
-	msg->nextBlockFast(_PREHASH_ObjectData);
-	msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
-	if (mMedia)
-	{
-		msg->addString("MediaURL", mMedia->mMediaURL);
-	}
-	else
-	{
-		msg->addString("MediaURL", NULL);
-	}
-
-	// TODO send media type
-
-	packTEMessage(msg);
-
-	LLViewerRegion *regionp = getRegion();
-	msg->sendReliable( regionp->getHost() );
-}
-
-void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
-{
-	LLPrimitive::setTE(te, texture_entry);
-//  This doesn't work, don't get any textures.
-//	if (mDrawable.notNull() && mDrawable->isVisible())
-//	{
-		const LLUUID& image_id = getTE(te)->getID();
-		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
-//	}
-}
-
-void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
-{
-	if (mTEImages[te] != imagep)
-	{
-		mTEImages[te] = imagep;
-		LLPrimitive::setTETexture(te, imagep->getID());
-		setChanged(TEXTURE);
-		if (mDrawable.notNull())
-		{
-			gPipeline.markTextured(mDrawable);
-		}
-	}
-}
-
-
-S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host)
-{
-	S32 retval = 0;
-	if (uuid != getTE(te)->getID() ||
-		uuid == LLUUID::null)
-	{
-		retval = LLPrimitive::setTETexture(te, uuid);
-		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
-		setChanged(TEXTURE);
-		if (mDrawable.notNull())
-		{
-			gPipeline.markTextured(mDrawable);
-		}
-	}
-	return retval;
-}
-
-
-void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) 
-{
-	if(index < 0 || index >= getNumTEs())
-	{
-		return ;
-	}
-	mTEImages[index] = new_image ;
-}
-
-S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)
-{
-	// Invalid host == get from the agent's sim
-	return setTETextureCore(te, uuid, LLHost::invalid);
-}
-
-
-S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color)
-{
-	return setTEColor(te, LLColor4(color));
-}
-
-S32 LLViewerObject::setTEColor(const U8 te, const LLColor4& color)
-{
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (color != tep->getColor())
-	{
-		retval = LLPrimitive::setTEColor(te, color);
-		if (mDrawable.notNull() && retval)
-		{
-			// These should only happen on updates which are not the initial update.
-			dirtyMesh();
-		}
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTEBumpmap(const U8 te, const U8 bump)
-{
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (bump != tep->getBumpmap())
-	{
-		retval = LLPrimitive::setTEBumpmap(te, bump);
-		setChanged(TEXTURE);
-		if (mDrawable.notNull() && retval)
-		{
-			gPipeline.markTextured(mDrawable);
-			gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
-		}
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTETexGen(const U8 te, const U8 texgen)
-{
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (texgen != tep->getTexGen())
-	{
-		retval = LLPrimitive::setTETexGen(te, texgen);
-		setChanged(TEXTURE);
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTEMediaTexGen(const U8 te, const U8 media)
-{
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (media != tep->getMediaTexGen())
-	{
-		retval = LLPrimitive::setTEMediaTexGen(te, media);
-		setChanged(TEXTURE);
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTEShiny(const U8 te, const U8 shiny)
-{
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (shiny != tep->getShiny())
-	{
-		retval = LLPrimitive::setTEShiny(te, shiny);
-		setChanged(TEXTURE);
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTEFullbright(const U8 te, const U8 fullbright)
-{
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (fullbright != tep->getFullbright())
-	{
-		retval = LLPrimitive::setTEFullbright(te, fullbright);
-		setChanged(TEXTURE);
-		if (mDrawable.notNull() && retval)
-		{
-			gPipeline.markTextured(mDrawable);
-		}
-	}
-	return retval;
-}
-
-
-S32 LLViewerObject::setTEMediaFlags(const U8 te, const U8 media_flags)
-{
-	// this might need work for media type
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (media_flags != tep->getMediaFlags())
-	{
-		retval = LLPrimitive::setTEMediaFlags(te, media_flags);
-		setChanged(TEXTURE);
-		if (mDrawable.notNull() && retval)
-		{
-			gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, TRUE);
-			gPipeline.markTextured(mDrawable);
-			// JC - probably only need this if changes texture coords
-			//gPipeline.markRebuild(mDrawable);
-		}
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTEGlow(const U8 te, const F32 glow)
-{
-	S32 retval = 0;
-	const LLTextureEntry *tep = getTE(te);
-	if (!tep)
-	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
-	}
-	else if (glow != tep->getGlow())
-	{
-		retval = LLPrimitive::setTEGlow(te, glow);
-		setChanged(TEXTURE);
-		if (mDrawable.notNull() && retval)
-		{
-			gPipeline.markTextured(mDrawable);
-		}
-	}
-	return retval;
-}
-
-
-S32 LLViewerObject::setTEScale(const U8 te, const F32 s, const F32 t)
-{
-	S32 retval = 0;
-	retval = LLPrimitive::setTEScale(te, s, t);
-	setChanged(TEXTURE);
-	if (mDrawable.notNull() && retval)
-	{
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTEScaleS(const U8 te, const F32 s)
-{
-	S32 retval = LLPrimitive::setTEScaleS(te, s);
-	if (mDrawable.notNull() && retval)
-	{
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
-	}
-
-	return retval;
-}
-
-S32 LLViewerObject::setTEScaleT(const U8 te, const F32 t)
-{
-	S32 retval = LLPrimitive::setTEScaleT(te, t);
-	if (mDrawable.notNull() && retval)
-	{
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
-	}
-
-	return retval;
-}
-
-S32 LLViewerObject::setTEOffset(const U8 te, const F32 s, const F32 t)
-{
-	S32 retval = LLPrimitive::setTEOffset(te, s, t);
-	if (mDrawable.notNull() && retval)
-	{
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
-	}
-	return retval;
-}
-
-S32 LLViewerObject::setTEOffsetS(const U8 te, const F32 s)
-{
-	S32 retval = LLPrimitive::setTEOffsetS(te, s);
-	if (mDrawable.notNull() && retval)
-	{
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
-	}
-
-	return retval;
-}
-
-S32 LLViewerObject::setTEOffsetT(const U8 te, const F32 t)
-{
-	S32 retval = LLPrimitive::setTEOffsetT(te, t);
-	if (mDrawable.notNull() && retval)
-	{
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
-	}
-
-	return retval;
-}
-
-S32 LLViewerObject::setTERotation(const U8 te, const F32 r)
-{
-	S32 retval = LLPrimitive::setTERotation(te, r);
-	if (mDrawable.notNull() && retval)
-	{
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
-	}
-	return retval;
-}
-
-
-LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const
-{
-//	llassert(mTEImages);
-
-	if (face < getNumTEs())
-	{
-		LLViewerTexture* image = mTEImages[face];
-		if (image)
-		{
-			return image;
-		}
-		else
-		{
-			return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep);
-		}
-	}
-
-	llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl;
-
-	return NULL;
-}
-
-
-void LLViewerObject::fitFaceTexture(const U8 face)
-{
-	llinfos << "fitFaceTexture not implemented" << llendl;
-}
-
-
-LLBBox LLViewerObject::getBoundingBoxAgent() const
-{
-	LLVector3 position_agent;
-	LLQuaternion rot;
-	LLViewerObject* avatar_parent = NULL;
-	LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
-	if (root_edit)
-	{
-		avatar_parent = (LLViewerObject*)root_edit->getParent();
-	}
-	
-	if (avatar_parent && avatar_parent->isAvatar() &&
-		root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent())
-	{
-		LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
-		position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
-		rot = getRotationEdit() * parent_xform->getWorldRotation();
-	}
-	else
-	{
-		position_agent = getPositionAgent();
-		rot = getRotationRegion();
-	}
-	
-	return LLBBox( position_agent, rot, getScale() * -0.5f, getScale() * 0.5f );
-}
-
-U32 LLViewerObject::getNumVertices() const
-{
-	U32 num_vertices = 0;
-	if (mDrawable.notNull())
-	{
-		S32 i, num_faces;
-		num_faces = mDrawable->getNumFaces();
-		for (i = 0; i < num_faces; i++)
-		{
-			num_vertices += mDrawable->getFace(i)->getGeomCount();
-		}
-	}
-	return num_vertices;
-}
-
-U32 LLViewerObject::getNumIndices() const
-{
-	U32 num_indices = 0;
-	if (mDrawable.notNull())
-	{
-		S32 i, num_faces;
-		num_faces = mDrawable->getNumFaces();
-		for (i = 0; i < num_faces; i++)
-		{
-			num_indices += mDrawable->getFace(i)->getIndicesCount();
-		}
-	}
-	return num_indices;
-}
-
-// Find the number of instances of this object's inventory that are of the given type
-S32 LLViewerObject::countInventoryContents(LLAssetType::EType type)
-{
-	S32 count = 0;
-	if( mInventory )
-	{
-		LLInventoryObject::object_list_t::const_iterator it = mInventory->begin();
-		LLInventoryObject::object_list_t::const_iterator end = mInventory->end();
-		for(  ; it != end ; ++it )
-		{
-			if( (*it)->getType() == type )
-			{
-				++count;
-			}
-		}
-	}
-	return count;
-}
-
-
-void LLViewerObject::setCanSelect(BOOL canSelect)
-{
-	mbCanSelect = canSelect;
-	for (child_list_t::iterator iter = mChildList.begin();
-		 iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* child = *iter;
-		child->mbCanSelect = canSelect;
-	}
-}
-
-void LLViewerObject::setDebugText(const std::string &utf8text)
-{
-	if (utf8text.empty() && !mText)
-	{
-		return;
-	}
-
-	if (!mText)
-	{
-		mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
-		mText->setFont(LLFontGL::getFontSansSerif());
-		mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
-		mText->setMaxLines(-1);
-		mText->setSourceObject(this);
-		mText->setOnHUDAttachment(isHUDAttachment());
-	}
-	mText->setColor(LLColor4::white);
-	mText->setString(utf8text);
-	mText->setZCompare(FALSE);
-	mText->setDoFade(FALSE);
-	updateText();
-}
-
-void LLViewerObject::setIcon(LLViewerTexture* icon_image)
-{
-	if (!mIcon)
-	{
-		mIcon = (LLHUDIcon *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_ICON);
-		mIcon->setSourceObject(this);
-		mIcon->setImage(icon_image);
-		// *TODO: make this user configurable
-		mIcon->setScale(0.03f);
-	}
-	else
-	{
-		mIcon->restartLifeTimer();
-	}
-}
-
-void LLViewerObject::clearIcon()
-{
-	if (mIcon)
-	{
-		mIcon = NULL;
-	}
-}
-
-LLViewerObject* LLViewerObject::getSubParent() 
-{ 
-	if (isJointChild())
-	{
-		return this;
-	}
-	return (LLViewerObject*) getParent();
-}
-
-const LLViewerObject* LLViewerObject::getSubParent() const
-{
-	if (isJointChild())
-	{
-		return this;
-	}
-	return (const LLViewerObject*) getParent();
-}
-
-BOOL LLViewerObject::isOnMap()
-{
-	return mOnMap;
-}
-
-
-void LLViewerObject::updateText()
-{
-	if (!isDead())
-	{
-		if (mText.notNull())
-		{		
-			LLVector3 up_offset(0,0,0);
-			up_offset.mV[2] = getScale().mV[VZ]*0.6f;
-			
-			if (mDrawable.notNull())
-			{
-				mText->setPositionAgent(getRenderPosition() + up_offset);
-			}
-			else
-			{
-				mText->setPositionAgent(getPositionAgent() + up_offset);
-			}
-		}
-	}
-}
-
-LLVOAvatar* LLViewerObject::asAvatar()
-{
-	return NULL;
-}
-
-BOOL LLViewerObject::isParticleSource() const
-{
-	return !mPartSourcep.isNull() && !mPartSourcep->isDead();
-}
-
-void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id)
-{
-	if (mPartSourcep)
-	{
-		deleteParticleSource();
-	}
-
-	LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::createPSS(this, particle_parameters);
-	mPartSourcep = pss;
-	
-	if (mPartSourcep)
-	{
-		mPartSourcep->setOwnerUUID(owner_id);
-
-		if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
-		{
-			LLViewerTexture* image;
-			if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
-			{
-				image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.tga");
-			}
-			else
-			{
-				image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
-			}
-			mPartSourcep->setImage(image);
-		}
-	}
-	LLViewerPartSim::getInstance()->addPartSource(pss);
-}
-
-void LLViewerObject::unpackParticleSource(const S32 block_num, const LLUUID& owner_id)
-{
-	if (!mPartSourcep.isNull() && mPartSourcep->isDead())
-	{
-		mPartSourcep = NULL;
-	}
-	if (mPartSourcep)
-	{
-		// If we've got one already, just update the existing source (or remove it)
-		if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, block_num))
-		{
-			mPartSourcep->setDead();
-			mPartSourcep = NULL;
-		}
-	}
-	else
-	{
-		LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, block_num);
-		//If the owner is muted, don't create the system
-		if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
-
-		// We need to be able to deal with a particle source that hasn't changed, but still got an update!
-		if (pss)
-		{
-// 			llinfos << "Making particle system with owner " << owner_id << llendl;
-			pss->setOwnerUUID(owner_id);
-			mPartSourcep = pss;
-			LLViewerPartSim::getInstance()->addPartSource(pss);
-		}
-	}
-	if (mPartSourcep)
-	{
-		if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
-		{
-			LLViewerTexture* image;
-			if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
-			{
-				image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
-			}
-			else
-			{
-				image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
-			}
-			mPartSourcep->setImage(image);
-		}
-	}
-}
-
-void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id)
-{
-	if (!mPartSourcep.isNull() && mPartSourcep->isDead())
-	{
-		mPartSourcep = NULL;
-	}
-	if (mPartSourcep)
-	{
-		// If we've got one already, just update the existing source (or remove it)
-		if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, dp))
-		{
-			mPartSourcep->setDead();
-			mPartSourcep = NULL;
-		}
-	}
-	else
-	{
-		LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, dp);
-		//If the owner is muted, don't create the system
-		if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
-		// We need to be able to deal with a particle source that hasn't changed, but still got an update!
-		if (pss)
-		{
-// 			llinfos << "Making particle system with owner " << owner_id << llendl;
-			pss->setOwnerUUID(owner_id);
-			mPartSourcep = pss;
-			LLViewerPartSim::getInstance()->addPartSource(pss);
-		}
-	}
-	if (mPartSourcep)
-	{
-		if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
-		{
-			LLViewerTexture* image;
-			if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
-			{
-				image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
-			}
-			else
-			{
-				image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
-			}
-			mPartSourcep->setImage(image);
-		}
-	}
-}
-
-void LLViewerObject::deleteParticleSource()
-{
-	if (mPartSourcep.notNull())
-	{
-		mPartSourcep->setDead();
-		mPartSourcep = NULL;
-	}
-}
-
-// virtual
-void LLViewerObject::updateDrawable(BOOL force_damped)
-{
-	if (mDrawable.notNull() && 
-		!mDrawable->isState(LLDrawable::ON_MOVE_LIST) &&
-		isChanged(MOVED))
-	{
-		BOOL damped_motion = 
-			!isChanged(SHIFTED) &&										// not shifted between regions this frame and...
-			(	force_damped ||										// ...forced into damped motion by application logic or...
-				(	!isSelected() &&									// ...not selected and...
-					(	mDrawable->isRoot() ||								// ... is root or ...
-						(getParent() && !((LLViewerObject*)getParent())->isSelected())// ... parent is not selected and ...
-					) &&	
-					getPCode() == LL_PCODE_VOLUME &&					// ...is a volume object and...
-					getVelocity().isExactlyZero() &&					// ...is not moving physically and...
-					mDrawable->getGeneration() != -1                    // ...was not created this frame.
-				)					
-			);
-		gPipeline.markMoved(mDrawable, damped_motion);
-	}
-	clearChanged(SHIFTED);
-}
-
-// virtual, overridden by LLVOVolume
-F32 LLViewerObject::getVObjRadius() const
-{
-	return mDrawable.notNull() ? mDrawable->getRadius() : 0.f;
-}
-
-void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags)
-{
-	if (!gAudiop)
-	{
-		return;
-	}
-	
-	if (audio_uuid.isNull())
-	{
-		if (!mAudioSourcep)
-		{
-			return;
-		}
-		if (mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads())
-		{
-			// We don't clear the sound if it's a loop, it'll go away on its own.
-			// At least, this appears to be how the scripts work.
-			// The attached sound ID is set to NULL to avoid it playing back when the
-			// object rezzes in on non-looping sounds.
-			//llinfos << "Clearing attached sound " << mAudioSourcep->getCurrentData()->getID() << llendl;
-			gAudiop->cleanupAudioSource(mAudioSourcep);
-			mAudioSourcep = NULL;
-		}
-		else if (flags & LL_SOUND_FLAG_STOP)
-        {
-			// Just shut off the sound
-			mAudioSourcep->play(LLUUID::null);
-		}
-		return;
-	}
-	if (flags & LL_SOUND_FLAG_LOOP
-		&& mAudioSourcep && mAudioSourcep->isLoop() && mAudioSourcep->getCurrentData()
-		&& mAudioSourcep->getCurrentData()->getID() == audio_uuid)
-	{
-		//llinfos << "Already playing this sound on a loop, ignoring" << llendl;
-		return;
-	}
-
-	// don't clean up before previous sound is done. Solves: SL-33486
-	if ( mAudioSourcep && mAudioSourcep->isDone() ) 
-	{
-		gAudiop->cleanupAudioSource(mAudioSourcep);
-		mAudioSourcep = NULL;
-	}
-
-	if (mAudioSourcep && mAudioSourcep->isMuted() &&
-	    mAudioSourcep->getCurrentData() && mAudioSourcep->getCurrentData()->getID() == audio_uuid)
-	{
-		//llinfos << "Already having this sound as muted sound, ignoring" << llendl;
-		return;
-	}
-
-	getAudioSource(owner_id);
-
-	if (mAudioSourcep)
-	{
-		BOOL queue = flags & LL_SOUND_FLAG_QUEUE;
-		mAudioGain = gain;
-		mAudioSourcep->setGain(gain);
-		mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP);
-		mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER);
-		mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE);
-		mAudioSourcep->setQueueSounds(queue);
-		if(!queue) // stop any current sound first to avoid "farts of doom" (SL-1541) -MG
-		{
-			mAudioSourcep->play(LLUUID::null);
-		}
-		
-		// Play this sound if region maturity permits
-		if( gAgent.canAccessMaturityAtGlobal(this->getPositionGlobal()) )
-		{
-			//llinfos << "Playing attached sound " << audio_uuid << llendl;
-			mAudioSourcep->play(audio_uuid);
-		}
-	}
-}
-
-LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
-{
-	if (!mAudioSourcep)
-	{
-		// Arbitrary low gain for a sound that's not playing.
-		// This is used for sound preloads, for example.
-		LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this);
-
-		mAudioSourcep = asvop;
-		if(gAudiop) gAudiop->addAudioSource(asvop);
-	}
-
-	return mAudioSourcep;
-}
-
-void LLViewerObject::adjustAudioGain(const F32 gain)
-{
-	if (!gAudiop)
-	{
-		return;
-	}
-	if (mAudioSourcep)
-	{
-		mAudioGain = gain;
-		mAudioSourcep->setGain(mAudioGain);
-	}
-}
-
-//----------------------------------------------------------------------------
-
-bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp)
-{
-	ExtraParameter* param = getExtraParameterEntryCreate(param_type);
-	if (param)
-	{
-		param->data->unpack(*dp);
-		param->in_use = TRUE;
-		parameterChanged(param_type, param->data, TRUE, false);
-		return true;
-	}
-	else
-	{
-		return false;
-	}
-}
-
-LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 param_type)
-{
-	LLNetworkData* new_block = NULL;
-	switch (param_type)
-	{
-	  case LLNetworkData::PARAMS_FLEXIBLE:
-	  {
-		  new_block = new LLFlexibleObjectData();
-		  break;
-	  }
-	  case LLNetworkData::PARAMS_LIGHT:
-	  {
-		  new_block = new LLLightParams();
-		  break;
-	  }
-	  case LLNetworkData::PARAMS_SCULPT:
-	  {
-		  new_block = new LLSculptParams();
-		  break;
-	  }
-	  case LLNetworkData::PARAMS_LIGHT_IMAGE:
-	  {
-		  new_block = new LLLightImageParams();
-		  break;
-	  }
-	  default:
-	  {
-		  llinfos << "Unknown param type." << llendl;
-		  break;
-	  }
-	};
-
-	if (new_block)
-	{
-		ExtraParameter* new_entry = new ExtraParameter;
-		new_entry->data = new_block;
-		new_entry->in_use = false; // not in use yet
-		mExtraParameterList[param_type] = new_entry;
-		return new_entry;
-	}
-	return NULL;
-}
-
-LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntry(U16 param_type) const
-{
-	std::map<U16, ExtraParameter*>::const_iterator itor = mExtraParameterList.find(param_type);
-	if (itor != mExtraParameterList.end())
-	{
-		return itor->second;
-	}
-	return NULL;
-}
-
-LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntryCreate(U16 param_type)
-{
-	ExtraParameter* param = getExtraParameterEntry(param_type);
-	if (!param)
-	{
-		param = createNewParameterEntry(param_type);
-	}
-	return param;
-}
-
-LLNetworkData* LLViewerObject::getParameterEntry(U16 param_type) const
-{
-	ExtraParameter* param = getExtraParameterEntry(param_type);
-	if (param)
-	{
-		return param->data;
-	}
-	else
-	{
-		return NULL;
-	}
-}
-
-BOOL LLViewerObject::getParameterEntryInUse(U16 param_type) const
-{
-	ExtraParameter* param = getExtraParameterEntry(param_type);
-	if (param)
-	{
-		return param->in_use;
-	}
-	else
-	{
-		return FALSE;
-	}
-}
-
-bool LLViewerObject::setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin)
-{
-	ExtraParameter* param = getExtraParameterEntryCreate(param_type);
-	if (param)
-	{
-		if (param->in_use && new_value == *(param->data))
-		{
-			return false;
-		}
-		param->in_use = true;
-		param->data->copy(new_value);
-		parameterChanged(param_type, param->data, TRUE, local_origin);
-		return true;
-	}
-	else
-	{
-		return false;
-	}
-}
-
-// Assumed to be called locally
-// If in_use is TRUE, will crate a new extra parameter if none exists.
-// Should always return true.
-bool LLViewerObject::setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin)
-{
-	ExtraParameter* param = getExtraParameterEntryCreate(param_type);
-	if (param && param->in_use != in_use)
-	{
-		param->in_use = in_use;
-		parameterChanged(param_type, param->data, in_use, local_origin);
-		return true;
-	}
-	return false;
-}
-
-void LLViewerObject::parameterChanged(U16 param_type, bool local_origin)
-{
-	ExtraParameter* param = getExtraParameterEntry(param_type);
-	if (param)
-	{
-		parameterChanged(param_type, param->data, param->in_use, local_origin);
-	}
-}
-
-void LLViewerObject::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin)
-{
-	if (local_origin)
-	{
-		LLViewerRegion* regionp = getRegion();
-		if(!regionp) return;
-
-		// Change happened on the viewer. Send the change up
-		U8 tmp[MAX_OBJECT_PARAMS_SIZE];
-		LLDataPackerBinaryBuffer dpb(tmp, MAX_OBJECT_PARAMS_SIZE);
-		if (data->pack(dpb))
-		{
-			U32 datasize = (U32)dpb.getCurrentSize();
-
-			LLMessageSystem* msg = gMessageSystem;
-			msg->newMessageFast(_PREHASH_ObjectExtraParams);
-			msg->nextBlockFast(_PREHASH_AgentData);
-			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-			msg->nextBlockFast(_PREHASH_ObjectData);
-			msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
-
-			msg->addU16Fast(_PREHASH_ParamType, param_type);
-			msg->addBOOLFast(_PREHASH_ParamInUse, in_use);
-
-			msg->addU32Fast(_PREHASH_ParamSize, datasize);
-			msg->addBinaryDataFast(_PREHASH_ParamData, tmp, datasize);
-
-			msg->sendReliable( regionp->getHost() );
-		}
-		else
-		{
-			llwarns << "Failed to send object extra parameters: " << param_type << llendl;
-		}
-	}
-}
-
-void LLViewerObject::setDrawableState(U32 state, BOOL recursive)
-{
-	if (mDrawable)
-	{
-		mDrawable->setState(state);
-	}
-	if (recursive)
-	{
-		for (child_list_t::iterator iter = mChildList.begin();
-			 iter != mChildList.end(); iter++)
-		{
-			LLViewerObject* child = *iter;
-			child->setDrawableState(state, recursive);
-		}
-	}
-}
-
-void LLViewerObject::clearDrawableState(U32 state, BOOL recursive)
-{
-	if (mDrawable)
-	{
-		mDrawable->clearState(state);
-	}
-	if (recursive)
-	{
-		for (child_list_t::iterator iter = mChildList.begin();
-			 iter != mChildList.end(); iter++)
-		{
-			LLViewerObject* child = *iter;
-			child->clearDrawableState(state, recursive);
-		}
-	}
-}
-
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-// RN: these functions assume a 2-level hierarchy 
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-// Owned by anyone?
-BOOL LLViewerObject::permAnyOwner() const
-{ 
-	if (isRootEdit())
-	{
-		return ((mFlags & FLAGS_OBJECT_ANY_OWNER) != 0); 
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permAnyOwner();
-	}
-}	
-// Owned by this viewer?
-BOOL LLViewerObject::permYouOwner() const
-{ 
-	if (isRootEdit())
-	{
-#ifdef HACKED_GODLIKE_VIEWER
-		return TRUE;
-#else
-# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLGridManager::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
-		{
-			return TRUE;
-		}
-# endif
-		return ((mFlags & FLAGS_OBJECT_YOU_OWNER) != 0); 
-#endif
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permYouOwner();
-	}
-}
-
-// Owned by a group?
-BOOL LLViewerObject::permGroupOwner() const		
-{ 
-	if (isRootEdit())
-	{
-		return ((mFlags & FLAGS_OBJECT_GROUP_OWNED) != 0); 
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permGroupOwner();
-	}
-}
-
-// Can the owner edit
-BOOL LLViewerObject::permOwnerModify() const
-{ 
-	if (isRootEdit())
-	{
-#ifdef HACKED_GODLIKE_VIEWER
-		return TRUE;
-#else
-# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLGridManager::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
-	{
-			return TRUE;
-	}
-# endif
-		return ((mFlags & FLAGS_OBJECT_OWNER_MODIFY) != 0); 
-#endif
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permOwnerModify();
-	}
-}
-
-// Can edit
-BOOL LLViewerObject::permModify() const
-{ 
-	if (isRootEdit())
-	{
-#ifdef HACKED_GODLIKE_VIEWER
-		return TRUE;
-#else
-# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLGridManager::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
-	{
-			return TRUE;
-	}
-# endif
-		return ((mFlags & FLAGS_OBJECT_MODIFY) != 0); 
-#endif
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permModify();
-	}
-}
-
-// Can copy
-BOOL LLViewerObject::permCopy() const
-{ 
-	if (isRootEdit())
-	{
-#ifdef HACKED_GODLIKE_VIEWER
-		return TRUE;
-#else
-# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLGridManager::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
-		{
-			return TRUE;
-		}
-# endif
-		return ((mFlags & FLAGS_OBJECT_COPY) != 0); 
-#endif
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permCopy();
-	}
-}
-
-// Can move
-BOOL LLViewerObject::permMove() const
-{
-	if (isRootEdit())
-	{
-#ifdef HACKED_GODLIKE_VIEWER
-		return TRUE;
-#else
-# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLGridManager::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
-		{
-			return TRUE;
-		}
-# endif
-		return ((mFlags & FLAGS_OBJECT_MOVE) != 0); 
-#endif
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permMove();
-	}
-}
-
-// Can be transferred
-BOOL LLViewerObject::permTransfer() const
-{ 
-	if (isRootEdit())
-	{
-#ifdef HACKED_GODLIKE_VIEWER
-		return TRUE;
-#else
-# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLGridManager::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
-		{
-			return TRUE;
-		}
-# endif
-		return ((mFlags & FLAGS_OBJECT_TRANSFER) != 0); 
-#endif
-	}
-	else
-	{
-		return ((LLViewerObject*)getParent())->permTransfer();
-	}
-}
-
-// Can only open objects that you own, or that someone has
-// given you modify rights to.  JC
-BOOL LLViewerObject::allowOpen() const
-{
-	return !flagInventoryEmpty() && (permYouOwner() || permModify());
-}
-
-LLViewerObject::LLInventoryCallbackInfo::~LLInventoryCallbackInfo()
-{
-	if (mListener)
-	{
-		mListener->clearVOInventoryListener();
-	}
-}
-
-void LLViewerObject::updateVolume(const LLVolumeParams& volume_params)
-{
-	if (setVolume(volume_params, 1)) // *FIX: magic number, ack!
-	{
-		// Transmit the update to the simulator
-		sendShapeUpdate();
-		markForUpdate(TRUE);
-	}
-}
-
-void LLViewerObject::markForUpdate(BOOL priority)
-{
-	if (mDrawable.notNull())
-	{
-		gPipeline.markTextured(mDrawable);
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, priority);
-	}
-}
-
-bool LLViewerObject::getIncludeInSearch() const
-{
-	return ((mFlags & FLAGS_INCLUDE_IN_SEARCH) != 0);
-}
-
-void LLViewerObject::setIncludeInSearch(bool include_in_search)
-{
-	if (include_in_search)
-	{
-		mFlags |= FLAGS_INCLUDE_IN_SEARCH;
-	}
-	else
-	{
-		mFlags &= ~FLAGS_INCLUDE_IN_SEARCH;
-	}
-}
-
-void LLViewerObject::setRegion(LLViewerRegion *regionp)
-{
-	if (!regionp)
-	{
-		llwarns << "viewer object set region to NULL" << llendl;
-	}
-	
-	mLatestRecvPacketID = 0;
-	mRegionp = regionp;
-
-	for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
-	{
-		LLViewerObject* child = *i;
-		child->setRegion(regionp);
-	}
-
-	setChanged(MOVED | SILHOUETTE);
-	updateDrawable(FALSE);
-}
-
-// virtual
-void	LLViewerObject::updateRegion(LLViewerRegion *regionp)
-{
-//	if (regionp)
-//	{
-//		F64 now = LLFrameTimer::getElapsedSeconds();
-//		llinfos << "Updating to region " << regionp->getName()
-//			<< ", ms since last update message: " << (F32)((now - mLastMessageUpdateSecs) * 1000.0)
-//			<< ", ms since last interpolation: " << (F32)((now - mLastInterpUpdateSecs) * 1000.0) 
-//			<< llendl;
-//	}
-}
-
-
-bool LLViewerObject::specialHoverCursor() const
-{
-	return (mFlags & FLAGS_USE_PHYSICS)
-			|| (mFlags & FLAGS_HANDLE_TOUCH)
-			|| (mClickAction != 0);
-}
-
-void LLViewerObject::updateFlags(BOOL physics_changed)
-{
-	LLViewerRegion* regionp = getRegion();
-	if(!regionp) return;
-	gMessageSystem->newMessage("ObjectFlagUpdate");
-	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
-	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, getLocalID() );
-	gMessageSystem->addBOOLFast(_PREHASH_UsePhysics, usePhysics() );
-	gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
-	gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
-	gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
-	if (physics_changed)
-	{
-		gMessageSystem->nextBlock("ExtraPhysics");
-		gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
-		gMessageSystem->addF32("Density", getPhysicsDensity() );
-		gMessageSystem->addF32("Friction", getPhysicsFriction() );
-		gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
-		gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
-	}
-	gMessageSystem->sendReliable( regionp->getHost() );
-}
-
-BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
-{
-	BOOL setit = FALSE;
-	if (state)
-	{
-		if ((mFlags & flags) != flags)
-		{
-			mFlags |= flags;
-			setit = TRUE;
-		}
-	}
-	else
-	{
-		if ((mFlags & flags) != 0)
-		{
-			mFlags &= ~flags;
-			setit = TRUE;
-		}
-	}
-
-	// BUG: Sometimes viewer physics and simulator physics get
-	// out of sync.  To fix this, always send update to simulator.
-// 	if (setit)
-	{
-		updateFlags();
-	}
-	return setit;
-}
-
-void LLViewerObject::setPhysicsShapeType(U8 type)
-{
-	mPhysicsShapeUnknown = false;
-	mPhysicsShapeType = type;
-	mCostStale = true;
-}
-
-void LLViewerObject::setPhysicsGravity(F32 gravity)
-{
-	mPhysicsGravity = gravity;
-}
-
-void LLViewerObject::setPhysicsFriction(F32 friction)
-{
-	mPhysicsFriction = friction;
-}
-
-void LLViewerObject::setPhysicsDensity(F32 density)
-{
-	mPhysicsDensity = density;
-}
-
-void LLViewerObject::setPhysicsRestitution(F32 restitution)
-{
-	mPhysicsRestitution = restitution;
-}
-
-U8 LLViewerObject::getPhysicsShapeType() const
-{ 
-	if (mPhysicsShapeUnknown)
-	{
-		mPhysicsShapeUnknown = false;
-		gObjectList.updatePhysicsFlags(this);
-	}
-
-	return mPhysicsShapeType; 
-}
-
-void LLViewerObject::applyAngularVelocity(F32 dt)
-{
-	//do target omega here
-	mRotTime += dt;
-	LLVector3 ang_vel = getAngularVelocity();
-	F32 omega = ang_vel.magVecSquared();
-	F32 angle = 0.0f;
-	LLQuaternion dQ;
-	if (omega > 0.00001f)
-	{
-		omega = sqrt(omega);
-		angle = omega * dt;
-
-		ang_vel *= 1.f/omega;
-		
-		dQ.setQuat(angle, ang_vel);
-		
-		setRotation(getRotation()*dQ);
-		setChanged(MOVED | SILHOUETTE);
-	}
-}
-
-void LLViewerObject::resetRot()
-{
-	mRotTime = 0.0f;
-}
-
-U32 LLViewerObject::getPartitionType() const
-{ 
-	return LLViewerRegion::PARTITION_NONE; 
-}
-
-void LLViewerObject::dirtySpatialGroup(BOOL priority) const
-{
-	if (mDrawable)
-	{
-		LLSpatialGroup* group = mDrawable->getSpatialGroup();
-		if (group)
-		{
-			group->dirtyGeom();
-			gPipeline.markRebuild(group, priority);
-		}
-	}
-}
-
-void LLViewerObject::dirtyMesh()
-{
-	if (mDrawable)
-	{
-		LLSpatialGroup* group = mDrawable->getSpatialGroup();
-		if (group)
-		{
-			group->dirtyMesh();
-		}
-	}
-}
-
-F32 LLAlphaObject::getPartSize(S32 idx)
-{
-	return 0.f;
-}
-
-// virtual
-void LLStaticViewerObject::updateDrawable(BOOL force_damped)
-{
-	// Force an immediate rebuild on any update
-	if (mDrawable.notNull())
-	{
-		mDrawable->updateXform(TRUE);
-		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
-	}
-	clearChanged(SHIFTED);
-}
-
-void LLViewerObject::saveUnselectedChildrenPosition(std::vector<LLVector3>& positions)
-{
-	if(mChildList.empty() || !positions.empty())
-	{
-		return ;
-	}
-
-	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
-			iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* childp = *iter;
-		if (!childp->isSelected() && childp->mDrawable.notNull())
-		{
-			positions.push_back(childp->getPositionEdit());		
-		}
-	}
-
-	return ;
-}
-
-void LLViewerObject::saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations)
-{
-	if(mChildList.empty())
-	{
-		return ;
-	}
-
-	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
-			iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* childp = *iter;
-		if (!childp->isSelected() && childp->mDrawable.notNull())
-		{
-			rotations.push_back(childp->getRotationEdit());				
-		}		
-	}
-
-	return ;
-}
-
-//counter-rotation
-void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, 
-											const std::vector<LLVector3>& positions)
-{
-	if(mChildList.empty())
-	{
-		return ;
-	}
-
-	S32 index = 0 ;
-	LLQuaternion inv_rotation = ~getRotationEdit() ;
-	LLVector3 offset = getPositionEdit() ;
-	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
-			iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* childp = *iter;
-		if (!childp->isSelected() && childp->mDrawable.notNull())
-		{
-			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
-			{
-				childp->setRotation(rotations[index] * inv_rotation);
-				childp->setPosition((positions[index] - offset) * inv_rotation);
-				LLManip::rebuild(childp);					
-			}
-			else //avatar
-			{
-				LLVector3 reset_pos = (positions[index] - offset) * inv_rotation ;
-				LLQuaternion reset_rot = rotations[index] * inv_rotation ;
-
-				((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);				
-				((LLVOAvatar*)childp)->mDrawable->mXform.setRotation(reset_rot) ;
-				
-				((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos, TRUE);				
-				((LLVOAvatar*)childp)->mDrawable->getVObj()->setRotation(reset_rot, TRUE) ;
-
-				LLManip::rebuild(childp);				
-			}	
-			index++;
-		}				
-	}
-
-	return ;
-}
-
-//counter-translation
-void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified)
-{
-	if(mChildList.empty())
-	{
-		return ;
-	}
-
-	LLVector3 child_offset;
-	if(simplified) //translation only, rotation matrix does not change
-	{
-		child_offset = offset * ~getRotation();
-	}
-	else //rotation matrix might change too.
-	{
-		if (isAttachment() && mDrawable.notNull())
-		{
-			LLXform* attachment_point_xform = mDrawable->getXform()->getParent();
-			LLQuaternion parent_rotation = getRotation() * attachment_point_xform->getWorldRotation();
-			child_offset = offset * ~parent_rotation;
-		}
-		else
-		{
-			child_offset = offset * ~getRenderRotation();
-		}
-	}
-
-	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
-			iter != mChildList.end(); iter++)
-	{
-		LLViewerObject* childp = *iter;
-		if (!childp->isSelected() && childp->mDrawable.notNull())
-		{
-			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
-			{
-				childp->setPosition(childp->getPosition() + child_offset);
-				LLManip::rebuild(childp);
-			}
-			else //avatar
-			{
-				LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
-
-				((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
-				((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);				
-				
-				LLManip::rebuild(childp);
-			}			
-		}		
-	}
-
-	return ;
-}
-
-const LLUUID &LLViewerObject::getAttachmentItemID() const
-{
-	return mAttachmentItemID;
-}
-
-void LLViewerObject::setAttachmentItemID(const LLUUID &id)
-{
-	mAttachmentItemID = id;
-}
-
-EObjectUpdateType LLViewerObject::getLastUpdateType() const
-{
-	return mLastUpdateType;
-}
-
-void LLViewerObject::setLastUpdateType(EObjectUpdateType last_update_type)
-{
-	mLastUpdateType = last_update_type;
-}
-
-BOOL LLViewerObject::getLastUpdateCached() const
-{
-	return mLastUpdateCached;
-}
-
-void LLViewerObject::setLastUpdateCached(BOOL last_update_cached)
-{
-	mLastUpdateCached = last_update_cached;
-}
-
-const LLUUID &LLViewerObject::extractAttachmentItemID()
-{
-	LLUUID item_id = LLUUID::null;
-	LLNameValue* item_id_nv = getNVPair("AttachItemID");
-	if( item_id_nv )
-	{
-		const char* s = item_id_nv->getString();
-		if( s )
-		{
-			item_id.set(s);
-		}
-	}
-	setAttachmentItemID(item_id);
-	return getAttachmentItemID();
-}
-
-//virtual
-LLVOAvatar* LLViewerObject::getAvatar() const
-{
-	if (isAttachment())
-	{
-		LLViewerObject* vobj = (LLViewerObject*) getParent();
-
-		while (vobj && !vobj->asAvatar())
-		{
-			vobj = (LLViewerObject*) vobj->getParent();
-		}
-
-		return (LLVOAvatar*) vobj;
-	}
-
-	return NULL;
-}
-
-
-class ObjectPhysicsProperties : public LLHTTPNode
-{
-public:
-	virtual void post(
-		ResponsePtr responder,
-		const LLSD& context,
-		const LLSD& input) const
-	{
-		LLSD object_data = input["body"]["ObjectData"];
-		S32 num_entries = object_data.size();
-		
-		for ( S32 i = 0; i < num_entries; i++ )
-		{
-			LLSD& curr_object_data = object_data[i];
-			U32 local_id = curr_object_data["LocalID"].asInteger();
-
-			// Iterate through nodes at end, since it can be on both the regular AND hover list
-			struct f : public LLSelectedNodeFunctor
-			{
-				U32 mID;
-				f(const U32& id) : mID(id) {}
-				virtual bool apply(LLSelectNode* node)
-				{
-					return (node->getObject() && node->getObject()->mLocalID == mID );
-				}
-			} func(local_id);
-
-			LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func);
-
-			if (node)
-			{
-				// The LLSD message builder doesn't know how to handle U8, so we need to send as S8 and cast
-				U8 type = (U8)curr_object_data["PhysicsShapeType"].asInteger();
-				F32 density = (F32)curr_object_data["Density"].asReal();
-				F32 friction = (F32)curr_object_data["Friction"].asReal();
-				F32 restitution = (F32)curr_object_data["Restitution"].asReal();
-				F32 gravity = (F32)curr_object_data["GravityMultiplier"].asReal();
-
-				node->getObject()->setPhysicsShapeType(type);
-				node->getObject()->setPhysicsGravity(gravity);
-				node->getObject()->setPhysicsFriction(friction);
-				node->getObject()->setPhysicsDensity(density);
-				node->getObject()->setPhysicsRestitution(restitution);
-			}	
-		}
-		
-		dialog_refresh_all();
-	};
-};
-
-LLHTTPRegistration<ObjectPhysicsProperties>
-	gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties");
+/** 
+ * @file llviewerobject.cpp
+ * @brief Base class for viewer objects
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerobject.h"
+
+#include "llaudioengine.h"
+#include "imageids.h"
+#include "indra_constants.h"
+#include "llmath.h"
+#include "llflexibleobject.h"
+#include "llviewercontrol.h"
+#include "lldatapacker.h"
+#include "llfasttimer.h"
+#include "llfloaterreg.h"
+#include "llfontgl.h"
+#include "llframetimer.h"
+#include "llinventory.h"
+#include "llinventorydefines.h"
+#include "llmaterialtable.h"
+#include "llmutelist.h"
+#include "llnamevalue.h"
+#include "llprimitive.h"
+#include "llquantize.h"
+#include "llregionhandle.h"
+#include "llsdserialize.h"
+#include "lltree_common.h"
+#include "llxfermanager.h"
+#include "message.h"
+#include "object_flags.h"
+#include "timing.h"
+
+#include "llaudiosourcevo.h"
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llbbox.h"
+#include "llbox.h"
+#include "llcylinder.h"
+#include "lldrawable.h"
+#include "llface.h"
+#include "llfloaterproperties.h"
+#include "llfloatertools.h"
+#include "llfollowcam.h"
+#include "llhudtext.h"
+#include "llselectmgr.h"
+#include "llrendersphere.h"
+#include "lltooldraganddrop.h"
+#include "llviewercamera.h"
+#include "llviewertexturelist.h"
+#include "llviewerinventory.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparceloverlay.h"
+#include "llviewerpartsource.h"
+#include "llviewerregion.h"
+#include "llviewerstats.h"
+#include "llviewertextureanim.h"
+#include "llviewerwindow.h" // For getSpinAxis
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llvoclouds.h"
+#include "llvograss.h"
+#include "llvoground.h"
+#include "llvolume.h"
+#include "llvolumemessage.h"
+#include "llvopartgroup.h"
+#include "llvosky.h"
+#include "llvosurfacepatch.h"
+#include "llvotextbubble.h"
+#include "llvotree.h"
+#include "llvovolume.h"
+#include "llvowater.h"
+#include "llworld.h"
+#include "llui.h"
+#include "pipeline.h"
+#include "llviewernetwork.h"
+#include "llvowlsky.h"
+#include "llmanip.h"
+#include "lltrans.h"
+#include "llsdutil.h"
+#include "llmediaentry.h"
+#include "llaccountingquota.h"
+
+//#define DEBUG_UPDATE_TYPE
+
+BOOL		LLViewerObject::sVelocityInterpolate = TRUE;
+BOOL		LLViewerObject::sPingInterpolate = TRUE; 
+
+U32			LLViewerObject::sNumZombieObjects = 0;
+S32			LLViewerObject::sNumObjects = 0;
+BOOL		LLViewerObject::sMapDebug = TRUE;
+LLColor4	LLViewerObject::sEditSelectColor(	1.0f, 1.f, 0.f, 0.3f);	// Edit OK
+LLColor4	LLViewerObject::sNoEditSelectColor(	1.0f, 0.f, 0.f, 0.3f);	// Can't edit
+S32			LLViewerObject::sAxisArrowLength(50);
+BOOL		LLViewerObject::sPulseEnabled(FALSE);
+BOOL		LLViewerObject::sUseSharedDrawables(FALSE); // TRUE
+
+// sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime
+F64			LLViewerObject::sMaxUpdateInterpolationTime = 3.0;		// For motion interpolation: after X seconds with no updates, don't predict object motion
+F64			LLViewerObject::sPhaseOutUpdateInterpolationTime = 2.0;	// For motion interpolation: after Y seconds with no updates, taper off motion prediction
+
+
+static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object");
+
+// static
+LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
+{
+	LLViewerObject *res = NULL;
+	LLFastTimer t1(FTM_CREATE_OBJECT);
+	
+	switch (pcode)
+	{
+	case LL_PCODE_VOLUME:
+	  res = new LLVOVolume(id, pcode, regionp); break;
+	case LL_PCODE_LEGACY_AVATAR:
+	{
+		if (id == gAgentID)
+		{
+			if (!gAgentAvatarp)
+			{
+				gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp);
+			}
+			else 
+			{
+				gAgentAvatarp->updateRegion(regionp);
+			}
+			res = gAgentAvatarp;
+		}
+		else
+		{
+			res = new LLVOAvatar(id, pcode, regionp); 
+		}
+		static_cast<LLVOAvatar*>(res)->initInstance();
+		break;
+	}
+	case LL_PCODE_LEGACY_GRASS:
+	  res = new LLVOGrass(id, pcode, regionp); break;
+	case LL_PCODE_LEGACY_PART_SYS:
+// 	  llwarns << "Creating old part sys!" << llendl;
+// 	  res = new LLVOPart(id, pcode, regionp); break;
+	  res = NULL; break;
+	case LL_PCODE_LEGACY_TREE:
+	  res = new LLVOTree(id, pcode, regionp); break;
+	case LL_PCODE_TREE_NEW:
+// 	  llwarns << "Creating new tree!" << llendl;
+// 	  res = new LLVOTree(id, pcode, regionp); break;
+	  res = NULL; break;
+	case LL_PCODE_LEGACY_TEXT_BUBBLE:
+	  res = new LLVOTextBubble(id, pcode, regionp); break;
+	case LL_VO_CLOUDS:
+	  res = new LLVOClouds(id, pcode, regionp); break;
+	case LL_VO_SURFACE_PATCH:
+	  res = new LLVOSurfacePatch(id, pcode, regionp); break;
+	case LL_VO_SKY:
+	  res = new LLVOSky(id, pcode, regionp); break;
+	case LL_VO_VOID_WATER:
+		res = new LLVOVoidWater(id, pcode, regionp); break;
+	case LL_VO_WATER:
+		res = new LLVOWater(id, pcode, regionp); break;
+	case LL_VO_GROUND:
+	  res = new LLVOGround(id, pcode, regionp); break;
+	case LL_VO_PART_GROUP:
+	  res = new LLVOPartGroup(id, pcode, regionp); break;
+	case LL_VO_HUD_PART_GROUP:
+	  res = new LLVOHUDPartGroup(id, pcode, regionp); break;
+	case LL_VO_WL_SKY:
+	  res = new LLVOWLSky(id, pcode, regionp); break;
+	default:
+	  llwarns << "Unknown object pcode " << (S32)pcode << llendl;
+	  res = NULL; break;
+	}
+	return res;
+}
+
+LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global)
+:	LLPrimitive(),
+	mChildList(),
+	mID(id),
+	mLocalID(0),
+	mTotalCRC(0),
+	mTEImages(NULL),
+	mGLName(0),
+	mbCanSelect(TRUE),
+	mFlags(0),
+	mPhysicsShapeType(0),
+	mPhysicsGravity(0),
+	mPhysicsFriction(0),
+	mPhysicsDensity(0),
+	mPhysicsRestitution(0),
+	mDrawable(),
+	mCreateSelected(FALSE),
+	mRenderMedia(FALSE),
+	mBestUpdatePrecision(0),
+	mText(),
+	mLastInterpUpdateSecs(0.f),
+	mLastMessageUpdateSecs(0.f),
+	mLatestRecvPacketID(0),
+	mData(NULL),
+	mAudioSourcep(NULL),
+	mAudioGain(1.f),
+	mAppAngle(0.f),
+	mPixelArea(1024.f),
+	mInventory(NULL),
+	mInventorySerialNum(0),
+	mRegionp( regionp ),
+	mInventoryPending(FALSE),
+	mInventoryDirty(FALSE),
+	mDead(FALSE),
+	mOrphaned(FALSE),
+	mUserSelected(FALSE),
+	mOnActiveList(FALSE),
+	mOnMap(FALSE),
+	mStatic(FALSE),
+	mNumFaces(0),
+	mTimeDilation(1.f),
+	mRotTime(0.f),
+	mJointInfo(NULL),
+	mState(0),
+	mMedia(NULL),
+	mClickAction(0),
+	mObjectCost(0),
+	mLinksetCost(0),
+	mPhysicsCost(0),
+	mLinksetPhysicsCost(0.f),
+	mCostStale(true),
+	mPhysicsShapeUnknown(true),
+	mAttachmentItemID(LLUUID::null),
+	mLastUpdateType(OUT_UNKNOWN),
+	mLastUpdateCached(FALSE)
+{
+	if (!is_global)
+	{
+		llassert(mRegionp);
+	}
+
+	LLPrimitive::init_primitive(pcode);
+
+	// CP: added 12/2/2005 - this was being initialised to 0, not the current frame time
+	mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
+
+	mPositionRegion = LLVector3(0.f, 0.f, 0.f);
+
+	if (!is_global && mRegionp)
+	{
+		mPositionAgent = mRegionp->getOriginAgent();
+	}
+
+	LLViewerObject::sNumObjects++;
+}
+
+LLViewerObject::~LLViewerObject()
+{
+	deleteTEImages();
+
+	if(mInventory)
+	{
+		mInventory->clear();  // will deref and delete entries
+		delete mInventory;
+		mInventory = NULL;
+	}
+
+	if (mJointInfo)
+	{
+		delete mJointInfo;
+		mJointInfo = NULL;
+	}
+
+	if (mPartSourcep)
+	{
+		mPartSourcep->setDead();
+		mPartSourcep = NULL;
+	}
+
+	// Delete memory associated with extra parameters.
+	std::map<U16, ExtraParameter*>::iterator iter;
+	for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+	{
+		if(iter->second != NULL)
+		{
+			delete iter->second->data;
+			delete iter->second;
+		}
+	}
+	mExtraParameterList.clear();
+
+	for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ;
+	mNameValuePairs.clear();
+	
+	delete[] mData;
+	mData = NULL;
+
+	delete mMedia;
+	mMedia = NULL;
+
+	sNumObjects--;
+	sNumZombieObjects--;
+	llassert(mChildList.size() == 0);
+
+	clearInventoryListeners();
+}
+
+void LLViewerObject::deleteTEImages()
+{
+	delete[] mTEImages;
+	mTEImages = NULL;
+}
+
+void LLViewerObject::markDead()
+{
+	if (!mDead)
+	{
+		//llinfos << "Marking self " << mLocalID << " as dead." << llendl;
+		
+		// Root object of this hierarchy unlinks itself.
+		if (getParent())
+		{
+			((LLViewerObject *)getParent())->removeChild(this);
+			// go ahead and delete any jointinfo's that we find
+			delete mJointInfo;
+			mJointInfo = NULL;
+		}
+
+		// Mark itself as dead
+		mDead = TRUE;
+		gObjectList.cleanupReferences(this);
+
+		LLViewerObject *childp;
+		while (mChildList.size() > 0)
+		{
+			childp = mChildList.back();
+			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+			{
+				//llinfos << "Marking child " << childp->getLocalID() << " as dead." << llendl;
+				childp->setParent(NULL); // LLViewerObject::markDead 1
+				childp->markDead();
+			}
+			else
+			{
+				// make sure avatar is no longer parented, 
+				// so we can properly set it's position
+				childp->setDrawableParent(NULL);
+				((LLVOAvatar*)childp)->getOffObject();
+				childp->setParent(NULL); // LLViewerObject::markDead 2
+			}
+			mChildList.pop_back();
+		}
+
+		if (mDrawable.notNull())
+		{
+			// Drawables are reference counted, mark as dead, then nuke the pointer.
+			mDrawable->markDead();
+			mDrawable = NULL;
+		}
+
+		if (mText)
+		{
+			mText->markDead();
+			mText = NULL;
+		}
+
+		if (mIcon)
+		{
+			mIcon->markDead();
+			mIcon = NULL;
+		}
+
+		if (mPartSourcep)
+		{
+			mPartSourcep->setDead();
+			mPartSourcep = NULL;
+		}
+
+		if (mAudioSourcep)
+		{
+			// Do some cleanup
+			if (gAudiop)
+			{
+				gAudiop->cleanupAudioSource(mAudioSourcep);
+			}
+			mAudioSourcep = NULL;
+		}
+
+		if (flagAnimSource())
+		{
+			if (isAgentAvatarValid())
+			{
+				// stop motions associated with this object
+				gAgentAvatarp->stopMotionFromSource(mID);
+			}
+		}
+
+		if (flagCameraSource())
+		{
+			LLFollowCamMgr::removeFollowCamParams(mID);
+		}
+
+		sNumZombieObjects++;
+	}
+}
+
+void LLViewerObject::dump() const
+{
+	llinfos << "Type: " << pCodeToString(mPrimitiveCode) << llendl;
+	llinfos << "Drawable: " << (LLDrawable *)mDrawable << llendl;
+	llinfos << "Update Age: " << LLFrameTimer::getElapsedSeconds() - mLastMessageUpdateSecs << llendl;
+
+	llinfos << "Parent: " << getParent() << llendl;
+	llinfos << "ID: " << mID << llendl;
+	llinfos << "LocalID: " << mLocalID << llendl;
+	llinfos << "PositionRegion: " << getPositionRegion() << llendl;
+	llinfos << "PositionAgent: " << getPositionAgent() << llendl;
+	llinfos << "PositionGlobal: " << getPositionGlobal() << llendl;
+	llinfos << "Velocity: " << getVelocity() << llendl;
+	if (mDrawable.notNull() && mDrawable->getNumFaces())
+	{
+		LLFacePool *poolp = mDrawable->getFace(0)->getPool();
+		if (poolp)
+		{
+			llinfos << "Pool: " << poolp << llendl;
+			llinfos << "Pool reference count: " << poolp->mReferences.size() << llendl;
+		}
+	}
+	//llinfos << "BoxTree Min: " << mDrawable->getBox()->getMin() << llendl;
+	//llinfos << "BoxTree Max: " << mDrawable->getBox()->getMin() << llendl;
+	/*
+	llinfos << "Velocity: " << getVelocity() << llendl;
+	llinfos << "AnyOwner: " << permAnyOwner() << " YouOwner: " << permYouOwner() << " Edit: " << mPermEdit << llendl;
+	llinfos << "UsePhysics: " << usePhysics() << " CanSelect " << mbCanSelect << " UserSelected " << mUserSelected << llendl;
+	llinfos << "AppAngle: " << mAppAngle << llendl;
+	llinfos << "PixelArea: " << mPixelArea << llendl;
+
+	char buffer[1000];
+	char *key;
+	for (key = mNameValuePairs.getFirstKey(); key; key = mNameValuePairs.getNextKey() )
+	{
+		mNameValuePairs[key]->printNameValue(buffer);
+		llinfos << buffer << llendl;
+	}
+	for (child_list_t::iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		llinfos << "  child " << child->getID() << llendl;
+	}
+	*/
+}
+
+void LLViewerObject::printNameValuePairs() const
+{
+	for (name_value_map_t::const_iterator iter = mNameValuePairs.begin();
+		 iter != mNameValuePairs.end(); iter++)
+	{
+		LLNameValue* nv = iter->second;
+		llinfos << nv->printNameValue() << llendl;
+	}
+}
+
+void LLViewerObject::initVOClasses()
+{
+	// Initialized shared class stuff first.
+	LLVOAvatar::initClass();
+	LLVOTree::initClass();
+	llinfos << "Viewer Object size: " << sizeof(LLViewerObject) << llendl;
+	LLVOGrass::initClass();
+	LLVOWater::initClass();
+	LLVOVolume::initClass();
+}
+
+void LLViewerObject::cleanupVOClasses()
+{
+	LLVOGrass::cleanupClass();
+	LLVOWater::cleanupClass();
+	LLVOTree::cleanupClass();
+	LLVOAvatar::cleanupClass();
+	LLVOVolume::cleanupClass();
+}
+
+// Replaces all name value pairs with data from \n delimited list
+// Does not update server
+void LLViewerObject::setNameValueList(const std::string& name_value_list)
+{
+	// Clear out the old
+	for_each(mNameValuePairs.begin(), mNameValuePairs.end(), DeletePairedPointer()) ;
+	mNameValuePairs.clear();
+
+	// Bring in the new
+	std::string::size_type length = name_value_list.length();
+	std::string::size_type start = 0;
+	while (start < length)
+	{
+		std::string::size_type end = name_value_list.find_first_of("\n", start);
+		if (end == std::string::npos) end = length;
+		if (end > start)
+		{
+			std::string tok = name_value_list.substr(start, end - start);
+			addNVPair(tok);
+		}
+		start = end+1;
+	}
+}
+
+
+// This method returns true if the object is over land owned by the
+// agent.
+bool LLViewerObject::isReturnable()
+{
+	if (isAttachment())
+	{
+		return false;
+	}
+	std::vector<LLBBox> boxes;
+	boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());
+	for (child_list_t::iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
+	}
+
+	return mRegionp
+		&& mRegionp->objectIsReturnable(getPositionRegion(), boxes);
+}
+
+BOOL LLViewerObject::setParent(LLViewerObject* parent)
+{
+	if(mParent != parent)
+	{
+		LLViewerObject* old_parent = (LLViewerObject*)mParent ;		
+		BOOL ret = LLPrimitive::setParent(parent);
+		if(ret && old_parent && parent)
+		{
+			old_parent->removeChild(this) ;
+		}
+		return ret ;
+	}
+
+	return FALSE ;
+}
+
+void LLViewerObject::addChild(LLViewerObject *childp)
+{
+	for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
+	{
+		if (*i == childp)
+		{	//already has child
+			return;
+		}
+	}
+	
+	if (!isAvatar())
+	{
+		// propagate selection properties
+		childp->mbCanSelect = mbCanSelect;
+	}
+
+	if(childp->setParent(this))
+	{
+		mChildList.push_back(childp);
+	}
+}
+
+void LLViewerObject::removeChild(LLViewerObject *childp)
+{
+	for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
+	{
+		if (*i == childp)
+		{
+			if (!childp->isAvatar() && mDrawable.notNull() && mDrawable->isActive() && childp->mDrawable.notNull() && !isAvatar())
+			{
+				gPipeline.markRebuild(childp->mDrawable, LLDrawable::REBUILD_VOLUME);
+			}
+
+			mChildList.erase(i);
+
+			if(childp->getParent() == this)
+			{
+				childp->setParent(NULL);			
+			}
+			break;
+		}
+	}
+	
+	if (childp->isSelected())
+	{
+		LLSelectMgr::getInstance()->deselectObjectAndFamily(childp);
+		BOOL add_to_end = TRUE;
+		LLSelectMgr::getInstance()->selectObjectAndFamily(childp, add_to_end);
+	}
+}
+
+void LLViewerObject::addThisAndAllChildren(std::vector<LLViewerObject*>& objects)
+{
+	objects.push_back(this);
+	for (child_list_t::iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		if (!child->isAvatar())
+		{
+			child->addThisAndAllChildren(objects);
+		}
+	}
+}
+
+void LLViewerObject::addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects)
+{
+	objects.push_back(this);
+	// don't add any attachments when temporarily selecting avatar
+	if (isAvatar())
+	{
+		return;
+	}
+	for (child_list_t::iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		if ( (!child->isAvatar()) && (!child->isJointChild()))
+		{
+			child->addThisAndNonJointChildren(objects);
+		}
+	}
+}
+
+BOOL LLViewerObject::isChild(LLViewerObject *childp) const
+{
+	for (child_list_t::const_iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* testchild = *iter;
+		if (testchild == childp)
+			return TRUE;
+	}
+	return FALSE;
+}
+
+
+// returns TRUE if at least one avatar is sitting on this object
+BOOL LLViewerObject::isSeat() const
+{
+	for (child_list_t::const_iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		if (child->isAvatar())
+		{
+			return TRUE;
+		}
+	}
+	return FALSE;
+
+}
+
+BOOL LLViewerObject::setDrawableParent(LLDrawable* parentp)
+{
+	if (mDrawable.isNull())
+	{
+		return FALSE;
+	}
+
+	BOOL ret = mDrawable->mXform.setParent(parentp ? &parentp->mXform : NULL);
+	if(!ret)
+	{
+		return FALSE ;
+	}
+	LLDrawable* old_parent = mDrawable->mParent;
+	mDrawable->mParent = parentp; 
+		
+	gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
+	if(	(old_parent != parentp && old_parent)
+		|| (parentp && parentp->isActive()))
+	{
+		// *TODO we should not be relying on setDrawable parent to call markMoved
+		gPipeline.markMoved(mDrawable, FALSE);
+	}
+	else if (!mDrawable->isAvatar())
+	{
+		mDrawable->updateXform(TRUE);
+		/*if (!mDrawable->getSpatialGroup())
+		{
+			mDrawable->movePartition();
+		}*/
+	}
+	
+	return ret;
+}
+
+// Show or hide particles, icon and HUD
+void LLViewerObject::hideExtraDisplayItems( BOOL hidden )
+{
+	if( mPartSourcep.notNull() )
+	{
+		LLViewerPartSourceScript *partSourceScript = mPartSourcep.get();
+		partSourceScript->setSuspended( hidden );
+	}
+
+	if( mText.notNull() )
+	{
+		LLHUDText *hudText = mText.get();
+		hudText->setHidden( hidden );
+	}
+
+	if( mIcon.notNull() )
+	{
+		LLHUDIcon *hudIcon = mIcon.get();
+		hudIcon->setHidden( hidden );
+	}
+}
+
+U32 LLViewerObject::checkMediaURL(const std::string &media_url)
+{
+    U32 retval = (U32)0x0;
+    if (!mMedia && !media_url.empty())
+    {
+        retval |= MEDIA_URL_ADDED;
+        mMedia = new LLViewerObjectMedia;
+        mMedia->mMediaURL = media_url;
+        mMedia->mMediaType = LLViewerObject::MEDIA_SET;
+        mMedia->mPassedWhitelist = FALSE;
+    }
+    else if (mMedia)
+    {
+        if (media_url.empty())
+        {
+            retval |= MEDIA_URL_REMOVED;
+            delete mMedia;
+            mMedia = NULL;
+        }
+        else if (mMedia->mMediaURL != media_url) // <-- This is an optimization.  If they are equal don't bother with below's test.
+        {
+            /*if (! (LLTextureEntry::getAgentIDFromMediaVersionString(media_url) == gAgent.getID() &&
+                   LLTextureEntry::getVersionFromMediaVersionString(media_url) == 
+                        LLTextureEntry::getVersionFromMediaVersionString(mMedia->mMediaURL) + 1))
+			*/
+            {
+                // If the media URL is different and WE were not the one who
+                // changed it, mark dirty.
+                retval |= MEDIA_URL_UPDATED;
+            }
+            mMedia->mMediaURL = media_url;
+            mMedia->mPassedWhitelist = FALSE;
+        }
+    }
+    return retval;
+}
+
+U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
+					 void **user_data,
+					 U32 block_num,
+					 const EObjectUpdateType update_type,
+					 LLDataPacker *dp)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	U32 retval = 0x0;
+	
+	// Coordinates of objects on simulators are region-local.
+	U64 region_handle;
+	mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle);
+	
+	{
+		LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle);
+		if(regionp != mRegionp && regionp && mRegionp)//region cross
+		{
+			//this is the redundant position and region update, but it is necessary in case the viewer misses the following 
+			//position and region update messages from sim.
+			//this redundant update should not cause any problems.
+			LLVector3 delta_pos =  mRegionp->getOriginAgent() - regionp->getOriginAgent();
+			setPositionParent(getPosition() + delta_pos); //update to the new region position immediately.
+			setRegion(regionp) ; //change the region.
+		}
+		else
+		{
+			mRegionp = regionp ;
+		}
+	}	
+	
+	if (!mRegionp)
+	{
+		U32 x, y;
+		from_region_handle(region_handle, &x, &y);
+
+		llerrs << "Object has invalid region " << x << ":" << y << "!" << llendl;
+		return retval;
+	}
+
+	U16 time_dilation16;
+	mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16);
+	F32 time_dilation = ((F32) time_dilation16) / 65535.f;
+	mTimeDilation = time_dilation;
+	mRegionp->setTimeDilation(time_dilation);
+
+	// this will be used to determine if we've really changed position
+	// Use getPosition, not getPositionRegion, since this is what we're comparing directly against.
+	LLVector3 test_pos_parent = getPosition();
+
+	U8  data[60+16]; // This needs to match the largest size below.
+#ifdef LL_BIG_ENDIAN
+	U16 valswizzle[4];
+#endif
+	U16	*val;
+	const F32 size = LLWorld::getInstance()->getRegionWidthInMeters();	
+	const F32 MAX_HEIGHT = LLWorld::getInstance()->getRegionMaxHeight();
+	const F32 MIN_HEIGHT = LLWorld::getInstance()->getRegionMinHeight();
+	S32 length;
+	S32	count;
+	S32 this_update_precision = 32;		// in bits
+
+	// Temporaries, because we need to compare w/ previous to set dirty flags...
+	LLVector3 new_pos_parent;
+	LLVector3 new_vel;
+	LLVector3 new_acc;
+	LLVector3 new_angv;
+	LLVector3 old_angv = getAngularVelocity();
+	LLQuaternion new_rot;
+	LLVector3 new_scale = getScale();
+
+	U32	parent_id = 0;
+	U8	material = 0;
+	U8 click_action = 0;
+	U32 crc = 0;
+
+	bool old_special_hover_cursor = specialHoverCursor();
+
+	LLViewerObject *cur_parentp = (LLViewerObject *)getParent();
+
+	if (cur_parentp)
+	{
+		parent_id = cur_parentp->mLocalID;
+	}
+
+	if (!dp)
+	{
+		switch(update_type)
+		{
+		case OUT_FULL:
+			{
+#ifdef DEBUG_UPDATE_TYPE
+				llinfos << "Full:" << getID() << llendl;
+#endif
+				//clear cost and linkset cost
+				mCostStale = true;
+				if (isSelected())
+				{
+					gFloaterTools->dirty();
+				}
+
+				LLUUID audio_uuid;
+				LLUUID owner_id;	// only valid if audio_uuid or particle system is not null
+				F32    gain;
+				U8     sound_flags;
+
+				mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_CRC, crc, block_num);
+				mesgsys->getU32Fast( _PREHASH_ObjectData, _PREHASH_ParentID, parent_id, block_num);
+				mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_Sound, audio_uuid, block_num );
+				// HACK: Owner id only valid if non-null sound id or particle system
+				mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id, block_num );
+				mesgsys->getF32Fast( _PREHASH_ObjectData, _PREHASH_Gain, gain, block_num );
+				mesgsys->getU8Fast(  _PREHASH_ObjectData, _PREHASH_Flags, sound_flags, block_num );
+				mesgsys->getU8Fast(  _PREHASH_ObjectData, _PREHASH_Material, material, block_num );
+				mesgsys->getU8Fast(  _PREHASH_ObjectData, _PREHASH_ClickAction, click_action, block_num); 
+				mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_Scale, new_scale, block_num );
+				length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData);
+				mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num);
+
+				mTotalCRC = crc;
+
+				// Owner ID used for sound muting or particle system muting
+				setAttachedSound(audio_uuid, owner_id, gain, sound_flags);
+
+				U8 old_material = getMaterial();
+				if (old_material != material)
+				{
+					setMaterial(material);
+					if (mDrawable.notNull())
+					{
+						gPipeline.markMoved(mDrawable, FALSE); // undamped
+					}
+				}
+				setClickAction(click_action);
+
+				count = 0;
+				LLVector4 collision_plane;
+				
+				switch(length)
+				{
+				case (60 + 16):
+					// pull out collision normal for avatar
+					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+					((LLVOAvatar*)this)->setFootPlane(collision_plane);
+					count += sizeof(LLVector4);
+					// fall through
+				case 60:
+					this_update_precision = 32;
+					// this is a terse update
+					// pos
+					htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					count += sizeof(LLVector3);
+					// vel
+					htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					count += sizeof(LLVector3);
+					// acc
+					htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					count += sizeof(LLVector3);
+					// theta
+					{
+						LLVector3 vec;
+						htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+						new_rot.unpackFromVector3(vec);
+					}
+					count += sizeof(LLVector3);
+					// omega
+					htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					if (new_angv.isExactlyZero())
+					{
+						// reset rotation time
+						resetRot();
+					}
+					setAngularVelocity(new_angv);
+#if LL_DARWIN
+					if (length == 76)
+					{
+						setAngularVelocity(LLVector3::zero);
+					}
+#endif
+					break;
+				case(32 + 16):
+					// pull out collision normal for avatar
+					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+					((LLVOAvatar*)this)->setFootPlane(collision_plane);
+					count += sizeof(LLVector4);
+					// fall through
+				case 32:
+					this_update_precision = 16;
+					test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+
+					// This is a terse 16 update, so treat data as an array of U16's.
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*3;
+					new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*3;
+					setVelocity(LLVector3(U16_to_F32(val[VX], -size, size),
+													   U16_to_F32(val[VY], -size, size),
+													   U16_to_F32(val[VZ], -size, size)));
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*3;
+					setAcceleration(LLVector3(U16_to_F32(val[VX], -size, size),
+														   U16_to_F32(val[VY], -size, size),
+														   U16_to_F32(val[VZ], -size, size)));
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 4); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*4;
+					new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
+					new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
+					new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
+					new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					new_angv.setVec(U16_to_F32(val[VX], -size, size),
+										U16_to_F32(val[VY], -size, size),
+										U16_to_F32(val[VZ], -size, size));
+					if (new_angv.isExactlyZero())
+					{
+						// reset rotation time
+						resetRot();
+					}
+					setAngularVelocity(new_angv);
+					break;
+
+				case 16:
+					this_update_precision = 8;
+					test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+					// this is a terse 8 update
+					new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT);
+
+					setVelocity(U8_to_F32(data[3], -size, size),
+								U8_to_F32(data[4], -size, size),
+								U8_to_F32(data[5], -size, size) );
+
+					setAcceleration(U8_to_F32(data[6], -size, size),
+									U8_to_F32(data[7], -size, size),
+									U8_to_F32(data[8], -size, size) );
+
+					new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f);
+					new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f);
+					new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
+					new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
+
+					new_angv.setVec(U8_to_F32(data[13], -size, size),
+										U8_to_F32(data[14], -size, size),
+										U8_to_F32(data[15], -size, size) );
+					if (new_angv.isExactlyZero())
+					{
+						// reset rotation time
+						resetRot();
+					}
+					setAngularVelocity(new_angv);
+					break;
+				}
+
+				////////////////////////////////////////////////////
+				//
+				// Here we handle data specific to the full message.
+				//
+
+				U32 flags;
+				mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num);
+				// clear all but local flags
+				mFlags &= FLAGS_LOCAL;
+				mFlags |= flags;
+
+				U8 state;
+				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num );
+				mState = state;
+
+				// ...new objects that should come in selected need to be added to the selected list
+				mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0);
+
+				// Set all name value pairs
+				S32 nv_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_NameValue);
+				if (nv_size > 0)
+				{
+					std::string name_value_list;
+					mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_NameValue, name_value_list, block_num);
+					setNameValueList(name_value_list);
+				}
+
+				// Clear out any existing generic data
+				if (mData)
+				{
+					delete [] mData;
+				}
+
+				// Check for appended generic data
+				S32 data_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Data);
+				if (data_size <= 0)
+				{
+					mData = NULL;
+				}
+				else
+				{
+					// ...has generic data
+					mData = new U8[data_size];
+					mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, mData, data_size, block_num);
+				}
+
+				S32 text_size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_Text);
+				if (text_size > 1)
+				{
+					// Setup object text
+					if (!mText)
+					{
+						mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
+						mText->setFont(LLFontGL::getFontSansSerif());
+						mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
+						mText->setMaxLines(-1);
+						mText->setSourceObject(this);
+						mText->setOnHUDAttachment(isHUDAttachment());
+					}
+
+					std::string temp_string;
+					mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_Text, temp_string, block_num );
+					
+					LLColor4U coloru;
+					mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextColor, coloru.mV, 4, block_num);
+
+					// alpha was flipped so that it zero encoded better
+					coloru.mV[3] = 255 - coloru.mV[3];
+					mText->setColor(LLColor4(coloru));
+					mText->setString(temp_string);
+					
+					if (mDrawable.notNull())
+					{
+						setChanged(MOVED | SILHOUETTE);
+						gPipeline.markMoved(mDrawable, FALSE); // undamped
+					}
+				}
+				else if (mText.notNull())
+				{
+					mText->markDead();
+					mText = NULL;
+				}
+
+				std::string media_url;
+				mesgsys->getStringFast(_PREHASH_ObjectData, _PREHASH_MediaURL, media_url, block_num);
+                retval |= checkMediaURL(media_url);
+                
+				//
+				// Unpack particle system data
+				//
+				unpackParticleSource(block_num, owner_id);
+
+				// Mark all extra parameters not used
+				std::map<U16, ExtraParameter*>::iterator iter;
+				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+				{
+					iter->second->in_use = FALSE;
+				}
+
+				// Unpack extra parameters
+				S32 size = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ExtraParams);
+				if (size > 0)
+				{
+					U8 *buffer = new U8[size];
+					mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ExtraParams, buffer, size, block_num);
+					LLDataPackerBinaryBuffer dp(buffer, size);
+
+					U8 num_parameters;
+					dp.unpackU8(num_parameters, "num_params");
+					U8 param_block[MAX_OBJECT_PARAMS_SIZE];
+					for (U8 param=0; param<num_parameters; ++param)
+					{
+						U16 param_type;
+						S32 param_size;
+						dp.unpackU16(param_type, "param_type");
+						dp.unpackBinaryData(param_block, param_size, "param_data");
+						//llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl;
+						LLDataPackerBinaryBuffer dp2(param_block, param_size);
+						unpackParameterEntry(param_type, &dp2);
+					}
+					delete[] buffer;
+				}
+
+				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+				{
+					if (!iter->second->in_use)
+					{
+						// Send an update message in case it was formerly in use
+						parameterChanged(iter->first, iter->second->data, FALSE, false);
+					}
+				}
+
+				U8 joint_type = 0;
+				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_JointType, joint_type, block_num);
+				if (joint_type)
+				{
+					// create new joint info 
+					if (!mJointInfo)
+					{
+						mJointInfo = new LLVOJointInfo;
+					}
+					mJointInfo->mJointType = (EHavokJointType) joint_type;
+					mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointPivot, mJointInfo->mPivot, block_num);
+					mesgsys->getVector3Fast(_PREHASH_ObjectData, _PREHASH_JointAxisOrAnchor, mJointInfo->mAxisOrAnchor, block_num);
+				}
+				else if (mJointInfo)
+				{
+					// this joint info is no longer needed
+					delete mJointInfo;
+					mJointInfo = NULL;
+				}
+
+				break;
+			}
+
+		case OUT_TERSE_IMPROVED:
+			{
+#ifdef DEBUG_UPDATE_TYPE
+				llinfos << "TI:" << getID() << llendl;
+#endif
+				length = mesgsys->getSizeFast(_PREHASH_ObjectData, block_num, _PREHASH_ObjectData);
+				mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_ObjectData, data, length, block_num);
+				count = 0;
+				LLVector4 collision_plane;
+				
+				switch(length)
+				{
+				case(60 + 16):
+					// pull out collision normal for avatar
+					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+					((LLVOAvatar*)this)->setFootPlane(collision_plane);
+					count += sizeof(LLVector4);
+					// fall through
+				case 60:
+					// this is a terse 32 update
+					// pos
+					this_update_precision = 32;
+					htonmemcpy(new_pos_parent.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					count += sizeof(LLVector3);
+					// vel
+					htonmemcpy((void*)getVelocity().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					count += sizeof(LLVector3);
+					// acc
+					htonmemcpy((void*)getAcceleration().mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					count += sizeof(LLVector3);
+					// theta
+					{
+						LLVector3 vec;
+						htonmemcpy(vec.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+						new_rot.unpackFromVector3(vec);
+					}
+					count += sizeof(LLVector3);
+					// omega
+					htonmemcpy((void*)new_angv.mV, &data[count], MVT_LLVector3, sizeof(LLVector3));
+					if (new_angv.isExactlyZero())
+					{
+						// reset rotation time
+						resetRot();
+					}
+					setAngularVelocity(new_angv);
+#if LL_DARWIN
+					if (length == 76)
+					{
+						setAngularVelocity(LLVector3::zero);
+					}
+#endif
+					break;
+				case(32 + 16):
+					// pull out collision normal for avatar
+					htonmemcpy(collision_plane.mV, &data[count], MVT_LLVector4, sizeof(LLVector4));
+					((LLVOAvatar*)this)->setFootPlane(collision_plane);
+					count += sizeof(LLVector4);
+					// fall through
+				case 32:
+					// this is a terse 16 update
+					this_update_precision = 16;
+					test_pos_parent.quantize16(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*3;
+					new_pos_parent.mV[VX] = U16_to_F32(val[VX], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VY] = U16_to_F32(val[VY], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VZ] = U16_to_F32(val[VZ], MIN_HEIGHT, MAX_HEIGHT);
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*3;
+					setVelocity(U16_to_F32(val[VX], -size, size),
+								U16_to_F32(val[VY], -size, size),
+								U16_to_F32(val[VZ], -size, size));
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*3;
+					setAcceleration(U16_to_F32(val[VX], -size, size),
+									U16_to_F32(val[VY], -size, size),
+									U16_to_F32(val[VZ], -size, size));
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Quat, 8); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					count += sizeof(U16)*4;
+					new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
+					new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
+					new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
+					new_rot.mQ[VW] = U16_to_F32(val[VW], -1.f, 1.f);
+
+#ifdef LL_BIG_ENDIAN
+					htonmemcpy(valswizzle, &data[count], MVT_U16Vec3, 6); 
+					val = valswizzle;
+#else
+					val = (U16 *) &data[count];
+#endif
+					setAngularVelocity(	U16_to_F32(val[VX], -size, size),
+										U16_to_F32(val[VY], -size, size),
+										U16_to_F32(val[VZ], -size, size));
+					break;
+
+				case 16:
+					// this is a terse 8 update
+					this_update_precision = 8;
+					test_pos_parent.quantize8(-0.5f*size, 1.5f*size, MIN_HEIGHT, MAX_HEIGHT);
+					new_pos_parent.mV[VX] = U8_to_F32(data[0], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VY] = U8_to_F32(data[1], -0.5f*size, 1.5f*size);
+					new_pos_parent.mV[VZ] = U8_to_F32(data[2], MIN_HEIGHT, MAX_HEIGHT);
+
+					setVelocity(U8_to_F32(data[3], -size, size),
+								U8_to_F32(data[4], -size, size),
+								U8_to_F32(data[5], -size, size) );
+
+					setAcceleration(U8_to_F32(data[6], -size, size),
+									U8_to_F32(data[7], -size, size),
+									U8_to_F32(data[8], -size, size) );
+
+					new_rot.mQ[VX] = U8_to_F32(data[9], -1.f, 1.f);
+					new_rot.mQ[VY] = U8_to_F32(data[10], -1.f, 1.f);
+					new_rot.mQ[VZ] = U8_to_F32(data[11], -1.f, 1.f);
+					new_rot.mQ[VW] = U8_to_F32(data[12], -1.f, 1.f);
+
+					setAngularVelocity(	U8_to_F32(data[13], -size, size),
+										U8_to_F32(data[14], -size, size),
+										U8_to_F32(data[15], -size, size) );
+					break;
+				}
+
+				U8 state;
+				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num );
+				mState = state;
+				break;
+			}
+
+		default:
+			break;
+
+		}
+	}
+	else
+	{
+		// handle the compressed case
+		LLUUID sound_uuid;
+		LLUUID	owner_id;
+		F32    gain = 0;
+		U8     sound_flags = 0;
+		F32		cutoff = 0;
+
+		U16 val[4];
+
+		U8		state;
+
+		dp->unpackU8(state, "State");
+		mState = state;
+
+		switch(update_type)
+		{
+			case OUT_TERSE_IMPROVED:
+			{
+#ifdef DEBUG_UPDATE_TYPE
+				llinfos << "CompTI:" << getID() << llendl;
+#endif
+				U8		value;
+				dp->unpackU8(value, "agent");
+				if (value)
+				{
+					LLVector4 collision_plane;
+					dp->unpackVector4(collision_plane, "Plane");
+					((LLVOAvatar*)this)->setFootPlane(collision_plane);
+				}
+				test_pos_parent = getPosition();
+				dp->unpackVector3(new_pos_parent, "Pos");
+				dp->unpackU16(val[VX], "VelX");
+				dp->unpackU16(val[VY], "VelY");
+				dp->unpackU16(val[VZ], "VelZ");
+				setVelocity(U16_to_F32(val[VX], -128.f, 128.f),
+							U16_to_F32(val[VY], -128.f, 128.f),
+							U16_to_F32(val[VZ], -128.f, 128.f));
+				dp->unpackU16(val[VX], "AccX");
+				dp->unpackU16(val[VY], "AccY");
+				dp->unpackU16(val[VZ], "AccZ");
+				setAcceleration(U16_to_F32(val[VX], -64.f, 64.f),
+								U16_to_F32(val[VY], -64.f, 64.f),
+								U16_to_F32(val[VZ], -64.f, 64.f));
+
+				dp->unpackU16(val[VX], "ThetaX");
+				dp->unpackU16(val[VY], "ThetaY");
+				dp->unpackU16(val[VZ], "ThetaZ");
+				dp->unpackU16(val[VS], "ThetaS");
+				new_rot.mQ[VX] = U16_to_F32(val[VX], -1.f, 1.f);
+				new_rot.mQ[VY] = U16_to_F32(val[VY], -1.f, 1.f);
+				new_rot.mQ[VZ] = U16_to_F32(val[VZ], -1.f, 1.f);
+				new_rot.mQ[VS] = U16_to_F32(val[VS], -1.f, 1.f);
+				dp->unpackU16(val[VX], "AccX");
+				dp->unpackU16(val[VY], "AccY");
+				dp->unpackU16(val[VZ], "AccZ");
+				setAngularVelocity(	U16_to_F32(val[VX], -64.f, 64.f),
+									U16_to_F32(val[VY], -64.f, 64.f),
+									U16_to_F32(val[VZ], -64.f, 64.f));
+			}
+			break;
+			case OUT_FULL_COMPRESSED:
+			case OUT_FULL_CACHED:
+			{
+#ifdef DEBUG_UPDATE_TYPE
+				llinfos << "CompFull:" << getID() << llendl;
+#endif
+				mCostStale = true;
+
+				if (isSelected())
+				{
+					gFloaterTools->dirty();
+				}
+	
+				dp->unpackU32(crc, "CRC");
+				mTotalCRC = crc;
+				dp->unpackU8(material, "Material");
+				U8 old_material = getMaterial();
+				if (old_material != material)
+				{
+					setMaterial(material);
+					if (mDrawable.notNull())
+					{
+						gPipeline.markMoved(mDrawable, FALSE); // undamped
+					}
+				}
+				dp->unpackU8(click_action, "ClickAction");
+				setClickAction(click_action);
+				dp->unpackVector3(new_scale, "Scale");
+				dp->unpackVector3(new_pos_parent, "Pos");
+				LLVector3 vec;
+				dp->unpackVector3(vec, "Rot");
+				new_rot.unpackFromVector3(vec);
+				setAcceleration(LLVector3::zero);
+
+				U32 value;
+				dp->unpackU32(value, "SpecialCode");
+				dp->setPassFlags(value);
+				dp->unpackUUID(owner_id, "Owner");
+
+				if (value & 0x80)
+				{
+					dp->unpackVector3(vec, "Omega");
+					setAngularVelocity(vec);
+				}
+
+				if (value & 0x20)
+				{
+					dp->unpackU32(parent_id, "ParentID");
+				}
+				else
+				{
+					parent_id = 0;
+				}
+
+				S32 sp_size;
+				U32 size;
+				if (value & 0x2)
+				{
+					sp_size = 1;
+					delete [] mData;
+					mData = new U8[1];
+					dp->unpackU8(((U8*)mData)[0], "TreeData");
+				}
+				else if (value & 0x1)
+				{
+					dp->unpackU32(size, "ScratchPadSize");
+					delete [] mData;
+					mData = new U8[size];
+					dp->unpackBinaryData((U8 *)mData, sp_size, "PartData");
+				}
+				else
+				{
+					mData = NULL;
+				}
+
+				// Setup object text
+				if (!mText && (value & 0x4))
+				{
+					mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
+					mText->setFont(LLFontGL::getFontSansSerif());
+					mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
+					mText->setMaxLines(-1); // Set to match current agni behavior.
+					mText->setSourceObject(this);
+					mText->setOnHUDAttachment(isHUDAttachment());
+				}
+
+				if (value & 0x4)
+				{
+					std::string temp_string;
+					dp->unpackString(temp_string, "Text");
+					LLColor4U coloru;
+					dp->unpackBinaryDataFixed(coloru.mV, 4, "Color");
+					coloru.mV[3] = 255 - coloru.mV[3];
+					mText->setColor(LLColor4(coloru));
+					mText->setString(temp_string);
+
+					setChanged(TEXTURE);
+				}
+				else if(mText.notNull())
+				{
+					mText->markDead();
+					mText = NULL;
+				}
+
+                std::string media_url;
+				if (value & 0x200)
+				{
+					dp->unpackString(media_url, "MediaURL");
+				}
+                retval |= checkMediaURL(media_url);
+
+				//
+				// Unpack particle system data
+				//
+				if (value & 0x8)
+				{
+					unpackParticleSource(*dp, owner_id);
+				}
+				else
+				{
+					deleteParticleSource();
+				}
+				
+				// Mark all extra parameters not used
+				std::map<U16, ExtraParameter*>::iterator iter;
+				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+				{
+					iter->second->in_use = FALSE;
+				}
+
+				// Unpack extra params
+				U8 num_parameters;
+				dp->unpackU8(num_parameters, "num_params");
+				U8 param_block[MAX_OBJECT_PARAMS_SIZE];
+				for (U8 param=0; param<num_parameters; ++param)
+				{
+					U16 param_type;
+					S32 param_size;
+					dp->unpackU16(param_type, "param_type");
+					dp->unpackBinaryData(param_block, param_size, "param_data");
+					//llinfos << "Param type: " << param_type << ", Size: " << param_size << llendl;
+					LLDataPackerBinaryBuffer dp2(param_block, param_size);
+					unpackParameterEntry(param_type, &dp2);
+				}
+
+				for (iter = mExtraParameterList.begin(); iter != mExtraParameterList.end(); ++iter)
+				{
+					if (!iter->second->in_use)
+					{
+						// Send an update message in case it was formerly in use
+						parameterChanged(iter->first, iter->second->data, FALSE, false);
+					}
+				}
+
+				if (value & 0x10)
+				{
+					dp->unpackUUID(sound_uuid, "SoundUUID");
+					dp->unpackF32(gain, "SoundGain");
+					dp->unpackU8(sound_flags, "SoundFlags");
+					dp->unpackF32(cutoff, "SoundRadius");
+				}
+
+				if (value & 0x100)
+				{
+					std::string name_value_list;
+					dp->unpackString(name_value_list, "NV");
+
+					setNameValueList(name_value_list);
+				}
+
+				mTotalCRC = crc;
+
+				setAttachedSound(sound_uuid, owner_id, gain, sound_flags);
+
+				// only get these flags on updates from sim, not cached ones
+				// Preload these five flags for every object.
+				// Finer shades require the object to be selected, and the selection manager
+				// stores the extended permission info.
+				U32 flags;
+				mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, block_num);
+				// keep local flags and overwrite remote-controlled flags
+				mFlags = (mFlags & FLAGS_LOCAL) | flags;
+
+					// ...new objects that should come in selected need to be added to the selected list
+				mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0);
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	//
+	// Fix object parenting.
+	//
+	BOOL b_changed_status = FALSE;
+
+	if (OUT_TERSE_IMPROVED != update_type)
+	{
+		// We only need to update parenting on full updates, terse updates
+		// don't send parenting information.
+		if (!cur_parentp)
+		{
+			if (parent_id == 0)
+			{
+				// No parent now, no parent in message -> do nothing
+			}
+			else
+			{
+				// No parent now, new parent in message -> attach to that parent if possible
+				LLUUID parent_uuid;
+				LLViewerObjectList::getUUIDFromLocal(parent_uuid,
+														parent_id,
+														mesgsys->getSenderIP(),
+														mesgsys->getSenderPort());
+
+				LLViewerObject *sent_parentp = gObjectList.findObject(parent_uuid);
+
+				//
+				// Check to see if we have the corresponding viewer object for the parent.
+				//
+				if (sent_parentp && sent_parentp->getParent() == this)
+				{
+					// Try to recover if we attempt to attach a parent to its child
+					llwarns << "Attempt to attach a parent to it's child: " << this->getID() << " to " << sent_parentp->getID() << llendl;
+					this->removeChild(sent_parentp);
+					sent_parentp->setDrawableParent(NULL);
+				}
+				
+				if (sent_parentp && (sent_parentp != this) && !sent_parentp->isDead())
+				{
+					//
+					// We have a viewer object for the parent, and it's not dead.
+					// Do the actual reparenting here.
+					//
+
+					// new parent is valid
+					b_changed_status = TRUE;
+					// ...no current parent, so don't try to remove child
+					if (mDrawable.notNull())
+					{
+						if (mDrawable->isDead() || !mDrawable->getVObj())
+						{
+							llwarns << "Drawable is dead or no VObj!" << llendl;
+							sent_parentp->addChild(this);
+						}
+						else
+						{
+							if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 1
+							{
+								// Bad, we got a cycle somehow.
+								// Kill both the parent and the child, and
+								// set cache misses for both of them.
+								llwarns << "Attempting to recover from parenting cycle!" << llendl;
+								llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl;
+								llwarns << "Adding to cache miss list" << llendl;
+								setParent(NULL);
+								sent_parentp->setParent(NULL);
+								getRegion()->addCacheMissFull(getLocalID());
+								getRegion()->addCacheMissFull(sent_parentp->getLocalID());
+								gObjectList.killObject(sent_parentp);
+								gObjectList.killObject(this);
+								return retval;
+							}
+							sent_parentp->addChild(this);
+							// make sure this object gets a non-damped update
+							if (sent_parentp->mDrawable.notNull())
+							{
+								gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped
+							}
+						}
+					}
+					else
+					{
+						sent_parentp->addChild(this);
+					}
+					
+					// Show particles, icon and HUD
+					hideExtraDisplayItems( FALSE );
+
+					setChanged(MOVED | SILHOUETTE);
+				}
+				else
+				{
+					//
+					// No corresponding viewer object for the parent, put the various
+					// pieces on the orphan list.
+					//
+					
+					//parent_id
+					U32 ip = mesgsys->getSenderIP();
+					U32 port = mesgsys->getSenderPort();
+					
+					gObjectList.orphanize(this, parent_id, ip, port);
+
+					// Hide particles, icon and HUD
+					hideExtraDisplayItems( TRUE );
+				}
+			}
+		}
+		else
+		{
+			// BUG: this is a bad assumption once border crossing is alowed
+			if (  (parent_id == cur_parentp->mLocalID)
+				&&(update_type == OUT_TERSE_IMPROVED))
+			{
+				// Parent now, same parent in message -> do nothing
+
+				// Debugging for suspected problems with local ids.
+				//LLUUID parent_uuid;
+				//LLViewerObjectList::getUUIDFromLocal(parent_uuid, parent_id, mesgsys->getSenderIP(), mesgsys->getSenderPort() );
+				//if (parent_uuid != cur_parentp->getID() )
+				//{
+				//	llerrs << "Local ID match but UUID mismatch of viewer object" << llendl;
+				//}
+			}
+			else
+			{
+				// Parented now, different parent in message
+				LLViewerObject *sent_parentp;
+				if (parent_id == 0)
+				{
+					//
+					// This object is no longer parented, we sent in a zero parent ID.
+					//
+					sent_parentp = NULL;
+				}
+				else
+				{
+					LLUUID parent_uuid;
+					LLViewerObjectList::getUUIDFromLocal(parent_uuid,
+														parent_id,
+														gMessageSystem->getSenderIP(),
+														gMessageSystem->getSenderPort());
+					sent_parentp = gObjectList.findObject(parent_uuid);
+					
+					if (isAvatar())
+					{
+						// This logic is meant to handle the case where a sitting avatar has reached a new sim
+						// ahead of the object she was sitting on (which is common as objects are transfered through
+						// a slower route than agents)...
+						// In this case, the local id for the object will not be valid, since the viewer has not received
+						// a full update for the object from that sim yet, so we assume that the agent is still sitting
+						// where she was originally. --RN
+						if (!sent_parentp)
+						{
+							sent_parentp = cur_parentp;
+						}
+					}
+					else if (!sent_parentp)
+					{
+						//
+						// Switching parents, but we don't know the new parent.
+						//
+						U32 ip = mesgsys->getSenderIP();
+						U32 port = mesgsys->getSenderPort();
+
+						// We're an orphan, flag things appropriately.
+						gObjectList.orphanize(this, parent_id, ip, port);
+					}
+				}
+
+				// Reattach if possible.
+				if (sent_parentp && sent_parentp != cur_parentp && sent_parentp != this)
+				{
+					// New parent is valid, detach and reattach
+					b_changed_status = TRUE;
+					if (mDrawable.notNull())
+					{
+						if (!setDrawableParent(sent_parentp->mDrawable)) // LLViewerObject::processUpdateMessage 2
+						{
+							// Bad, we got a cycle somehow.
+							// Kill both the parent and the child, and
+							// set cache misses for both of them.
+							llwarns << "Attempting to recover from parenting cycle!" << llendl;
+							llwarns << "Killing " << sent_parentp->getID() << " and " << getID() << llendl;
+							llwarns << "Adding to cache miss list" << llendl;
+							setParent(NULL);
+							sent_parentp->setParent(NULL);
+							getRegion()->addCacheMissFull(getLocalID());
+							getRegion()->addCacheMissFull(sent_parentp->getLocalID());
+							gObjectList.killObject(sent_parentp);
+							gObjectList.killObject(this);
+							return retval;
+						}
+						// make sure this object gets a non-damped update
+					}
+					cur_parentp->removeChild(this);
+					sent_parentp->addChild(this);
+					setChanged(MOVED | SILHOUETTE);
+					sent_parentp->setChanged(MOVED | SILHOUETTE);
+					if (sent_parentp->mDrawable.notNull())
+					{
+						gPipeline.markMoved(sent_parentp->mDrawable, FALSE); // undamped
+					}
+				}
+				else if (!sent_parentp)
+				{
+					bool remove_parent = true;
+					// No new parent, or the parent that we sent doesn't exist on the viewer.
+					LLViewerObject *parentp = (LLViewerObject *)getParent();
+					if (parentp)
+					{
+						if (parentp->getRegion() != getRegion())
+						{
+							// This is probably an object flying across a region boundary, the
+							// object probably ISN'T being reparented, but just got an object
+							// update out of order (child update before parent).
+							//llinfos << "Don't reparent object handoffs!" << llendl;
+							remove_parent = false;
+						}
+					}
+
+					if (remove_parent)
+					{
+						b_changed_status = TRUE;
+						if (mDrawable.notNull())
+						{
+							// clear parent to removeChild can put the drawable on the damped list
+							setDrawableParent(NULL); // LLViewerObject::processUpdateMessage 3
+						}
+
+						cur_parentp->removeChild(this);
+
+						if (mJointInfo && !parent_id)
+						{
+							// since this object is no longer parent-relative
+							// we make sure we delete any joint info
+							delete mJointInfo;
+							mJointInfo = NULL;
+						}
+
+						setChanged(MOVED | SILHOUETTE);
+
+						if (mDrawable.notNull())
+						{
+							// make sure this object gets a non-damped update
+							gPipeline.markMoved(mDrawable, FALSE); // undamped
+						}
+					}
+				}
+			}
+		}
+	}
+
+	new_rot.normQuat();
+
+	if (sPingInterpolate)
+	{ 
+		LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender());
+		if (cdp)
+		{
+			F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped);
+			LLVector3 diff = getVelocity() * ping_delay; 
+			new_pos_parent += diff;
+		}
+		else
+		{
+			llwarns << "findCircuit() returned NULL; skipping interpolation" << llendl;
+		}
+	}
+
+	//////////////////////////
+	//
+	// Set the generic change flags...
+	//
+	//
+
+	// WTF?   If we're going to skip this message, why are we 
+	// doing all the parenting, etc above?
+	U32 packet_id = mesgsys->getCurrentRecvPacketID(); 
+	if (packet_id < mLatestRecvPacketID && 
+		mLatestRecvPacketID - packet_id < 65536)
+	{
+		//skip application of this message, it's old
+		return retval;
+	}
+
+	mLatestRecvPacketID = packet_id;
+
+	// Set the change flags for scale
+	if (new_scale != getScale())
+	{
+		setChanged(SCALED | SILHOUETTE);
+		setScale(new_scale);  // Must follow setting permYouOwner()
+	}
+
+	// first, let's see if the new position is actually a change
+
+	//static S32 counter = 0;
+
+	F32 vel_mag_sq = getVelocity().magVecSquared();
+	F32 accel_mag_sq = getAcceleration().magVecSquared();
+
+	if (  ((b_changed_status)||(test_pos_parent != new_pos_parent))
+		||(  (!isSelected())
+		   &&(  (vel_mag_sq != 0.f)
+			  ||(accel_mag_sq != 0.f)
+			  ||(this_update_precision > mBestUpdatePrecision))))
+	{
+		mBestUpdatePrecision = this_update_precision;
+		
+		LLVector3 diff = new_pos_parent - test_pos_parent ;
+		F32 mag_sqr = diff.magVecSquared() ;
+		if(llfinite(mag_sqr)) 
+		{
+			setPositionParent(new_pos_parent);
+		}
+		else
+		{
+			llwarns << "Can not move the object/avatar to an infinite location!" << llendl ;	
+
+			retval |= INVALID_UPDATE ;
+		}
+
+		if (mParent && ((LLViewerObject*)mParent)->isAvatar())
+		{
+			// we have changed the position of an attachment, so we need to clamp it
+			LLVOAvatar *avatar = (LLVOAvatar*)mParent;
+
+			avatar->clampAttachmentPositions();
+		}
+		
+		// If we're snapping the position by more than 0.5m, update LLViewerStats::mAgentPositionSnaps
+		if ( asAvatar() && asAvatar()->isSelf() && (mag_sqr > 0.25f) )
+		{
+			LLViewerStats::getInstance()->mAgentPositionSnaps.push( diff.length() );
+		}
+	}
+
+	if (new_rot != mLastRot
+		|| new_angv != old_angv)
+	{
+		if (new_rot != mLastRot)
+		{
+			mLastRot = new_rot;
+			setRotation(new_rot);
+		}
+		
+		setChanged(ROTATED | SILHOUETTE);
+		
+		resetRot();
+	}
+
+
+	if ( gShowObjectUpdates )
+	{
+		if (!((mPrimitiveCode == LL_PCODE_LEGACY_AVATAR) && (((LLVOAvatar *) this)->isSelf()))
+			&& mRegionp)
+		{
+			LLViewerObject* object = gObjectList.createObjectViewer(LL_PCODE_LEGACY_TEXT_BUBBLE, mRegionp);
+			LLVOTextBubble* bubble = (LLVOTextBubble*) object;
+
+			if (update_type == OUT_TERSE_IMPROVED)
+			{
+				bubble->mColor.setVec(0.f, 0.f, 1.f, 1.f);
+			}
+			else
+			{
+				bubble->mColor.setVec(1.f, 0.f, 0.f, 1.f);
+			}
+			object->setPositionGlobal(getPositionGlobal());
+			gPipeline.addObject(object);
+		}
+	}
+
+	if ((0.0f == vel_mag_sq) && 
+		(0.0f == accel_mag_sq) &&
+		(0.0f == getAngularVelocity().magVecSquared()))
+	{
+		mStatic = TRUE; // This object doesn't move!
+	}
+	else
+	{
+		mStatic = FALSE;
+	}
+
+// BUG: This code leads to problems during group rotate and any scale operation.
+// Small discepencies between the simulator and viewer representations cause the 
+// selection center to creep, leading to objects moving around the wrong center.
+// 
+// Removing this, however, means that if someone else drags an object you have
+// selected, your selection center and dialog boxes will be wrong.  It also means
+// that higher precision information on selected objects will be ignored.
+//
+// I believe the group rotation problem is fixed.  JNC 1.21.2002
+//
+	// Additionally, if any child is selected, need to update the dialogs and selection
+	// center.
+	BOOL needs_refresh = mUserSelected;
+	for (child_list_t::iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		needs_refresh = needs_refresh || child->mUserSelected;
+	}
+
+	if (needs_refresh)
+	{
+		LLSelectMgr::getInstance()->updateSelectionCenter();
+		dialog_refresh_all();
+	} 
+
+
+	// Mark update time as approx. now, with the ping delay.
+	// Ping delay is off because it's not set for velocity interpolation, causing
+	// much jumping and hopping around...
+
+//	U32 ping_delay = mesgsys->mCircuitInfo.getPingDelay();
+	mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds();
+	mLastMessageUpdateSecs = mLastInterpUpdateSecs;
+	if (mDrawable.notNull())
+	{
+		// Don't clear invisibility flag on update if still orphaned!
+		if (mDrawable->isState(LLDrawable::FORCE_INVISIBLE) && !mOrphaned)
+		{
+// 			lldebugs << "Clearing force invisible: " << mID << ":" << getPCodeString() << ":" << getPositionAgent() << llendl;
+			mDrawable->setState(LLDrawable::CLEAR_INVISIBLE);
+		}
+	}
+
+	// Update special hover cursor status
+	bool special_hover_cursor = specialHoverCursor();
+	if (old_special_hover_cursor != special_hover_cursor
+		&& mDrawable.notNull())
+	{
+		mDrawable->updateSpecialHoverCursor(special_hover_cursor);
+	}
+
+	return retval;
+}
+
+BOOL LLViewerObject::isActive() const
+{
+	return TRUE;
+}
+
+
+
+BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+{
+	static LLFastTimer::DeclareTimer ftm("Viewer Object");
+	LLFastTimer t(ftm);
+
+	if (mDead)
+	{
+		// It's dead.  Don't update it.
+		return TRUE;
+	}
+
+	// CRO - don't velocity interp linked objects!
+	// Leviathan - but DO velocity interp joints
+	if (!mStatic && sVelocityInterpolate && !isSelected())
+	{
+		// calculate dt from last update
+		F32 dt_raw = (F32)(time - mLastInterpUpdateSecs);
+		F32 dt = mTimeDilation * dt_raw;
+
+		if (!mJointInfo)
+		{
+			applyAngularVelocity(dt);
+		}
+
+		LLViewerObject *parentp = (LLViewerObject *) getParent();
+		if (mJointInfo)
+		{
+			if (parentp)
+			{
+				// do parent-relative stuff
+				LLVector3 ang_vel = getAngularVelocity();
+				F32 omega = ang_vel.magVecSquared();
+				F32 angle = 0.0f;
+				LLQuaternion dQ;
+				if (omega > 0.00001f)
+				{
+					omega = sqrt(omega);
+					angle = omega * dt;
+					dQ.setQuat(angle, ang_vel);
+				}
+				LLVector3 pos = getPosition();
+	
+				if (HJT_HINGE == mJointInfo->mJointType)
+				{
+					// hinge = uniform circular motion
+					LLVector3 parent_pivot = getVelocity();
+					LLVector3 parent_axis = getAcceleration();
+	
+					angle = dt * (ang_vel * mJointInfo->mAxisOrAnchor);	// AxisOrAnchor = axis
+					dQ.setQuat(angle, mJointInfo->mAxisOrAnchor);		// AxisOrAnchor = axis
+					LLVector3 pivot_offset = pos - mJointInfo->mPivot;	// pos in pivot-frame
+					pivot_offset = pivot_offset * dQ;					// new rotated pivot-frame pos
+					pos = mJointInfo->mPivot + pivot_offset;			// parent-frame
+					LLViewerObject::setPosition(pos);
+					LLQuaternion Q_PC = getRotation();
+					setRotation(Q_PC * dQ);
+					mLastInterpUpdateSecs = time;
+				}
+				else if (HJT_POINT == mJointInfo->mJointType)
+						// || HJT_LPOINT == mJointInfo->mJointType)
+				{
+					// point-to-point = spin about axis and uniform circular motion
+					// 					of axis about the pivot point
+					//
+					// NOTE: this interpolation scheme is not quite good enough to
+					// reduce the bandwidth -- needs a gravitational correction. 
+					// Similarly for hinges with axes that deviate from vertical.
+	
+					LLQuaternion Q_PC = getRotation();
+					Q_PC = Q_PC * dQ;
+					setRotation(Q_PC);
+
+					LLVector3 pivot_to_child = - mJointInfo->mAxisOrAnchor;	// AxisOrAnchor = anchor
+					pos = mJointInfo->mPivot + pivot_to_child * Q_PC;
+					LLViewerObject::setPosition(pos);
+					mLastInterpUpdateSecs = time;
+				}
+				/* else if (HJT_WHEEL == mJointInfo->mJointInfo)
+				{
+					// wheel = uniform rotation about axis, with linear
+					//		   velocity interpolation (if any)
+					LLVector3 parent_axis = getAcceleration();	// HACK -- accel stores the parent-axis (parent-frame)
+	
+					LLQuaternion Q_PC = getRotation();
+	
+					angle = dt * (parent_axis * ang_vel);
+					dQ.setQuat(angle, parent_axis);
+	
+					Q_PC = Q_PC * dQ;
+					setRotation(Q_PC);
+
+					pos = getPosition() + dt * getVelocity();
+					LLViewerObject::setPosition(pos);
+					mLastInterpUpdateSecs = time;
+				}*/
+			}
+		}
+		else if (isAttachment())
+		{
+			mLastInterpUpdateSecs = time;
+			return TRUE;
+		}
+		else
+		{	// Move object based on it's velocity and rotation
+			interpolateLinearMotion(time, dt);
+		}
+	}
+
+	updateDrawable(FALSE);
+
+	return TRUE;
+}
+
+
+// Move an object due to idle-time viewer side updates by iterpolating motion
+void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
+{
+	// linear motion
+	// PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object
+	// updates represents the average velocity of the last timestep, rather than the final velocity.
+	// the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically
+	// 
+	// *TODO: should also wrap linear accel/velocity in check
+	// to see if object is selected, instead of explicitly
+	// zeroing it out	
+
+	F64 time_since_last_update = time - mLastMessageUpdateSecs;
+	if (time_since_last_update <= 0.0 || dt <= 0.f)
+	{
+		return;
+	}
+
+	LLVector3 accel = getAcceleration();
+	LLVector3 vel 	= getVelocity();
+	
+	if (sMaxUpdateInterpolationTime <= 0.0)
+	{	// Old code path ... unbounded, simple interpolation
+		if (!(accel.isExactlyZero() && vel.isExactlyZero()))
+		{
+			LLVector3 pos   = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;  
+		
+			// region local  
+			setPositionRegion(pos + getPositionRegion());
+			setVelocity(vel + accel*dt);	
+			
+			// for objects that are spinning but not translating, make sure to flag them as having moved
+			setChanged(MOVED | SILHOUETTE);
+		}
+	}
+	else if (!accel.isExactlyZero() || !vel.isExactlyZero())		// object is moving
+	{	// Object is moving, and hasn't been too long since we got an update from the server
+		
+		// Calculate predicted position and velocity
+		LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt;	
+		LLVector3 new_v = accel * dt;
+
+		if (time_since_last_update > sPhaseOutUpdateInterpolationTime &&
+			sPhaseOutUpdateInterpolationTime > 0.0)
+		{	// Haven't seen a viewer update in a while, check to see if the ciruit is still active
+			if (mRegionp)
+			{	// The simulator will NOT send updates if the object continues normally on the path
+				// predicted by the velocity and the acceleration (often gravity) sent to the viewer
+				// So check to see if the circuit is blocked, which means the sim is likely in a long lag
+				LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() );
+				if (cdp)
+				{
+					// Find out how many seconds since last packet arrived on the circuit
+					F64 time_since_last_packet = LLMessageSystem::getMessageTimeSeconds() - cdp->getLastPacketInTime();
+
+					if (!cdp->isAlive() ||		// Circuit is dead or blocked
+						 cdp->isBlocked() ||	// or doesn't seem to be getting any packets
+						 (time_since_last_packet > sPhaseOutUpdateInterpolationTime))
+					{
+						// Start to reduce motion interpolation since we haven't seen a server update in a while
+						F64 time_since_last_interpolation = time - mLastInterpUpdateSecs;
+						F64 phase_out = 1.0;
+						if (time_since_last_update > sMaxUpdateInterpolationTime)
+						{	// Past the time limit, so stop the object
+							phase_out = 0.0;
+							//llinfos << "Motion phase out to zero" << llendl;
+
+							// Kill angular motion as well.  Note - not adding this due to paranoia
+							// about stopping rotation for llTargetOmega objects and not having it restart
+							// setAngularVelocity(LLVector3::zero);
+						}
+						else if (mLastInterpUpdateSecs - mLastMessageUpdateSecs > sPhaseOutUpdateInterpolationTime)
+						{	// Last update was already phased out a bit
+							phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / 
+										(sMaxUpdateInterpolationTime - time_since_last_interpolation);
+							//llinfos << "Continuing motion phase out of " << (F32) phase_out << llendl;
+						}
+						else
+						{	// Phase out from full value
+							phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / 
+										(sMaxUpdateInterpolationTime - sPhaseOutUpdateInterpolationTime);
+							//llinfos << "Starting motion phase out of " << (F32) phase_out << llendl;
+						}
+						phase_out = llclamp(phase_out, 0.0, 1.0);
+
+						new_pos = new_pos * ((F32) phase_out);
+						new_v = new_v * ((F32) phase_out);
+					}
+				}
+			}
+		}
+
+		new_pos = new_pos + getPositionRegion();
+		new_v = new_v + vel;
+
+
+		// Clamp interpolated position to minimum underground and maximum region height
+		LLVector3d new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos);
+		F32 min_height;
+		if (isAvatar())
+		{	// Make a better guess about AVs not going underground
+			min_height = LLWorld::getInstance()->resolveLandHeightGlobal(new_pos_global);
+			min_height += (0.5f * getScale().mV[VZ]);
+		}
+		else
+		{	// This will put the object underground, but we can't tell if it will stop 
+			// at ground level or not
+			min_height = LLWorld::getInstance()->getMinAllowedZ(this, new_pos_global);
+		}
+
+		new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]);
+		new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]);
+
+		// Check to see if it's going off the region
+		LLVector3 temp(new_pos);
+		if (temp.clamp(0.f, mRegionp->getWidth()))
+		{	// Going off this region, so see if we might end up on another region
+			LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
+			new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos);		// Re-fetch in case it got clipped above
+
+			// Clip the positions to known regions
+			LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global);
+			if (clip_pos_global != new_pos_global)
+			{	// Was clipped, so this means we hit a edge where there is no region to enter
+				
+				//llinfos << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global)
+				//	<< " from " << new_pos << llendl;
+				new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global);
+				
+				// Stop motion and get server update for bouncing on the edge
+				new_v.clear();
+				setAcceleration(LLVector3::zero);
+			}
+			else
+			{	// Let predicted movement cross into another region
+				//llinfos << "Predicting region crossing to " << new_pos << llendl;
+			}
+		}
+
+		// Set new position and velocity
+		setPositionRegion(new_pos);
+		setVelocity(new_v);	
+		
+		// for objects that are spinning but not translating, make sure to flag them as having moved
+		setChanged(MOVED | SILHOUETTE);
+	}		
+
+	// Update the last time we did anything
+	mLastInterpUpdateSecs = time;
+}
+
+
+
+BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	
+	delete [] mData;
+
+	if (datap)
+	{
+		mData = new U8[data_size];
+		if (!mData)
+		{
+			return FALSE;
+		}
+		memcpy(mData, datap, data_size);		/* Flawfinder: ignore */
+	}
+	return TRUE;
+}
+
+// delete an item in the inventory, but don't tell the server. This is
+// used internally by remove, update, and savescript.
+// This will only delete the first item with an item_id in the list
+void LLViewerObject::deleteInventoryItem(const LLUUID& item_id)
+{
+	if(mInventory)
+	{
+		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+		LLInventoryObject::object_list_t::iterator end = mInventory->end();
+		for( ; it != end; ++it )
+		{
+			if((*it)->getUUID() == item_id)
+			{
+				// This is safe only because we return immediatly.
+				mInventory->erase(it); // will deref and delete it
+				return;
+			}
+		}
+		doInventoryCallback();
+	}
+}
+
+void LLViewerObject::doUpdateInventory(
+	LLPointer<LLViewerInventoryItem>& item,
+	U8 key,
+	bool is_new)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+	LLViewerInventoryItem* old_item = NULL;
+	if(TASK_INVENTORY_ITEM_KEY == key)
+	{
+		old_item = (LLViewerInventoryItem*)getInventoryObject(item->getUUID());
+	}
+	else if(TASK_INVENTORY_ASSET_KEY == key)
+	{
+		old_item = getInventoryItemByAsset(item->getAssetUUID());
+	}
+	LLUUID item_id;
+	LLUUID new_owner;
+	LLUUID new_group;
+	BOOL group_owned = FALSE;
+	if(old_item)
+	{
+		item_id = old_item->getUUID();
+		new_owner = old_item->getPermissions().getOwner();
+		new_group = old_item->getPermissions().getGroup();
+		group_owned = old_item->getPermissions().isGroupOwned();
+		old_item = NULL;
+	}
+	else
+	{
+		item_id = item->getUUID();
+	}
+	if(!is_new && mInventory)
+	{
+		// Attempt to update the local inventory. If we can get the
+		// object perm, we have perfect visibility, so we want the
+		// serial number to match. Otherwise, take our best guess and
+		// make sure that the serial number does not match.
+		deleteInventoryItem(item_id);
+		LLPermissions perm(item->getPermissions());
+		LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this);
+		bool is_atomic = ((S32)LLAssetType::AT_OBJECT == item->getType()) ? false : true;
+		if(obj_perm)
+		{
+			perm.setOwnerAndGroup(LLUUID::null, obj_perm->getOwner(), obj_perm->getGroup(), is_atomic);
+		}
+		else
+		{
+			if(group_owned)
+			{
+				perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic);
+			}
+			else if(!new_owner.isNull())
+			{
+				// The object used to be in inventory, so we can
+				// assume the owner and group will match what they are
+				// there.
+				perm.setOwnerAndGroup(LLUUID::null, new_owner, new_group, is_atomic);
+			}
+			// *FIX: can make an even better guess by using the mPermGroup flags
+			else if(permYouOwner())
+			{
+				// best guess.
+				perm.setOwnerAndGroup(LLUUID::null, gAgent.getID(), item->getPermissions().getGroup(), is_atomic);
+				--mInventorySerialNum;
+			}
+			else
+			{
+				// dummy it up.
+				perm.setOwnerAndGroup(LLUUID::null, LLUUID::null, LLUUID::null, is_atomic);
+				--mInventorySerialNum;
+			}
+		}
+		LLViewerInventoryItem* oldItem = item;
+		LLViewerInventoryItem* new_item = new LLViewerInventoryItem(oldItem);
+		new_item->setPermissions(perm);
+		mInventory->push_front(new_item);
+		doInventoryCallback();
+		++mInventorySerialNum;
+	}
+}
+
+// save a script, which involves removing the old one, and rezzing
+// in the new one. This method should be called with the asset id
+// of the new and old script AFTER the bytecode has been saved.
+void LLViewerObject::saveScript(
+	const LLViewerInventoryItem* item,
+	BOOL active,
+	bool is_new)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+
+	/*
+	 * XXXPAM Investigate not making this copy.  Seems unecessary, but I'm unsure about the
+	 * interaction with doUpdateInventory() called below.
+	 */
+	lldebugs << "LLViewerObject::saveScript() " << item->getUUID() << " " << item->getAssetUUID() << llendl;
+	LLPointer<LLViewerInventoryItem> task_item =
+		new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
+								  item->getAssetUUID(), item->getType(),
+								  item->getInventoryType(),
+								  item->getName(), item->getDescription(),
+								  item->getSaleInfo(), item->getFlags(),
+								  item->getCreationDate());
+	task_item->setTransactionID(item->getTransactionID());
+
+	LLMessageSystem* msg = gMessageSystem;
+	msg->newMessageFast(_PREHASH_RezScript);
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
+	msg->nextBlockFast(_PREHASH_UpdateBlock);
+	msg->addU32Fast(_PREHASH_ObjectLocalID, (mLocalID));
+	U8 enabled = active;
+	msg->addBOOLFast(_PREHASH_Enabled, enabled);
+	msg->nextBlockFast(_PREHASH_InventoryBlock);
+	task_item->packMessage(msg);
+	msg->sendReliable(mRegionp->getHost());
+
+	// do the internal logic
+	doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, is_new);
+}
+
+void LLViewerObject::moveInventory(const LLUUID& folder_id,
+								   const LLUUID& item_id)
+{
+	lldebugs << "LLViewerObject::moveInventory " << item_id << llendl;
+	LLMessageSystem* msg = gMessageSystem;
+	msg->newMessageFast(_PREHASH_MoveTaskInventory);
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	msg->addUUIDFast(_PREHASH_FolderID, folder_id);
+	msg->nextBlockFast(_PREHASH_InventoryData);
+	msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+	msg->addUUIDFast(_PREHASH_ItemID, item_id);
+	msg->sendReliable(mRegionp->getHost());
+
+	LLInventoryObject* inv_obj = getInventoryObject(item_id);
+	if(inv_obj)
+	{
+		LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_obj;
+		if(!item->getPermissions().allowCopyBy(gAgent.getID()))
+		{
+			deleteInventoryItem(item_id);
+			++mInventorySerialNum;
+		}
+	}
+}
+
+void LLViewerObject::dirtyInventory()
+{
+	// If there aren't any LLVOInventoryListeners, we won't be
+	// able to update our mInventory when it comes back from the
+	// simulator, so we should not clear the inventory either.
+	if(mInventory && !mInventoryCallbacks.empty())
+	{
+		mInventory->clear(); // will deref and delete entries
+		delete mInventory;
+		mInventory = NULL;
+		mInventoryDirty = TRUE;
+	}
+}
+
+void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	
+	LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo;
+	info->mListener = listener;
+	info->mInventoryData = user_data;
+	mInventoryCallbacks.push_front(info);
+}
+
+void LLViewerObject::removeInventoryListener(LLVOInventoryListener* listener)
+{
+	if (listener == NULL)
+		return;
+	for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
+		 iter != mInventoryCallbacks.end(); )
+	{
+		callback_list_t::iterator curiter = iter++;
+		LLInventoryCallbackInfo* info = *curiter;
+		if (info->mListener == listener)
+		{
+			delete info;
+			mInventoryCallbacks.erase(curiter);
+			break;
+		}
+	}
+}
+
+void LLViewerObject::clearInventoryListeners()
+{
+	for_each(mInventoryCallbacks.begin(), mInventoryCallbacks.end(), DeletePointer());
+	mInventoryCallbacks.clear();
+}
+
+void LLViewerObject::requestInventory()
+{
+	mInventoryDirty = FALSE;
+	if(mInventory)
+	{
+		//mInventory->clear() // will deref and delete it
+		//delete mInventory;
+		//mInventory = NULL;
+		doInventoryCallback();
+	}
+	// throw away duplicate requests
+	else
+	{
+		fetchInventoryFromServer();
+	}
+}
+
+void LLViewerObject::fetchInventoryFromServer()
+{
+	if (!mInventoryPending)
+	{
+		delete mInventory;
+		mInventory = NULL;
+		mInventoryDirty = FALSE;
+		LLMessageSystem* msg = gMessageSystem;
+		msg->newMessageFast(_PREHASH_RequestTaskInventory);
+		msg->nextBlockFast(_PREHASH_AgentData);
+		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+		msg->nextBlockFast(_PREHASH_InventoryData);
+		msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+		msg->sendReliable(mRegionp->getHost());
+
+		// this will get reset by dirtyInventory or doInventoryCallback
+		mInventoryPending = TRUE;
+	}
+}
+
+struct LLFilenameAndTask
+{
+	LLUUID mTaskID;
+	std::string mFilename;
+#ifdef _DEBUG
+	static S32 sCount;
+	LLFilenameAndTask()
+	{
+		++sCount;
+		lldebugs << "Constructing LLFilenameAndTask: " << sCount << llendl;
+	}
+	~LLFilenameAndTask()
+	{
+		--sCount;
+		lldebugs << "Destroying LLFilenameAndTask: " << sCount << llendl;
+	}
+private:
+	LLFilenameAndTask(const LLFilenameAndTask& rhs);
+	const LLFilenameAndTask& operator=(const LLFilenameAndTask& rhs) const;
+#endif
+};
+
+#ifdef _DEBUG
+S32 LLFilenameAndTask::sCount = 0;
+#endif
+
+// static
+void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	
+	LLUUID task_id;
+	msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_TaskID, task_id);
+	LLViewerObject* object = gObjectList.findObject(task_id);
+	if(!object)
+	{
+		llwarns << "LLViewerObject::processTaskInv object "
+			<< task_id << " does not exist." << llendl;
+		return;
+	}
+
+	msg->getS16Fast(_PREHASH_InventoryData, _PREHASH_Serial, object->mInventorySerialNum);
+	LLFilenameAndTask* ft = new LLFilenameAndTask;
+	ft->mTaskID = task_id;
+
+	std::string unclean_filename;
+	msg->getStringFast(_PREHASH_InventoryData, _PREHASH_Filename, unclean_filename);
+	ft->mFilename = LLDir::getScrubbedFileName(unclean_filename);
+	
+	if(ft->mFilename.empty())
+	{
+		lldebugs << "Task has no inventory" << llendl;
+		// mock up some inventory to make a drop target.
+		if(object->mInventory)
+		{
+			object->mInventory->clear(); // will deref and delete it
+		}
+		else
+		{
+			object->mInventory = new LLInventoryObject::object_list_t();
+		}
+		LLPointer<LLInventoryObject> obj;
+		obj = new LLInventoryObject(object->mID, LLUUID::null,
+									LLAssetType::AT_CATEGORY,
+									LLTrans::getString("ViewerObjectContents").c_str());
+		object->mInventory->push_front(obj);
+		object->doInventoryCallback();
+		delete ft;
+		return;
+	}
+	gXferManager->requestFile(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ft->mFilename), 
+								ft->mFilename, LL_PATH_CACHE,
+								object->mRegionp->getHost(),
+								TRUE,
+								&LLViewerObject::processTaskInvFile,
+								(void**)ft,
+								LLXferManager::HIGH_PRIORITY);
+}
+
+void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status)
+{
+	LLFilenameAndTask* ft = (LLFilenameAndTask*)user_data;
+	LLViewerObject* object = NULL;
+	if(ft && (0 == error_code) &&
+	   (object = gObjectList.findObject(ft->mTaskID)))
+	{
+		object->loadTaskInvFile(ft->mFilename);
+	}
+	else
+	{
+		// This Occurs When to requests were made, and the first one
+		// has already handled it.
+		lldebugs << "Problem loading task inventory. Return code: "
+				 << error_code << llendl;
+	}
+	delete ft;
+}
+
+void LLViewerObject::loadTaskInvFile(const std::string& filename)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	
+	std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename);
+	llifstream ifs(filename_and_local_path);
+	if(ifs.good())
+	{
+		char buffer[MAX_STRING];	/* Flawfinder: ignore */
+		// *NOTE: This buffer size is hard coded into scanf() below.
+		char keyword[MAX_STRING];	/* Flawfinder: ignore */
+		if(mInventory)
+		{
+			mInventory->clear(); // will deref and delete it
+		}
+		else
+		{
+			mInventory = new LLInventoryObject::object_list_t;
+		}
+		while(ifs.good())
+		{
+			ifs.getline(buffer, MAX_STRING);
+			sscanf(buffer, " %254s", keyword);	/* Flawfinder: ignore */
+			if(0 == strcmp("inv_item", keyword))
+			{
+				LLPointer<LLInventoryObject> inv = new LLViewerInventoryItem;
+				inv->importLegacyStream(ifs);
+				mInventory->push_front(inv);
+			}
+			else if(0 == strcmp("inv_object", keyword))
+			{
+				LLPointer<LLInventoryObject> inv = new LLInventoryObject;
+				inv->importLegacyStream(ifs);
+				inv->rename(LLTrans::getString("ViewerObjectContents").c_str());
+				mInventory->push_front(inv);
+			}
+			else
+			{
+				llwarns << "Unknown token in inventory file '"
+						<< keyword << "'" << llendl;
+			}
+		}
+		ifs.close();
+		LLFile::remove(filename_and_local_path);
+	}
+	else
+	{
+		llwarns << "unable to load task inventory: " << filename_and_local_path
+				<< llendl;
+	}
+	doInventoryCallback();
+}
+
+void LLViewerObject::doInventoryCallback()
+{
+	for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
+		 iter != mInventoryCallbacks.end(); )
+	{
+		callback_list_t::iterator curiter = iter++;
+		LLInventoryCallbackInfo* info = *curiter;
+		if (info->mListener != NULL)
+		{
+			info->mListener->inventoryChanged(this,
+								 mInventory,
+								 mInventorySerialNum,
+								 info->mInventoryData);
+		}
+		else
+		{
+			llinfos << "LLViewerObject::doInventoryCallback() deleting bad listener entry." << llendl;
+			delete info;
+			mInventoryCallbacks.erase(curiter);
+		}
+	}
+	mInventoryPending = FALSE;
+}
+
+void LLViewerObject::removeInventory(const LLUUID& item_id)
+{
+	// close any associated floater properties
+	LLFloaterReg::hideInstance("properties", item_id);
+
+	LLMessageSystem* msg = gMessageSystem;
+	msg->newMessageFast(_PREHASH_RemoveTaskInventory);
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	msg->nextBlockFast(_PREHASH_InventoryData);
+	msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+	msg->addUUIDFast(_PREHASH_ItemID, item_id);
+	msg->sendReliable(mRegionp->getHost());
+	deleteInventoryItem(item_id);
+	++mInventorySerialNum;
+}
+
+void LLViewerObject::updateInventory(
+	LLViewerInventoryItem* item,
+	U8 key,
+	bool is_new)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	
+	// This slices the object into what we're concerned about on the
+	// viewer. The simulator will take the permissions and transfer
+	// ownership.
+	LLPointer<LLViewerInventoryItem> task_item =
+		new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
+								  item->getAssetUUID(), item->getType(),
+								  item->getInventoryType(),
+								  item->getName(), item->getDescription(),
+								  item->getSaleInfo(),
+								  item->getFlags(),
+								  item->getCreationDate());
+	task_item->setTransactionID(item->getTransactionID());
+	LLMessageSystem* msg = gMessageSystem;
+	msg->newMessageFast(_PREHASH_UpdateTaskInventory);
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	msg->nextBlockFast(_PREHASH_UpdateData);
+	msg->addU32Fast(_PREHASH_LocalID, mLocalID);
+	msg->addU8Fast(_PREHASH_Key, key);
+	msg->nextBlockFast(_PREHASH_InventoryData);
+	task_item->packMessage(msg);
+	msg->sendReliable(mRegionp->getHost());
+
+	// do the internal logic
+	doUpdateInventory(task_item, key, is_new);
+}
+
+void LLViewerObject::updateInventoryLocal(LLInventoryItem* item, U8 key)
+{
+	LLPointer<LLViewerInventoryItem> task_item =
+		new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
+								  item->getAssetUUID(), item->getType(),
+								  item->getInventoryType(),
+								  item->getName(), item->getDescription(),
+								  item->getSaleInfo(), item->getFlags(),
+								  item->getCreationDate());
+
+	// do the internal logic
+	const bool is_new = false;
+	doUpdateInventory(task_item, key, is_new);
+}
+
+LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)
+{
+	LLInventoryObject* rv = NULL;
+	if(mInventory)
+	{
+		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+		LLInventoryObject::object_list_t::iterator end = mInventory->end();
+		for ( ; it != end; ++it)
+		{
+			if((*it)->getUUID() == item_id)
+			{
+				rv = *it;
+				break;
+			}
+		}		
+	}
+	return rv;
+}
+
+void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects)
+{
+	if(mInventory)
+	{
+		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+		LLInventoryObject::object_list_t::iterator end = mInventory->end();
+		for( ; it != end; ++it)
+		{
+			if ((*it)->getType() != LLAssetType::AT_CATEGORY)
+			{
+				objects.push_back(*it);
+			}
+		}
+	}
+}
+
+LLInventoryObject* LLViewerObject::getInventoryRoot()
+{
+	if (!mInventory || !mInventory->size())
+	{
+		return NULL;
+	}
+	return mInventory->back();
+}
+
+LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& asset_id)
+{
+	if (mInventoryDirty)
+		llwarns << "Peforming inventory lookup for object " << mID << " that has dirty inventory!" << llendl;
+
+	LLViewerInventoryItem* rv = NULL;
+	if(mInventory)
+	{
+		LLViewerInventoryItem* item = NULL;
+
+		LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+		LLInventoryObject::object_list_t::iterator end = mInventory->end();
+		for( ; it != end; ++it)
+		{
+			LLInventoryObject* obj = *it;
+			if(obj->getType() != LLAssetType::AT_CATEGORY)
+			{
+				// *FIX: gank-ass down cast!
+				item = (LLViewerInventoryItem*)obj;
+				if(item->getAssetUUID() == asset_id)
+				{
+					rv = item;
+					break;
+				}
+			}
+		}		
+	}
+	return rv;
+}
+
+void LLViewerObject::updateViewerInventoryAsset(
+					const LLViewerInventoryItem* item,
+					const LLUUID& new_asset)
+{
+	LLPointer<LLViewerInventoryItem> task_item =
+		new LLViewerInventoryItem(item);
+	task_item->setAssetUUID(new_asset);
+
+	// do the internal logic
+	doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, false);
+}
+
+void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
+{
+	if (getVolume())
+	{	//volumes calculate pixel area and angle per face
+		return;
+	}
+	
+	LLVector3 viewer_pos_agent = gAgentCamera.getCameraPositionAgent();
+	LLVector3 pos_agent = getRenderPosition();
+
+	F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX];
+	F32 dy = viewer_pos_agent.mV[VY] - pos_agent.mV[VY];
+	F32 dz = viewer_pos_agent.mV[VZ] - pos_agent.mV[VZ];
+
+	F32 max_scale = getMaxScale();
+	F32 mid_scale = getMidScale();
+	F32 min_scale = getMinScale();
+
+	// IW: estimate - when close to large objects, computing range based on distance from center is no good
+	// to try to get a min distance from face, subtract min_scale/2 from the range.
+	// This means we'll load too much detail sometimes, but that's better than not enough
+	// I don't think there's a better way to do this without calculating distance per-poly
+	F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2;
+
+	LLViewerCamera* camera = LLViewerCamera::getInstance();
+	if (range < 0.001f || isHUDAttachment())		// range == zero
+	{
+		mAppAngle = 180.f;
+		mPixelArea = (F32)camera->getScreenPixelArea();
+	}
+	else
+	{
+		mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG;
+
+		F32 pixels_per_meter = camera->getPixelMeterRatio() / range;
+
+		mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale);
+		if (mPixelArea > camera->getScreenPixelArea())
+		{
+			mAppAngle = 180.f;
+			mPixelArea = (F32)camera->getScreenPixelArea();
+		}
+	}
+}
+
+BOOL LLViewerObject::updateLOD()
+{
+	return FALSE;
+}
+
+BOOL LLViewerObject::updateGeometry(LLDrawable *drawable)
+{
+	return TRUE;
+}
+
+void LLViewerObject::updateGL()
+{
+
+}
+
+void LLViewerObject::updateFaceSize(S32 idx)
+{
+	
+}
+
+LLDrawable* LLViewerObject::createDrawable(LLPipeline *pipeline)
+{
+	return NULL;
+}
+
+void LLViewerObject::setScale(const LLVector3 &scale, BOOL damped)
+{
+	LLPrimitive::setScale(scale);
+	if (mDrawable.notNull())
+	{
+		//encompass completely sheared objects by taking 
+		//the most extreme point possible (<1,1,0.5>)
+		mDrawable->setRadius(LLVector3(1,1,0.5f).scaleVec(scale).magVec());
+		updateDrawable(damped);
+	}
+
+	if( (LL_PCODE_VOLUME == getPCode()) && !isDead() )
+	{
+		if (permYouOwner() || (scale.magVecSquared() > (7.5f * 7.5f)) )
+		{
+			if (!mOnMap)
+			{
+				llassert_always(LLWorld::getInstance()->getRegionFromHandle(getRegion()->getHandle()));
+
+				gObjectList.addToMap(this);
+				mOnMap = TRUE;
+			}
+		}
+		else
+		{
+			if (mOnMap)
+			{
+				gObjectList.removeFromMap(this);
+				mOnMap = FALSE;
+			}
+		}
+	}
+}
+
+void LLViewerObject::setObjectCost(F32 cost)
+{
+	mObjectCost = cost;
+	mCostStale = false;
+
+	if (isSelected())
+	{
+		gFloaterTools->dirty();
+	}
+}
+
+void LLViewerObject::setLinksetCost(F32 cost)
+{
+	mLinksetCost = cost;
+	mCostStale = false;
+	
+	if (isSelected())
+	{
+		gFloaterTools->dirty();
+	}
+}
+
+void LLViewerObject::setPhysicsCost(F32 cost)
+{
+	mPhysicsCost = cost;
+	mCostStale = false;
+
+	if (isSelected())
+	{
+		gFloaterTools->dirty();
+	}
+}
+
+void LLViewerObject::setLinksetPhysicsCost(F32 cost)
+{
+	mLinksetPhysicsCost = cost;
+	mCostStale = false;
+	
+	if (isSelected())
+	{
+		gFloaterTools->dirty();
+	}
+}
+
+
+F32 LLViewerObject::getObjectCost()
+{
+	if (mCostStale)
+	{
+		gObjectList.updateObjectCost(this);
+	}
+	
+	return mObjectCost;
+}
+
+F32 LLViewerObject::getLinksetCost()
+{
+	if (mCostStale)
+	{
+		gObjectList.updateObjectCost(this);
+	}
+
+	return mLinksetCost;
+}
+
+F32 LLViewerObject::getPhysicsCost()
+{
+	if (mCostStale)
+	{
+		gObjectList.updateObjectCost(this);
+	}
+	
+	return mPhysicsCost;
+}
+
+F32 LLViewerObject::getLinksetPhysicsCost()
+{
+	if (mCostStale)
+	{
+		gObjectList.updateObjectCost(this);
+	}
+
+	return mLinksetPhysicsCost;
+}
+
+F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes)
+{
+	return 0.f;
+}
+
+U32 LLViewerObject::getTriangleCount()
+{
+	return 0;
+}
+
+U32 LLViewerObject::getHighLODTriangleCount()
+{
+	return 0;
+}
+
+void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax)
+{
+	LLVector4a center;
+	center.load3(getRenderPosition().mV);
+	LLVector4a size;
+	size.load3(getScale().mV);
+	newMin.setSub(center, size);
+	newMax.setAdd(center, size);
+	
+	mDrawable->setPositionGroup(center);
+}
+
+F32 LLViewerObject::getBinRadius()
+{
+	if (mDrawable.notNull())
+	{
+		const LLVector4a* ext = mDrawable->getSpatialExtents();
+		LLVector4a diff;
+		diff.setSub(ext[1], ext[0]);
+		return diff.getLength3().getF32();
+	}
+	
+	return getScale().magVec();
+}
+
+F32 LLViewerObject::getMaxScale() const
+{
+	return llmax(getScale().mV[VX],getScale().mV[VY], getScale().mV[VZ]);
+}
+
+F32 LLViewerObject::getMinScale() const
+{
+	return llmin(getScale().mV[0],getScale().mV[1],getScale().mV[2]);
+}
+
+F32 LLViewerObject::getMidScale() const
+{
+	if (getScale().mV[VX] < getScale().mV[VY])
+	{
+		if (getScale().mV[VY] < getScale().mV[VZ])
+		{
+			return getScale().mV[VY];
+		}
+		else if (getScale().mV[VX] < getScale().mV[VZ])
+		{
+			return getScale().mV[VZ];
+		}
+		else
+		{
+			return getScale().mV[VX];
+		}
+	}
+	else if (getScale().mV[VX] < getScale().mV[VZ])
+	{
+		return getScale().mV[VX];
+	}
+	else if (getScale().mV[VY] < getScale().mV[VZ])
+	{
+		return getScale().mV[VZ];
+	}
+	else
+	{
+		return getScale().mV[VY];
+	}
+}
+
+
+void LLViewerObject::updateTextures()
+{
+}
+
+void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
+{
+	if (isDead())
+	{
+		return;
+	}
+
+	S32 i;
+	S32 tex_count = getNumTEs();
+	for (i = 0; i < tex_count; i++)
+	{
+ 		getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+	}
+
+	if (isSculpted() && !isMesh())
+	{
+		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+		LLUUID sculpt_id = sculpt_params->getSculptTexture();
+		LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+	}
+	
+	if (boost_children)
+	{
+		for (child_list_t::iterator iter = mChildList.begin();
+			 iter != mChildList.end(); iter++)
+		{
+			LLViewerObject* child = *iter;
+			child->boostTexturePriority();
+		}
+	}
+}
+
+
+void LLViewerObject::setLineWidthForWindowSize(S32 window_width)
+{
+	if (window_width < 700)
+	{
+		LLUI::setLineWidth(2.0f);
+	}
+	else if (window_width < 1100)
+	{
+		LLUI::setLineWidth(3.0f);
+	}
+	else if (window_width < 2000)
+	{
+		LLUI::setLineWidth(4.0f);
+	}
+	else
+	{
+		// _damn_, what a nice monitor!
+		LLUI::setLineWidth(5.0f);
+	}
+}
+
+void LLViewerObject::increaseArrowLength()
+{
+/* ???
+	if (mAxisArrowLength == 50)
+	{
+		mAxisArrowLength = 100;
+	}
+	else
+	{
+		mAxisArrowLength = 150;
+	}
+*/
+}
+
+
+void LLViewerObject::decreaseArrowLength()
+{
+/* ???
+	if (mAxisArrowLength == 150)
+	{
+		mAxisArrowLength = 100;
+	}
+	else
+	{
+		mAxisArrowLength = 50;
+	}
+*/
+}
+
+// Culled from newsim LLTask::addNVPair
+void LLViewerObject::addNVPair(const std::string& data)
+{
+	// cout << "LLViewerObject::addNVPair() with ---" << data << "---" << endl;
+	LLNameValue *nv = new LLNameValue(data.c_str());
+
+//	char splat[MAX_STRING];
+//	temp->printNameValue(splat);
+//	llinfos << "addNVPair " << splat << llendl;
+
+	name_value_map_t::iterator iter = mNameValuePairs.find(nv->mName);
+	if (iter != mNameValuePairs.end())
+	{
+		LLNameValue* foundnv = iter->second;
+		if (foundnv->mClass != NVC_READ_ONLY)
+		{
+			delete foundnv;
+			mNameValuePairs.erase(iter);
+		}
+		else
+		{
+			delete nv;
+//			llinfos << "Trying to write to Read Only NVPair " << temp->mName << " in addNVPair()" << llendl;
+			return;
+		}
+	}
+	mNameValuePairs[nv->mName] = nv;
+}
+
+BOOL LLViewerObject::removeNVPair(const std::string& name)
+{
+	char* canonical_name = gNVNameTable.addString(name);
+
+	lldebugs << "LLViewerObject::removeNVPair(): " << name << llendl;
+
+	name_value_map_t::iterator iter = mNameValuePairs.find(canonical_name);
+	if (iter != mNameValuePairs.end())
+	{
+		if( mRegionp )
+		{
+			LLNameValue* nv = iter->second;
+/*
+			std::string buffer = nv->printNameValue();
+			gMessageSystem->newMessageFast(_PREHASH_RemoveNameValuePair);
+			gMessageSystem->nextBlockFast(_PREHASH_TaskData);
+			gMessageSystem->addUUIDFast(_PREHASH_ID, mID);
+			
+			gMessageSystem->nextBlockFast(_PREHASH_NameValueData);
+			gMessageSystem->addStringFast(_PREHASH_NVPair, buffer);
+
+			gMessageSystem->sendReliable( mRegionp->getHost() );
+*/
+			// Remove the NV pair from the local list.
+			delete nv;
+			mNameValuePairs.erase(iter);
+			return TRUE;
+		}
+		else
+		{
+			lldebugs << "removeNVPair - No region for object" << llendl;
+		}
+	}
+	return FALSE;
+}
+
+
+LLNameValue *LLViewerObject::getNVPair(const std::string& name) const
+{
+	char		*canonical_name;
+
+	canonical_name = gNVNameTable.addString(name);
+
+	// If you access a map with a name that isn't in it, it will add the name and a null pointer.
+	// So first check if the data is in the map.
+	name_value_map_t::const_iterator iter = mNameValuePairs.find(canonical_name);
+	if (iter != mNameValuePairs.end())
+	{
+		return iter->second;
+	}
+	else
+	{
+		return NULL;
+	}
+}
+
+void LLViewerObject::updatePositionCaches() const
+{
+	if(mRegionp)
+	{
+		if (!isRoot())
+		{
+			mPositionRegion = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
+			mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+		}
+		else
+		{
+			mPositionRegion = getPosition();
+			mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+		}
+	}
+}
+
+const LLVector3d LLViewerObject::getPositionGlobal() const
+{	
+	if(mRegionp)
+	{
+		LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion());
+
+		if (isAttachment())
+		{
+			position_global = gAgent.getPosGlobalFromAgent(getRenderPosition());
+		}		
+		return position_global;
+	}
+	else
+	{
+		LLVector3d position_global(getPosition());
+		return position_global;
+	}	
+}
+
+const LLVector3 &LLViewerObject::getPositionAgent() const
+{
+	if (mRegionp)
+	{
+		if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent()))
+		{
+			// Don't return cached position if you have a parent, recalc (until all dirtying is done correctly.
+			LLVector3 position_region;
+			position_region = ((LLViewerObject *)getParent())->getPositionRegion() + getPosition() * getParent()->getRotation();
+			mPositionAgent = mRegionp->getPosAgentFromRegion(position_region);
+		}
+		else
+		{
+			mPositionAgent = mRegionp->getPosAgentFromRegion(getPosition());
+		}
+	}
+	return mPositionAgent;
+}
+
+const LLVector3 &LLViewerObject::getPositionRegion() const
+{
+	if (!isRoot())
+	{
+		LLViewerObject *parent = (LLViewerObject *)getParent();
+		mPositionRegion = parent->getPositionRegion() + (getPosition() * parent->getRotation());
+	}
+	else
+	{
+		mPositionRegion = getPosition();
+	}
+
+	return mPositionRegion;
+}
+
+const LLVector3 LLViewerObject::getPositionEdit() const
+{
+	if (isRootEdit())
+	{
+		return getPosition();
+	}
+	else
+	{
+		LLViewerObject *parent = (LLViewerObject *)getParent();
+		LLVector3 position_edit = parent->getPositionEdit() + getPosition() * parent->getRotationEdit();
+		return position_edit;
+	}
+}
+
+const LLVector3 LLViewerObject::getRenderPosition() const
+{
+	if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+	{
+		LLVOAvatar* avatar = getAvatar();
+		if (avatar)
+		{
+			return avatar->getPositionAgent();
+		}
+	}
+
+	if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
+	{
+		return getPositionAgent();
+	}
+	else
+	{
+		return mDrawable->getPositionAgent();
+	}
+}
+
+const LLVector3 LLViewerObject::getPivotPositionAgent() const
+{
+	return getRenderPosition();
+}
+
+const LLQuaternion LLViewerObject::getRenderRotation() const
+{
+	LLQuaternion ret;
+	if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED))
+	{
+		return ret;
+	}
+	
+	if (mDrawable.isNull() || mDrawable->isStatic())
+	{
+		ret = getRotationEdit();
+	}
+	else
+	{
+		if (!mDrawable->isRoot())
+		{
+			ret = getRotation() * LLQuaternion(mDrawable->getParent()->getWorldMatrix());
+		}
+		else
+		{
+			ret = LLQuaternion(mDrawable->getWorldMatrix());
+		}
+	}
+	
+	return ret;
+}
+
+const LLMatrix4 LLViewerObject::getRenderMatrix() const
+{
+	return mDrawable->getWorldMatrix();
+}
+
+const LLQuaternion LLViewerObject::getRotationRegion() const
+{
+	LLQuaternion global_rotation = getRotation();
+	if (!((LLXform *)this)->isRoot())
+	{
+		global_rotation = global_rotation * getParent()->getRotation();
+	}
+	return global_rotation;
+}
+
+const LLQuaternion LLViewerObject::getRotationEdit() const
+{
+	LLQuaternion global_rotation = getRotation();
+	if (!((LLXform *)this)->isRootEdit())
+	{
+		global_rotation = global_rotation * getParent()->getRotation();
+	}
+	return global_rotation;
+}
+
+void LLViewerObject::setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped )
+{
+	if (isAttachment())
+	{
+		LLVector3 new_pos = mRegionp->getPosRegionFromGlobal(pos_global);
+		if (isRootEdit())
+		{
+			new_pos -= mDrawable->mXform.getParent()->getWorldPosition();
+			LLQuaternion world_rotation = mDrawable->mXform.getParent()->getWorldRotation();
+			new_pos = new_pos * ~world_rotation;
+		}
+		else
+		{
+			LLViewerObject* parentp = (LLViewerObject*)getParent();
+			new_pos -= parentp->getPositionAgent();
+			new_pos = new_pos * ~parentp->getRotationRegion();
+		}
+		LLViewerObject::setPosition(new_pos);
+		
+		if (mParent && ((LLViewerObject*)mParent)->isAvatar())
+		{
+			// we have changed the position of an attachment, so we need to clamp it
+			LLVOAvatar *avatar = (LLVOAvatar*)mParent;
+
+			avatar->clampAttachmentPositions();
+		}
+	}
+	else
+	{
+		if( isRoot() )
+		{
+			setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
+		}
+		else
+		{
+			// the relative position with the parent is not constant
+			LLViewerObject* parent = (LLViewerObject *)getParent();
+			//RN: this assumes we are only calling this function from the edit tools
+			gPipeline.updateMoveNormalAsync(parent->mDrawable);
+
+			LLVector3 pos_local = mRegionp->getPosRegionFromGlobal(pos_global) - parent->getPositionRegion();
+			pos_local = pos_local * ~parent->getRotationRegion();
+			LLViewerObject::setPosition( pos_local );
+		}
+	}
+	//RN: assumes we always want to snap the object when calling this function
+	gPipeline.updateMoveNormalAsync(mDrawable);
+}
+
+void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped)
+{
+	if (getPosition() != pos)
+	{
+		setChanged(TRANSLATED | SILHOUETTE);
+	}
+		
+	LLXform::setPosition(pos);
+	updateDrawable(damped);
+	if (isRoot())
+	{
+		// position caches need to be up to date on root objects
+		updatePositionCaches();
+	}
+}
+
+void LLViewerObject::setPositionGlobal(const LLVector3d &pos_global, BOOL damped)
+{
+	if (isAttachment())
+	{
+		if (isRootEdit())
+		{
+			LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
+			newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
+
+			LLQuaternion invWorldRotation = mDrawable->mXform.getParent()->getWorldRotation();
+			invWorldRotation.transQuat();
+
+			newPos = newPos * invWorldRotation;
+			LLViewerObject::setPosition(newPos);
+		}
+		else
+		{
+			// assumes parent is root editable (root of attachment)
+			LLVector3 newPos = mRegionp->getPosRegionFromGlobal(pos_global);
+			newPos = newPos - mDrawable->mXform.getParent()->getWorldPosition();
+			LLVector3 delta_pos = newPos - getPosition();
+
+			LLQuaternion invRotation = mDrawable->getRotation();
+			invRotation.transQuat();
+			
+			delta_pos = delta_pos * invRotation;
+
+			// *FIX: is this right?  Shouldn't we be calling the
+			// LLViewerObject version of setPosition?
+			LLVector3 old_pos = mDrawable->mXform.getParent()->getPosition();
+			mDrawable->mXform.getParent()->setPosition(old_pos + delta_pos);
+			setChanged(TRANSLATED | SILHOUETTE);
+		}
+		if (mParent && ((LLViewerObject*)mParent)->isAvatar())
+		{
+			// we have changed the position of an attachment, so we need to clamp it
+			LLVOAvatar *avatar = (LLVOAvatar*)mParent;
+
+			avatar->clampAttachmentPositions();
+		}
+	}
+	else
+	{
+		if (isRoot())
+		{
+			setPositionRegion(mRegionp->getPosRegionFromGlobal(pos_global));
+		}
+		else
+		{
+			// the relative position with the parent is constant, but the parent's position needs to be changed
+			LLVector3d position_offset;
+			position_offset.setVec(getPosition()*getParent()->getRotation());
+			LLVector3d new_pos_global = pos_global - position_offset;
+			((LLViewerObject *)getParent())->setPositionGlobal(new_pos_global);
+		}
+	}
+	updateDrawable(damped);
+}
+
+
+void LLViewerObject::setPositionParent(const LLVector3 &pos_parent, BOOL damped)
+{
+	// Set position relative to parent, if no parent, relative to region
+	if (!isRoot())
+	{
+		LLViewerObject::setPosition(pos_parent, damped);
+		//updateDrawable(damped);
+	}
+	else
+	{
+		setPositionRegion(pos_parent, damped);
+	}
+}
+
+void LLViewerObject::setPositionRegion(const LLVector3 &pos_region, BOOL damped)
+{
+	if (!isRootEdit())
+	{
+		LLViewerObject* parent = (LLViewerObject*) getParent();
+		LLViewerObject::setPosition((pos_region-parent->getPositionRegion())*~parent->getRotationRegion());
+	}
+	else
+	{
+		LLViewerObject::setPosition(pos_region);
+		mPositionRegion = pos_region;
+		mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+	}
+}
+
+void LLViewerObject::setPositionAgent(const LLVector3 &pos_agent, BOOL damped)
+{
+	LLVector3 pos_region = getRegion()->getPosRegionFromAgent(pos_agent);
+	setPositionRegion(pos_region, damped);
+}
+
+// identical to setPositionRegion() except it checks for child-joints 
+// and doesn't also move the joint-parent
+// TODO -- implement similar intelligence for joint-parents toward
+// their joint-children
+void LLViewerObject::setPositionEdit(const LLVector3 &pos_edit, BOOL damped)
+{
+	if (!isRootEdit())
+	{
+		// the relative position with the parent is constant, but the parent's position needs to be changed
+		LLVector3 position_offset = getPosition() * getParent()->getRotation();
+
+		((LLViewerObject *)getParent())->setPositionEdit(pos_edit - position_offset);
+		updateDrawable(damped);
+	}
+	else if (isJointChild())
+	{
+		// compute new parent-relative position
+		LLViewerObject *parent = (LLViewerObject *) getParent();
+		LLQuaternion inv_parent_rot = parent->getRotation();
+		inv_parent_rot.transQuat();
+		LLVector3 pos_parent = (pos_edit - parent->getPositionRegion()) * inv_parent_rot;
+		LLViewerObject::setPosition(pos_parent, damped);
+	}
+	else
+	{
+		LLViewerObject::setPosition(pos_edit, damped);
+		mPositionRegion = pos_edit;
+		mPositionAgent = mRegionp->getPosAgentFromRegion(mPositionRegion);
+	}	
+}
+
+
+LLViewerObject* LLViewerObject::getRootEdit() const
+{
+	const LLViewerObject* root = this;
+	while (root->mParent 
+		   && !(root->mJointInfo
+			   || ((LLViewerObject*)root->mParent)->isAvatar()) )
+	{
+		root = (LLViewerObject*)root->mParent;
+	}
+	return (LLViewerObject*)root;
+}
+
+
+BOOL LLViewerObject::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+										  S32 face,
+										  BOOL pick_transparent,
+										  S32* face_hit,
+										  LLVector3* intersection,
+										  LLVector2* tex_coord,
+										  LLVector3* normal,
+										  LLVector3* bi_normal)
+{
+	return false;
+}
+
+BOOL LLViewerObject::lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end)
+{
+	if (mDrawable.isNull() || mDrawable->isDead())
+	{
+		return FALSE;
+	}
+
+	const LLVector4a* ext = mDrawable->getSpatialExtents();
+
+	//VECTORIZE THIS
+	LLVector4a center;
+	center.setAdd(ext[1], ext[0]);
+	center.mul(0.5f);
+	LLVector4a size;
+	size.setSub(ext[1], ext[0]);
+	size.mul(0.5f);
+
+	LLVector4a starta, enda;
+	starta.load3(start.mV);
+	enda.load3(end.mV);
+
+	return LLLineSegmentBoxIntersect(starta, enda, center, size);
+}
+
+U8 LLViewerObject::getMediaType() const
+{
+	if (mMedia)
+	{
+		return mMedia->mMediaType;
+	}
+	else
+	{
+		return LLViewerObject::MEDIA_NONE;
+	}
+}
+
+void LLViewerObject::setMediaType(U8 media_type)
+{
+	if (!mMedia)
+	{
+		// TODO what if we don't have a media pointer?
+	}
+	else if (mMedia->mMediaType != media_type)
+	{
+		mMedia->mMediaType = media_type;
+
+		// TODO: update materials with new image
+	}
+}
+
+std::string LLViewerObject::getMediaURL() const
+{
+	if (mMedia)
+	{
+		return mMedia->mMediaURL;
+	}
+	else
+	{
+		return std::string();
+	}
+}
+
+void LLViewerObject::setMediaURL(const std::string& media_url)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	
+	if (!mMedia)
+	{
+		mMedia = new LLViewerObjectMedia;
+		mMedia->mMediaURL = media_url;
+		mMedia->mPassedWhitelist = FALSE;
+
+		// TODO: update materials with new image
+	}
+	else if (mMedia->mMediaURL != media_url)
+	{
+		mMedia->mMediaURL = media_url;
+		mMedia->mPassedWhitelist = FALSE;
+
+		// TODO: update materials with new image
+	}
+}
+
+BOOL LLViewerObject::getMediaPassedWhitelist() const
+{
+	if (mMedia)
+	{
+		return mMedia->mPassedWhitelist;
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
+void LLViewerObject::setMediaPassedWhitelist(BOOL passed)
+{
+	if (mMedia)
+	{
+		mMedia->mPassedWhitelist = passed;
+	}
+}
+
+BOOL LLViewerObject::setMaterial(const U8 material)
+{
+	BOOL res = LLPrimitive::setMaterial(material);
+	if (res)
+	{
+		setChanged(TEXTURE);
+	}
+	return res;
+}
+
+void LLViewerObject::setNumTEs(const U8 num_tes)
+{
+	LLMemType mt(LLMemType::MTYPE_OBJECT);
+	
+	U32 i;
+	if (num_tes != getNumTEs())
+	{
+		if (num_tes)
+		{
+			LLPointer<LLViewerTexture> *new_images;
+			new_images = new LLPointer<LLViewerTexture>[num_tes];
+			for (i = 0; i < num_tes; i++)
+			{
+				if (i < getNumTEs())
+				{
+					new_images[i] = mTEImages[i];
+				}
+				else if (getNumTEs())
+				{
+					new_images[i] = mTEImages[getNumTEs()-1];
+				}
+				else
+				{
+					new_images[i] = NULL;
+				}
+			}
+
+			deleteTEImages();
+			
+			mTEImages = new_images;
+		}
+		else
+		{
+			deleteTEImages();
+		}
+		LLPrimitive::setNumTEs(num_tes);
+		setChanged(TEXTURE);
+
+		if (mDrawable.notNull())
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+}
+
+void LLViewerObject::sendMaterialUpdate() const
+{
+	LLViewerRegion* regionp = getRegion();
+	if(!regionp) return;
+	gMessageSystem->newMessageFast(_PREHASH_ObjectMaterial);
+	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID,	mLocalID );
+	gMessageSystem->addU8Fast(_PREHASH_Material, getMaterial() );
+	gMessageSystem->sendReliable( regionp->getHost() );
+
+}
+
+// formerly send_object_rotation
+void LLViewerObject::sendRotationUpdate() const
+{
+	LLViewerRegion* regionp = getRegion();
+	if(!regionp) return;
+	gMessageSystem->newMessageFast(_PREHASH_ObjectRotation);
+	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID);
+	gMessageSystem->addQuatFast(_PREHASH_Rotation, getRotationEdit());
+	//llinfos << "Sent rotation " << getRotationEdit() << llendl;
+	gMessageSystem->sendReliable( regionp->getHost() );
+}
+
+/* Obsolete, we use MultipleObjectUpdate instead
+//// formerly send_object_position_global
+//void LLViewerObject::sendPositionUpdate() const
+//{
+//	gMessageSystem->newMessageFast(_PREHASH_ObjectPosition);
+//	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+//	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+//	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+//	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+//	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID,	mLocalID );
+//	gMessageSystem->addVector3Fast(_PREHASH_Position, getPositionRegion());
+//	LLViewerRegion* regionp = getRegion();
+//	gMessageSystem->sendReliable(regionp->getHost());
+//}
+*/
+
+//formerly send_object_shape(LLViewerObject *object)
+void LLViewerObject::sendShapeUpdate()
+{
+	gMessageSystem->newMessageFast(_PREHASH_ObjectShape);
+	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+
+	LLVolumeMessage::packVolumeParams(&getVolume()->getParams(), gMessageSystem);
+
+	LLViewerRegion *regionp = getRegion();
+	gMessageSystem->sendReliable( regionp->getHost() );
+}
+
+
+void LLViewerObject::sendTEUpdate() const
+{
+	LLMessageSystem* msg = gMessageSystem;
+	msg->newMessageFast(_PREHASH_ObjectImage);
+
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+	msg->nextBlockFast(_PREHASH_ObjectData);
+	msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+	if (mMedia)
+	{
+		msg->addString("MediaURL", mMedia->mMediaURL);
+	}
+	else
+	{
+		msg->addString("MediaURL", NULL);
+	}
+
+	// TODO send media type
+
+	packTEMessage(msg);
+
+	LLViewerRegion *regionp = getRegion();
+	msg->sendReliable( regionp->getHost() );
+}
+
+void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
+{
+	LLPrimitive::setTE(te, texture_entry);
+//  This doesn't work, don't get any textures.
+//	if (mDrawable.notNull() && mDrawable->isVisible())
+//	{
+		const LLUUID& image_id = getTE(te)->getID();
+		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+//	}
+}
+
+void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
+{
+	if (mTEImages[te] != imagep)
+	{
+		mTEImages[te] = imagep;
+		LLPrimitive::setTETexture(te, imagep->getID());
+		setChanged(TEXTURE);
+		if (mDrawable.notNull())
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+}
+
+
+S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host)
+{
+	S32 retval = 0;
+	if (uuid != getTE(te)->getID() ||
+		uuid == LLUUID::null)
+	{
+		retval = LLPrimitive::setTETexture(te, uuid);
+		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull())
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+	return retval;
+}
+
+
+void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) 
+{
+	if(index < 0 || index >= getNumTEs())
+	{
+		return ;
+	}
+	mTEImages[index] = new_image ;
+}
+
+S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)
+{
+	// Invalid host == get from the agent's sim
+	return setTETextureCore(te, uuid, LLHost::invalid);
+}
+
+
+S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color)
+{
+	return setTEColor(te, LLColor4(color));
+}
+
+S32 LLViewerObject::setTEColor(const U8 te, const LLColor4& color)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (color != tep->getColor())
+	{
+		retval = LLPrimitive::setTEColor(te, color);
+		if (mDrawable.notNull() && retval)
+		{
+			// These should only happen on updates which are not the initial update.
+			dirtyMesh();
+		}
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTEBumpmap(const U8 te, const U8 bump)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (bump != tep->getBumpmap())
+	{
+		retval = LLPrimitive::setTEBumpmap(te, bump);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull() && retval)
+		{
+			gPipeline.markTextured(mDrawable);
+			gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
+		}
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTETexGen(const U8 te, const U8 texgen)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (texgen != tep->getTexGen())
+	{
+		retval = LLPrimitive::setTETexGen(te, texgen);
+		setChanged(TEXTURE);
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTEMediaTexGen(const U8 te, const U8 media)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (media != tep->getMediaTexGen())
+	{
+		retval = LLPrimitive::setTEMediaTexGen(te, media);
+		setChanged(TEXTURE);
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTEShiny(const U8 te, const U8 shiny)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (shiny != tep->getShiny())
+	{
+		retval = LLPrimitive::setTEShiny(te, shiny);
+		setChanged(TEXTURE);
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTEFullbright(const U8 te, const U8 fullbright)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (fullbright != tep->getFullbright())
+	{
+		retval = LLPrimitive::setTEFullbright(te, fullbright);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull() && retval)
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+	return retval;
+}
+
+
+S32 LLViewerObject::setTEMediaFlags(const U8 te, const U8 media_flags)
+{
+	// this might need work for media type
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (media_flags != tep->getMediaFlags())
+	{
+		retval = LLPrimitive::setTEMediaFlags(te, media_flags);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull() && retval)
+		{
+			gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, TRUE);
+			gPipeline.markTextured(mDrawable);
+			// JC - probably only need this if changes texture coords
+			//gPipeline.markRebuild(mDrawable);
+		}
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTEGlow(const U8 te, const F32 glow)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (glow != tep->getGlow())
+	{
+		retval = LLPrimitive::setTEGlow(te, glow);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull() && retval)
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+	return retval;
+}
+
+
+S32 LLViewerObject::setTEScale(const U8 te, const F32 s, const F32 t)
+{
+	S32 retval = 0;
+	retval = LLPrimitive::setTEScale(te, s, t);
+	setChanged(TEXTURE);
+	if (mDrawable.notNull() && retval)
+	{
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTEScaleS(const U8 te, const F32 s)
+{
+	S32 retval = LLPrimitive::setTEScaleS(te, s);
+	if (mDrawable.notNull() && retval)
+	{
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+	}
+
+	return retval;
+}
+
+S32 LLViewerObject::setTEScaleT(const U8 te, const F32 t)
+{
+	S32 retval = LLPrimitive::setTEScaleT(te, t);
+	if (mDrawable.notNull() && retval)
+	{
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+	}
+
+	return retval;
+}
+
+S32 LLViewerObject::setTEOffset(const U8 te, const F32 s, const F32 t)
+{
+	S32 retval = LLPrimitive::setTEOffset(te, s, t);
+	if (mDrawable.notNull() && retval)
+	{
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTEOffsetS(const U8 te, const F32 s)
+{
+	S32 retval = LLPrimitive::setTEOffsetS(te, s);
+	if (mDrawable.notNull() && retval)
+	{
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+	}
+
+	return retval;
+}
+
+S32 LLViewerObject::setTEOffsetT(const U8 te, const F32 t)
+{
+	S32 retval = LLPrimitive::setTEOffsetT(te, t);
+	if (mDrawable.notNull() && retval)
+	{
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+	}
+
+	return retval;
+}
+
+S32 LLViewerObject::setTERotation(const U8 te, const F32 r)
+{
+	S32 retval = LLPrimitive::setTERotation(te, r);
+	if (mDrawable.notNull() && retval)
+	{
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD);
+	}
+	return retval;
+}
+
+
+LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const
+{
+//	llassert(mTEImages);
+
+	if (face < getNumTEs())
+	{
+		LLViewerTexture* image = mTEImages[face];
+		if (image)
+		{
+			return image;
+		}
+		else
+		{
+			return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep);
+		}
+	}
+
+	llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl;
+
+	return NULL;
+}
+
+
+void LLViewerObject::fitFaceTexture(const U8 face)
+{
+	llinfos << "fitFaceTexture not implemented" << llendl;
+}
+
+
+LLBBox LLViewerObject::getBoundingBoxAgent() const
+{
+	LLVector3 position_agent;
+	LLQuaternion rot;
+	LLViewerObject* avatar_parent = NULL;
+	LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
+	if (root_edit)
+	{
+		avatar_parent = (LLViewerObject*)root_edit->getParent();
+	}
+	
+	if (avatar_parent && avatar_parent->isAvatar() &&
+		root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent())
+	{
+		LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
+		position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
+		rot = getRotationEdit() * parent_xform->getWorldRotation();
+	}
+	else
+	{
+		position_agent = getPositionAgent();
+		rot = getRotationRegion();
+	}
+	
+	return LLBBox( position_agent, rot, getScale() * -0.5f, getScale() * 0.5f );
+}
+
+U32 LLViewerObject::getNumVertices() const
+{
+	U32 num_vertices = 0;
+	if (mDrawable.notNull())
+	{
+		S32 i, num_faces;
+		num_faces = mDrawable->getNumFaces();
+		for (i = 0; i < num_faces; i++)
+		{
+			num_vertices += mDrawable->getFace(i)->getGeomCount();
+		}
+	}
+	return num_vertices;
+}
+
+U32 LLViewerObject::getNumIndices() const
+{
+	U32 num_indices = 0;
+	if (mDrawable.notNull())
+	{
+		S32 i, num_faces;
+		num_faces = mDrawable->getNumFaces();
+		for (i = 0; i < num_faces; i++)
+		{
+			num_indices += mDrawable->getFace(i)->getIndicesCount();
+		}
+	}
+	return num_indices;
+}
+
+// Find the number of instances of this object's inventory that are of the given type
+S32 LLViewerObject::countInventoryContents(LLAssetType::EType type)
+{
+	S32 count = 0;
+	if( mInventory )
+	{
+		LLInventoryObject::object_list_t::const_iterator it = mInventory->begin();
+		LLInventoryObject::object_list_t::const_iterator end = mInventory->end();
+		for(  ; it != end ; ++it )
+		{
+			if( (*it)->getType() == type )
+			{
+				++count;
+			}
+		}
+	}
+	return count;
+}
+
+
+void LLViewerObject::setCanSelect(BOOL canSelect)
+{
+	mbCanSelect = canSelect;
+	for (child_list_t::iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		child->mbCanSelect = canSelect;
+	}
+}
+
+void LLViewerObject::setDebugText(const std::string &utf8text)
+{
+	if (utf8text.empty() && !mText)
+	{
+		return;
+	}
+
+	if (!mText)
+	{
+		mText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
+		mText->setFont(LLFontGL::getFontSansSerif());
+		mText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
+		mText->setMaxLines(-1);
+		mText->setSourceObject(this);
+		mText->setOnHUDAttachment(isHUDAttachment());
+	}
+	mText->setColor(LLColor4::white);
+	mText->setString(utf8text);
+	mText->setZCompare(FALSE);
+	mText->setDoFade(FALSE);
+	updateText();
+}
+
+void LLViewerObject::setIcon(LLViewerTexture* icon_image)
+{
+	if (!mIcon)
+	{
+		mIcon = (LLHUDIcon *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_ICON);
+		mIcon->setSourceObject(this);
+		mIcon->setImage(icon_image);
+		// *TODO: make this user configurable
+		mIcon->setScale(0.03f);
+	}
+	else
+	{
+		mIcon->restartLifeTimer();
+	}
+}
+
+void LLViewerObject::clearIcon()
+{
+	if (mIcon)
+	{
+		mIcon = NULL;
+	}
+}
+
+LLViewerObject* LLViewerObject::getSubParent() 
+{ 
+	if (isJointChild())
+	{
+		return this;
+	}
+	return (LLViewerObject*) getParent();
+}
+
+const LLViewerObject* LLViewerObject::getSubParent() const
+{
+	if (isJointChild())
+	{
+		return this;
+	}
+	return (const LLViewerObject*) getParent();
+}
+
+BOOL LLViewerObject::isOnMap()
+{
+	return mOnMap;
+}
+
+
+void LLViewerObject::updateText()
+{
+	if (!isDead())
+	{
+		if (mText.notNull())
+		{		
+			LLVector3 up_offset(0,0,0);
+			up_offset.mV[2] = getScale().mV[VZ]*0.6f;
+			
+			if (mDrawable.notNull())
+			{
+				mText->setPositionAgent(getRenderPosition() + up_offset);
+			}
+			else
+			{
+				mText->setPositionAgent(getPositionAgent() + up_offset);
+			}
+		}
+	}
+}
+
+LLVOAvatar* LLViewerObject::asAvatar()
+{
+	return NULL;
+}
+
+BOOL LLViewerObject::isParticleSource() const
+{
+	return !mPartSourcep.isNull() && !mPartSourcep->isDead();
+}
+
+void LLViewerObject::setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id)
+{
+	if (mPartSourcep)
+	{
+		deleteParticleSource();
+	}
+
+	LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::createPSS(this, particle_parameters);
+	mPartSourcep = pss;
+	
+	if (mPartSourcep)
+	{
+		mPartSourcep->setOwnerUUID(owner_id);
+
+		if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
+		{
+			LLViewerTexture* image;
+			if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
+			{
+				image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.tga");
+			}
+			else
+			{
+				image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
+			}
+			mPartSourcep->setImage(image);
+		}
+	}
+	LLViewerPartSim::getInstance()->addPartSource(pss);
+}
+
+void LLViewerObject::unpackParticleSource(const S32 block_num, const LLUUID& owner_id)
+{
+	if (!mPartSourcep.isNull() && mPartSourcep->isDead())
+	{
+		mPartSourcep = NULL;
+	}
+	if (mPartSourcep)
+	{
+		// If we've got one already, just update the existing source (or remove it)
+		if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, block_num))
+		{
+			mPartSourcep->setDead();
+			mPartSourcep = NULL;
+		}
+	}
+	else
+	{
+		LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, block_num);
+		//If the owner is muted, don't create the system
+		if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
+
+		// We need to be able to deal with a particle source that hasn't changed, but still got an update!
+		if (pss)
+		{
+// 			llinfos << "Making particle system with owner " << owner_id << llendl;
+			pss->setOwnerUUID(owner_id);
+			mPartSourcep = pss;
+			LLViewerPartSim::getInstance()->addPartSource(pss);
+		}
+	}
+	if (mPartSourcep)
+	{
+		if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
+		{
+			LLViewerTexture* image;
+			if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
+			{
+				image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
+			}
+			else
+			{
+				image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
+			}
+			mPartSourcep->setImage(image);
+		}
+	}
+}
+
+void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id)
+{
+	if (!mPartSourcep.isNull() && mPartSourcep->isDead())
+	{
+		mPartSourcep = NULL;
+	}
+	if (mPartSourcep)
+	{
+		// If we've got one already, just update the existing source (or remove it)
+		if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, dp))
+		{
+			mPartSourcep->setDead();
+			mPartSourcep = NULL;
+		}
+	}
+	else
+	{
+		LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, dp);
+		//If the owner is muted, don't create the system
+		if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return;
+		// We need to be able to deal with a particle source that hasn't changed, but still got an update!
+		if (pss)
+		{
+// 			llinfos << "Making particle system with owner " << owner_id << llendl;
+			pss->setOwnerUUID(owner_id);
+			mPartSourcep = pss;
+			LLViewerPartSim::getInstance()->addPartSource(pss);
+		}
+	}
+	if (mPartSourcep)
+	{
+		if (mPartSourcep->getImage()->getID() != mPartSourcep->mPartSysData.mPartImageID)
+		{
+			LLViewerTexture* image;
+			if (mPartSourcep->mPartSysData.mPartImageID == LLUUID::null)
+			{
+				image = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
+			}
+			else
+			{
+				image = LLViewerTextureManager::getFetchedTexture(mPartSourcep->mPartSysData.mPartImageID);
+			}
+			mPartSourcep->setImage(image);
+		}
+	}
+}
+
+void LLViewerObject::deleteParticleSource()
+{
+	if (mPartSourcep.notNull())
+	{
+		mPartSourcep->setDead();
+		mPartSourcep = NULL;
+	}
+}
+
+// virtual
+void LLViewerObject::updateDrawable(BOOL force_damped)
+{
+	if (mDrawable.notNull() && 
+		!mDrawable->isState(LLDrawable::ON_MOVE_LIST) &&
+		isChanged(MOVED))
+	{
+		BOOL damped_motion = 
+			!isChanged(SHIFTED) &&										// not shifted between regions this frame and...
+			(	force_damped ||										// ...forced into damped motion by application logic or...
+				(	!isSelected() &&									// ...not selected and...
+					(	mDrawable->isRoot() ||								// ... is root or ...
+						(getParent() && !((LLViewerObject*)getParent())->isSelected())// ... parent is not selected and ...
+					) &&	
+					getPCode() == LL_PCODE_VOLUME &&					// ...is a volume object and...
+					getVelocity().isExactlyZero() &&					// ...is not moving physically and...
+					mDrawable->getGeneration() != -1                    // ...was not created this frame.
+				)					
+			);
+		gPipeline.markMoved(mDrawable, damped_motion);
+	}
+	clearChanged(SHIFTED);
+}
+
+// virtual, overridden by LLVOVolume
+F32 LLViewerObject::getVObjRadius() const
+{
+	return mDrawable.notNull() ? mDrawable->getRadius() : 0.f;
+}
+
+void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags)
+{
+	if (!gAudiop)
+	{
+		return;
+	}
+	
+	if (audio_uuid.isNull())
+	{
+		if (!mAudioSourcep)
+		{
+			return;
+		}
+		if (mAudioSourcep->isLoop() && !mAudioSourcep->hasPendingPreloads())
+		{
+			// We don't clear the sound if it's a loop, it'll go away on its own.
+			// At least, this appears to be how the scripts work.
+			// The attached sound ID is set to NULL to avoid it playing back when the
+			// object rezzes in on non-looping sounds.
+			//llinfos << "Clearing attached sound " << mAudioSourcep->getCurrentData()->getID() << llendl;
+			gAudiop->cleanupAudioSource(mAudioSourcep);
+			mAudioSourcep = NULL;
+		}
+		else if (flags & LL_SOUND_FLAG_STOP)
+        {
+			// Just shut off the sound
+			mAudioSourcep->play(LLUUID::null);
+		}
+		return;
+	}
+	if (flags & LL_SOUND_FLAG_LOOP
+		&& mAudioSourcep && mAudioSourcep->isLoop() && mAudioSourcep->getCurrentData()
+		&& mAudioSourcep->getCurrentData()->getID() == audio_uuid)
+	{
+		//llinfos << "Already playing this sound on a loop, ignoring" << llendl;
+		return;
+	}
+
+	// don't clean up before previous sound is done. Solves: SL-33486
+	if ( mAudioSourcep && mAudioSourcep->isDone() ) 
+	{
+		gAudiop->cleanupAudioSource(mAudioSourcep);
+		mAudioSourcep = NULL;
+	}
+
+	if (mAudioSourcep && mAudioSourcep->isMuted() &&
+	    mAudioSourcep->getCurrentData() && mAudioSourcep->getCurrentData()->getID() == audio_uuid)
+	{
+		//llinfos << "Already having this sound as muted sound, ignoring" << llendl;
+		return;
+	}
+
+	getAudioSource(owner_id);
+
+	if (mAudioSourcep)
+	{
+		BOOL queue = flags & LL_SOUND_FLAG_QUEUE;
+		mAudioGain = gain;
+		mAudioSourcep->setGain(gain);
+		mAudioSourcep->setLoop(flags & LL_SOUND_FLAG_LOOP);
+		mAudioSourcep->setSyncMaster(flags & LL_SOUND_FLAG_SYNC_MASTER);
+		mAudioSourcep->setSyncSlave(flags & LL_SOUND_FLAG_SYNC_SLAVE);
+		mAudioSourcep->setQueueSounds(queue);
+		if(!queue) // stop any current sound first to avoid "farts of doom" (SL-1541) -MG
+		{
+			mAudioSourcep->play(LLUUID::null);
+		}
+		
+		// Play this sound if region maturity permits
+		if( gAgent.canAccessMaturityAtGlobal(this->getPositionGlobal()) )
+		{
+			//llinfos << "Playing attached sound " << audio_uuid << llendl;
+			mAudioSourcep->play(audio_uuid);
+		}
+	}
+}
+
+LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
+{
+	if (!mAudioSourcep)
+	{
+		// Arbitrary low gain for a sound that's not playing.
+		// This is used for sound preloads, for example.
+		LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this);
+
+		mAudioSourcep = asvop;
+		if(gAudiop) gAudiop->addAudioSource(asvop);
+	}
+
+	return mAudioSourcep;
+}
+
+void LLViewerObject::adjustAudioGain(const F32 gain)
+{
+	if (!gAudiop)
+	{
+		return;
+	}
+	if (mAudioSourcep)
+	{
+		mAudioGain = gain;
+		mAudioSourcep->setGain(mAudioGain);
+	}
+}
+
+//----------------------------------------------------------------------------
+
+bool LLViewerObject::unpackParameterEntry(U16 param_type, LLDataPacker *dp)
+{
+	ExtraParameter* param = getExtraParameterEntryCreate(param_type);
+	if (param)
+	{
+		param->data->unpack(*dp);
+		param->in_use = TRUE;
+		parameterChanged(param_type, param->data, TRUE, false);
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 param_type)
+{
+	LLNetworkData* new_block = NULL;
+	switch (param_type)
+	{
+	  case LLNetworkData::PARAMS_FLEXIBLE:
+	  {
+		  new_block = new LLFlexibleObjectData();
+		  break;
+	  }
+	  case LLNetworkData::PARAMS_LIGHT:
+	  {
+		  new_block = new LLLightParams();
+		  break;
+	  }
+	  case LLNetworkData::PARAMS_SCULPT:
+	  {
+		  new_block = new LLSculptParams();
+		  break;
+	  }
+	  case LLNetworkData::PARAMS_LIGHT_IMAGE:
+	  {
+		  new_block = new LLLightImageParams();
+		  break;
+	  }
+	  default:
+	  {
+		  llinfos << "Unknown param type." << llendl;
+		  break;
+	  }
+	};
+
+	if (new_block)
+	{
+		ExtraParameter* new_entry = new ExtraParameter;
+		new_entry->data = new_block;
+		new_entry->in_use = false; // not in use yet
+		mExtraParameterList[param_type] = new_entry;
+		return new_entry;
+	}
+	return NULL;
+}
+
+LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntry(U16 param_type) const
+{
+	std::map<U16, ExtraParameter*>::const_iterator itor = mExtraParameterList.find(param_type);
+	if (itor != mExtraParameterList.end())
+	{
+		return itor->second;
+	}
+	return NULL;
+}
+
+LLViewerObject::ExtraParameter* LLViewerObject::getExtraParameterEntryCreate(U16 param_type)
+{
+	ExtraParameter* param = getExtraParameterEntry(param_type);
+	if (!param)
+	{
+		param = createNewParameterEntry(param_type);
+	}
+	return param;
+}
+
+LLNetworkData* LLViewerObject::getParameterEntry(U16 param_type) const
+{
+	ExtraParameter* param = getExtraParameterEntry(param_type);
+	if (param)
+	{
+		return param->data;
+	}
+	else
+	{
+		return NULL;
+	}
+}
+
+BOOL LLViewerObject::getParameterEntryInUse(U16 param_type) const
+{
+	ExtraParameter* param = getExtraParameterEntry(param_type);
+	if (param)
+	{
+		return param->in_use;
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
+bool LLViewerObject::setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin)
+{
+	ExtraParameter* param = getExtraParameterEntryCreate(param_type);
+	if (param)
+	{
+		if (param->in_use && new_value == *(param->data))
+		{
+			return false;
+		}
+		param->in_use = true;
+		param->data->copy(new_value);
+		parameterChanged(param_type, param->data, TRUE, local_origin);
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
+// Assumed to be called locally
+// If in_use is TRUE, will crate a new extra parameter if none exists.
+// Should always return true.
+bool LLViewerObject::setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin)
+{
+	ExtraParameter* param = getExtraParameterEntryCreate(param_type);
+	if (param && param->in_use != in_use)
+	{
+		param->in_use = in_use;
+		parameterChanged(param_type, param->data, in_use, local_origin);
+		return true;
+	}
+	return false;
+}
+
+void LLViewerObject::parameterChanged(U16 param_type, bool local_origin)
+{
+	ExtraParameter* param = getExtraParameterEntry(param_type);
+	if (param)
+	{
+		parameterChanged(param_type, param->data, param->in_use, local_origin);
+	}
+}
+
+void LLViewerObject::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin)
+{
+	if (local_origin)
+	{
+		LLViewerRegion* regionp = getRegion();
+		if(!regionp) return;
+
+		// Change happened on the viewer. Send the change up
+		U8 tmp[MAX_OBJECT_PARAMS_SIZE];
+		LLDataPackerBinaryBuffer dpb(tmp, MAX_OBJECT_PARAMS_SIZE);
+		if (data->pack(dpb))
+		{
+			U32 datasize = (U32)dpb.getCurrentSize();
+
+			LLMessageSystem* msg = gMessageSystem;
+			msg->newMessageFast(_PREHASH_ObjectExtraParams);
+			msg->nextBlockFast(_PREHASH_AgentData);
+			msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+			msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			msg->nextBlockFast(_PREHASH_ObjectData);
+			msg->addU32Fast(_PREHASH_ObjectLocalID, mLocalID );
+
+			msg->addU16Fast(_PREHASH_ParamType, param_type);
+			msg->addBOOLFast(_PREHASH_ParamInUse, in_use);
+
+			msg->addU32Fast(_PREHASH_ParamSize, datasize);
+			msg->addBinaryDataFast(_PREHASH_ParamData, tmp, datasize);
+
+			msg->sendReliable( regionp->getHost() );
+		}
+		else
+		{
+			llwarns << "Failed to send object extra parameters: " << param_type << llendl;
+		}
+	}
+}
+
+void LLViewerObject::setDrawableState(U32 state, BOOL recursive)
+{
+	if (mDrawable)
+	{
+		mDrawable->setState(state);
+	}
+	if (recursive)
+	{
+		for (child_list_t::iterator iter = mChildList.begin();
+			 iter != mChildList.end(); iter++)
+		{
+			LLViewerObject* child = *iter;
+			child->setDrawableState(state, recursive);
+		}
+	}
+}
+
+void LLViewerObject::clearDrawableState(U32 state, BOOL recursive)
+{
+	if (mDrawable)
+	{
+		mDrawable->clearState(state);
+	}
+	if (recursive)
+	{
+		for (child_list_t::iterator iter = mChildList.begin();
+			 iter != mChildList.end(); iter++)
+		{
+			LLViewerObject* child = *iter;
+			child->clearDrawableState(state, recursive);
+		}
+	}
+}
+
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// RN: these functions assume a 2-level hierarchy 
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+// Owned by anyone?
+BOOL LLViewerObject::permAnyOwner() const
+{ 
+	if (isRootEdit())
+	{
+		return ((mFlags & FLAGS_OBJECT_ANY_OWNER) != 0); 
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permAnyOwner();
+	}
+}	
+// Owned by this viewer?
+BOOL LLViewerObject::permYouOwner() const
+{ 
+	if (isRootEdit())
+	{
+#ifdef HACKED_GODLIKE_VIEWER
+		return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+		if (!LLGridManager::getInstance()->isInProductionGrid()
+            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		{
+			return TRUE;
+		}
+# endif
+		return ((mFlags & FLAGS_OBJECT_YOU_OWNER) != 0); 
+#endif
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permYouOwner();
+	}
+}
+
+// Owned by a group?
+BOOL LLViewerObject::permGroupOwner() const		
+{ 
+	if (isRootEdit())
+	{
+		return ((mFlags & FLAGS_OBJECT_GROUP_OWNED) != 0); 
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permGroupOwner();
+	}
+}
+
+// Can the owner edit
+BOOL LLViewerObject::permOwnerModify() const
+{ 
+	if (isRootEdit())
+	{
+#ifdef HACKED_GODLIKE_VIEWER
+		return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+		if (!LLGridManager::getInstance()->isInProductionGrid()
+            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+	{
+			return TRUE;
+	}
+# endif
+		return ((mFlags & FLAGS_OBJECT_OWNER_MODIFY) != 0); 
+#endif
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permOwnerModify();
+	}
+}
+
+// Can edit
+BOOL LLViewerObject::permModify() const
+{ 
+	if (isRootEdit())
+	{
+#ifdef HACKED_GODLIKE_VIEWER
+		return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+		if (!LLGridManager::getInstance()->isInProductionGrid()
+            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+	{
+			return TRUE;
+	}
+# endif
+		return ((mFlags & FLAGS_OBJECT_MODIFY) != 0); 
+#endif
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permModify();
+	}
+}
+
+// Can copy
+BOOL LLViewerObject::permCopy() const
+{ 
+	if (isRootEdit())
+	{
+#ifdef HACKED_GODLIKE_VIEWER
+		return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+		if (!LLGridManager::getInstance()->isInProductionGrid()
+            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		{
+			return TRUE;
+		}
+# endif
+		return ((mFlags & FLAGS_OBJECT_COPY) != 0); 
+#endif
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permCopy();
+	}
+}
+
+// Can move
+BOOL LLViewerObject::permMove() const
+{
+	if (isRootEdit())
+	{
+#ifdef HACKED_GODLIKE_VIEWER
+		return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+		if (!LLGridManager::getInstance()->isInProductionGrid()
+            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		{
+			return TRUE;
+		}
+# endif
+		return ((mFlags & FLAGS_OBJECT_MOVE) != 0); 
+#endif
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permMove();
+	}
+}
+
+// Can be transferred
+BOOL LLViewerObject::permTransfer() const
+{ 
+	if (isRootEdit())
+	{
+#ifdef HACKED_GODLIKE_VIEWER
+		return TRUE;
+#else
+# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
+		if (!LLGridManager::getInstance()->isInProductionGrid()
+            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		{
+			return TRUE;
+		}
+# endif
+		return ((mFlags & FLAGS_OBJECT_TRANSFER) != 0); 
+#endif
+	}
+	else
+	{
+		return ((LLViewerObject*)getParent())->permTransfer();
+	}
+}
+
+// Can only open objects that you own, or that someone has
+// given you modify rights to.  JC
+BOOL LLViewerObject::allowOpen() const
+{
+	return !flagInventoryEmpty() && (permYouOwner() || permModify());
+}
+
+LLViewerObject::LLInventoryCallbackInfo::~LLInventoryCallbackInfo()
+{
+	if (mListener)
+	{
+		mListener->clearVOInventoryListener();
+	}
+}
+
+void LLViewerObject::updateVolume(const LLVolumeParams& volume_params)
+{
+	if (setVolume(volume_params, 1)) // *FIX: magic number, ack!
+	{
+		// Transmit the update to the simulator
+		sendShapeUpdate();
+		markForUpdate(TRUE);
+	}
+}
+
+void LLViewerObject::markForUpdate(BOOL priority)
+{
+	if (mDrawable.notNull())
+	{
+		gPipeline.markTextured(mDrawable);
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, priority);
+	}
+}
+
+bool LLViewerObject::getIncludeInSearch() const
+{
+	return ((mFlags & FLAGS_INCLUDE_IN_SEARCH) != 0);
+}
+
+void LLViewerObject::setIncludeInSearch(bool include_in_search)
+{
+	if (include_in_search)
+	{
+		mFlags |= FLAGS_INCLUDE_IN_SEARCH;
+	}
+	else
+	{
+		mFlags &= ~FLAGS_INCLUDE_IN_SEARCH;
+	}
+}
+
+void LLViewerObject::setRegion(LLViewerRegion *regionp)
+{
+	if (!regionp)
+	{
+		llwarns << "viewer object set region to NULL" << llendl;
+	}
+	
+	mLatestRecvPacketID = 0;
+	mRegionp = regionp;
+
+	for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
+	{
+		LLViewerObject* child = *i;
+		child->setRegion(regionp);
+	}
+
+	setChanged(MOVED | SILHOUETTE);
+	updateDrawable(FALSE);
+}
+
+// virtual
+void	LLViewerObject::updateRegion(LLViewerRegion *regionp)
+{
+//	if (regionp)
+//	{
+//		F64 now = LLFrameTimer::getElapsedSeconds();
+//		llinfos << "Updating to region " << regionp->getName()
+//			<< ", ms since last update message: " << (F32)((now - mLastMessageUpdateSecs) * 1000.0)
+//			<< ", ms since last interpolation: " << (F32)((now - mLastInterpUpdateSecs) * 1000.0) 
+//			<< llendl;
+//	}
+}
+
+
+bool LLViewerObject::specialHoverCursor() const
+{
+	return (mFlags & FLAGS_USE_PHYSICS)
+			|| (mFlags & FLAGS_HANDLE_TOUCH)
+			|| (mClickAction != 0);
+}
+
+void LLViewerObject::updateFlags(BOOL physics_changed)
+{
+	LLViewerRegion* regionp = getRegion();
+	if(!regionp) return;
+	gMessageSystem->newMessage("ObjectFlagUpdate");
+	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+	gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, getLocalID() );
+	gMessageSystem->addBOOLFast(_PREHASH_UsePhysics, usePhysics() );
+	gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
+	gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
+	gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
+	if (physics_changed)
+	{
+		gMessageSystem->nextBlock("ExtraPhysics");
+		gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
+		gMessageSystem->addF32("Density", getPhysicsDensity() );
+		gMessageSystem->addF32("Friction", getPhysicsFriction() );
+		gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
+		gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
+	}
+	gMessageSystem->sendReliable( regionp->getHost() );
+}
+
+BOOL LLViewerObject::setFlags(U32 flags, BOOL state)
+{
+	BOOL setit = FALSE;
+	if (state)
+	{
+		if ((mFlags & flags) != flags)
+		{
+			mFlags |= flags;
+			setit = TRUE;
+		}
+	}
+	else
+	{
+		if ((mFlags & flags) != 0)
+		{
+			mFlags &= ~flags;
+			setit = TRUE;
+		}
+	}
+
+	// BUG: Sometimes viewer physics and simulator physics get
+	// out of sync.  To fix this, always send update to simulator.
+// 	if (setit)
+	{
+		updateFlags();
+	}
+	return setit;
+}
+
+void LLViewerObject::setPhysicsShapeType(U8 type)
+{
+	mPhysicsShapeUnknown = false;
+	mPhysicsShapeType = type;
+	mCostStale = true;
+}
+
+void LLViewerObject::setPhysicsGravity(F32 gravity)
+{
+	mPhysicsGravity = gravity;
+}
+
+void LLViewerObject::setPhysicsFriction(F32 friction)
+{
+	mPhysicsFriction = friction;
+}
+
+void LLViewerObject::setPhysicsDensity(F32 density)
+{
+	mPhysicsDensity = density;
+}
+
+void LLViewerObject::setPhysicsRestitution(F32 restitution)
+{
+	mPhysicsRestitution = restitution;
+}
+
+U8 LLViewerObject::getPhysicsShapeType() const
+{ 
+	if (mPhysicsShapeUnknown)
+	{
+		mPhysicsShapeUnknown = false;
+		gObjectList.updatePhysicsFlags(this);
+	}
+
+	return mPhysicsShapeType; 
+}
+
+void LLViewerObject::applyAngularVelocity(F32 dt)
+{
+	//do target omega here
+	mRotTime += dt;
+	LLVector3 ang_vel = getAngularVelocity();
+	F32 omega = ang_vel.magVecSquared();
+	F32 angle = 0.0f;
+	LLQuaternion dQ;
+	if (omega > 0.00001f)
+	{
+		omega = sqrt(omega);
+		angle = omega * dt;
+
+		ang_vel *= 1.f/omega;
+		
+		dQ.setQuat(angle, ang_vel);
+		
+		setRotation(getRotation()*dQ);
+		setChanged(MOVED | SILHOUETTE);
+	}
+}
+
+void LLViewerObject::resetRot()
+{
+	mRotTime = 0.0f;
+}
+
+U32 LLViewerObject::getPartitionType() const
+{ 
+	return LLViewerRegion::PARTITION_NONE; 
+}
+
+void LLViewerObject::dirtySpatialGroup(BOOL priority) const
+{
+	if (mDrawable)
+	{
+		LLSpatialGroup* group = mDrawable->getSpatialGroup();
+		if (group)
+		{
+			group->dirtyGeom();
+			gPipeline.markRebuild(group, priority);
+		}
+	}
+}
+
+void LLViewerObject::dirtyMesh()
+{
+	if (mDrawable)
+	{
+		LLSpatialGroup* group = mDrawable->getSpatialGroup();
+		if (group)
+		{
+			group->dirtyMesh();
+		}
+	}
+}
+
+F32 LLAlphaObject::getPartSize(S32 idx)
+{
+	return 0.f;
+}
+
+// virtual
+void LLStaticViewerObject::updateDrawable(BOOL force_damped)
+{
+	// Force an immediate rebuild on any update
+	if (mDrawable.notNull())
+	{
+		mDrawable->updateXform(TRUE);
+		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
+	}
+	clearChanged(SHIFTED);
+}
+
+void LLViewerObject::saveUnselectedChildrenPosition(std::vector<LLVector3>& positions)
+{
+	if(mChildList.empty() || !positions.empty())
+	{
+		return ;
+	}
+
+	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+			iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* childp = *iter;
+		if (!childp->isSelected() && childp->mDrawable.notNull())
+		{
+			positions.push_back(childp->getPositionEdit());		
+		}
+	}
+
+	return ;
+}
+
+void LLViewerObject::saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations)
+{
+	if(mChildList.empty())
+	{
+		return ;
+	}
+
+	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+			iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* childp = *iter;
+		if (!childp->isSelected() && childp->mDrawable.notNull())
+		{
+			rotations.push_back(childp->getRotationEdit());				
+		}		
+	}
+
+	return ;
+}
+
+//counter-rotation
+void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, 
+											const std::vector<LLVector3>& positions)
+{
+	if(mChildList.empty())
+	{
+		return ;
+	}
+
+	S32 index = 0 ;
+	LLQuaternion inv_rotation = ~getRotationEdit() ;
+	LLVector3 offset = getPositionEdit() ;
+	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+			iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* childp = *iter;
+		if (!childp->isSelected() && childp->mDrawable.notNull())
+		{
+			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+			{
+				childp->setRotation(rotations[index] * inv_rotation);
+				childp->setPosition((positions[index] - offset) * inv_rotation);
+				LLManip::rebuild(childp);					
+			}
+			else //avatar
+			{
+				LLVector3 reset_pos = (positions[index] - offset) * inv_rotation ;
+				LLQuaternion reset_rot = rotations[index] * inv_rotation ;
+
+				((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);				
+				((LLVOAvatar*)childp)->mDrawable->mXform.setRotation(reset_rot) ;
+				
+				((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos, TRUE);				
+				((LLVOAvatar*)childp)->mDrawable->getVObj()->setRotation(reset_rot, TRUE) ;
+
+				LLManip::rebuild(childp);				
+			}	
+			index++;
+		}				
+	}
+
+	return ;
+}
+
+//counter-translation
+void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified)
+{
+	if(mChildList.empty())
+	{
+		return ;
+	}
+
+	LLVector3 child_offset;
+	if(simplified) //translation only, rotation matrix does not change
+	{
+		child_offset = offset * ~getRotation();
+	}
+	else //rotation matrix might change too.
+	{
+		if (isAttachment() && mDrawable.notNull())
+		{
+			LLXform* attachment_point_xform = mDrawable->getXform()->getParent();
+			LLQuaternion parent_rotation = getRotation() * attachment_point_xform->getWorldRotation();
+			child_offset = offset * ~parent_rotation;
+		}
+		else
+		{
+			child_offset = offset * ~getRenderRotation();
+		}
+	}
+
+	for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+			iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* childp = *iter;
+		if (!childp->isSelected() && childp->mDrawable.notNull())
+		{
+			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+			{
+				childp->setPosition(childp->getPosition() + child_offset);
+				LLManip::rebuild(childp);
+			}
+			else //avatar
+			{
+				LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
+
+				((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
+				((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);				
+				
+				LLManip::rebuild(childp);
+			}			
+		}		
+	}
+
+	return ;
+}
+
+const LLUUID &LLViewerObject::getAttachmentItemID() const
+{
+	return mAttachmentItemID;
+}
+
+void LLViewerObject::setAttachmentItemID(const LLUUID &id)
+{
+	mAttachmentItemID = id;
+}
+
+EObjectUpdateType LLViewerObject::getLastUpdateType() const
+{
+	return mLastUpdateType;
+}
+
+void LLViewerObject::setLastUpdateType(EObjectUpdateType last_update_type)
+{
+	mLastUpdateType = last_update_type;
+}
+
+BOOL LLViewerObject::getLastUpdateCached() const
+{
+	return mLastUpdateCached;
+}
+
+void LLViewerObject::setLastUpdateCached(BOOL last_update_cached)
+{
+	mLastUpdateCached = last_update_cached;
+}
+
+const LLUUID &LLViewerObject::extractAttachmentItemID()
+{
+	LLUUID item_id = LLUUID::null;
+	LLNameValue* item_id_nv = getNVPair("AttachItemID");
+	if( item_id_nv )
+	{
+		const char* s = item_id_nv->getString();
+		if( s )
+		{
+			item_id.set(s);
+		}
+	}
+	setAttachmentItemID(item_id);
+	return getAttachmentItemID();
+}
+
+//virtual
+LLVOAvatar* LLViewerObject::getAvatar() const
+{
+	if (isAttachment())
+	{
+		LLViewerObject* vobj = (LLViewerObject*) getParent();
+
+		while (vobj && !vobj->asAvatar())
+		{
+			vobj = (LLViewerObject*) vobj->getParent();
+		}
+
+		return (LLVOAvatar*) vobj;
+	}
+
+	return NULL;
+}
+
+
+class ObjectPhysicsProperties : public LLHTTPNode
+{
+public:
+	virtual void post(
+		ResponsePtr responder,
+		const LLSD& context,
+		const LLSD& input) const
+	{
+		LLSD object_data = input["body"]["ObjectData"];
+		S32 num_entries = object_data.size();
+		
+		for ( S32 i = 0; i < num_entries; i++ )
+		{
+			LLSD& curr_object_data = object_data[i];
+			U32 local_id = curr_object_data["LocalID"].asInteger();
+
+			// Iterate through nodes at end, since it can be on both the regular AND hover list
+			struct f : public LLSelectedNodeFunctor
+			{
+				U32 mID;
+				f(const U32& id) : mID(id) {}
+				virtual bool apply(LLSelectNode* node)
+				{
+					return (node->getObject() && node->getObject()->mLocalID == mID );
+				}
+			} func(local_id);
+
+			LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func);
+
+			if (node)
+			{
+				// The LLSD message builder doesn't know how to handle U8, so we need to send as S8 and cast
+				U8 type = (U8)curr_object_data["PhysicsShapeType"].asInteger();
+				F32 density = (F32)curr_object_data["Density"].asReal();
+				F32 friction = (F32)curr_object_data["Friction"].asReal();
+				F32 restitution = (F32)curr_object_data["Restitution"].asReal();
+				F32 gravity = (F32)curr_object_data["GravityMultiplier"].asReal();
+
+				node->getObject()->setPhysicsShapeType(type);
+				node->getObject()->setPhysicsGravity(gravity);
+				node->getObject()->setPhysicsFriction(friction);
+				node->getObject()->setPhysicsDensity(density);
+				node->getObject()->setPhysicsRestitution(restitution);
+			}	
+		}
+		
+		dialog_refresh_all();
+	};
+};
+
+LLHTTPRegistration<ObjectPhysicsProperties>
+	gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties");
+
+
+void LLViewerObject::updateQuota( const SelectionQuota& quota )
+{
+	//update quotas
+	mSelectionQuota = quota;
+}
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 21198f7dd122f5f4f3a14294317cab052cb5b476..1335c5c3197042eae364564b3fa767100241873f 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -1,818 +1,825 @@
-/** 
- * @file llviewerobject.h
- * @brief Description of LLViewerObject class, which is the base class for most objects in the viewer.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLVIEWEROBJECT_H
-#define LL_LLVIEWEROBJECT_H
-
-#include <map>
-
-#include "llassetstorage.h"
-#include "lldarrayptr.h"
-#include "llhudicon.h"
-#include "llinventory.h"
-#include "llrefcount.h"
-#include "llmemtype.h"
-#include "llprimitive.h"
-#include "lluuid.h"
-#include "llvoinventorylistener.h"
-#include "object_flags.h"
-#include "llquaternion.h"
-#include "v3dmath.h"
-#include "v3math.h"
-#include "llvertexbuffer.h"
-
-class LLAgent;			// TODO: Get rid of this.
-class LLAudioSource;
-class LLAudioSourceVO;
-class LLBBox;
-class LLDataPacker;
-class LLColor4;
-class LLFrameTimer;
-class LLDrawable;
-class LLHost;
-class LLHUDText;
-class LLWorld;
-class LLNameValue;
-class LLNetMap;
-class LLMessageSystem;
-class LLPartSysData;
-class LLPrimitive;
-class LLPipeline;
-class LLTextureEntry;
-class LLViewerTexture;
-class LLViewerInventoryItem;
-class LLViewerObject;
-class LLViewerPartSourceScript;
-class LLViewerRegion;
-class LLViewerObjectMedia;
-class LLVOInventoryListener;
-class LLVOAvatar;
-
-typedef enum e_object_update_type
-{
-	OUT_FULL,
-	OUT_TERSE_IMPROVED,
-	OUT_FULL_COMPRESSED,
-	OUT_FULL_CACHED,
-	OUT_UNKNOWN,
-} EObjectUpdateType;
-
-
-// callback typedef for inventory
-typedef void (*inventory_callback)(LLViewerObject*,
-								   LLInventoryObject::object_list_t*,
-								   S32 serial_num,
-								   void*);
-
-// a small struct for keeping track of joints
-struct LLVOJointInfo
-{
-	EHavokJointType mJointType;
-	LLVector3 mPivot;			// parent-frame
-	// whether the below an axis or anchor (and thus its frame)
-	// depends on the joint type:
-	//     HINGE   ==>   axis=parent-frame
-	//     P2P     ==>   anchor=child-frame
-	LLVector3 mAxisOrAnchor;	
-};
-
-// for exporting textured materials from SL
-struct LLMaterialExportInfo
-{
-public:
-	LLMaterialExportInfo(S32 mat_index, S32 texture_index, LLColor4 color) : 
-	  mMaterialIndex(mat_index), mTextureIndex(texture_index), mColor(color) {};
-
-	S32			mMaterialIndex;
-	S32			mTextureIndex;
-	LLColor4	mColor;
-};
-
-//============================================================================
-
-class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
-{
-protected:
-	~LLViewerObject(); // use unref()
-
-	// TomY: Provide for a list of extra parameter structures, mapped by structure name
-	struct ExtraParameter
-	{
-		BOOL in_use;
-		LLNetworkData *data;
-	};
-	std::map<U16, ExtraParameter*> mExtraParameterList;
-
-public:
-	typedef std::list<LLPointer<LLViewerObject> > child_list_t;
-	typedef std::list<LLPointer<LLViewerObject> > vobj_list_t;
-
-	typedef const child_list_t const_child_list_t;
-
-	LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global = FALSE);
-	MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
-
-	virtual void markDead();				// Mark this object as dead, and clean up its references
-	BOOL isDead() const									{return mDead;}
-	BOOL isOrphaned() const								{ return mOrphaned; }
-	BOOL isParticleSource() const;
-
-	virtual LLVOAvatar* asAvatar();
-
-	static void initVOClasses();
-	static void cleanupVOClasses();
-
-	void			addNVPair(const std::string& data);
-	BOOL			removeNVPair(const std::string& name);
-	LLNameValue*	getNVPair(const std::string& name) const;			// null if no name value pair by that name
-
-	// Object create and update functions
-	virtual BOOL	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
-
-	// Types of media we can associate
-	enum { MEDIA_NONE = 0, MEDIA_SET = 1 };
-
-	// Return codes for processUpdateMessage
-	enum { 
-        MEDIA_URL_REMOVED = 0x1, 
-        MEDIA_URL_ADDED = 0x2, 
-        MEDIA_URL_UPDATED = 0x4, 
-        MEDIA_FLAGS_CHANGED = 0x8,
-        INVALID_UPDATE = 0x80000000
-    };
-
-	virtual U32		processUpdateMessage(LLMessageSystem *mesgsys,
-										void **user_data,
-										U32 block_num,
-										const EObjectUpdateType update_type,
-										LLDataPacker *dp);
-
-
-	virtual BOOL    isActive() const; // Whether this object needs to do an idleUpdate.
-	BOOL			onActiveList() const				{return mOnActiveList;}
-	void			setOnActiveList(BOOL on_active)		{ mOnActiveList = on_active; }
-
-	virtual BOOL	isAttachment() const { return FALSE; }
-	virtual LLVOAvatar* getAvatar() const;  //get the avatar this object is attached to, or NULL if object is not an attachment
-	virtual BOOL	isHUDAttachment() const { return FALSE; }
-	virtual void 	updateRadius() {};
-	virtual F32 	getVObjRadius() const; // default implemenation is mDrawable->getRadius()
-	
-	BOOL 			isJointChild() const { return mJointInfo ? TRUE : FALSE; } 
-	EHavokJointType	getJointType() const { return mJointInfo ? mJointInfo->mJointType : HJT_INVALID; }
-	// for jointed and other parent-relative hacks
-	LLViewerObject* getSubParent();
-	const LLViewerObject* getSubParent() const;
-	
-	// Object visiblility and GPW functions
-	virtual void setPixelAreaAndAngle(LLAgent &agent); // Override to generate accurate apparent angle and area
-
-	virtual U32 getNumVertices() const;
-	virtual U32 getNumIndices() const;
-	S32 getNumFaces() const { return mNumFaces; }
-
-	// Graphical stuff for objects - maybe broken out into render class later?
-	virtual void updateTextures();
-	virtual void boostTexturePriority(BOOL boost_children = TRUE);	// When you just want to boost priority of this object
-	
-	virtual LLDrawable* createDrawable(LLPipeline *pipeline);
-	virtual BOOL		updateGeometry(LLDrawable *drawable);
-	virtual void		updateGL();
-	virtual void		updateFaceSize(S32 idx);
-	virtual BOOL		updateLOD();
-	virtual BOOL		setDrawableParent(LLDrawable* parentp);
-	F32					getRotTime() { return mRotTime; }
-	void				resetRot();
-	void				applyAngularVelocity(F32 dt);
-
-	void setLineWidthForWindowSize(S32 window_width);
-
-	static void increaseArrowLength();				// makes axis arrows for selections longer
-	static void decreaseArrowLength();				// makes axis arrows for selections shorter
-
-	// Accessor functions
-	LLViewerRegion* getRegion() const				{ return mRegionp; }
-
-	BOOL isSelected() const							{ return mUserSelected; }
-	virtual void setSelected(BOOL sel)				{ mUserSelected = sel; mRotTime = 0.f;}
-
-	const LLUUID &getID() const						{ return mID; }
-	U32 getLocalID() const							{ return mLocalID; }
-	U32 getCRC() const								{ return mTotalCRC; }
-
-	virtual BOOL isFlexible() const					{ return FALSE; }
-	virtual BOOL isSculpted() const 				{ return FALSE; }
-	virtual BOOL isMesh() const						{ return FALSE; }
-	virtual BOOL hasLightTexture() const			{ return FALSE; }
-
-	// This method returns true if the object is over land owned by
-	// the agent, one of its groups, or it encroaches and 
-	// anti-encroachment is enabled
-	bool isReturnable();
-
-	/*
-	// This method will scan through this object, and then query the
-	// selection manager to see if the local agent probably has the
-	// ability to modify the object. Since this calls into the
-	// selection manager, you should avoid calling this method from
-	// there.
-	BOOL isProbablyModifiable() const;
-	*/
-
-	virtual BOOL setParent(LLViewerObject* parent);
-	virtual void addChild(LLViewerObject *childp);
-	virtual void removeChild(LLViewerObject *childp);
-	const_child_list_t& getChildren() const { 	return mChildList; }
-	S32 numChildren() const { return mChildList.size(); }
-	void addThisAndAllChildren(std::vector<LLViewerObject*>& objects);
-	void addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects);
-	BOOL isChild(LLViewerObject *childp) const;
-	BOOL isSeat() const;
-	
-
-	//detect if given line segment (in agent space) intersects with this viewer object.
-	//returns TRUE if intersection detected and returns information about intersection
-	virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
-									  S32 face = -1,                          // which face to check, -1 = ALL_SIDES
-									  BOOL pick_transparent = FALSE,
-									  S32* face_hit = NULL,                   // which face was hit
-									  LLVector3* intersection = NULL,         // return the intersection point
-									  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
-									  LLVector3* normal = NULL,               // return the surface normal at the intersection point
-									  LLVector3* bi_normal = NULL             // return the surface bi-normal at the intersection point
-		);
-	
-	virtual BOOL lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end);
-
-	virtual const LLVector3d getPositionGlobal() const;
-	virtual const LLVector3 &getPositionRegion() const;
-	virtual const LLVector3 getPositionEdit() const;
-	virtual const LLVector3 &getPositionAgent() const;
-	virtual const LLVector3 getRenderPosition() const;
-
-	virtual const LLVector3 getPivotPositionAgent() const; // Usually = to getPositionAgent, unless like flex objects it's not
-
-	LLViewerObject* getRootEdit() const;
-
-	const LLQuaternion getRotationRegion() const;
-	const LLQuaternion getRotationEdit() const;
-	const LLQuaternion getRenderRotation() const;
-	virtual	const LLMatrix4 getRenderMatrix() const;
-
-	void setPosition(const LLVector3 &pos, BOOL damped = FALSE);
-	void setPositionGlobal(const LLVector3d &position, BOOL damped = FALSE);
-	void setPositionRegion(const LLVector3 &position, BOOL damped = FALSE);
-	void setPositionEdit(const LLVector3 &position, BOOL damped = FALSE);
-	void setPositionAgent(const LLVector3 &pos_agent, BOOL damped = FALSE);
-	void setPositionParent(const LLVector3 &pos_parent, BOOL damped = FALSE);
-	void setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped = FALSE );
-
-	virtual const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const		{ return xform->getWorldMatrix(); }
-
-	inline void setRotation(const F32 x, const F32 y, const F32 z, BOOL damped = FALSE);
-	inline void setRotation(const LLQuaternion& quat, BOOL damped = FALSE);
-	void sendRotationUpdate() const;
-
-	/*virtual*/	void	setNumTEs(const U8 num_tes);
-	/*virtual*/	void	setTE(const U8 te, const LLTextureEntry &texture_entry);
-	/*virtual*/ S32		setTETexture(const U8 te, const LLUUID &uuid);
-	S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host);
-	/*virtual*/ S32		setTEColor(const U8 te, const LLColor3 &color);
-	/*virtual*/ S32		setTEColor(const U8 te, const LLColor4 &color);
-	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t);
-	/*virtual*/ S32		setTEScaleS(const U8 te, const F32 s);
-	/*virtual*/ S32		setTEScaleT(const U8 te, const F32 t);
-	/*virtual*/ S32		setTEOffset(const U8 te, const F32 s, const F32 t);
-	/*virtual*/ S32		setTEOffsetS(const U8 te, const F32 s);
-	/*virtual*/ S32		setTEOffsetT(const U8 te, const F32 t);
-	/*virtual*/ S32		setTERotation(const U8 te, const F32 r);
-	/*virtual*/	S32		setTEBumpmap(const U8 te, const U8 bump );
-	/*virtual*/	S32		setTETexGen(const U8 te, const U8 texgen );
-	/*virtual*/	S32		setTEMediaTexGen(const U8 te, const U8 media ); // *FIXME: this confusingly acts upon a superset of setTETexGen's flags without absorbing its semantics
-	/*virtual*/	S32		setTEShiny(const U8 te, const U8 shiny );
-	/*virtual*/	S32		setTEFullbright(const U8 te, const U8 fullbright );
-	/*virtual*/	S32		setTEMediaFlags(const U8 te, const U8 media_flags );
-	/*virtual*/ S32     setTEGlow(const U8 te, const F32 glow);
-	/*virtual*/	BOOL	setMaterial(const U8 material);
-	virtual		void	setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive
-	void                changeTEImage(S32 index, LLViewerTexture* new_image)  ;
-	LLViewerTexture		*getTEImage(const U8 te) const;
-	
-	void fitFaceTexture(const U8 face);
-	void sendTEUpdate() const;			// Sends packed representation of all texture entry information
-	
-	virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
-
-	virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
-	virtual U32 getTriangleCount();
-	virtual U32 getHighLODTriangleCount();
-
-	void setObjectCost(F32 cost);
-	F32 getObjectCost();
-	
-	void setLinksetCost(F32 cost);
-	F32 getLinksetCost();
-	
-	void setPhysicsCost(F32 cost);
-	F32 getPhysicsCost();
-	
-	void setLinksetPhysicsCost(F32 cost);
-	F32 getLinksetPhysicsCost();
-
-	void sendShapeUpdate();
-
-	U8 getState()							{ return mState; }
-
-	F32 getAppAngle() const					{ return mAppAngle; }
-	F32 getPixelArea() const				{ return mPixelArea; }
-	void setPixelArea(F32 area)				{ mPixelArea = area; }
-	F32 getMaxScale() const;
-	F32 getMidScale() const;
-	F32 getMinScale() const;
-
-	// Owner id is this object's owner
-	void setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags);
-	void adjustAudioGain(const F32 gain);
-	void clearAttachedSound()								{ mAudioSourcep = NULL; }
-
-	 // Create if necessary
-	LLAudioSource *getAudioSource(const LLUUID& owner_id);
-	bool isAudioSource() {return mAudioSourcep != NULL;}
-
-	U8 getMediaType() const;
-	void setMediaType(U8 media_type);
-
-	std::string getMediaURL() const;
-	void setMediaURL(const std::string& media_url);
-
-	BOOL getMediaPassedWhitelist() const;
-	void setMediaPassedWhitelist(BOOL passed);
-
-	void sendMaterialUpdate() const;
-
-	void setCanSelect(BOOL canSelect);
-
-	void setDebugText(const std::string &utf8text);
-	void setIcon(LLViewerTexture* icon_image);
-	void clearIcon();
-
-	void markForUpdate(BOOL priority);
-	void updateVolume(const LLVolumeParams& volume_params);
-	virtual	void updateSpatialExtents(LLVector4a& min, LLVector4a& max);
-	virtual F32 getBinRadius();
-	
-	LLBBox				getBoundingBoxAgent() const;
-
-	void updatePositionCaches() const; // Update the global and region position caches from the object (and parent's) xform.
-	void updateText(); // update text label position
-	virtual void updateDrawable(BOOL force_damped); // force updates on static objects
-
-	void setDrawableState(U32 state, BOOL recursive = TRUE);
-	void clearDrawableState(U32 state, BOOL recursive = TRUE);
-
-	// Called when the drawable shifts
-	virtual void onShift(const LLVector4a &shift_vector)	{ }
-		
-	//////////////////////////////////////
-	//
-	// Inventory methods
-	//
-
-	// This function is called when someone is interested in a viewer
-	// object's inventory. The callback is called as soon as the
-	// viewer object has the inventory stored locally.
-	void registerInventoryListener(LLVOInventoryListener* listener, void* user_data);
-	void removeInventoryListener(LLVOInventoryListener* listener);
-	BOOL isInventoryPending() { return mInventoryPending; }
-	void clearInventoryListeners();
-	void requestInventory();
-	void fetchInventoryFromServer();
-	static void processTaskInv(LLMessageSystem* msg, void** user_data);
-	void removeInventory(const LLUUID& item_id);
-
-	// The updateInventory() call potentially calls into the selection
-	// manager, so do no call updateInventory() from the selection
-	// manager until we have better iterators.
-	void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
-	void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
-	LLInventoryObject* getInventoryObject(const LLUUID& item_id);
-	void getInventoryContents(LLInventoryObject::object_list_t& objects);
-	LLInventoryObject* getInventoryRoot();
-	LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);
-	S16 getInventorySerial() const { return mInventorySerialNum; }
-
-	// These functions does viewer-side only object inventory modifications
-	void updateViewerInventoryAsset(
-		const LLViewerInventoryItem* item,
-		const LLUUID& new_asset);
-
-	// This function will make sure that we refresh the inventory.
-	void dirtyInventory();
-	BOOL isInventoryDirty() { return mInventoryDirty; }
-
-	// save a script, which involves removing the old one, and rezzing
-	// in the new one. This method should be called with the asset id
-	// of the new and old script AFTER the bytecode has been saved.
-	void saveScript(const LLViewerInventoryItem* item, BOOL active, bool is_new);
-
-	// move an inventory item out of the task and into agent
-	// inventory. This operation is based on messaging. No permissions
-	// checks are made on the viewer - the server will double check.
-	void moveInventory(const LLUUID& agent_folder, const LLUUID& item_id);
-
-	// Find the number of instances of this object's inventory that are of the given type
-	S32 countInventoryContents( LLAssetType::EType type );
-
-	BOOL			permAnyOwner() const;	
-	BOOL			permYouOwner() const;
-	BOOL			permGroupOwner() const;
-	BOOL			permOwnerModify() const;
-	BOOL			permModify() const;	
-	BOOL			permCopy() const;	
-	BOOL			permMove() const;		
-	BOOL			permTransfer() const;
-	inline BOOL		usePhysics() const				{ return ((mFlags & FLAGS_USE_PHYSICS) != 0); }
-	inline BOOL		flagScripted() const			{ return ((mFlags & FLAGS_SCRIPTED) != 0); }
-	inline BOOL		flagHandleTouch() const			{ return ((mFlags & FLAGS_HANDLE_TOUCH) != 0); }
-	inline BOOL		flagTakesMoney() const			{ return ((mFlags & FLAGS_TAKES_MONEY) != 0); }
-	inline BOOL		flagPhantom() const				{ return ((mFlags & FLAGS_PHANTOM) != 0); }
-	inline BOOL		flagInventoryEmpty() const		{ return ((mFlags & FLAGS_INVENTORY_EMPTY) != 0); }
-	inline BOOL		flagCastShadows() const			{ return ((mFlags & FLAGS_CAST_SHADOWS) != 0); }
-	inline BOOL		flagAllowInventoryAdd() const	{ return ((mFlags & FLAGS_ALLOW_INVENTORY_DROP) != 0); }
-	inline BOOL		flagTemporary() const			{ return ((mFlags & FLAGS_TEMPORARY) != 0); }
-	inline BOOL		flagTemporaryOnRez() const		{ return ((mFlags & FLAGS_TEMPORARY_ON_REZ) != 0); }
-	inline BOOL		flagAnimSource() const			{ return ((mFlags & FLAGS_ANIM_SOURCE) != 0); }
-	inline BOOL		flagCameraSource() const		{ return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); }
-	inline BOOL		flagCameraDecoupled() const		{ return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
-	inline BOOL		flagObjectMove() const			{ return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
-
-	U8       getPhysicsShapeType() const;
-	inline F32      getPhysicsGravity() const       { return mPhysicsGravity; }
-	inline F32      getPhysicsFriction() const      { return mPhysicsFriction; }
-	inline F32      getPhysicsDensity() const       { return mPhysicsDensity; }
-	inline F32      getPhysicsRestitution() const   { return mPhysicsRestitution; }
-	
-	bool getIncludeInSearch() const;
-	void setIncludeInSearch(bool include_in_search);
-
-	// Does "open" object menu item apply?
-	BOOL allowOpen() const;
-
-	void setClickAction(U8 action) { mClickAction = action; }
-	U8 getClickAction() const { return mClickAction; }
-	bool specialHoverCursor() const;	// does it have a special hover cursor?
-
-	void			setRegion(LLViewerRegion *regionp);
-	virtual void	updateRegion(LLViewerRegion *regionp);
-
-	void updateFlags(BOOL physics_changed = FALSE);
-	BOOL setFlags(U32 flag, BOOL state);
-	void setPhysicsShapeType(U8 type);
-	void setPhysicsGravity(F32 gravity);
-	void setPhysicsFriction(F32 friction);
-	void setPhysicsDensity(F32 density);
-	void setPhysicsRestitution(F32 restitution);
-	
-	virtual void dump() const;
-	static U32		getNumZombieObjects()			{ return sNumZombieObjects; }
-
-	void printNameValuePairs() const;
-
-	virtual S32 getLOD() const { return 3; } 
-	virtual U32 getPartitionType() const;
-	virtual void dirtySpatialGroup(BOOL priority = FALSE) const;
-	virtual void dirtyMesh();
-
-	virtual LLNetworkData* getParameterEntry(U16 param_type) const;
-	virtual bool setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin);
-	virtual BOOL getParameterEntryInUse(U16 param_type) const;
-	virtual bool setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin);
-	// Called when a parameter is changed
-	virtual void parameterChanged(U16 param_type, bool local_origin);
-	virtual void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin);
-	
-	friend class LLViewerObjectList;
-	friend class LLViewerMediaList;
-
-public:
-	//counter-translation
-	void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ;
-	//counter-rotation
-	void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, 
-											const std::vector<LLVector3>& positions) ;
-	void saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) ;
-	void saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) ;
-	std::vector<LLVector3> mUnselectedChildrenPositions ;
-
-private:
-	ExtraParameter* createNewParameterEntry(U16 param_type);
-	ExtraParameter* getExtraParameterEntry(U16 param_type) const;
-	ExtraParameter* getExtraParameterEntryCreate(U16 param_type);
-	bool unpackParameterEntry(U16 param_type, LLDataPacker *dp);
-
-    // This function checks to see if the given media URL has changed its version
-    // and the update wasn't due to this agent's last action.
-    U32 checkMediaURL(const std::string &media_url);
-	
-	// Motion prediction between updates
-	void interpolateLinearMotion(const F64 & time, const F32 & dt);
-
-public:
-	//
-	// Viewer-side only types - use the LL_PCODE_APP mask.
-	//
-	typedef enum e_vo_types
-	{
-		LL_VO_CLOUDS =				LL_PCODE_APP | 0x20,
-		LL_VO_SURFACE_PATCH =		LL_PCODE_APP | 0x30,
-		LL_VO_WL_SKY =				LL_PCODE_APP | 0x40,
-		LL_VO_SQUARE_TORUS =		LL_PCODE_APP | 0x50,
-		LL_VO_SKY =					LL_PCODE_APP | 0x60,
-		LL_VO_VOID_WATER =			LL_PCODE_APP | 0x70,
-		LL_VO_WATER =				LL_PCODE_APP | 0x80,
-		LL_VO_GROUND =				LL_PCODE_APP | 0x90,
-		LL_VO_PART_GROUP =			LL_PCODE_APP | 0xa0,
-		LL_VO_TRIANGLE_TORUS =		LL_PCODE_APP | 0xb0,
-		LL_VO_HUD_PART_GROUP =		LL_PCODE_APP | 0xc0,
-	} EVOType;
-
-	typedef enum e_physics_shape_types
-	{
-		PHYSICS_SHAPE_PRIM = 0,
-		PHYSICS_SHAPE_NONE,
-		PHYSICS_SHAPE_CONVEX_HULL,
-	} EPhysicsShapeType;
-
-	LLUUID			mID;
-
-	// unique within region, not unique across regions
-	// Local ID = 0 is not used
-	U32				mLocalID;
-
-	// Last total CRC received from sim, used for caching
-	U32				mTotalCRC;
-
-	LLPointer<LLViewerTexture> *mTEImages;
-
-	// Selection, picking and rendering variables
-	U32				mGLName;			// GL "name" used by selection code
-	BOOL			mbCanSelect;		// true if user can select this object by clicking
-
-	// Grabbed from UPDATE_FLAGS
-	U32				mFlags;
-
-	// Sent to sim in UPDATE_FLAGS, received in ObjectPhysicsProperties
-	U8              mPhysicsShapeType;
-	F32             mPhysicsGravity;
-	F32             mPhysicsFriction;
-	F32             mPhysicsDensity;
-	F32             mPhysicsRestitution;
-	
-
-	// Pipeline classes
-	LLPointer<LLDrawable> mDrawable;
-
-	// Band-aid to select object after all creation initialization is done
-	BOOL mCreateSelected;
-
-	// Replace textures with web pages on this object while drawing
-	BOOL mRenderMedia;
-
-	// In bits
-	S32				mBestUpdatePrecision;
-
-	// TODO: Make all this stuff private.  JC
-	LLPointer<LLHUDText> mText;
-	LLPointer<LLHUDIcon> mIcon;
-
-	static			BOOL		sUseSharedDrawables;
-
-protected:
-	// delete an item in the inventory, but don't tell the
-	// server. This is used internally by remove, update, and
-	// savescript.
-	void deleteInventoryItem(const LLUUID& item_id);
-
-	// do the update/caching logic. called by saveScript and
-	// updateInventory.
-	void doUpdateInventory(LLPointer<LLViewerInventoryItem>& item, U8 key, bool is_new);
-
-
-	static LLViewerObject *createObject(const LLUUID &id, LLPCode pcode, LLViewerRegion *regionp);
-
-	BOOL setData(const U8 *datap, const U32 data_size);
-
-	// Hide or show HUD, icon and particles
-	void	hideExtraDisplayItems( BOOL hidden );
-
-	//////////////////////////
-	//
-	// inventory functionality
-	//
-
-	static void processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status);
-	void loadTaskInvFile(const std::string& filename);
-	void doInventoryCallback();
-	
-	BOOL isOnMap();
-
-	void unpackParticleSource(const S32 block_num, const LLUUID& owner_id);
-	void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id);
-	void deleteParticleSource();
-	void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);
-
-private:
-	void setNameValueList(const std::string& list);		// clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string
-	void deleteTEImages(); // correctly deletes list of images
-	
-protected:
-	typedef std::map<char *, LLNameValue *> name_value_map_t;
-	name_value_map_t mNameValuePairs;	// Any name-value pairs stored by script
-
-	child_list_t	mChildList;
-	
-	F64				mLastInterpUpdateSecs;			// Last update for purposes of interpolation
-	F64				mLastMessageUpdateSecs;			// Last update from a message from the simulator
-	TPACKETID		mLatestRecvPacketID;			// Latest time stamp on message from simulator
-
-	// extra data sent from the sim...currently only used for tree species info
-	U8* mData;
-
-	LLPointer<LLViewerPartSourceScript>		mPartSourcep;	// Particle source associated with this object.
-	LLAudioSourceVO* mAudioSourcep;
-	F32				mAudioGain;
-	
-	F32				mAppAngle;	// Apparent visual arc in degrees
-	F32				mPixelArea; // Apparent area in pixels
-
-	// This is the object's inventory from the viewer's perspective.
-	LLInventoryObject::object_list_t* mInventory;
-	class LLInventoryCallbackInfo
-	{
-	public:
-		~LLInventoryCallbackInfo();
-		LLVOInventoryListener* mListener;
-		void* mInventoryData;
-	};
-	typedef std::list<LLInventoryCallbackInfo*> callback_list_t;
-	callback_list_t mInventoryCallbacks;
-	S16 mInventorySerialNum;
-
-	LLViewerRegion	*mRegionp;					// Region that this object belongs to.
-	BOOL			mInventoryPending;
-	BOOL			mInventoryDirty;
-	BOOL			mDead;
-	BOOL			mOrphaned;					// This is an orphaned child
-	BOOL			mUserSelected;				// Cached user select information
-	BOOL			mOnActiveList;
-	BOOL			mOnMap;						// On the map.
-	BOOL			mStatic;					// Object doesn't move.
-	S32				mNumFaces;
-
-	F32				mTimeDilation;				// Time dilation sent with the object.
-	F32				mRotTime;					// Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
-	LLQuaternion	mLastRot;					// last rotation received from the simulator
-
-	LLVOJointInfo*  mJointInfo;
-	U8				mState;	// legacy
-	LLViewerObjectMedia* mMedia;	// NULL if no media associated
-	U8 mClickAction;
-	F32 mObjectCost; //resource cost of this object or -1 if unknown
-	F32 mLinksetCost;
-	F32 mPhysicsCost;
-	F32 mLinksetPhysicsCost;
-
-	bool mCostStale;
-	mutable bool mPhysicsShapeUnknown;
-
-	static			U32			sNumZombieObjects;			// Objects which are dead, but not deleted
-
-	static			BOOL		sMapDebug;					// Map render mode
-	static			LLColor4	sEditSelectColor;
-	static			LLColor4	sNoEditSelectColor;
-	static			F32			sCurrentPulse;
-	static			BOOL		sPulseEnabled;
-
-	static			S32			sAxisArrowLength;
-
-	// These two caches are only correct for non-parented objects right now!
-	mutable LLVector3		mPositionRegion;
-	mutable LLVector3		mPositionAgent;
-
-	static void setPhaseOutUpdateInterpolationTime(F32 value)	{ sPhaseOutUpdateInterpolationTime = (F64) value;	}
-	static void setMaxUpdateInterpolationTime(F32 value)		{ sMaxUpdateInterpolationTime = (F64) value;	}
-
-	static void	setVelocityInterpolate(BOOL value)		{ sVelocityInterpolate = value;	}
-	static void	setPingInterpolate(BOOL value)			{ sPingInterpolate = value;	}
-
-private:	
-	static S32 sNumObjects;
-
-	static F64 sPhaseOutUpdateInterpolationTime;	// For motion interpolation
-	static F64 sMaxUpdateInterpolationTime;			// For motion interpolation
-
-	static BOOL sVelocityInterpolate;
-	static BOOL sPingInterpolate;
-
-	//--------------------------------------------------------------------
-	// For objects that are attachments
-	//--------------------------------------------------------------------
-public:
-	const LLUUID &getAttachmentItemID() const;
-	void setAttachmentItemID(const LLUUID &id);
-	const LLUUID &extractAttachmentItemID(); // find&set the inventory item ID of the attached object
-	EObjectUpdateType getLastUpdateType() const;
-	void setLastUpdateType(EObjectUpdateType last_update_type);
-	BOOL getLastUpdateCached() const;
-	void setLastUpdateCached(BOOL last_update_cached);
-
-private:
-	LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory.
-	EObjectUpdateType	mLastUpdateType;
-	BOOL	mLastUpdateCached;
-};
-
-///////////////////
-//
-// Inlines
-//
-//
-
-inline void LLViewerObject::setRotation(const LLQuaternion& quat, BOOL damped)
-{
-	LLPrimitive::setRotation(quat);
-	setChanged(ROTATED | SILHOUETTE);
-	updateDrawable(damped);
-}
-
-inline void LLViewerObject::setRotation(const F32 x, const F32 y, const F32 z, BOOL damped)
-{
-	LLPrimitive::setRotation(x, y, z);
-	setChanged(ROTATED | SILHOUETTE);
-	updateDrawable(damped);
-}
-
-class LLViewerObjectMedia
-{
-public:
-	LLViewerObjectMedia() : mMediaURL(), mPassedWhitelist(FALSE), mMediaType(0) { }
-
-	std::string mMediaURL;	// for web pages on surfaces, one per prim
-	BOOL mPassedWhitelist;	// user has OK'd display
-	U8 mMediaType;			// see LLTextureEntry::WEB_PAGE, etc.
-};
-
-// subclass of viewer object that can be added to particle partitions
-class LLAlphaObject : public LLViewerObject
-{
-public:
-	LLAlphaObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
-	: LLViewerObject(id,pcode,regionp) 
-	{ mDepth = 0.f; }
-
-	virtual F32 getPartSize(S32 idx);
-	virtual void getGeometry(S32 idx,
-								LLStrider<LLVector3>& verticesp,
-								LLStrider<LLVector3>& normalsp, 
-								LLStrider<LLVector2>& texcoordsp,
-								LLStrider<LLColor4U>& colorsp, 
-								LLStrider<U16>& indicesp) = 0;
-
-	F32 mDepth;
-};
-
-class LLStaticViewerObject : public LLViewerObject
-{
-public:
-	LLStaticViewerObject(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp, BOOL is_global = FALSE)
-		: LLViewerObject(id,pcode,regionp, is_global)
-	{ }
-
-	virtual void updateDrawable(BOOL force_damped);
-};
-
-
-#endif
+/** 
+ * @file llviewerobject.h
+ * @brief Description of LLViewerObject class, which is the base class for most objects in the viewer.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWEROBJECT_H
+#define LL_LLVIEWEROBJECT_H
+
+#include <map>
+
+#include "llassetstorage.h"
+#include "lldarrayptr.h"
+#include "llhudicon.h"
+#include "llinventory.h"
+#include "llrefcount.h"
+#include "llmemtype.h"
+#include "llprimitive.h"
+#include "lluuid.h"
+#include "llvoinventorylistener.h"
+#include "object_flags.h"
+#include "llquaternion.h"
+#include "v3dmath.h"
+#include "v3math.h"
+#include "llvertexbuffer.h"
+#include "llaccountingquota.h"
+
+class LLAgent;			// TODO: Get rid of this.
+class LLAudioSource;
+class LLAudioSourceVO;
+class LLBBox;
+class LLDataPacker;
+class LLColor4;
+class LLFrameTimer;
+class LLDrawable;
+class LLHost;
+class LLHUDText;
+class LLWorld;
+class LLNameValue;
+class LLNetMap;
+class LLMessageSystem;
+class LLPartSysData;
+class LLPrimitive;
+class LLPipeline;
+class LLTextureEntry;
+class LLViewerTexture;
+class LLViewerInventoryItem;
+class LLViewerObject;
+class LLViewerPartSourceScript;
+class LLViewerRegion;
+class LLViewerObjectMedia;
+class LLVOInventoryListener;
+class LLVOAvatar;
+
+typedef enum e_object_update_type
+{
+	OUT_FULL,
+	OUT_TERSE_IMPROVED,
+	OUT_FULL_COMPRESSED,
+	OUT_FULL_CACHED,
+	OUT_UNKNOWN,
+} EObjectUpdateType;
+
+
+// callback typedef for inventory
+typedef void (*inventory_callback)(LLViewerObject*,
+								   LLInventoryObject::object_list_t*,
+								   S32 serial_num,
+								   void*);
+
+// a small struct for keeping track of joints
+struct LLVOJointInfo
+{
+	EHavokJointType mJointType;
+	LLVector3 mPivot;			// parent-frame
+	// whether the below an axis or anchor (and thus its frame)
+	// depends on the joint type:
+	//     HINGE   ==>   axis=parent-frame
+	//     P2P     ==>   anchor=child-frame
+	LLVector3 mAxisOrAnchor;	
+};
+
+// for exporting textured materials from SL
+struct LLMaterialExportInfo
+{
+public:
+	LLMaterialExportInfo(S32 mat_index, S32 texture_index, LLColor4 color) : 
+	  mMaterialIndex(mat_index), mTextureIndex(texture_index), mColor(color) {};
+
+	S32			mMaterialIndex;
+	S32			mTextureIndex;
+	LLColor4	mColor;
+};
+
+//============================================================================
+
+class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
+{
+protected:
+	~LLViewerObject(); // use unref()
+
+	// TomY: Provide for a list of extra parameter structures, mapped by structure name
+	struct ExtraParameter
+	{
+		BOOL in_use;
+		LLNetworkData *data;
+	};
+	std::map<U16, ExtraParameter*> mExtraParameterList;
+
+public:
+	typedef std::list<LLPointer<LLViewerObject> > child_list_t;
+	typedef std::list<LLPointer<LLViewerObject> > vobj_list_t;
+
+	typedef const child_list_t const_child_list_t;
+
+	LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global = FALSE);
+	MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
+
+	virtual void markDead();				// Mark this object as dead, and clean up its references
+	BOOL isDead() const									{return mDead;}
+	BOOL isOrphaned() const								{ return mOrphaned; }
+	BOOL isParticleSource() const;
+
+	virtual LLVOAvatar* asAvatar();
+
+	static void initVOClasses();
+	static void cleanupVOClasses();
+
+	void			addNVPair(const std::string& data);
+	BOOL			removeNVPair(const std::string& name);
+	LLNameValue*	getNVPair(const std::string& name) const;			// null if no name value pair by that name
+
+	// Object create and update functions
+	virtual BOOL	idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
+
+	// Types of media we can associate
+	enum { MEDIA_NONE = 0, MEDIA_SET = 1 };
+
+	// Return codes for processUpdateMessage
+	enum { 
+        MEDIA_URL_REMOVED = 0x1, 
+        MEDIA_URL_ADDED = 0x2, 
+        MEDIA_URL_UPDATED = 0x4, 
+        MEDIA_FLAGS_CHANGED = 0x8,
+        INVALID_UPDATE = 0x80000000
+    };
+
+	virtual U32		processUpdateMessage(LLMessageSystem *mesgsys,
+										void **user_data,
+										U32 block_num,
+										const EObjectUpdateType update_type,
+										LLDataPacker *dp);
+
+
+	virtual BOOL    isActive() const; // Whether this object needs to do an idleUpdate.
+	BOOL			onActiveList() const				{return mOnActiveList;}
+	void			setOnActiveList(BOOL on_active)		{ mOnActiveList = on_active; }
+
+	virtual BOOL	isAttachment() const { return FALSE; }
+	virtual LLVOAvatar* getAvatar() const;  //get the avatar this object is attached to, or NULL if object is not an attachment
+	virtual BOOL	isHUDAttachment() const { return FALSE; }
+	virtual void 	updateRadius() {};
+	virtual F32 	getVObjRadius() const; // default implemenation is mDrawable->getRadius()
+	
+	BOOL 			isJointChild() const { return mJointInfo ? TRUE : FALSE; } 
+	EHavokJointType	getJointType() const { return mJointInfo ? mJointInfo->mJointType : HJT_INVALID; }
+	// for jointed and other parent-relative hacks
+	LLViewerObject* getSubParent();
+	const LLViewerObject* getSubParent() const;
+	
+	// Object visiblility and GPW functions
+	virtual void setPixelAreaAndAngle(LLAgent &agent); // Override to generate accurate apparent angle and area
+
+	virtual U32 getNumVertices() const;
+	virtual U32 getNumIndices() const;
+	S32 getNumFaces() const { return mNumFaces; }
+
+	// Graphical stuff for objects - maybe broken out into render class later?
+	virtual void updateTextures();
+	virtual void boostTexturePriority(BOOL boost_children = TRUE);	// When you just want to boost priority of this object
+	
+	virtual LLDrawable* createDrawable(LLPipeline *pipeline);
+	virtual BOOL		updateGeometry(LLDrawable *drawable);
+	virtual void		updateGL();
+	virtual void		updateFaceSize(S32 idx);
+	virtual BOOL		updateLOD();
+	virtual BOOL		setDrawableParent(LLDrawable* parentp);
+	F32					getRotTime() { return mRotTime; }
+	void				resetRot();
+	void				applyAngularVelocity(F32 dt);
+
+	void setLineWidthForWindowSize(S32 window_width);
+
+	static void increaseArrowLength();				// makes axis arrows for selections longer
+	static void decreaseArrowLength();				// makes axis arrows for selections shorter
+
+	// Accessor functions
+	LLViewerRegion* getRegion() const				{ return mRegionp; }
+
+	BOOL isSelected() const							{ return mUserSelected; }
+	virtual void setSelected(BOOL sel)				{ mUserSelected = sel; mRotTime = 0.f;}
+
+	const LLUUID &getID() const						{ return mID; }
+	U32 getLocalID() const							{ return mLocalID; }
+	U32 getCRC() const								{ return mTotalCRC; }
+
+	virtual BOOL isFlexible() const					{ return FALSE; }
+	virtual BOOL isSculpted() const 				{ return FALSE; }
+	virtual BOOL isMesh() const						{ return FALSE; }
+	virtual BOOL hasLightTexture() const			{ return FALSE; }
+
+	// This method returns true if the object is over land owned by
+	// the agent, one of its groups, or it encroaches and 
+	// anti-encroachment is enabled
+	bool isReturnable();
+
+	/*
+	// This method will scan through this object, and then query the
+	// selection manager to see if the local agent probably has the
+	// ability to modify the object. Since this calls into the
+	// selection manager, you should avoid calling this method from
+	// there.
+	BOOL isProbablyModifiable() const;
+	*/
+
+	virtual BOOL setParent(LLViewerObject* parent);
+	virtual void addChild(LLViewerObject *childp);
+	virtual void removeChild(LLViewerObject *childp);
+	const_child_list_t& getChildren() const { 	return mChildList; }
+	S32 numChildren() const { return mChildList.size(); }
+	void addThisAndAllChildren(std::vector<LLViewerObject*>& objects);
+	void addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects);
+	BOOL isChild(LLViewerObject *childp) const;
+	BOOL isSeat() const;
+	
+
+	//detect if given line segment (in agent space) intersects with this viewer object.
+	//returns TRUE if intersection detected and returns information about intersection
+	virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
+									  S32 face = -1,                          // which face to check, -1 = ALL_SIDES
+									  BOOL pick_transparent = FALSE,
+									  S32* face_hit = NULL,                   // which face was hit
+									  LLVector3* intersection = NULL,         // return the intersection point
+									  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
+									  LLVector3* normal = NULL,               // return the surface normal at the intersection point
+									  LLVector3* bi_normal = NULL             // return the surface bi-normal at the intersection point
+		);
+	
+	virtual BOOL lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end);
+
+	virtual const LLVector3d getPositionGlobal() const;
+	virtual const LLVector3 &getPositionRegion() const;
+	virtual const LLVector3 getPositionEdit() const;
+	virtual const LLVector3 &getPositionAgent() const;
+	virtual const LLVector3 getRenderPosition() const;
+
+	virtual const LLVector3 getPivotPositionAgent() const; // Usually = to getPositionAgent, unless like flex objects it's not
+
+	LLViewerObject* getRootEdit() const;
+
+	const LLQuaternion getRotationRegion() const;
+	const LLQuaternion getRotationEdit() const;
+	const LLQuaternion getRenderRotation() const;
+	virtual	const LLMatrix4 getRenderMatrix() const;
+
+	void setPosition(const LLVector3 &pos, BOOL damped = FALSE);
+	void setPositionGlobal(const LLVector3d &position, BOOL damped = FALSE);
+	void setPositionRegion(const LLVector3 &position, BOOL damped = FALSE);
+	void setPositionEdit(const LLVector3 &position, BOOL damped = FALSE);
+	void setPositionAgent(const LLVector3 &pos_agent, BOOL damped = FALSE);
+	void setPositionParent(const LLVector3 &pos_parent, BOOL damped = FALSE);
+	void setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped = FALSE );
+
+	virtual const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const		{ return xform->getWorldMatrix(); }
+
+	inline void setRotation(const F32 x, const F32 y, const F32 z, BOOL damped = FALSE);
+	inline void setRotation(const LLQuaternion& quat, BOOL damped = FALSE);
+	void sendRotationUpdate() const;
+
+	/*virtual*/	void	setNumTEs(const U8 num_tes);
+	/*virtual*/	void	setTE(const U8 te, const LLTextureEntry &texture_entry);
+	/*virtual*/ S32		setTETexture(const U8 te, const LLUUID &uuid);
+	S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host);
+	/*virtual*/ S32		setTEColor(const U8 te, const LLColor3 &color);
+	/*virtual*/ S32		setTEColor(const U8 te, const LLColor4 &color);
+	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t);
+	/*virtual*/ S32		setTEScaleS(const U8 te, const F32 s);
+	/*virtual*/ S32		setTEScaleT(const U8 te, const F32 t);
+	/*virtual*/ S32		setTEOffset(const U8 te, const F32 s, const F32 t);
+	/*virtual*/ S32		setTEOffsetS(const U8 te, const F32 s);
+	/*virtual*/ S32		setTEOffsetT(const U8 te, const F32 t);
+	/*virtual*/ S32		setTERotation(const U8 te, const F32 r);
+	/*virtual*/	S32		setTEBumpmap(const U8 te, const U8 bump );
+	/*virtual*/	S32		setTETexGen(const U8 te, const U8 texgen );
+	/*virtual*/	S32		setTEMediaTexGen(const U8 te, const U8 media ); // *FIXME: this confusingly acts upon a superset of setTETexGen's flags without absorbing its semantics
+	/*virtual*/	S32		setTEShiny(const U8 te, const U8 shiny );
+	/*virtual*/	S32		setTEFullbright(const U8 te, const U8 fullbright );
+	/*virtual*/	S32		setTEMediaFlags(const U8 te, const U8 media_flags );
+	/*virtual*/ S32     setTEGlow(const U8 te, const F32 glow);
+	/*virtual*/	BOOL	setMaterial(const U8 material);
+	virtual		void	setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive
+	void                changeTEImage(S32 index, LLViewerTexture* new_image)  ;
+	LLViewerTexture		*getTEImage(const U8 te) const;
+	
+	void fitFaceTexture(const U8 face);
+	void sendTEUpdate() const;			// Sends packed representation of all texture entry information
+	
+	virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
+
+	virtual F32 getStreamingCost(S32* bytes = NULL, S32* visible_bytes = NULL);
+	virtual U32 getTriangleCount();
+	virtual U32 getHighLODTriangleCount();
+
+	void setObjectCost(F32 cost);
+	F32 getObjectCost();
+	
+	void setLinksetCost(F32 cost);
+	F32 getLinksetCost();
+	
+	void setPhysicsCost(F32 cost);
+	F32 getPhysicsCost();
+	
+	void setLinksetPhysicsCost(F32 cost);
+	F32 getLinksetPhysicsCost();
+
+	void sendShapeUpdate();
+
+	U8 getState()							{ return mState; }
+
+	F32 getAppAngle() const					{ return mAppAngle; }
+	F32 getPixelArea() const				{ return mPixelArea; }
+	void setPixelArea(F32 area)				{ mPixelArea = area; }
+	F32 getMaxScale() const;
+	F32 getMidScale() const;
+	F32 getMinScale() const;
+
+	// Owner id is this object's owner
+	void setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags);
+	void adjustAudioGain(const F32 gain);
+	void clearAttachedSound()								{ mAudioSourcep = NULL; }
+
+	 // Create if necessary
+	LLAudioSource *getAudioSource(const LLUUID& owner_id);
+	bool isAudioSource() {return mAudioSourcep != NULL;}
+
+	U8 getMediaType() const;
+	void setMediaType(U8 media_type);
+
+	std::string getMediaURL() const;
+	void setMediaURL(const std::string& media_url);
+
+	BOOL getMediaPassedWhitelist() const;
+	void setMediaPassedWhitelist(BOOL passed);
+
+	void sendMaterialUpdate() const;
+
+	void setCanSelect(BOOL canSelect);
+
+	void setDebugText(const std::string &utf8text);
+	void setIcon(LLViewerTexture* icon_image);
+	void clearIcon();
+
+	void markForUpdate(BOOL priority);
+	void updateVolume(const LLVolumeParams& volume_params);
+	virtual	void updateSpatialExtents(LLVector4a& min, LLVector4a& max);
+	virtual F32 getBinRadius();
+	
+	LLBBox				getBoundingBoxAgent() const;
+
+	void updatePositionCaches() const; // Update the global and region position caches from the object (and parent's) xform.
+	void updateText(); // update text label position
+	virtual void updateDrawable(BOOL force_damped); // force updates on static objects
+
+	void setDrawableState(U32 state, BOOL recursive = TRUE);
+	void clearDrawableState(U32 state, BOOL recursive = TRUE);
+
+	// Called when the drawable shifts
+	virtual void onShift(const LLVector4a &shift_vector)	{ }
+		
+	//////////////////////////////////////
+	//
+	// Inventory methods
+	//
+
+	// This function is called when someone is interested in a viewer
+	// object's inventory. The callback is called as soon as the
+	// viewer object has the inventory stored locally.
+	void registerInventoryListener(LLVOInventoryListener* listener, void* user_data);
+	void removeInventoryListener(LLVOInventoryListener* listener);
+	BOOL isInventoryPending() { return mInventoryPending; }
+	void clearInventoryListeners();
+	void requestInventory();
+	void fetchInventoryFromServer();
+	static void processTaskInv(LLMessageSystem* msg, void** user_data);
+	void removeInventory(const LLUUID& item_id);
+
+	// The updateInventory() call potentially calls into the selection
+	// manager, so do no call updateInventory() from the selection
+	// manager until we have better iterators.
+	void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
+	void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
+	LLInventoryObject* getInventoryObject(const LLUUID& item_id);
+	void getInventoryContents(LLInventoryObject::object_list_t& objects);
+	LLInventoryObject* getInventoryRoot();
+	LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);
+	S16 getInventorySerial() const { return mInventorySerialNum; }
+
+	// These functions does viewer-side only object inventory modifications
+	void updateViewerInventoryAsset(
+		const LLViewerInventoryItem* item,
+		const LLUUID& new_asset);
+
+	// This function will make sure that we refresh the inventory.
+	void dirtyInventory();
+	BOOL isInventoryDirty() { return mInventoryDirty; }
+
+	// save a script, which involves removing the old one, and rezzing
+	// in the new one. This method should be called with the asset id
+	// of the new and old script AFTER the bytecode has been saved.
+	void saveScript(const LLViewerInventoryItem* item, BOOL active, bool is_new);
+
+	// move an inventory item out of the task and into agent
+	// inventory. This operation is based on messaging. No permissions
+	// checks are made on the viewer - the server will double check.
+	void moveInventory(const LLUUID& agent_folder, const LLUUID& item_id);
+
+	// Find the number of instances of this object's inventory that are of the given type
+	S32 countInventoryContents( LLAssetType::EType type );
+
+	BOOL			permAnyOwner() const;	
+	BOOL			permYouOwner() const;
+	BOOL			permGroupOwner() const;
+	BOOL			permOwnerModify() const;
+	BOOL			permModify() const;	
+	BOOL			permCopy() const;	
+	BOOL			permMove() const;		
+	BOOL			permTransfer() const;
+	inline BOOL		usePhysics() const				{ return ((mFlags & FLAGS_USE_PHYSICS) != 0); }
+	inline BOOL		flagScripted() const			{ return ((mFlags & FLAGS_SCRIPTED) != 0); }
+	inline BOOL		flagHandleTouch() const			{ return ((mFlags & FLAGS_HANDLE_TOUCH) != 0); }
+	inline BOOL		flagTakesMoney() const			{ return ((mFlags & FLAGS_TAKES_MONEY) != 0); }
+	inline BOOL		flagPhantom() const				{ return ((mFlags & FLAGS_PHANTOM) != 0); }
+	inline BOOL		flagInventoryEmpty() const		{ return ((mFlags & FLAGS_INVENTORY_EMPTY) != 0); }
+	inline BOOL		flagCastShadows() const			{ return ((mFlags & FLAGS_CAST_SHADOWS) != 0); }
+	inline BOOL		flagAllowInventoryAdd() const	{ return ((mFlags & FLAGS_ALLOW_INVENTORY_DROP) != 0); }
+	inline BOOL		flagTemporary() const			{ return ((mFlags & FLAGS_TEMPORARY) != 0); }
+	inline BOOL		flagTemporaryOnRez() const		{ return ((mFlags & FLAGS_TEMPORARY_ON_REZ) != 0); }
+	inline BOOL		flagAnimSource() const			{ return ((mFlags & FLAGS_ANIM_SOURCE) != 0); }
+	inline BOOL		flagCameraSource() const		{ return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); }
+	inline BOOL		flagCameraDecoupled() const		{ return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
+	inline BOOL		flagObjectMove() const			{ return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
+
+	U8       getPhysicsShapeType() const;
+	inline F32      getPhysicsGravity() const       { return mPhysicsGravity; }
+	inline F32      getPhysicsFriction() const      { return mPhysicsFriction; }
+	inline F32      getPhysicsDensity() const       { return mPhysicsDensity; }
+	inline F32      getPhysicsRestitution() const   { return mPhysicsRestitution; }
+	
+	bool getIncludeInSearch() const;
+	void setIncludeInSearch(bool include_in_search);
+
+	// Does "open" object menu item apply?
+	BOOL allowOpen() const;
+
+	void setClickAction(U8 action) { mClickAction = action; }
+	U8 getClickAction() const { return mClickAction; }
+	bool specialHoverCursor() const;	// does it have a special hover cursor?
+
+	void			setRegion(LLViewerRegion *regionp);
+	virtual void	updateRegion(LLViewerRegion *regionp);
+
+	void updateFlags(BOOL physics_changed = FALSE);
+	BOOL setFlags(U32 flag, BOOL state);
+	void setPhysicsShapeType(U8 type);
+	void setPhysicsGravity(F32 gravity);
+	void setPhysicsFriction(F32 friction);
+	void setPhysicsDensity(F32 density);
+	void setPhysicsRestitution(F32 restitution);
+	
+	virtual void dump() const;
+	static U32		getNumZombieObjects()			{ return sNumZombieObjects; }
+
+	void printNameValuePairs() const;
+
+	virtual S32 getLOD() const { return 3; } 
+	virtual U32 getPartitionType() const;
+	virtual void dirtySpatialGroup(BOOL priority = FALSE) const;
+	virtual void dirtyMesh();
+
+	virtual LLNetworkData* getParameterEntry(U16 param_type) const;
+	virtual bool setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin);
+	virtual BOOL getParameterEntryInUse(U16 param_type) const;
+	virtual bool setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin);
+	// Called when a parameter is changed
+	virtual void parameterChanged(U16 param_type, bool local_origin);
+	virtual void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin);
+	
+	friend class LLViewerObjectList;
+	friend class LLViewerMediaList;
+
+public:
+	//counter-translation
+	void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ;
+	//counter-rotation
+	void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, 
+											const std::vector<LLVector3>& positions) ;
+	void saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) ;
+	void saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) ;
+	std::vector<LLVector3> mUnselectedChildrenPositions ;
+
+private:
+	ExtraParameter* createNewParameterEntry(U16 param_type);
+	ExtraParameter* getExtraParameterEntry(U16 param_type) const;
+	ExtraParameter* getExtraParameterEntryCreate(U16 param_type);
+	bool unpackParameterEntry(U16 param_type, LLDataPacker *dp);
+
+    // This function checks to see if the given media URL has changed its version
+    // and the update wasn't due to this agent's last action.
+    U32 checkMediaURL(const std::string &media_url);
+	
+	// Motion prediction between updates
+	void interpolateLinearMotion(const F64 & time, const F32 & dt);
+
+public:
+	//
+	// Viewer-side only types - use the LL_PCODE_APP mask.
+	//
+	typedef enum e_vo_types
+	{
+		LL_VO_CLOUDS =				LL_PCODE_APP | 0x20,
+		LL_VO_SURFACE_PATCH =		LL_PCODE_APP | 0x30,
+		LL_VO_WL_SKY =				LL_PCODE_APP | 0x40,
+		LL_VO_SQUARE_TORUS =		LL_PCODE_APP | 0x50,
+		LL_VO_SKY =					LL_PCODE_APP | 0x60,
+		LL_VO_VOID_WATER =			LL_PCODE_APP | 0x70,
+		LL_VO_WATER =				LL_PCODE_APP | 0x80,
+		LL_VO_GROUND =				LL_PCODE_APP | 0x90,
+		LL_VO_PART_GROUP =			LL_PCODE_APP | 0xa0,
+		LL_VO_TRIANGLE_TORUS =		LL_PCODE_APP | 0xb0,
+		LL_VO_HUD_PART_GROUP =		LL_PCODE_APP | 0xc0,
+	} EVOType;
+
+	typedef enum e_physics_shape_types
+	{
+		PHYSICS_SHAPE_PRIM = 0,
+		PHYSICS_SHAPE_NONE,
+		PHYSICS_SHAPE_CONVEX_HULL,
+	} EPhysicsShapeType;
+
+	LLUUID			mID;
+
+	// unique within region, not unique across regions
+	// Local ID = 0 is not used
+	U32				mLocalID;
+
+	// Last total CRC received from sim, used for caching
+	U32				mTotalCRC;
+
+	LLPointer<LLViewerTexture> *mTEImages;
+
+	// Selection, picking and rendering variables
+	U32				mGLName;			// GL "name" used by selection code
+	BOOL			mbCanSelect;		// true if user can select this object by clicking
+
+	// Grabbed from UPDATE_FLAGS
+	U32				mFlags;
+
+	// Sent to sim in UPDATE_FLAGS, received in ObjectPhysicsProperties
+	U8              mPhysicsShapeType;
+	F32             mPhysicsGravity;
+	F32             mPhysicsFriction;
+	F32             mPhysicsDensity;
+	F32             mPhysicsRestitution;
+	
+
+	// Pipeline classes
+	LLPointer<LLDrawable> mDrawable;
+
+	// Band-aid to select object after all creation initialization is done
+	BOOL mCreateSelected;
+
+	// Replace textures with web pages on this object while drawing
+	BOOL mRenderMedia;
+
+	// In bits
+	S32				mBestUpdatePrecision;
+
+	// TODO: Make all this stuff private.  JC
+	LLPointer<LLHUDText> mText;
+	LLPointer<LLHUDIcon> mIcon;
+
+	static			BOOL		sUseSharedDrawables;
+
+protected:
+	// delete an item in the inventory, but don't tell the
+	// server. This is used internally by remove, update, and
+	// savescript.
+	void deleteInventoryItem(const LLUUID& item_id);
+
+	// do the update/caching logic. called by saveScript and
+	// updateInventory.
+	void doUpdateInventory(LLPointer<LLViewerInventoryItem>& item, U8 key, bool is_new);
+
+
+	static LLViewerObject *createObject(const LLUUID &id, LLPCode pcode, LLViewerRegion *regionp);
+
+	BOOL setData(const U8 *datap, const U32 data_size);
+
+	// Hide or show HUD, icon and particles
+	void	hideExtraDisplayItems( BOOL hidden );
+
+	//////////////////////////
+	//
+	// inventory functionality
+	//
+
+	static void processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status);
+	void loadTaskInvFile(const std::string& filename);
+	void doInventoryCallback();
+	
+	BOOL isOnMap();
+
+	void unpackParticleSource(const S32 block_num, const LLUUID& owner_id);
+	void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id);
+	void deleteParticleSource();
+	void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);
+	
+public:
+	void  updateQuota(  const SelectionQuota& quota );
+	const SelectionQuota& getQuota( void ) { return mSelectionQuota; }
+	
+private:
+	void setNameValueList(const std::string& list);		// clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string
+	void deleteTEImages(); // correctly deletes list of images
+	
+protected:
+	typedef std::map<char *, LLNameValue *> name_value_map_t;
+	name_value_map_t mNameValuePairs;	// Any name-value pairs stored by script
+
+	child_list_t	mChildList;
+	
+	F64				mLastInterpUpdateSecs;			// Last update for purposes of interpolation
+	F64				mLastMessageUpdateSecs;			// Last update from a message from the simulator
+	TPACKETID		mLatestRecvPacketID;			// Latest time stamp on message from simulator
+
+	// extra data sent from the sim...currently only used for tree species info
+	U8* mData;
+
+	LLPointer<LLViewerPartSourceScript>		mPartSourcep;	// Particle source associated with this object.
+	LLAudioSourceVO* mAudioSourcep;
+	F32				mAudioGain;
+	
+	F32				mAppAngle;	// Apparent visual arc in degrees
+	F32				mPixelArea; // Apparent area in pixels
+
+	// This is the object's inventory from the viewer's perspective.
+	LLInventoryObject::object_list_t* mInventory;
+	class LLInventoryCallbackInfo
+	{
+	public:
+		~LLInventoryCallbackInfo();
+		LLVOInventoryListener* mListener;
+		void* mInventoryData;
+	};
+	typedef std::list<LLInventoryCallbackInfo*> callback_list_t;
+	callback_list_t mInventoryCallbacks;
+	S16 mInventorySerialNum;
+
+	LLViewerRegion	*mRegionp;					// Region that this object belongs to.
+	BOOL			mInventoryPending;
+	BOOL			mInventoryDirty;
+	BOOL			mDead;
+	BOOL			mOrphaned;					// This is an orphaned child
+	BOOL			mUserSelected;				// Cached user select information
+	BOOL			mOnActiveList;
+	BOOL			mOnMap;						// On the map.
+	BOOL			mStatic;					// Object doesn't move.
+	S32				mNumFaces;
+
+	F32				mTimeDilation;				// Time dilation sent with the object.
+	F32				mRotTime;					// Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
+	LLQuaternion	mLastRot;					// last rotation received from the simulator
+
+	LLVOJointInfo*  mJointInfo;
+	U8				mState;	// legacy
+	LLViewerObjectMedia* mMedia;	// NULL if no media associated
+	U8 mClickAction;
+	F32 mObjectCost; //resource cost of this object or -1 if unknown
+	F32 mLinksetCost;
+	F32 mPhysicsCost;
+	F32 mLinksetPhysicsCost;
+
+	SelectionQuota mSelectionQuota;
+	
+	bool mCostStale;
+	mutable bool mPhysicsShapeUnknown;
+
+	static			U32			sNumZombieObjects;			// Objects which are dead, but not deleted
+
+	static			BOOL		sMapDebug;					// Map render mode
+	static			LLColor4	sEditSelectColor;
+	static			LLColor4	sNoEditSelectColor;
+	static			F32			sCurrentPulse;
+	static			BOOL		sPulseEnabled;
+
+	static			S32			sAxisArrowLength;
+
+	// These two caches are only correct for non-parented objects right now!
+	mutable LLVector3		mPositionRegion;
+	mutable LLVector3		mPositionAgent;
+
+	static void setPhaseOutUpdateInterpolationTime(F32 value)	{ sPhaseOutUpdateInterpolationTime = (F64) value;	}
+	static void setMaxUpdateInterpolationTime(F32 value)		{ sMaxUpdateInterpolationTime = (F64) value;	}
+
+	static void	setVelocityInterpolate(BOOL value)		{ sVelocityInterpolate = value;	}
+	static void	setPingInterpolate(BOOL value)			{ sPingInterpolate = value;	}
+
+private:	
+	static S32 sNumObjects;
+
+	static F64 sPhaseOutUpdateInterpolationTime;	// For motion interpolation
+	static F64 sMaxUpdateInterpolationTime;			// For motion interpolation
+
+	static BOOL sVelocityInterpolate;
+	static BOOL sPingInterpolate;
+
+	//--------------------------------------------------------------------
+	// For objects that are attachments
+	//--------------------------------------------------------------------
+public:
+	const LLUUID &getAttachmentItemID() const;
+	void setAttachmentItemID(const LLUUID &id);
+	const LLUUID &extractAttachmentItemID(); // find&set the inventory item ID of the attached object
+	EObjectUpdateType getLastUpdateType() const;
+	void setLastUpdateType(EObjectUpdateType last_update_type);
+	BOOL getLastUpdateCached() const;
+	void setLastUpdateCached(BOOL last_update_cached);
+
+private:
+	LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory.
+	EObjectUpdateType	mLastUpdateType;
+	BOOL	mLastUpdateCached;
+};
+
+///////////////////
+//
+// Inlines
+//
+//
+
+inline void LLViewerObject::setRotation(const LLQuaternion& quat, BOOL damped)
+{
+	LLPrimitive::setRotation(quat);
+	setChanged(ROTATED | SILHOUETTE);
+	updateDrawable(damped);
+}
+
+inline void LLViewerObject::setRotation(const F32 x, const F32 y, const F32 z, BOOL damped)
+{
+	LLPrimitive::setRotation(x, y, z);
+	setChanged(ROTATED | SILHOUETTE);
+	updateDrawable(damped);
+}
+
+class LLViewerObjectMedia
+{
+public:
+	LLViewerObjectMedia() : mMediaURL(), mPassedWhitelist(FALSE), mMediaType(0) { }
+
+	std::string mMediaURL;	// for web pages on surfaces, one per prim
+	BOOL mPassedWhitelist;	// user has OK'd display
+	U8 mMediaType;			// see LLTextureEntry::WEB_PAGE, etc.
+};
+
+// subclass of viewer object that can be added to particle partitions
+class LLAlphaObject : public LLViewerObject
+{
+public:
+	LLAlphaObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
+	: LLViewerObject(id,pcode,regionp) 
+	{ mDepth = 0.f; }
+
+	virtual F32 getPartSize(S32 idx);
+	virtual void getGeometry(S32 idx,
+								LLStrider<LLVector3>& verticesp,
+								LLStrider<LLVector3>& normalsp, 
+								LLStrider<LLVector2>& texcoordsp,
+								LLStrider<LLColor4U>& colorsp, 
+								LLStrider<U16>& indicesp) = 0;
+
+	F32 mDepth;
+};
+
+class LLStaticViewerObject : public LLViewerObject
+{
+public:
+	LLStaticViewerObject(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp, BOOL is_global = FALSE)
+		: LLViewerObject(id,pcode,regionp, is_global)
+	{ }
+
+	virtual void updateDrawable(BOOL force_damped);
+};
+
+
+#endif
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index ab2e07e4df010b7cc2a9dbe9027dadc8810e567d..007b3416f17a28b04fa67f34e36d8c025b74a0e9 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1418,6 +1418,15 @@ void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id)
 	mPendingObjectCost.erase(object_id);
 }
 
+void LLViewerObjectList::updateQuotaCost( const LLUUID& objectId, const SelectionQuota& quota  )
+{
+	LLViewerObject* pVO = findObject( objectId );
+	if ( pVO )
+	{
+		//pVO->updateQuota( quota );
+	}
+}
+
 void LLViewerObjectList::updatePhysicsFlags(const LLViewerObject* object)
 {
 	mStalePhysicsFlags.insert(object->getID());
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 65374bca70f89f6170abd20c2845ff6f2bbea075..8e211eaf7380cbab38ccd48f60319a91f4a71dce 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -36,6 +36,7 @@
 
 // project includes
 #include "llviewerobject.h"
+#include "llaccountingquota.h"
 
 class LLCamera;
 class LLNetMap;
@@ -101,6 +102,8 @@ class LLViewerObjectList
 									F32 restitution,
 									F32 gravity_multiplier);
 
+	void updateQuotaCost( const LLUUID& objectId, const SelectionQuota& costs );
+	
 	void shiftObjects(const LLVector3 &offset);
 
 	bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index e84e4a859a04df99b7130a4e0bca63aa63a9b0e8..5ae4e872f3dad6aa4287da779e0bf1906369881b 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -42,6 +42,7 @@
 
 // Viewer includes
 #include "llagent.h"
+#include "llagentaccess.h"
 #include "llviewerwindow.h"
 #include "llviewercontrol.h"
 //#include "llfirstuse.h"
@@ -54,6 +55,7 @@
 #include "llresmgr.h"
 #include "llsdutil.h"
 #include "llsdutil_math.h"
+#include "llslurl.h"
 #include "llstatusbar.h"
 #include "llui.h"
 #include "llviewertexture.h"
@@ -2200,7 +2202,10 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
 		= parcelOwner == (forGroup ? gAgent.getGroupID() : gAgent.getID());
 	
 	bool isAuthorized
-		= (authorizeBuyer.isNull() || (gAgent.getID() == authorizeBuyer));
+			= (authorizeBuyer.isNull()
+				|| (gAgent.getID() == authorizeBuyer)
+				|| (gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_DEED)
+					&& gAgent.hasPowerInGroup(authorizeBuyer,GP_LAND_SET_SALE_INFO)));
 	
 	return isForSale && !isOwner && isAuthorized  && isEmpowered;
 }
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index ab07adce5d3d26dfdd7942a604c87e759417bb18..45c9b3e91f24f88ca66927d041d1005886dc6dd1 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -99,8 +99,6 @@
 #include "llcoord.h"
 #include "llcoordframe.h"
 #include "llcrc.h"
-#include "llinterp.h"
-#include "llperlin.h"
 #include "llplane.h"
 #include "llquantize.h"
 #include "llrand.h"
@@ -109,7 +107,6 @@
 #include "m3math.h"
 #include "m4math.h"
 #include "llquaternion.h"
-#include "raytrace.h"
 #include "v2math.h"
 #include "v3color.h"
 #include "v3dmath.h"
@@ -117,16 +114,12 @@
 #include "v4color.h"
 #include "v4coloru.h"
 #include "v4math.h"
-////#include "vmath.h"
 #include "xform.h"
 
 // Library includes from llvfs
 #include "lldir.h"
-
-// Library includes from llmessage project
+
+// Library includes from llmessage project
 #include "llcachename.h"
 
-// llxuixml
-#include "llinitparam.h"
-
 #endif
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 84d092c5d5ab27863c9a06bdfed94a839a4c58b0..590c82856dcbc647da26dafeabb23fcde520a2fc 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -46,6 +46,7 @@
 #include "llagentcamera.h"
 #include "llcallingcard.h"
 #include "llcaphttpsender.h"
+#include "llcapabilitylistener.h"
 #include "llcommandhandler.h"
 #include "lldir.h"
 #include "lleventpoll.h"
@@ -76,6 +77,71 @@
 const F32 WATER_TEXTURE_SCALE = 8.f;			//  Number of times to repeat the water texture across a region
 const S16 MAX_MAP_DIST = 10;
 
+typedef std::map<std::string, std::string> CapabilityMap;
+
+class LLViewerRegionImpl {
+public:
+	LLViewerRegionImpl(LLViewerRegion * region, LLHost const & host)
+		:	mHost(host),
+			mCompositionp(NULL),
+			mEventPoll(NULL),
+		    // I'd prefer to set the LLCapabilityListener name to match the region
+		    // name -- it's disappointing that's not available at construction time.
+		    // We could instead store an LLCapabilityListener*, making
+		    // setRegionNameAndZone() replace the instance. Would that pose
+		    // consistency problems? Can we even request a capability before calling
+		    // setRegionNameAndZone()?
+		    // For testability -- the new Michael Feathers paradigm --
+		    // LLCapabilityListener binds all the globals it expects to need at
+		    // construction time.
+		    mCapabilityListener(host.getString(), gMessageSystem, *region,
+		                        gAgent.getID(), gAgent.getSessionID())
+	{
+	}
+
+	// The surfaces and other layers
+	LLSurface*	mLandp;
+
+	// Region geometry data
+	LLVector3d	mOriginGlobal;	// Location of southwest corner of region (meters)
+	LLVector3d	mCenterGlobal;	// Location of center in world space (meters)
+	LLHost		mHost;
+
+	// The unique ID for this region.
+	LLUUID mRegionID;
+
+	// region/estate owner - usually null.
+	LLUUID mOwnerID;
+
+	// Network statistics for the region's circuit...
+	LLTimer mLastNetUpdate;
+
+	// Misc
+	LLVLComposition *mCompositionp;		// Composition layer for the surface
+
+	LLVOCacheEntry::vocache_entry_map_t		mCacheMap;
+	// time?
+	// LRU info?
+
+	// Cache ID is unique per-region, across renames, moving locations,
+	// etc.
+	LLUUID mCacheID;
+
+	CapabilityMap mCapabilities;
+	
+	LLEventPoll* mEventPoll;
+
+	/// Post an event to this LLCapabilityListener to invoke a capability message on
+	/// this LLViewerRegion's server
+	/// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
+	LLCapabilityListener mCapabilityListener;
+
+	//spatial partitions for objects in this region
+	std::vector<LLSpatialPartition*> mObjectPartition;
+
+	LLHTTPClient::ResponderPtr  mHttpResponderPtr ;
+};
+
 // support for secondlife:///app/region/{REGION} SLapps
 // N.B. this is defined to work exactly like the classic secondlife://{REGION}
 // However, the later syntax cannot support spaces in the region name because
@@ -191,15 +257,12 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 							   const U32 grids_per_region_edge, 
 							   const U32 grids_per_patch_edge, 
 							   const F32 region_width_meters)
-:	mCenterGlobal(),
+:	mImpl(new LLViewerRegionImpl(this, host)),
 	mHandle(handle),
-	mHost( host ),
 	mTimeDilation(1.0f),
 	mName(""),
 	mZoning(""),
-	mOwnerID(),
 	mIsEstateManager(FALSE),
-	mCompositionp(NULL),
 	mRegionFlags( REGION_FLAGS_DEFAULT ),
 	mSimAccess( SIM_ACCESS_MIN ),
 	mBillableFactor(1.0),
@@ -212,37 +275,27 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mHttpUrl(""),
 	mCacheLoaded(FALSE),
 	mCacheDirty(FALSE),
-	mCacheID(),
-	mEventPoll(NULL),
 	mReleaseNotesRequested(FALSE),
-    // I'd prefer to set the LLCapabilityListener name to match the region
-    // name -- it's disappointing that's not available at construction time.
-    // We could instead store an LLCapabilityListener*, making
-    // setRegionNameAndZone() replace the instance. Would that pose
-    // consistency problems? Can we even request a capability before calling
-    // setRegionNameAndZone()?
-    // For testability -- the new Michael Feathers paradigm --
-    // LLCapabilityListener binds all the globals it expects to need at
-    // construction time.
-    mCapabilityListener(host.getString(), gMessageSystem, *this,
-                        gAgent.getID(), gAgent.getSessionID()),
 	mCapabilitiesReceived(false)
 {
 	mWidth = region_width_meters;
-	mOriginGlobal = from_region_handle(handle); 
+	mImpl->mOriginGlobal = from_region_handle(handle); 
 	updateRenderMatrix();
 
-	mLandp = new LLSurface('l', NULL);
+	mImpl->mLandp = new LLSurface('l', NULL);
 
 	// Create the composition layer for the surface
-	mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge);
-	mCompositionp->setSurface(mLandp);
+	mImpl->mCompositionp =
+		new LLVLComposition(mImpl->mLandp,
+							grids_per_region_edge,
+							region_width_meters / grids_per_region_edge);
+	mImpl->mCompositionp->setSurface(mImpl->mLandp);
 
 	// Create the surfaces
-	mLandp->setRegion(this);
-	mLandp->create(grids_per_region_edge,
+	mImpl->mLandp->setRegion(this);
+	mImpl->mLandp->create(grids_per_region_edge,
 					grids_per_patch_edge,
-					mOriginGlobal,
+					mImpl->mOriginGlobal,
 					mWidth);
 
 	mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters);
@@ -255,24 +308,24 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 
 	//create object partitions
 	//MUST MATCH declaration of eObjectPartitions
-	mObjectPartition.push_back(new LLHUDPartition());		//PARTITION_HUD
-	mObjectPartition.push_back(new LLTerrainPartition());	//PARTITION_TERRAIN
-	mObjectPartition.push_back(new LLVoidWaterPartition());	//PARTITION_VOIDWATER
-	mObjectPartition.push_back(new LLWaterPartition());		//PARTITION_WATER
-	mObjectPartition.push_back(new LLTreePartition());		//PARTITION_TREE
-	mObjectPartition.push_back(new LLParticlePartition());	//PARTITION_PARTICLE
-	mObjectPartition.push_back(new LLCloudPartition());		//PARTITION_CLOUD
-	mObjectPartition.push_back(new LLGrassPartition());		//PARTITION_GRASS
-	mObjectPartition.push_back(new LLVolumePartition());	//PARTITION_VOLUME
-	mObjectPartition.push_back(new LLBridgePartition());	//PARTITION_BRIDGE
-	mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
-	mObjectPartition.push_back(NULL);						//PARTITION_NONE
+	mImpl->mObjectPartition.push_back(new LLHUDPartition());		//PARTITION_HUD
+	mImpl->mObjectPartition.push_back(new LLTerrainPartition());	//PARTITION_TERRAIN
+	mImpl->mObjectPartition.push_back(new LLVoidWaterPartition());	//PARTITION_VOIDWATER
+	mImpl->mObjectPartition.push_back(new LLWaterPartition());		//PARTITION_WATER
+	mImpl->mObjectPartition.push_back(new LLTreePartition());		//PARTITION_TREE
+	mImpl->mObjectPartition.push_back(new LLParticlePartition());	//PARTITION_PARTICLE
+	mImpl->mObjectPartition.push_back(new LLCloudPartition());		//PARTITION_CLOUD
+	mImpl->mObjectPartition.push_back(new LLGrassPartition());		//PARTITION_GRASS
+	mImpl->mObjectPartition.push_back(new LLVolumePartition());	//PARTITION_VOLUME
+	mImpl->mObjectPartition.push_back(new LLBridgePartition());	//PARTITION_BRIDGE
+	mImpl->mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
+	mImpl->mObjectPartition.push_back(NULL);						//PARTITION_NONE
 }
 
 
 void LLViewerRegion::initStats()
 {
-	mLastNetUpdate.reset();
+	mImpl->mLastNetUpdate.reset();
 	mPacketsIn = 0;
 	mBitsIn = 0;
 	mLastBitsIn = 0;
@@ -287,9 +340,9 @@ void LLViewerRegion::initStats()
 
 LLViewerRegion::~LLViewerRegion() 
 {
-	if(mHttpResponderPtr)
+	if(mImpl->mHttpResponderPtr)
 	{
-		(static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ;
+		(static_cast<BaseCapabilitiesComplete*>(mImpl->mHttpResponderPtr.get()))->setRegion(NULL) ;
 	}
 
 	gVLManager.cleanupData(this);
@@ -301,21 +354,44 @@ LLViewerRegion::~LLViewerRegion()
 
 	gObjectList.killObjects(this);
 
-	delete mCompositionp;
+	delete mImpl->mCompositionp;
 	delete mParcelOverlay;
-	delete mLandp;
-	delete mEventPoll;
-	LLHTTPSender::clearSender(mHost);
+	delete mImpl->mLandp;
+	delete mImpl->mEventPoll;
+	LLHTTPSender::clearSender(mImpl->mHost);
 	
 	saveObjectCache();
 
-	std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer());
+	std::for_each(mImpl->mObjectPartition.begin(), mImpl->mObjectPartition.end(), DeletePointer());
+
+	delete mImpl;
+	mImpl = NULL;
+}
+
+LLEventPump& LLViewerRegion::getCapAPI() const
+{
+	return mImpl->mCapabilityListener.getCapAPI();
 }
 
 /*virtual*/ 
 const LLHost&	LLViewerRegion::getHost() const				
 { 
-	return mHost; 
+	return mImpl->mHost; 
+}
+
+LLSurface & LLViewerRegion::getLand() const
+{
+	return *mImpl->mLandp;
+}
+
+const LLUUID& LLViewerRegion::getRegionID() const
+{
+	return mImpl->mRegionID;
+}
+
+void LLViewerRegion::setRegionID(const LLUUID& region_id)
+{
+	mImpl->mRegionID = region_id;
 }
 
 void LLViewerRegion::loadObjectCache()
@@ -330,7 +406,7 @@ void LLViewerRegion::loadObjectCache()
 
 	if(LLVOCache::hasInstance())
 	{
-		LLVOCache::getInstance()->readFromCache(mHandle, mCacheID, mCacheMap) ;
+		LLVOCache::getInstance()->readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap) ;
 	}
 }
 
@@ -342,32 +418,32 @@ void LLViewerRegion::saveObjectCache()
 		return;
 	}
 
-	if (mCacheMap.empty())
+	if (mImpl->mCacheMap.empty())
 	{
 		return;
 	}
 
 	if(LLVOCache::hasInstance())
 	{
-		LLVOCache::getInstance()->writeToCache(mHandle, mCacheID, mCacheMap, mCacheDirty) ;
+		LLVOCache::getInstance()->writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty) ;
 		mCacheDirty = FALSE;
 	}
 
-	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter)
+	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)
 	{
 		delete iter->second;
 	}
-	mCacheMap.clear();
+	mImpl->mCacheMap.clear();
 }
 
 void LLViewerRegion::sendMessage()
 {
-	gMessageSystem->sendMessage(mHost);
+	gMessageSystem->sendMessage(mImpl->mHost);
 }
 
 void LLViewerRegion::sendReliableMessage()
 {
-	gMessageSystem->sendReliable(mHost);
+	gMessageSystem->sendReliable(mImpl->mHost);
 }
 
 void LLViewerRegion::setFlags(BOOL b, U32 flags)
@@ -384,12 +460,12 @@ void LLViewerRegion::setFlags(BOOL b, U32 flags)
 
 void LLViewerRegion::setWaterHeight(F32 water_level)
 {
-	mLandp->setWaterHeight(water_level);
+	mImpl->mLandp->setWaterHeight(water_level);
 }
 
 F32 LLViewerRegion::getWaterHeight() const
 {
-	return mLandp->getWaterHeight();
+	return mImpl->mLandp->getWaterHeight();
 }
 
 BOOL LLViewerRegion::isVoiceEnabled() const
@@ -405,9 +481,9 @@ void LLViewerRegion::setRegionFlags(U32 flags)
 
 void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global) 
 { 
-	mOriginGlobal = origin_global; 
+	mImpl->mOriginGlobal = origin_global; 
 	updateRenderMatrix();
-	mLandp->setOriginGlobal(origin_global);
+	mImpl->mLandp->setOriginGlobal(origin_global);
 	mWind.setOriginGlobal(origin_global);
 	mCloudLayer.setOriginGlobal(origin_global);
 	calculateCenterGlobal();
@@ -423,16 +499,34 @@ void LLViewerRegion::setTimeDilation(F32 time_dilation)
 	mTimeDilation = time_dilation;
 }
 
+const LLVector3d & LLViewerRegion::getOriginGlobal() const
+{
+	return mImpl->mOriginGlobal;
+}
 
 LLVector3 LLViewerRegion::getOriginAgent() const
 {
-	return gAgent.getPosAgentFromGlobal(mOriginGlobal);
+	return gAgent.getPosAgentFromGlobal(mImpl->mOriginGlobal);
 }
 
+const LLVector3d & LLViewerRegion::getCenterGlobal() const
+{
+	return mImpl->mCenterGlobal;
+}
 
 LLVector3 LLViewerRegion::getCenterAgent() const
 {
-	return gAgent.getPosAgentFromGlobal(mCenterGlobal);
+	return gAgent.getPosAgentFromGlobal(mImpl->mCenterGlobal);
+}
+
+void LLViewerRegion::setOwner(const LLUUID& owner_id)
+{
+	mImpl->mOwnerID = owner_id;
+}
+
+const LLUUID& LLViewerRegion::getOwner() const
+{
+	return mImpl->mOwnerID;
 }
 
 void LLViewerRegion::setRegionNameAndZone	(const std::string& name_zone)
@@ -557,7 +651,10 @@ void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
 	LLFloaterReporter::processRegionInfo(msg);
 }
 
-
+void LLViewerRegion::setCacheID(const LLUUID& id)
+{
+	mImpl->mCacheID = id;
+}
 
 S32 LLViewerRegion::renderPropertyLines()
 {
@@ -585,7 +682,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
 {
 	LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION);
 	// did_update returns TRUE if we did at least one significant update
-	BOOL did_update = mLandp->idleUpdate(max_update_time);
+	BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time);
 	
 	if (mParcelOverlay)
 	{
@@ -600,7 +697,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
 // As above, but forcibly do the update.
 void LLViewerRegion::forceUpdate()
 {
-	mLandp->idleUpdate(0.f);
+	mImpl->mLandp->idleUpdate(0.f);
 
 	if (mParcelOverlay)
 	{
@@ -610,17 +707,21 @@ void LLViewerRegion::forceUpdate()
 
 void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction)
 {
-	mLandp->connectNeighbor(neighborp->mLandp, direction);
+	mImpl->mLandp->connectNeighbor(neighborp->mImpl->mLandp, direction);
 	mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction);
 }
 
 
 void LLViewerRegion::disconnectAllNeighbors()
 {
-	mLandp->disconnectAllNeighbors();
+	mImpl->mLandp->disconnectAllNeighbors();
 	mCloudLayer.disconnectAllNeighbors();
 }
 
+LLVLComposition * LLViewerRegion::getComposition() const
+{
+	return mImpl->mCompositionp;
+}
 
 F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
 {
@@ -714,10 +815,10 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
 
 void LLViewerRegion::calculateCenterGlobal() 
 {
-	mCenterGlobal = mOriginGlobal;
-	mCenterGlobal.mdV[VX] += 0.5 * mWidth;
-	mCenterGlobal.mdV[VY] += 0.5 * mWidth;
-	mCenterGlobal.mdV[VZ] = 0.5*mLandp->getMinZ() + mLandp->getMaxZ();
+	mImpl->mCenterGlobal = mImpl->mOriginGlobal;
+	mImpl->mCenterGlobal.mdV[VX] += 0.5 * mWidth;
+	mImpl->mCenterGlobal.mdV[VY] += 0.5 * mWidth;
+	mImpl->mCenterGlobal.mdV[VZ] = 0.5 * mImpl->mLandp->getMinZ() + mImpl->mLandp->getMaxZ();
 }
 
 void LLViewerRegion::calculateCameraDistance()
@@ -728,7 +829,7 @@ void LLViewerRegion::calculateCameraDistance()
 std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
 {
 	s << "{ ";
-	s << region.mHost;
+	s << region.mImpl->mHost;
 	s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n";
     std::string name(region.getName()), zone(region.getZoning());
     if (! name.empty())
@@ -748,9 +849,9 @@ std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
 
 void LLViewerRegion::updateNetStats()
 {
-	F32 dt = mLastNetUpdate.getElapsedTimeAndResetF32();
+	F32 dt = mImpl->mLastNetUpdate.getElapsedTimeAndResetF32();
 
-	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
+	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);
 	if (!cdp)
 	{
 		mAlive = false;
@@ -779,10 +880,10 @@ void LLViewerRegion::updateNetStats()
 
 U32 LLViewerRegion::getPacketsLost() const
 {
-	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
+	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mImpl->mHost);
 	if (!cdp)
 	{
-		llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mHost << llendl;
+		llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mImpl->mHost << llendl;
 		return 0;
 	}
 	else
@@ -791,6 +892,16 @@ U32 LLViewerRegion::getPacketsLost() const
 	}
 }
 
+void LLViewerRegion::setHttpResponderPtrNULL()
+{
+	mImpl->mHttpResponderPtr = NULL;
+}
+
+const LLHTTPClient::ResponderPtr LLViewerRegion::getHttpResponderPtr() const
+{
+	return mImpl->mHttpResponderPtr;
+}
+
 BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
 {
 	LLVector3 pos_region = getPosRegionFromGlobal(point_global);
@@ -817,7 +928,7 @@ BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
 LLVector3 LLViewerRegion::getPosRegionFromGlobal(const LLVector3d &point_global) const
 {
 	LLVector3 pos_region;
-	pos_region.setVec(point_global - mOriginGlobal);
+	pos_region.setVec(point_global - mImpl->mOriginGlobal);
 	return pos_region;
 }
 
@@ -825,7 +936,7 @@ LLVector3d LLViewerRegion::getPosGlobalFromRegion(const LLVector3 &pos_region) c
 {
 	LLVector3d pos_region_d;
 	pos_region_d.setVec(pos_region);
-	return pos_region_d + mOriginGlobal;
+	return pos_region_d + mImpl->mOriginGlobal;
 }
 
 LLVector3 LLViewerRegion::getPosAgentFromRegion(const LLVector3 &pos_region) const
@@ -842,7 +953,7 @@ LLVector3 LLViewerRegion::getPosRegionFromAgent(const LLVector3 &pos_agent) cons
 
 F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos)
 {
-	return mLandp->resolveHeightRegion( region_pos );
+	return mImpl->mLandp->resolveHeightRegion( region_pos );
 }
 
 bool LLViewerRegion::isAlive()
@@ -994,7 +1105,7 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
 		// treat the target specially for the map
 		if(i == target_index)
 		{
-			LLVector3d global_pos(mOriginGlobal);
+			LLVector3d global_pos(mImpl->mOriginGlobal);
 			global_pos.mdV[VX] += (F64)(x_pos);
 			global_pos.mdV[VY] += (F64)(y_pos);
 			global_pos.mdV[VZ] += (F64)(z_pos) * 4.0;
@@ -1034,7 +1145,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
 	U32 local_id = objectp->getLocalID();
 	U32 crc = objectp->getCRC();
 
-	LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
+	LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);
 
 	if (entry)
 	{
@@ -1047,10 +1158,10 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
 		}
 
 		// Update the cache entry
-		mCacheMap.erase(local_id);
+		mImpl->mCacheMap.erase(local_id);
 		delete entry;
 		entry = new LLVOCacheEntry(local_id, crc, dp);
-		mCacheMap[local_id] = entry;
+		mImpl->mCacheMap[local_id] = entry;
 		return CACHE_UPDATE_CHANGED;
 	}
 
@@ -1058,15 +1169,15 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
 
 	// Create new entry and add to map
 	eCacheUpdateResult result = CACHE_UPDATE_ADDED;
-	if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)
+	if (mImpl->mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES)
 	{
-		mCacheMap.erase(mCacheMap.begin());
+		mImpl->mCacheMap.erase(mImpl->mCacheMap.begin());
 		result = CACHE_UPDATE_REPLACED;
 		
 	}
 	entry = new LLVOCacheEntry(local_id, crc, dp);
 
-	mCacheMap[local_id] = entry;
+	mImpl->mCacheMap[local_id] = entry;
 	return result;
 }
 
@@ -1076,34 +1187,32 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type)
 {
 	//llassert(mCacheLoaded);  This assert failes often, changing to early-out -- davep, 2010/10/18
 
-	if (mCacheLoaded)
-	{
-		LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
+	LLVOCacheEntry* entry = get_if_there(mImpl->mCacheMap, local_id, (LLVOCacheEntry*)NULL);
 
-		if (entry)
+	if (entry)
+	{
+		// we've seen this object before
+		if (entry->getCRC() == crc)
 		{
-			// we've seen this object before
-			if (entry->getCRC() == crc)
-			{
-				// Record a hit
-				entry->recordHit();
-			cache_miss_type = CACHE_MISS_TYPE_NONE;
-				return entry->getDP(crc);
-			}
-			else
-			{
-				// llinfos << "CRC miss for " << local_id << llendl;
-			cache_miss_type = CACHE_MISS_TYPE_CRC;
-				mCacheMissCRC.put(local_id);
-			}
+			// Record a hit
+			entry->recordHit();
+		cache_miss_type = CACHE_MISS_TYPE_NONE;
+			return entry->getDP(crc);
 		}
 		else
 		{
-			// llinfos << "Cache miss for " << local_id << llendl;
-		cache_miss_type = CACHE_MISS_TYPE_FULL;
-			mCacheMissFull.put(local_id);
+			// llinfos << "CRC miss for " << local_id << llendl;
+		cache_miss_type = CACHE_MISS_TYPE_CRC;
+			mCacheMissCRC.put(local_id);
 		}
 	}
+	else
+	{
+		// llinfos << "Cache miss for " << local_id << llendl;
+	cache_miss_type = CACHE_MISS_TYPE_FULL;
+		mCacheMissFull.put(local_id);
+	}
+
 	return NULL;
 }
 
@@ -1206,7 +1315,7 @@ void LLViewerRegion::dumpCache()
 	}
 
 	LLVOCacheEntry *entry;
-	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter)
+	for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mImpl->mCacheMap.begin(); iter != mImpl->mCacheMap.end(); ++iter)
 	{
 		entry = iter->second ;
 
@@ -1220,7 +1329,7 @@ void LLViewerRegion::dumpCache()
 		change_bin[changes]++;
 	}
 
-	llinfos << "Count " << mCacheMap.size() << llendl;
+	llinfos << "Count " << mImpl->mCacheMap.size() << llendl;
 	for (i = 0; i < BINS; i++)
 	{
 		llinfos << "Hits " << i << " " << hit_bin[i] << llendl;
@@ -1363,10 +1472,10 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
 		return;
     }
 	
-	delete mEventPoll;
-	mEventPoll = NULL;
+	delete mImpl->mEventPoll;
+	mImpl->mEventPoll = NULL;
 	
-	mCapabilities.clear();
+	mImpl->mCapabilities.clear();
 	setCapability("Seed", url);
 
 	LLSD capabilityNames = LLSD::emptyArray();
@@ -1436,30 +1545,35 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
 	capabilityNames.append("ViewerMetrics");
 	capabilityNames.append("ViewerStartAuction");
 	capabilityNames.append("ViewerStats");
+	//prep# Finalize these!!!!!!!!!
+	//capabilityNames.append("AccountingVO");	
+	capabilityNames.append("AccountingParcel");
+	capabilityNames.append("AccountingRegion");
+	
 	// Please add new capabilities alphabetically to reduce
 	// merge conflicts.
 
 	llinfos << "posting to seed " << url << llendl;
 
-	mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
-	LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr);
+	mImpl->mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
+	LLHTTPClient::post(url, capabilityNames, mImpl->mHttpResponderPtr);
 }
 
 void LLViewerRegion::setCapability(const std::string& name, const std::string& url)
 {
 	if(name == "EventQueueGet")
 	{
-		delete mEventPoll;
-		mEventPoll = NULL;
-		mEventPoll = new LLEventPoll(url, getHost());
+		delete mImpl->mEventPoll;
+		mImpl->mEventPoll = NULL;
+		mImpl->mEventPoll = new LLEventPoll(url, getHost());
 	}
 	else if(name == "UntrustedSimulatorMessage")
 	{
-		LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url));
+		LLHTTPSender::setSender(mImpl->mHost, new LLCapHTTPSender(url));
 	}
 	else
 	{
-		mCapabilities[name] = url;
+		mImpl->mCapabilities[name] = url;
 		if(name == "GetTexture")
 		{
 			mHttpUrl = url ;
@@ -1474,8 +1588,8 @@ bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)
 
 std::string LLViewerRegion::getCapability(const std::string& name) const
 {
-	CapabilityMap::const_iterator iter = mCapabilities.find(name);
-	if(iter == mCapabilities.end())
+	CapabilityMap::const_iterator iter = mImpl->mCapabilities.find(name);
+	if(iter == mImpl->mCapabilities.end())
 	{
 		return "";
 	}
@@ -1497,7 +1611,7 @@ void LLViewerRegion::logActiveCapabilities() const
 {
 	int count = 0;
 	CapabilityMap::const_iterator iter;
-	for (iter = mCapabilities.begin(); iter != mCapabilities.end(); iter++, count++)
+	for (iter = mImpl->mCapabilities.begin(); iter != mImpl->mCapabilities.end(); ++iter, ++count)
 	{
 		if (!iter->second.empty())
 		{
@@ -1509,9 +1623,9 @@ void LLViewerRegion::logActiveCapabilities() const
 
 LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)
 {
-	if (type < mObjectPartition.size())
+	if (type < mImpl->mObjectPartition.size())
 	{
-		return mObjectPartition[type];
+		return mImpl->mObjectPartition[type];
 	}
 	return NULL;
 }
@@ -1549,3 +1663,4 @@ std::string LLViewerRegion::getDescription() const
 {
     return stringize(*this);
 }
+
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index dd40b876cd4c24173ab0104d8f9374946ff50981..a6e5c47b866af8ba36e67eea701e3cd30e3813d1 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -33,20 +33,16 @@
 
 #include "lldarray.h"
 #include "llwind.h"
-#include "llbbox.h"
 #include "llcloud.h"
 #include "llstat.h"
 #include "v3dmath.h"
-#include "llhost.h"
 #include "llstring.h"
 #include "llregionflags.h"
 #include "lluuid.h"
-#include "lldatapacker.h"
-#include "llvocache.h"
 #include "llweb.h"
 #include "llcapabilityprovider.h"
-#include "llcapabilitylistener.h"
 #include "m4math.h"					// LLMatrix4
+#include "llhttpclient.h"
 
 // Surface id's
 #define LAND  1
@@ -65,6 +61,13 @@ class LLVOCache;
 class LLVOCacheEntry;
 class LLSpatialPartition;
 class LLEventPump;
+class LLCapabilityListener;
+class LLDataPacker;
+class LLDataPackerBinaryBuffer;
+class LLHost;
+class LLBBox;
+
+class LLViewerRegionImpl;
 
 class LLViewerRegion: public LLCapabilityProvider // implements this interface
 {
@@ -159,19 +162,19 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	F32  getTimeDilation() const				{ return mTimeDilation; }
 
 	// Origin height is at zero.
-	const LLVector3d &getOriginGlobal() const	{ return mOriginGlobal; }
+	const LLVector3d &getOriginGlobal() const;
 	LLVector3 getOriginAgent() const;
 
 	// Center is at the height of the water table.
-	const LLVector3d &getCenterGlobal() const	{ return mCenterGlobal; }
+	const LLVector3d &getCenterGlobal() const;
 	LLVector3 getCenterAgent() const;
 
 	void setRegionNameAndZone(const std::string& name_and_zone);
 	const std::string& getName() const				{ return mName; }
 	const std::string& getZoning() const			{ return mZoning; }
 
-	void setOwner(const LLUUID& owner_id) { mOwnerID = owner_id; }
-	const LLUUID& getOwner() const { return mOwnerID; }
+	void setOwner(const LLUUID& owner_id);
+	const LLUUID& getOwner() const;
 
 	// Is the current agent on the estate manager list for this region?
 	void setIsEstateManager(BOOL b) { mIsEstateManager = b; }
@@ -206,7 +209,7 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	// can process the message.
 	static void processRegionInfo(LLMessageSystem* msg, void**);
 
-	void setCacheID(const LLUUID& id)			{ mCacheID = id; }
+	void setCacheID(const LLUUID& id);
 
 	F32	getWidth() const						{ return mWidth; }
 
@@ -222,8 +225,8 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 
 	U32	getPacketsLost() const;
 
-	void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;}
-	const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;}
+	void setHttpResponderPtrNULL();
+	const LLHTTPClient::ResponderPtr getHttpResponderPtr() const;
 
 	// Get/set named capability URLs for this region.
 	void setSeedCapability(const std::string& url);
@@ -238,21 +241,19 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	static bool isSpecialCapabilityName(const std::string &name);
 	void logActiveCapabilities() const;
 
-    /// Capability-request exception
-    typedef LLCapabilityListener::ArgError ArgError;
     /// Get LLEventPump on which we listen for capability requests
     /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
-    LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); }
+    LLEventPump& getCapAPI() const;
 
     /// implements LLCapabilityProvider
 	/*virtual*/ const LLHost& getHost() const;
 	const U64 		&getHandle() const 			{ return mHandle; }
 
-	LLSurface		&getLand() const			{ return *mLandp; }
+	LLSurface		&getLand() const;
 
 	// set and get the region id
-	const LLUUID& getRegionID() const { return mRegionID; }
-	void setRegionID(const LLUUID& region_id) { mRegionID = region_id; }
+	const LLUUID& getRegionID() const;
+	void setRegionID(const LLUUID& region_id);
 
 	BOOL pointInRegionGlobal(const LLVector3d &point_global) const;
 	LLVector3	getPosRegionFromGlobal(const LLVector3d &point_global) const;
@@ -260,7 +261,7 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	LLVector3	getPosAgentFromRegion(const LLVector3 &region_pos) const;
 	LLVector3d	getPosGlobalFromRegion(const LLVector3 &offset) const;
 
-	LLVLComposition *getComposition() const		{ return mCompositionp; }
+	LLVLComposition *getComposition() const;
 	F32 getCompositionXY(const S32 x, const S32 y) const;
 
 	BOOL isOwnedSelf(const LLVector3& pos);
@@ -274,6 +275,7 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	F32 getLandHeightRegion(const LLVector3& region_pos);
 
 	void getInfo(LLSD& info);
+	
 
 	typedef enum
 	{
@@ -347,34 +349,19 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	LLDynamicArray<LLUUID> mMapAvatarIDs;
 
 private:
-	// The surfaces and other layers
-	LLSurface*	mLandp;
+	LLViewerRegionImpl * mImpl;
 
-	// Region geometry data
-	LLVector3d	mOriginGlobal;	// Location of southwest corner of region (meters)
-	LLVector3d	mCenterGlobal;	// Location of center in world space (meters)
 	F32			mWidth;			// Width of region on a side (meters)
-
 	U64			mHandle;
-	LLHost		mHost;
-
-	// The unique ID for this region.
-	LLUUID mRegionID;
-
 	F32			mTimeDilation;	// time dilation of physics simulation on simulator
 
 	// simulator name
 	std::string mName;
 	std::string mZoning;
 
-	// region/estate owner - usually null.
-	LLUUID mOwnerID;
-
 	// Is this agent on the estate managers list for this region?
 	BOOL mIsEstateManager;
 
-	// Network statistics for the region's circuit...
-	LLTimer mLastNetUpdate;
 	U32		mPacketsIn;
 	U32		mBitsIn;
 	U32		mLastBitsIn;
@@ -386,9 +373,6 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	U32		mPingDelay;
 	F32		mDeltaTime;				// Time since last measurement of lastPackets, Bits, etc
 
-	// Misc
-	LLVLComposition *mCompositionp;		// Composition layer for the surface
-
 	U32		mRegionFlags;			// includes damage flags
 	U8		mSimAccess;
 	F32 	mBillableFactor;
@@ -398,46 +382,24 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	// Information for Homestead / CR-53
 	S32 mClassID;
 	S32 mCPURatio;
+
 	std::string mColoName;
 	std::string mProductSKU;
 	std::string mProductName;
 	std::string mHttpUrl ;
 	
-	
 	// Maps local ids to cache entries.
 	// Regions can have order 10,000 objects, so assume
 	// a structure of size 2^14 = 16,000
 	BOOL									mCacheLoaded;
 	BOOL                                    mCacheDirty;
-	LLVOCacheEntry::vocache_entry_map_t		mCacheMap;
+
 	LLDynamicArray<U32>						mCacheMissFull;
 	LLDynamicArray<U32>						mCacheMissCRC;
-	// time?
-	// LRU info?
-
-	// Cache ID is unique per-region, across renames, moving locations,
-	// etc.
-	LLUUID mCacheID;
 
-	typedef std::map<std::string, std::string> CapabilityMap;
-	CapabilityMap mCapabilities;
-	
-	LLEventPoll* mEventPoll;
-
-    /// Post an event to this LLCapabilityListener to invoke a capability message on
-    /// this LLViewerRegion's server
-    /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
-    LLCapabilityListener mCapabilityListener;
-
-private:
 	bool	mAlive;					// can become false if circuit disconnects
 	bool	mCapabilitiesReceived;
 
-	//spatial partitions for objects in this region
-	std::vector<LLSpatialPartition*> mObjectPartition;
-
-	LLHTTPClient::ResponderPtr  mHttpResponderPtr ;
-
 	BOOL mReleaseNotesRequested;
 };
 
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 25cf63a367254a4484f49fd58e21f0937cd5ed95..3e85802ba6c630780e6e4cab4676e482e9caa27d 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -137,6 +137,7 @@ LLGLSLShader			gDeferredGIProgram;
 LLGLSLShader			gDeferredGIFinalProgram;
 LLGLSLShader			gDeferredPostGIProgram;
 LLGLSLShader			gDeferredPostProgram;
+LLGLSLShader			gDeferredPostNoDoFProgram;
 
 LLGLSLShader			gLuminanceGatherProgram;
 
@@ -1050,7 +1051,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 	{
 		gDeferredMultiLightProgram.mName = "Deferred MultiLight Shader";
 		gDeferredMultiLightProgram.mShaderFiles.clear();
-		gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));
+		gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));
 		gDeferredMultiLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));
 		gDeferredMultiLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
 		success = gDeferredMultiLightProgram.createShader(NULL, NULL);
@@ -1246,6 +1247,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
 		success = gDeferredPostProgram.createShader(NULL, NULL);
 	}
 
+	if (success)
+	{
+		gDeferredPostNoDoFProgram.mName = "Deferred Post Shader";
+		gDeferredPostNoDoFProgram.mShaderFiles.clear();
+		gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER_ARB));
+		gDeferredPostNoDoFProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoDoFF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gDeferredPostNoDoFProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
+		success = gDeferredPostNoDoFProgram.createShader(NULL, NULL);
+	}
+
 	if (mVertexShaderLevel[SHADER_DEFERRED] > 1)
 	{
 		if (success)
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index f31d2d18365572b0d7ec76e0554222f66acbd7d7..72ac5e02ee50d0931bfd595128732d201103f5d2 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -368,6 +368,7 @@ extern LLGLSLShader			gDeferredSoftenProgram;
 extern LLGLSLShader			gDeferredShadowProgram;
 extern LLGLSLShader			gDeferredPostGIProgram;
 extern LLGLSLShader			gDeferredPostProgram;
+extern LLGLSLShader			gDeferredPostNoDoFProgram;
 extern LLGLSLShader			gDeferredAvatarShadowProgram;
 extern LLGLSLShader			gDeferredAttachmentShadowProgram;
 extern LLGLSLShader			gDeferredAlphaProgram;
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 7a10dfc414942f51e627c5df4a652c348b81f4e4..d9ff9315750592299c06f70973648550d15bf12d 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -76,18 +76,23 @@ LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);
 LLViewerTextureList gTextureList;
 static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
 
+U32 LLViewerTextureList::sRenderThreadID = 0 ;
 ///////////////////////////////////////////////////////////////////////////////
 
 LLViewerTextureList::LLViewerTextureList() 
 	: mForceResetTextureStats(FALSE),
 	mUpdateStats(FALSE),
 	mMaxResidentTexMemInMegaBytes(0),
-	mMaxTotalTextureMemInMegaBytes(0)
+	mMaxTotalTextureMemInMegaBytes(0),
+	mInitialized(FALSE)
 {
 }
 
 void LLViewerTextureList::init()
 {
+	sRenderThreadID = LLThread::currentID() ;
+
+	mInitialized = TRUE ;
 	sNumImages = 0;
 	mMaxResidentTexMemInMegaBytes = 0;
 	mMaxTotalTextureMemInMegaBytes = 0 ;
@@ -105,6 +110,10 @@ void LLViewerTextureList::doPreloadImages()
 {
 	LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;
 	
+	llassert_always(mInitialized) ;
+	llassert_always(mImageList.empty()) ;
+	llassert_always(mUUIDMap.empty()) ;
+
 	// Set the "missing asset" image
 	LLViewerFetchedTexture::sMissingAssetImagep = LLViewerTextureManager::getFetchedTextureFromFile("missing_asset.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI);
 	
@@ -300,6 +309,7 @@ void LLViewerTextureList::destroyGL(BOOL save_state)
 
 void LLViewerTextureList::restoreGL()
 {
+	llassert_always(mInitialized) ;
 	LLImageGL::restoreGL();
 }
 
@@ -477,8 +487,10 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id)
 	return iter->second;
 }
 
-void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
+void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image, U32 thread_id)
 {
+	llassert_always(mInitialized) ;
+	llassert_always(sRenderThreadID == thread_id);
 	llassert(image);
 	if (image->isInImageList())
 	{
@@ -492,8 +504,10 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
 	image->setInImageList(TRUE) ;
 }
 
-void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
+void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id)
 {
+	llassert_always(mInitialized) ;
+	llassert_always(sRenderThreadID == thread_id);
 	llassert(image);
 	if (!image->isInImageList())
 	{
@@ -690,9 +704,9 @@ void LLViewerTextureList::updateImagesDecodePriorities()
 			if ((decode_priority_test < old_priority_test * .8f) ||
 				(decode_priority_test > old_priority_test * 1.25f))
 			{
-				removeImageFromList(imagep);
+				removeImageFromList(imagep, sRenderThreadID);
 				imagep->setDecodePriority(decode_priority);
-				addImageToList(imagep);
+				addImageToList(imagep, sRenderThreadID);
 			}
 			update_counter--;
 		}
@@ -769,9 +783,8 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)
 	imagep->processTextureStats();
 	F32 decode_priority = LLViewerFetchedTexture::maxDecodePriority() ;
 	imagep->setDecodePriority(decode_priority);
-	mImageList.insert(imagep);
-	imagep->setInImageList(TRUE) ;
-
+	addImageToList(imagep);
+	
 	return ;
 }
 
@@ -864,7 +877,9 @@ void LLViewerTextureList::updateImagesUpdateStats()
 void LLViewerTextureList::decodeAllImages(F32 max_time)
 {
 	LLTimer timer;
-	
+
+	llassert_always(sRenderThreadID == LLThread::currentID());
+
 	// Update texture stats and priorities
 	std::vector<LLPointer<LLViewerFetchedTexture> > image_list;
 	for (image_priority_list_t::iterator iter = mImageList.begin();
@@ -882,8 +897,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
 		imagep->processTextureStats();
 		F32 decode_priority = imagep->calcDecodePriority();
 		imagep->setDecodePriority(decode_priority);
-		mImageList.insert(imagep);
-		imagep->setInImageList(TRUE) ;
+		addImageToList(imagep);
 	}
 	image_list.clear();
 	
@@ -932,16 +946,19 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
 	LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);
 	if (image.isNull())
 	{
+		image->setLastError("Couldn't open the image to be uploaded.");
 		return FALSE;
 	}	
 	if (!image->load(filename))
 	{
+		image->setLastError("Couldn't load the image to be uploaded.");
 		return FALSE;
 	}
 	// Decompress or expand it in a raw image structure
 	LLPointer<LLImageRaw> raw_image = new LLImageRaw;
 	if (!image->decode(raw_image, 0.0f))
 	{
+		image->setLastError("Couldn't decode the image to be uploaded.");
 		return FALSE;
 	}
 	// Check the image constraints
@@ -952,8 +969,15 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
 	}
 	// Convert to j2c (JPEG2000) and save the file locally
 	LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image);	
+	if (compressedImage.isNull())
+	{
+		image->setLastError("Couldn't convert the image to jpeg2000.");
+		llinfos << "Couldn't convert to j2c, file : " << filename << llendl;
+		return FALSE;
+	}
 	if (!compressedImage->save(out_filename))
 	{
+		image->setLastError("Couldn't create the jpeg2000 image for upload.");
 		llinfos << "Couldn't create output file : " << out_filename << llendl;
 		return FALSE;
 	}
@@ -961,6 +985,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
 	LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
 	if (!integrity_test->loadAndValidate( out_filename ))
 	{
+		image->setLastError("The created jpeg2000 image is corrupt.");
 		llinfos << "Image file : " << out_filename << " is corrupt" << llendl;
 		return FALSE;
 	}
@@ -978,7 +1003,25 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage
 		(raw_image->getWidth() * raw_image->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF))
 		compressedImage->setReversible(TRUE);
 	
-	compressedImage->encode(raw_image, 0.0f);
+
+	if (gSavedSettings.getBOOL("Jpeg2000AdvancedCompression"))
+	{
+		// This test option will create jpeg2000 images with precincts for each level, RPCL ordering
+		// and PLT markers. The block size is also optionally modifiable.
+		// Note: the images hence created are compatible with older versions of the viewer.
+		// Read the blocks and precincts size settings
+		S32 block_size = gSavedSettings.getS32("Jpeg2000BlocksSize");
+		S32 precinct_size = gSavedSettings.getS32("Jpeg2000PrecinctsSize");
+		llinfos << "Advanced JPEG2000 Compression: precinct = " << precinct_size << ", block = " << block_size << llendl;
+		compressedImage->initEncode(*raw_image, block_size, precinct_size, 0);
+	}
+	
+	if (!compressedImage->encode(raw_image, 0.0f))
+	{
+		llinfos << "convertToUploadFile : encode returns with error!!" << llendl;
+		// Clear up the pointer so we don't leak that one
+		compressedImage = NULL;
+	}
 	
 	return compressedImage;
 }
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index d508ce1ac6cbddec15f6ddc3d8932e90bef8475d..d02b6be6b5d8ec73b6d00677ad9c652f9c3a6fcc 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -83,6 +83,7 @@ class LLViewerTextureList
 	void dump();
 	void destroyGL(BOOL save_state = TRUE);
 	void restoreGL();
+	BOOL isInitialized() const {return mInitialized;}
 
 	LLViewerFetchedTexture *findImage(const LLUUID &image_id);
 
@@ -120,8 +121,8 @@ class LLViewerTextureList
 	void addImage(LLViewerFetchedTexture *image);
 	void deleteImage(LLViewerFetchedTexture *image);
 
-	void addImageToList(LLViewerFetchedTexture *image);
-	void removeImageFromList(LLViewerFetchedTexture *image);
+	void addImageToList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
+	void removeImageFromList(LLViewerFetchedTexture *image, U32 thread_id = LLThread::currentID());
 
 	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
@@ -187,6 +188,7 @@ class LLViewerTextureList
 	// simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon
 	std::set<LLPointer<LLViewerFetchedTexture> > mImagePreloads;
 
+	BOOL mInitialized ;
 	BOOL mUpdateStats;
 	S32	mMaxResidentTexMemInMegaBytes;
 	S32 mMaxTotalTextureMemInMegaBytes;
@@ -206,30 +208,33 @@ class LLViewerTextureList
 private:
 	static S32 sNumImages;
 	static void (*sUUIDCallback)(void**, const LLUUID &);
+
+	//debug use
+	static U32 sRenderThreadID;
 };
 
 class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>
 {
 public:
 	// LLImageProviderInterface
-	/*virtual*/ LLUIImagePtr getUIImageByID(const LLUUID& id, S32 priority);
-	/*virtual*/ LLUIImagePtr getUIImage(const std::string& name, S32 priority);
+	/*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority);
+	/*virtual*/ LLPointer<LLUIImage> getUIImage(const std::string& name, S32 priority);
 	void cleanUp();
 
 	bool initFromFile();
 
-	LLUIImagePtr preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect);
+	LLPointer<LLUIImage> preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect);
 	
 	static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
 private:
-	LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
+	LLPointer<LLUIImage> loadUIImageByName(const std::string& name, const std::string& filename,
 		                           BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
 		                           LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
-	LLUIImagePtr loadUIImageByID(const LLUUID& id,
+	LLPointer<LLUIImage> loadUIImageByID(const LLUUID& id,
 								 BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, 
 								 LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
 
-	LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
+	LLPointer<LLUIImage> loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
 
 
 	struct LLUIImageLoadData
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 8af90622ec7736e9b95e74dbf53df1e42043bcb0..6fe79c2e8572c7130294c98e7c0df56b639beb12 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -79,6 +79,7 @@
 #include "lltooltip.h"
 #include "llmediaentry.h"
 #include "llurldispatcher.h"
+#include "raytrace.h"
 
 // newview includes
 #include "llagent.h"
@@ -236,17 +237,12 @@ BOOL				gDisplayCameraPos = FALSE;
 BOOL				gDisplayFOV = FALSE;
 BOOL				gDisplayBadge = FALSE;
 
-S32 CHAT_BAR_HEIGHT = 28; 
-S32 OVERLAY_BAR_HEIGHT = 20;
-
-const U8 NO_FACE = 255;
+static const U8 NO_FACE = 255;
 BOOL gQuietSnapshot = FALSE;
 
 const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before coming back
-const F32 MAX_FAST_FRAME_TIME = 0.5f;
-const F32 FAST_FRAME_INCREMENT = 0.1f;
 
-const F32 MIN_DISPLAY_SCALE = 0.75f;
+static const F32 MIN_DISPLAY_SCALE = 0.75f;
 
 std::string	LLViewerWindow::sSnapshotBaseName;
 std::string	LLViewerWindow::sSnapshotDir;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 62822c0b34b829f272c67ff23464ed711fc806fa..df6928aa1d0ada833ff98edcdb71d111cf220e13 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -38,13 +38,12 @@
 
 #include "v3dmath.h"
 #include "v2math.h"
+#include "llcursortypes.h"
 #include "llwindowcallbacks.h"
 #include "lltimer.h"
 #include "llstat.h"
 #include "llmousehandler.h"
-#include "llcursortypes.h"
 #include "llhandle.h"
-#include "llimage.h"
 
 #include <boost/function.hpp>
 #include <boost/signals2.hpp>
@@ -59,6 +58,7 @@ class LLTool;
 class LLVelocityBar;
 class LLPanel;
 class LLImageRaw;
+class LLImageFormatted;
 class LLHUDIcon;
 class LLWindow;
 class LLRootView;
@@ -467,12 +467,6 @@ class LLViewerWindow : public LLWindowCallbacks
 	LLPointer<LLViewerObject>	mDragHoveredObject;
 };
 
-void toggle_flying(void*);
-void toggle_first_person();
-void toggle_build(void*);
-void reset_viewer_state_on_sim(void);
-void update_saved_window_size(const std::string& control,S32 delta_width, S32 delta_height);
-
 //
 // Globals
 //
@@ -491,8 +485,6 @@ extern S32				gDebugRaycastFaceHit;
 extern LLVector3		gDebugRaycastStart;
 extern LLVector3		gDebugRaycastEnd;
 
-extern S32 CHAT_BAR_HEIGHT; 
-
 extern BOOL			gDisplayCameraPos;
 extern BOOL			gDisplayWindInfo;
 extern BOOL			gDisplayFOV;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 1f6d686a863ce4ddc1f8b7301ae92db375643b55..ec2b5a4c9800cc7ac7bd3711bc7984971d04151a 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -38,9 +38,9 @@
 #include <ctype.h>
 
 #include "llaudioengine.h"
-#include "llcachename.h"
 #include "noise.h"
 #include "sound_ids.h"
+#include "raytrace.h"
 
 #include "llagent.h" //  Get state values from here
 #include "llagentcamera.h"
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index a71539266d6c8a6d6febc8bc48efd01c04122524..bd12328a6bceaa950a3d1fda6d3ceb75b1d60eec 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -412,6 +412,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
 {
 	EState old_state = mState;
 	mState = new_state;
+
 	if (!mStateChangedCallback.empty())
 		mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
 }
@@ -846,8 +847,13 @@ void LLVoiceChannelP2P::activate()
 		// otherwise answering the call
 		else
 		{
-			LLVoiceClient::getInstance()->answerInvite(mSessionHandle);
-			
+			if (!LLVoiceClient::getInstance()->answerInvite(mSessionHandle))
+			{
+				mCallEndedByAgent = false;
+				mSessionHandle.clear();
+				handleError(ERROR_UNKNOWN);
+				return;
+			}
 			// using the session handle invalidates it.  Clear it out here so we can't reuse it by accident.
 			mSessionHandle.clear();
 		}
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 288d335e1d7c18980b3046bec219df442deb52bb..6396bc042dba7fc9f4b01559b83adfb9fc25ae99 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -304,7 +304,7 @@ void LLSkyTex::createGLImage(S32 which)
 
 void LLSkyTex::bindTexture(BOOL curr)
 {
-	gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)]);
+	gGL.getTexUnit(0)->bind(mTexture[getWhich(curr)], true);
 }
 
 /***************************************
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index e6f2b19e0703d082ba211d30983ddffcad11049f..8946d4e0b60c2f0f0ba91aa1a827ff5b573f712e 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -50,6 +50,7 @@
 #include "pipeline.h"
 #include "llspatialpartition.h"
 #include "llnotificationsutil.h"
+#include "raytrace.h"
 
 extern LLPipeline gPipeline;
 
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 9d2887d2e83af647e3c729f064b91d671e8459e0..e9a8c9b80aab16c5feccf7f1834cb8fd97b0d68b 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -72,7 +72,9 @@
 #include "llmeshrepository.h"
 #include "llagent.h"
 #include "llviewermediafocus.h"
+#include "lldatapacker.h"
 #include "llvoavatar.h"
+#include "llvocache.h"
 
 const S32 MIN_QUIET_FRAMES_COALESCE = 30;
 const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index 4b3a9a4dc37b8c00a5b9303ec166004da00e1970..67bb965f99e913ed6f88e50344b5dad9e5871559 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -33,6 +33,7 @@
 #include "pipeline.h"
 #include "llsky.h"
 
+#include "lldiriterator.h"
 #include "llfloaterreg.h"
 #include "llsliderctrl.h"
 #include "llspinctrl.h"
@@ -87,11 +88,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
 	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
 	LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
 			
-	bool found = true;			
+	bool found = true;
+	LLDirIterator app_settings_iter(path_name, "*.xml");
 	while(found) 
 	{
 		std::string name;
-		found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
+		found = app_settings_iter.next(name);
 		if(found)
 		{
 
@@ -113,11 +115,12 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
 	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
 	LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
 			
-	found = true;			
+	found = true;
+	LLDirIterator user_settings_iter(path_name2, "*.xml");
 	while(found) 
 	{
 		std::string name;
-		found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
+		found = user_settings_iter.next(name);
 		if(found)
 		{
 			name=name.erase(name.length()-4);
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index e5f52dfc979b5ef4cd09c8366d6b5263d541b9ba..848efcbb49e5f8e28f3bd393df7767dd003b27ee 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -31,6 +31,7 @@
 #include "pipeline.h"
 #include "llsky.h"
 
+#include "lldiriterator.h"
 #include "llfloaterreg.h"
 #include "llsliderctrl.h"
 #include "llspinctrl.h"
@@ -100,11 +101,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
 	std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
 	LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
 			
-	bool found = true;			
+	bool found = true;
+	LLDirIterator app_settings_iter(path_name, "*.xml");
 	while(found) 
 	{
 		std::string name;
-		found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
+		found = app_settings_iter.next(name);
 		if(found)
 		{
 
@@ -126,11 +128,12 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
 	std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
 	LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
 			
-	found = true;			
+	found = true;
+	LLDirIterator user_settings_iter(path_name2, "*.xml");
 	while(found) 
 	{
 		std::string name;
-		found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name);
+		found = user_settings_iter.next(name);
 		if(found)
 		{
 			name=name.erase(name.length()-4);
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 23594e74b6917c34b06f1fefda3b50e7ca9a312e..ec24b029347a381015d81d76117aaf0d2ffa53cc 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -50,6 +50,7 @@
 #include "llviewerstats.h"
 #include "llvlcomposition.h"
 #include "llvoavatar.h"
+#include "llvocache.h"
 #include "llvowater.h"
 #include "message.h"
 #include "pipeline.h"
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index 2596f239ca539401d5a8da17e546372724bfa0a9..97a9eb7f5fc557accfd4d7fc555f8098f0f8f6e7 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -499,6 +499,13 @@ class Poller
                 // 'array' as the value of this 'key'.
                 responses.insert(key, array);
             }
+            else if (xmlrpc_type_struct == type)
+            {
+                LLSD submap = parseValues(status_string,
+                                          STRINGIZE(key_pfx << key << ':'),
+                                          current);
+                responses.insert(key, submap);
+            }
             else
             {
                 // whoops - unrecognized type
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 21fbe52ccd26fee1418e069c1903e4b504701f48..845a87b8cff49fa020a6f7bcc00f14183c293b0d 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -625,8 +625,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 		mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
 		addDeferredAttachments(mDeferredScreen);
 	
-		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+		
+#if LL_DARWIN
+		// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
+		mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+#else
 		mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+#endif
 
 		if (shadow_detail > 0 || ssao)
 		{ //only need mDeferredLight[0] for shadows OR ssao
@@ -651,7 +657,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 			mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
 			for (U32 i = 0; i < 2; i++)
 			{
+#if LL_DARWIN
+				// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
+				mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+#else
 				mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+#endif
 			}
 		}
 		else
@@ -666,8 +677,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 
 		F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale");
 
+#if LL_DARWIN
+		U32 shadow_fmt = 0;
+#else
 		//HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug)
 		U32 shadow_fmt = gGLManager.mIsATI ? GL_ALPHA : 0;
+#endif
 
 		if (shadow_detail > 0)
 		{ //allocate 4 sun shadow maps
@@ -784,6 +799,21 @@ void LLPipeline::updateRenderDeferred()
 	}
 }
 
+//static
+void LLPipeline::refreshRenderDeferred()
+{
+	if(gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))
+	{
+		//turn the deferred rendering and glow off when draw physics shapes.
+		sRenderDeferred = FALSE ;
+		sRenderGlow = FALSE ;
+	}
+	else
+	{
+		updateRenderDeferred() ;
+	}
+}
+
 void LLPipeline::releaseGLBuffers()
 {
 	assertInitialized();
@@ -6275,128 +6305,135 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 
 	if (LLPipeline::sRenderDeferred && !LLViewerCamera::getInstance()->cameraUnderWater())
 	{
+		bool dof_enabled = true;
+
 		LLGLSLShader* shader = &gDeferredPostProgram;
 		if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED) > 2)
 		{
 			shader = &gDeferredGIFinalProgram;
+			dof_enabled = false;
+		}
+		else if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
+		{ //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult
+			shader = &gDeferredPostNoDoFProgram;
+			dof_enabled = false;
 		}
 		
+		
 		LLGLDisable blend(GL_BLEND);
 		bindDeferredShader(*shader);
 
-		//depth of field focal plane calculations
+		if (dof_enabled)
+		{
+			//depth of field focal plane calculations
 
-		static F32 current_distance = 16.f;
-		static F32 start_distance = 16.f;
-		static F32 transition_time = 1.f;
+			static F32 current_distance = 16.f;
+			static F32 start_distance = 16.f;
+			static F32 transition_time = 1.f;
 
-		LLVector3 focus_point;
+			LLVector3 focus_point;
 
-		LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
-		if (obj && obj->mDrawable && obj->isSelected())
-		{
-			S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
-			if (obj && obj->mDrawable)
-			{
-				LLFace* face = obj->mDrawable->getFace(face_idx);
-				if (face)
+			LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
+			if (obj && obj->mDrawable && obj->isSelected())
+			{ //focus on selected media object
+				S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
+				if (obj && obj->mDrawable)
 				{
-					focus_point = face->getPositionAgent();
+					LLFace* face = obj->mDrawable->getFace(face_idx);
+					if (face)
+					{
+						focus_point = face->getPositionAgent();
+					}
 				}
 			}
-		}
 		
-		if (focus_point.isExactlyZero())
-		{
-			if (LLViewerJoystick::getInstance()->getOverrideCamera())
+			if (focus_point.isExactlyZero())
 			{
-				focus_point = gDebugRaycastIntersection;
-			}
-			else if (gAgentCamera.cameraMouselook())
-			{
-				gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
-											  NULL,
-											  &focus_point);
-			}
-			else
-			{
-				LLViewerObject* obj = gAgentCamera.getFocusObject();
-				if (obj)
-				{
-					focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal());
+				if (LLViewerJoystick::getInstance()->getOverrideCamera())
+				{ //focus on point under cursor
+					focus_point = gDebugRaycastIntersection;
+				}
+				else if (gAgentCamera.cameraMouselook())
+				{ //focus on point under mouselook crosshairs
+					gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE,
+												  NULL,
+												  &focus_point);
 				}
 				else
 				{
-					focus_point = gDebugRaycastIntersection;
+					LLViewerObject* obj = gAgentCamera.getFocusObject();
+					if (obj)
+					{ //focus on alt-zoom target
+						focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal());
+					}
+					else
+					{ //focus on your avatar
+						focus_point = gAgent.getPositionAgent();
+					}
 				}
 			}
-		}
-
-		LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
-		F32 target_distance = 16.f;
-		if (!focus_point.isExactlyZero())
-		{
-			target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye);
-		}
 
-		if (transition_time >= 1.f &&
-			fabsf(current_distance-target_distance)/current_distance > 0.01f)
-		{ //large shift happened, interpolate smoothly to new target distance
-			transition_time = 0.f;
-			start_distance = current_distance;
-		}
-		else if (transition_time < 1.f)
-		{ //currently in a transition, continue interpolating
-			transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds;
-			transition_time = llmin(transition_time, 1.f);
+			LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
+			F32 target_distance = 16.f;
+			if (!focus_point.isExactlyZero())
+			{
+				target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point-eye);
+			}
 
-			F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
-			current_distance = start_distance + (target_distance-start_distance)*t;
-		}
-		else
-		{ //small or no change, just snap to target distance
-			current_distance = target_distance;
-		}
+			if (transition_time >= 1.f &&
+				fabsf(current_distance-target_distance)/current_distance > 0.01f)
+			{ //large shift happened, interpolate smoothly to new target distance
+				transition_time = 0.f;
+				start_distance = current_distance;
+			}
+			else if (transition_time < 1.f)
+			{ //currently in a transition, continue interpolating
+				transition_time += 1.f/gSavedSettings.getF32("CameraFocusTransitionTime")*gFrameIntervalSeconds;
+				transition_time = llmin(transition_time, 1.f);
 
-		//convert to mm
-		F32 subject_distance = current_distance*1000.f;
-		F32 fnumber = gSavedSettings.getF32("CameraFNumber");
-		F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength");
+				F32 t = cosf(transition_time*F_PI+F_PI)*0.5f+0.5f;
+				current_distance = start_distance + (target_distance-start_distance)*t;
+			}
+			else
+			{ //small or no change, just snap to target distance
+				current_distance = target_distance;
+			}
 
-		if (LLToolMgr::getInstance()->inBuildMode() || !gSavedSettings.getBOOL("RenderDepthOfField"))
-		{ //squish focal length when in build mode (or if DoF is disabled) so DoF doesn't make editing objects difficult
-			default_focal_length = 5.f;
-		}
+			//convert to mm
+			F32 subject_distance = current_distance*1000.f;
+			F32 fnumber = gSavedSettings.getF32("CameraFNumber");
+			F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength");
 
-		F32 fov = LLViewerCamera::getInstance()->getView();
+			F32 fov = LLViewerCamera::getInstance()->getView();
 		
-		const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f;
-		//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
+			const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f;
+			//const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio");
 		
-		//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
+			//F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight();
 		
-		F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
-		//F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);
+			F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f);
+			//F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f);
 
-		F32 focal_length = dv/(2*tanf(fov/2.f));
+			F32 focal_length = dv/(2*tanf(fov/2.f));
 		 
-		//F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
+			//F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
 	
-		// from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
-		// where	 N = fnumber
-		//			 s2 = dot distance
-		//			 s1 = subject distance
-		//			 f = focal length
-		//	
-
-		F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length));
-		blur_constant /= 1000.f; //convert to meters for shader
-		F32 magnification = focal_length/(subject_distance-focal_length);
-
-		shader->uniform1f("focal_distance", -subject_distance/1000.f);
-		shader->uniform1f("blur_constant", blur_constant);
-		shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle));
-		shader->uniform1f("magnification", magnification);
+			// from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
+			// where	 N = fnumber
+			//			 s2 = dot distance
+			//			 s1 = subject distance
+			//			 f = focal length
+			//	
+
+			F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length));
+			blur_constant /= 1000.f; //convert to meters for shader
+			F32 magnification = focal_length/(subject_distance-focal_length);
+
+			shader->uniform1f("focal_distance", -subject_distance/1000.f);
+			shader->uniform1f("blur_constant", blur_constant);
+			shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle));
+			shader->uniform1f("magnification", magnification);
+		}
 
 		S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE);
 		if (channel > -1)
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 0cf3fde562747685740e5840908fe727b0ce34d5..e9a250cd6d7ba3c7a53d81922e1b25ccd61c7557 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -356,6 +356,7 @@ class LLPipeline
 	static BOOL getRenderHighlights(void* data);
 
 	static void updateRenderDeferred();
+	static void refreshRenderDeferred();
 
 private:
 	void unloadShaders();
diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h
index 28813be8964a2eac987c86805c27403e99d306ff..01d90da971cc5356acea5bb3584aeb451f0e88a5 100644
--- a/indra/newview/res/resource.h
+++ b/indra/newview/res/resource.h
@@ -38,6 +38,7 @@
 #define IDC_CURSOR5                     154
 #define IDI_LCD_LL_ICON                 157
 #define IDC_CURSOR6                     158
+#define IDC_STATIC                      1000
 #define IDC_RADIO_56                    1000
 #define IDC_RADIO_128                   1001
 #define IDC_RADIO_256                   1002
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 5e8cee1f5fac55c59663020cc3c5f1a37ec449a1..38d04b4b5c5f2ff3e68755e7abfdc4e4fd94f147 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -7,7 +7,7 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "winres.h"
+#include "windows.h"
 
 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END
 
 2 TEXTINCLUDE 
 BEGIN
-    "#include ""winres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END
 
diff --git a/indra/newview/skins/default/textures/icons/Edit_Wrench.png b/indra/newview/skins/default/textures/icons/Edit_Wrench.png
index 250697b4b1d03ccee8bb45dd3ecd2a1cbaced5c8..edb40b9c96fa888fa4cadbbebc2556e8efac6fb4 100644
Binary files a/indra/newview/skins/default/textures/icons/Edit_Wrench.png and b/indra/newview/skins/default/textures/icons/Edit_Wrench.png differ
diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml
index 760f60c99679a868f34a756a3572aef99ed2f0c7..af9ee0bd067bf4b34654e3b905b742208a8e7752 100644
--- a/indra/newview/skins/default/xui/da/floater_tos.xml
+++ b/indra/newview/skins/default/xui/da/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Henter %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Fortsæt" label_selected="Fortsæt" name="Continue"/>
 	<button label="Annullér" label_selected="Annullér" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index a3c4897ee10a7e73b969f8a4344fb95ccf2b0e3c..30b54d3eb28367360738be839ecaf06b9e181998 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -748,6 +748,7 @@ Prøv venligst igen senere.
 		[OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME].
 	</notification>
 	<notification name="OfferTeleport">
+		Tilbyd en teleport til din position med følgende besked?
 		<form name="form">
 			<input name="message">
 				Mød mig i [REGION]
diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml
index 1f3ef2f0b46d71526829d37ea6253f99c3d50421..ba329371f8e0884b7343ef5829d31d8c76788fc0 100644
--- a/indra/newview/skins/default/xui/de/floater_tos.xml
+++ b/indra/newview/skins/default/xui/de/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Wird geladen %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EServicebedingungen%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Weiter" label_selected="Weiter" name="Continue"/>
 	<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 967cb284768e21bce206066a20fae3c501884b10..a8b3ce9c28fe6ee52a03ab04dd848fa7592f22fe 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -139,21 +139,20 @@ Thank you to the following Residents for helping to ensure that this is the best
        word_wrap="true">
 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
 APR Copyright (C) 2000-2004 The Apache Software Foundation
-  Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
+Collada DOM Copyright 2005 Sony Computer Entertainment Inc.
 cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
 DBus/dbus-glib Copyright (C) 2002, 2003  CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
 expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.
 FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
 GL Copyright (C) 1999-2004 Brian Paul.
-  GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
+GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia.
 google-perftools Copyright (c) 2005, Google Inc.
 Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
 jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
 jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
 ogg/vorbis Copyright (C) 2001, Xiphophorus
 OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
-  PCRE Copyright (c) 1997-2008 University of Cambridge
-Pth Copyright (C) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;
+PCRE Copyright (c) 1997-2008 University of Cambridge
 SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
 SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml
index 533e0c96f2bda3ed61e126fe94f7050f669375db..a24306456aa5a5347191d075a13f918faf5cfc54 100644
--- a/indra/newview/skins/default/xui/en/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml
@@ -1,547 +1,547 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater can_close="true" can_drag_on_left="false" can_minimize="false"
-     can_resize="true" height="550" min_height="550" min_width="620"
-     name="Model Preview" title="Upload Model" width="620">
-
-  <string name="status_idle">Idle</string>
-  <string name="status_reading_file">Loading...</string>
-  <string name="status_generating_meshes">Generating Meshes...</string>
-  <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
-  <string name="high">High</string>
-  <string name="medium">Medium</string>
-  <string name="low">Low</string>
-  <string name="lowest">Lowest</string>
-  <string name="mesh_status_good">Ship it!</string>
-  <string name="mesh_status_na">N/A</string>
-  <string name="mesh_status_none">None</string>
-  <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
-  <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
-  <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
-  <string name="mesh_status_missing_lod">Missing required level of detail.</string>
-  <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
-  <string name="decomposing">Analyzing...</string>
-  <string name="simplifying">Simplifying...</string>
-  
-
-  <text left="15" bottom="25" follows="top|left" height="15" name="name_label">
-    Name:
-  </text>
-  <line_editor bottom_delta="20" follows="top|left|right" height="19" max_length_bytes="64" 
-	     name="description_form" prevalidate_callback="ascii" width="290" />
-  
-  <text bottom_delta="20" left="15" follows="left|top" height="15" name="lod_label">
-    Preview:
-  </text>
-  <combo_box bottom_delta="20" follows="left|top" height="18"
-	     name="preview_lod_combo" width="240" tool_tip="LOD to view in preview render">
-    <combo_item name="high">
-      Level of Detail: High
-    </combo_item>
-    <combo_item name="medium">
-      Level of Detail: Medium
-    </combo_item>
-    <combo_item name="low">
-      Level of Detail: Low
-    </combo_item>
-    <combo_item name="lowest">
-      Level of Detail: Lowest
-    </combo_item>
-  </combo_box>
-
-    <menu_button follows="top|left" 
-         image_hover_unselected="Toolbar_Left_Over"
-         image_overlay="OptionsMenu_Off"
-         image_selected="Toolbar_Left_Selected"
-         image_unselected="Toolbar_Left_Off"
-         layout="topleft"
-         left_pad="5"
-         name="options_gear_btn"
-         width="31"
-         height="25"/>
-  <!-- Placeholder panel for 3D preview render -->
-  <panel
-    name="preview_panel"
-    left="15"
-    bevel_style="none"
-    border_style="line"
-    border="true"
-    width="290"
-    height="290"
-    follows="all"/>
-
-  <text bottom_delta="25" left="25" width="100" follows="bottom|left">Upload Details</text>
-  <panel top_pad="5" border="true" left="15" width="290" height="70" follows="bottom|left"
-          bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
-    <text left="25" follows="bottom|left" width="140" height="15" name="streaming cost">
-      Resource Cost: [COST]
-    </text>
-    <text left="25" top_pad="5" width="140" follows="bottom|left" height="15" name="physics cost">
-      Physics Cost: [COST]
-    </text>
-    <text left="25" top_pad="5" follows="bottom|left" height="15" name="upload fee">
-      Upload Fee: N/A
-    </text>
-  </panel>
-
-  <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text>
-
-  
-  <button bottom="540" left="300"  follows="bottom|right" height="20" label="Defaults"
-	     width="80" name="reset_btn" tool_tip="Reset to defaults"/>
-  <button bottom="540" left="430"  follows="bottom|right" height="20" label="Upload"
-	     width="80" name="ok_btn" tool_tip="Upload to simulator"/>
-  <button left_pad="10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/>
-
-  <tab_container
-    follows="right|top|bottom"
-    top="15"
-    left="310"
-    height="470"
-    width="300"
-    name="import_tab"
-    border="true"
-    tab_position="top">
-
-    <!-- LOD PANEL -->
-    <panel
-      border="true"
-      label="Level of Detail"
-      name="lod_panel">
-
-      <text left="10" width="240" bottom="20" height="15" follows="left|top" name="lod_table_header">
-        Select Level of Detail:
-      </text>
-     
-      <text valign="center" halign="center" bg_visible="true" bottom_delta="16" left="75" width="65" height="18" follows="left|top" value="Triangles"/>
-      <text valign="center" halign="center" bg_visible="true" left_pad="0" width="65" height="18" follows="left|top" value="Vertices"/>
-      <text valign="center" halign="center" left_pad="0" width="65" bg_visible="true" height="18" follows="left|top" value="Status"/>
-      
-      <text valign="center" halign="center" bg_visible="true" name="high_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="High"/>
-      <text valign="center" halign="center" bg_visible="true" name="high_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="high_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="high_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
-      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_high" left_delta="20" top_delta="0" />
-
-      <text valign="center" halign="center" bg_visible="true" name="medium_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Medium"/>
-      <text valign="center" halign="center" bg_visible="true" name="medium_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="medium_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="medium_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
-      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_medium" left_delta="20" top_delta="0" />
-
-      <text valign="center" halign="center" bg_visible="true" name="low_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Low"/>
-      <text valign="center" halign="center" bg_visible="true" name="low_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="low_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="low_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
-      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_low" left_delta="20" top_delta="0" />
-
-      <text valign="center" halign="center" bg_visible="true" name="lowest_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Lowest"/>
-      <text valign="center" halign="center" bg_visible="true" name="lowest_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="lowest_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
-      <text valign="center" halign="center" bg_visible="true" name="lowest_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
-      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_lowest" left_delta="20" top_delta="0" />
-      
-      <text left="10" width="240" height="15" top_pad="15" follows="left|top" name="lod_table_footer">
-        Level of Detail: [DETAIL]
-      </text>
-
-      <icon height="16" width="16" left="20" follows="left|top" name="lod_status_message_icon"/>
-      <text left_pad="5" width="200" height="28" follows="left|top" top_pad="-15" wrap="true" name="lod_status_message_text"/>
-
-      <text top_pad="-3" left="10" height="15" follows="left|top">
-        Mesh
-      </text>
-
-      <radio_group follows="top|left" height="210" left="30" name="lod_file_or_limit" width="240" value="lod_from_file">
-        <radio_item bottom="195" label="Load from file" name="lod_from_file"/>
-        <radio_item bottom="150" label="Auto generate" name="lod_auto_generate"/>
-        <radio_item bottom="0" label="None" name="lod_none"/>
-      </radio_group>
-
-      <line_editor follows="left|top" bottom_delta="-170" width="140" left="45" value="" name="lod_file" height="20"/>
-      <button bottom_delta="3" name="lod_browse" label="Browse..." left_pad="5" follows="left|top" width="70" height="25"/>
-
-      <combo_box follows="top|left" name="lod_mode" top_pad="22" width="100" left="45" height="20">
-        <combo_item name="triangle_limit">
-          Triangle Limit
-        </combo_item>
-        <combo_item name="error_threshold">
-          Error Threshold
-        </combo_item>
-      </combo_box>
-      <spinner follows="top|left" name="lod_triangle_limit" increment="10" left_pad="5" height="20" width="100" decimal_digits="0" enabled="true"/>
-      <spinner left_delta="0" bottom_delta="0" increment="0.01"  follows="top|left" name="lod_error_threshold" min_val="0" max_val="100" height="20" width="100" decimal_digits="3" visible="false" enabled="true"/>
-
-      <text follows="top|left" name="build_operator_text" left="45" top_pad="10" width="100" height="15">
-        Build Operator:  
-      </text>
-      <text follows="top|left" name="queue_mode_text" left_pad="5" width="100" height="15">
-        Queue Mode:
-      </text>
-      <combo_box follows="top|left" name="build_operator" top_pad="5" left="45" width="100" height="20">
-        <combo_item name="edge_collapse">
-          Edge Collapse
-        </combo_item>
-        <combo_item name="half_edge_collapse">
-          Half Edge Collapse
-        </combo_item>
-      </combo_box>
-
-      <combo_box follows="top|left" name="queue_mode" left_pad="5" width="100" height="20">
-        <combo_item name="greedy">
-          Greedy
-        </combo_item>
-        <combo_item name="lazy">
-          Lazy
-        </combo_item>
-        <combo_item name="independent">
-          Independent
-        </combo_item>
-      </combo_box>
-
-      <text top_pad="10" name="border_mode_text" left="45" follows="left|top" width="100" height="15">
-        Border Mode:
-      </text>
-
-      <text left_pad="5" name="share_tolderance_text"  follows="left|top" width="100" height="15">
-        Share Tolerance:
-      </text>
-
-      <combo_box follows="left|top" left="45" height="20" name="border_mode" width="100">
-        <combo_item name="border_unlock">
-          Unlock
-        </combo_item>
-        <combo_item name="border_lock">
-          Lock
-        </combo_item>
-      </combo_box>
-      <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" decimal_digits="5" initial_value="0.00001" height="20"/>
-             
-      <text left="10" top_pad="35" follows="top|left" width="240" height="15">
-        Generate Normals
-      </text>
-      <text left="35" top_pad="5" follows="top|left" width="100" height="15">
-        Crease Angle:
-      </text>
-      <spinner follows="top|left" left_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/>  
-    </panel>
-
-    <!--  PANEL -->
-    <panel
-      border="true"
-      label="Physics"
-      name="physics_panel">
-
-      <!-- PHYSICS GEOMETRY-->
-      <panel
-        follows="top|left"
-        name="physics geometry"
-        left="0"
-        top="0"
-        width="300"
-        height="65"
-        visible="true"
-        border="true"
-        bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
-
-        <radio_group follows="top|left" top="10" width="240" height="40" name="physics_load_radio" value="physics_load_from_file">
-          <radio_item bottom="0" name="physics_load_from_file" label="File:"/>
-          <radio_item bottom="23" name="physics_use_lod" label="Use Level of Detail:"/>
-        </radio_group>
-
-        <combo_box left="180" top="10" follows="left|top" height="18"
-	        name="physics_lod_combo" width="110" tool_tip="LOD to use for physics shape">
-          <combo_item name="physics_lowest">
-            Lowest
-          </combo_item>
-          <combo_item name="physics_low">
-            Low
-          </combo_item>
-          <combo_item name="physics_medium">
-            Medium
-          </combo_item>
-          <combo_item name="physics_high">
-            High
-          </combo_item>
-        </combo_box>
-
-        <line_editor follows="left|top" top_pad="5" width="140" left="60" value="" name="physics_file" height="20"/>
-        <button left_pad="10" name="physics_browse" label="Browse..." follows="left|top" width="70" height="20"/>
-
-        <!--
-        <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/>
-        <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/>
-        -->
-     </panel>
-
-
-      <!-- PHYSICS ANALYSIS-->
-      <panel
-       follows="top|left"
-       name="physics analysis"
-       top_pad="0"
-       left="0"
-       width="300"
-       height="130"
-       visible="true"
-       border="true"
-       bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
-
-        <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
-          Step 1: Analysis
-        </text>
-        
-        <text top_pad="5" width="50" follows="top|left" height="15">
-          Method:
-        </text>
-        <combo_box name="Method" follows="top|left" left_pad="5" bottom_delta="2" height="20" width="80"/>
-        <text left="160" bottom_delta="-2" width="50" follows="top|left" height="15">
-          Quality:
-        </text>
-        <combo_box name="Decompose Quality" bottom_delta="2" follows="top|left" left_pad="5" height="20" width="80"/>
-
-        <slider name="Smooth" left="10" width="280" follows="top|left" top_pad="10" height="20" label="Smooth:"/>
-
-        <check_box name="Close Holes (Slow)" follows="top|left" top_pad="10" height="15" label="Close Holes (slow)"/>
-                
-        <button left="200" bottom_delta="0" width="90" follows="top|left" label="Analyze" name="Decompose" height="20"/>
-        <button left="200" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="decompose_cancel" visble="false" height="20"/>
-      </panel>
-      
-
-      <!-- PHYSICS SIMPLIFICATION -->
-     <panel
-       follows="top|left"
-       name="physics simplification"
-       left="0"
-       top_pad="0"
-       width="300"
-       height="150"
-       visible="true"
-       border="true"
-       bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
-
-        <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
-          Step 2: Simplification
-        </text>
-
-        <text left="10" top_pad="5" height="15" width="140" follows="top|left">
-          Method:
-        </text>
-        
-        <combo_box left_pad="5" height="20" width="120" follows="top|left" name="Simplify Method"/>
-
-        <slider left="10" name="Combine Quality" label="Passes:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
-        <slider name="Detail Scale" label="Detail Scale:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
-        <slider name="Retain%" label="Retain:" label_width="120" width="270" follows="top|left" bottom_delta="0" left_delta="0" visible="false" height="20"/>
-        <button left="190" width="90" follows="top|left" label="Simplify" name="Simplify" height="20"/>
-        <button left="190" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="simplify_cancel" height="20"/>
-        
-      </panel>
-
-      <!-- INFO PANEL -->
-      <panel
-        left="0"
-        top_pad="0"
-        width="300"
-        height="100"
-        follows="left|top"
-        name="physics info"
-        visible="true"
-        border="true" 
-        bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
-
-        <slider name="physics_explode" follows="top|left" top="10" left="10" label="Preview Spread:" min_val="0.0" max_val="3.0" height="20" width="280"/>
-        
-        <text follows="top|left" name="physics_triangles" top_pad="10" height="15" left="10">
-          Triangles: [TRIANGLES]
-        </text>
-        <text follows="top|left" name="physics_points" top_pad="5" height="15">
-          Vertices: [POINTS]
-        </text>
-        <text follows="top|left" name="physics_hulls" top_pad="5" height="15">
-          Hulls: [HULLS]
-        </text>
-
-
-      </panel>
-    </panel>
-
-    <!-- MODIFIERS PANEL -->
-    <panel
-      border="true"
-      label="Modifiers"
-      name="modifiers_panel">
-      <text left="10" width="90" bottom="30" follows="top|left" height="15">
-        Scale:
-      </text>
-      <text left_pad="5" width="140" follows="top|left" height="15">
-        Dimensions:
-      </text>
-
-      <spinner left="10" height="20" follows="top|left" width="80" top_pad="5" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
-
-      <text left_pad="20" height="15" name="import_dimensions" follows="top|left">
-        [X] x [Y] x [Z] m
-      </text>
-
-      <text left="10" top_pad="20" follows="top|left" height="15">
-        Include:
-      </text>
-
-      <check_box top_pad="5" name="upload_textures" height="15" follows="top|left" label="Textures"/>
-      <check_box top_pad="5" name="upload_skin" height="15" follows="top|left" label="Skin weight"/>
-      <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/>
-
-      <text left="10" top_pad="4" width="90" bottom="30" follows="top|left" height="15">
-        Pelvis Z Offset:
-      </text>
-
-      <spinner left="10" top_pad="4" height="20" follows="top|left" width="80" value="0.0" min_val="-3.00" max_val="3.0" name="pelvis_offset"/>
-
-    </panel>
-  </tab_container>
-  
-  <!--
-  <button bottom_delta="0" left="10" width="120" name="auto fill" label="Generate LOD" tool_tip="Automatically generate levels of detail"/>
-  <button bottom_delta="0" left="140" width="120" name="smooth normals" label="Generate Normals" tool_tip="Regenerate normals based on mesh shape"/>
-  <button bottom_delta="0" left="260" width="120" name="consolidate" label="Consolidate" tool_tip="Combine similar submeshes (reduces number of submeshes)"/>
-  <button bottom_delta="30" left="260" width="120" name="scrub materials" label="Scrub Materials" tool_tip="Remove all material information (clear textures, set all colors to white)."/>
-  
-  <spinner bottom_delta="0" left="140" width="120" height="16" initial_value="75" label_width="60" name="edge threshold" decimal_digits="0" min_val="0" max_val="180" increment="5" label="Hard Angle" tool_tip="Maximum angle that will be smoothed between triangles when using Generate Normals"/>
-
-  <text bottom_delta="30" follows="top|left" height="15" left="10" name="high_lod_label">
-    High LOD:
-  </text>
-  <combo_box bottom_delta="0" left="97" follows="left|top" height="18" 
-             name="high detail combo" width="100" tool_tip="Specify mesh for this level of detail">
-    <combo_item name="high none" value="none">
-      None
-    </combo_item>
-    <combo_item name="high choose file" value="file">
-      Choose File...
-    </combo_item>
-    <combo_item name="high triangle limit" value="limit">
-      Triangle Limit
-    </combo_item>
-  </combo_box>
-  <spinner bottom_delta="-5" left="200" width="120"  name="high limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
-  <text bottom_delta="25" follows="top|left" height="15" left="10" name="high info" width="300">
-    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.  
-    [MESSAGE]
-  </text>
-
-  <text bottom_delta="35" follows="top|left" height="15" left="10" name="medium_lod_label">
-    Medium LOD:
-  </text>
-  <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
-             name="medium detail combo" width="100" tool_tip="Specify mesh for this level of detail">
-    <combo_item name="medium none" value="none">
-      None
-    </combo_item>
-    <combo_item name="medium choose file" value="file">
-      Choose File...
-    </combo_item>
-    <combo_item name="medium triangle limit" value="limit">
-      Triangle Limit
-    </combo_item>
-  </combo_box>
-  <spinner bottom_delta="-5" left="200" width="120"  name="medium limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
-  <text bottom_delta="25" follows="top|left" height="15" left="10" name="medium info" width="300">
-    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.  
-    [MESSAGE]
-  </text>
-
-  <text bottom_delta="35" follows="top|left" height="15" left="10" name="low_lod_label">
-    Low LOD:
-  </text>
-  <combo_box bottom_delta="0" left="97" follows="left|top" height="18" 
-             name="low detail combo" width="100" tool_tip="Specify mesh for this level of detail">
-    <combo_item name="low none" value="none">
-      None
-    </combo_item>
-    <combo_item name="low choose file" value="file">
-      Choose File...
-    </combo_item>
-    <combo_item name="low triangle limit" value="limit">
-      Triangle Limit
-    </combo_item>
-  </combo_box>
-  <spinner bottom_delta="-5" left="200" width="120"  name="low limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
-  <text bottom_delta="25" follows="top|left" height="15" left="10" name="low info" width="300">
-    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
-    [MESSAGE]
-  </text>
-
-  <text bottom_delta="35" follows="top|left" height="15" left="10" name="lowest_lod_label">
-    Lowest LOD:
-  </text>
-  <combo_box bottom_delta="0" left="97" follows="left|top" height="18" 
-             name="lowest detail combo" width="100" tool_tip="Specify mesh for this level of detail">
-    <combo_item name="lowest none" value="none">
-      None
-    </combo_item>
-    <combo_item name="lowest choose file" value="file">
-      Choose File...
-    </combo_item>
-    <combo_item name="lowest triangle limit" value="limit">
-      Triangle Limit
-    </combo_item>
-  </combo_box>
-  <spinner bottom_delta="-5" left="200" width="120"  name="lowest limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
-  <text bottom_delta="25" follows="top|left" height="15" left="10" name="lowest info" width="300">
-    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
-    [MESSAGE]
-  </text>
-
-  <text bottom_delta="35" follows="top|left" height="15" left="10" name="physics_lod_label">
-    Physical Shape:
-  </text>
-  <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
-             name="physics detail combo" width="100">
-    <combo_item name="physics none" value="none">
-      None
-    </combo_item>
-    <combo_item name="physics choose file" value="file">
-      Choose File...
-    </combo_item>
-    <combo_item name="physics triangle limit" value="limit">
-      Triangle Limit...
-    </combo_item>
-  </combo_box>
-  <spinner bottom_delta="-5" left="200" width="90"  name="physics limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
-  <button bottom_delta="0" left="290" width="30" follows="left|top" height="20" label=">>" 
-          name="decompose_btn" tool_tip="Create convex decomposition."/>
-  <text bottom_delta="25" follows="top|left" height="15" left="10" name="physics info" width="300">
-    [TRIANGLES] Triangles, [HULLS] Hulls, [POINTS] Points
-  </text>
-
-  <text bottom_delta="25" follows="top|left" height="15" left="10" name="include label" width="300">
-    Include:
-  </text>
-
-  <check_box bottom_delta="20" follow="bottom|left" height="20" label="Textures"
-             left="15" width="125" name="upload_textures" tool_tip="Upload associated textures "/>
-
-  <check_box bottom_delta="20" follow="bottom|left" height="20" label="Skin Weights"
-             left="15" width="125" name="upload_skin" tool_tip="Upload vertex skin weighting information."/>
-
-  <check_box bottom_delta="20" follow="bottom|left" height="20" label="Joint Positions"
-             left="15" width="125" name="upload_joints" tool_tip="Upload joint position information (will override avatar joint positions when mesh is worn)."/>
-
-  
-	<button bottom_delta="25" follows="bottom|left" height="20" label="Upload"
-	     left="15" name="ok_btn" width="125" tool_tip="Upload to simulator"/>
-
-  <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="description_label" text_color="1 0.82 0.46 1">
-	  (No charge for upload during First Look)
-	</text>
-  <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="upload_message">
-    [MESSAGE]
-  </text>
-  
-  <spinner bottom_delta="20" label="Scale" left="15" width="120"  name="debug scale" decimal_digits="3" increment="0.1" min_val="0" max_val="64" initial_value="1" tool_tip="Multiplier for incoming object scale.  If incoming dimensions are very small or very large, modify this value to get dimensions into an acceptable range."/>
-  <text bottom_delta="30" left="15" width="280" follows="top|left" height="15" name="dimensions">
-    Model Dimensions: [X]m x [Y]m x [Z]m
-  </text>
-  -->
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater can_close="true" can_drag_on_left="false" can_minimize="false"
+     can_resize="true" height="550" min_height="550" min_width="620"
+     name="Model Preview" title="Upload Model" width="620">
+
+  <string name="status_idle">Idle</string>
+  <string name="status_reading_file">Loading...</string>
+  <string name="status_generating_meshes">Generating Meshes...</string>
+  <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
+  <string name="high">High</string>
+  <string name="medium">Medium</string>
+  <string name="low">Low</string>
+  <string name="lowest">Lowest</string>
+  <string name="mesh_status_good">Ship it!</string>
+  <string name="mesh_status_na">N/A</string>
+  <string name="mesh_status_none">None</string>
+  <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
+  <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
+  <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
+  <string name="mesh_status_missing_lod">Missing required level of detail.</string>
+  <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" -->
+  <string name="decomposing">Analyzing...</string>
+  <string name="simplifying">Simplifying...</string>
+  
+
+  <text left="15" bottom="25" follows="top|left" height="15" name="name_label">
+    Name:
+  </text>
+  <line_editor bottom_delta="20" follows="top|left|right" height="19" max_length_bytes="64" 
+	     name="description_form" prevalidate_callback="ascii" width="290" />
+  
+  <text bottom_delta="20" left="15" follows="left|top" height="15" name="lod_label">
+    Preview:
+  </text>
+  <combo_box bottom_delta="20" follows="left|top" height="18"
+	     name="preview_lod_combo" width="240" tool_tip="LOD to view in preview render">
+    <combo_item name="high">
+      Level of Detail: High
+    </combo_item>
+    <combo_item name="medium">
+      Level of Detail: Medium
+    </combo_item>
+    <combo_item name="low">
+      Level of Detail: Low
+    </combo_item>
+    <combo_item name="lowest">
+      Level of Detail: Lowest
+    </combo_item>
+  </combo_box>
+
+    <menu_button follows="top|left" 
+         image_hover_unselected="Toolbar_Left_Over"
+         image_overlay="OptionsMenu_Off"
+         image_selected="Toolbar_Left_Selected"
+         image_unselected="Toolbar_Left_Off"
+         layout="topleft"
+         left_pad="5"
+         name="options_gear_btn"
+         width="31"
+         height="25"/>
+  <!-- Placeholder panel for 3D preview render -->
+  <panel
+    name="preview_panel"
+    left="15"
+    bevel_style="none"
+    border_style="line"
+    border="true"
+    width="290"
+    height="290"
+    follows="all"/>
+
+  <text bottom_delta="25" left="25" width="100" follows="bottom|left">Upload Details</text>
+  <panel top_pad="5" border="true" left="15" width="290" height="70" follows="bottom|left"
+          bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+    <text left="25" follows="bottom|left" width="140" height="15" name="streaming cost">
+      Resource Cost: [COST]
+    </text>
+    <text left="25" top_pad="5" width="140" follows="bottom|left" height="15" name="physics cost">
+      Physics Cost: [COST]
+    </text>
+    <text left="25" top_pad="5" follows="bottom|left" height="15" name="upload fee">
+      Upload Fee: N/A
+    </text>
+  </panel>
+
+  <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text>
+
+  
+  <button bottom="540" left="300"  follows="bottom|right" height="20" label="Defaults"
+	     width="80" name="reset_btn" tool_tip="Reset to defaults"/>
+  <button bottom="540" left="430"  follows="bottom|right" height="20" label="Upload"
+	     width="80" name="ok_btn" tool_tip="Upload to simulator"/>
+  <button left_pad="10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/>
+
+  <tab_container
+    follows="right|top|bottom"
+    top="15"
+    left="310"
+    height="470"
+    width="300"
+    name="import_tab"
+    border="true"
+    tab_position="top">
+
+    <!-- LOD PANEL -->
+    <panel
+      border="true"
+      label="Level of Detail"
+      name="lod_panel">
+
+      <text left="10" width="240" bottom="20" height="15" follows="left|top" name="lod_table_header">
+        Select Level of Detail:
+      </text>
+     
+      <text valign="center" halign="center" bg_visible="true" bottom_delta="16" left="75" width="65" height="18" follows="left|top" value="Triangles"/>
+      <text valign="center" halign="center" bg_visible="true" left_pad="0" width="65" height="18" follows="left|top" value="Vertices"/>
+      <text valign="center" halign="center" left_pad="0" width="65" bg_visible="true" height="18" follows="left|top" value="Status"/>
+      
+      <text valign="center" halign="center" bg_visible="true" name="high_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="High"/>
+      <text valign="center" halign="center" bg_visible="true" name="high_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="high_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="high_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_high" left_delta="20" top_delta="0" />
+
+      <text valign="center" halign="center" bg_visible="true" name="medium_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Medium"/>
+      <text valign="center" halign="center" bg_visible="true" name="medium_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="medium_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="medium_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_medium" left_delta="20" top_delta="0" />
+
+      <text valign="center" halign="center" bg_visible="true" name="low_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Low"/>
+      <text valign="center" halign="center" bg_visible="true" name="low_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="low_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="low_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_low" left_delta="20" top_delta="0" />
+
+      <text valign="center" halign="center" bg_visible="true" name="lowest_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Lowest"/>
+      <text valign="center" halign="center" bg_visible="true" name="lowest_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="lowest_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/>
+      <text valign="center" halign="center" bg_visible="true" name="lowest_status" left_pad="0" width="65" height="18" follows="left|top" value=""/>
+      <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_lowest" left_delta="20" top_delta="0" />
+      
+      <text left="10" width="240" height="15" top_pad="15" follows="left|top" name="lod_table_footer">
+        Level of Detail: [DETAIL]
+      </text>
+
+      <icon height="16" width="16" left="20" follows="left|top" name="lod_status_message_icon"/>
+      <text left_pad="5" width="200" height="28" follows="left|top" top_pad="-15" wrap="true" name="lod_status_message_text"/>
+
+      <text top_pad="-3" left="10" height="15" follows="left|top">
+        Mesh
+      </text>
+
+      <radio_group follows="top|left" height="210" left="30" name="lod_file_or_limit" width="240" value="lod_from_file">
+        <radio_item bottom="195" label="Load from file" name="lod_from_file"/>
+        <radio_item bottom="150" label="Auto generate" name="lod_auto_generate"/>
+        <radio_item bottom="0" label="None" name="lod_none"/>
+      </radio_group>
+
+      <line_editor follows="left|top" bottom_delta="-170" width="140" left="45" value="" name="lod_file" height="20"/>
+      <button bottom_delta="3" name="lod_browse" label="Browse..." left_pad="5" follows="left|top" width="70" height="25"/>
+
+      <combo_box follows="top|left" name="lod_mode" top_pad="22" width="100" left="45" height="20">
+        <combo_item name="triangle_limit">
+          Triangle Limit
+        </combo_item>
+        <combo_item name="error_threshold">
+          Error Threshold
+        </combo_item>
+      </combo_box>
+      <spinner follows="top|left" name="lod_triangle_limit" increment="10" left_pad="5" height="20" width="100" decimal_digits="0" enabled="true"/>
+      <spinner left_delta="0" bottom_delta="0" increment="0.01"  follows="top|left" name="lod_error_threshold" min_val="0" max_val="100" height="20" width="100" decimal_digits="3" visible="false" enabled="true"/>
+
+      <text follows="top|left" name="build_operator_text" left="45" top_pad="10" width="100" height="15">
+        Build Operator:  
+      </text>
+      <text follows="top|left" name="queue_mode_text" left_pad="5" width="100" height="15">
+        Queue Mode:
+      </text>
+      <combo_box follows="top|left" name="build_operator" top_pad="5" left="45" width="100" height="20">
+        <combo_item name="edge_collapse">
+          Edge Collapse
+        </combo_item>
+        <combo_item name="half_edge_collapse">
+          Half Edge Collapse
+        </combo_item>
+      </combo_box>
+
+      <combo_box follows="top|left" name="queue_mode" left_pad="5" width="100" height="20">
+        <combo_item name="greedy">
+          Greedy
+        </combo_item>
+        <combo_item name="lazy">
+          Lazy
+        </combo_item>
+        <combo_item name="independent">
+          Independent
+        </combo_item>
+      </combo_box>
+
+      <text top_pad="10" name="border_mode_text" left="45" follows="left|top" width="100" height="15">
+        Border Mode:
+      </text>
+
+      <text left_pad="5" name="share_tolderance_text"  follows="left|top" width="100" height="15">
+        Share Tolerance:
+      </text>
+
+      <combo_box follows="left|top" left="45" height="20" name="border_mode" width="100">
+        <combo_item name="border_unlock">
+          Unlock
+        </combo_item>
+        <combo_item name="border_lock">
+          Lock
+        </combo_item>
+      </combo_box>
+      <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" decimal_digits="5" initial_value="0.00001" height="20"/>
+             
+      <text left="10" top_pad="35" follows="top|left" width="240" height="15">
+        Generate Normals
+      </text>
+      <text left="35" top_pad="5" follows="top|left" width="100" height="15" name="crease_label">
+        Crease Angle:
+      </text>
+      <spinner follows="top|left" left_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/>  
+    </panel>
+
+    <!--  PANEL -->
+    <panel
+      border="true"
+      label="Physics"
+      name="physics_panel">
+
+      <!-- PHYSICS GEOMETRY-->
+      <panel
+        follows="top|left"
+        name="physics geometry"
+        left="0"
+        top="0"
+        width="300"
+        height="65"
+        visible="true"
+        border="true"
+        bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+        <radio_group follows="top|left" top="10" width="240" height="40" name="physics_load_radio" value="physics_load_from_file">
+          <radio_item bottom="0" name="physics_load_from_file" label="File:"/>
+          <radio_item bottom="23" name="physics_use_lod" label="Use Level of Detail:"/>
+        </radio_group>
+
+        <combo_box left="180" top="10" follows="left|top" height="18"
+	        name="physics_lod_combo" width="110" tool_tip="LOD to use for physics shape">
+          <combo_item name="physics_lowest">
+            Lowest
+          </combo_item>
+          <combo_item name="physics_low">
+            Low
+          </combo_item>
+          <combo_item name="physics_medium">
+            Medium
+          </combo_item>
+          <combo_item name="physics_high">
+            High
+          </combo_item>
+        </combo_box>
+
+        <line_editor follows="left|top" top_pad="5" width="140" left="60" value="" name="physics_file" height="20"/>
+        <button left_pad="10" name="physics_browse" label="Browse..." follows="left|top" width="70" height="20"/>
+
+        <!--
+        <check_box name="physics_optimize" follows="left|top" width="130" left="10" top_pad="5" height="20" label="Optimize"/>
+        <check_box name="physics_use_hull" follows="left|top" width="130" left_pad="5" height="20" label="Use Convex Hull"/>
+        -->
+     </panel>
+
+
+      <!-- PHYSICS ANALYSIS-->
+      <panel
+       follows="top|left"
+       name="physics analysis"
+       top_pad="0"
+       left="0"
+       width="300"
+       height="130"
+       visible="true"
+       border="true"
+       bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+        <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
+          Step 1: Analysis
+        </text>
+        
+        <text top_pad="5" width="50" follows="top|left" height="15">
+          Method:
+        </text>
+        <combo_box name="Method" follows="top|left" left_pad="5" bottom_delta="2" height="20" width="80"/>
+        <text left="160" bottom_delta="-2" width="50" follows="top|left" height="15">
+          Quality:
+        </text>
+        <combo_box name="Decompose Quality" bottom_delta="2" follows="top|left" left_pad="5" height="20" width="80"/>
+
+        <slider name="Smooth" left="10" width="280" follows="top|left" top_pad="10" height="20" label="Smooth:"/>
+
+        <check_box name="Close Holes (Slow)" follows="top|left" top_pad="10" height="15" label="Close Holes (slow)"/>
+                
+        <button left="200" bottom_delta="0" width="90" follows="top|left" label="Analyze" name="Decompose" height="20"/>
+        <button left="200" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="decompose_cancel" visble="false" height="20"/>
+      </panel>
+      
+
+      <!-- PHYSICS SIMPLIFICATION -->
+     <panel
+       follows="top|left"
+       name="physics simplification"
+       left="0"
+       top_pad="0"
+       width="300"
+       height="150"
+       visible="true"
+       border="true"
+       bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+        <text follows="left|top" bottom="40" height="30" left="10" font="SansSerifBig">
+          Step 2: Simplification
+        </text>
+
+        <text left="10" top_pad="5" height="15" width="140" follows="top|left">
+          Method:
+        </text>
+        
+        <combo_box left_pad="5" height="20" width="120" follows="top|left" name="Simplify Method"/>
+
+        <slider left="10" name="Combine Quality" label="Passes:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
+        <slider name="Detail Scale" label="Detail Scale:" label_width="120" width="270" follows="top|left" top_pad="10" height="20"/>
+        <slider name="Retain%" label="Retain:" label_width="120" width="270" follows="top|left" bottom_delta="0" left_delta="0" visible="false" height="20"/>
+        <button left="190" width="90" follows="top|left" label="Simplify" name="Simplify" height="20"/>
+        <button left="190" bottom_delta="0" width="90" follows="top|left" label="Cancel" name="simplify_cancel" height="20"/>
+        
+      </panel>
+
+      <!-- INFO PANEL -->
+      <panel
+        left="0"
+        top_pad="0"
+        width="300"
+        height="100"
+        follows="left|top"
+        name="physics info"
+        visible="true"
+        border="true" 
+        bevel_style="none" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3">
+
+        <slider name="physics_explode" follows="top|left" top="10" left="10" label="Preview Spread:" min_val="0.0" max_val="3.0" height="20" width="280"/>
+        
+        <text follows="top|left" name="physics_triangles" top_pad="10" height="15" left="10">
+          Triangles: [TRIANGLES]
+        </text>
+        <text follows="top|left" name="physics_points" top_pad="5" height="15">
+          Vertices: [POINTS]
+        </text>
+        <text follows="top|left" name="physics_hulls" top_pad="5" height="15">
+          Hulls: [HULLS]
+        </text>
+
+
+      </panel>
+    </panel>
+
+    <!-- MODIFIERS PANEL -->
+    <panel
+      border="true"
+      label="Modifiers"
+      name="modifiers_panel">
+      <text left="10" width="90" bottom="30" follows="top|left" height="15">
+        Scale:
+      </text>
+      <text left_pad="5" width="140" follows="top|left" height="15">
+        Dimensions:
+      </text>
+
+      <spinner left="10" height="20" follows="top|left" width="80" top_pad="5" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
+
+      <text left_pad="20" height="15" name="import_dimensions" follows="top|left">
+        [X] x [Y] x [Z] m
+      </text>
+
+      <text left="10" top_pad="20" follows="top|left" height="15">
+        Include:
+      </text>
+
+      <check_box top_pad="5" name="upload_textures" height="15" follows="top|left" label="Textures"/>
+      <check_box top_pad="5" name="upload_skin" height="15" follows="top|left" label="Skin weight"/>
+      <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/>
+
+      <text left="10" top_pad="4" width="90" bottom="30" follows="top|left" height="15">
+        Pelvis Z Offset:
+      </text>
+
+      <spinner left="10" top_pad="4" height="20" follows="top|left" width="80" value="0.0" min_val="-3.00" max_val="3.0" name="pelvis_offset"/>
+
+    </panel>
+  </tab_container>
+  
+  <!--
+  <button bottom_delta="0" left="10" width="120" name="auto fill" label="Generate LOD" tool_tip="Automatically generate levels of detail"/>
+  <button bottom_delta="0" left="140" width="120" name="smooth normals" label="Generate Normals" tool_tip="Regenerate normals based on mesh shape"/>
+  <button bottom_delta="0" left="260" width="120" name="consolidate" label="Consolidate" tool_tip="Combine similar submeshes (reduces number of submeshes)"/>
+  <button bottom_delta="30" left="260" width="120" name="scrub materials" label="Scrub Materials" tool_tip="Remove all material information (clear textures, set all colors to white)."/>
+  
+  <spinner bottom_delta="0" left="140" width="120" height="16" initial_value="75" label_width="60" name="edge threshold" decimal_digits="0" min_val="0" max_val="180" increment="5" label="Hard Angle" tool_tip="Maximum angle that will be smoothed between triangles when using Generate Normals"/>
+
+  <text bottom_delta="30" follows="top|left" height="15" left="10" name="high_lod_label">
+    High LOD:
+  </text>
+  <combo_box bottom_delta="0" left="97" follows="left|top" height="18" 
+             name="high detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+    <combo_item name="high none" value="none">
+      None
+    </combo_item>
+    <combo_item name="high choose file" value="file">
+      Choose File...
+    </combo_item>
+    <combo_item name="high triangle limit" value="limit">
+      Triangle Limit
+    </combo_item>
+  </combo_box>
+  <spinner bottom_delta="-5" left="200" width="120"  name="high limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+  <text bottom_delta="25" follows="top|left" height="15" left="10" name="high info" width="300">
+    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.  
+    [MESSAGE]
+  </text>
+
+  <text bottom_delta="35" follows="top|left" height="15" left="10" name="medium_lod_label">
+    Medium LOD:
+  </text>
+  <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+             name="medium detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+    <combo_item name="medium none" value="none">
+      None
+    </combo_item>
+    <combo_item name="medium choose file" value="file">
+      Choose File...
+    </combo_item>
+    <combo_item name="medium triangle limit" value="limit">
+      Triangle Limit
+    </combo_item>
+  </combo_box>
+  <spinner bottom_delta="-5" left="200" width="120"  name="medium limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+  <text bottom_delta="25" follows="top|left" height="15" left="10" name="medium info" width="300">
+    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes.  
+    [MESSAGE]
+  </text>
+
+  <text bottom_delta="35" follows="top|left" height="15" left="10" name="low_lod_label">
+    Low LOD:
+  </text>
+  <combo_box bottom_delta="0" left="97" follows="left|top" height="18" 
+             name="low detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+    <combo_item name="low none" value="none">
+      None
+    </combo_item>
+    <combo_item name="low choose file" value="file">
+      Choose File...
+    </combo_item>
+    <combo_item name="low triangle limit" value="limit">
+      Triangle Limit
+    </combo_item>
+  </combo_box>
+  <spinner bottom_delta="-5" left="200" width="120"  name="low limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+  <text bottom_delta="25" follows="top|left" height="15" left="10" name="low info" width="300">
+    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
+    [MESSAGE]
+  </text>
+
+  <text bottom_delta="35" follows="top|left" height="15" left="10" name="lowest_lod_label">
+    Lowest LOD:
+  </text>
+  <combo_box bottom_delta="0" left="97" follows="left|top" height="18" 
+             name="lowest detail combo" width="100" tool_tip="Specify mesh for this level of detail">
+    <combo_item name="lowest none" value="none">
+      None
+    </combo_item>
+    <combo_item name="lowest choose file" value="file">
+      Choose File...
+    </combo_item>
+    <combo_item name="lowest triangle limit" value="limit">
+      Triangle Limit
+    </combo_item>
+  </combo_box>
+  <spinner bottom_delta="-5" left="200" width="120"  name="lowest limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+  <text bottom_delta="25" follows="top|left" height="15" left="10" name="lowest info" width="300">
+    [TRIANGLES] Triangles, [VERTICES] Vertices, [SUBMESHES] Submeshes
+    [MESSAGE]
+  </text>
+
+  <text bottom_delta="35" follows="top|left" height="15" left="10" name="physics_lod_label">
+    Physical Shape:
+  </text>
+  <combo_box bottom_delta="0" left="97" follows="left|top" height="18"
+             name="physics detail combo" width="100">
+    <combo_item name="physics none" value="none">
+      None
+    </combo_item>
+    <combo_item name="physics choose file" value="file">
+      Choose File...
+    </combo_item>
+    <combo_item name="physics triangle limit" value="limit">
+      Triangle Limit...
+    </combo_item>
+  </combo_box>
+  <spinner bottom_delta="-5" left="200" width="90"  name="physics limit" decimal_digits="0" increment="1" min_val="0" max_val="100" tool_tip="Triangle budget for this LOD"/>
+  <button bottom_delta="0" left="290" width="30" follows="left|top" height="20" label=">>" 
+          name="decompose_btn" tool_tip="Create convex decomposition."/>
+  <text bottom_delta="25" follows="top|left" height="15" left="10" name="physics info" width="300">
+    [TRIANGLES] Triangles, [HULLS] Hulls, [POINTS] Points
+  </text>
+
+  <text bottom_delta="25" follows="top|left" height="15" left="10" name="include label" width="300">
+    Include:
+  </text>
+
+  <check_box bottom_delta="20" follow="bottom|left" height="20" label="Textures"
+             left="15" width="125" name="upload_textures" tool_tip="Upload associated textures "/>
+
+  <check_box bottom_delta="20" follow="bottom|left" height="20" label="Skin Weights"
+             left="15" width="125" name="upload_skin" tool_tip="Upload vertex skin weighting information."/>
+
+  <check_box bottom_delta="20" follow="bottom|left" height="20" label="Joint Positions"
+             left="15" width="125" name="upload_joints" tool_tip="Upload joint position information (will override avatar joint positions when mesh is worn)."/>
+
+  
+	<button bottom_delta="25" follows="bottom|left" height="20" label="Upload"
+	     left="15" name="ok_btn" width="125" tool_tip="Upload to simulator"/>
+
+  <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="description_label" text_color="1 0.82 0.46 1">
+	  (No charge for upload during First Look)
+	</text>
+  <text bottom_delta="20" left="15" width="280" follows="top|left" height="15" name="upload_message">
+    [MESSAGE]
+  </text>
+  
+  <spinner bottom_delta="20" label="Scale" left="15" width="120"  name="debug scale" decimal_digits="3" increment="0.1" min_val="0" max_val="64" initial_value="1" tool_tip="Multiplier for incoming object scale.  If incoming dimensions are very small or very large, modify this value to get dimensions into an acceptable range."/>
+  <text bottom_delta="30" left="15" width="280" follows="top|left" height="15" name="dimensions">
+    Model Dimensions: [X]m x [Y]m x [Z]m
+  </text>
+  -->
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
index fa4c56ffeca679ede14ca041c0bc46a0fdd92632..6c0fffa60e7b6dbf17acc9fb84c09541589ee986 100644
--- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
@@ -1,1038 +1,1039 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- layout="topleft"
- name="Model Wizard"
- help_topic="model_wizard"
- bg_opaque_image_overlay="0.5 0.5 0.5 1"
- height="480"
- save_rect="true"
- title="UPLOAD MODEL WIZARD"
- width="535">
-	<button
-	 top="32"
-	 tab_stop="false"
-	 left="410"
-	 height="32"
-	 name="upload_btn"
-	 enabled="false"
-	 label="5. Upload"
-	 border="false"
-	 image_unselected="BreadCrumbBtn_Right_Off"
-	 image_selected="BreadCrumbBtn_Right_Press"
-	 image_hover_unselected="BreadCrumbBtn_Right_Over"
-	 image_disabled="BreadCrumbBtn_Right_Disabled"
-	 image_disabled_selected="BreadCrumbBtn_Right_Disabled"
-	 width="110">
-		<button.commit_callback
-		function="Wizard.Upload"/>
-	</button>
-	<button
-	 top="32"
-	 left="310"
-	 height="32"
-	 tab_stop="false"
-	 name="review_btn"
-	 label="4. Review"
-	 enabled="false"
-	 border="false"
-	 image_unselected="BreadCrumbBtn_Middle_Off"
-	 image_selected="BreadCrumbBtn_Middle_Press"
-	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
-	 image_disabled="BreadCrumbBtn_Middle_Disabled"
-	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
-	 width="110">
-		<button.commit_callback
-		function="Wizard.Review"/>
-	</button>
-	<button
-	 top="32"
-	 left="210"
-	 height="32"
-	 name="physics2_btn"
-	 label="3. Physics"
-	 tab_stop="false"
-	 enabled="false"
-	 border="false"
-	 image_unselected="BreadCrumbBtn_Middle_Off"
-	 image_selected="BreadCrumbBtn_Middle_Press"
-	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
-	 image_disabled="BreadCrumbBtn_Middle_Disabled"
-	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
-	 width="110">
-		<button.commit_callback
-		function="Wizard.Physics2"/>
-	</button>
-	<button
-	 top="32"
-	 left="210"
-	 height="32"
-	 name="physics_btn"
-	 label="3. Physics"
-	 tab_stop="false"
-	 enabled="false"
-	 border="false"
-	 image_unselected="BreadCrumbBtn_Middle_Off"
-	 image_selected="BreadCrumbBtn_Middle_Press"
-	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
-	 image_disabled="BreadCrumbBtn_Middle_Disabled"
-	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
-	 width="110">
-		<button.commit_callback
-		function="Wizard.Physics"/>
-	</button>
-	<button
-	 top="32"
-	 left="115"
-	 name="optimize_btn"
-	 label="2. Optimize"
-	 tab_stop="false"
-	 height="32"
-	 border="false"
-	 image_unselected="BreadCrumbBtn_Middle_Off"
-	 image_selected="BreadCrumbBtn_Middle_Press"
-	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
-	 image_disabled="BreadCrumbBtn_Middle_Disabled"
-	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
-	 width="110">
-		<button.commit_callback
-		function="Wizard.Optimize"/>
-	</button>
-	<button
-	 top="32"
-	 left="15"
-	 name="choose_file_btn"
-	 tab_stop="false"
-	 enabled="false"
-	 label="1. Choose File"
-	 height="32"
-	 image_unselected="BreadCrumbBtn_Left_Off"
-	 image_selected="BreadCrumbBtn_Left_Press"
-	 image_hover_unselected="BreadCrumbBtn_Left_Over"
-	 image_disabled="BreadCrumbBtn_Left_Disabled"
-	 image_disabled_selected="BreadCrumbBtn_Left_Disabled"
-	 width="110">
-		<button.commit_callback
-		function="Wizard.Choose"/>
-	</button>
-	<panel
-		 height="388"
-		 top_pad="0"
-		 name="choose_file_panel"
-		 visible="false"
-		 width="535"
-		 left="0">
-		<panel
-		 height="22"
-		 top_pad="15"
-		 width="505"
-		 name="header_panel"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true"
-		 left="15">
-			<text
-			 width="200"
-			 left="10"
-			 top="3"
-			 name="header_text"
-			 text_color="White"
-			 height="10"
-			 font="SansSerifBig"
-			 layout="topleft">
-				Upload Model
-			</text>
-		</panel>
-		<text
-		 top_pad="14"
-		 width="460"
-		 height="20"
-		 name="description"
-		 font="SansSerifSmall"
-		 layout="topleft"
-		 word_wrap="true"
-		 left_delta="5">
-			This wizard will help you import mesh models to Second Life.  First specify a file containing the model you wish to import.  Second Life supports COLLADA (.dae) files.
-		</text>
-		<panel
-		 top_delta="40"
-		 left="15"
-		 height="270"
-		 width="505"
-		 name="content"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true">
-			<text
-			 type="string"
-			 length="1"
-			 text_color="White" 
-			 follows="left|top"
-			 top="10"
-			 height="10"
-			 layout="topleft"
-			 left_delta="10"
-			 name="Cache location"
-			 width="300">
-				Filename:
-			</text>
-			<line_editor
-			 border_style="line"
-			 border_thickness="1"
-			 follows="left|top"
-			 font="SansSerifSmall"
-			 height="20"
-			 layout="topleft"
-			 left_delta="0"
-			 max_length="4096"
-			 name="lod_file"
-			 top_pad="5"
-			 width="220" />
-			<button
-			 follows="left|top"
-			 height="23"
-			 label="Browse..."
-			 label_selected="Browse..."
-			 layout="topleft"
-			 left_pad="5"
-			 name="browse"
-			 top_delta="-1"
-			 width="85">
-			</button>
-			<text
-			 top_delta="-15"
-			 width="200"
-			 height="15"
-			 font="SansSerifSmall"
-			 layout="topleft"
-			 text_color="White"
-			 left_pad="19">
-				Model Preview:
-			</text>
-			<!-- Placeholder panel for 3D preview render -->
-			<panel
-			 left_delta="0"
-			 top_pad="0"
-			 name="preview_panel"
-			 bevel_style="none"
-			 highlight_light_color="0.09 0.09 0.09 1"
-			 border="true"
-			 height="150"
-			 follows="all"
-			 width="150">
-			</panel>
-			<text
-			 top_pad="10"
-			 width="130"
-			 height="14"
-			 left="340"
-			 text_color="White"
-			 word_wrap="true">
-				Dimensions (meters):
-			</text>
-			<text
-			 top_pad="0"
-			 width="160"
-			 height="15"
-			 font="SansSerifSmallBold" 
-			 text_color="White"
-			 name="dimensions"
-			 left_delta="0">
-				X:         Y:         Z: 
-			</text>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_dividers"
-			 left_delta="41">
-				 |               |   
-			</text>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_x"
-			 left="356"/>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_y"
-			 left="403"/>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_z"
-			 left="450"/>
-			<text
-			 top="100"
-			 width="320"
-			 height="15"
-			 left="10"
-			 text_color="White" 
-			 word_wrap="true">
-				Note:
-			</text>
-			<text
-			 top_pad="0"
-			 width="320"
-			 height="40"
-			 left="10"
-			 word_wrap="true">
-Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] .
-			</text>
-		</panel>
-	</panel>
-
-
-	<panel
-		 height="388"
-		 top_delta="0"
-		 name="optimize_panel"
-		 visible="false"
-		 width="535"
-		 left="0">
-		<panel
-		 height="22"
-		 top_pad="15"
-		 name="header_panel"
-		 width="505"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true"
-		 left="15">
-			<text
-			 width="200"
-			 left="10"
-			 name="header_text"
-			 top="3"
-			 text_color="White"
-			 height="10"
-			 font="SansSerifBig"
-			 layout="topleft">
-				Optimize
-			</text>
-		</panel>
-		<text
-		 top_pad="14"
-		 width="460"
-		 height="20"
-		 font="SansSerifSmall"
-		 layout="topleft"
-		 name="description"
-		 word_wrap="true"
-		 left_delta="5">
-			This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue.
-		</text>
-		<panel
-		 top_delta="40"
-		 visible="false"
-		 left="15"
-		 height="270"
-		 width="505"
-		 name="content"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true">
-			<text
-			 top="20"
-			 width="300"
-			 height="12"
-			 font="SansSerifBold"
-			 left="112">Generating Level of Detail</text>
-			<progress_bar
-			  name="optimize_progress_bar"
-              image_fill="model_wizard\progress_light.png"
-			  color_bg="1 1 1 1"
-			  color_bar="1 1 1 0.96"
-			  follows="left|right|top"
-			  width="260"
-			  height="16"
-			  image_bar="model_wizard\progress_bar_bg.png"
-			  top_pad="14"
-			  left="110"/>
-			<icon
-			 top_pad="10"
-			 left_delta="0"
-			 width="13"
-			 height="12"
-			 image_name="model_wizard\check_mark.png"/>
-			<text
-			 top_delta="0"
-			 left_delta="18"
-			 name="high_detail_text"
-			 width="200"
-			 height="14">Generate Level of Detail: High</text>
-			<icon
-			 top_pad="10"
-			 left_delta="-18"
-			 width="13"
-			 height="12"
-			 image_name="model_wizard\check_mark.png"/>
-			<text
-			 top_delta="0"
-			 left_delta="18"
-			 name="medium_detail_text"
-			 width="200"
-			 height="14">Generate Level of Detail: Medium</text>
-			<icon
-			 top_pad="10"
-			 left_delta="-18"
-			 width="13"
-			 height="12"
-			 image_name="model_wizard\check_mark.png"/>
-			<text
-			 top_delta="0"
-			 left_delta="18"
-			 name="low_detail_text"
-			 width="200"
-			 height="14">Generate Level of Detail: Low</text>
-			<icon
-			 top_pad="10"
-			 left_delta="-18"
-			 width="13"
-			 height="12"
-			 image_name="model_wizard\check_mark.png"/>
-			<text
-			 top_delta="0"
-			 left_delta="18"
-			 name="lowest_detail_text"
-			 width="200"
-			 height="14">Generate Level of Detail: Lowest</text>
-		</panel>
-		<panel
-				 top_delta="0"
-				 left_delta="0"
-				 height="270"
-				 width="505"
-				 name="content2"
-				 bg_opaque_color="DkGray2"
-				 background_visible="true"
-				 background_opaque="true">
-			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
-				Model Preview:
-			</text>
-			<combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
-	     name="preview_lod_combo2" width="90" tool_tip="LOD to view in preview render">
-				<combo_item name="high">
-					High
-				</combo_item>
-				<combo_item name="medium">
-					Medium
-				</combo_item>
-				<combo_item name="low">
-					Low
-				</combo_item>
-				<combo_item name="lowest">
-					Lowest
-				</combo_item>
-			</combo_box>
-			<panel
-				 left="10"
-				 top_pad="5"
-				 name="preview_panel"
-				 bevel_style="none"
-				 highlight_light_color="0.09 0.09 0.09 1"
-				 border_style="line"
-				 border="true"
-				 height="185"
-				 follows="all"
-				 width="185">
-			</panel>
-			<text top="45" left="214" text_color="White" font="SansSerifSmallBold" halign="center" width="110" height="30" wrap="true">Higher Performance</text>
-			<text top="75" left="204" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
-			<text top="45" left="378" text_color="White" font="SansSerifSmallBold" halign="center" width="90" height="30" wrap="true">Higher Accuracy</text>
-			<text top="75" left="364" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
-
-			<slider
-		   follows="left|top"
-		   height="20"
-		   increment="0.5"
-		   layout="topleft"
-		   left="204"
-		   max_val="4"
-		   initial_value="3"
-		   min_val="2"
-		   name="accuracy_slider"
-		   show_text="false"
-		   top="130"
-		   width="290" />
-			<text 
-			font="SansSerifSmall" 
-			top_pad="0"  
-			width="300" 
-			left_delta="6" 
-			height="4">'                                             '                                             '</text>
-
-
-			<icon
-				 top_pad="14"
-				 left_delta="0"
-				 width="280"
-				 height="2"
-				 image_name="model_wizard\divider_line.png"/>
-	
-			<text top_delta="20" width="200" text_color="White" left_delta="50" name="streaming cost"  height="20">Resource Cost:    [COST]</text>
-			<text
-						 top_pad="15"
-						 width="130"
-						 height="14"
-						 left="10"
-						 text_color="White"
-						 word_wrap="true">
-				Dimensions (meters):
-			</text>
-			<text
-			 top_pad="0"
-			 width="160"
-			 height="15"
-			 font="SansSerifSmallBold"
-			 text_color="White"
-			 name="dimensions"
-			 left_delta="0">
-				X:         Y:         Z:
-			</text>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_dividers"
-			 left_delta="41">
-				|               |
-			</text>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_x"
-			 left_delta="-25"/>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_y"
-			 left_delta="46"/>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_z"
-			 left_delta="46"/>
-		</panel>
-	</panel>
-
-	<panel
-		 height="388"
-		 top_delta="0"
-		 name="physics_panel"
-		 visible="false"
-		 width="535"
-		 left="0">
-		<panel
-		 height="22"
-		 top_pad="15"
-		 name="header_panel"
-		 width="505"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true"
-		 left="15">
-			<text
-			 width="200"
-			 left="10"
-			 name="header_text"
-			 top="3"
-			 height="10"
-			 font="SansSerifBig"
-			 text_color="White" 
-			 layout="topleft">
-				Physics
-			</text>
-		</panel>
-		<text
-		 top_pad="10"
-		 width="474"
-		 height="50"
-		 font="SansSerifSmall"
-		 layout="topleft"
-		 name="description"
-		 word_wrap="true"
-		 left_delta="5">
-			The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
-		</text>
-    <panel
-		 top_delta="44"
-		 left="15"
-		 height="270"
-		 width="505"
-		 name="content"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true">
-      <text top="15" left="20" text_color="White" font="SansSerifSmallBold" width="110" height="30" wrap="true" halign="center">Higher Performance</text>
-      <text top="45" left="10" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
-      <text top="15" left="372" text_color="White" font="SansSerifSmallBold" width="90" height="30" wrap="true" halign="center">Higher Accuracy</text>
-      <text top="45" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
-
-      <slider
-		   follows="left|top"
-		   height="22"
-		   increment=".1"
-		   layout="topleft"
-		   left="20"
-		   max_val="1"
-		   initial_value="0.5"
-		   min_val="0"
-		   name="physics_slider"
-		   show_text="false"
-		   top="90"
-		   width="440" />
-      <text
-			font="SansSerifSmall"
-			top_pad="0"
-			width="500"
-			left_delta="6"
-			height="4">'             '             '             '             '              '             '             '             '              '             '</text>
-      <text top_pad="10" width="110" halign="center" word_wrap="true" left="25"  height="40">Recommended for solid objects</text>
-      <text top_delta="0" width="110" halign="center" word_wrap="true" left="190"  height="40">Recommended for buildings</text>
-      <text top_delta="0" width="110" halign="center" word_wrap="true" left="350"  height="40">Recommended for vehicles</text>
-
-
-		<icon
-			 top_pad="5"
-			 left="15"
-			 width="470"
-			 height="2"
-			 image_name="model_wizard\divider_line.png"/>
-		
-	<text top_delta="30" width="180" text_color="White" left="160" name="streaming cost"  height="20">Resource Cost:       [COST]</text>
- 
-    </panel>
-	</panel>
-
-	<panel
-		 height="388"
-		 top_delta="0"
-		 name="physics2_panel"
-		 visible="true"
-		 width="535"
-		 left="0">
-		<panel
-		 height="22"
-		 top_pad="15"
-		 name="header_panel"
-		 width="505"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true"
-		 left="15">
-			<text
-			 width="200"
-			 left="10"
-			 name="header_text"
-			 text_color="White"
-			 top="3"
-			 height="10"
-			 font="SansSerifBig"
-			 layout="topleft">
-				Physics
-			</text>
-		</panel>
-		<text
-		 top_pad="14"
-		 width="475"
-		 height="50"
-		 font="SansSerifSmall"
-		 layout="topleft"
-		 name="description"
-		 word_wrap="true"
-		 left_delta="5">
-			Preview the physics shape below then click Next to continue.  To modify the physics shape, click the Back button.
-		</text>
-		<panel
-			 top_delta="40"
-			 left="15"
-			 height="270"
-			 width="505"
-			 name="content"
-			 bg_opaque_color="DkGray2"
-			 background_visible="true"
-			 background_opaque="true">
-			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
-				Model Preview:
-			</text>
-			<combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
-			   name="preview_lod_combo3" width="90" tool_tip="LOD to view in preview render">
-				<combo_item name="high">
-					High
-				</combo_item>
-				<combo_item name="medium">
-					Medium
-				</combo_item>
-				<combo_item name="low">
-					Low
-				</combo_item>
-				<combo_item name="lowest">
-					Lowest
-				</combo_item>
-			</combo_box>
-			<panel
-					   left="10"
-					   top_pad="10"
-					   name="preview_panel"
-					   bevel_style="none"
-					   highlight_light_color="0.09 0.09 0.09 1"
-					   border_style="line"
-					   border="true"
-					   height="190"
-					   follows="all"
-					   width="190">
-			</panel>
-			<text
-						 top_pad="8"
-						 width="130"
-						 height="14"
-						 left="10"
-						 text_color="White"
-						 word_wrap="true">
-				Dimensions (meters):
-			</text>
-			<text
-			 top_pad="0"
-			 width="160"
-			 height="15"
-			 font="SansSerifSmallBold"
-			 text_color="White"
-			 name="dimensions"
-			 left_delta="0">
-				X:         Y:         Z:
-			</text>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_dividers"
-			 left_delta="41">
-				|               |
-			</text>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_x"
-			 left_delta="-25"/>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_y"
-			 left_delta="46"/>
-			<text
-			 top_delta="0"
-			 width="160"
-			 height="15"
-			 name="dimension_z"
-			 left_delta="46"/>
-			<text top="60" width="180" text_color="White" left="225" name="streaming cost"  height="20">Resource Cost:       [COST]</text>
-		</panel>
-	</panel>
-
-	<panel
-		 height="388"
-		 top_delta="0"
-		 name="review_panel"
-		 visible="false"
-		 width="535"
-		 left="0">
-		<panel
-		 height="22"
-		 top_pad="15"
-		 name="header_panel"
-		 width="505"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true"
-		 left="15">
-			<text
-			 width="200"
-			 left="10"
-			 name="header_text"
-			 text_color="White" 
-			 top="3"
-			 height="10"
-			 font="SansSerifBig"
-			 layout="topleft">
-				Review
-			</text>
-		</panel>
-		<text
-		 top_pad="14"
-		 width="470"
-		 height="24"
-		 font="SansSerifSmall"
-		 layout="topleft"
-		 name="description"
-		 word_wrap="true"
-		 left_delta="5">
-			Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
-		</text>
-		<icon
-			 top_pad="10"
-			 left="20"
-			 width="495"
-			 height="2"
-			 image_name="model_wizard\divider_line.png"/>
-    <panel
-		 top_pad="5"
-		 left="15"
-		 height="270"
-		 width="505"
-		 name="content">
-      <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
-        Model Preview:
-      </text>
-      <combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
-	     name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render">
-        <combo_item name="high">
-          High
-        </combo_item>
-        <combo_item name="medium">
-          Medium
-        </combo_item>
-        <combo_item name="low">
-          Low
-        </combo_item>
-        <combo_item name="lowest">
-          Lowest
-        </combo_item>
-      </combo_box>
-      <panel
-				 left="10"
-				 top_pad="10"
-				 name="preview_panel"
-				 bevel_style="none"
-				 highlight_light_color="0.09 0.09 0.09 1"
-				 border_style="line"
-				 border="true"
-				 height="190"
-				 follows="all"
-				 width="190">
-			</panel>
-		<text
-					 top_pad="8"
-					 width="130"
-					 height="14"
-					 left="10"
-					 text_color="White"
-					 word_wrap="true">
-			Dimensions (meters):
-		</text>
-		<text
-		 top_pad="0"
-		 width="160"
-		 height="15"
-		 font="SansSerifSmallBold"
-		 text_color="White"
-		 name="dimensions"
-		 left_delta="0">
-			X:         Y:         Z:
-		</text>
-		<text
-		 top_delta="0"
-		 width="160"
-		 height="15"
-		 name="dimension_dividers"
-		 left_delta="41">
-			|               |
-		</text>
-		<text
-		 top_delta="0"
-		 width="160"
-		 height="15"
-		 name="dimension_x"
-		 left_delta="-25"/>
-		<text
-		 top_delta="0"
-		 width="160"
-		 height="15"
-		 name="dimension_y"
-		 left_delta="46"/>
-		<text
-		 top_delta="0"
-		 width="160"
-		 height="15"
-		 name="dimension_z"
-		 left_delta="46"/>
-      </panel>
-    <text
-      width="300"
-      height="12"
-      top="125" 
-	  name="streaming cost" 
-      left="230" 
-      font="SansSerifSmallBold" 
-      text_color="White">Resource Cost:         [COST]</text>
-    <text
-      width="285"
-      height="30"
-      top_pad="0"
-      left_delta="0"
-      word_wrap="true"
-      font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
-	<text
-	 width="300"
-	 height="12"
-	 name="physics cost" 
-	 top_pad="10"
-		 left_delta="0"
-	 font="SansSerifSmallBold"
-	 text_color="White">Physics Cost:        [COST]</text>
-	<text
-	  width="285"
-	  height="30"
-	  top_pad="0"
-		  left_delta="0"
-	  word_wrap="true"
-	  font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
-		<text
-		 width="200"
-		 height="12"
-		 top_pad="10"
-		left_delta="0"
-		 font="SansSerifSmallBold"
-		 text_color="White">Upload Fee:</text>
-		<text
-		  width="285"
-		  height="26"
-		  top_pad="0"
-		  left_delta="0"
-		  word_wrap="true"
-		  font="SansSerifItalic">This is the amount the upload will cost.</text>
-		<check_box
-			height="16"
-			layout="topleft"
-			left_delta="0"
-			name="confirm_checkbox"
-			top_pad="15"
-			width="16" />
-		<text
-		  height="100"
-		  width="240"
-		  word_wrap="true" 
-		  left_delta="25"
-		  top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text>
-	</panel>
-
-
-
-
-	<panel
-		 height="388"
-		 top_delta="0"
-		 name="upload_panel"
-		 visible="false"
-		 width="535"
-		 left="0">
-		<panel
-		 height="22"
-		 top_pad="15"
-		 name="header_panel"
-		 width="505"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true"
-		 left="15">
-			<text
-			 width="200"
-			 left="10"
-			 name="header_text"
-			 top="3"
-			 text_color="White" 
-			 height="10"
-			 font="SansSerifBig"
-			 layout="topleft">
-				Upload Complete!
-			</text>
-		</panel>
-		<text
-		 top_pad="14"
-		 width="474"
-		 height="20"
-		 font="SansSerifSmall"
-		 layout="topleft"
-		 name="description"
-		 word_wrap="true"
-		 left_delta="5">
-			Congratulations! Your model has been sucessfully uploaded.  You will find the model in the Objects folder in your inventory.
-		</text>
-		<icon
-			 top_pad="15"
-			 left_delta="0"
-			 width="495"
-			 height="2"
-			 image_name="model_wizard\divider_line.png"/>
-	</panel>
-
-
-
-	<button
-	 top="440"
-	 right="-245"
-	 width="90"
-	 height="22"
-	 name="back"
-	 label="&lt;&lt; Back" />
-	<button
-	 top_delta="0"
-	 right="-150"
-	 width="90"
-	 height="22"
-	 name="next"
-	 label="Next &gt;&gt; " />
-	<button
-	 top_delta="0"
-	 right="-150"
-	 width="90"
-	 height="22"
-	 visible="false" 
-	 name="upload" 
-	 tool_tip="Upload to simulator"
-	 label="Upload" />
-	<button
-	 top_delta="0"
-	 right="-15"
-	 width="90"
-	 height="22"
-	 name="cancel"
-	 label="Cancel" />
-	<button
-	 top_delta="0"
-	 right="-15"
-	 width="90"
-	 height="22"
-	 name="close"
-	 visible="false" 
-	 label="Close" />
-	<spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
-
-	<string name="status_idle">Idle</string>
-	<string name="status_reading_file">Loading...</string>
-	<string name="status_generating_meshes">Generating Meshes...</string>
-  <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
-	<string name="high">High</string>
-	<string name="medium">Medium</string>
-	<string name="low">Low</string>
-	<string name="lowest">Lowest</string>
-	<string name="mesh_status_good">Ship it!</string>
-	<string name="mesh_status_na">N/A</string>
-	<string name="mesh_status_none">None</string>
-	<string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
-	<string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
-	<string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
-	<string name="mesh_status_missing_lod">Missing required level of detail.</string>
-	<string name="layer_all">All</string>
-	<!-- Text to display in physics layer combo box for "all layers" -->
-
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ layout="topleft"
+ name="Model Wizard"
+ help_topic="model_wizard"
+ bg_opaque_image_overlay="0.5 0.5 0.5 1"
+ height="480"
+ save_rect="true"
+ title="UPLOAD MODEL WIZARD"
+ width="535">
+	<button
+	 top="32"
+	 tab_stop="false"
+	 left="410"
+	 height="32"
+	 name="upload_btn"
+	 enabled="false"
+	 label="5. Upload"
+	 border="false"
+	 image_unselected="BreadCrumbBtn_Right_Off"
+	 image_selected="BreadCrumbBtn_Right_Press"
+	 image_hover_unselected="BreadCrumbBtn_Right_Over"
+	 image_disabled="BreadCrumbBtn_Right_Disabled"
+	 image_disabled_selected="BreadCrumbBtn_Right_Disabled"
+	 width="110">
+		<button.commit_callback
+		function="Wizard.Upload"/>
+	</button>
+	<button
+	 top="32"
+	 left="310"
+	 height="32"
+	 tab_stop="false"
+	 name="review_btn"
+	 label="4. Review"
+	 enabled="false"
+	 border="false"
+	 image_unselected="BreadCrumbBtn_Middle_Off"
+	 image_selected="BreadCrumbBtn_Middle_Press"
+	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
+	 image_disabled="BreadCrumbBtn_Middle_Disabled"
+	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+	 width="110">
+		<button.commit_callback
+		function="Wizard.Review"/>
+	</button>
+	<button
+	 top="32"
+	 left="210"
+	 height="32"
+	 name="physics2_btn"
+	 label="3. Physics"
+	 tab_stop="false"
+	 enabled="false"
+	 border="false"
+	 image_unselected="BreadCrumbBtn_Middle_Off"
+	 image_selected="BreadCrumbBtn_Middle_Press"
+	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
+	 image_disabled="BreadCrumbBtn_Middle_Disabled"
+	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+	 width="110">
+		<button.commit_callback
+		function="Wizard.Physics2"/>
+	</button>
+	<button
+	 top="32"
+	 left="210"
+	 height="32"
+	 name="physics_btn"
+	 label="3. Physics"
+	 tab_stop="false"
+	 enabled="false"
+	 border="false"
+	 image_unselected="BreadCrumbBtn_Middle_Off"
+	 image_selected="BreadCrumbBtn_Middle_Press"
+	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
+	 image_disabled="BreadCrumbBtn_Middle_Disabled"
+	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+	 width="110">
+		<button.commit_callback
+		function="Wizard.Physics"/>
+	</button>
+	<button
+	 top="32"
+	 left="115"
+	 name="optimize_btn"
+	 label="2. Optimize"
+	 tab_stop="false"
+	 height="32"
+	 border="false"
+	 image_unselected="BreadCrumbBtn_Middle_Off"
+	 image_selected="BreadCrumbBtn_Middle_Press"
+	 image_hover_unselected="BreadCrumbBtn_Middle_Over"
+	 image_disabled="BreadCrumbBtn_Middle_Disabled"
+	 image_disabled_selected="BreadCrumbBtn_Middle_Disabled"
+	 width="110">
+		<button.commit_callback
+		function="Wizard.Optimize"/>
+	</button>
+	<button
+	 top="32"
+	 left="15"
+	 name="choose_file_btn"
+	 tab_stop="false"
+	 enabled="false"
+	 label="1. Choose File"
+	 height="32"
+	 image_unselected="BreadCrumbBtn_Left_Off"
+	 image_selected="BreadCrumbBtn_Left_Press"
+	 image_hover_unselected="BreadCrumbBtn_Left_Over"
+	 image_disabled="BreadCrumbBtn_Left_Disabled"
+	 image_disabled_selected="BreadCrumbBtn_Left_Disabled"
+	 width="110">
+		<button.commit_callback
+		function="Wizard.Choose"/>
+	</button>
+	<panel
+		 height="388"
+		 top_pad="0"
+		 name="choose_file_panel"
+		 visible="false"
+		 width="535"
+		 left="0">
+		<panel
+		 height="22"
+		 top_pad="15"
+		 width="505"
+		 name="header_panel"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="15">
+			<text
+			 width="200"
+			 left="10"
+			 top="3"
+			 name="header_text"
+			 text_color="White"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Upload Model
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="460"
+		 height="20"
+		 name="description"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 word_wrap="true"
+		 left_delta="5">
+			This wizard will help you import mesh models to Second Life.  First specify a file containing the model you wish to import.  Second Life supports COLLADA (.dae) files.
+		</text>
+		<panel
+		 top_delta="40"
+		 left="15"
+		 height="270"
+		 width="505"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true">
+			<text
+			 type="string"
+			 length="1"
+			 text_color="White" 
+			 follows="left|top"
+			 top="10"
+			 height="10"
+			 layout="topleft"
+			 left_delta="10"
+			 name="Cache location"
+			 width="300">
+				Filename:
+			</text>
+			<line_editor
+			 border_style="line"
+			 border_thickness="1"
+			 follows="left|top"
+			 font="SansSerifSmall"
+			 height="20"
+			 layout="topleft"
+			 left_delta="0"
+			 max_length="4096"
+			 name="lod_file"
+			 top_pad="5"
+			 width="220" />
+			<button
+			 follows="left|top"
+			 height="23"
+			 label="Browse..."
+			 label_selected="Browse..."
+			 layout="topleft"
+			 left_pad="5"
+			 name="browse"
+			 top_delta="-1"
+			 width="85">
+			</button>
+			<text
+			 top_delta="-15"
+			 width="200"
+			 height="15"
+			 font="SansSerifSmall"
+			 layout="topleft"
+			 text_color="White"
+			 left_pad="19">
+				Model Preview:
+			</text>
+			<!-- Placeholder panel for 3D preview render -->
+			<panel
+			 left_delta="0"
+			 top_pad="0"
+			 name="preview_panel"
+			 bevel_style="none"
+			 highlight_light_color="0.09 0.09 0.09 1"
+			 border="true"
+			 height="150"
+			 follows="all"
+			 width="150">
+			</panel>
+			<text
+			 top_pad="10"
+			 width="130"
+			 height="14"
+			 left="340"
+			 text_color="White"
+			 word_wrap="true">
+				Dimensions (meters):
+			</text>
+			<text
+			 top_pad="0"
+			 width="160"
+			 height="15"
+			 font="SansSerifSmallBold" 
+			 text_color="White"
+			 name="dimensions"
+			 left_delta="0">
+				X:         Y:         Z: 
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_dividers"
+			 left_delta="41">
+				 |               |   
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_x"
+			 left="356"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_y"
+			 left="403"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_z"
+			 left="450"/>
+			<text
+			 top="100"
+			 width="320"
+			 height="15"
+			 left="10"
+			 text_color="White" 
+			 word_wrap="true">
+				Note:
+			</text>
+			<text
+			 top_pad="0"
+			 width="320"
+			 height="40"
+			 left="10"
+			 word_wrap="true">
+Advanced users familiar with 3d content creation tools may prefer to use the [secondlife:///app/floater/upload_model Advanced Mesh Import Window] .
+			</text>
+		</panel>
+	</panel>
+
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="optimize_panel"
+		 visible="false"
+		 width="535"
+		 left="0">
+		<panel
+		 height="22"
+		 top_pad="15"
+		 name="header_panel"
+		 width="505"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="15">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 top="3"
+			 text_color="White"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Optimize
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="460"
+		 height="20"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="5">
+			This wizard has optimized your model to improve performance. You may adjust the results of the optimization process bellow or click Next to continue.
+		</text>
+		<panel
+		 top_delta="40"
+		 visible="false"
+		 left="15"
+		 height="270"
+		 width="505"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true">
+			<text
+			 top="20"
+			 width="300"
+			 height="12"
+			 font="SansSerifBold"
+			 left="112">Generating Level of Detail</text>
+			<progress_bar
+			  name="optimize_progress_bar"
+              image_fill="model_wizard\progress_light.png"
+			  color_bg="1 1 1 1"
+			  color_bar="1 1 1 0.96"
+			  follows="left|right|top"
+			  width="260"
+			  height="16"
+			  image_bar="model_wizard\progress_bar_bg.png"
+			  top_pad="14"
+			  left="110"/>
+			<icon
+			 top_pad="10"
+			 left_delta="0"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="high_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: High</text>
+			<icon
+			 top_pad="10"
+			 left_delta="-18"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="medium_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: Medium</text>
+			<icon
+			 top_pad="10"
+			 left_delta="-18"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="low_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: Low</text>
+			<icon
+			 top_pad="10"
+			 left_delta="-18"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="lowest_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: Lowest</text>
+		</panel>
+		<panel
+				 top_delta="0"
+				 left_delta="0"
+				 height="270"
+				 width="505"
+				 name="content2"
+				 bg_opaque_color="DkGray2"
+				 background_visible="true"
+				 background_opaque="true">
+			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
+				Model Preview:
+			</text>
+			<combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
+	     name="preview_lod_combo2" width="90" tool_tip="LOD to view in preview render">
+				<combo_item name="high">
+					High
+				</combo_item>
+				<combo_item name="medium">
+					Medium
+				</combo_item>
+				<combo_item name="low">
+					Low
+				</combo_item>
+				<combo_item name="lowest">
+					Lowest
+				</combo_item>
+			</combo_box>
+			<panel
+				 left="10"
+				 top_pad="5"
+				 name="preview_panel"
+				 bevel_style="none"
+				 highlight_light_color="0.09 0.09 0.09 1"
+				 border_style="line"
+				 border="true"
+				 height="185"
+				 follows="all"
+				 width="185">
+			</panel>
+			<text top="45" left="214" text_color="White" font="SansSerifSmallBold" halign="center" width="110" height="30" wrap="true">Higher Performance</text>
+			<text top="75" left="204" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
+			<text top="45" left="378" text_color="White" font="SansSerifSmallBold" halign="center" width="90" height="30" wrap="true">Higher Accuracy</text>
+			<text top="75" left="364" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+
+			<slider
+		   follows="left|top"
+		   height="20"
+		   increment="1"
+		   layout="topleft"
+		   left="204"
+		   max_val="3"
+		   initial_value="2"
+		   min_val="0"
+		   name="accuracy_slider"
+		   show_text="false"
+		   top="130"
+		   width="290" />
+			<text 
+			font="SansSerifSmall" 
+			top_pad="0"  
+			width="300" 
+			left_delta="6" 
+			height="4">'  
+      </text>
+
+
+			<icon
+				 top_pad="14"
+				 left_delta="0"
+				 width="280"
+				 height="2"
+				 image_name="model_wizard\divider_line.png"/>
+	
+			<text top_delta="20" width="200" text_color="White" left_delta="50" name="streaming cost"  height="20">Resource Cost:    [COST]</text>
+			<text
+						 top_pad="15"
+						 width="130"
+						 height="14"
+						 left="10"
+						 text_color="White"
+						 word_wrap="true">
+				Dimensions (meters):
+			</text>
+			<text
+			 top_pad="0"
+			 width="160"
+			 height="15"
+			 font="SansSerifSmallBold"
+			 text_color="White"
+			 name="dimensions"
+			 left_delta="0">
+				X:         Y:         Z:
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_dividers"
+			 left_delta="41">
+				|               |
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_x"
+			 left_delta="-25"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_y"
+			 left_delta="46"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_z"
+			 left_delta="46"/>
+		</panel>
+	</panel>
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="physics_panel"
+		 visible="false"
+		 width="535"
+		 left="0">
+		<panel
+		 height="22"
+		 top_pad="15"
+		 name="header_panel"
+		 width="505"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="15">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 top="3"
+			 height="10"
+			 font="SansSerifBig"
+			 text_color="White" 
+			 layout="topleft">
+				Physics
+			</text>
+		</panel>
+		<text
+		 top_pad="10"
+		 width="474"
+		 height="50"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="5">
+			The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
+		</text>
+    <panel
+		 top_delta="44"
+		 left="15"
+		 height="270"
+		 width="505"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true">
+      <text top="15" left="20" text_color="White" font="SansSerifSmallBold" width="110" height="30" wrap="true" halign="center">Higher Performance</text>
+      <text top="45" left="10" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">Faster rendering but less detailed; lowers Resource (prim) cost.</text>
+      <text top="15" left="372" text_color="White" font="SansSerifSmallBold" width="90" height="30" wrap="true" halign="center">Higher Accuracy</text>
+      <text top="45" left="360" halign="center" width="130" word_wrap="true"   font="SansSerifSmall" height="80">More detailed model but slower; increases Resource (prim) cost.</text>
+
+      <slider
+		   follows="left|top"
+		   height="22"
+		   increment=".1"
+		   layout="topleft"
+		   left="20"
+		   max_val="1"
+		   initial_value="0.5"
+		   min_val="0"
+		   name="physics_slider"
+		   show_text="false"
+		   top="90"
+		   width="440" />
+      <text
+			font="SansSerifSmall"
+			top_pad="0"
+			width="500"
+			left_delta="6"
+			height="4">'             '             '             '             '              '             '             '             '              '             '</text>
+      <text top_pad="10" width="110" halign="center" word_wrap="true" left="25"  height="40">Recommended for solid objects</text>
+      <text top_delta="0" width="110" halign="center" word_wrap="true" left="190"  height="40">Recommended for buildings</text>
+      <text top_delta="0" width="110" halign="center" word_wrap="true" left="350"  height="40">Recommended for vehicles</text>
+
+
+		<icon
+			 top_pad="5"
+			 left="15"
+			 width="470"
+			 height="2"
+			 image_name="model_wizard\divider_line.png"/>
+		
+	<text top_delta="30" width="180" text_color="White" left="160" name="streaming cost"  height="20">Resource Cost:       [COST]</text>
+ 
+    </panel>
+	</panel>
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="physics2_panel"
+		 visible="true"
+		 width="535"
+		 left="0">
+		<panel
+		 height="22"
+		 top_pad="15"
+		 name="header_panel"
+		 width="505"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="15">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 text_color="White"
+			 top="3"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Physics
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="475"
+		 height="50"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="5">
+			Preview the physics shape below then click Next to continue.  To modify the physics shape, click the Back button.
+		</text>
+		<panel
+			 top_delta="40"
+			 left="15"
+			 height="270"
+			 width="505"
+			 name="content"
+			 bg_opaque_color="DkGray2"
+			 background_visible="true"
+			 background_opaque="true">
+			<text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
+				Model Preview:
+			</text>
+			<combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
+			   name="preview_lod_combo3" width="90" tool_tip="LOD to view in preview render">
+				<combo_item name="high">
+					High
+				</combo_item>
+				<combo_item name="medium">
+					Medium
+				</combo_item>
+				<combo_item name="low">
+					Low
+				</combo_item>
+				<combo_item name="lowest">
+					Lowest
+				</combo_item>
+			</combo_box>
+			<panel
+					   left="10"
+					   top_pad="10"
+					   name="preview_panel"
+					   bevel_style="none"
+					   highlight_light_color="0.09 0.09 0.09 1"
+					   border_style="line"
+					   border="true"
+					   height="190"
+					   follows="all"
+					   width="190">
+			</panel>
+			<text
+						 top_pad="8"
+						 width="130"
+						 height="14"
+						 left="10"
+						 text_color="White"
+						 word_wrap="true">
+				Dimensions (meters):
+			</text>
+			<text
+			 top_pad="0"
+			 width="160"
+			 height="15"
+			 font="SansSerifSmallBold"
+			 text_color="White"
+			 name="dimensions"
+			 left_delta="0">
+				X:         Y:         Z:
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_dividers"
+			 left_delta="41">
+				|               |
+			</text>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_x"
+			 left_delta="-25"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_y"
+			 left_delta="46"/>
+			<text
+			 top_delta="0"
+			 width="160"
+			 height="15"
+			 name="dimension_z"
+			 left_delta="46"/>
+			<text top="60" width="180" text_color="White" left="225" name="streaming cost"  height="20">Resource Cost:       [COST]</text>
+		</panel>
+	</panel>
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="review_panel"
+		 visible="false"
+		 width="535"
+		 left="0">
+		<panel
+		 height="22"
+		 top_pad="15"
+		 name="header_panel"
+		 width="505"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="15">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 text_color="White" 
+			 top="3"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Review
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="470"
+		 height="24"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="5">
+			Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
+		</text>
+		<icon
+			 top_pad="10"
+			 left="20"
+			 width="495"
+			 height="2"
+			 image_name="model_wizard\divider_line.png"/>
+    <panel
+		 top_pad="5"
+		 left="15"
+		 height="270"
+		 width="505"
+		 name="content">
+      <text top="10" left="10" width="85" text_color="White" follows="left|top" height="15" name="lod_label">
+        Model Preview:
+      </text>
+      <combo_box left_pad="5" top_delta="-5"  follows="left|top" list_position="below" height="22"
+	     name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render">
+        <combo_item name="high">
+          High
+        </combo_item>
+        <combo_item name="medium">
+          Medium
+        </combo_item>
+        <combo_item name="low">
+          Low
+        </combo_item>
+        <combo_item name="lowest">
+          Lowest
+        </combo_item>
+      </combo_box>
+      <panel
+				 left="10"
+				 top_pad="10"
+				 name="preview_panel"
+				 bevel_style="none"
+				 highlight_light_color="0.09 0.09 0.09 1"
+				 border_style="line"
+				 border="true"
+				 height="190"
+				 follows="all"
+				 width="190">
+			</panel>
+		<text
+					 top_pad="8"
+					 width="130"
+					 height="14"
+					 left="10"
+					 text_color="White"
+					 word_wrap="true">
+			Dimensions (meters):
+		</text>
+		<text
+		 top_pad="0"
+		 width="160"
+		 height="15"
+		 font="SansSerifSmallBold"
+		 text_color="White"
+		 name="dimensions"
+		 left_delta="0">
+			X:         Y:         Z:
+		</text>
+		<text
+		 top_delta="0"
+		 width="160"
+		 height="15"
+		 name="dimension_dividers"
+		 left_delta="41">
+			|               |
+		</text>
+		<text
+		 top_delta="0"
+		 width="160"
+		 height="15"
+		 name="dimension_x"
+		 left_delta="-25"/>
+		<text
+		 top_delta="0"
+		 width="160"
+		 height="15"
+		 name="dimension_y"
+		 left_delta="46"/>
+		<text
+		 top_delta="0"
+		 width="160"
+		 height="15"
+		 name="dimension_z"
+		 left_delta="46"/>
+      </panel>
+    <text
+      width="300"
+      height="12"
+      top="125" 
+	  name="streaming cost" 
+      left="230" 
+      font="SansSerifSmallBold" 
+      text_color="White">Resource Cost:         [COST]</text>
+    <text
+      width="285"
+      height="30"
+      top_pad="0"
+      left_delta="0"
+      word_wrap="true"
+      font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
+	<text
+	 width="300"
+	 height="12"
+	 name="physics cost" 
+	 top_pad="10"
+		 left_delta="0"
+	 font="SansSerifSmallBold"
+	 text_color="White">Physics Cost:        [COST]</text>
+	<text
+	  width="285"
+	  height="30"
+	  top_pad="0"
+		  left_delta="0"
+	  word_wrap="true"
+	  font="SansSerifItalic">This is the cost to your Region's prim/object limit, at default scale</text>
+		<text
+		 width="200"
+		 height="12"
+		 top_pad="10"
+		left_delta="0"
+		 font="SansSerifSmallBold"
+		 text_color="White">Upload Fee:</text>
+		<text
+		  width="285"
+		  height="26"
+		  top_pad="0"
+		  left_delta="0"
+		  word_wrap="true"
+		  font="SansSerifItalic">This is the amount the upload will cost.</text>
+		<check_box
+			height="16"
+			layout="topleft"
+			left_delta="0"
+			name="confirm_checkbox"
+			top_pad="15"
+			width="16" />
+		<text
+		  height="100"
+		  width="240"
+		  word_wrap="true" 
+		  left_delta="25"
+		  top_delta="0">I confirm that I have the appropriate rights to the material contained in this model. [secondlife:///app/floater/learn_more Learn more]</text>
+	</panel>
+
+
+
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="upload_panel"
+		 visible="false"
+		 width="535"
+		 left="0">
+		<panel
+		 height="22"
+		 top_pad="15"
+		 name="header_panel"
+		 width="505"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="15">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 top="3"
+			 text_color="White" 
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Upload Complete!
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="474"
+		 height="20"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="5">
+			Congratulations! Your model has been sucessfully uploaded.  You will find the model in the Objects folder in your inventory.
+		</text>
+		<icon
+			 top_pad="15"
+			 left_delta="0"
+			 width="495"
+			 height="2"
+			 image_name="model_wizard\divider_line.png"/>
+	</panel>
+
+
+
+	<button
+	 top="440"
+	 right="-245"
+	 width="90"
+	 height="22"
+	 name="back"
+	 label="&lt;&lt; Back" />
+	<button
+	 top_delta="0"
+	 right="-150"
+	 width="90"
+	 height="22"
+	 name="next"
+	 label="Next &gt;&gt; " />
+	<button
+	 top_delta="0"
+	 right="-150"
+	 width="90"
+	 height="22"
+	 visible="false" 
+	 name="upload" 
+	 tool_tip="Upload to simulator"
+	 label="Upload" />
+	<button
+	 top_delta="0"
+	 right="-15"
+	 width="90"
+	 height="22"
+	 name="cancel"
+	 label="Cancel" />
+	<button
+	 top_delta="0"
+	 right="-15"
+	 width="90"
+	 height="22"
+	 name="close"
+	 visible="false" 
+	 label="Close" />
+	<spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
+
+	<string name="status_idle">Idle</string>
+	<string name="status_reading_file">Loading...</string>
+	<string name="status_generating_meshes">Generating Meshes...</string>
+  <string name="status_vertex_number_overflow">Error: Vertex number is more than 65534, aborted!</string>
+	<string name="high">High</string>
+	<string name="medium">Medium</string>
+	<string name="low">Low</string>
+	<string name="lowest">Lowest</string>
+	<string name="mesh_status_good">Ship it!</string>
+	<string name="mesh_status_na">N/A</string>
+	<string name="mesh_status_none">None</string>
+	<string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
+	<string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
+	<string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
+	<string name="mesh_status_missing_lod">Missing required level of detail.</string>
+	<string name="layer_all">All</string>
+	<!-- Text to display in physics layer combo box for "all layers" -->
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml
index b4ecedd9815d3bf0fcea79701d3ef0ccabcc9e44..8da35e9d7f73a7e60c7b1f3d31c976d756429cc3 100644
--- a/indra/newview/skins/default/xui/en/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/en/floater_postcard.xml
@@ -36,6 +36,7 @@
         Recipient&apos;s Email:
     </text>
     <line_editor
+     control_name="LastPostcardRecipient"
      follows="left|top"
      height="20"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
index a17cf8eea8ba43df2b56bc8ad507f8356cc9758c..9f6199fada89cbe46f99c26e869e42a2eaaca8eb 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -120,14 +120,14 @@
      font.style="BOLD"
      name="key_label"
      top_pad="10"
-     width="150">
+     width="130">
         Shortcut Key:
     </text>
     <combo_box
      height="20"
      label="None"
      layout="topleft"
-     left_delta="154"
+     left_delta="135"
      name="modifier_combo"
      top_delta="-4"
      width="55" />
diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
index d1db5c17bad13fea24d79e0f34c075aeb4a66aad..ce96ea232e949656dae8f91d4dc511c4f83c813f 100644
--- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
@@ -20,5 +20,6 @@
      parse_highlights="true" 
      read_only="true"
      width="420"
+     track_bottom="true" 
      word_wrap="true" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 857932e51a105838419e1edbf9211defcffbe33e..e413228ddc50cc9ef26411e55519ce413854a485 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -11,7 +11,7 @@
  save_rect="true"
  save_visibility="true"
  title="SNAPSHOT PREVIEW"
- width="215">
+ width="245">
     <floater.string
      name="unknown">
         unknown
diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
new file mode 100644
index 0000000000000000000000000000000000000000..304987c3d59c1470f7820dc744beee4ee8c506f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater
+ border_visible="false"
+ border="false"
+ legacy_header_height="18"
+ can_minimize="true"
+ can_resize="false"
+ can_close="false"
+ save_dock_state="true"
+ save_visibility="true"
+ save_rect="true"
+ single_instance="true"
+ bevel_style="in"
+ height="164"
+ layout="topleft"
+ name="floater_sound_devices"
+ title="Sound Devices"
+ width="315">
+  <panel
+    layout="topleft"
+    follows="all"
+    filename="panel_sound_devices.xml"
+    name="device_settings_panel"
+    width="400"
+    left="2"
+    top="26"
+    class="panel_voice_device_settings"/>
+  <text
+    name="voice_label"
+    top="136"
+    left="12"
+    height="14"
+    width="80"
+    layout="topleft"
+    >Voice Chat</text>
+  <check_box
+    layout="topleft"
+    control_name="EnableVoiceChat"
+    follows="bottom|left"
+    top="138"
+    left="80"
+    name="enable_voice"
+    width="100"
+    height="14"
+    label="Enabled"
+    />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 501e93ead3ac15cddf05b976646e31b174130ee6..e342b441acec96a9940a10de13df100d45442e0c 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1,3194 +1,3194 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- follows="left|top|right"
- height="580"
- layout="topleft"
- bg_opaque_image="Window_NoTitle_Foreground"
- bg_alpha_image="Window_NoTitle_Background"
- name="toolbox floater"
- help_topic="toolbox_floater"
- save_rect="true"
- short_title="BUILD TOOLS"
- single_instance="true"
- save_visibility="true"
- sound_flags="0"
- width="295">
-    <floater.string
-     name="status_rotate">
-        Drag colored bands to rotate object
-    </floater.string>
-    <floater.string
-     name="status_scale">
-        Click and drag to stretch selected side
-    </floater.string>
-    <floater.string
-     name="status_move">
-        Drag to move, shift-drag to copy
-    </floater.string>
-    <floater.string
-     name="status_modifyland">
-        Click and hold to modify land
-    </floater.string>
-    <floater.string
-     name="status_camera">
-        Click and drag to move camera
-    </floater.string>
-    <floater.string
-     name="status_grab">
-        Drag to move, Ctrl to lift, Ctrl+Shift to rotate
-    </floater.string>
-    <floater.string
-     name="status_place">
-        Click inworld to build
-    </floater.string>
-    <floater.string
-     name="status_selectland">
-        Click and drag to select land
-    </floater.string>
-    <floater.string
-     name="grid_screen_text">
-        Screen
-    </floater.string>
-    <floater.string
-     name="grid_local_text">
-        Local
-    </floater.string>
-    <floater.string
-     name="grid_world_text">
-        World
-    </floater.string>
-    <floater.string
-     name="grid_reference_text">
-        Reference
-    </floater.string>
-    <floater.string
-     name="grid_attachment_text">
-        Attachment
-    </floater.string>
-    <button
-     follows="left|top"
-     height="25"
-     image_bottom_pad="1"
-     image_overlay="Tool_Zoom"
-     image_selected="PushButton_Selected_Press"
-     layout="topleft"
-     left="10"
-     name="button focus"
-     tool_tip="Focus"
-     width="35">
-	  <button.commit_callback
-	     function="BuildTool.setTool"
-	     parameter="Focus" />
-	</button>
-    <button
-     follows="left|top"
-      height="25"
-     image_bottom_pad="1"
-     image_overlay="Tool_Grab"
-     image_selected="PushButton_Selected_Press"
-     layout="topleft"
-     left_pad="10"
-     name="button move"
-     tool_tip="Move"
-     width="35">
-	  <button.commit_callback
-	     function="BuildTool.setTool"
-	     parameter="Move" />
-	</button>
-    <button
-     follows="left|top"
-     height="25"
-     image_bottom_pad="1"
-     image_overlay="Tool_Face"
-     image_selected="PushButton_Selected_Press"
-     layout="topleft"
-     left_pad="10"
-     name="button edit"
-     tool_tip="Edit"
-     width="35">
-	  <button.commit_callback
-	     function="BuildTool.setTool"
-	     parameter="Edit" />
-	</button>
-    <button
-     follows="left|top"
-      height="25"
-     image_bottom_pad="1"
-     image_overlay="Tool_Create"
-     image_selected="PushButton_Selected_Press"
-     layout="topleft"
-     left_pad="10"
-     name="button create"
-     tool_tip="Create"
-     width="35">
-	  <button.commit_callback
-	     function="BuildTool.setTool"
-	     parameter="Create" />
-	</button>
-    <button
-     follows="left|top"
-      height="25"
-     image_bottom_pad="1"
-     image_overlay="Tool_Dozer"
-     image_selected="PushButton_Selected_Press"
-     layout="topleft"
-     left_pad="10"
-     name="button land"
-     tool_tip="Land"
-     width="35">
-	  <button.commit_callback
-	     function="BuildTool.setTool"
-	     parameter="Land" />
-	</button>
-    <text
-     height="30"
-     word_wrap="true"
-     use_ellipses="true"
-     type="string"
-     text_color="LabelSelectedDisabledColor"
-     length="1"
-     follows="left|top"
-     layout="topleft"
-     left="8"
-     name="text status"
-     top_pad="3"
-     width="285">
-        Drag to move, shift-drag to copy
-    </text>
-   <radio_group
-     layout="topleft"
-     left="10"
-      height="70"
-      top="59"
-     name="focus_radio_group">
-        <radio_item
-         top_pad="6"
-         label="Zoom"
-         layout="topleft"
-         name="radio zoom" />
-        <radio_item
-         top_pad="6"
-         label="Orbit (Ctrl)"
-         layout="topleft"
-         name="radio orbit" />
-        <radio_item
-         top_pad="6"
-         label="Pan (Ctrl+Shift)"
-         layout="topleft"
-         name="radio pan" />
-		 <radio_group.commit_callback
-	     function="BuildTool.commitRadioFocus"/>
-    </radio_group>
-   <slider_bar
-     follows="left|top"
-     height="14"
-     increment="0.01"
-     initial_value="0.125"
-     layout="topleft"
-     max_val="0.5"
-     top_delta="-2"
-     left_delta="100"
-     name="slider zoom"
-     width="134">
-	 <slider_bar.commit_callback
-	     function="BuildTool.commitZoom"/>
-	</slider_bar>
-   <radio_group
-      left="10"
-      height="70"
-      top="59"
-     layout="topleft"
-     name="move_radio_group">
-        <radio_item
-         top_pad="6"
-         label="Move"
-         layout="topleft"
-         name="radio move" />
-        <radio_item
-		 top_pad="6"
-         label="Lift (Ctrl)"
-         layout="topleft"
-         name="radio lift" />
-        <radio_item
-         top_pad="6"
-         label="Spin (Ctrl+Shift)"
-         layout="topleft"
-         name="radio spin" />
-		 <radio_group.commit_callback
-			function="BuildTool.commitRadioMove"/>
-	</radio_group>
-	<radio_group
-     follows="left|top"
-	 left="5"
-	 top="59"
-	 height="70"
-     layout="topleft"
-	 name="edit_radio_group">
-        <radio_item
-		 label="Move"
-		 layout="topleft"
-		 name="radio position" />
-        <radio_item
-		 top_pad="6"
-         label="Rotate (Ctrl)"
-         layout="topleft"
-         name="radio rotate" />
-        <radio_item
-		 top_pad="6"
-         label="Stretch (Ctrl+Shift)"
-         layout="topleft"
-         name="radio stretch" />
-        <radio_item
-		 top_pad="6"
-         label="Select Face"
-         layout="topleft"
-         name="radio select face" />
-			<radio_group.commit_callback
-			function="BuildTool.commitRadioEdit"/>
-    </radio_group>
-    <check_box
-     left="5"
-     follows="left|top"
-     height="28"
-	 control_name="EditLinkedParts"
-     label="Edit linked"
-     layout="topleft"
-     name="checkbox edit linked parts"
-     top_pad="-10">
-		  <check_box.commit_callback
-			function="BuildTool.selectComponent"/>
-	</check_box>
-
-   <button
-     follows="left|top"
-     height="23"
-     label="Link"
-     top_pad="2"
-     layout="topleft"
-     left="5"
-     name="link_btn"
-     width="50">
-	  <button.commit_callback
-	     function="BuildTool.LinkObjects"/>
-    </button>
-    <button
-     follows="left|top"
-     height="23"
-     label="Unlink"
-     layout="topleft"
-     left_pad="2"
-     name="unlink_btn"
-     width="50">
-	  <button.commit_callback
-	     function="BuildTool.UnlinkObjects"/>
-    </button>
-    <text
-	   text_color="LtGray_50"
-	   follows="top|left"
-	   halign="left"
-	   left_pad="3"
-	   name="RenderingCost"
-	   tool_tip="Shows the rendering cost calculated for this object"
-	   top_delta="11"
-	   type="string"
-	   width="100">
-	   þ: [COUNT]
-	   </text>
-    <check_box
-     control_name="ScaleUniform"
-     height="19"
-     label=""
-     layout="topleft"
-     left="143"
-     name="checkbox uniform"
-     top="50"
-     width="20" />
-    <text
-     height="19"
-     label="Stretch Both Sides"
-     left_delta="20"
-     name="checkbox uniform label"
-     top_delta="2"
-     width="120"
-     layout="topleft"
-     follows="top|left"
-     wrap="true">
-     	Stretch Both Sides
-    </text>
-    <check_box
-     control_name="ScaleStretchTextures"
-     height="19"
-     initial_value="true"
-     label="Stretch Textures"
-     layout="topleft"
-     left="143"
-     name="checkbox stretch textures"
-     top_pad="-6"
-     follows="left|top"
-     width="134" />
-   <check_box
-     control_name="SnapEnabled"
-     height="18"
-     initial_value="true"
-     label="Snap to grid"
-     layout="topleft"
-     top_pad="0"
-     name="checkbox snap to grid"
-     width="134" />
-    <combo_box
-     height="23"
-     layout="topleft"
-     follows="left|top"
-     name="combobox grid mode"
-     tool_tip="Choose the type of grid ruler for positioning the object"
-     top_pad="0"
-     width="108">
-        <combo_box.item
-         label="World grid"
-         name="World"
-         value="World" />
-        <combo_box.item
-         label="Local grid"
-         name="Local"
-         value="Local" />
-        <combo_box.item
-         label="Reference grid"
-         name="Reference"
-         value="Reference" />
-		 <combo_box.commit_callback
-	     function="BuildTool.gridMode"/>
-    </combo_box>
-    <button
-     left_pad="0"
-     image_selected="ForwardArrow_Press"
-     image_unselected="ForwardArrow_Off"
-     layout="topleft"
-     follows="top|left"
-     name="Options..."
-     tool_tip="See more grid options"
-     top_pad="-22"
-     right="-10"
-     width="18"
-     height="23" >
-	 <button.commit_callback
-	     function="BuildTool.gridOptions"/>
-	</button>
-   <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Cube"
-     image_disabled_selected="Object_Cube"
-     image_selected="Object_Cube_Selected"
-     image_unselected="Object_Cube"
-     layout="topleft"
-     left="10"
-     name="ToolCube"
-     tool_tip="Cube"
-     top="51"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Prism"
-     image_disabled_selected="Object_Prism"
-     image_selected="Object_Prism_Selected"
-     image_unselected="Object_Prism"
-     layout="topleft"
-     left_delta="29"
-     name="ToolPrism"
-     tool_tip="Prism"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Pyramid"
-     image_disabled_selected="Object_Pyramid"
-     image_selected="Object_Pyramid_Selected"
-     image_unselected="Object_Pyramid"
-     layout="topleft"
-     left_delta="29"
-     name="ToolPyramid"
-     tool_tip="Pyramid"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Tetrahedron"
-     image_disabled_selected="Object_Tetrahedron"
-     image_selected="Object_Tetrahedron_Selected"
-     image_unselected="Object_Tetrahedron"
-     layout="topleft"
-     left_delta="29"
-     name="ToolTetrahedron"
-     tool_tip="Tetrahedron"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Cylinder"
-     image_disabled_selected="Object_Cylinder"
-     image_selected="Object_Cylinder_Selected"
-     image_unselected="Object_Cylinder"
-     layout="topleft"
-     left_delta="29"
-     name="ToolCylinder"
-     tool_tip="Cylinder"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Hemi_Cylinder"
-     image_disabled_selected="Object_Hemi_Cylinder"
-     image_selected="Object_Hemi_Cylinder_Selected"
-     image_unselected="Object_Hemi_Cylinder"
-     layout="topleft"
-     left_delta="29"
-     name="ToolHemiCylinder"
-     tool_tip="Hemicylinder"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Cone"
-     image_disabled_selected="Object_Cone"
-     image_selected="Object_Cone_Selected"
-     image_unselected="Object_Cone"
-     layout="topleft"
-     left_delta="29"
-     name="ToolCone"
-     tool_tip="Cone"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Hemi_Cone"
-     image_disabled_selected="Object_Hemi_Cone"
-     image_selected="Object_Hemi_Cone_Selected"
-     image_unselected="Object_Hemi_Cone"
-     layout="topleft"
-     left_delta="29"
-     name="ToolHemiCone"
-     tool_tip="Hemicone"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Sphere"
-     image_disabled_selected="Object_Sphere"
-     image_selected="Object_Sphere_Selected"
-     image_unselected="Object_Sphere"
-     layout="topleft"
-     left_delta="29"
-     name="ToolSphere"
-     tool_tip="Sphere"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Hemi_Sphere"
-     image_disabled_selected="Object_Hemi_Sphere"
-     image_selected="Object_Hemi_Sphere_Selected"
-     image_unselected="Object_Hemi_Sphere"
-     layout="topleft"
-     left_delta="29"
-     name="ToolHemiSphere"
-     tool_tip="Hemisphere"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Torus"
-     image_disabled_selected="Object_Torus"
-     image_selected="Object_Torus_Selected"
-     image_unselected="Object_Torus"
-     layout="topleft"
-     left="10"
-     name="ToolTorus"
-     tool_tip="Torus"
-     top="77"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Tube"
-     image_disabled_selected="Object_Tube"
-     image_selected="Object_Tube_Selected"
-     image_unselected="Object_Tube"
-     layout="topleft"
-     left_delta="29"
-     name="ToolTube"
-     tool_tip="Tube"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Ring"
-     image_disabled_selected="Object_Ring"
-     image_selected="Object_Ring_Selected"
-     image_unselected="Object_Ring"
-     layout="topleft"
-     left_delta="29"
-     name="ToolRing"
-     tool_tip="Ring"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Tree"
-     image_disabled_selected="Object_Tree"
-     image_selected="Object_Tree_Selected"
-     image_unselected="Object_Tree"
-     layout="topleft"
-     left_delta="29"
-     name="ToolTree"
-     tool_tip="Tree"
-     top_delta="0"
-     width="20" />
-    <button
-     follows="left|top"
-     height="20"
-     image_disabled="Object_Grass"
-     image_disabled_selected="Object_Grass"
-     image_selected="Object_Grass_Selected"
-     image_unselected="Object_Grass"
-     image_overlay_color="Red"
-     layout="topleft"
-     left_delta="29"
-     name="ToolGrass"
-     tool_tip="Grass"
-     top_delta="0"
-     width="20" />
-    <check_box
-     control_name="CreateToolKeepSelected"
-     height="19"
-     label="Keep Tool selected"
-     layout="topleft"
-     left="4"
-     name="checkbox sticky"
-     top="101"
-     width="128" />
-    <check_box
-     control_name="CreateToolCopySelection"
-     height="19"
-     label="Copy selection"
-     layout="topleft"
-     left_delta="0"
-     name="checkbox copy selection"
-     top_delta="15"
-     width="134" />
-    <check_box
-     control_name="CreateToolCopyCenters"
-     height="19"
-     initial_value="true"
-     label="Center Copy"
-     layout="topleft"
-     left_delta="18"
-     name="checkbox copy centers"
-     top="132"
-     width="134" />
-    <check_box
-     control_name="CreateToolCopyRotates"
-     height="19"
-     label="Rotate Copy"
-     layout="topleft"
-     left_delta="0"
-     name="checkbox copy rotates"
-     top_delta="16"
-     width="134" />
-    <radio_group
-     height="105"
-     layout="topleft"
-     left="4"
-     name="land_radio_group"
-     top="54"
-     width="114">
-        <radio_item
-         height="19"
-         label="Select Land"
-         layout="topleft"
-         left="0"
-         name="radio select land"
-         top="-106"
-         width="134" />
-        <radio_item
-         height="19"
-         label="Flatten"
-         layout="topleft"
-         left_delta="0"
-         name="radio flatten"
-         top_delta="15"
-         width="114" />
-        <radio_item
-         height="19"
-         label="Raise"
-         layout="topleft"
-         left_delta="0"
-         name="radio raise"
-         top_delta="15"
-         width="114" />
-        <radio_item
-         height="19"
-         label="Lower"
-         layout="topleft"
-         left_delta="0"
-         name="radio lower"
-         top_delta="15"
-         width="114" />
-        <radio_item
-         height="19"
-         label="Smooth"
-         layout="topleft"
-         left_delta="0"
-         name="radio smooth"
-         top_delta="15"
-         width="114" />
-        <radio_item
-         height="19"
-         label="Roughen"
-         layout="topleft"
-         left_delta="0"
-         name="radio noise"
-         top_delta="15"
-         width="114" />
-        <radio_item
-         height="19"
-         label="Revert"
-         layout="topleft"
-         left_delta="0"
-         name="radio revert"
-         top_delta="15"
-         width="114" />
-		 <radio_group.commit_callback
-	     function="BuildTool.commitRadioLand"/>
-    </radio_group>
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="12"
-     layout="topleft"
-     left="135"
-     name="Bulldozer:"
-     top="57"
-     width="100">
-        Bulldozer:
-    </text>
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="12"
-     layout="topleft"
-     name="Dozer Size:"
-     left="135"
-     top_pad="5"
-     width="50">
-        Size
-    </text>
-    <slider_bar
-	 control_name ="LandBrushSize"
-     follows="left|top"
-     height="19"
-     initial_value="2.0"
-     layout="topleft"
-     max_val="11"
-     min_val="1"
-     left_pad="0"
-     name="slider brush size"
-     top_delta="-3"
-     width="80" />
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="12"
-     layout="topleft"
-     name="Strength:"
-     left="135"
-     top_pad="5"
-     width="50">
-        Strength
-    </text>
-    <slider_bar
-     follows="left|top"
-     height="19"
-     left_pad="0"
-     initial_value="0.00"
-     layout="topleft"
-     max_val="2"
-     min_val="-1"
-     name="slider force"
-     top_delta="-3"
-     width="80" >
-	  <slider_bar.commit_callback
-	     function="BuildTool.LandBrushForce"/>
-    </slider_bar>
-    <button
-     follows="left|top"
-     height="23"
-     label="Apply"
-     label_selected="Apply"
-     top_pad="5"
-     layout="topleft"
-     left="135"
-     name="button apply to selection"
-     tool_tip="Modify selected land"
-     width="82">
-	  <button.commit_callback
-	     function="BuildTool.applyToSelection"/>
-    </button>
-	<text
-	 text_color="LtGray_50"
-	  type="string"
-	  length="1"
-	  height="10"
-	  follows="left|top"
-	  halign="right"
-	  layout="topleft"
-	  right="-10"
-	  name="obj_count"
-	  top_pad="5"
-	  width="143">
-		Objects: [COUNT]
-	</text>
-	<text
-    text_color="LtGray_50"
-     type="string"
-     length="1"
-	height="10" 
-     follows="left|top"
-     halign="right"
-     layout="topleft"
-     right="-10"
-     name="prim_count"
-     width="143">
-		Prims: [COUNT]
-	</text>
-    <text
-    text_color="LtGray_50"
-     type="string"
-     length="1"
-     height="10"
-     follows="left|top"
-     halign="right"
-     layout="topleft"
-     right="-120"
-     name="linked_set_count"
-     top="144"
-     width="80">
-        Linked Sets: [COUNT]
-    </text>
-    <text
-    text_color="LtGray_50"
-     type="string"
-     length="1"
-     height="10"
-     follows="left|top"
-     halign="right"
-     layout="topleft"
-     top_delta="0"
-     right="-8"
-     name="linked_set_cost"
-     tool_tip="Cost of currently selected linked sets as [prims],[physics complexity]" 
-     width="80">
-        Cost: [COST] / [PHYSICS]
-    </text>
-    <text
-    text_color="LtGray_50"
-     type="string"
-     length="1"
-     follows="left|top"
-     halign="right"
-     layout="topleft"
-     top_pad="5"
-     right="-120"
-     name="object_count"
-     width="80">
-        Objects: [COUNT]
-    </text>
-    <text
-    text_color="LtGray_50"
-     type="string"
-     length="1"
-     follows="left|top"
-     halign="right"
-     layout="topleft"
-	 top_delta="0"
-     right="-8"
-     name="object_cost"
-     tool_tip="Cost of currently selected objects as [prims] / [physics complexity]"
-     width="80">
-        Cost: [COST] / [PHYSICS]
-    </text>
-    <!-- <text -->
-    <!-- text_color="LtGray_50" -->
-    <!--  type="string" -->
-    <!--  length="1" -->
-    <!--  height="10" -->
-    <!--  follows="left|top" -->
-    <!--  halign="right" -->
-    <!--  layout="topleft" -->
-    <!--  right="-10" -->
-    <!--  name="obj_count" -->
-    <!--  top_pad="5" -->
-    <!--  width="143"> -->
-    <!--     Objects: [COUNT] -->
-    <!-- </text> -->
-    <!-- <text -->
-    <!-- text_color="LtGray_50" -->
-    <!--  type="string" -->
-    <!--  length="1" -->
-    <!--  follows="left|top" -->
-    <!--  halign="right" -->
-    <!--  layout="topleft" -->
-    <!--  right="-10" -->
-    <!--  name="prim_count" -->
-    <!--  width="143"> -->
-    <!--     Prims: [COUNT] -->
-    <!-- </text> -->
-    <tab_container
-     follows="left|top"
-     height="410"
-     halign="center"
-     left="0"
-     name="Object Info Tabs"
-     tab_max_width="100"
-     tab_min_width="40"
-     tab_position="top"
-     tab_height="25"
-     top="173"
-     width="295">
-	
-<panel
-	 border="false"
-	 follows="all"
-	 label="General"
-	 layout="topleft"
-	 mouse_opaque="false"
-	 help_topic="toolbox_general_tab"
-	 name="General"
-	 top="16"
-	 width="295">
-	 <panel.string
-	  name="text deed continued">
-		Deed
-	 </panel.string>
-	<panel.string
-	 name="text deed">
-		Deed
-	</panel.string>
-            <panel.string
-             name="text modify info 1">
-                You can modify this object
-            </panel.string>
-            <panel.string
-             name="text modify info 2">
-                You can modify these objects
-            </panel.string>
-            <panel.string
-             name="text modify info 3">
-                You can't modify this object
-            </panel.string>
-            <panel.string
-             name="text modify info 4">
-                You can't modify these objects
-            </panel.string>
-            <panel.string
-             name="text modify warning">
-                You must select entire object to set permissions
-            </panel.string>
-            <panel.string
-             name="Cost Default">
-                Price: L$
-            </panel.string>
-            <panel.string
-             name="Cost Total">
-                Total Price: L$
-            </panel.string>
-            <panel.string
-             name="Cost Per Unit">
-                Price Per: L$
-            </panel.string>
-            <panel.string
-             name="Cost Mixed">
-                Mixed Price
-            </panel.string>
-            <panel.string
-             name="Sale Mixed">
-                Mixed Sale
-            </panel.string>
-            <text
-             follows="left|top"
-             height="10"
-             left="10"
-             name="Name:"
-             top="5"
-             width="90">
-                Name:
-            </text>
-            <line_editor
-             follows="left|top|right"
-             height="19"
-             left_pad="0"
-             max_length_bytes="63"
-             name="Object Name"
-             select_on_focus="true"
-             top_delta="0"
-             width="170" />
-            <text
-             follows="left|top"
-             height="10"
-             left="10"
-             name="Description:"
-             top_pad="3"
-             width="90">
-                Description:
-            </text>
-            <line_editor
-             follows="left|top|right"
-             height="19"
-             left_pad="0"
-             max_length_bytes="127"
-             name="Object Description"
-             select_on_focus="true"
-             top_delta="0"
-             width="170" />
-            <text
-             type="string"
-             left="10"
-             length="1"
-             follows="left|top"
-             height="19"
-             layout="topleft"
-             name="Creator:"
-             top_pad="7"
-             width="90">
-                Creator:
-            </text>
-            <!-- *NOTE: Intentionally wide for long names -->
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             left_pad="0"
-             height="20"
-             layout="topleft"
-             name="Creator Name"
-             top_delta="0"
-             translate="false"
-             width="190"
-             word_wrap="true"
-             use_ellipses="true">
-                TestString PleaseIgnore (please.ignore)
-            </text>
-            <text
-             type="string"
-             length="1"
-             left="10"
-             follows="left|top"
-             height="19"
-             layout="topleft"
-             name="Owner:"
-             top_pad="13"
-             width="90">
-                Owner:
-            </text>
-            <!-- *NOTE: Intentionally wide for long names -->
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="20"
-             layout="topleft"
-             name="Owner Name"
-             left_pad="0"
-             top_delta="0"
-             translate="false"
-             width="190"
-             word_wrap="true"
-             use_ellipses="true">
-                TestString PleaseIgnore (please.ignore)
-            </text>
-           <text
-             type="string"
-             length="1"
-             follows="left|top"
-             layout="topleft"
-             left="10"
-             height="18"
-             name="Group:"
-             top_pad="17"
-             width="75">
-                Group:
-            </text>
-            <name_box
-             follows="left|top"
-             height="18"
-             initial_value="Loading..."
-             layout="topleft"
-             left_pad="23"
-             name="Group Name Proxy"
-             width="142" />
-            <button
-			 follows="top|left"
-			 height="23"
-			 image_overlay="Edit_Wrench"
-			 layout="topleft"
-			 left_pad="13"
-			 name="button set group"
-			 tab_stop="false"
-			 tool_tip="Choose a group to share this object's permissions"
-			 width="23" />
-            <check_box
-             height="19"
-             follows="left|top"
-             label="Share"
-             layout="topleft"
-             name="checkbox share with group"
-             tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
-             top_pad="10"
-             left="100"
-             width="87" />
-            <button
-             follows="top|left"
-             height="23"
-             label="Deed"
-             label_selected="Deed"
-             layout="topleft"
-             name="button deed"
-             left_pad="19"
-             tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
-             width="80" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             top_pad="10"
-             left="10"
-             name="label click action"
-             width="118">
-                Click to:
-            </text>
-            <combo_box
-             follows="left|top"
-             height="23"
-             layout="topleft"
-             name="clickaction"
-             width="148"
-             left_pad="10">
-                <combo_box.item
-                 label="Touch  (default)"
-                 name="Touch/grab(default)"
-                 value="Touch" />
-                <combo_box.item
-                 label="Sit on object"
-                 name="Sitonobject"
-                 value="Sit" />
-                <combo_box.item
-                 label="Buy object"
-                 name="Buyobject"
-                 value="Buy" />
-                <combo_box.item
-                 label="Pay object"
-                 name="Payobject"
-                 value="Pay" />
-                <combo_box.item
-                 label="Open"
-                 name="Open"
-                 value="Open" />
-				 <combo_box.item
-                 label="Zoom"
-                 name="Zoom"
-                 value="Zoom" />
-            </combo_box>
-            <check_box
-             height="23"
-             label="For Sale:"
-             layout="topleft"
-             name="checkbox for sale"
-             left="7"
-             width="100" />
-<!-- NEW SALE TYPE COMBO BOX -->
-      <combo_box
-            left_pad="10"
-            layout="topleft"
-            follows="left|top"
-            allow_text_entry="false"
-            height="23"
-            initial_value="2"
-            max_chars="20"
-            mouse_opaque="true"
-            name="sale type"
-            width="168">
-        <combo_box.item
-           name="Copy"
-           label="Copy"
-           value="2" />
-        <combo_box.item
-           name="Contents"
-           label="Contents"
-           value="3" />
-        <combo_box.item
-           name="Original"
-           label="Original"
-           value="1" />
-      </combo_box>
-<!-- NEW PRICE SPINNER
-Objects are allowed to be for sale for L$0 to invoke buy UI behavior
-even though the user gets a free copy.
--->
-    <spinner
-        follows="left|top"
-        decimal_digits="0"
-        increment="1"
-        top_pad="8"
-        left="118"
-        control_name="Edit Cost"
-        name="Edit Cost"
-        label="Price: L$"
-        label_width="65"
-        width="165"
-        min_val="0"
-        height="20"
-        max_val="999999999" />
-      <check_box
-	   height="15"
-	   width="110"
-	   top_pad="5"
-	   label="Show in search"
-       layout="topleft"
-	   left="100"
-       name="search_check"
-       tool_tip="Let people see this object in search results" />
-		<panel
-         border="false"
-         follows="left|top"
-         layout="topleft"
-         mouse_opaque="false"
-         background_visible="true"
-         bg_alpha_color="DkGray"
-         name="perms_build"
-         left="0"
-         top_pad="4"
-         height="105"
-         width="290">
-            <text
-             type="string"
-             length="1"
-             left="10"
-             top_pad="9"
-             text_color="EmphasisColor"
-             height="16"
-             follows="left|top|right"
-             layout="topleft"
-             name="perm_modify"
-             width="264">
-                You can modify this object
-            </text>
-            <text
-               type="string"
-               follows="left|top"
-               name="Anyone can:"
-               width="250"
-               left="10">
-                 Anyone:
-            </text>
-            <check_box
-             height="19"
-             label="Move"
-             layout="topleft"
-             name="checkbox allow everyone move"
-             left="10"
-             width="85" />
-            <check_box
-             height="19"
-             label="Copy"
-             layout="topleft"
-             left_pad="0"
-             name="checkbox allow everyone copy"
-             width="90" />
-            <text
-               type="string"
-               follows="left|top"
-               height="19"
-               name="Next owner can:"
-               width="250"
-               left="10">
-                  Next owner:
-            </text>
-            <check_box
-             follows="left|top|right"
-             label="Modify"
-             layout="topleft"
-             left="10"
-             name="checkbox next owner can modify"
-             width="85" />
-            <check_box
-             follows="left|top|right"
-             height="19"
-             label="Copy"
-             layout="topleft"
-             left_pad="0"
-             name="checkbox next owner can copy"
-             width="80" />
-            <check_box
-             follows="left|top|right"
-             height="19"
-             label="Transfer"
-             layout="topleft"
-             name="checkbox next owner can transfer"
-             left_pad="0"
-             top_delta="0"
-             tool_tip="Next owner can give away or resell this object"
-             width="100" />
-<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, 
-     but that's OK, this is used only for debugging. -->
-            <text
-             type="string"
-             text_color="EmphasisColor"
-             length="1"
-             top="9"
-             follows="left|top"
-             layout="topleft"
-             left="230"
-             name="B:"
-             height="10"
-             width="80">
-                B:
-            </text>
-            <text
-             type="string"
-             text_color="White"
-             length="1"
-             follows="left|top"
-             layout="topleft"
-             left_delta="0"
-             top_pad="2"
-             name="O:"
-             height="10"
-             width="80">
-                O:
-            </text>
-            <text
-             type="string"
-             text_color="EmphasisColor"
-             length="1"
-             follows="left|top"
-             layout="topleft"
-             left_delta="0"
-             top_pad="2"
-             name="G:"
-             height="10"
-             width="80">
-                G:
-            </text>
-            <text
-             type="string"
-             text_color="White"
-             length="1"
-             follows="left|top"
-             left_delta="0"
-             top_pad="2"
-             layout="topleft"
-             name="E:"
-             height="10"
-             width="80">
-                E:
-            </text>
-            <text
-             type="string"
-             text_color="EmphasisColor"
-             length="1"
-             follows="left|top"
-             layout="topleft"
-             left_delta="0"
-             top_pad="2"
-             name="N:"
-             height="10"
-             width="80">
-                N:
-            </text>
-            <text
-             type="string"
-             text_color="White"
-             length="1"
-             follows="left|top"
-             layout="topleft"
-             left_delta="0"
-             top_pad="2"
-             name="F:"
-             height="10"
-             width="80">
-                F:
-            </text>
-        </panel>
-      </panel>
-      <!-- Object tab -->
-      <panel
-         border="false"
-         follows="all"
-         height="567"
-         label="Object"
-         layout="topleft"
-         left_delta="0"
-         mouse_opaque="false"
-         help_topic="toolbox_object_tab"
-         name="Object"
-         top="16"
-         width="295">
-            <check_box
-             height="19"
-             label="Locked"
-             layout="topleft"
-             name="checkbox locked"
-             tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."
-             top_pad="5"
-             left="10"
-             width="123" />
-            <check_box
-             height="19"
-             label="Physical"
-             layout="topleft"
-             name="Physical Checkbox Ctrl"
-             tool_tip="Allows object to be pushed and affected by gravity"
-             top_pad="0"
-             width="123" />
-            <check_box
-             height="19"
-             label="Temporary"
-             layout="topleft"
-             name="Temporary Checkbox Ctrl"
-             tool_tip="Causes object to be deleted 1 minute after creation"
-             top_pad="0"
-             width="123" />
-            <check_box
-             height="19"
-             label="Phantom"
-             layout="topleft"
-             name="Phantom Checkbox Ctrl"
-             tool_tip="Causes object to not collide with other objects or avatars"
-             top_pad="0"
-             width="123" />
-
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             name="label position"
-             top_pad="10"
-             width="121">
-                Position (meters)
-            </text>
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="X"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="512"
-             min_val="-256"
-             name="Pos X"
-             text_enabled_color="1 0 0.3 .7"
-             top_pad="5"
-             width="87" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Y"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="512"
-             min_val="-256"
-             name="Pos Y"
-             text_enabled_color="EmphasisColor"
-             top_pad="3"
-             width="87" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Z"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="4096"
-             name="Pos Z"
-             text_enabled_color="0 0.8 1 .65"
-             top_pad="3"
-             width="87" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="label size"
-             top_pad="6"
-             width="121">
-                Size (meters)
-            </text>
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="X"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="64"
-             min_val="0.01"
-             name="Scale X"
-             text_enabled_color="1 1 1 1"
-             top_pad="5"
-             width="87" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Y"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="64"
-             min_val="0.01"
-             name="Scale Y"
-             text_enabled_color="1 1 1 1"
-             top_pad="3"
-             width="87" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Z"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="64"
-             min_val="0.01"
-             name="Scale Z"
-             text_enabled_color="1 1 1 1"
-             top_pad="3"
-             width="87" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="label rotation"
-             top_pad="10"
-             width="121">
-                Rotation (degrees)
-            </text>
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="1"
-             initial_value="0"
-             label="X"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="9999"
-             min_val="-9999"
-             name="Rot X"
-             text_enabled_color="1 1 1 1"
-             top_pad="5"
-             width="87" />
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="1"
-             initial_value="0"
-             label="Y"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="9999"
-             min_val="-9999"
-             name="Rot Y"
-             text_enabled_color="1 1 1 1"
-             top_pad="3"
-             width="87" />
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="1"
-             initial_value="0"
-             label="Z"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="9999"
-             min_val="-9999"
-             name="Rot Z"
-             text_enabled_color="1 1 1 1"
-             top_pad="3"
-             width="87" />
- <!--           <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="125"
-             name="label basetype"
-             top="5"
-             width="150">
-                Prim Type
-            </text>-->
-            <combo_box
-             height="19"
-             layout="topleft"
-             name="comboBaseType"
-             top="6"
-             left="125"
-             width="150">
-                <combo_box.item
-                 label="Box"
-                 name="Box"
-                 value="Box" />
-                <combo_box.item
-                 label="Cylinder"
-                 name="Cylinder"
-                 value="Cylinder" />
-                <combo_box.item
-                 label="Prism"
-                 name="Prism"
-                 value="Prism" />
-                <combo_box.item
-                 label="Sphere"
-                 name="Sphere"
-                 value="Sphere" />
-                <combo_box.item
-                 label="Torus"
-                 name="Torus"
-                 value="Torus" />
-                <combo_box.item
-                 label="Tube"
-                 name="Tube"
-                 value="Tube" />
-                <combo_box.item
-                 label="Ring"
-                 name="Ring"
-                 value="Ring" />
-                <combo_box.item
-                 label="Sculpted"
-                 name="Sculpted"
-                 value="Sculpted" />
-            </combo_box>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="text cut"
-             top_pad="5"
-             width="150">
-                Path Cut (begin/end)
-            </text>
-            <spinner
-             follows="left|top"
-             height="16"
-             increment="0.025"
-             initial_value="0"
-             label="B"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="0.98"
-             name="cut begin"
-             top_pad="4"
-             width="68" />
-            <spinner
-             follows="left|top"
-             height="16"
-             increment="0.025"
-             initial_value="1"
-             label="E"
-             label_width="10"
-             layout="topleft"
-             left_pad="10"
-             min_val="0.02"
-             name="cut end"
-             top_delta="0"
-             width="68" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="125"
-             name="text hollow"
-             top_pad="6"
-             width="68">
-                Hollow
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_pad="10"
-             name="text skew"
-             width="63">
-                Skew
-            </text>
-            <spinner
-             decimal_digits="1"
-             follows="left|top"
-             height="19"
-             increment="5"
-             initial_value="0"
-             layout="topleft"
-             left="125"
-             max_val="95"
-             name="Scale 1"
-             top_pad="4"
-             width="68" />
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             layout="topleft"
-             left_pad="10"
-             max_val="0.95"
-             min_val="-0.95"
-             name="Skew"
-             top_delta="0"
-             width="68" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="15"
-             layout="topleft"
-             left="125"
-             name="Hollow Shape"
-             top_pad="4"
-             width="150">
-                Hollow Shape
-            </text>
-            <combo_box
-             height="23"
-             layout="topleft"
-             left_delta="0"
-             name="hole"
-             top_pad="-2"
-             width="150">
-                <combo_box.item
-                 label="Default"
-                 name="Default"
-                 value="Default" />
-                <combo_box.item
-                 label="Circle"
-                 name="Circle"
-                 value="Circle" />
-                <combo_box.item
-                 label="Square"
-                 name="Square"
-                 value="Square" />
-                <combo_box.item
-                 label="Triangle"
-                 name="Triangle"
-                 value="Triangle" />
-            </combo_box>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="text twist"
-             top_pad="5"
-             width="150">
-                Twist (begin/end)
-            </text>
-            <spinner
-             decimal_digits="0"
-             follows="left|top"
-             height="19"
-             increment="9"
-             initial_value="0"
-             label="B"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="180"
-             min_val="-180"
-             name="Twist Begin"
-             top_pad="4"
-             width="68" />
-            <spinner
-             decimal_digits="0"
-             follows="left|top"
-             height="19"
-             increment="9"
-             initial_value="0"
-             label="E"
-             label_width="10"
-             layout="topleft"
-             left_pad="10"
-             max_val="180"
-             min_val="-180"
-             name="Twist End"
-             top_delta="0"
-             width="68" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="125"
-             name="scale_taper"
-             top_pad="3"
-             width="150">
-                Taper
-            </text>
-            <text
-			 visible="false"
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="scale_hole"
-             top_delta="0"
-             width="150">
-                Hole Size
-            </text>
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             label="X"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             min_val="-1"
-             name="Taper Scale X"
-             top_pad="4"
-             width="68" />
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             label="Y"
-             label_width="10"
-             layout="topleft"
-             left_pad="10"
-             min_val="-1"
-             name="Taper Scale Y"
-             top_delta="0"
-             width="68" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="125"
-             name="text topshear"
-             top_pad="3"
-             width="141">
-                Top Shear
-            </text>
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             label="X"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="0.5"
-             min_val="-0.5"
-             name="Shear X"
-             top_pad="4"
-             width="68" />
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             label="Y"
-             label_width="10"
-             layout="topleft"
-             left_pad="10"
-             max_val="0.5"
-             min_val="-0.5"
-             name="Shear Y"
-             top_delta="0"
-             width="68" />
-            <text
-			 visible="false"
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="125"
-             name="advanced_cut"
-             top_pad="3"
-             width="150">
-                Profile Cut (begin/end)
-            </text>
-            <text
-			 visible="false"
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="advanced_dimple"
-             top_delta="0"
-             width="150">
-                Dimple (begin/end)
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="advanced_slice"
-             top_delta="0"
-             width="150">
-                Slice (begin/end)
-            </text>
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.025"
-             initial_value="0"
-             label="B"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             max_val="0.95"
-             name="Path Limit Begin"
-             top_pad="3"
-             width="68" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.025"
-             initial_value="1"
-             label="E"
-             label_width="10"
-             layout="topleft"
-             left_pad="10"
-             min_val="0.05"
-             name="Path Limit End"
-             top_delta="0"
-             width="68" />
-            <text
-			 visible="false"
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="125"
-             name="text taper2"
-             top_pad="3"
-             width="150">
-                Taper
-            </text>
-            <spinner
-			 visible="false"
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             label="X"
-             label_width="10"
-             layout="topleft"
-             left_delta="0"
-             min_val="-1"
-             name="Taper X"
-             top_pad="3"
-             width="68" />
-            <spinner
-			 visible="false"
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             label="Y"
-             label_width="10"
-             layout="topleft"
-             left_pad="10"
-             min_val="-1"
-             name="Taper Y"
-             top_delta="0"
-             width="68" />
-            <text
-			 visible="false"
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="125"
-             name="text radius delta"
-             top_pad="2"
-             width="78">
-                Radius
-            </text>
-            <text
-			 visible="false"
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="78"
-             name="text revolutions"
-             width="68">
-                Revolutions
-            </text>
-            <spinner
-			 visible="false"
-             follows="left|top"
-             height="19"
-             increment="0.05"
-             initial_value="0"
-             layout="topleft"
-             left="125"
-             min_val="-1"
-             name="Radius Offset"
-             top_pad="4"
-             width="68" />
-            <spinner
-			 visible="false"
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             initial_value="1"
-             layout="topleft"
-             left_pad="10"
-             max_val="4"
-             min_val="1"
-             name="Revolutions"
-             top_delta="0"
-             width="68" />
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             follows="left|top"
-             height="141"
-             label="Sculpt Texture"
-             layout="topleft"
-             left="125"
-             name="sculpt texture control"
-             tool_tip="Click to choose a picture"
-             top="70"
-             visible="false"
-             width="145" />
-            <check_box
-             height="19"
-             label="Mirror"
-             layout="topleft"
-             left_delta="0"
-             name="sculpt mirror control"
-             tool_tip="Flips sculpted prim along the X axis"
-             top_pad="8"
-             visible="false"
-             width="130" />
-            <check_box
-             height="19"
-             label="Inside-out"
-             layout="topleft"
-             left_delta="0"
-             name="sculpt invert control"
-             tool_tip="Inverts the sculpted prims normals, making it appear inside-out"
-             top_pad="4"
-             visible="false"
-             width="121" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="label sculpt type"
-             top_pad="10"
-             visible="false"
-             width="130">
-                Stitching type
-            </text>
-            <combo_box
-             height="19"
-             layout="topleft"
-             left_delta="0"
-             name="sculpt type control"
-             top_pad="4"
-             visible="false"
-             width="150">
-                <combo_box.item
-                 label="(none)"
-                 name="None"
-                 value="None" />
-                <combo_box.item
-                 label="Sphere"
-                 name="Sphere"
-                 value="Sphere" />
-                <combo_box.item
-                 label="Torus"
-                 name="Torus"
-                 value="Torus" />
-                <combo_box.item
-                 label="Plane"
-                 name="Plane"
-                 value="Plane" />
-                <combo_box.item
-                 label="Cylinder"
-                 name="Cylinder"
-                 value="Cylinder" />
-              <combo_box.item
-                 label="Mesh"
-                 name="Mesh"
-                 value="Mesh" />
-            </combo_box>
-        </panel>
-        <panel
-         border="false"
-         follows="all"
-         height="367"
-         label="Features"
-         layout="topleft"
-         left_delta="0"
-         mouse_opaque="false"
-         help_topic="toolbox_features_tab"
-         name="Features"
-         top_delta="0"
-         width="295">
-	<panel.string name="None">None</panel.string>
-	<panel.string name="Prim">Prim</panel.string>
-	<panel.string name="Convex Hull">Convex Hull</panel.string>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="20"
-             layout="topleft"
-             left="10"
-             name="select_single"
-             top="5"
-             width="252"
-             word_wrap="true">
-                Select only one primitive to edit features.
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="10"
-             name="edit_object"
-             top="5"
-             width="252">
-                Edit object features:
-            </text>
-            <check_box
-             height="19"
-             label="Flexible Path"
-             layout="topleft"
-             left="10"
-             name="Flexible1D Checkbox Ctrl"
-             tool_tip="Allows object to flex about the Z axis (Client-side only)"
-             top_pad="20"
-             width="121" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="1"
-             initial_value="2"
-             label="Softness"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="3"
-             name="FlexNumSections"
-             top_pad="10"
-             width="128" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.5"
-             initial_value="0.3"
-             label="Gravity"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="10"
-             min_val="-10"
-             name="FlexGravity"
-             top_pad="4"
-             width="128" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.5"
-             initial_value="2"
-             label="Drag"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="10"
-             name="FlexFriction"
-             top_pad="4"
-             width="128" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.5"
-             initial_value="0"
-             label="Wind"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="10"
-             name="FlexWind"
-             top_pad="4"
-             width="128" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.5"
-             initial_value="1"
-             label="Tension"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="10"
-             name="FlexTension"
-             top_pad="4"
-             width="128" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Force X"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="10"
-             min_val="-10"
-             name="FlexForceX"
-             top_pad="4"
-             width="128" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Force Y"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="10"
-             min_val="-10"
-             name="FlexForceY"
-             top_pad="4"
-             width="128" />
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Force Z"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="10"
-             min_val="-10"
-             name="FlexForceZ"
-             top_pad="4"
-             width="128" />
-
-            <check_box
-             height="16"
-             label="Light"
-             layout="topleft"
-             left="10"
-             name="Light Checkbox Ctrl"
-             tool_tip="Causes object to emit light"
-             top_pad="15"
-             width="60" />
-            <color_swatch
-             can_apply_immediately="true"
-             color="0.5 0.5 0.5 1"
-	     border.border_thickness="0"
-             follows="left|top"
-             height="50"
-             layout="topleft"
-             left_pad="10"
-             top_pad="-17"
-             name="colorswatch"
-             tool_tip="Click to open color picker"
-             width="40" />
-         <texture_picker
-            allow_no_texture="true"
-            top_delta="0"
-            can_apply_immediately="true"
-            default_image_name="Default"
-            follows="left|top"
-            height="48"
-            label=""
-            left_delta="57"
-            mouse_opaque="true"
-            name="light texture control"
-            tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"
-            width="32" />
-          <spinner
-             follows="left|top"
-             height="19"
-             initial_value="0.5"
-             label="Intensity"
-             label_width="70"
-             layout="topleft"
-             left="10"
-             name="Light Intensity"
-             top_pad="3"
-             width="128" />
-          <spinner bottom_delta="0"
-                   decimal_digits="3"
-                   follows="left|top"
-                   height="16"
-                   increment="0.1"
-                   initial_value="0.5"
-                   label="FOV"
-                   label_width="55"
-                   left="144"
-                   max_val="3"
-                   min_val="0"
-                   mouse_opaque="true"
-                   name="Light FOV"
-                   width="120" />
-          <spinner follows="left|top"
-                   height="19"
-                   initial_value="5"
-                   label="Radius"
-                   label_width="70"
-                   layout="topleft"
-                   left="10"
-                   max_val="20"
-                   name="Light Radius"
-                   top_pad="3"
-                   width="128" />
-          <spinner bottom_delta="0"
-                   decimal_digits="3"
-                   follows="left|top"
-                   height="16"
-                   increment="0.5"
-                   initial_value="0.5"
-                   label="Focus"
-                   label_width="55"
-                   left="144"
-                   max_val="20"
-                   min_val="-20"
-                   mouse_opaque="true"
-                   name="Light Focus"
-                   width="120" />
-          <spinner follows="left|top"
-                   height="19"
-                   increment="0.25"
-                   initial_value="1"
-                   label="Falloff"
-                   label_width="70"
-                   layout="topleft"
-                   left="10"
-                   max_val="2"
-                   name="Light Falloff"
-                   top_pad="3"
-                   width="128" />
-          <spinner bottom_delta="0"
-                   decimal_digits="3"
-                   follows="left|top"
-                   height="16"
-                   increment="0.05"
-                   initial_value="1"
-                   label="Ambiance"
-                   label_width="55"
-                   left="144"
-                   max_val="1"
-                   min_val="0"
-                   mouse_opaque="true"
-                   name="Light Ambiance"
-                   width="120" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             name="label physicsshapetype"
-             top="38"
-             width="121">
-                Physics Shape Type:
-            </text>
-			<combo_box
-			   height="19"
-			   top_delta="15" 
-			   layout="topleft"
-			   follows="left|top"
-			   name="Physics Shape Type Combo Ctrl"
-			   tool_tip="Choose the physics shape type"
-			   width="108"/>
-            <combo_box
-             height="19"
-             layout="topleft"
-             name="material"
-             top_pad="5"
-             width="150">
-                <combo_box.item
-                 label="Stone"
-                 name="Stone"
-                 value="Stone" />
-                <combo_box.item
-                 label="Metal"
-                 name="Metal"
-                 value="Metal" />
-                <combo_box.item
-                 label="Glass"
-                 name="Glass"
-                 value="Glass" />
-                <combo_box.item
-                 label="Wood"
-                 name="Wood"
-                 value="Wood" />
-                <combo_box.item
-                 label="Flesh"
-                 name="Flesh"
-                 value="Flesh" />
-                <combo_box.item
-                 label="Plastic"
-                 name="Plastic"
-                 value="Plastic" />
-                <combo_box.item
-                 label="Rubber"
-                 name="Rubber"
-                 value="Rubber" />
-            </combo_box>
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="1"
-             initial_value="1"
-             label="Gravity"
-             label_width="70"
-             layout="topleft"
-             min_val="-1"
-             max_val="28"
-             name="Physics Gravity"
-             top_pad="10"
-             width="132" />
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.1"
-             initial_value="0"
-             label="Friction"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="255"
-             min_val="0"
-             name="Physics Friction"
-             top_pad="4"
-             width="132" />
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.1"
-             initial_value="0"
-             label="Density"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="22587"
-             min_val="1"
-             name="Physics Density"
-             top_pad="4"
-             width="132" />
-
-            <spinner
-             follows="left|top"
-             height="19"
-             increment="0.01"
-             initial_value="0"
-             label="Restitution"
-             label_width="70"
-             layout="topleft"
-             left_delta="0"
-             max_val="1"
-             min_val="0"
-             name="Physics Restitution"
-             top_pad="4"
-             width="132" />
-        </panel>
-         <panel
-         border="false"
-         follows="all"
-         height="367"
-         label="Texture"
-         layout="topleft"
-         left_delta="0"
-         mouse_opaque="false"
-         help_topic="toolbox_texture_tab"
-         name="Texture"
-         top_delta="0"
-         width="295">
-            <panel.string
-             name="string repeats per meter">
-                Repeats Per Meter
-            </panel.string>
-            <panel.string
-             name="string repeats per face">
-                Repeats Per Face
-            </panel.string>
-            <texture_picker
-             can_apply_immediately="true"
-             default_image_name="Default"
-             fallback_image="locked_image.j2c"
-             follows="left|top"
-             height="80"
-             label="Texture"
-             layout="topleft"
-             left="10"
-             name="texture control"
-             tool_tip="Click to choose a picture"
-             top="8"
-             width="64" />
-            <color_swatch
-             can_apply_immediately="true"
-             follows="left|top"
-             height="80"
-             label="Color"
-             layout="topleft"
-             left_pad="15"
-             name="colorswatch"
-             tool_tip="Click to open color picker"
-             top_delta="0"
-             width="64" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_pad="15"
-             name="color trans"
-             text_readonly_color="LabelDisabledColor"
-             top="6"
-             width="110">
-                Transparency %
-            </text>
-            <spinner
-             decimal_digits="0"
-             follows="left|top"
-             height="19"
-             increment="2"
-             initial_value="0"
-             layout="topleft"
-             left_delta="0"
-             max_val="100"
-             name="ColorTrans"
-             top_pad="4"
-             width="80" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_delta="0"
-             name="glow label"
-             text_readonly_color="LabelDisabledColor"
-             top_pad="8"
-             width="80">
-                Glow
-            </text>
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             initial_value="0"
-             layout="topleft"
-             left_delta="0"
-             name="glow"
-             top_pad="4"
-             width="80" />
-            <check_box
-             height="19"
-             label="Full Bright"
-             layout="topleft"
-             left_delta="-5"
-             name="checkbox fullbright"
-             top_pad="4"
-             width="81" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="10"
-             name="tex gen"
-             text_readonly_color="LabelDisabledColor"
-             top_pad="5"
-             width="90">
-                Mapping
-            </text>
-            <combo_box
-             height="23"
-             layout="topleft"
-             left_delta="0"
-             name="combobox texgen"
-             top_pad="4"
-             width="90">
-                <combo_box.item
-                 label="Default"
-                 name="Default"
-                 value="Default" />
-                <combo_box.item
-                 label="Planar"
-                 name="Planar"
-                 value="Planar" />
-            </combo_box>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             name="label shininess"
-             left_pad="4"
-             text_readonly_color="LabelDisabledColor"
-             top_pad="-37"
-             width="90">
-                Shininess
-            </text>
-            <combo_box
-             height="23"
-             layout="topleft"
-             left_delta="0"
-             name="combobox shininess"
-             top_pad="4"
-             width="90">
-                <combo_box.item
-                 label="None"
-                 name="None"
-                 value="None" />
-                <combo_box.item
-                 label="Low"
-                 name="Low"
-                 value="Low" />
-                <combo_box.item
-                 label="Medium"
-                 name="Medium"
-                 value="Medium" />
-                <combo_box.item
-                 label="High"
-                 name="High"
-                 value="High" />
-            </combo_box>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left_pad="4"
-             name="label bumpiness"
-             text_readonly_color="LabelDisabledColor"
-             top_pad="-37"
-             width="90">
-                Bumpiness
-            </text>
-            <combo_box
-             height="23"
-             layout="topleft"
-             left_delta="0"
-             name="combobox bumpiness"
-             top_pad="4"
-             width="90">
-                <combo_box.item
-                 label="None"
-                 name="None"
-                 value="None" />
-                <combo_box.item
-                 label="Brightness"
-                 name="Brightness"
-                 value="Brightness" />
-                <combo_box.item
-                 label="Darkness"
-                 name="Darkness"
-                 value="Darkness" />
-                <combo_box.item
-                 label="woodgrain"
-                 name="woodgrain"
-                 value="woodgrain" />
-                <combo_box.item
-                 label="bark"
-                 name="bark"
-                 value="bark" />
-                <combo_box.item
-                 label="bricks"
-                 name="bricks"
-                 value="bricks" />
-                <combo_box.item
-                 label="checker"
-                 name="checker"
-                 value="checker" />
-                <combo_box.item
-                 label="concrete"
-                 name="concrete"
-                 value="concrete" />
-                <combo_box.item
-                 label="crustytile"
-                 name="crustytile"
-                 value="crustytile" />
-                <combo_box.item
-                 label="cutstone"
-                 name="cutstone"
-                 value="cutstone" />
-                <combo_box.item
-                 label="discs"
-                 name="discs"
-                 value="discs" />
-                <combo_box.item
-                 label="gravel"
-                 name="gravel"
-                 value="gravel" />
-                <combo_box.item
-                 label="petridish"
-                 name="petridish"
-                 value="petridish" />
-                <combo_box.item
-                 label="siding"
-                 name="siding"
-                 value="siding" />
-                <combo_box.item
-                 label="stonetile"
-                 name="stonetile"
-                 value="stonetile" />
-                <combo_box.item
-                 label="stucco"
-                 name="stucco"
-                 value="stucco" />
-                <combo_box.item
-                 label="suction"
-                 name="suction"
-                 value="suction" />
-                <combo_box.item
-                 label="weave"
-                 name="weave"
-                 value="weave" />
-            </combo_box>
-          <!--
-            <line_editor
-             bevel_style="in"
-             border_style="line"
-             border_thickness="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="10"
-             max_length_bytes="63"
-             name="Home Url"
-             select_on_focus="true"
-             top="134"
-             width="250" />
-            <check_box
-             height="16"
-             label="Media Face"
-             layout="topleft"
-             left_delta="0"
-             name="has media"
-             top_pad="6"
-             width="70" />
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="20"
-             label="Set Media Info"
-             label_selected="Set Media Info"
-             layout="topleft"
-             left_pad="60"
-             name="media info set"
-             top_delta="-4"
-             width="120" />
--->
-            <check_box
-             follows="top|left"
-             height="16"
-             initial_value="false"
-             label="Align planar faces"
-             layout="topleft"
-             left="17"
-             name="checkbox planar align"
-             tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."
-             top_delta="26"
-             width="140" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="10"
-             name="rpt"
-             text_readonly_color="LabelDisabledColor"
-             top_pad="2"
-             width="140">
-                Repeats / Face
-            </text>
-            <spinner
-             follows="left|top"
-             height="19"
-             initial_value="0"
-             label="Horizontal (U)"
-             label_width="125"
-             layout="topleft"
-             left="20"
-             max_val="100"
-             name="TexScaleU"
-             top_pad="5"
-             width="185" />
-            <check_box
-             height="19"
-             label="Flip"
-             layout="topleft"
-             left_pad="5"
-             name="checkbox flip s"
-             top_delta="0"
-             width="70" />
-            <spinner
-             follows="left|top"
-             height="19"
-             initial_value="0"
-             label="Vertical (V)"
-             label_width="125"
-             layout="topleft"
-             left="20"
-             max_val="100"
-             name="TexScaleV"
-             width="185" />
-            <check_box
-             height="19"
-             label="Flip"
-             layout="topleft"
-             left_pad="5"
-             name="checkbox flip t"
-             top_delta="0"
-             width="70" />
-            <spinner
-             decimal_digits="2"
-             follows="left|top"
-             height="19"
-             increment="1"
-             initial_value="0"
-			 label="RotationËš"
-             layout="topleft"
-			 label_width="135"
-             left="10"
-             max_val="9999"
-             min_val="-9999"
-             name="TexRot"
-             width="195" />
-
-            <spinner
-             decimal_digits="1"
-             follows="left|top"
-             height="23"
-             initial_value="1"
-			 label="Repeats / Meter"
-             layout="topleft"
-			 label_width="135"
-             left="10"
-             max_val="10"
-             min_val="0.1"
-             name="rptctrl"
-             width="195" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Apply"
-             label_selected="Apply"
-             layout="topleft"
-             left_pad="5"
-             name="button apply"
-             width="75" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="10"
-             name="tex offset"
-             text_readonly_color="LabelDisabledColor"
-             width="200">
-                Texture Offset
-            </text>
-            <spinner
-             follows="left|top"
-             height="19"
-             initial_value="0"
-             label="Horizontal (U)"
-             label_width="125"
-             layout="topleft"
-             left="20"
-             min_val="-1"
-             name="TexOffsetU"
-             width="185" />
-            <spinner
-             follows="left|top"
-             height="19"
-             initial_value="0"
-             label="Vertical (V)"
-             label_width="125"
-             layout="topleft"
-             left_delta="0"
-             min_val="-1"
-             name="TexOffsetV"
-             top_pad="1"
-             width="185" />
-        <panel
-         border="false"
-         follows="left|top"
-         layout="topleft"
-         mouse_opaque="false"
-         background_visible="true"
-         bg_alpha_color="DkGray"
-         name="Add_Media"
-         left="0"
-         height="47"
-         width="290">
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="18"
-             layout="topleft"
-             left="10"
-             top_pad="3"
-             name="media_tex"
-             width="190">
-              Media
-			</text>
-			<button
-			 follows="top|left"
-			 height="18"
-			 image_selected="AddItem_Press"
-			 image_unselected="AddItem_Off"
-			 image_disabled="AddItem_Disabled"
-			 layout="topleft"
-			 left_pad="0"
-			 name="add_media"
-			 tab_stop="false"
-			 top_delta="0"
-			 tool_tip="Add Media"
-			 width="18">
-				<button.commit_callback
-				function="BuildTool.AddMedia"/>
-			</button>
-			<button
-			 follows="top|left"
-			 height="18"
-			 image_selected="TrashItem_Press"
-			 image_unselected="TrashItem_Off"
-			 layout="topleft"
-			 left_pad="5"
-			 name="delete_media"
-			 tool_tip="Delete this media texture"
-			 top_delta="0"
-			 width="18">
-				<button.commit_callback
-				function="BuildTool.DeleteMedia"/>
-			</button>
-			<button
-			 follows="top|left"
-			 tool_tip="Edit this Media"
-			 height="12"
-             image_disabled="Icon_Gear_Background"
-             image_selected="Icon_Gear_Press"
-             image_unselected="Icon_Gear_Foreground"
-			 layout="topleft"
-			 left_pad="10"
-			 name="edit_media"
-			 top_delta="3"
-			 width="12">
-				<button.commit_callback
-				function="BuildTool.EditMedia"/>
-			</button>
-      <text
-			 follows="left|top|right"
-			 height="9"
-			 layout="topleft"
-			 left="10"
-                         use_ellipses="true"
-			 read_only="true"
-			 name="media_info"
-			 width="280" />
-      <web_browser
-        visible="false"
-        enabled="false"
-        border_visible="true"
-        bottom_delta="0"
-        follows="top|left"
-        left="0"
-        name="title_media"
-        width="4"
-        height="4"
-        start_url="about:blank"
-        decouple_texture_size="true" />
-     <button
-			 follows="right|top"
-			 height="22"
-			 label="Align"
-			 label_selected="Align Media"
-			 layout="topleft"
-			 right="-16"
-			 name="button align"
-			 top_delta="-4"
-			 tool_tip="Align media texture (must load first)"
-			 width="80" />
-		</panel>
-	   </panel>
-       <panel
-         border="false"
-         follows="all"
-         label="Content"
-         layout="topleft"
-         left_delta="0"
-         mouse_opaque="false"
-         help_topic="toolbox_contents_tab"
-         name="Contents"
-         top_delta="0"
-         width="295">
-            <button
-             follows="left|top"
-             height="23"
-             label="New Script"
-             label_selected="New Script"
-             layout="topleft"
-             left="10"
-             name="button new script"
-             top="10"
-             width="134" />
-            <button
-             follows="left|top"
-             height="23"
-             label="Permissions"
-             layout="topleft"
-             left_pad="8"
-             name="button permissions"
-             width="134" />
-            <panel_inventory_object
-             border="true"
-             border_visible="true"
-             bevel_style="in"
-             follows="left|top|right"
-             height="325"
-             layout="topleft"
-             left="10"
-             name="contents_inventory"
-             top="50"
-             width="275" />
-		</panel>
-        </tab_container>
-	<panel
-	 follows="left|top"
-     height="384"
-     layout="topleft"
-     left_delta="0"
-     name="land info panel"
-     top_delta="0"
-     width="295">
-    <text
-         type="string"
-         length="1"
-         font="SansSerifBig"
-         follows="left|top"
-         height="19"
-         layout="topleft"
-         left="20"
-         name="label_parcel_info"
-         top="24"
-         width="240">
-            Parcel Information
-        </text>
-        <text
-         type="string"
-         length="1"
-         follows="left|top"
-         height="19"
-         layout="topleft"
-         left="30"
-         name="label_area_price"
-         top="48"
-         width="150">
-            Price: L$[PRICE] for [AREA] m²
-        </text>
-        <text
-         type="string"
-         length="1"
-         follows="left|top"
-         height="19"
-         layout="topleft"
-         left_delta="0"
-         name="label_area"
-         top_delta="0"
-         width="150">
-            Area: [AREA] m²
-        </text>
-        <button
-         follows="left|top"
-         height="23"
-         label="About Land"
-         label_selected="About Land"
-         layout="topleft"
-         left_delta="0"
-         name="button about land"
-         top_pad="4"
-         width="125" />
-        <check_box
-         control_name="ShowParcelOwners"
-         height="19"
-         label="Show owners"
-         layout="topleft"
-         left_delta="0"
-         name="checkbox show owners"
-         tool_tip="Colorize the parcels according to the type of owner: &#10;&#10;Green = Your land &#10;Aqua = Your group&apos;s land &#10;Red = Owned by others &#10;Yellow = For sale &#10;Purple = For auction &#10;Grey = Public"
-         top_pad="8"
-         width="205" />
-        <text
-         type="string"
-         length="1"
-         font="SansSerifBig"
-         follows="left|top"
-         height="19"
-         layout="topleft"
-         left="20"
-         name="label_parcel_modify"
-         top="152"
-         width="240">
-            Modify Parcel
-        </text>
-        <button
-         follows="left|top"
-         height="23"
-         label="Subdivide"
-         label_selected="Subdivide"
-         layout="topleft"
-         left="30"
-         name="button subdivide land"
-         top="172"
-         width="125" />
-        <button
-         follows="left|top"
-         height="23"
-         label="Join"
-         label_selected="Join"
-         layout="topleft"
-         left_delta="0"
-         name="button join land"
-         top_pad="4"
-         width="125" />
-        <text
-         type="string"
-         length="1"
-         font="SansSerifBig"
-         follows="left|top"
-         height="19"
-         layout="topleft"
-         left="20"
-         name="label_parcel_trans"
-         top="256"
-         width="240">
-            Land Transactions
-        </text>
-        <button
-         follows="left|top"
-         height="23"
-         label="Buy Land"
-         label_selected="Buy Land"
-         layout="topleft"
-         left="30"
-         name="button buy land"
-         top="276"
-         width="125" />
-        <button
-         follows="left|top"
-         height="23"
-         label="Abandon Land"
-         label_selected="Abandon Land"
-         layout="topleft"
-         left_delta="0"
-         name="button abandon land"
-         top_pad="4"
-         width="125" />
- </panel>
-<!-- end of tabs -->
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ follows="left|top|right"
+ height="580"
+ layout="topleft"
+ bg_opaque_image="Window_NoTitle_Foreground"
+ bg_alpha_image="Window_NoTitle_Background"
+ name="toolbox floater"
+ help_topic="toolbox_floater"
+ save_rect="true"
+ short_title="BUILD TOOLS"
+ single_instance="true"
+ save_visibility="true"
+ sound_flags="0"
+ width="295">
+    <floater.string
+     name="status_rotate">
+        Drag colored bands to rotate object
+    </floater.string>
+    <floater.string
+     name="status_scale">
+        Click and drag to stretch selected side
+    </floater.string>
+    <floater.string
+     name="status_move">
+        Drag to move, shift-drag to copy
+    </floater.string>
+    <floater.string
+     name="status_modifyland">
+        Click and hold to modify land
+    </floater.string>
+    <floater.string
+     name="status_camera">
+        Click and drag to move camera
+    </floater.string>
+    <floater.string
+     name="status_grab">
+        Drag to move, Ctrl to lift, Ctrl+Shift to rotate
+    </floater.string>
+    <floater.string
+     name="status_place">
+        Click inworld to build
+    </floater.string>
+    <floater.string
+     name="status_selectland">
+        Click and drag to select land
+    </floater.string>
+    <floater.string
+     name="grid_screen_text">
+        Screen
+    </floater.string>
+    <floater.string
+     name="grid_local_text">
+        Local
+    </floater.string>
+    <floater.string
+     name="grid_world_text">
+        World
+    </floater.string>
+    <floater.string
+     name="grid_reference_text">
+        Reference
+    </floater.string>
+    <floater.string
+     name="grid_attachment_text">
+        Attachment
+    </floater.string>
+    <button
+     follows="left|top"
+     height="25"
+     image_bottom_pad="1"
+     image_overlay="Tool_Zoom"
+     image_selected="PushButton_Selected_Press"
+     layout="topleft"
+     left="10"
+     name="button focus"
+     tool_tip="Focus"
+     width="35">
+	  <button.commit_callback
+	     function="BuildTool.setTool"
+	     parameter="Focus" />
+	</button>
+    <button
+     follows="left|top"
+      height="25"
+     image_bottom_pad="1"
+     image_overlay="Tool_Grab"
+     image_selected="PushButton_Selected_Press"
+     layout="topleft"
+     left_pad="10"
+     name="button move"
+     tool_tip="Move"
+     width="35">
+	  <button.commit_callback
+	     function="BuildTool.setTool"
+	     parameter="Move" />
+	</button>
+    <button
+     follows="left|top"
+     height="25"
+     image_bottom_pad="1"
+     image_overlay="Tool_Face"
+     image_selected="PushButton_Selected_Press"
+     layout="topleft"
+     left_pad="10"
+     name="button edit"
+     tool_tip="Edit"
+     width="35">
+	  <button.commit_callback
+	     function="BuildTool.setTool"
+	     parameter="Edit" />
+	</button>
+    <button
+     follows="left|top"
+      height="25"
+     image_bottom_pad="1"
+     image_overlay="Tool_Create"
+     image_selected="PushButton_Selected_Press"
+     layout="topleft"
+     left_pad="10"
+     name="button create"
+     tool_tip="Create"
+     width="35">
+	  <button.commit_callback
+	     function="BuildTool.setTool"
+	     parameter="Create" />
+	</button>
+    <button
+     follows="left|top"
+      height="25"
+     image_bottom_pad="1"
+     image_overlay="Tool_Dozer"
+     image_selected="PushButton_Selected_Press"
+     layout="topleft"
+     left_pad="10"
+     name="button land"
+     tool_tip="Land"
+     width="35">
+	  <button.commit_callback
+	     function="BuildTool.setTool"
+	     parameter="Land" />
+	</button>
+    <text
+     height="30"
+     word_wrap="true"
+     use_ellipses="true"
+     type="string"
+     text_color="LabelSelectedDisabledColor"
+     length="1"
+     follows="left|top"
+     layout="topleft"
+     left="8"
+     name="text status"
+     top_pad="3"
+     width="285">
+        Drag to move, shift-drag to copy
+    </text>
+   <radio_group
+     layout="topleft"
+     left="10"
+      height="70"
+      top="59"
+     name="focus_radio_group">
+        <radio_item
+         top_pad="6"
+         label="Zoom"
+         layout="topleft"
+         name="radio zoom" />
+        <radio_item
+         top_pad="6"
+         label="Orbit (Ctrl)"
+         layout="topleft"
+         name="radio orbit" />
+        <radio_item
+         top_pad="6"
+         label="Pan (Ctrl+Shift)"
+         layout="topleft"
+         name="radio pan" />
+		 <radio_group.commit_callback
+	     function="BuildTool.commitRadioFocus"/>
+    </radio_group>
+   <slider_bar
+     follows="left|top"
+     height="14"
+     increment="0.01"
+     initial_value="0.125"
+     layout="topleft"
+     max_val="0.5"
+     top_delta="-2"
+     left_delta="100"
+     name="slider zoom"
+     width="134">
+	 <slider_bar.commit_callback
+	     function="BuildTool.commitZoom"/>
+	</slider_bar>
+   <radio_group
+      left="10"
+      height="70"
+      top="59"
+     layout="topleft"
+     name="move_radio_group">
+        <radio_item
+         top_pad="6"
+         label="Move"
+         layout="topleft"
+         name="radio move" />
+        <radio_item
+		 top_pad="6"
+         label="Lift (Ctrl)"
+         layout="topleft"
+         name="radio lift" />
+        <radio_item
+         top_pad="6"
+         label="Spin (Ctrl+Shift)"
+         layout="topleft"
+         name="radio spin" />
+		 <radio_group.commit_callback
+			function="BuildTool.commitRadioMove"/>
+	</radio_group>
+	<radio_group
+     follows="left|top"
+	 left="5"
+	 top="59"
+	 height="70"
+     layout="topleft"
+	 name="edit_radio_group">
+        <radio_item
+		 label="Move"
+		 layout="topleft"
+		 name="radio position" />
+        <radio_item
+		 top_pad="6"
+         label="Rotate (Ctrl)"
+         layout="topleft"
+         name="radio rotate" />
+        <radio_item
+		 top_pad="6"
+         label="Stretch (Ctrl+Shift)"
+         layout="topleft"
+         name="radio stretch" />
+        <radio_item
+		 top_pad="6"
+         label="Select Face"
+         layout="topleft"
+         name="radio select face" />
+			<radio_group.commit_callback
+			function="BuildTool.commitRadioEdit"/>
+    </radio_group>
+    <check_box
+     left="5"
+     follows="left|top"
+     height="28"
+	 control_name="EditLinkedParts"
+     label="Edit linked"
+     layout="topleft"
+     name="checkbox edit linked parts"
+     top_pad="-10">
+		  <check_box.commit_callback
+			function="BuildTool.selectComponent"/>
+	</check_box>
+
+   <button
+     follows="left|top"
+     height="23"
+     label="Link"
+     top_pad="2"
+     layout="topleft"
+     left="5"
+     name="link_btn"
+     width="50">
+	  <button.commit_callback
+	     function="BuildTool.LinkObjects"/>
+    </button>
+    <button
+     follows="left|top"
+     height="23"
+     label="Unlink"
+     layout="topleft"
+     left_pad="2"
+     name="unlink_btn"
+     width="50">
+	  <button.commit_callback
+	     function="BuildTool.UnlinkObjects"/>
+    </button>
+    <text
+	   text_color="LtGray_50"
+	   follows="top|left"
+	   halign="left"
+	   left_pad="3"
+	   name="RenderingCost"
+	   tool_tip="Shows the rendering cost calculated for this object"
+	   top_delta="11"
+	   type="string"
+	   width="100">
+	   þ: [COUNT]
+	   </text>
+    <check_box
+     control_name="ScaleUniform"
+     height="19"
+     label=""
+     layout="topleft"
+     left="143"
+     name="checkbox uniform"
+     top="50"
+     width="20" />
+    <text
+     height="19"
+     label="Stretch Both Sides"
+     left_delta="20"
+     name="checkbox uniform label"
+     top_delta="2"
+     width="120"
+     layout="topleft"
+     follows="top|left"
+     wrap="true">
+     	Stretch Both Sides
+    </text>
+    <check_box
+     control_name="ScaleStretchTextures"
+     height="19"
+     initial_value="true"
+     label="Stretch Textures"
+     layout="topleft"
+     left="143"
+     name="checkbox stretch textures"
+     top_pad="-6"
+     follows="left|top"
+     width="134" />
+   <check_box
+     control_name="SnapEnabled"
+     height="18"
+     initial_value="true"
+     label="Snap to grid"
+     layout="topleft"
+     top_pad="0"
+     name="checkbox snap to grid"
+     width="134" />
+    <combo_box
+     height="23"
+     layout="topleft"
+     follows="left|top"
+     name="combobox grid mode"
+     tool_tip="Choose the type of grid ruler for positioning the object"
+     top_pad="0"
+     width="108">
+        <combo_box.item
+         label="World grid"
+         name="World"
+         value="World" />
+        <combo_box.item
+         label="Local grid"
+         name="Local"
+         value="Local" />
+        <combo_box.item
+         label="Reference grid"
+         name="Reference"
+         value="Reference" />
+		 <combo_box.commit_callback
+	     function="BuildTool.gridMode"/>
+    </combo_box>
+    <button
+     left_pad="0"
+     image_selected="ForwardArrow_Press"
+     image_unselected="ForwardArrow_Off"
+     layout="topleft"
+     follows="top|left"
+     name="Options..."
+     tool_tip="See more grid options"
+     top_pad="-22"
+     right="-10"
+     width="18"
+     height="23" >
+	 <button.commit_callback
+	     function="BuildTool.gridOptions"/>
+	</button>
+   <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Cube"
+     image_disabled_selected="Object_Cube"
+     image_selected="Object_Cube_Selected"
+     image_unselected="Object_Cube"
+     layout="topleft"
+     left="10"
+     name="ToolCube"
+     tool_tip="Cube"
+     top="51"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Prism"
+     image_disabled_selected="Object_Prism"
+     image_selected="Object_Prism_Selected"
+     image_unselected="Object_Prism"
+     layout="topleft"
+     left_delta="29"
+     name="ToolPrism"
+     tool_tip="Prism"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Pyramid"
+     image_disabled_selected="Object_Pyramid"
+     image_selected="Object_Pyramid_Selected"
+     image_unselected="Object_Pyramid"
+     layout="topleft"
+     left_delta="29"
+     name="ToolPyramid"
+     tool_tip="Pyramid"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Tetrahedron"
+     image_disabled_selected="Object_Tetrahedron"
+     image_selected="Object_Tetrahedron_Selected"
+     image_unselected="Object_Tetrahedron"
+     layout="topleft"
+     left_delta="29"
+     name="ToolTetrahedron"
+     tool_tip="Tetrahedron"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Cylinder"
+     image_disabled_selected="Object_Cylinder"
+     image_selected="Object_Cylinder_Selected"
+     image_unselected="Object_Cylinder"
+     layout="topleft"
+     left_delta="29"
+     name="ToolCylinder"
+     tool_tip="Cylinder"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Hemi_Cylinder"
+     image_disabled_selected="Object_Hemi_Cylinder"
+     image_selected="Object_Hemi_Cylinder_Selected"
+     image_unselected="Object_Hemi_Cylinder"
+     layout="topleft"
+     left_delta="29"
+     name="ToolHemiCylinder"
+     tool_tip="Hemicylinder"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Cone"
+     image_disabled_selected="Object_Cone"
+     image_selected="Object_Cone_Selected"
+     image_unselected="Object_Cone"
+     layout="topleft"
+     left_delta="29"
+     name="ToolCone"
+     tool_tip="Cone"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Hemi_Cone"
+     image_disabled_selected="Object_Hemi_Cone"
+     image_selected="Object_Hemi_Cone_Selected"
+     image_unselected="Object_Hemi_Cone"
+     layout="topleft"
+     left_delta="29"
+     name="ToolHemiCone"
+     tool_tip="Hemicone"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Sphere"
+     image_disabled_selected="Object_Sphere"
+     image_selected="Object_Sphere_Selected"
+     image_unselected="Object_Sphere"
+     layout="topleft"
+     left_delta="29"
+     name="ToolSphere"
+     tool_tip="Sphere"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Hemi_Sphere"
+     image_disabled_selected="Object_Hemi_Sphere"
+     image_selected="Object_Hemi_Sphere_Selected"
+     image_unselected="Object_Hemi_Sphere"
+     layout="topleft"
+     left_delta="29"
+     name="ToolHemiSphere"
+     tool_tip="Hemisphere"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Torus"
+     image_disabled_selected="Object_Torus"
+     image_selected="Object_Torus_Selected"
+     image_unselected="Object_Torus"
+     layout="topleft"
+     left="10"
+     name="ToolTorus"
+     tool_tip="Torus"
+     top="77"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Tube"
+     image_disabled_selected="Object_Tube"
+     image_selected="Object_Tube_Selected"
+     image_unselected="Object_Tube"
+     layout="topleft"
+     left_delta="29"
+     name="ToolTube"
+     tool_tip="Tube"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Ring"
+     image_disabled_selected="Object_Ring"
+     image_selected="Object_Ring_Selected"
+     image_unselected="Object_Ring"
+     layout="topleft"
+     left_delta="29"
+     name="ToolRing"
+     tool_tip="Ring"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Tree"
+     image_disabled_selected="Object_Tree"
+     image_selected="Object_Tree_Selected"
+     image_unselected="Object_Tree"
+     layout="topleft"
+     left_delta="29"
+     name="ToolTree"
+     tool_tip="Tree"
+     top_delta="0"
+     width="20" />
+    <button
+     follows="left|top"
+     height="20"
+     image_disabled="Object_Grass"
+     image_disabled_selected="Object_Grass"
+     image_selected="Object_Grass_Selected"
+     image_unselected="Object_Grass"
+     image_overlay_color="Red"
+     layout="topleft"
+     left_delta="29"
+     name="ToolGrass"
+     tool_tip="Grass"
+     top_delta="0"
+     width="20" />
+    <check_box
+     control_name="CreateToolKeepSelected"
+     height="19"
+     label="Keep Tool selected"
+     layout="topleft"
+     left="4"
+     name="checkbox sticky"
+     top="101"
+     width="128" />
+    <check_box
+     control_name="CreateToolCopySelection"
+     height="19"
+     label="Copy selection"
+     layout="topleft"
+     left_delta="0"
+     name="checkbox copy selection"
+     top_delta="15"
+     width="134" />
+    <check_box
+     control_name="CreateToolCopyCenters"
+     height="19"
+     initial_value="true"
+     label="Center Copy"
+     layout="topleft"
+     left_delta="18"
+     name="checkbox copy centers"
+     top="132"
+     width="134" />
+    <check_box
+     control_name="CreateToolCopyRotates"
+     height="19"
+     label="Rotate Copy"
+     layout="topleft"
+     left_delta="0"
+     name="checkbox copy rotates"
+     top_delta="16"
+     width="134" />
+    <radio_group
+     height="105"
+     layout="topleft"
+     left="4"
+     name="land_radio_group"
+     top="54"
+     width="114">
+        <radio_item
+         height="19"
+         label="Select Land"
+         layout="topleft"
+         left="0"
+         name="radio select land"
+         top="-106"
+         width="134" />
+        <radio_item
+         height="19"
+         label="Flatten"
+         layout="topleft"
+         left_delta="0"
+         name="radio flatten"
+         top_delta="15"
+         width="114" />
+        <radio_item
+         height="19"
+         label="Raise"
+         layout="topleft"
+         left_delta="0"
+         name="radio raise"
+         top_delta="15"
+         width="114" />
+        <radio_item
+         height="19"
+         label="Lower"
+         layout="topleft"
+         left_delta="0"
+         name="radio lower"
+         top_delta="15"
+         width="114" />
+        <radio_item
+         height="19"
+         label="Smooth"
+         layout="topleft"
+         left_delta="0"
+         name="radio smooth"
+         top_delta="15"
+         width="114" />
+        <radio_item
+         height="19"
+         label="Roughen"
+         layout="topleft"
+         left_delta="0"
+         name="radio noise"
+         top_delta="15"
+         width="114" />
+        <radio_item
+         height="19"
+         label="Revert"
+         layout="topleft"
+         left_delta="0"
+         name="radio revert"
+         top_delta="15"
+         width="114" />
+		 <radio_group.commit_callback
+	     function="BuildTool.commitRadioLand"/>
+    </radio_group>
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     height="12"
+     layout="topleft"
+     left="135"
+     name="Bulldozer:"
+     top="57"
+     width="100">
+        Bulldozer:
+    </text>
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     height="12"
+     layout="topleft"
+     name="Dozer Size:"
+     left="135"
+     top_pad="5"
+     width="50">
+        Size
+    </text>
+    <slider_bar
+	 control_name ="LandBrushSize"
+     follows="left|top"
+     height="19"
+     initial_value="2.0"
+     layout="topleft"
+     max_val="11"
+     min_val="1"
+     left_pad="0"
+     name="slider brush size"
+     top_delta="-3"
+     width="80" />
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     height="12"
+     layout="topleft"
+     name="Strength:"
+     left="135"
+     top_pad="5"
+     width="50">
+        Strength
+    </text>
+    <slider_bar
+     follows="left|top"
+     height="19"
+     left_pad="0"
+     initial_value="0.00"
+     layout="topleft"
+     max_val="2"
+     min_val="-1"
+     name="slider force"
+     top_delta="-3"
+     width="80" >
+	  <slider_bar.commit_callback
+	     function="BuildTool.LandBrushForce"/>
+    </slider_bar>
+    <button
+     follows="left|top"
+     height="23"
+     label="Apply"
+     label_selected="Apply"
+     top_pad="5"
+     layout="topleft"
+     left="135"
+     name="button apply to selection"
+     tool_tip="Modify selected land"
+     width="82">
+	  <button.commit_callback
+	     function="BuildTool.applyToSelection"/>
+    </button>
+	<text
+	 text_color="LtGray_50"
+	  type="string"
+	  length="1"
+	  height="10"
+	  follows="left|top"
+	  halign="right"
+	  layout="topleft"
+	  right="-10"
+	  name="obj_count"
+	  top_pad="5"
+	  width="143">
+		Objects: [COUNT]
+	</text>
+	<text
+    text_color="LtGray_50"
+     type="string"
+     length="1"
+	height="10" 
+     follows="left|top"
+     halign="right"
+     layout="topleft"
+     right="-10"
+     name="prim_count"
+     width="143">
+		Prims: [COUNT]
+	</text>
+    <text
+    text_color="LtGray_50"
+     type="string"
+     length="1"
+     height="10"
+     follows="left|top"
+     halign="right"
+     layout="topleft"
+     right="-120"
+     name="linked_set_count"
+     top="144"
+     width="80">
+        Linked Sets: [COUNT]
+    </text>
+    <text
+    text_color="LtGray_50"
+     type="string"
+     length="1"
+     height="10"
+     follows="left|top"
+     halign="right"
+     layout="topleft"
+     top_delta="0"
+     right="-8"
+     name="linked_set_cost"
+     tool_tip="Cost of currently selected linked sets as [prims],[physics complexity]" 
+     width="80">
+        Cost: [COST] / [PHYSICS]
+    </text>
+    <text
+    text_color="LtGray_50"
+     type="string"
+     length="1"
+     follows="left|top"
+     halign="right"
+     layout="topleft"
+     top_pad="5"
+     right="-120"
+     name="object_count"
+     width="80">
+        Objects: [COUNT]
+    </text>
+    <text
+    text_color="LtGray_50"
+     type="string"
+     length="1"
+     follows="left|top"
+     halign="right"
+     layout="topleft"
+	 top_delta="0"
+     right="-8"
+     name="object_cost"
+     tool_tip="Cost of currently selected objects as [prims] / [physics complexity]"
+     width="80">
+        Cost: [COST] / [PHYSICS]
+    </text>
+    <!-- <text -->
+    <!-- text_color="LtGray_50" -->
+    <!--  type="string" -->
+    <!--  length="1" -->
+    <!--  height="10" -->
+    <!--  follows="left|top" -->
+    <!--  halign="right" -->
+    <!--  layout="topleft" -->
+    <!--  right="-10" -->
+    <!--  name="obj_count" -->
+    <!--  top_pad="5" -->
+    <!--  width="143"> -->
+    <!--     Objects: [COUNT] -->
+    <!-- </text> -->
+    <!-- <text -->
+    <!-- text_color="LtGray_50" -->
+    <!--  type="string" -->
+    <!--  length="1" -->
+    <!--  follows="left|top" -->
+    <!--  halign="right" -->
+    <!--  layout="topleft" -->
+    <!--  right="-10" -->
+    <!--  name="prim_count" -->
+    <!--  width="143"> -->
+    <!--     Prims: [COUNT] -->
+    <!-- </text> -->
+    <tab_container
+     follows="left|top"
+     height="410"
+     halign="center"
+     left="0"
+     name="Object Info Tabs"
+     tab_max_width="100"
+     tab_min_width="40"
+     tab_position="top"
+     tab_height="25"
+     top="173"
+     width="295">
+	
+<panel
+	 border="false"
+	 follows="all"
+	 label="General"
+	 layout="topleft"
+	 mouse_opaque="false"
+	 help_topic="toolbox_general_tab"
+	 name="General"
+	 top="16"
+	 width="295">
+	 <panel.string
+	  name="text deed continued">
+		Deed
+	 </panel.string>
+	<panel.string
+	 name="text deed">
+		Deed
+	</panel.string>
+            <panel.string
+             name="text modify info 1">
+                You can modify this object
+            </panel.string>
+            <panel.string
+             name="text modify info 2">
+                You can modify these objects
+            </panel.string>
+            <panel.string
+             name="text modify info 3">
+                You can't modify this object
+            </panel.string>
+            <panel.string
+             name="text modify info 4">
+                You can't modify these objects
+            </panel.string>
+            <panel.string
+             name="text modify warning">
+                You must select entire object to set permissions
+            </panel.string>
+            <panel.string
+             name="Cost Default">
+                Price: L$
+            </panel.string>
+            <panel.string
+             name="Cost Total">
+                Total Price: L$
+            </panel.string>
+            <panel.string
+             name="Cost Per Unit">
+                Price Per: L$
+            </panel.string>
+            <panel.string
+             name="Cost Mixed">
+                Mixed Price
+            </panel.string>
+            <panel.string
+             name="Sale Mixed">
+                Mixed Sale
+            </panel.string>
+            <text
+             follows="left|top"
+             height="10"
+             left="10"
+             name="Name:"
+             top="5"
+             width="90">
+                Name:
+            </text>
+            <line_editor
+             follows="left|top|right"
+             height="19"
+             left_pad="0"
+             max_length_bytes="63"
+             name="Object Name"
+             select_on_focus="true"
+             top_delta="0"
+             width="170" />
+            <text
+             follows="left|top"
+             height="10"
+             left="10"
+             name="Description:"
+             top_pad="3"
+             width="90">
+                Description:
+            </text>
+            <line_editor
+             follows="left|top|right"
+             height="19"
+             left_pad="0"
+             max_length_bytes="127"
+             name="Object Description"
+             select_on_focus="true"
+             top_delta="0"
+             width="170" />
+            <text
+             type="string"
+             left="10"
+             length="1"
+             follows="left|top"
+             height="19"
+             layout="topleft"
+             name="Creator:"
+             top_pad="7"
+             width="90">
+                Creator:
+            </text>
+            <!-- *NOTE: Intentionally wide for long names -->
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             left_pad="0"
+             height="20"
+             layout="topleft"
+             name="Creator Name"
+             top_delta="0"
+             translate="false"
+             width="190"
+             word_wrap="true"
+             use_ellipses="true">
+                TestString PleaseIgnore (please.ignore)
+            </text>
+            <text
+             type="string"
+             length="1"
+             left="10"
+             follows="left|top"
+             height="19"
+             layout="topleft"
+             name="Owner:"
+             top_pad="13"
+             width="90">
+                Owner:
+            </text>
+            <!-- *NOTE: Intentionally wide for long names -->
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="20"
+             layout="topleft"
+             name="Owner Name"
+             left_pad="0"
+             top_delta="0"
+             translate="false"
+             width="190"
+             word_wrap="true"
+             use_ellipses="true">
+                TestString PleaseIgnore (please.ignore)
+            </text>
+           <text
+             type="string"
+             length="1"
+             follows="left|top"
+             layout="topleft"
+             left="10"
+             height="18"
+             name="Group:"
+             top_pad="17"
+             width="75">
+                Group:
+            </text>
+            <name_box
+             follows="left|top"
+             height="18"
+             initial_value="Loading..."
+             layout="topleft"
+             left_pad="23"
+             name="Group Name Proxy"
+             width="142" />
+            <button
+			 follows="top|left"
+			 height="23"
+			 image_overlay="Edit_Wrench"
+			 layout="topleft"
+			 left_pad="13"
+			 name="button set group"
+			 tab_stop="false"
+			 tool_tip="Choose a group to share this object's permissions"
+			 width="23" />
+            <check_box
+             height="19"
+             follows="left|top"
+             label="Share"
+             layout="topleft"
+             name="checkbox share with group"
+             tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+             top_pad="10"
+             left="100"
+             width="87" />
+            <button
+             follows="top|left"
+             height="23"
+             label="Deed"
+             label_selected="Deed"
+             layout="topleft"
+             name="button deed"
+             left_pad="19"
+             tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
+             width="80" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="16"
+             layout="topleft"
+             top_pad="10"
+             left="10"
+             name="label click action"
+             width="118">
+                Click to:
+            </text>
+            <combo_box
+             follows="left|top"
+             height="23"
+             layout="topleft"
+             name="clickaction"
+             width="148"
+             left_pad="10">
+                <combo_box.item
+                 label="Touch  (default)"
+                 name="Touch/grab(default)"
+                 value="Touch" />
+                <combo_box.item
+                 label="Sit on object"
+                 name="Sitonobject"
+                 value="Sit" />
+                <combo_box.item
+                 label="Buy object"
+                 name="Buyobject"
+                 value="Buy" />
+                <combo_box.item
+                 label="Pay object"
+                 name="Payobject"
+                 value="Pay" />
+                <combo_box.item
+                 label="Open"
+                 name="Open"
+                 value="Open" />
+				 <combo_box.item
+                 label="Zoom"
+                 name="Zoom"
+                 value="Zoom" />
+            </combo_box>
+            <check_box
+             height="23"
+             label="For Sale:"
+             layout="topleft"
+             name="checkbox for sale"
+             left="7"
+             width="100" />
+<!-- NEW SALE TYPE COMBO BOX -->
+      <combo_box
+            left_pad="10"
+            layout="topleft"
+            follows="left|top"
+            allow_text_entry="false"
+            height="23"
+            initial_value="2"
+            max_chars="20"
+            mouse_opaque="true"
+            name="sale type"
+            width="168">
+        <combo_box.item
+           name="Copy"
+           label="Copy"
+           value="2" />
+        <combo_box.item
+           name="Contents"
+           label="Contents"
+           value="3" />
+        <combo_box.item
+           name="Original"
+           label="Original"
+           value="1" />
+      </combo_box>
+<!-- NEW PRICE SPINNER
+Objects are allowed to be for sale for L$0 to invoke buy UI behavior
+even though the user gets a free copy.
+-->
+    <spinner
+        follows="left|top"
+        decimal_digits="0"
+        increment="1"
+        top_pad="8"
+        left="118"
+        control_name="Edit Cost"
+        name="Edit Cost"
+        label="Price: L$"
+        label_width="65"
+        width="165"
+        min_val="0"
+        height="20"
+        max_val="999999999" />
+      <check_box
+	   height="15"
+	   width="110"
+	   top_pad="5"
+	   label="Show in search"
+       layout="topleft"
+	   left="100"
+       name="search_check"
+       tool_tip="Let people see this object in search results" />
+		<panel
+         border="false"
+         follows="left|top"
+         layout="topleft"
+         mouse_opaque="false"
+         background_visible="true"
+         bg_alpha_color="DkGray"
+         name="perms_build"
+         left="0"
+         top_pad="4"
+         height="105"
+         width="290">
+            <text
+             type="string"
+             length="1"
+             left="10"
+             top_pad="9"
+             text_color="EmphasisColor"
+             height="16"
+             follows="left|top|right"
+             layout="topleft"
+             name="perm_modify"
+             width="264">
+                You can modify this object
+            </text>
+            <text
+               type="string"
+               follows="left|top"
+               name="Anyone can:"
+               width="250"
+               left="10">
+                 Anyone:
+            </text>
+            <check_box
+             height="19"
+             label="Move"
+             layout="topleft"
+             name="checkbox allow everyone move"
+             left="10"
+             width="85" />
+            <check_box
+             height="19"
+             label="Copy"
+             layout="topleft"
+             left_pad="0"
+             name="checkbox allow everyone copy"
+             width="90" />
+            <text
+               type="string"
+               follows="left|top"
+               height="19"
+               name="Next owner can:"
+               width="250"
+               left="10">
+                  Next owner:
+            </text>
+            <check_box
+             follows="left|top|right"
+             label="Modify"
+             layout="topleft"
+             left="10"
+             name="checkbox next owner can modify"
+             width="85" />
+            <check_box
+             follows="left|top|right"
+             height="19"
+             label="Copy"
+             layout="topleft"
+             left_pad="0"
+             name="checkbox next owner can copy"
+             width="80" />
+            <check_box
+             follows="left|top|right"
+             height="19"
+             label="Transfer"
+             layout="topleft"
+             name="checkbox next owner can transfer"
+             left_pad="0"
+             top_delta="0"
+             tool_tip="Next owner can give away or resell this object"
+             width="100" />
+<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, 
+     but that's OK, this is used only for debugging. -->
+            <text
+             type="string"
+             text_color="EmphasisColor"
+             length="1"
+             top="9"
+             follows="left|top"
+             layout="topleft"
+             left="230"
+             name="B:"
+             height="10"
+             width="80">
+                B:
+            </text>
+            <text
+             type="string"
+             text_color="White"
+             length="1"
+             follows="left|top"
+             layout="topleft"
+             left_delta="0"
+             top_pad="2"
+             name="O:"
+             height="10"
+             width="80">
+                O:
+            </text>
+            <text
+             type="string"
+             text_color="EmphasisColor"
+             length="1"
+             follows="left|top"
+             layout="topleft"
+             left_delta="0"
+             top_pad="2"
+             name="G:"
+             height="10"
+             width="80">
+                G:
+            </text>
+            <text
+             type="string"
+             text_color="White"
+             length="1"
+             follows="left|top"
+             left_delta="0"
+             top_pad="2"
+             layout="topleft"
+             name="E:"
+             height="10"
+             width="80">
+                E:
+            </text>
+            <text
+             type="string"
+             text_color="EmphasisColor"
+             length="1"
+             follows="left|top"
+             layout="topleft"
+             left_delta="0"
+             top_pad="2"
+             name="N:"
+             height="10"
+             width="80">
+                N:
+            </text>
+            <text
+             type="string"
+             text_color="White"
+             length="1"
+             follows="left|top"
+             layout="topleft"
+             left_delta="0"
+             top_pad="2"
+             name="F:"
+             height="10"
+             width="80">
+                F:
+            </text>
+        </panel>
+      </panel>
+      <!-- Object tab -->
+      <panel
+         border="false"
+         follows="all"
+         height="567"
+         label="Object"
+         layout="topleft"
+         left_delta="0"
+         mouse_opaque="false"
+         help_topic="toolbox_object_tab"
+         name="Object"
+         top="16"
+         width="295">
+            <check_box
+             height="19"
+             label="Locked"
+             layout="topleft"
+             name="checkbox locked"
+             tool_tip="Prevents object from being moved or deleted. Frequently useful during building to avoid unintended edits."
+             top_pad="5"
+             left="10"
+             width="123" />
+            <check_box
+             height="19"
+             label="Physical"
+             layout="topleft"
+             name="Physical Checkbox Ctrl"
+             tool_tip="Allows object to be pushed and affected by gravity"
+             top_pad="0"
+             width="123" />
+            <check_box
+             height="19"
+             label="Temporary"
+             layout="topleft"
+             name="Temporary Checkbox Ctrl"
+             tool_tip="Causes object to be deleted 1 minute after creation"
+             top_pad="0"
+             width="123" />
+            <check_box
+             height="19"
+             label="Phantom"
+             layout="topleft"
+             name="Phantom Checkbox Ctrl"
+             tool_tip="Causes object to not collide with other objects or avatars"
+             top_pad="0"
+             width="123" />
+
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             name="label position"
+             top_pad="10"
+             width="121">
+                Position (meters)
+            </text>
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="X"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="512"
+             min_val="-256"
+             name="Pos X"
+             text_enabled_color="1 0 0.3 .7"
+             top_pad="5"
+             width="87" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Y"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="512"
+             min_val="-256"
+             name="Pos Y"
+             text_enabled_color="EmphasisColor"
+             top_pad="3"
+             width="87" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Z"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="4096"
+             name="Pos Z"
+             text_enabled_color="0 0.8 1 .65"
+             top_pad="3"
+             width="87" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="label size"
+             top_pad="6"
+             width="121">
+                Size (meters)
+            </text>
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="X"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="64"
+             min_val="0.01"
+             name="Scale X"
+             text_enabled_color="1 1 1 1"
+             top_pad="5"
+             width="87" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Y"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="64"
+             min_val="0.01"
+             name="Scale Y"
+             text_enabled_color="1 1 1 1"
+             top_pad="3"
+             width="87" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Z"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="64"
+             min_val="0.01"
+             name="Scale Z"
+             text_enabled_color="1 1 1 1"
+             top_pad="3"
+             width="87" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="label rotation"
+             top_pad="10"
+             width="121">
+                Rotation (degrees)
+            </text>
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="1"
+             initial_value="0"
+             label="X"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="9999"
+             min_val="-9999"
+             name="Rot X"
+             text_enabled_color="1 1 1 1"
+             top_pad="5"
+             width="87" />
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="1"
+             initial_value="0"
+             label="Y"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="9999"
+             min_val="-9999"
+             name="Rot Y"
+             text_enabled_color="1 1 1 1"
+             top_pad="3"
+             width="87" />
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="1"
+             initial_value="0"
+             label="Z"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="9999"
+             min_val="-9999"
+             name="Rot Z"
+             text_enabled_color="1 1 1 1"
+             top_pad="3"
+             width="87" />
+ <!--           <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="125"
+             name="label basetype"
+             top="5"
+             width="150">
+                Prim Type
+            </text>-->
+            <combo_box
+             height="19"
+             layout="topleft"
+             name="comboBaseType"
+             top="6"
+             left="125"
+             width="150">
+                <combo_box.item
+                 label="Box"
+                 name="Box"
+                 value="Box" />
+                <combo_box.item
+                 label="Cylinder"
+                 name="Cylinder"
+                 value="Cylinder" />
+                <combo_box.item
+                 label="Prism"
+                 name="Prism"
+                 value="Prism" />
+                <combo_box.item
+                 label="Sphere"
+                 name="Sphere"
+                 value="Sphere" />
+                <combo_box.item
+                 label="Torus"
+                 name="Torus"
+                 value="Torus" />
+                <combo_box.item
+                 label="Tube"
+                 name="Tube"
+                 value="Tube" />
+                <combo_box.item
+                 label="Ring"
+                 name="Ring"
+                 value="Ring" />
+                <combo_box.item
+                 label="Sculpted"
+                 name="Sculpted"
+                 value="Sculpted" />
+            </combo_box>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="text cut"
+             top_pad="5"
+             width="150">
+                Path Cut (begin/end)
+            </text>
+            <spinner
+             follows="left|top"
+             height="16"
+             increment="0.025"
+             initial_value="0"
+             label="B"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="0.98"
+             name="cut begin"
+             top_pad="4"
+             width="68" />
+            <spinner
+             follows="left|top"
+             height="16"
+             increment="0.025"
+             initial_value="1"
+             label="E"
+             label_width="10"
+             layout="topleft"
+             left_pad="10"
+             min_val="0.02"
+             name="cut end"
+             top_delta="0"
+             width="68" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="125"
+             name="text hollow"
+             top_pad="6"
+             width="68">
+                Hollow
+            </text>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_pad="10"
+             name="text skew"
+             width="63">
+                Skew
+            </text>
+            <spinner
+             decimal_digits="1"
+             follows="left|top"
+             height="19"
+             increment="5"
+             initial_value="0"
+             layout="topleft"
+             left="125"
+             max_val="95"
+             name="Scale 1"
+             top_pad="4"
+             width="68" />
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             layout="topleft"
+             left_pad="10"
+             max_val="0.95"
+             min_val="-0.95"
+             name="Skew"
+             top_delta="0"
+             width="68" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="15"
+             layout="topleft"
+             left="125"
+             name="Hollow Shape"
+             top_pad="4"
+             width="150">
+                Hollow Shape
+            </text>
+            <combo_box
+             height="23"
+             layout="topleft"
+             left_delta="0"
+             name="hole"
+             top_pad="-2"
+             width="150">
+                <combo_box.item
+                 label="Default"
+                 name="Default"
+                 value="Default" />
+                <combo_box.item
+                 label="Circle"
+                 name="Circle"
+                 value="Circle" />
+                <combo_box.item
+                 label="Square"
+                 name="Square"
+                 value="Square" />
+                <combo_box.item
+                 label="Triangle"
+                 name="Triangle"
+                 value="Triangle" />
+            </combo_box>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="text twist"
+             top_pad="5"
+             width="150">
+                Twist (begin/end)
+            </text>
+            <spinner
+             decimal_digits="0"
+             follows="left|top"
+             height="19"
+             increment="9"
+             initial_value="0"
+             label="B"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="180"
+             min_val="-180"
+             name="Twist Begin"
+             top_pad="4"
+             width="68" />
+            <spinner
+             decimal_digits="0"
+             follows="left|top"
+             height="19"
+             increment="9"
+             initial_value="0"
+             label="E"
+             label_width="10"
+             layout="topleft"
+             left_pad="10"
+             max_val="180"
+             min_val="-180"
+             name="Twist End"
+             top_delta="0"
+             width="68" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="125"
+             name="scale_taper"
+             top_pad="3"
+             width="150">
+                Taper
+            </text>
+            <text
+			 visible="false"
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="scale_hole"
+             top_delta="0"
+             width="150">
+                Hole Size
+            </text>
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             label="X"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             min_val="-1"
+             name="Taper Scale X"
+             top_pad="4"
+             width="68" />
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             label="Y"
+             label_width="10"
+             layout="topleft"
+             left_pad="10"
+             min_val="-1"
+             name="Taper Scale Y"
+             top_delta="0"
+             width="68" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="125"
+             name="text topshear"
+             top_pad="3"
+             width="141">
+                Top Shear
+            </text>
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             label="X"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="0.5"
+             min_val="-0.5"
+             name="Shear X"
+             top_pad="4"
+             width="68" />
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             label="Y"
+             label_width="10"
+             layout="topleft"
+             left_pad="10"
+             max_val="0.5"
+             min_val="-0.5"
+             name="Shear Y"
+             top_delta="0"
+             width="68" />
+            <text
+			 visible="false"
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="125"
+             name="advanced_cut"
+             top_pad="3"
+             width="150">
+                Profile Cut (begin/end)
+            </text>
+            <text
+			 visible="false"
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="advanced_dimple"
+             top_delta="0"
+             width="150">
+                Dimple (begin/end)
+            </text>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="advanced_slice"
+             top_delta="0"
+             width="150">
+                Slice (begin/end)
+            </text>
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.02"
+             initial_value="0"
+             label="B"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             max_val="0.98"
+             name="Path Limit Begin"
+             top_pad="3"
+             width="68" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.02"
+             initial_value="1"
+             label="E"
+             label_width="10"
+             layout="topleft"
+             left_pad="10"
+             min_val="0.02"
+             name="Path Limit End"
+             top_delta="0"
+             width="68" />
+            <text
+			 visible="false"
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="125"
+             name="text taper2"
+             top_pad="3"
+             width="150">
+                Taper
+            </text>
+            <spinner
+			 visible="false"
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             label="X"
+             label_width="10"
+             layout="topleft"
+             left_delta="0"
+             min_val="-1"
+             name="Taper X"
+             top_pad="3"
+             width="68" />
+            <spinner
+			 visible="false"
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             label="Y"
+             label_width="10"
+             layout="topleft"
+             left_pad="10"
+             min_val="-1"
+             name="Taper Y"
+             top_delta="0"
+             width="68" />
+            <text
+			 visible="false"
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="125"
+             name="text radius delta"
+             top_pad="2"
+             width="78">
+                Radius
+            </text>
+            <text
+			 visible="false"
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="78"
+             name="text revolutions"
+             width="68">
+                Revolutions
+            </text>
+            <spinner
+			 visible="false"
+             follows="left|top"
+             height="19"
+             increment="0.05"
+             initial_value="0"
+             layout="topleft"
+             left="125"
+             min_val="-1"
+             name="Radius Offset"
+             top_pad="4"
+             width="68" />
+            <spinner
+			 visible="false"
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             initial_value="1"
+             layout="topleft"
+             left_pad="10"
+             max_val="4"
+             min_val="1"
+             name="Revolutions"
+             top_delta="0"
+             width="68" />
+            <texture_picker
+             can_apply_immediately="true"
+             default_image_name="Default"
+             follows="left|top"
+             height="141"
+             label="Sculpt Texture"
+             layout="topleft"
+             left="125"
+             name="sculpt texture control"
+             tool_tip="Click to choose a picture"
+             top="70"
+             visible="false"
+             width="145" />
+            <check_box
+             height="19"
+             label="Mirror"
+             layout="topleft"
+             left_delta="0"
+             name="sculpt mirror control"
+             tool_tip="Flips sculpted prim along the X axis"
+             top_pad="8"
+             visible="false"
+             width="130" />
+            <check_box
+             height="19"
+             label="Inside-out"
+             layout="topleft"
+             left_delta="0"
+             name="sculpt invert control"
+             tool_tip="Inverts the sculpted prims normals, making it appear inside-out"
+             top_pad="4"
+             visible="false"
+             width="121" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="label sculpt type"
+             top_pad="10"
+             visible="false"
+             width="130">
+                Stitching type
+            </text>
+            <combo_box
+             height="19"
+             layout="topleft"
+             left_delta="0"
+             name="sculpt type control"
+             top_pad="4"
+             visible="false"
+             width="150">
+                <combo_box.item
+                 label="(none)"
+                 name="None"
+                 value="None" />
+                <combo_box.item
+                 label="Sphere"
+                 name="Sphere"
+                 value="Sphere" />
+                <combo_box.item
+                 label="Torus"
+                 name="Torus"
+                 value="Torus" />
+                <combo_box.item
+                 label="Plane"
+                 name="Plane"
+                 value="Plane" />
+                <combo_box.item
+                 label="Cylinder"
+                 name="Cylinder"
+                 value="Cylinder" />
+              <combo_box.item
+                 label="Mesh"
+                 name="Mesh"
+                 value="Mesh" />
+            </combo_box>
+        </panel>
+        <panel
+         border="false"
+         follows="all"
+         height="367"
+         label="Features"
+         layout="topleft"
+         left_delta="0"
+         mouse_opaque="false"
+         help_topic="toolbox_features_tab"
+         name="Features"
+         top_delta="0"
+         width="295">
+	<panel.string name="None">None</panel.string>
+	<panel.string name="Prim">Prim</panel.string>
+	<panel.string name="Convex Hull">Convex Hull</panel.string>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="20"
+             layout="topleft"
+             left="10"
+             name="select_single"
+             top="5"
+             width="252"
+             word_wrap="true">
+                Select only one primitive to edit features.
+            </text>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="10"
+             name="edit_object"
+             top="5"
+             width="252">
+                Edit object features:
+            </text>
+            <check_box
+             height="19"
+             label="Flexible Path"
+             layout="topleft"
+             left="10"
+             name="Flexible1D Checkbox Ctrl"
+             tool_tip="Allows object to flex about the Z axis (Client-side only)"
+             top_pad="20"
+             width="121" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="1"
+             initial_value="2"
+             label="Softness"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="3"
+             name="FlexNumSections"
+             top_pad="10"
+             width="128" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.5"
+             initial_value="0.3"
+             label="Gravity"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="10"
+             min_val="-10"
+             name="FlexGravity"
+             top_pad="4"
+             width="128" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.5"
+             initial_value="2"
+             label="Drag"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="10"
+             name="FlexFriction"
+             top_pad="4"
+             width="128" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.5"
+             initial_value="0"
+             label="Wind"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="10"
+             name="FlexWind"
+             top_pad="4"
+             width="128" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.5"
+             initial_value="1"
+             label="Tension"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="10"
+             name="FlexTension"
+             top_pad="4"
+             width="128" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Force X"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="10"
+             min_val="-10"
+             name="FlexForceX"
+             top_pad="4"
+             width="128" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Force Y"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="10"
+             min_val="-10"
+             name="FlexForceY"
+             top_pad="4"
+             width="128" />
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Force Z"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="10"
+             min_val="-10"
+             name="FlexForceZ"
+             top_pad="4"
+             width="128" />
+
+            <check_box
+             height="16"
+             label="Light"
+             layout="topleft"
+             left="10"
+             name="Light Checkbox Ctrl"
+             tool_tip="Causes object to emit light"
+             top_pad="15"
+             width="60" />
+            <color_swatch
+             can_apply_immediately="true"
+             color="0.5 0.5 0.5 1"
+	     border.border_thickness="0"
+             follows="left|top"
+             height="50"
+             layout="topleft"
+             left_pad="10"
+             top_pad="-17"
+             name="colorswatch"
+             tool_tip="Click to open color picker"
+             width="40" />
+         <texture_picker
+            allow_no_texture="true"
+            top_delta="0"
+            can_apply_immediately="true"
+            default_image_name="Default"
+            follows="left|top"
+            height="48"
+            label=""
+            left_delta="57"
+            mouse_opaque="true"
+            name="light texture control"
+            tool_tip="Click to choose a projection image (only has effect with deferred rendering enabled)"
+            width="32" />
+          <spinner
+             follows="left|top"
+             height="19"
+             initial_value="0.5"
+             label="Intensity"
+             label_width="70"
+             layout="topleft"
+             left="10"
+             name="Light Intensity"
+             top_pad="3"
+             width="128" />
+          <spinner bottom_delta="0"
+                   decimal_digits="3"
+                   follows="left|top"
+                   height="16"
+                   increment="0.1"
+                   initial_value="0.5"
+                   label="FOV"
+                   label_width="55"
+                   left="144"
+                   max_val="3"
+                   min_val="0"
+                   mouse_opaque="true"
+                   name="Light FOV"
+                   width="120" />
+          <spinner follows="left|top"
+                   height="19"
+                   initial_value="5"
+                   label="Radius"
+                   label_width="70"
+                   layout="topleft"
+                   left="10"
+                   max_val="20"
+                   name="Light Radius"
+                   top_pad="3"
+                   width="128" />
+          <spinner bottom_delta="0"
+                   decimal_digits="3"
+                   follows="left|top"
+                   height="16"
+                   increment="0.5"
+                   initial_value="0.5"
+                   label="Focus"
+                   label_width="55"
+                   left="144"
+                   max_val="20"
+                   min_val="-20"
+                   mouse_opaque="true"
+                   name="Light Focus"
+                   width="120" />
+          <spinner follows="left|top"
+                   height="19"
+                   increment="0.25"
+                   initial_value="1"
+                   label="Falloff"
+                   label_width="70"
+                   layout="topleft"
+                   left="10"
+                   max_val="2"
+                   name="Light Falloff"
+                   top_pad="3"
+                   width="128" />
+          <spinner bottom_delta="0"
+                   decimal_digits="3"
+                   follows="left|top"
+                   height="16"
+                   increment="0.05"
+                   initial_value="1"
+                   label="Ambiance"
+                   label_width="55"
+                   left="144"
+                   max_val="1"
+                   min_val="0"
+                   mouse_opaque="true"
+                   name="Light Ambiance"
+                   width="120" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             name="label physicsshapetype"
+             top="38"
+             width="121">
+                Physics Shape Type:
+            </text>
+			<combo_box
+			   height="19"
+			   top_delta="15" 
+			   layout="topleft"
+			   follows="left|top"
+			   name="Physics Shape Type Combo Ctrl"
+			   tool_tip="Choose the physics shape type"
+			   width="108"/>
+            <combo_box
+             height="19"
+             layout="topleft"
+             name="material"
+             top_pad="5"
+             width="150">
+                <combo_box.item
+                 label="Stone"
+                 name="Stone"
+                 value="Stone" />
+                <combo_box.item
+                 label="Metal"
+                 name="Metal"
+                 value="Metal" />
+                <combo_box.item
+                 label="Glass"
+                 name="Glass"
+                 value="Glass" />
+                <combo_box.item
+                 label="Wood"
+                 name="Wood"
+                 value="Wood" />
+                <combo_box.item
+                 label="Flesh"
+                 name="Flesh"
+                 value="Flesh" />
+                <combo_box.item
+                 label="Plastic"
+                 name="Plastic"
+                 value="Plastic" />
+                <combo_box.item
+                 label="Rubber"
+                 name="Rubber"
+                 value="Rubber" />
+            </combo_box>
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="1"
+             initial_value="1"
+             label="Gravity"
+             label_width="70"
+             layout="topleft"
+             min_val="-1"
+             max_val="28"
+             name="Physics Gravity"
+             top_pad="10"
+             width="132" />
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.1"
+             initial_value="0"
+             label="Friction"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="255"
+             min_val="0"
+             name="Physics Friction"
+             top_pad="4"
+             width="132" />
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.1"
+             initial_value="0"
+             label="Density"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="22587"
+             min_val="1"
+             name="Physics Density"
+             top_pad="4"
+             width="132" />
+
+            <spinner
+             follows="left|top"
+             height="19"
+             increment="0.01"
+             initial_value="0"
+             label="Restitution"
+             label_width="70"
+             layout="topleft"
+             left_delta="0"
+             max_val="1"
+             min_val="0"
+             name="Physics Restitution"
+             top_pad="4"
+             width="132" />
+        </panel>
+         <panel
+         border="false"
+         follows="all"
+         height="367"
+         label="Texture"
+         layout="topleft"
+         left_delta="0"
+         mouse_opaque="false"
+         help_topic="toolbox_texture_tab"
+         name="Texture"
+         top_delta="0"
+         width="295">
+            <panel.string
+             name="string repeats per meter">
+                Repeats Per Meter
+            </panel.string>
+            <panel.string
+             name="string repeats per face">
+                Repeats Per Face
+            </panel.string>
+            <texture_picker
+             can_apply_immediately="true"
+             default_image_name="Default"
+             fallback_image="locked_image.j2c"
+             follows="left|top"
+             height="80"
+             label="Texture"
+             layout="topleft"
+             left="10"
+             name="texture control"
+             tool_tip="Click to choose a picture"
+             top="8"
+             width="64" />
+            <color_swatch
+             can_apply_immediately="true"
+             follows="left|top"
+             height="80"
+             label="Color"
+             layout="topleft"
+             left_pad="15"
+             name="colorswatch"
+             tool_tip="Click to open color picker"
+             top_delta="0"
+             width="64" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_pad="15"
+             name="color trans"
+             text_readonly_color="LabelDisabledColor"
+             top="6"
+             width="110">
+                Transparency %
+            </text>
+            <spinner
+             decimal_digits="0"
+             follows="left|top"
+             height="19"
+             increment="2"
+             initial_value="0"
+             layout="topleft"
+             left_delta="0"
+             max_val="100"
+             name="ColorTrans"
+             top_pad="4"
+             width="80" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_delta="0"
+             name="glow label"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="8"
+             width="80">
+                Glow
+            </text>
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             layout="topleft"
+             left_delta="0"
+             name="glow"
+             top_pad="4"
+             width="80" />
+            <check_box
+             height="19"
+             label="Full Bright"
+             layout="topleft"
+             left_delta="-5"
+             name="checkbox fullbright"
+             top_pad="4"
+             width="81" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="10"
+             name="tex gen"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="5"
+             width="90">
+                Mapping
+            </text>
+            <combo_box
+             height="23"
+             layout="topleft"
+             left_delta="0"
+             name="combobox texgen"
+             top_pad="4"
+             width="90">
+                <combo_box.item
+                 label="Default"
+                 name="Default"
+                 value="Default" />
+                <combo_box.item
+                 label="Planar"
+                 name="Planar"
+                 value="Planar" />
+            </combo_box>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             name="label shininess"
+             left_pad="4"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="-37"
+             width="90">
+                Shininess
+            </text>
+            <combo_box
+             height="23"
+             layout="topleft"
+             left_delta="0"
+             name="combobox shininess"
+             top_pad="4"
+             width="90">
+                <combo_box.item
+                 label="None"
+                 name="None"
+                 value="None" />
+                <combo_box.item
+                 label="Low"
+                 name="Low"
+                 value="Low" />
+                <combo_box.item
+                 label="Medium"
+                 name="Medium"
+                 value="Medium" />
+                <combo_box.item
+                 label="High"
+                 name="High"
+                 value="High" />
+            </combo_box>
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left_pad="4"
+             name="label bumpiness"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="-37"
+             width="90">
+                Bumpiness
+            </text>
+            <combo_box
+             height="23"
+             layout="topleft"
+             left_delta="0"
+             name="combobox bumpiness"
+             top_pad="4"
+             width="90">
+                <combo_box.item
+                 label="None"
+                 name="None"
+                 value="None" />
+                <combo_box.item
+                 label="Brightness"
+                 name="Brightness"
+                 value="Brightness" />
+                <combo_box.item
+                 label="Darkness"
+                 name="Darkness"
+                 value="Darkness" />
+                <combo_box.item
+                 label="woodgrain"
+                 name="woodgrain"
+                 value="woodgrain" />
+                <combo_box.item
+                 label="bark"
+                 name="bark"
+                 value="bark" />
+                <combo_box.item
+                 label="bricks"
+                 name="bricks"
+                 value="bricks" />
+                <combo_box.item
+                 label="checker"
+                 name="checker"
+                 value="checker" />
+                <combo_box.item
+                 label="concrete"
+                 name="concrete"
+                 value="concrete" />
+                <combo_box.item
+                 label="crustytile"
+                 name="crustytile"
+                 value="crustytile" />
+                <combo_box.item
+                 label="cutstone"
+                 name="cutstone"
+                 value="cutstone" />
+                <combo_box.item
+                 label="discs"
+                 name="discs"
+                 value="discs" />
+                <combo_box.item
+                 label="gravel"
+                 name="gravel"
+                 value="gravel" />
+                <combo_box.item
+                 label="petridish"
+                 name="petridish"
+                 value="petridish" />
+                <combo_box.item
+                 label="siding"
+                 name="siding"
+                 value="siding" />
+                <combo_box.item
+                 label="stonetile"
+                 name="stonetile"
+                 value="stonetile" />
+                <combo_box.item
+                 label="stucco"
+                 name="stucco"
+                 value="stucco" />
+                <combo_box.item
+                 label="suction"
+                 name="suction"
+                 value="suction" />
+                <combo_box.item
+                 label="weave"
+                 name="weave"
+                 value="weave" />
+            </combo_box>
+          <!--
+            <line_editor
+             bevel_style="in"
+             border_style="line"
+             border_thickness="1"
+             follows="left|top"
+             height="16"
+             layout="topleft"
+             left="10"
+             max_length_bytes="63"
+             name="Home Url"
+             select_on_focus="true"
+             top="134"
+             width="250" />
+            <check_box
+             height="16"
+             label="Media Face"
+             layout="topleft"
+             left_delta="0"
+             name="has media"
+             top_pad="6"
+             width="70" />
+            <button
+             follows="left|top"
+             font="SansSerifSmall"
+             height="20"
+             label="Set Media Info"
+             label_selected="Set Media Info"
+             layout="topleft"
+             left_pad="60"
+             name="media info set"
+             top_delta="-4"
+             width="120" />
+-->
+            <check_box
+             follows="top|left"
+             height="16"
+             initial_value="false"
+             label="Align planar faces"
+             layout="topleft"
+             left="17"
+             name="checkbox planar align"
+             tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."
+             top_delta="26"
+             width="140" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="10"
+             name="rpt"
+             text_readonly_color="LabelDisabledColor"
+             top_pad="2"
+             width="140">
+                Repeats / Face
+            </text>
+            <spinner
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             label="Horizontal (U)"
+             label_width="125"
+             layout="topleft"
+             left="20"
+             max_val="100"
+             name="TexScaleU"
+             top_pad="5"
+             width="185" />
+            <check_box
+             height="19"
+             label="Flip"
+             layout="topleft"
+             left_pad="5"
+             name="checkbox flip s"
+             top_delta="0"
+             width="70" />
+            <spinner
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             label="Vertical (V)"
+             label_width="125"
+             layout="topleft"
+             left="20"
+             max_val="100"
+             name="TexScaleV"
+             width="185" />
+            <check_box
+             height="19"
+             label="Flip"
+             layout="topleft"
+             left_pad="5"
+             name="checkbox flip t"
+             top_delta="0"
+             width="70" />
+            <spinner
+             decimal_digits="2"
+             follows="left|top"
+             height="19"
+             increment="1"
+             initial_value="0"
+			 label="RotationËš"
+             layout="topleft"
+			 label_width="135"
+             left="10"
+             max_val="9999"
+             min_val="-9999"
+             name="TexRot"
+             width="195" />
+
+            <spinner
+             decimal_digits="1"
+             follows="left|top"
+             height="23"
+             initial_value="1"
+			 label="Repeats / Meter"
+             layout="topleft"
+			 label_width="135"
+             left="10"
+             max_val="10"
+             min_val="0.1"
+             name="rptctrl"
+             width="195" />
+            <button
+             follows="left|top"
+             height="23"
+             label="Apply"
+             label_selected="Apply"
+             layout="topleft"
+             left_pad="5"
+             name="button apply"
+             width="75" />
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="10"
+             layout="topleft"
+             left="10"
+             name="tex offset"
+             text_readonly_color="LabelDisabledColor"
+             width="200">
+                Texture Offset
+            </text>
+            <spinner
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             label="Horizontal (U)"
+             label_width="125"
+             layout="topleft"
+             left="20"
+             min_val="-1"
+             name="TexOffsetU"
+             width="185" />
+            <spinner
+             follows="left|top"
+             height="19"
+             initial_value="0"
+             label="Vertical (V)"
+             label_width="125"
+             layout="topleft"
+             left_delta="0"
+             min_val="-1"
+             name="TexOffsetV"
+             top_pad="1"
+             width="185" />
+        <panel
+         border="false"
+         follows="left|top"
+         layout="topleft"
+         mouse_opaque="false"
+         background_visible="true"
+         bg_alpha_color="DkGray"
+         name="Add_Media"
+         left="0"
+         height="47"
+         width="290">
+            <text
+             type="string"
+             length="1"
+             follows="left|top"
+             height="18"
+             layout="topleft"
+             left="10"
+             top_pad="3"
+             name="media_tex"
+             width="190">
+              Media
+			</text>
+			<button
+			 follows="top|left"
+			 height="18"
+			 image_selected="AddItem_Press"
+			 image_unselected="AddItem_Off"
+			 image_disabled="AddItem_Disabled"
+			 layout="topleft"
+			 left_pad="0"
+			 name="add_media"
+			 tab_stop="false"
+			 top_delta="0"
+			 tool_tip="Add Media"
+			 width="18">
+				<button.commit_callback
+				function="BuildTool.AddMedia"/>
+			</button>
+			<button
+			 follows="top|left"
+			 height="18"
+			 image_selected="TrashItem_Press"
+			 image_unselected="TrashItem_Off"
+			 layout="topleft"
+			 left_pad="5"
+			 name="delete_media"
+			 tool_tip="Delete this media texture"
+			 top_delta="0"
+			 width="18">
+				<button.commit_callback
+				function="BuildTool.DeleteMedia"/>
+			</button>
+			<button
+			 follows="top|left"
+			 tool_tip="Edit this Media"
+			 height="12"
+             image_disabled="Icon_Gear_Background"
+             image_selected="Icon_Gear_Press"
+             image_unselected="Icon_Gear_Foreground"
+			 layout="topleft"
+			 left_pad="10"
+			 name="edit_media"
+			 top_delta="3"
+			 width="12">
+				<button.commit_callback
+				function="BuildTool.EditMedia"/>
+			</button>
+      <text
+			 follows="left|top|right"
+			 height="9"
+			 layout="topleft"
+			 left="10"
+                         use_ellipses="true"
+			 read_only="true"
+			 name="media_info"
+			 width="280" />
+      <web_browser
+        visible="false"
+        enabled="false"
+        border_visible="true"
+        bottom_delta="0"
+        follows="top|left"
+        left="0"
+        name="title_media"
+        width="4"
+        height="4"
+        start_url="about:blank"
+        decouple_texture_size="true" />
+     <button
+			 follows="right|top"
+			 height="22"
+			 label="Align"
+			 label_selected="Align Media"
+			 layout="topleft"
+			 right="-16"
+			 name="button align"
+			 top_delta="-4"
+			 tool_tip="Align media texture (must load first)"
+			 width="80" />
+		</panel>
+	   </panel>
+       <panel
+         border="false"
+         follows="all"
+         label="Content"
+         layout="topleft"
+         left_delta="0"
+         mouse_opaque="false"
+         help_topic="toolbox_contents_tab"
+         name="Contents"
+         top_delta="0"
+         width="295">
+            <button
+             follows="left|top"
+             height="23"
+             label="New Script"
+             label_selected="New Script"
+             layout="topleft"
+             left="10"
+             name="button new script"
+             top="10"
+             width="134" />
+            <button
+             follows="left|top"
+             height="23"
+             label="Permissions"
+             layout="topleft"
+             left_pad="8"
+             name="button permissions"
+             width="134" />
+            <panel_inventory_object
+             border="true"
+             border_visible="true"
+             bevel_style="in"
+             follows="left|top|right"
+             height="325"
+             layout="topleft"
+             left="10"
+             name="contents_inventory"
+             top="50"
+             width="275" />
+		</panel>
+        </tab_container>
+	<panel
+	 follows="left|top"
+     height="384"
+     layout="topleft"
+     left_delta="0"
+     name="land info panel"
+     top_delta="0"
+     width="295">
+    <text
+         type="string"
+         length="1"
+         font="SansSerifBig"
+         follows="left|top"
+         height="19"
+         layout="topleft"
+         left="20"
+         name="label_parcel_info"
+         top="24"
+         width="240">
+            Parcel Information
+        </text>
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="19"
+         layout="topleft"
+         left="30"
+         name="label_area_price"
+         top="48"
+         width="150">
+            Price: L$[PRICE] for [AREA] m²
+        </text>
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="19"
+         layout="topleft"
+         left_delta="0"
+         name="label_area"
+         top_delta="0"
+         width="150">
+            Area: [AREA] m²
+        </text>
+        <button
+         follows="left|top"
+         height="23"
+         label="About Land"
+         label_selected="About Land"
+         layout="topleft"
+         left_delta="0"
+         name="button about land"
+         top_pad="4"
+         width="125" />
+        <check_box
+         control_name="ShowParcelOwners"
+         height="19"
+         label="Show owners"
+         layout="topleft"
+         left_delta="0"
+         name="checkbox show owners"
+         tool_tip="Colorize the parcels according to the type of owner: &#10;&#10;Green = Your land &#10;Aqua = Your group&apos;s land &#10;Red = Owned by others &#10;Yellow = For sale &#10;Purple = For auction &#10;Grey = Public"
+         top_pad="8"
+         width="205" />
+        <text
+         type="string"
+         length="1"
+         font="SansSerifBig"
+         follows="left|top"
+         height="19"
+         layout="topleft"
+         left="20"
+         name="label_parcel_modify"
+         top="152"
+         width="240">
+            Modify Parcel
+        </text>
+        <button
+         follows="left|top"
+         height="23"
+         label="Subdivide"
+         label_selected="Subdivide"
+         layout="topleft"
+         left="30"
+         name="button subdivide land"
+         top="172"
+         width="125" />
+        <button
+         follows="left|top"
+         height="23"
+         label="Join"
+         label_selected="Join"
+         layout="topleft"
+         left_delta="0"
+         name="button join land"
+         top_pad="4"
+         width="125" />
+        <text
+         type="string"
+         length="1"
+         font="SansSerifBig"
+         follows="left|top"
+         height="19"
+         layout="topleft"
+         left="20"
+         name="label_parcel_trans"
+         top="256"
+         width="240">
+            Land Transactions
+        </text>
+        <button
+         follows="left|top"
+         height="23"
+         label="Buy Land"
+         label_selected="Buy Land"
+         layout="topleft"
+         left="30"
+         name="button buy land"
+         top="276"
+         width="125" />
+        <button
+         follows="left|top"
+         height="23"
+         label="Abandon Land"
+         label_selected="Abandon Land"
+         layout="topleft"
+         left_delta="0"
+         name="button abandon land"
+         top_pad="4"
+         width="125" />
+ </panel>
+<!-- end of tabs -->
+</floater>
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index e5ae0b950a9d004c8dae3e5bcc3e8edaf517874e..3ead67ca57f85efe27c303cc30c971a6109dbb01 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -8,12 +8,6 @@
  tab_stop="false" 
  name="main_view"
  width="1024">
-  <panel top="0"
-     follows="all"
-     height="768"
-     mouse_opaque="false"
-     name="login_panel_holder"
-     width="1024"/>
   <layout_stack border_size="0"
                 follows="all"
                 mouse_opaque="false"
@@ -133,7 +127,14 @@
                       user_resize="false"
                       visible="false"
                       width="333"/>
-      </layout_stack>      
+      </layout_stack>
+      <panel top="0"
+         follows="all"
+         height="500"
+         mouse_opaque="false"
+         name="login_panel_holder"
+         width="1024"/>
+
       <panel follows="all"
                     height="500"
                     left="0"
@@ -171,6 +172,7 @@
          top="0" 
          width="1024"
          visible="false"/>
+  
   <view mouse_opaque="false"
         follows="all"
         name="menu_bar_holder"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 4bfb140d12bde0e12dfed85589d17124ce5293bc..81046e99a0a6f0fb2a2e77970b92638c9a5cba7e 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2348,6 +2348,16 @@
            function="Advanced.ToggleInfoDisplay"
            parameter="raycast" />
         </menu_item_check>
+		<menu_item_check
+         label="Sculpt"
+         name="Sculpt">
+          <menu_item_check.on_check
+           function="Advanced.CheckInfoDisplay"
+           parameter="sculpt" />
+          <menu_item_check.on_click
+           function="Advanced.ToggleInfoDisplay"
+           parameter="sculpt" />
+		</menu_item_check>
       </menu>
         <menu
          create_jump_keys="true"
@@ -2768,7 +2778,7 @@
           <menu_item_call
            label="Web Content Browser"
            name="Web Content Browser"
-           shortcut="control|alt|W">
+           shortcut="control|shift|Z">
             <menu_item_call.on_click
              function="Advanced.WebContentTest"
              parameter="http://google.com"/>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 2335ab3c11378865d7dce904c6e767c176807a66..ebfed990ec6cde6e01d85a1022de0a9f56a016b7 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6834,6 +6834,34 @@ Deed to group failed.
   <tag>fail</tag>
   </notification>
 
+  <notification
+   icon="notifytip.tga"
+   name="ReleaseLandThrottled"
+   type="notifytip">
+The parcel [PARCEL_NAME] can not be abandoned at this time.
+   <tag>fail</tag>
+  </notification>
+	
+  <notification
+   icon="notifytip.tga"
+   name="ReleasedLandWithReclaim"
+   type="notifytip">
+The [AREA] m² parcel &apos;[PARCEL_NAME]&apos; has been released.
+
+You will have [RECLAIM_PERIOD] hours to reclaim for L$0 before it is set for sale to anyone.
+   <tag>fail</tag>
+  </notification>
+	
+  <notification
+   icon="notifytip.tga"
+   name="ReleasedLandNoReclaim"
+   type="notifytip">
+The [AREA] m² parcel &apos;[PARCEL_NAME]&apos; has been released.
+
+It is now available for purchase by anyone.
+   <tag>fail</tag>
+  </notification>
+
   <notification
    icon="notifytip.tga"
    name="AvatarRezNotification"
@@ -7163,6 +7191,20 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
    notext="Don't Quit"/>
   </notification>
 
+  <notification
+ name="NoPlaceInfo"
+ label=""
+ type="alertmodal"
+ unique="true">
+    <tag>fail</tag>
+    <tag>confirm</tag>
+    Viewing place profile is only available in Advanced mode. Would you like to quit and change modes? The mode selector can be found on the login screen.
+    <usetemplate
+   name="okcancelbuttons"
+   yestext="Quit"
+   notext="Don't Quit"/>
+  </notification>
+  
   <notification
  name="NoPicks"
  label=""
@@ -7275,8 +7317,6 @@ The site at &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; in realm &apos;
    notext="Don't Quit"/>
   </notification>
 
-  </global>
-
   <global name="UnsupportedGLRequirements">
 You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_NAME] requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
 
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index a6e5e7a219495e5906a385a953bc5dd4969ad57f..c8f8d077013a3d1f10dba9a52b2516397d615775 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -47,13 +47,13 @@
          mouse_opaque="false"
 		 name="chat_bar_layout_panel"
          user_resize="true"
-         width="250" >
+     width="310" >
           <panel
             name="chat_bar"
             filename="panel_nearby_chat_bar.xml"
             left="0"
             height="28"
-            width="248"
+        width="308"
             top="0"
             mouse_opaque="false"
             follows="left|right"
@@ -341,7 +341,7 @@ Disabled for now.
          height="28"
          layout="topleft"
          min_height="28"
-         min_width="62"
+     min_width="52"
          mouse_opaque="false"
          name="mini_map_btn_panel"
          user_resize="false"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 404537e1f2d4268e6a882cd9a00bd598d2c13f54..cdc462109cdc2ab7fb9f0fc1742a75758487b356 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -150,7 +150,7 @@
      top_pad="20" 
      left="30" 
      height="10"
-     width="180">
+     width="400">
       Enable incoming chat popups:
       </text>
     <check_box
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 9ecab1a356f9326350556b63f31a75b6802827c5..f20ce5212577266b4054b5c602d98ac03d08da62 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -204,8 +204,7 @@
 		name="LocalLights"
 		 top_pad="1"
 		 width="256" />
-		width="256" />
-      <check_box
+		  <check_box
 		 control_name="VertexShaderEnable"
 		 height="16"
 		 initial_value="true"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index f89494da72b993c0a9f232668bb73332ec5d56cd..e374c89f218753b6cfbc168af5291f71e9e38e72 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -479,163 +479,12 @@
    width="190">
   </button>
     <panel
-     background_visible="false"
-     bg_alpha_color="DkGray"
+    layout="topleft"
+    filename="panel_sound_devices.xml"
      visiblity_control="ShowDeviceSettings"
-     border="false"
-     follows="top|left"
-     height="100"
-     label="Device Settings"
-     layout="topleft"
-     left_delta="-2"
      name="device_settings_panel"
-     class="panel_voice_device_settings"
-     width="470"
-     top_pad="0">
-      <panel.string
-        name="default_text">
-        Default
-      </panel.string>
-      <panel.string
-        name="default system device">
-        Default system device
-      </panel.string>
-      <panel.string
-        name="no device">
-        No device
-      </panel.string>
-      <icon
-             height="18"
-             image_name="Microphone_On"
-             left_delta="4"
-             name="microphone_icon"
-             mouse_opaque="false"
-             top="7"
-             visible="true"
-             width="18" />
-    <text
-     type="string"
-     length="1"
-      font.style="BOLD"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left_pad="3"
-     name="Input"
-     width="70">
-        Input
-    </text>
-    <combo_box
-     height="23"
-     control_name="VoiceInputAudioDevice"
-     layout="topleft"
-     left_pad="0"
-     max_chars="128"
-     name="voice_input_device"
-     top_delta="-5"
-     width="200" />
-   <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left_delta="-70"
-     name="My volume label"
-     top_pad="4"
-     width="200">
-        My volume:
-    </text>
-      <slider_bar
-        control_name="AudioLevelMic"
-     follows="left|top"
-     height="17"
-     increment="0.025"
-     initial_value="1.0"
-     layout="topleft"
-     left_delta="-6"
-     max_val="2"
-     name="mic_volume_slider"
-     tool_tip="Change the volume using this slider"
-     top_pad="-1"
-     width="220" />
-    <text
-     type="string"
-     text_color="EmphasisColor"
-     length="1"
-     follows="left|top"
-     height="18"
-     layout="topleft"
-     left_pad="5"
-     name="wait_text"
-     top_delta="-1"
-     width="110">
-        Please wait
-    </text>
-    <locate
-     height="20"
-     layout="topleft"
-     left_delta="0"
-     name="bar0"
-     top_delta="-2"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar1"
-     top_delta="0"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar2"
-     top_delta="0"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar3"
-     top_delta="0"
-     width="20" />
-    <locate
-     height="20"
-     layout="topleft"
-     left_pad="5"
-     name="bar4"
-     top_delta="0"
-     width="20" />
-          <icon
-             height="18"
-             image_name="Parcel_Voice_Light"
-             left="5"
-             name="speaker_icon"
-             mouse_opaque="false"
-             top_pad="3"
-             visible="true"
-             width="22" />
-    <text
-     font.style="BOLD"
-     type="string"
-     length="1"
-     follows="left|top"
-     height="15"
-     layout="topleft"
-     left_pad="0"
-     name="Output"
-     width="70">
-        Output
-    </text>
-    <combo_box
-     control_name="VoiceOutputAudioDevice"
-     height="23"
-     layout="topleft"
-     left_pad="0"
-     max_chars="128"
-     name="voice_output_device"
-     top_delta="-3"
-     width="200" />
-    </panel>
+    top="314"
+    width="345"
+    left="18"
+    class="panel_voice_device_settings"/>
     </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_sound_devices.xml b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ccae7c535092dc796c89424f6ff0911a742e724b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_sound_devices.xml
@@ -0,0 +1,155 @@
+<panel
+ background_visible="false"
+ bg_alpha_color="DkGray"
+ follows="all"
+ height="200"
+ label="Device Settings"
+ layout="topleft"
+ name="device_settings_panel"
+ width="360">
+	<panel.string
+	  name="default_text">
+		Default
+	</panel.string>
+	<icon
+		   height="18"
+		   image_name="Microphone_On"
+		   left_delta="4"
+		   name="microphone_icon"
+		   mouse_opaque="false"
+		   top="7"
+       layout="topleft"
+		   visible="true"
+		   width="18" />
+	<text
+     type="string"
+     length="1"
+      font.style="BOLD"
+     follows="left|top"
+     height="16"
+     layout="topleft"
+     left_pad="3"
+     name="Input"
+     width="70">
+		Input
+	</text>
+	<combo_box
+     height="23"
+     control_name="VoiceInputAudioDevice"
+     follows="left|top"
+     layout="topleft"
+     left_pad="0"
+     max_chars="128"
+     name="voice_input_device"
+     top_delta="-5"
+     width="200" />
+	<text
+	  type="string"
+	  length="1"
+	  follows="left|top"
+	  height="16"
+	  layout="topleft"
+	  left_delta="-70"
+	  name="My volume label"
+	  top_pad="4"
+	  width="200">
+		My volume:
+	</text>
+	<slider_bar
+	  control_name="AudioLevelMic"
+   follows="top|right|left"
+   height="17"
+   increment="0.025"
+   initial_value="1.0"
+   layout="topleft"
+   left_delta="-6"
+   max_val="2"
+   name="mic_volume_slider"
+   tool_tip="Change the volume using this slider"
+   top_pad="-1"
+   width="220" />
+	<text
+     type="string"
+     text_color="EmphasisColor"
+     length="1"
+     follows="right|top"
+     height="18"
+     layout="topleft"
+     left_pad="5"
+     name="wait_text"
+     top_delta="-1"
+     width="110">
+		Please wait
+	</text>
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_delta="0"
+     name="bar0"
+     top_delta="-2"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar1"
+     top_delta="0"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar2"
+     top_delta="0"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar3"
+     top_delta="0"
+     width="20" />
+  <locate
+     follows="right|top"
+     height="20"
+     layout="topleft"
+     left_pad="5"
+     name="bar4"
+     top_delta="0"
+     width="20" />
+	<icon
+	   height="18"
+	   image_name="Parcel_Voice_Light"
+	   left="5"
+	   name="speaker_icon"
+	   mouse_opaque="false"
+	   top_pad="3"
+	   visible="true"
+	   width="22" />
+	<text
+     font.style="BOLD"
+     type="string"
+     length="1"
+     follows="left|top"
+     height="15"
+     layout="topleft"
+     left_pad="0"
+     name="Output"
+     width="70">
+		Output
+	</text>
+	<combo_box
+     control_name="VoiceOutputAudioDevice"
+     height="23"
+     follows="left|top"
+     layout="topleft"
+     left_pad="0"
+     max_chars="128"
+     name="voice_output_device"
+     top_delta="-3"
+     width="200" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 2eb3cd73974e990eb185fe815d294ad93502f18c..2a6af23d3aeb71cfb837cfa55c9cea60570c67f1 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -58,6 +58,83 @@
 	<string name="Quit">Quit</string>
 	<string name="create_account_url">http://join.secondlife.com/</string>
 
+	<string name="LoginFailedViewerNotPermitted">
+The viewer you are using can no longer access Second Life. Please visit the following page to download a new viewer:
+http://secondlife.com/download
+
+For more information, see our FAQ below:
+http://secondlife.com/viewer-access-faq</string>
+	<string name="LoginIntermediateOptionalUpdateAvailable">Optional viewer update available: [VERSION]</string>
+	<string name="LoginFailedRequiredUpdate">Required viewer update: [VERSION]</string>
+	<string name="LoginFailedAlreadyLoggedIn">This agent is already logged in.
+</string>
+	<string name="LoginFailedAuthenticationFailed">Sorry! We couldn't log you in.
+Please check to make sure you entered the right
+    * Username (like bobsmith12 or steller.sunshine)
+    * Password
+Also, please make sure your Caps Lock key is off.</string>
+	<string name="LoginFailedPasswordChanged">As a security precaution your password has been changed.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+	<string name="LoginFailedPasswordReset">We made some changes to our system and you will need to reset your password.
+Please go to your account page at http://secondlife.com/password
+and answer the security question to reset your password.
+We are very sorry for the inconvenience.</string>
+	<string name="LoginFailedEmployeesOnly">Second Life is temporarily closed for maintenance.
+Logins are currently restricted to employees only.
+Check www.secondlife.com/status for updates.</string>
+	<string name="LoginFailedPremiumOnly">Second Life logins are temporarily restricted in order to make sure that those in-world have the best possible experience.
+	 	
+People with free accounts will not be able to access Second Life during this time, to make room for those who have paid for Second Life.</string>
+	<string name="LoginFailedComputerProhibited">Second Life cannot be accessed from this computer.
+If you feel this is an error, please contact
+support@secondlife.com.</string>
+	<string name="LoginFailedAcountSuspended">Your account is not accessible until
+[TIME] Pacific Time.</string>
+	<string name="LoginFailedAccountDisabled">We are unable to complete your request at this time.
+Please contact Second Life support for assistance at http://secondlife.com/support.
+If you are unable to change your password, please call (866) 476-9763.</string>
+	<string name="LoginFailedTransformError">Data inconsistency found during login.
+Please contact support@secondlife.com.</string>
+	<string name="LoginFailedAccountMaintenance">Your account is undergoing minor maintenance.
+Your account is not accessible until
+[TIME] Pacific Time.
+If you feel this is an error, please contact support@secondlife.com.</string>
+	<string name="LoginFailedPendingLogoutFault">Request for logout responded with a fault from simulator.</string>
+	<string name="LoginFailedPendingLogout">The system is logging you out right now.
+Your Account will not be available until
+[TIME] Pacific Time.</string>
+	<string name="LoginFailedUnableToCreateSession">Unable to create valid session.</string>
+	<string name="LoginFailedUnableToConnectToSimulator">Unable to connect to a simulator.</string>
+	<string name="LoginFailedRestrictedHours">Your account can only access Second Life
+between [START] and [END] Pacific Time.
+Please come back during those hours.
+If you feel this is an error, please contact support@secondlife.com.</string>
+	<string name="LoginFailedIncorrectParameters">Incorrect parameters.
+If you feel this is an error, please contact support@secondlife.com.</string>
+	<string name="LoginFailedFirstNameNotAlphanumeric">First name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+	<string name="LoginFailedLastNameNotAlphanumeric">Last name parameter must be alphanumeric.
+If you feel this is an error, please contact support@secondlife.com.</string>
+	<string name="LogoutFailedRegionGoingOffline">Region is going offline.
+Please try logging in again in a minute.</string>
+	<string name="LogoutFailedAgentNotInRegion">Agent not in region.
+Please try logging in again in a minute.</string>
+	<string name="LogoutFailedPendingLogin">The region was logging in another session.
+Please try logging in again in a minute.</string>
+	<string name="LogoutFailedLoggingOut">The region was logging out the previous session.
+Please try logging in again in a minute.</string>
+	<string name="LogoutFailedStillLoggingOut">The region is still logging out the previous session.
+Please try logging in again in a minute.</string>
+	<string name="LogoutSucceeded">Region has logged out last session.
+Please try logging in again in a minute.</string>
+	<string name="LogoutFailedLogoutBegun">Region has begun the logout process.
+Please try logging in again in a minute.</string>
+	<string name="LoginFailedLoggingOutSession">The system has begun logging out your last session.
+Please try logging in again in a minute.</string>
+
+
 	<!-- Disconnection -->
 	<string name="AgentLostConnection">This region may be experiencing trouble.  Please check your connection to the Internet.</string>
 	<string name="SavingSettings">Saving your settings...</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
index 99807d47175b745c99e85530b43da6069b3c4195..d27c14f4e70ba09d532f79b3608bed27a0205a10 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_p2p.xml
@@ -21,6 +21,7 @@
      width="20" />
     <chiclet_im_p2p.avatar_icon
      bottom="3"
+     color="white"
      follows="left|top|bottom"
      height="20"
      left="2"
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 3df0f9284208143903fae2a0af77df71889cbaa4..9ec9fcc581fe500514d0d317c8764f587e691d2b 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -1,484 +1,484 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="ACERCA DEL TERRENO">
-	<floater.string name="maturity_icon_general">
-		&quot;Parcel_PG_Dark&quot;
-	</floater.string>
-	<floater.string name="maturity_icon_moderate">
-		&quot;Parcel_M_Dark&quot;
-	</floater.string>
-	<floater.string name="maturity_icon_adult">
-		&quot;Parcel_R_Dark&quot;
-	</floater.string>
-	<floater.string name="Minutes">
-		[MINUTES] minutos
-	</floater.string>
-	<floater.string name="Minute">
-		minuto
-	</floater.string>
-	<floater.string name="Seconds">
-		[SECONDS] segundos
-	</floater.string>
-	<floater.string name="Remaining">
-		restantes
-	</floater.string>
-	<tab_container name="landtab">
-		<panel label="GENERAL" name="land_general_panel">
-			<panel.string name="new users only">
-				Sólo nuevos Residentes
-			</panel.string>
-			<panel.string name="anyone">
-				Cualquiera
-			</panel.string>
-			<panel.string name="area_text">
-				Superficie
-			</panel.string>
-			<panel.string name="area_size_text">
-				[AREA] m²
-			</panel.string>
-			<panel.string name="auction_id_text">
-				ID de la subasta: [ID]
-			</panel.string>
-			<panel.string name="need_tier_to_modify">
-				Debe aprobar su compra para modificar este terreno.
-			</panel.string>
-			<panel.string name="group_owned_text">
-				(Propiedad del grupo)
-			</panel.string>
-			<panel.string name="profile_text">
-				Perfil...
-			</panel.string>
-			<panel.string name="info_text">
-				Información...
-			</panel.string>
-			<panel.string name="public_text">
-				(público)
-			</panel.string>
-			<panel.string name="none_text">
-				(ninguno)
-			</panel.string>
-			<panel.string name="sale_pending_text">
-				(Venta pendiente)
-			</panel.string>
-			<panel.string name="no_selection_text">
-				No se ha seleccionado una parcela.
-Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
-			</panel.string>
-			<panel.string name="time_stamp_template">
-				[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
-			</panel.string>
-			<text name="Name:">
-				Nombre:
-			</text>
-			<text name="Description:">
-				Descripción:
-			</text>
-			<text name="LandType">
-				Tipo:
-			</text>
-			<text name="LandTypeText">
-				Mainland / Homestead
-			</text>
-			<text name="ContentRating">
-				Calificación:
-			</text>
-			<text name="ContentRatingText">
-				&apos;Adult&apos;
-			</text>
-			<text name="Owner:">
-				Propietario:
-			</text>
-			<text name="Group:">
-				Grupo:
-			</text>
-			<button label="Configurar" name="Set..."/>
-			<check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/>
-			<button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
-			<check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/>
-			<text name="For Sale:">
-				En venta:
-			</text>
-			<text name="Not for sale.">
-				No está en venta.
-			</text>
-			<text name="For Sale: Price L$[PRICE].">
-				Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
-			</text>
-			<button label="Vender el terreno" name="Sell Land..."/>
-			<text name="For sale to">
-				En venta a: [BUYER]
-			</text>
-			<text name="Sell with landowners objects in parcel." width="216">
-				Los objetos se incluyen en la venta.
-			</text>
-			<text name="Selling with no objects in parcel." width="216">
-				Los objetos no se incluyen en la venta.
-			</text>
-			<button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
-			<text name="Claimed:">
-				Reclamada:
-			</text>
-			<text name="DateClaimText">
-				Mar 15 Ago 15 13:47:25 2006
-			</text>
-			<text name="PriceLabel">
-				Superficie:
-			</text>
-			<text name="PriceText">
-				4048 m²
-			</text>
-			<text name="Traffic:">
-				Tráfico:
-			</text>
-			<text name="DwellText">
-				0
-			</text>
-			<button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
-			<button label="Información del script" name="Scripts..."/>
-			<button label="Comprar para el grupo" name="Buy For Group..."/>
-			<button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
-			<button label="Abandonar el terreno" name="Abandon Land..."/>
-			<button label="Reclamar el terreno" name="Reclaim Land..."/>
-			<button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
-		</panel>
-		<panel label="CONTRATO" name="land_covenant_panel">
-			<panel.string name="can_resell">
-				El terreno comprado en esta región se podrá revender.
-			</panel.string>
-			<panel.string name="can_not_resell">
-				El terreno comprado en esta región no se podrá revender.
-			</panel.string>
-			<panel.string name="can_change">
-				El terreno comprado en esta región se podrá unir o dividir.
-			</panel.string>
-			<panel.string name="can_not_change">
-				El terreno comprado en esta región no se podrá unir o dividir.
-			</panel.string>
-			<text name="estate_section_lbl">
-				Estado:
-			</text>
-			<text name="estate_name_text">
-				mainland
-			</text>
-			<text name="estate_owner_lbl">
-				Propietario:
-			</text>
-			<text name="estate_owner_text">
-				(nadie)
-			</text>
-			<text_editor name="covenant_editor">
-				No se ha aportado un contrato para este estado.
-			</text_editor>
-			<text name="covenant_timestamp_text">
-				Última modificación, Dic Miér 31 16:00:00 1969
-			</text>
-			<text name="region_section_lbl">
-				Región:
-			</text>
-			<text name="region_name_text">
-				leyla
-			</text>
-			<text name="region_landtype_lbl">
-				Tipo:
-			</text>
-			<text name="region_landtype_text">
-				Mainland / Homestead
-			</text>
-			<text name="region_maturity_lbl">
-				Calificación:
-			</text>
-			<text name="region_maturity_text">
-				&apos;Adult&apos;
-			</text>
-			<text name="resellable_lbl">
-				Revender:
-			</text>
-			<text name="resellable_clause">
-				El terreno de esta región no se podrá revender.
-			</text>
-			<text name="changeable_lbl">
-				Dividir:
-			</text>
-			<text name="changeable_clause">
-				El terreno de esta región no se podrá unir/dividir.
-			</text>
-		</panel>
-		<panel label="OBJETOS" name="land_objects_panel">
-			<panel.string name="objects_available_text">
-				[COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
-			</panel.string>
-			<panel.string name="objects_deleted_text">
-				[COUNT] de un máx. de [MAX] ([DELETED] se borrarán)
-			</panel.string>
-			<text name="parcel_object_bonus">
-				Plus de objetos en la región: [BONUS]
-			</text>
-			<text name="Simulator primitive usage:">
-				Uso de primitivas:
-			</text>
-			<text name="objects_available">
-				[COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
-			</text>
-			<text name="Primitives parcel supports:">
-				Prims que admite la parcela:
-			</text>
-			<text name="object_contrib_text">
-				[COUNT]
-			</text>
-			<text name="Primitives on parcel:">
-				Prims en la parcela:
-			</text>
-			<text name="total_objects_text">
-				[COUNT]
-			</text>
-			<text name="Owned by parcel owner:">
-				Del propietario de la parcela:
-			</text>
-			<text name="owner_objects_text">
-				[COUNT]
-			</text>
-			<button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/>
-			<button label="Devolver" name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios."/>
-			<text name="Set to group:">
-				Del grupo:
-			</text>
-			<text name="group_objects_text">
-				[COUNT]
-			</text>
-			<button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/>
-			<button label="Devolver" name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios."/>
-			<text name="Owned by others:">
-				Propiedad de otros:
-			</text>
-			<text name="other_objects_text">
-				[COUNT]
-			</text>
-			<button label="Mostrar" label_selected="Mostrar" name="ShowOther"/>
-			<button label="Devolver" name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios."/>
-			<text name="Selected / sat upon:">
-				Seleccionados / con gente sentada:
-			</text>
-			<text name="selected_objects_text">
-				[COUNT]
-			</text>
-			<text name="Autoreturn">
-				Devolución automát. de objetos de otros (en min., 0 la desactiva):
-			</text>
-			<line_editor name="clean other time"/>
-			<text name="Object Owners:">
-				Propietarios de los objetos:
-			</text>
-			<button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" tool_tip="Refresh Object List"/>
-			<button label="Devolver los objetos" name="Return objects..."/>
-			<name_list name="owner list">
-				<name_list.columns label="Tipo" name="type"/>
-				<name_list.columns label="Nombre" name="name"/>
-				<name_list.columns label="Núm." name="count"/>
-				<name_list.columns label="Más recientes" name="mostrecent"/>
-			</name_list>
-		</panel>
-		<panel label="OPCIONES" name="land_options_panel">
-			<panel.string name="search_enabled_tooltip">
-				Permitir que aparezca esta parcela en los resultados de la búsqueda
-			</panel.string>
-			<panel.string name="search_disabled_small_tooltip">
-				Esta opción está desactivada porque la parcela tiene 128 m² o menos.
-Sólo las parcelas más grandes pueden listarse en la búsqueda.
-			</panel.string>
-			<panel.string name="search_disabled_permissions_tooltip">
-				Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
-			</panel.string>
-			<panel.string name="mature_check_mature">
-				Contenido &apos;Mature&apos;
-			</panel.string>
-			<panel.string name="mature_check_adult">
-				Contenido &apos;Adult&apos;
-			</panel.string>
-			<panel.string name="mature_check_mature_tooltip">
-				La información o el contenido de su parcela se considera &apos;Mature&apos;.
-			</panel.string>
-			<panel.string name="mature_check_adult_tooltip">
-				La información o el contenido de su parcela se considera &apos;Adult&apos;.
-			</panel.string>
-			<panel.string name="landing_point_none">
-				(ninguno)
-			</panel.string>
-			<panel.string name="push_restrict_text">
-				Sin &apos;empujones&apos;
-			</panel.string>
-			<panel.string name="push_restrict_region_text">
-				Sin &apos;empujones&apos; (prevalece lo marcado en la región)
-			</panel.string>
-			<text name="allow_label">
-				Permitir a otros Residentes:
-			</text>
-			<check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
-			<check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
-			<text name="allow_label2">
-				Crear objetos:
-			</text>
-			<check_box label="Todos los residentes" name="edit objects check"/>
-			<check_box label="El grupo" name="edit group objects check"/>
-			<text name="allow_label3">
-				Dejar objetos:
-			</text>
-			<check_box label="Todos los residentes" name="all object entry check"/>
-			<check_box label="El grupo" name="group object entry check"/>
-			<text name="allow_label4">
-				Ejecutar scripts:
-			</text>
-			<check_box label="Todos los residentes" name="check other scripts"/>
-			<check_box label="El grupo" name="check group scripts"/>
-			<text name="land_options_label">
-				Opciones del terreno:
-			</text>
-			<check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
-			<check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
-			<check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
-			<combo_box name="land category with adult">
-				<combo_box.item label="Cualquier categoría" name="item0"/>
-				<combo_box.item label="Localización Linden" name="item1"/>
-				<combo_box.item label="&apos;Adult&apos;" name="item2"/>
-				<combo_box.item label="Arte y Cultura" name="item3"/>
-				<combo_box.item label="Negocios" name="item4"/>
-				<combo_box.item label="Educativo" name="item5"/>
-				<combo_box.item label="Juegos de azar" name="item6"/>
-				<combo_box.item label="Entretenimiento" name="item7"/>
-				<combo_box.item label="Para recién llegados" name="item8"/>
-				<combo_box.item label="Parques y Naturaleza" name="item9"/>
-				<combo_box.item label="Residencial" name="item10"/>
-				<combo_box.item label="Compras" name="item11"/>
-				<combo_box.item label="Terreno en alquiler" name="item13"/>
-				<combo_box.item label="Otra" name="item12"/>
-			</combo_box>
-			<combo_box name="land category">
-				<combo_box.item label="Cualquier categoría" name="item0"/>
-				<combo_box.item label="Localización Linden" name="item1"/>
-				<combo_box.item label="Arte y Cultura" name="item3"/>
-				<combo_box.item label="Negocios" name="item4"/>
-				<combo_box.item label="Educativo" name="item5"/>
-				<combo_box.item label="Juegos de azar" name="item6"/>
-				<combo_box.item label="Entretenimiento" name="item7"/>
-				<combo_box.item label="Para recién llegados" name="item8"/>
-				<combo_box.item label="Parques y Naturaleza" name="item9"/>
-				<combo_box.item label="Residencial" name="item10"/>
-				<combo_box.item label="Compras" name="item11"/>
-				<combo_box.item label="Terreno en alquiler" name="item13"/>
-				<combo_box.item label="Otra" name="item12"/>
-			</combo_box>
-			<check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
-			<text name="Snapshot:">
-				Foto:
-			</text>
-			<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
-			<text name="landing_point">
-				Punto de llegada: [LANDING]
-			</text>
-			<button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/>
-			<button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/>
-			<text name="Teleport Routing: ">
-				Punto de teleporte:
-			</text>
-			<combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes.">
-				<combo_box.item label="Bloqueado" name="Blocked"/>
-				<combo_box.item label="Punto de llegada" name="LandingPoint"/>
-				<combo_box.item label="Cualquiera" name="Anywhere"/>
-			</combo_box>
-		</panel>
-		<panel label="MEDIA" name="land_media_panel">
-			<text name="with media:" width="85">
-				Tipo de media:
-			</text>
-			<combo_box left="97" name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media"/>
-			<text name="at URL:" width="85">
-				Página inicial:
-			</text>
-			<line_editor left="97" name="media_url"/>
-			<button label="Definir" name="set_media_url"/>
-			<text name="Description:">
-				Descripción:
-			</text>
-			<line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/>
-			<text name="Media texture:">
-				Cambiar
-la textura:
-			</text>
-			<texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/>
-			<text name="replace_texture_help" width="285">
-				Cuando pulses la flecha &apos;play&apos;, los objetos que usen esta textura mostrarán la película o la página web.  Selecciona la miniatura para elegir una textura distinta.
-			</text>
-			<check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
-			<text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120">
-				Tamaño del media:
-			</text>
-			<spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
-			<spinner name="media_size_height" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
-			<text name="pixels">
-				píxeles
-			</text>
-			<text name="Options:">
-				Opciones de
-los media:
-			</text>
-			<check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
-		</panel>
-		<panel label="SONIDO" name="land_audio_panel">
-			<text name="MusicURL:">
-				URL de música:
-			</text>
-			<text name="Sound:">
-				Sonido:
-			</text>
-			<check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
-			<text name="Voice settings:">
-				Voz:
-			</text>
-			<check_box label="Activar la voz" name="parcel_enable_voice_channel"/>
-			<check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
-			<check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/>
-		</panel>
-		<panel label="ACCESO" name="land_access_panel">
-			<panel.string name="access_estate_defined">
-				(Definido por el Estado)
-			</panel.string>
-			<panel.string name="allow_public_access">
-				Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición)
-			</panel.string>
-			<panel.string name="estate_override">
-				Una o más de esta opciones está configurada a nivel del estado
-			</panel.string>
-			<text name="Limit access to this parcel to:">
-				Acceso a esta parcela
-			</text>
-			<check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
-			<text name="Only Allow">
-				Restringir el acceso a residentes verificados con:
-			</text>
-			<check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
-			<check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
-			<check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
-			<check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
-			<combo_box name="pass_combo">
-				<combo_box.item label="Cualquiera" name="Anyone"/>
-				<combo_box.item label="Grupo" name="Group"/>
-			</combo_box>
-			<spinner label="Precio en L$:" name="PriceSpin"/>
-			<spinner label="Horas de acceso:" name="HoursSpin"/>
-			<panel name="Allowed_layout_panel">
-				<text label="Always Allow" name="AllowedText">
-					Residentes autorizados
-				</text>
-				<name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
-				<button label="Añadir" name="add_allowed"/>
-				<button label="Quitar" label_selected="Quitar" name="remove_allowed"/>
-			</panel>
-			<panel name="Banned_layout_panel">
-				<text label="Ban" name="BanCheck">
-					Residentes con el acceso prohibido
-				</text>
-				<name_list name="BannedList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
-				<button label="Añadir" name="add_banned"/>
-				<button label="Quitar" label_selected="Quitar" name="remove_banned"/>
-			</panel>
-		</panel>
-	</tab_container>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterland" title="ACERCA DEL TERRENO">
+	<floater.string name="maturity_icon_general">
+		&quot;Parcel_PG_Dark&quot;
+	</floater.string>
+	<floater.string name="maturity_icon_moderate">
+		&quot;Parcel_M_Dark&quot;
+	</floater.string>
+	<floater.string name="maturity_icon_adult">
+		&quot;Parcel_R_Dark&quot;
+	</floater.string>
+	<floater.string name="Minutes">
+		[MINUTES] minutos
+	</floater.string>
+	<floater.string name="Minute">
+		minuto
+	</floater.string>
+	<floater.string name="Seconds">
+		[SECONDS] segundos
+	</floater.string>
+	<floater.string name="Remaining">
+		restantes
+	</floater.string>
+	<tab_container name="landtab">
+		<panel label="GENERAL" name="land_general_panel">
+			<panel.string name="new users only">
+				Sólo nuevos Residentes
+			</panel.string>
+			<panel.string name="anyone">
+				Cualquiera
+			</panel.string>
+			<panel.string name="area_text">
+				Superficie
+			</panel.string>
+			<panel.string name="area_size_text">
+				[AREA] m²
+			</panel.string>
+			<panel.string name="auction_id_text">
+				ID de la subasta: [ID]
+			</panel.string>
+			<panel.string name="need_tier_to_modify">
+				Debe aprobar su compra para modificar este terreno.
+			</panel.string>
+			<panel.string name="group_owned_text">
+				(Propiedad del grupo)
+			</panel.string>
+			<panel.string name="profile_text">
+				Perfil...
+			</panel.string>
+			<panel.string name="info_text">
+				Información...
+			</panel.string>
+			<panel.string name="public_text">
+				(público)
+			</panel.string>
+			<panel.string name="none_text">
+				(ninguno)
+			</panel.string>
+			<panel.string name="sale_pending_text">
+				(Venta pendiente)
+			</panel.string>
+			<panel.string name="no_selection_text">
+				No se ha seleccionado una parcela.
+Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
+			</panel.string>
+			<panel.string name="time_stamp_template">
+				[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+			</panel.string>
+			<text name="Name:">
+				Nombre:
+			</text>
+			<text name="Description:">
+				Descripción:
+			</text>
+			<text name="LandType">
+				Tipo:
+			</text>
+			<text name="LandTypeText">
+				Mainland / Homestead
+			</text>
+			<text name="ContentRating">
+				Calificación:
+			</text>
+			<text name="ContentRatingText">
+				Adulto
+			</text>
+			<text name="Owner:">
+				Propietario:
+			</text>
+			<text name="Group:">
+				Grupo:
+			</text>
+			<button label="Configurar" name="Set..."/>
+			<check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/>
+			<button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
+			<check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/>
+			<text name="For Sale:">
+				En venta:
+			</text>
+			<text name="Not for sale.">
+				No está en venta.
+			</text>
+			<text name="For Sale: Price L$[PRICE].">
+				Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
+			</text>
+			<button label="Vender el terreno" name="Sell Land..."/>
+			<text name="For sale to">
+				En venta a: [BUYER]
+			</text>
+			<text name="Sell with landowners objects in parcel." width="216">
+				Los objetos se incluyen en la venta.
+			</text>
+			<text name="Selling with no objects in parcel." width="216">
+				Los objetos no se incluyen en la venta.
+			</text>
+			<button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
+			<text name="Claimed:">
+				Reclamada:
+			</text>
+			<text name="DateClaimText">
+				Mar 15 Ago 15 13:47:25 2006
+			</text>
+			<text name="PriceLabel">
+				Superficie:
+			</text>
+			<text name="PriceText">
+				4048 m²
+			</text>
+			<text name="Traffic:">
+				Tráfico:
+			</text>
+			<text name="DwellText">
+				0
+			</text>
+			<button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
+			<button label="Información del script" name="Scripts..."/>
+			<button label="Comprar para el grupo" name="Buy For Group..."/>
+			<button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
+			<button label="Abandonar el terreno" name="Abandon Land..."/>
+			<button label="Reclamar el terreno" name="Reclaim Land..."/>
+			<button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
+		</panel>
+		<panel label="CONTRATO" name="land_covenant_panel">
+			<panel.string name="can_resell">
+				El terreno comprado en esta región se podrá revender.
+			</panel.string>
+			<panel.string name="can_not_resell">
+				El terreno comprado en esta región no se podrá revender.
+			</panel.string>
+			<panel.string name="can_change">
+				El terreno comprado en esta región se podrá unir o dividir.
+			</panel.string>
+			<panel.string name="can_not_change">
+				El terreno comprado en esta región no se podrá unir o dividir.
+			</panel.string>
+			<text name="estate_section_lbl">
+				Estado:
+			</text>
+			<text name="estate_name_text">
+				mainland
+			</text>
+			<text name="estate_owner_lbl">
+				Propietario:
+			</text>
+			<text name="estate_owner_text">
+				(nadie)
+			</text>
+			<text_editor name="covenant_editor">
+				No se ha aportado un contrato para este estado.
+			</text_editor>
+			<text name="covenant_timestamp_text">
+				Última modificación, Dic Miér 31 16:00:00 1969
+			</text>
+			<text name="region_section_lbl">
+				Región:
+			</text>
+			<text name="region_name_text">
+				leyla
+			</text>
+			<text name="region_landtype_lbl">
+				Tipo:
+			</text>
+			<text name="region_landtype_text">
+				Mainland / Homestead
+			</text>
+			<text name="region_maturity_lbl">
+				Calificación:
+			</text>
+			<text name="region_maturity_text">
+				Adulto
+			</text>
+			<text name="resellable_lbl">
+				Revender:
+			</text>
+			<text name="resellable_clause">
+				El terreno de esta región no se podrá revender.
+			</text>
+			<text name="changeable_lbl">
+				Dividir:
+			</text>
+			<text name="changeable_clause">
+				El terreno de esta región no se podrá unir/dividir.
+			</text>
+		</panel>
+		<panel label="OBJETOS" name="land_objects_panel">
+			<panel.string name="objects_available_text">
+				[COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
+			</panel.string>
+			<panel.string name="objects_deleted_text">
+				[COUNT] de un máx. de [MAX] ([DELETED] se borrarán)
+			</panel.string>
+			<text name="parcel_object_bonus">
+				Plus de objetos en la región: [BONUS]
+			</text>
+			<text name="Simulator primitive usage:">
+				Uso de primitivas:
+			</text>
+			<text name="objects_available">
+				[COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
+			</text>
+			<text name="Primitives parcel supports:">
+				Prims que admite la parcela:
+			</text>
+			<text name="object_contrib_text">
+				[COUNT]
+			</text>
+			<text name="Primitives on parcel:">
+				Prims en la parcela:
+			</text>
+			<text name="total_objects_text">
+				[COUNT]
+			</text>
+			<text name="Owned by parcel owner:">
+				Del propietario de la parcela:
+			</text>
+			<text name="owner_objects_text">
+				[COUNT]
+			</text>
+			<button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/>
+			<button label="Devolver" name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios."/>
+			<text name="Set to group:">
+				Del grupo:
+			</text>
+			<text name="group_objects_text">
+				[COUNT]
+			</text>
+			<button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/>
+			<button label="Devolver" name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios."/>
+			<text name="Owned by others:">
+				Propiedad de otros:
+			</text>
+			<text name="other_objects_text">
+				[COUNT]
+			</text>
+			<button label="Mostrar" label_selected="Mostrar" name="ShowOther"/>
+			<button label="Devolver" name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios."/>
+			<text name="Selected / sat upon:">
+				Seleccionados / con gente sentada:
+			</text>
+			<text name="selected_objects_text">
+				[COUNT]
+			</text>
+			<text name="Autoreturn">
+				Devolución automát. de objetos de otros (en min., 0 la desactiva):
+			</text>
+			<line_editor name="clean other time"/>
+			<text name="Object Owners:">
+				Propietarios de los objetos:
+			</text>
+			<button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" tool_tip="Refresh Object List"/>
+			<button label="Devolver los objetos" name="Return objects..."/>
+			<name_list name="owner list">
+				<name_list.columns label="Tipo" name="type"/>
+				<name_list.columns label="Nombre" name="name"/>
+				<name_list.columns label="Núm." name="count"/>
+				<name_list.columns label="Más recientes" name="mostrecent"/>
+			</name_list>
+		</panel>
+		<panel label="OPCIONES" name="land_options_panel">
+			<panel.string name="search_enabled_tooltip">
+				Permitir que aparezca esta parcela en los resultados de la búsqueda
+			</panel.string>
+			<panel.string name="search_disabled_small_tooltip">
+				Esta opción está desactivada porque la parcela tiene 128 m² o menos.
+Sólo las parcelas más grandes pueden listarse en la búsqueda.
+			</panel.string>
+			<panel.string name="search_disabled_permissions_tooltip">
+				Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
+			</panel.string>
+			<panel.string name="mature_check_mature">
+				Contenido Moderado
+			</panel.string>
+			<panel.string name="mature_check_adult">
+				Contenido Adulto
+			</panel.string>
+			<panel.string name="mature_check_mature_tooltip">
+				La información o el contenido de su parcela se considera Moderado.
+			</panel.string>
+			<panel.string name="mature_check_adult_tooltip">
+				La información o el contenido de su parcela se considera Adulto.
+			</panel.string>
+			<panel.string name="landing_point_none">
+				(ninguno)
+			</panel.string>
+			<panel.string name="push_restrict_text">
+				Sin &apos;empujones&apos;
+			</panel.string>
+			<panel.string name="push_restrict_region_text">
+				Sin &apos;empujones&apos; (prevalece lo marcado en la región)
+			</panel.string>
+			<text name="allow_label">
+				Permitir a otros Residentes:
+			</text>
+			<check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
+			<check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
+			<text name="allow_label2">
+				Crear objetos:
+			</text>
+			<check_box label="Todos los residentes" name="edit objects check"/>
+			<check_box label="El grupo" name="edit group objects check"/>
+			<text name="allow_label3">
+				Dejar objetos:
+			</text>
+			<check_box label="Todos los residentes" name="all object entry check"/>
+			<check_box label="El grupo" name="group object entry check"/>
+			<text name="allow_label4">
+				Ejecutar scripts:
+			</text>
+			<check_box label="Todos los residentes" name="check other scripts"/>
+			<check_box label="El grupo" name="check group scripts"/>
+			<text name="land_options_label">
+				Opciones del terreno:
+			</text>
+			<check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
+			<check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
+			<check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+			<combo_box name="land category with adult">
+				<combo_box.item label="Cualquier categoría" name="item0"/>
+				<combo_box.item label="Localización Linden" name="item1"/>
+				<combo_box.item label="Adulto" name="item2"/>
+				<combo_box.item label="Arte y Cultura" name="item3"/>
+				<combo_box.item label="Negocios" name="item4"/>
+				<combo_box.item label="Educativo" name="item5"/>
+				<combo_box.item label="Juegos de azar" name="item6"/>
+				<combo_box.item label="Entretenimiento" name="item7"/>
+				<combo_box.item label="Para recién llegados" name="item8"/>
+				<combo_box.item label="Parques y Naturaleza" name="item9"/>
+				<combo_box.item label="Residencial" name="item10"/>
+				<combo_box.item label="Compras" name="item11"/>
+				<combo_box.item label="Terreno en alquiler" name="item13"/>
+				<combo_box.item label="Otra" name="item12"/>
+			</combo_box>
+			<combo_box name="land category">
+				<combo_box.item label="Cualquier categoría" name="item0"/>
+				<combo_box.item label="Localización Linden" name="item1"/>
+				<combo_box.item label="Arte y Cultura" name="item3"/>
+				<combo_box.item label="Negocios" name="item4"/>
+				<combo_box.item label="Educativo" name="item5"/>
+				<combo_box.item label="Juegos de azar" name="item6"/>
+				<combo_box.item label="Entretenimiento" name="item7"/>
+				<combo_box.item label="Para recién llegados" name="item8"/>
+				<combo_box.item label="Parques y Naturaleza" name="item9"/>
+				<combo_box.item label="Residencial" name="item10"/>
+				<combo_box.item label="Compras" name="item11"/>
+				<combo_box.item label="Terreno en alquiler" name="item13"/>
+				<combo_box.item label="Otra" name="item12"/>
+			</combo_box>
+			<check_box label="Contenido Moderado" name="MatureCheck" tool_tip=""/>
+			<text name="Snapshot:">
+				Foto:
+			</text>
+			<texture_picker label="" name="snapshot_ctrl" tool_tip="Pulse para elegir una imagen"/>
+			<text name="landing_point">
+				Punto de llegada: [LANDING]
+			</text>
+			<button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/>
+			<button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/>
+			<text name="Teleport Routing: ">
+				Punto de teleporte:
+			</text>
+			<combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes.">
+				<combo_box.item label="Bloqueado" name="Blocked"/>
+				<combo_box.item label="Punto de llegada" name="LandingPoint"/>
+				<combo_box.item label="Cualquiera" name="Anywhere"/>
+			</combo_box>
+		</panel>
+		<panel label="MEDIA" name="land_media_panel">
+			<text name="with media:" width="85">
+				Tipo de media:
+			</text>
+			<combo_box left="97" name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media"/>
+			<text name="at URL:" width="85">
+				Página inicial:
+			</text>
+			<line_editor left="97" name="media_url"/>
+			<button label="Definir" name="set_media_url"/>
+			<text name="Description:">
+				Descripción:
+			</text>
+			<line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/>
+			<text name="Media texture:">
+				Cambiar
+la textura:
+			</text>
+			<texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/>
+			<text name="replace_texture_help" width="285">
+				Cuando pulses la flecha &apos;play&apos;, los objetos que usen esta textura mostrarán la película o la página web.  Selecciona la miniatura para elegir una textura distinta.
+			</text>
+			<check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
+			<text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120">
+				Tamaño del media:
+			</text>
+			<spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
+			<spinner name="media_size_height" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
+			<text name="pixels">
+				píxeles
+			</text>
+			<text name="Options:">
+				Opciones de
+los media:
+			</text>
+			<check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
+		</panel>
+		<panel label="SONIDO" name="land_audio_panel">
+			<text name="MusicURL:">
+				URL de música:
+			</text>
+			<text name="Sound:">
+				Sonido:
+			</text>
+			<check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/>
+			<text name="Voice settings:">
+				Voz:
+			</text>
+			<check_box label="Activar la voz" name="parcel_enable_voice_channel"/>
+			<check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+			<check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/>
+		</panel>
+		<panel label="ACCESO" name="land_access_panel">
+			<panel.string name="access_estate_defined">
+				(Definido por el Estado)
+			</panel.string>
+			<panel.string name="allow_public_access">
+				Permitir el acceso público ([MATURITY]) (Nota: Si no seleccionas esta opción, se crearán líneas de prohibición)
+			</panel.string>
+			<panel.string name="estate_override">
+				Una o más de esta opciones está configurada a nivel del estado
+			</panel.string>
+			<text name="Limit access to this parcel to:">
+				Acceso a esta parcela
+			</text>
+			<check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
+			<text name="Only Allow">
+				Restringir el acceso a residentes verificados con:
+			</text>
+			<check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
+			<check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
+			<check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
+			<check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
+			<combo_box name="pass_combo">
+				<combo_box.item label="Cualquiera" name="Anyone"/>
+				<combo_box.item label="Grupo" name="Group"/>
+			</combo_box>
+			<spinner label="Precio en L$:" name="PriceSpin"/>
+			<spinner label="Horas de acceso:" name="HoursSpin"/>
+			<panel name="Allowed_layout_panel">
+				<text label="Always Allow" name="AllowedText">
+					Residentes autorizados
+				</text>
+				<name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+				<button label="Añadir" name="add_allowed"/>
+				<button label="Quitar" label_selected="Quitar" name="remove_allowed"/>
+			</panel>
+			<panel name="Banned_layout_panel">
+				<text label="Ban" name="BanCheck">
+					Residentes con el acceso prohibido
+				</text>
+				<name_list name="BannedList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+				<button label="Añadir" name="add_banned"/>
+				<button label="Quitar" label_selected="Quitar" name="remove_banned"/>
+			</panel>
+		</panel>
+	</tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
index c58eb227aaf385ff7efe537a4dd9a78a79583b3c..bd13262dcd79ce6374aee24bbc42b3222cb9b6a6 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
@@ -30,15 +30,15 @@
 	<text name="trigger_label">
 		Palabra clave:
 	</text>
-	<text left="208" name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
+	<text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto.">
 		Reemplazar por:
 	</text>
 	<line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambia la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quise decir hola&apos; por &apos;Quise decir qué tal&apos; en cuanto realice el gesto."/>
 	<text name="key_label">
 		Atajo de teclado:
 	</text>
-	<combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/>
-	<combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/>
+	<combo_box label="Ninguno" name="modifier_combo" width="76"/>
+	<combo_box label="Ninguno" name="key_combo" width="50"/>
 	<text name="library_label">
 		Biblioteca:
 	</text>
@@ -55,20 +55,20 @@
 	<button label="Arriba" name="up_btn"/>
 	<button label="Abajo" name="down_btn"/>
 	<button label="Quitar" name="delete_btn"/>
-	<text left="230" name="options_text" width="200">
+	<text name="options_text" width="200">
 		(opciones)
 	</text>
 	<radio_group name="animation_trigger_type">
 		<radio_item label="Empezar" name="start"/>
 		<radio_item label="Parar" name="stop"/>
 	</radio_group>
-	<check_box bottom_delta="34" label="hasta que las animaciones  estén hechas" name="wait_anim_check"/>
-	<check_box bottom_delta="-30" label="tiempo en segundos:" name="wait_time_check"/>
-	<line_editor left_delta="130" name="wait_time_editor"/>
+	<check_box label="hasta que las animaciones  estén hechas" name="wait_anim_check"/>
+	<check_box label="tiempo en segundos:" name="wait_time_check"/>
+	<line_editor name="wait_time_editor"/>
 	<text name="help_label">
 		Todos los pasos suceden a la vez, a menos que añadas pasos de espera.
 	</text>
-	<check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
-	<button label="Vista previa" name="preview_btn" width="85"/>
+	<check_box label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
+	<button label="Vista previa" name="preview_btn" width="82"/>
 	<button label="Guardar" name="save_btn"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
index 760429e73d11604e9b1cf961398ec2915424b4e5..c541b0f98b278b986a9edce9a04524b7a8075cab 100644
--- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
@@ -1,103 +1,103 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN">
-	<floater.string name="Screenshot">
-		Captura de pantalla
-	</floater.string>
-	<check_box label="Usar esta captura de pantalla" name="screen_check"/>
-	<text name="reporter_title">
-		Denunciante:
-	</text>
-	<text name="reporter_field">
-		Loremipsum Dolorsitamut Longnamez
-	</text>
-	<text name="sim_title">
-		Región:
-	</text>
-	<text name="sim_field">
-		Nombre de la región
-	</text>
-	<text name="pos_title">
-		Posición:
-	</text>
-	<text name="pos_field">
-		{128.1, 128.1, 15.4}
-	</text>
-	<text name="select_object_label">
-		Pulsa el botón y luego el objeto a denunciar:
-	</text>
-	<button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/>
-	<text name="object_name_label">
-		Objeto:
-	</text>
-	<text name="object_name">
-		Consetetur Sadipscing
-	</text>
-	<text name="owner_name_label">
-		Propietario:
-	</text>
-	<text name="owner_name">
-		Hendrerit Vulputate Kamawashi Longname
-	</text>
-	<combo_box name="category_combo" tool_tip="Categoría -- Elija la categoría que describa mejor esta denuncia">
-		<combo_box.item label="Elegir la categoría" name="Select_category"/>
-		<combo_box.item label="Edad &gt; Jugar a ser niño" name="Age__Age_play"/>
-		<combo_box.item label="Edad &gt; Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
-		<combo_box.item label="Edad &gt; Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
-		<combo_box.item label="Ataque &gt; Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/>
-		<combo_box.item label="Ataque &gt; Zona segura" name="Assault__Safe_area"/>
-		<combo_box.item label="Ataque &gt; Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/>
-		<combo_box.item label="Comercio &gt; Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/>
-		<combo_box.item label="Indiscreción &gt; Información del mundo real" name="Disclosure__Real_world_information"/>
-		<combo_box.item label="Indiscreción &gt; Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/>
-		<combo_box.item label="Indiscreción &gt; Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/>
-		<combo_box.item label="Perturbando la paz &gt; Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
-		<combo_box.item label="Perturbando la paz &gt; Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
-		<combo_box.item label="Perturbando la paz &gt; Objeto basura" name="Disturbing_the_peace__Object_littering"/>
-		<combo_box.item label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
-		<combo_box.item label="Perturbando la paz &gt; Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/>
-		<combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
-		<combo_box.item label="Fraude &gt; Terreno" name="Fraud__Land"/>
-		<combo_box.item label="Fraude &gt; Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
-		<combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
-		<combo_box.item label="Acoso &gt; Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/>
-		<combo_box.item label="Acoso &gt; Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/>
-		<combo_box.item label="Acoso &gt; Impedir el movimiento" name="Harassment__Impeding_movement"/>
-		<combo_box.item label="Acoso &gt; Acoso sexual" name="Harassment__Sexual_harassment"/>
-		<combo_box.item label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
-		<combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
-		<combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
-		<combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
-		<combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
-		<combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
-		<combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
-		<combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
-		<combo_box.item label="Intolerancia" name="Intolerance"/>
-		<combo_box.item label="Terreno &gt; Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/>
-		<combo_box.item label="Terreno &gt; Invasión &gt; Objetos/Texturas" name="Land__Encroachment__Objects_textures"/>
-		<combo_box.item label="Terreno &gt; Invasión &gt; Partículas" name="Land__Encroachment__Particles"/>
-		<combo_box.item label="Terreno &gt; Invasión &gt; Árboles/Plantas" name="Land__Encroachment__Trees_plants"/>
-		<combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/>
-		<combo_box.item label="Otra" name="Other"/>
-	</combo_box>
-	<text name="abuser_name_title">
-		Nombre del infractor:
-	</text>
-	<button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
-	<text name="abuser_name_title2">
-		Localización de la infracción:
-	</text>
-	<text name="sum_title">
-		Resumen:
-	</text>
-	<text name="dscr_title">
-		Detalles:
-	</text>
-	<text name="bug_aviso">
-		Por favor, sé todo lo concreto que puedas
-	</text>
-	<text name="incomplete_title">
-		* Las denuncias incompletas no se investigarán
-	</text>
-	<button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/>
-	<button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN">
+	<floater.string name="Screenshot">
+		Captura de pantalla
+	</floater.string>
+	<check_box label="Usar esta captura de pantalla" name="screen_check"/>
+	<text name="reporter_title">
+		Denunciante:
+	</text>
+	<text name="reporter_field">
+		Loremipsum Dolorsitamut Longnamez
+	</text>
+	<text name="sim_title">
+		Región:
+	</text>
+	<text name="sim_field">
+		Nombre de la región
+	</text>
+	<text name="pos_title">
+		Posición:
+	</text>
+	<text name="pos_field">
+		{128.1, 128.1, 15.4}
+	</text>
+	<text name="select_object_label">
+		Pulsa el botón y luego el objeto a denunciar:
+	</text>
+	<button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/>
+	<text name="object_name_label">
+		Objeto:
+	</text>
+	<text name="object_name">
+		Consetetur Sadipscing
+	</text>
+	<text name="owner_name_label">
+		Propietario:
+	</text>
+	<text name="owner_name">
+		Hendrerit Vulputate Kamawashi Longname
+	</text>
+	<combo_box name="category_combo" tool_tip="Categoría -- Elija la categoría que describa mejor esta denuncia">
+		<combo_box.item label="Elegir la categoría" name="Select_category"/>
+		<combo_box.item label="Edad &gt; Jugar a ser niño" name="Age__Age_play"/>
+		<combo_box.item label="Edad &gt; Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+		<combo_box.item label="Edad &gt; Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+		<combo_box.item label="Ataque &gt; Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/>
+		<combo_box.item label="Ataque &gt; Zona segura" name="Assault__Safe_area"/>
+		<combo_box.item label="Ataque &gt; Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/>
+		<combo_box.item label="Comercio &gt; Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/>
+		<combo_box.item label="Indiscreción &gt; Información del mundo real" name="Disclosure__Real_world_information"/>
+		<combo_box.item label="Indiscreción &gt; Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/>
+		<combo_box.item label="Indiscreción &gt; Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/>
+		<combo_box.item label="Perturbando la paz &gt; Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+		<combo_box.item label="Perturbando la paz &gt; Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+		<combo_box.item label="Perturbando la paz &gt; Objeto basura" name="Disturbing_the_peace__Object_littering"/>
+		<combo_box.item label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
+		<combo_box.item label="Perturbando la paz &gt; Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+		<combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+		<combo_box.item label="Fraude &gt; Terreno" name="Fraud__Land"/>
+		<combo_box.item label="Fraude &gt; Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+		<combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
+		<combo_box.item label="Acoso &gt; Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/>
+		<combo_box.item label="Acoso &gt; Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/>
+		<combo_box.item label="Acoso &gt; Impedir el movimiento" name="Harassment__Impeding_movement"/>
+		<combo_box.item label="Acoso &gt; Acoso sexual" name="Harassment__Sexual_harassment"/>
+		<combo_box.item label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+		<combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
+		<combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
+		<combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
+		<combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región General" name="Indecency__Mature_content_in_PG_region"/>
+		<combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región Moderado" name="Indecency__Inappropriate_content_in_Mature_region"/>
+		<combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
+		<combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+		<combo_box.item label="Intolerancia" name="Intolerance"/>
+		<combo_box.item label="Terreno &gt; Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/>
+		<combo_box.item label="Terreno &gt; Invasión &gt; Objetos/Texturas" name="Land__Encroachment__Objects_textures"/>
+		<combo_box.item label="Terreno &gt; Invasión &gt; Partículas" name="Land__Encroachment__Particles"/>
+		<combo_box.item label="Terreno &gt; Invasión &gt; Árboles/Plantas" name="Land__Encroachment__Trees_plants"/>
+		<combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/>
+		<combo_box.item label="Otra" name="Other"/>
+	</combo_box>
+	<text name="abuser_name_title">
+		Nombre del infractor:
+	</text>
+	<button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
+	<text name="abuser_name_title2">
+		Localización de la infracción:
+	</text>
+	<text name="sum_title">
+		Resumen:
+	</text>
+	<text name="dscr_title">
+		Detalles:
+	</text>
+	<text name="bug_aviso">
+		Por favor, sé todo lo concreto que puedas
+	</text>
+	<text name="incomplete_title">
+		* Las denuncias incompletas no se investigarán
+	</text>
+	<button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/>
+	<button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml
index f4a0897d7352573d86f1325e22184e0523fa8573..89092201d904a018f8c1ebdae8cfe240164fb9e6 100644
--- a/indra/newview/skins/default/xui/es/floater_tos.xml
+++ b/indra/newview/skins/default/xui/es/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Cargando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Elas%20Condiciones%20del%20servicio%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Continuar" label_selected="Continuar" name="Continue"/>
 	<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml
index c8a7858ddb8a1d2f819481b5813b13f8ab3f445a..85210d5c49f39090506213b419f8ec96d4f254d8 100644
--- a/indra/newview/skins/default/xui/es/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/es/menu_favorites.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="Popup">
-	<menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+	<menu_item_call label="Teleportar" name="Teleport To Landmark"/>
 	<menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
 	<menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
 	<menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
index bee4c61da2402bb64fd672783ca65194fccfdfac..82fc8ddd39a030d81f6bc566204b07d158fec8fd 100644
--- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -4,7 +4,7 @@
 	<menu_item_call label="Añadir como amigo" name="add_friend"/>
 	<menu_item_call label="MI" name="im"/>
 	<menu_item_call label="Llamada" name="call"/>
-	<menu_item_call label="Teleportarse" name="teleport"/>
+	<menu_item_call label="Teleportar" name="teleport"/>
 	<menu_item_call label="Invitar al grupo" name="invite_to_group"/>
 	<menu_item_call label="Ignorar" name="block"/>
 	<menu_item_call label="Designorar" name="unblock"/>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
index ed33c55aca3612b49e9e7636427e7d3fb38f5d21..c482907812ce516e182253e3e0c443624e7f5f81 100644
--- a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <context_menu name="Teleport History Item Context Menu">
-	<menu_item_call label="Teleportarse" name="Teleport"/>
+	<menu_item_call label="Teleportar" name="Teleport"/>
 	<menu_item_call label="Más información" name="More Information"/>
 	<menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 91a03023a1bc6e0dc0c78b9eeaff980fbeec7731..99ae2b23350c0154445407b8c3130f2a523ec9be 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -1,2952 +1,2952 @@
-<?xml version="1.0" encoding="utf-8"?>
-<notifications>
-	<global name="skipnexttime">
-		No mostrarme esto otra vez
-	</global>
-	<global name="alwayschoose">
-		Elegir siempre esta opción
-	</global>
-	<global name="implicitclosebutton">
-		Cerrar
-	</global>
-	<template name="okbutton">
-		<form>
-			<button name="OK_okbutton" text="$yestext"/>
-		</form>
-	</template>
-	<template name="okignore">
-		<form>
-			<button name="OK_okignore" text="$yestext"/>
-		</form>
-	</template>
-	<template name="okcancelbuttons">
-		<form>
-			<button name="OK_okcancelbuttons" text="$yestext"/>
-			<button name="Cancel_okcancelbuttons" text="$notext"/>
-		</form>
-	</template>
-	<template name="okcancelignore">
-		<form>
-			<button name="OK_okcancelignore" text="$yestext"/>
-			<button name="Cancel_okcancelignore" text="$notext"/>
-		</form>
-	</template>
-	<template name="okhelpbuttons">
-		<form>
-			<button name="OK_okhelpbuttons" text="$yestext"/>
-			<button name="Help" text="$helptext"/>
-		</form>
-	</template>
-	<template name="yesnocancelbuttons">
-		<form>
-			<button name="Yes" text="$yestext"/>
-			<button name="No" text="$notext"/>
-			<button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
-		</form>
-	</template>
-	<notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert">
-		Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir.  Por favor, comprueba que tienes instalado el último Visor.
-
-Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha encontrado en notifications.xml.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="FloaterNotFound">
-		Error: no se pudieron encontrar estos controles:
-
-[CONTROLS]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="TutorialNotFound">
-		Actualmente, no hay un tutorial disponible.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="GenericAlert">
-		[MESSAGE]
-	</notification>
-	<notification name="GenericAlertYesCancel">
-		[MESSAGE]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
-	</notification>
-	<notification name="BadInstallation">
-		Ha habido un error actualizando [APP_NAME].  Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LoginFailedNoNetwork">
-		No se puede conectar con [SECOND_LIFE_GRID].
-    &apos;[DIAGNOSTIC]&apos;
-Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MessageTemplateNotFound">
-		No se ha encontrado la plantilla de mensaje [PATH].
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="WearableSave">
-		¿Guardar los cambios en las ropas o partes del cuerpo actuales?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/>
-	</notification>
-	<notification name="CompileQueueSaveText">
-		Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
-	</notification>
-	<notification name="CompileQueueSaveBytecode">
-		Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
-	</notification>
-	<notification name="WriteAnimationFail">
-		Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde.
-	</notification>
-	<notification name="UploadAuctionSnapshotFail">
-		Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON]
-	</notification>
-	<notification name="UnableToViewContentsMoreThanOne">
-		No se puede ver a la vez los contenidos de más de un ítem. Por favor, elige un solo objeto y vuelve a intentarlo.
-	</notification>
-	<notification name="SaveClothingBodyChanges">
-		¿Guardar todos los cambios en la ropa y partes del cuerpo?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/>
-	</notification>
-	<notification name="FriendsAndGroupsOnly">
-		Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="FavoritesOnLogin">
-		Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="GrantModifyRights">
-		Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
-¿Quieres conceder permisos de modificación a [NAME]?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="GrantModifyRightsMultiple">
-		Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
-¿Quieres conceder permisos de modificación a los Residentes elegidos?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="RevokeModifyRights">
-		¿Quieres retirar los permisos de modificación a [NAME]?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="RevokeModifyRightsMultiple">
-		¿Quieres revocar los derechos de modificación a los residentes seleccionados?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="UnableToCreateGroup">
-		No se ha podido crear el grupo.
-[MESSAGE]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PanelGroupApply">
-		[NEEDS_APPLY_MESSAGE]
-[WANT_APPLY_MESSAGE]
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/>
-	</notification>
-	<notification name="MustSpecifyGroupNoticeSubject">
-		Para enviar un aviso de grupo debes especificar un asunto.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AddGroupOwnerWarning">
-		Vas a añadir miembros al rol de [ROLE_NAME].
-No podrás removérseles de ese rol, sino que deberán renunciar a él por sí mismos.
-¿Estás seguro de que quieres seguir?
-		<usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="AssignDangerousActionWarning">
-		Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
-
- *ATENCIÓN*
- Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad.
-¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="AssignDangerousAbilityWarning">
-		Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
-
- *ATENCIÓN*
- Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario.
-¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="AttachmentDrop">
-		Vas a soltar tu anexado.
-    ¿Estás seguro de que quieres continuar?
-		<usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="JoinGroupCanAfford">
-		Entrar a este grupo cuesta [COST] L$.
-¿Quieres hacerlo??
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
-	</notification>
-	<notification name="JoinGroupNoCost">
-		Vas a entrar al grupo [NAME].
-¿Quieres seguir?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
-	</notification>
-	<notification name="JoinGroupCannotAfford">
-		Entrar a este grupo cuesta [COST] L$.
-No tienes dinero suficiente para entrar.
-	</notification>
-	<notification name="CreateGroupCost">
-		Crear este grupo te costará 100 L$.
-Los grupos necesitan más de un miembro. Si no, son borrados permanentemente.
-Por favor, invita a miembros en las próximas 48 horas.
-		<usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/>
-	</notification>
-	<notification name="LandBuyPass">
-		Por [COST] L$ puedes entrar a este terreno (&apos;[PARCEL_NAME]&apos;) durante [TIME] horas. ¿Comprar un pase?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="SalePriceRestriction">
-		El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera.
-Por favor, elige a alguien concreto como comprador si la venta es por 0 L$.
-	</notification>
-	<notification name="ConfirmLandSaleChange">
-		Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
-El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME].
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmLandSaleToAnyoneChange">
-		ATENCIÓN: Marcando &apos;vender a cualquiera&apos; hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
-
-Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta.
-El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME].
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsDeededToGroup">
-		¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo &apos;[NAME]&apos; al inventario de su propietario anterior?
-
-*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
-
-Objetos: [N]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedByUser">
-		¿Estás seguro de que quieres devolver al inventario de &apos;[NAME]&apos; todos los objetos que sean de su propiedad en esta parcela?
-
-Objetos: [N]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsOwnedBySelf">
-		¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela?
-
-Objetos: [N]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedBySelf">
-		¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios?
-Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
-
-*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
-
-Objetos: [N]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByUser">
-		¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario?
-Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
-
-*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
-
-Objetos: [N]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ReturnAllTopObjects">
-		¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="DisableAllTopObjects">
-		¿Estás seguro de que quieres desactivar todos los objetos de esta región?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ReturnObjectsNotOwnedByGroup">
-		¿Devolver a sus propietarios los objetos de esta parcela que NO estén compartidos con el grupo [NAME]?
-
-Objetos: [N]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="UnableToDisableOutsideScripts">
-		No se pueden desactivar los scripts.
-Toda esta región tiene activado el &apos;daño&apos;.
-Para que funcionen las armas los scripts deben estar activados.
-	</notification>
-	<notification name="MultipleFacesSelected">
-		Están seleccionadas varias caras.
-Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media.
-Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir.
-		<usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="MustBeInParcel">
-		Para configurar el Punto de llegada de la parcela,
-debes estar dentro de ella.
-	</notification>
-	<notification name="PromptRecipientEmail">
-		Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es.
-	</notification>
-	<notification name="PromptSelfEmail">
-		Por favor, escribe tu dirección de correo electrónico.
-	</notification>
-	<notification name="PromptMissingSubjMsg">
-		¿Foto por correo electrónico con el asunto o el mensaje por defecto?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ErrorProcessingSnapshot">
-		Error al procesar los datos de la foto.
-	</notification>
-	<notification name="ErrorEncodingSnapshot">
-		Error al codificar la foto.
-	</notification>
-	<notification name="ErrorUploadingPostcard">
-		Hubo un problema al enviar la foto por la siguiente razón: [REASON]
-	</notification>
-	<notification name="ErrorUploadingReportScreenshot">
-		Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON]
-	</notification>
-	<notification name="MustAgreeToLogIn">
-		Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE].
-	</notification>
-	<notification name="CouldNotPutOnOutfit">
-		No se ha podido poner el vestuario.
-La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa.
-	</notification>
-	<notification name="CannotWearTrash">
-		No puedes vestirte ropas o partes del cuerpo que estén en la Papelera
-	</notification>
-	<notification name="MaxAttachmentsOnOutfit">
-		No se puede anexar el objeto.
-Se ha superado el límite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quítate alguno.
-	</notification>
-	<notification name="CannotWearInfoNotComplete">
-		No puedes vestirte este ítem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto.
-	</notification>
-	<notification name="MustHaveAccountToLogIn">
-		Lo sentimos. Se ha quedado algún espacio en blanco.
-Tienes que volver a introducir el nombre de usuario de tu avatar.
-
-Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahora?
-		<url name="url">
-			https://join.secondlife.com/index.php?lang=es-ES
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
-	</notification>
-	<notification name="InvalidCredentialFormat">
-		Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
-	</notification>
-	<notification name="DeleteClassified">
-		¿Borrar el clasificado &apos;[NAME]&apos;?
-No se reembolsan las cuotas pagadas.
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="DeleteMedia">
-		Has elegido borrar los media asociados a esta cara.
-¿Estás seguro de que quieres continuar?
-		<usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="ClassifiedSave">
-		¿Guardar los cambios en el clasificado [NAME]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
-	</notification>
-	<notification name="ClassifiedInsufficientFunds">
-		Dinero insuficiente para crear un clasificado.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="DeleteAvatarPick">
-		¿Borrar el destacado &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="DeleteOutfits">
-		¿Eliminar el vestuario seleccionado?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="PromptGoToEventsPage">
-		¿Ir a la web de eventos de [SECOND_LIFE]?
-		<url name="url">
-			http://secondlife.com/events/?lang=es-ES
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="SelectProposalToView">
-		Por favor, selecciona qué propuesta quieres ver.
-	</notification>
-	<notification name="SelectHistoryItemToView">
-		Por favor, selecciona un ítem del historial para verlo.
-	</notification>
-	<notification name="CacheWillClear">
-		La caché se limpiará cuando reinices [APP_NAME].
-	</notification>
-	<notification name="CacheWillBeMoved">
-		La caché se moverá cuando reinicies [APP_NAME].
-Nota: esto vaciará la caché.
-	</notification>
-	<notification name="ChangeConnectionPort">
-		La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
-	</notification>
-	<notification name="ChangeSkin">
-		Verás la nueva apariencia cuando reinicies [APP_NAME].
-	</notification>
-	<notification name="ChangeLanguage">
-		El cambio de idioma tendrá efecto cuando reinicies [APP_NAME].
-	</notification>
-	<notification name="GoToAuctionPage">
-		¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
-o hacer una puja?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="SaveChanges">
-		¿Guardar los cambios?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
-	</notification>
-	<notification name="GestureSaveFailedTooManySteps">
-		Fallo al guardar el gesto.
-Este gesto tiene demasiados pasos.
-Intenta quitarle algunos, y vuelve a guardarlo.
-	</notification>
-	<notification name="GestureSaveFailedTryAgain">
-		Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto.
-	</notification>
-	<notification name="GestureSaveFailedObjectNotFound">
-		No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
-	</notification>
-	<notification name="GestureSaveFailedReason">
-		Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
-	</notification>
-	<notification name="SaveNotecardFailObjectNotFound">
-		No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
-	</notification>
-	<notification name="SaveNotecardFailReason">
-		Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde.
-	</notification>
-	<notification name="ScriptCannotUndo">
-		No se han podido deshacer todos los cambios en tu versión del script.
-¿Quieres cargar la última versión guardada en el servidor?
-(**Cuidado** No podrás deshacer esta operación).
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="SaveScriptFailReason">
-		Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
-	</notification>
-	<notification name="SaveScriptFailObjectNotFound">
-		No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
-	</notification>
-	<notification name="SaveBytecodeFailReason">
-		Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde..
-	</notification>
-	<notification name="StartRegionEmpty">
-		Perdón, no está definida tu Posición inicial.
-Por favor, escribe el nombre de la región en el cajetín de Posición inicial, o elige para esa posición Mi Base o Mi última posición.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CouldNotStartStopScript">
-		No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye.
-El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
-	</notification>
-	<notification name="CannotDownloadFile">
-		No se ha podido descargar el archivo.
-	</notification>
-	<notification name="CannotWriteFile">
-		No se ha podido escribir el archivo [[FILE]]
-	</notification>
-	<notification name="UnsupportedHardware">
-		Debes saber que tu ordenador no cumple los requisitos mínimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida.
-
-¿Ir a [_URL] para más información?
-		<url name="url" option="0">
-			http://secondlife.com/support/sysreqs.php?lang=es
-		</url>
-		<usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="UnknownGPU">
-		Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce.
-Suele suceder con hardware nuevo que todavía no ha sido probado con [APP_NAME].  Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas.
-(Yo &gt; Preferencias &gt; Gráficos).
-		<form name="form">
-			<ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/>
-		</form>
-	</notification>
-	<notification name="DisplaySettingsNoShaders">
-		[APP_NAME] se cae al iniciar los &apos;driver&apos; gráficos.
-La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas.
-Te recomendamos actualizar los &apos;drivers&apos; de tu tarjeta gráfica.
-La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
-	</notification>
-	<notification name="RegionNoTerraforming">
-		En la región [REGION] no se permite modificar el terreno.
-	</notification>
-	<notification name="CannotCopyWarning">
-		No tienes permiso para copiar los elementos siguientes:
-[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="CannotGiveItem">
-		No se ha podido dar el ítem del inventario.
-	</notification>
-	<notification name="TransactionCancelled">
-		Transacción cancelada.
-	</notification>
-	<notification name="TooManyItems">
-		No puedes dar más de 42 ítems en una única transferencia del inventario.
-	</notification>
-	<notification name="NoItems">
-		No tienes permiso para transferir el ítem seleccionado.
-	</notification>
-	<notification name="CannotCopyCountItems">
-		No tienes permiso para copiar [COUNT] de los
-ítems seleccionados. Si los das, los perderás de tu inventario.
-¿Realmente quieres darlos?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="CannotGiveCategory">
-		No tienes permiso para transferir
-la carpeta seleccionada.
-	</notification>
-	<notification name="FreezeAvatar">
-		¿Congelar a este avatar?
-Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
-	</notification>
-	<notification name="FreezeAvatarFullname">
-		¿Congelar a [AVATAR_NAME]?
-Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
-	</notification>
-	<notification name="EjectAvatarFullname">
-		¿Expulsar a [AVATAR_NAME] de tu terreno?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/>
-	</notification>
-	<notification name="EjectAvatarNoBan">
-		¿Expulsar a este avatar de tu terreno?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
-	</notification>
-	<notification name="EjectAvatarFullnameNoBan">
-		¿Expulsar a [AVATAR_NAME] de tu terreno?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
-	</notification>
-	<notification name="EjectAvatarFromGroup">
-		Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME]
-	</notification>
-	<notification name="AcquireErrorTooManyObjects">
-		ERROR &apos;ACQUIRE&apos;: Hay demasiados objetos seleccionados.
-	</notification>
-	<notification name="AcquireErrorObjectSpan">
-		ERROR &apos;ACQUIRE&apos;: Los objetos están en más de una región.
-Por favor, mueve todos los objetos a adquirir a la
-misma región.
-	</notification>
-	<notification name="PromptGoToCurrencyPage">
-		[EXTRA]
-
-¿Ir a [_URL] para informarte sobre la compra de L$?
-		<url name="url">
-			http://secondlife.com/app/currency/?lang=es-ES
-		</url>
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="UnableToLinkObjects">
-		No se pudo enlazar estos [COUNT] objetos.
-Puedes enlazar [MAX] objetos como máximo.
-	</notification>
-	<notification name="CannotLinkIncompleteSet">
-		Sólo puedes enlazar objetos completos (no sus partes), y debes
-seleccionar más de uno.
-	</notification>
-	<notification name="CannotLinkModify">
-		Imposible enlazarlos, porque no tienes permiso para modificar
-todos los objetos.
-
-Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos.
-	</notification>
-	<notification name="CannotLinkDifferentOwners">
-		Imposible enlazarlos, porque hay objetos de distintos propietarios.
-
-Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados.
-	</notification>
-	<notification name="NoFileExtension">
-		No hay extensión de archivo en: &apos;[FILE]&apos;
-
-Por favor, asegúrate de que la extensión del archivo es correcta.
-	</notification>
-	<notification name="InvalidFileExtension">
-		Extensión inválida de archivo: [EXTENSION]
-Podría ser [VALIDS]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotUploadSoundFile">
-		No se pudo abrir el archivo de sonido que has subido para leer:
-[FILE]
-	</notification>
-	<notification name="SoundFileNotRIFF">
-		No parece que el archivo sea un archivo RIFF WAVE:
-[FILE]
-	</notification>
-	<notification name="SoundFileNotPCM">
-		No parece que el archivo sea un archivo de audio PCM WAVE:
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidChannelCount">
-		El archivo no tiene un número de canales válido (debe ser mono o estéreo):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidSampleRate">
-		No parece que el archivo tenga una frecuencia de muestreo (sample rate) adecuada (debe de ser 44.1k):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidWordSize">
-		No parece que el archivo tenga un tamaño de palabra (word size) adecuado (debe de ser de 8 o 16 bites):
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidHeader">
-		No se encontró el fragmento &apos;data&apos; en la cabecera del WAV:
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidChunkSize">
-		Tamaño de lote erróneo en el archivo WAV:
-[FILE]
-	</notification>
-	<notification name="SoundFileInvalidTooLong">
-		El archivo de audio es demasiado largo (10 segundos como máximo):
-[FILE]
-	</notification>
-	<notification name="ProblemWithFile">
-		Problemas con el archivo [FILE]:
-
-[ERROR]
-	</notification>
-	<notification name="CannotOpenTemporarySoundFile">
-		No se ha podido abrir para su escritura el archivo comprimido de sonido: [FILE]
-	</notification>
-	<notification name="UnknownVorbisEncodeFailure">
-		Códec Vorbis desconocido, fallo en : [FILE]
-	</notification>
-	<notification name="CannotEncodeFile">
-		No se puede codificar el archivo: [FILE]
-	</notification>
-	<notification name="CorruptedProtectedDataStore">
-		No se pueden rellenar el nombre de usuario y la contraseña.  Esto puede deberse a un cambio de configuración de la red.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CorruptResourceFile">
-		Archivo con los recursos corruptos: [FILE]
-	</notification>
-	<notification name="UnknownResourceFileVersion">
-		Versión de archivo desconocida para el recurso Linden en el archivo: [FILE]
-	</notification>
-	<notification name="UnableToCreateOutputFile">
-		No se ha podido crear el archivo de salida: [FILE]
-	</notification>
-	<notification name="DoNotSupportBulkAnimationUpload">
-		Actualmente, [APP_NAME] no admite la subida masiva de animaciones.
-	</notification>
-	<notification name="CannotUploadReason">
-		No se ha podido subir [FILE] por la siguiente razón: [REASON]
-Por favor, inténtalo más tarde.
-	</notification>
-	<notification name="LandmarkCreated">
-		Se ha añadido &quot;[LANDMARK_NAME]&quot; a tu carpeta [FOLDER_NAME].
-	</notification>
-	<notification name="LandmarkAlreadyExists">
-		Ya tienes un hito de esta localización.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotCreateLandmarkNotOwner">
-		No puedes crear un hito aquí porque el propietario del terreno no lo permite.
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoScripts">
-		No se pudo &apos;recompilar&apos;.
-Selecciona un objeto con script.
-	</notification>
-	<notification name="CannotRecompileSelectObjectsNoPermission">
-		No se pudo &apos;recompilar&apos;.
-
-Selecciona objetos con scripts en los que tengas permiso para modificarlos.
-	</notification>
-	<notification name="CannotResetSelectObjectsNoScripts">
-		No se pudo &apos;reiniciar&apos;.
-
-Selecciona objetos con scripts.
-	</notification>
-	<notification name="CannotResetSelectObjectsNoPermission">
-		No se pudo &apos;reiniciar&apos;.
-
-Selecciona objetos con scripts en los que tengas permiso para modificarlos.
-	</notification>
-	<notification name="CannotOpenScriptObjectNoMod">
-		Imposible abrir el script del objeto sin modificar los permisos.
-	</notification>
-	<notification name="CannotSetRunningSelectObjectsNoScripts">
-		No se puede configurar ningún script como &apos;ejecutándose&apos;.
-
-Selecciona objetos con scripts.
-	</notification>
-	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
-		No se puede configurar ningún script como &apos;no ejecutándose&apos;.
-
-Selecciona objetos con scripts.
-	</notification>
-	<notification name="NoFrontmostFloater">
-		No hay nada que guardar.
-	</notification>
-	<notification name="SeachFilteredOnShortWords">
-		Se ha modificado tu búsqueda,
-eliminando las palabras demasiado cortas.
-
-Buscando: [FINALQUERY]
-	</notification>
-	<notification name="SeachFilteredOnShortWordsEmpty">
-		Los términos de tu búsqueda son muy cortos,
-por lo que no se ha hecho la búsqueda.
-	</notification>
-	<notification name="CouldNotTeleportReason">
-		Fallo en el teleporte.
-[REASON]
-	</notification>
-	<notification name="invalid_tport">
-		Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
-Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
-	</notification>
-	<notification name="invalid_region_handoff">
-		Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
-Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
-	</notification>
-	<notification name="blocked_tport">
-		Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
-	</notification>
-	<notification name="nolandmark_tport">
-		Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
-	</notification>
-	<notification name="timeout_tport">
-		Lo sentimos, pero el sistema no ha podido completar el teleporte.
-Vuelve a intentarlo en un momento.
-	</notification>
-	<notification name="noaccess_tport">
-		Lo sentimos, pero no tienes acceso al destino de este teleporte.
-	</notification>
-	<notification name="missing_attach_tport">
-		Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
-	</notification>
-	<notification name="too_many_uploads_tport">
-		La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
-	</notification>
-	<notification name="expired_tport">
-		Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
-	</notification>
-	<notification name="expired_region_handoff">
-		Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
-	</notification>
-	<notification name="no_host">
-		Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos.
-	</notification>
-	<notification name="no_inventory_host">
-		En estos momentos no está disponible el sistema del inventario.
-	</notification>
-	<notification name="CannotSetLandOwnerNothingSelected">
-		No se ha podido configurar el propietario del terreno:
-no se ha seleccionado una parcela.
-	</notification>
-	<notification name="CannotSetLandOwnerMultipleRegions">
-		No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo.
-	</notification>
-	<notification name="ForceOwnerAuctionWarning">
-		Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado.
-¿Forzar la propiedad?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="CannotContentifyNothingSelected">
-		No se ha podido &apos;contentify&apos;:
-no se ha seleccionado una parcela.
-	</notification>
-	<notification name="CannotContentifyNoRegion">
-		No se ha podido &apos;contentify&apos;:
-no se ha seleccionado una región.
-	</notification>
-	<notification name="CannotReleaseLandNothingSelected">
-		No se ha podido abandonar el terreno:
-no se ha seleccionado una parcela.
-	</notification>
-	<notification name="CannotReleaseLandNoRegion">
-		No se ha podido abandonar el terreno:
-no se ha podido encontrar la región.
-	</notification>
-	<notification name="CannotBuyLandNothingSelected">
-		Imposible comprar terreno:
-no se ha seleccionado una parcela.
-	</notification>
-	<notification name="CannotBuyLandNoRegion">
-		Imposible comprar terreno:
-no se ha podido encontrar en qué región está.
-	</notification>
-	<notification name="CannotCloseFloaterBuyLand">
-		No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
-	</notification>
-	<notification name="CannotDeedLandNothingSelected">
-		No se ha podido transferir el terreno:
-no se ha seleccionado una parcela.
-	</notification>
-	<notification name="CannotDeedLandNoGroup">
-		No se ha podido transferir el terreno:
-no has seleccionado un grupo.
-	</notification>
-	<notification name="CannotDeedLandNoRegion">
-		No se ha podido transferir el terreno:
-Ha sido imposible encontrar en qué región está.
-	</notification>
-	<notification name="CannotDeedLandMultipleSelected">
-		No se ha podido transferir el terreno:
-has seleccionado varias parcelas.
-
-Inténtalo seleccionando sólo una.
-	</notification>
-	<notification name="CannotDeedLandWaitingForServer">
-		No se ha podido transferir el terreno:
-esperando que el servidor informe acerca de la propiedad.
-
-Por favor, vuelve a intentarlo.
-	</notification>
-	<notification name="CannotDeedLandNoTransfer">
-		No se ha podido transferir el terreno:
-En la región [REGION] no se permite transferir terrenos.
-	</notification>
-	<notification name="CannotReleaseLandWatingForServer">
-		No se ha podido abandonar el terreno:
-esperando que el servidor actualice la información de la parcela.
-
-Vuelve a intentarlo en unos segundos.
-	</notification>
-	<notification name="CannotReleaseLandSelected">
-		No se ha podido abandonar el terreno:
-no eres propietario de todas las parcelas seleccionadas.
-
-Por favor, selecciona una sola parcela.
-	</notification>
-	<notification name="CannotReleaseLandDontOwn">
-		No se ha podido abandonar el terreno:
-no tienes permisos sobre esta parcela.
-Las parcelas de tu propiedad se muestran en verde.
-	</notification>
-	<notification name="CannotReleaseLandRegionNotFound">
-		No se ha podido abandonar el terreno:
-Ha sido imposible encontrar en qué región está.
-	</notification>
-	<notification name="CannotReleaseLandNoTransfer">
-		No se ha podido abandonar el terreno:
-En la región [REGION] no se permite transferir terrenos.
-	</notification>
-	<notification name="CannotReleaseLandPartialSelection">
-		No se ha podido abandonar el terreno:
-debes seleccionar toda la parcela.
-
-Selecciona una parcela completa, o divídela primero.
-	</notification>
-	<notification name="ReleaseLandWarning">
-		Vas a abandonar [AREA] m² de terreno.
-Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$.
-
-¿Abandonar este terreno?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNothingSelected">
-		No se ha podido dividir el terreno:
-
-No has seleccionado ninguna parcela.
-	</notification>
-	<notification name="CannotDivideLandPartialSelection">
-		No se ha podido dividir el terreno:
-
-Has seleccionado una parcela entera.
-Inténtalo seleccionando una parte.
-	</notification>
-	<notification name="LandDivideWarning">
-		Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto.
-
-¿Dividir el terreno?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="CannotDivideLandNoRegion">
-		No se ha podido dividir el terreno:
-Ha sido imposible encontrar en qué región está.
-	</notification>
-	<notification name="CannotJoinLandNoRegion">
-		No se ha podido unir el terreno:
-Ha sido imposible encontrar en qué región está.
-	</notification>
-	<notification name="CannotJoinLandNothingSelected">
-		No se ha podido unir el terreno:
-No hay parcelas seleccionadas.
-	</notification>
-	<notification name="CannotJoinLandEntireParcelSelected">
-		No se ha podido unir el terreno:
-Sólo has seleccionado una parcela.
-
-Selecciona terreno que incluya algo de ambas parcelas.
-	</notification>
-	<notification name="CannotJoinLandSelection">
-		No se ha podido unir el terreno:
-Debes seleccionar más de una parcela.
-
-Selecciona terreno que incluya algo de ambas parcelas.
-	</notification>
-	<notification name="JoinLandWarning">
-		Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado.
-Deberás reconfigurar el nombre y las opciones de la nueva parcela.
-
-¿Unir el terreno?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmNotecardSave">
-		Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmItemCopy">
-		¿Copiar este ítem a tu inventario?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/>
-	</notification>
-	<notification name="ResolutionSwitchFail">
-		Fallo al cambiar la resolución a [RESX] por [RESY]
-	</notification>
-	<notification name="ErrorUndefinedGrasses">
-		Error, hierbas no definidas: [SPECIES]
-	</notification>
-	<notification name="ErrorUndefinedTrees">
-		Error, árboles no definidos: [SPECIES]
-	</notification>
-	<notification name="CannotSaveWearableOutOfSpace">
-		No se ha podido guardar el archivo &apos;[NAME]&apos;. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo.
-	</notification>
-	<notification name="CannotSaveToAssetStore">
-		No se ha podido guardar [NAME] en la base central de almacenamiento.
-Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el ítem de aquí a unos minutos.
-	</notification>
-	<notification name="YouHaveBeenLoggedOut">
-		Vaya, se ha cerrado tu sesión en [SECOND_LIFE].
-            [MESSAGE]
-		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/>
-	</notification>
-	<notification name="OnlyOfficerCanBuyLand">
-		No se ha podido comprar terreno para el grupo:
-no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente.
-	</notification>
-	<notification label="Añadir como amigo" name="AddFriendWithMessage">
-		Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado.
-
-¿Ofrecer a [NAME] que sea tu amigo?
-		<form name="form">
-			<input name="message">
-				¿Quieres formar parte de mis amigos?
-			</input>
-			<button name="Offer" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification label="Guardar el vestuario" name="SaveOutfitAs">
-		Guardar como un nuevo vestuario lo que estoy llevando:
-		<form name="form">
-			<input name="message">
-				[DESC] (nuevo)
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification label="Guardar artículo" name="SaveWearableAs">
-		Guardar el ítem en mi inventario como:
-		<form name="form">
-			<input name="message">
-				[DESC] (nuevo)
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification label="Renombrar el vestuario" name="RenameOutfit">
-		Nombre del nuevo vestuario:
-		<form name="form">
-			<input name="new_name">
-				[NAME]
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="RemoveFromFriends">
-		¿Quieres eliminar a [NAME] de tu lista de amigos?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="RemoveMultipleFromFriends">
-		¿Quieres quitar a varios amigos de tu lista de amigos?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
-		¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de
-** [AVATAR_NAME] **
-en todos los otros terrenos de este sim?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllScriptedObjectsByUser">
-		¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de
-** [AVATAR_NAME] **
-en TODO EL TERRENO de este sim?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="GodDeleteAllObjectsByUser">
-		¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de
-** [AVATAR_NAME] **
-en TODO EL TERRENO de este sim?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BlankClassifiedName">
-		Debes especificar un nombre para tu clasificado.
-	</notification>
-	<notification name="MinClassifiedPrice">
-		El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$.
-
-Por favor, elige un pago mayor.
-	</notification>
-	<notification name="ConfirmItemDeleteHasLinks">
-		Por lo menos uno  de los elementos seleccionados contiene vínculos que le señalan. Si eliminas este elemento, los vínculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vínculos.
-
-¿Estás seguro de que quieres eliminar los elementos?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLock">
-		Al menos uno de los ítems que has seleccionado está bloqueado.
-
-¿Estás seguro de que quieres borrar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopy">
-		Al menos uno de los ítems que has seleccionado no es copiable.
-
-¿Estás seguro de que quieres borrar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoOwn">
-		No eres el propietario de, al menos, uno de los ítems que has seleccionado.
-
-¿Estás seguro de que quieres borrar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopy">
-		Al menos un objeto está bloqueado.
-Al menos un objeto no es copiable.
-
-¿Estás seguro de que quieres borrar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoOwn">
-		Al menos un objeto está bloqueado.
-No eres propietario de, al menos, un objeto.
-
-¿Estás seguro de que quieres borrar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
-		Al menos un objeto no es copiable.
-No eres propietario de, al menos, un objeto.
-
-¿Estás seguro de que quieres borrar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
-		Al menos un objeto está bloqueado.
-Al menos un objeto no es copiable.
-No eres propietario de, al menos, un objeto.
-
-¿Estás seguro de que quieres borrar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLock">
-		Al menos un objeto está bloqueado.
-
-¿Estás seguro de que quieres tomar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeNoOwn">
-		No eres el propietario de todos los objetos que estás tomando.
-Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
-
-¿Estás seguro de que quieres tomar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmObjectTakeLockNoOwn">
-		Al menos un objeto está bloqueado.
-No eres el propietario de todos los objetos que estás tomando.
-Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
-Con todo, puedes tomar lo actualmente seleccionado.
-
-¿Estás seguro de que quieres tomar estos ítems?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="CantBuyLandAcrossMultipleRegions">
-		No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones.
-
-Por favor, selecciona un área más pequeña y vuelve a intentarlo.
-	</notification>
-	<notification name="DeedLandToGroup">
-		Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno.
-El precio de compra de la parcela no se reembolsa al propietario.
-Si se vende una parcela transferida, el precio de venta se dividirá a partes iguales entre los miembros del grupo.
-
-¿Transferir estos [AREA] m² de terreno al grupo
-&apos;[GROUP_NAME]&apos;?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="DeedLandToGroupWithContribution">
-		Al transferir esta parcela, el grupo deberá poseer y mantener el número suficiente de créditos de uso de terreno.
-El traspaso incluirá una contribución simultánea de terreno al grupo de &quot;[NAME]&quot;.
-El precio de compra del terreno no se le devolverá al propietario. Si se vende una parcela transferida, el precio de venta se dividirá en partes iguales entre los miembros del grupo.
-
-¿Transferir este terreno de [AREA] m² al grupo &apos;[GROUP_NAME]&apos;?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="DisplaySetToSafe">
-		Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
-	</notification>
-	<notification name="DisplaySetToRecommended">
-		Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
-	</notification>
-	<notification name="ErrorMessage">
-		[ERROR_MESSAGE]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AvatarMovedDesired">
-		La localización que querías no está disponible en estos momentos.
-Se te ha llevado a una región cercana.
-	</notification>
-	<notification name="AvatarMovedLast">
-		En estos momentos no está disponible tu última posición.
-Se te ha llevado a una región cercana.
-	</notification>
-	<notification name="AvatarMovedHome">
-		En estos momentos no está disponible tu Base.
-Se te ha llevado a una región cercana.
-Quizá quieras configurar una nueva posición para tu Base.
-	</notification>
-	<notification name="ClothingLoading">
-		Aún está descargándose tu ropa.
-Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente.
-		<form name="form">
-			<ignore name="ignore" text="La ropa está tardando mucho en descargarse"/>
-		</form>
-	</notification>
-	<notification name="FirstRun">
-		Se ha completado la instalación de [SECOND_LIFE].
-
-Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
-¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
-		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
-	</notification>
-	<notification name="LoginPacketNeverReceived">
-		Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
-
-Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base.
-		<url name="url">
-			http://es.secondlife.com/support/
-		</url>
-		<form name="form">
-			<button name="OK" text="OK"/>
-			<button name="Help" text="Ayuda"/>
-			<button name="Teleport" text="Teleportar"/>
-		</form>
-	</notification>
-	<notification name="WelcomeChooseSex">
-		Tu personaje aparecerá en un momento.
-
-Para caminar, usa las teclas del cursor.
-En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE].
-Por favor, elige el avatar masculino o femenino.
-Puedes cambiar más adelante tu elección.
-		<usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/>
-	</notification>
-	<notification name="CantTeleportToGrid">
-		No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrícula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="GeneralCertificateError">
-		No se puede establecer la conexión con el servidor.
-[REASON]
-
-Nombre del asunto: [SUBJECT_NAME_STRING]
-Nombre del emisor: [ISSUER_NAME_STRING]
-Válido desde: [VALID_FROM]
-Válido hasta: [VALID_TO]
-Huella digital MD5: [SHA1_DIGEST]
-Huella digital SHA1: [MD5_DIGEST]
-Uso de la clave: [KEYUSAGE]
-Uso de clave extendida: [EXTENDEDKEYUSAGE]
-Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="TrustCertificateError">
-		La autoridad de certificación de este servidor se desconoce.
-
-Información del certificado:
-Nombre del asunto: [SUBJECT_NAME_STRING]
-Nombre del emisor: [ISSUER_NAME_STRING]
-Válido desde: [VALID_FROM]
-Válido hasta: [VALID_TO]
-Huella digital MD5: [SHA1_DIGEST]
-Huella digital SHA1: [MD5_DIGEST]
-Uso de la clave: [KEYUSAGE]
-Uso de clave extendida: [EXTENDEDKEYUSAGE]
-Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
-
-¿Deseas confiar en esta autoridad?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/>
-	</notification>
-	<notification name="NotEnoughCurrency">
-		[NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso.
-	</notification>
-	<notification name="GrantedModifyRights">
-		[NAME] te ha dado permiso para modificar sus objetos.
-	</notification>
-	<notification name="RevokedModifyRights">
-		Ha sido revocado tu privilegio de modificar los objetos de [NAME]
-	</notification>
-	<notification name="FlushMapVisibilityCaches">
-		Esto limpiará las cachés del mapa en esta región.
-Esto sólo es realmente útil para cuestiones de depuración (&apos;debugging&apos;).
-(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión).
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BuyOneObjectOnly">
-		No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo.
-	</notification>
-	<notification name="OnlyCopyContentsOfSingleItem">
-		No se puede copiar a la vez los contenidos de más de un objeto.
-Por favor, selecciona sólo uno y vuelve a intentarlo.
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="KickUsersFromRegion">
-		¿Teleportar a tu base a todos los residentes en esta región?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="EstateObjectReturn">
-		¿Estás seguro de que quieres devolver los objetos propiedad de
-[USER_NAME] ?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="InvalidTerrainBitDepth">
-		No se han podido configurar las texturas de la región:
-La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH].
-
-Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
-	</notification>
-	<notification name="InvalidTerrainSize">
-		No se han podido configurar las texturas de la región:
-La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-
-Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
-	</notification>
-	<notification name="RawUploadStarted">
-		Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos.
-	</notification>
-	<notification name="ConfirmBakeTerrain">
-		¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta &apos;Revertir&apos;?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="MaxAllowedAgentOnRegion">
-		Sólo puedes tener [MAX_AGENTS] residentes autorizados.
-	</notification>
-	<notification name="MaxBannedAgentsOnRegion">
-		Sólo puedes tener [MAX_BANNED] residentes no admitidos.
-	</notification>
-	<notification name="MaxAgentOnRegionBatch">
-		Fallo al intentar añadir [NUM_ADDED] agentes:
-Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE].
-	</notification>
-	<notification name="MaxAllowedGroupsOnRegion">
-		Sólo puedes tener [MAX_GROUPS] grupos permitidos.
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/>
-	</notification>
-	<notification name="MaxManagersOnRegion">
-		Sólo puedes tener [MAX_MANAGER] administradores del estado.
-	</notification>
-	<notification name="OwnerCanNotBeDenied">
-		No se puede añadir a la lista de residentes no admitidos al propietario del estado.
-	</notification>
-	<notification name="CanNotChangeAppearanceUntilLoaded">
-		No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma.
-	</notification>
-	<notification name="ClassifiedMustBeAlphanumeric">
-		El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación.
-	</notification>
-	<notification name="CantSetBuyObject">
-		No puede configurar el Comprar el objeto, porque éste no está en venta.
-Por favor, pon en venta el objeto y vuelve a intentarlo.
-	</notification>
-	<notification name="FinishedRawDownload">
-		Acabada la descarga del archivo raw de terreno en:
-[DOWNLOAD_PATH].
-	</notification>
-	<notification name="DownloadWindowsMandatory">
-		Hay una versión nueva de [SECOND_LIFE] disponible.
-[MESSAGE]
-Debes descargar esta actualización para usar [SECOND_LIFE].
-		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
-	</notification>
-	<notification name="DownloadWindows">
-		Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
-	</notification>
-	<notification name="DownloadWindowsReleaseForDownload">
-		Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
-	</notification>
-	<notification name="DownloadLinuxMandatory">
-		Hay una versión nueva de [SECOND_LIFE] disponible.
-[MESSAGE]
-Debes descargar esta actualización para usar [SECOND_LIFE].
-		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/>
-	</notification>
-	<notification name="DownloadLinux">
-		Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
-	</notification>
-	<notification name="DownloadLinuxReleaseForDownload">
-		Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
-	</notification>
-	<notification name="DownloadMacMandatory">
-		Hay una versión nueva de [SECOND_LIFE] disponible.
-[MESSAGE]
-Debes descargar esta actualización para usar [SECOND_LIFE].
-
-¿Descargarla a tu carpeta de Programas?
-		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
-	</notification>
-	<notification name="DownloadMac">
-		Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-
-¿Descargarla a tu carpeta de Programas?
-		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
-	</notification>
-	<notification name="DownloadMacReleaseForDownload">
-		Hay una versión actualizada de [SECOND_LIFE] disponible.
-[MESSAGE]
-Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-
-¿Descargarla a tu carpeta de Programas?
-		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
-	</notification>
-	<notification name="FailedUpdateInstall">
-		Se ha producido un error al instalar la actualización del visor.
-Descarga e instala el último visor a través de
-http://secondlife.com/download.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="FailedRequiredUpdateInstall">
-		No hemos podido instalar una actualización necesaria. 
-No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado.
-
-Descarga e instala el último visor a través de
-http://secondlife.com/download.
-		<usetemplate name="okbutton" yestext="Salir"/>
-	</notification>
-	<notification name="UpdaterServiceNotRunning">
-		Hay una actualización necesaria para la instalación de Second Life.
-
-Puedes descargar esta actualización de http://www.secondlife.com/downloads
-o instalarla ahora.
-		<usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/>
-	</notification>
-	<notification name="DownloadBackgroundTip">
-		Hemos descargado una actualización para la instalación de [APP_NAME].
-Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
-		<usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/>
-	</notification>
-	<notification name="DownloadBackgroundDialog">
-		Hemos descargado una actualización para la instalación de [APP_NAME].
-Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
-		<usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/>
-	</notification>
-	<notification name="RequiredUpdateDownloadedVerboseDialog">
-		Hemos descargado una actualización de software necesaria.
-Versión [VERSION]
-
-Debemos reiniciar [APP_NAME] para instalar la actualización.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RequiredUpdateDownloadedDialog">
-		Debemos reiniciar [APP_NAME] para instalar la actualización.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="DeedObjectToGroup">
-		Transferir este objeto al grupo hará que:
-* Reciba los L$ pagados en el objeto
-		<usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
-	</notification>
-	<notification name="WebLaunchExternalTarget">
-		¿Quieres abrir tu navegador para ver este contenido?
-		<usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchJoinNow">
-		¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
-		<usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchSecurityIssues">
-		Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
-		<usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchQAWiki">
-		Visita el wiki QA de [SECOND_LIFE].
-		<usetemplate ignoretext="Abrir mi navegador para el ver el wiki de &apos;QA&apos; (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchPublicIssue">
-		Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos.
-		<usetemplate ignoretext="Abrir mi navegador para usar el &apos;Public Issue Tracker&apos;" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
-	</notification>
-	<notification name="WebLaunchSupportWiki">
-		Para ver las últimas noticias e informaciones, ¿ir la Blog oficial?
-		<usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchLSLGuide">
-		¿Quieres abrir la Guía de Script para tener ayuda sobre el tema?
-		<usetemplate ignoretext="Abrir mi navegador para ver la Guía de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="WebLaunchLSLWiki">
-		¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts?
-		<usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
-	</notification>
-	<notification name="ReturnToOwner">
-		¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
-
-*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos!
-		<usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="GroupLeaveConfirmMember">
-		Actualmente, eres miembro del grupo [GROUP].
-¿Dejar el grupo?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmKick">
-		¿Quieres realmente expulsar a todos los residentes de la cuadrícula?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/>
-	</notification>
-	<notification name="MuteLinden">
-		Lo sentimos, pero no puedes ignorar a un Linden.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CannotStartAuctionAlreadyForSale">
-		No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta.
-	</notification>
-	<notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
-		Ya has ignorado este nombre.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RemoveItemWarn">
-		Aunque esté permitido, borrar contenidos puede dañar el objeto.
-¿Quieres borrar ese ítem?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferCallingCard">
-		En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="CantOfferFriendship">
-		En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="BusyModeSet">
-		Pasar al modo ocupado.
-Se ocultará el chat y los mensajes instantáneos   (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera.
-		<usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/>
-	</notification>
-	<notification name="JoinedTooManyGroupsMember">
-		Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta.
-[NAME] te ha invitado a ser miembro de un grupo.
-		<usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
-	</notification>
-	<notification name="JoinedTooManyGroups">
-		Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="KickUser">
-		¿Con qué mensaje quieres expulsar a este Residente?
-		<form name="form">
-			<input name="message">
-				Un administrador te ha desconectado.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="KickAllUsers">
-		¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid?
-		<form name="form">
-			<input name="message">
-				Un administrador te ha desconectado.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="FreezeUser">
-		¿Con qué mensaje quieres congelar a este residente?
-		<form name="form">
-			<input name="message">
-				Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI).
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="UnFreezeUser">
-		¿Con qué mensaje quieres congelar a este residente?
-		<form name="form">
-			<input name="message">
-				Ya no estás congelado.
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="SetDisplayNameSuccess">
-		¡Hola, [DISPLAY_NAME]!
-
-Al igual que en la vida real, normalmente se tarda algún tiempo en aprender nombres nuevos.  Te recomendamos que esperes varios días antes de [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] en objetos, scripts, búsquedas, etc.
-	</notification>
-	<notification name="SetDisplayNameBlocked">
-		Lo sentimos. No puedes cambiar tu nombre mostrado. Si crees que se trata de un error, ponte en contacto con soporte.
-	</notification>
-	<notification name="SetDisplayNameFailedLength">
-		Lo sentimos. El nombre es demasiado largo.  Los nombres mostrados pueden tener un máximo de [LENGTH] caracteres.
-
-Prueba con un nombre más corto.
-	</notification>
-	<notification name="SetDisplayNameFailedGeneric">
-		Lo sentimos. No hemos podido configurar tu nombre mostrado.  Vuelve a intentarlo más tarde.
-	</notification>
-	<notification name="SetDisplayNameMismatch">
-		Los nombres mostrados introducidos no coinciden. Vuelve a introducirlos.
-	</notification>
-	<notification name="AgentDisplayNameUpdateThresholdExceeded">
-		Lo sentimos. Tendrás que esperar para poder cambiar tu nombre mostrado.
-
-Consulta http://wiki.secondlife.com/wiki/Setting_your_display_name
-
-Vuelve a intentarlo más tarde.
-	</notification>
-	<notification name="AgentDisplayNameSetBlocked">
-		Lo sentimos. No he mos podido configurar el nombre que has solicitado porque contiene una palabra prohibida.
- 
- Prueba con un nombre distinto.
-	</notification>
-	<notification name="AgentDisplayNameSetInvalidUnicode">
-		El nombre mostrado que deseas configurar contiene caracteres no válidos.
-	</notification>
-	<notification name="AgentDisplayNameSetOnlyPunctuation">
-		Tu nombre mostrado debe contener letras y no debe incluir signos de puntuación.
-	</notification>
-	<notification name="DisplayNameUpdate">
-		A [OLD_NAME] ([SLID]) se le conoce ahora como [NEW_NAME].
-	</notification>
-	<notification name="OfferTeleport">
-		¿Ofrecer teleporte a tu posición con este mensaje?
-		<form name="form">
-			<input name="message">
-				Ven conmigo a [REGION]
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="OfferTeleportFromGod">
-		¿Obligar a este Residente a ir a tu localización?
-		<form name="form">
-			<input name="message">
-				Ven conmigo a [REGION]
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="TeleportFromLandmark">
-		¿Seguro que quieres teleportarte a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
-		<usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
-	</notification>
-	<notification name="TeleportToPick">
-		¿Teleportarte a [PICK]?
-		<usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
-	</notification>
-	<notification name="TeleportToClassified">
-		¿Teleportarte a [CLASSIFIED]?
-		<usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
-	</notification>
-	<notification name="TeleportToHistoryEntry">
-		¿Teleportarse a [HISTORY_ENTRY]?
-		<usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
-	</notification>
-	<notification label="Mensaje a todo el estado" name="MessageEstate">
-		Escribe un anuncio breve que se enviará a todo el que esté en tu estado.
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification label="Cambiar un estado Linden" name="ChangeLindenEstate">
-		Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.).
-
-Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes.  En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor. 
-
-¿Continuar?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess">
-		Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
-
-Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$.
-Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateAllowedAgentAdd">
-		¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateAllowedAgentRemove">
-		¿Quitar de la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateAllowedGroupAdd">
-		¿Añadir a la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateAllowedGroupRemove">
-		¿Quitar de la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateBannedAgentAdd">
-		¿Denegar el acceso sólo a este estado o a [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateBannedAgentRemove">
-		¿Quitar de la lista de prohibición de acceso a este residente para que acceda sólo a este estado o a [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateManagerAdd">
-		¿Añadir al administrador del estado sólo para este estado o para [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Seleccionar el estado" name="EstateManagerRemove">
-		¿Remover al administrador del estado sólo para este estado o para [ALL_ESTATES]?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
-	</notification>
-	<notification label="Confirmar la expulsión" name="EstateKickUser">
-		¿Echar a [EVIL_USER] de este estado?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="EstateChangeCovenant">
-		¿Estás seguro de que quieres cambiar el contrato del estado?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked">
-		No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-
-Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_KB">
-		No estás autorizado en esa región por su nivel de calificación. 
-
-¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
-		</url>
-		<usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Notify">
-		No estás autorizado en esa región por su nivel de calificación.
-	</notification>
-	<notification name="RegionEntryAccessBlocked_Change">
-		No estás autorizado en esta región por tus preferencias sobre el nivel de calificación.
-
-Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo &gt; Preferencias &gt; General.
-		<form name="form">
-			<button name="OK" text="Cambiar las preferencias"/>
-			<button default="true" name="Cancel" text="Cerrar"/>
-			<ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/>
-		</form>
-	</notification>
-	<notification name="PreferredMaturityChanged">
-		Tu preferencia de nivel de calificación actual es [RATING].
-	</notification>
-	<notification name="LandClaimAccessBlocked">
-		No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-
-Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_KB">
-		No puedes reclamar este terreno por su nivel de calificación. 
-
-¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
-		</url>
-		<usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
-	</notification>
-	<notification name="LandClaimAccessBlocked_Notify">
-		No puedes reclamar este terreno debido a su nivel de calificación.
-	</notification>
-	<notification name="LandClaimAccessBlocked_Change">
-		No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
-
-Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
-		<usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked">
-		No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-
-Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_KB">
-		No puedes comprar este terreno por tus preferencias de nivel de calificación. 
-
-¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
-		<url name="url">
-			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
-		</url>
-		<usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
-	</notification>
-	<notification name="LandBuyAccessBlocked_Notify">
-		No puedes comprar este terreno por su nivel de calificación.
-	</notification>
-	<notification name="LandBuyAccessBlocked_Change">
-		No puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
-
-Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
-		<usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
-	</notification>
-	<notification name="TooManyPrimsSelected">
-		Hay demasiados prims seleccionados.  Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemImportingEstateCovenant">
-		Hay problemas al importar el contrato del estado.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ProblemAddingEstateManager">
-		Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores.
-	</notification>
-	<notification name="ProblemAddingEstateGeneric">
-		Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista.
-	</notification>
-	<notification name="UnableToLoadNotecardAsset">
-		En este momento, no se pueden cargar los datos de la&apos;s nota&apos;s.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="NotAllowedToViewNotecard">
-		Permisos insuficientes para ver la nota asociada a la ID solicitada.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MissingNotecardAssetID">
-		Se ha perdido en la base de datos la ID de la nota.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="PublishClassified">
-		Recuerda: las cuotas que se pagan por los clasificados no son reembolsables.
-
-¿Publicar ahora este anuncio por [AMOUNT] L$?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="SetClassifiedMature">
-		¿Este anuncio tiene contenido &apos;Moderado&apos;?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="SetGroupMature">
-		¿Este grupo tiene contenido &apos;Moderado&apos;?
-		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification label="Confirmar el reinicio" name="ConfirmRestart">
-		¿Verdaderamente quieres reiniciar la región de aquí a 2 minutos?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification label="Mensaje a toda la región" name="MessageRegion">
-		Escribe un anuncio breve que se enviará a todo el que esté en esta región.
-		<form name="form">
-			<input name="message"/>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification label="Cambiada la calificación de la región" name="RegionMaturityChange">
-		Se ha actualizado el nivel de calificación de esta región.
-Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa.
-
-Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago.
-	</notification>
-	<notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch">
-		Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME].
-	</notification>
-	<notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner">
-		No se pueden comprar a la vez objetos de propietarios diferentes.
-Por favor, selecciona sólo un objeto y vuelve a intentarlo.
-	</notification>
-	<notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly">
-		No se puede comprar a la vez los contenidos de más de un objeto.
-Por favor, selecciona sólo un objeto y vuelve a intentarlo.
-	</notification>
-	<notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner">
-		No se pueden comprar a la vez objetos de propietarios diferentes.
-Por favor, selecciona sólo un objeto y vuelve a intentarlo.
-	</notification>
-	<notification name="BuyOriginal">
-		¿Comprar el objeto original de [OWNER] por [PRICE] L$?
-Pasarás a ser el propietario de este objeto.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BuyOriginalNoOwner">
-		¿Comprar el objeto original por [PRICE] L$?
-Pasarás a ser el propietario de este objeto.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopy">
-		¿Comprar una copia de [OWNER] por [PRICE] L$?
-El objeto se copiará a tu inventario.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BuyCopyNoOwner">
-		¿Comprar una copia por [PRICE] L$?
-El objeto se copiará a tu inventario.
-Podrás:
- Modificarlo: [MODIFYPERM]
- Copiarlo: [COPYPERM]
- Revenderlo o darlo: [RESELLPERM]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BuyContents">
-		¿Comprar los contenidos de [OWNER] por [PRICE] L$?
-Serán copiados a tu inventario.
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BuyContentsNoOwner">
-		¿Comprar los contenidos por [PRICE] L$?
-Serán copiados a tu inventario.
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchase">
-		Esta transacción consiste en:
-[ACTION]
-
-¿Estás seguro de querer hacer esta compra?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmPurchasePassword">
-		Esta transacción consiste en:
-[ACTION]
-
-¿Estás seguro de querer hacer esta compra?
-Por favor, vuelva a escribir tu contraseña y pulsa OK.
-		<form name="form">
-			<input name="message"/>
-			<button name="ConfirmPurchase" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="SetPickLocation">
-		Nota:
-Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromObject">
-		Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se quitarán de tu inventario, no se copiarán.
-
-¿Mover el/los ítem/s del inventario?
-		<usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="MoveInventoryFromScriptedObject">
-		Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se moverán a tu inventario, no se copiarán.
-Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script.
-
-¿Mover el/los ítem/s del inventario?
-		<usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ClickActionNotPayable">
-		Advertencia: la acción &apos;Pagar al objeto&apos; ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
-		<form name="form">
-			<ignore name="ignore" text="He establecido la acción &apos;Pagar al objeto&apos; cuando construyo uno sin un script money()"/>
-		</form>
-	</notification>
-	<notification name="OpenObjectCannotCopy">
-		En este objeto, no hay ítems que estés autorizado a copiar.
-	</notification>
-	<notification name="WebLaunchAccountHistory">
-		¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
-		<usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
-	</notification>
-	<notification name="ConfirmQuit">
-		¿Estás seguro de que quieres salir?
-		<usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification name="DeleteItems">
-		[QUESTION]
-		<usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="HelpReportAbuseEmailLL">
-		Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad].
-
-Se investigan y resuelven todas las infracciones denunciadas.
-	</notification>
-	<notification name="HelpReportAbuseSelectCategory">
-		Por favor, elige una categoría para esta denuncia de infracción.
-Seleccionar una categoría nos ayuda a clasificar y procesar las denuncias de infracciones.
-	</notification>
-	<notification name="HelpReportAbuseAbuserNameEmpty">
-		Por favor, escribe el nombre del infractor.
-Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
-	</notification>
-	<notification name="HelpReportAbuseAbuserLocationEmpty">
-		Por favor, escribe la localización donde tuvo lugar la infracción.
-Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
-	</notification>
-	<notification name="HelpReportAbuseSummaryEmpty">
-		Por favor, escribe un resumen de la infracción que ha habido.
-Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
-	</notification>
-	<notification name="HelpReportAbuseDetailsEmpty">
-		Por favor, escribe una descripción minuciosa de la infracción que ha habido.
-Sé tan específico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias.
-Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones.
-	</notification>
-	<notification name="HelpReportAbuseContainsCopyright">
-		Estimado Residente:
-
-Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta.
-
-(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (&apos;Abuse Team&apos;) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
-
-(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php &apos;DMCA Policy&apos;].
-
-Si todavía quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia.  En concreto, debes seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
-
-Gracias,
-
-Linden Lab
-	</notification>
-	<notification name="FailedRequirementsCheck">
-		Han desaparecido de [FLOATER] estos componentes:
-[COMPONENTS]
-	</notification>
-	<notification label="Reemplazar el anexado actual" name="ReplaceAttachment">
-		En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el ítem seleccionado"/>
-			<button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
-			<button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification label="¡Aviso! Modo Ocupado" name="BusyModePay">
-		Estás en el modo Ocupado. Por tanto, no recibirás ningún ítem a cambio de este pago.
-
-¿Quieres salir del modo Ocupado antes de completar esta transacción?
-		<form name="form">
-			<ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/>
-			<button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/>
-			<button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="ConfirmDeleteProtectedCategory">
-		La carpeta &apos;[FOLDERNAME]&apos; pertenece al sistema,   y borrar carpetas del sistema puede provocar inestabilidad.  ¿Estás seguro de que quieres borrarla?
-		<usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmEmptyTrash">
-		¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera?
-		<usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmClearBrowserCache">
-		¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmClearCookies">
-		¿Estás seguro de que quieres limpiar tus cookies?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
-	</notification>
-	<notification name="ConfirmClearMediaUrlList">
-		¿Estás seguro de que quieres vaciar tu lista de URL guardadas?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
-	</notification>
-	<notification name="ConfirmEmptyLostAndFound">
-		¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos?
-		<usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="CopySLURL">
-		Se ha copiado a tu portapapeles esta SLurl:
- [SLURL]
-
-Publícala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador.
-		<form name="form">
-			<ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/>
-		</form>
-	</notification>
-	<notification name="WLSavePresetAlert">
-		¿Quieres sobrescribir la preselección guardada?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="WLDeletePresetAlert">
-		¿Quieres borrar [SKY]?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="WLNoEditDefault">
-		No puedes editar ni borrar una preselección por defecto.
-	</notification>
-	<notification name="WLMissingSky">
-		Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
-	</notification>
-	<notification name="PPSaveEffectAlert">
-		Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
-		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="NewSkyPreset">
-		Dame un nombre para el cielo nuevo.
-		<form name="form">
-			<input name="message">
-				Preselección nueva
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="ExistsSkyPresetAlert">
-		¡Esa preselección ya existe!
-	</notification>
-	<notification name="NewWaterPreset">
-		Dame un nombre para la nueva preselección de agua.
-		<form name="form">
-			<input name="message">
-				Preselección nueva
-			</input>
-			<button name="OK" text="OK"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="ExistsWaterPresetAlert">
-		¡Esa preselección ya existe!
-	</notification>
-	<notification name="WaterNoEditDefault">
-		No puedes editar o borrar una preselección por defecto.
-	</notification>
-	<notification name="ChatterBoxSessionStartError">
-		No se puede empezar una nueva sesión de chat con [RECIPIENT].
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ChatterBoxSessionEventError">
-		[EVENT]
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ForceCloseChatterBoxSession">
-		Debe cerrarse tu sesión de chat con [NAME].
-[REASON]
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="Cannot_Purchase_an_Attachment">
-		No puedes comprar un objeto mientras esté anexado.
-	</notification>
-	<notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails">
-		Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AutoWearNewClothing">
-		¿Quieres ponerte automáticamente la ropa que vas a crear?
-		<usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="NotAgeVerified">
-		Debes haber verificado tu edad para visitar este sitio.  ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/verification.php?lang=es
-		</url>
-		<usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="Cannot enter parcel: no payment info on file">
-		Para visitar este sitio debes haber aportado información de pago en tu cuenta.  ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
-
-[_URL]
-		<url name="url" option="0">
-			https://secondlife.com/account/index.php?lang=es
-		</url>
-		<usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="MissingString">
-		La cadena [STRING_NAME] Ha desaparecido de strings.xml
-	</notification>
-	<notification name="SystemMessageTip">
-		[MESSAGE]
-	</notification>
-	<notification name="IMSystemMessageTip">
-		[MESSAGE]
-	</notification>
-	<notification name="Cancelled">
-		Cancelado
-	</notification>
-	<notification name="CancelledSit">
-		Cancelado el sentarte
-	</notification>
-	<notification name="CancelledAttach">
-		Cancelado el anexar
-	</notification>
-	<notification name="ReplacedMissingWearable">
-		Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto.
-	</notification>
-	<notification name="GroupNotice">
-		Asunto: [SUBJECT], Mensaje: [MESSAGE]
-	</notification>
-	<notification name="FriendOnline">
-		[NAME] está conectado
-	</notification>
-	<notification name="FriendOffline">
-		[NAME] está desconectado
-	</notification>
-	<notification name="AddSelfFriend">
-		Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
-	</notification>
-	<notification name="UploadingAuctionSnapshot">
-		Subiendo fotos del mundo y del sitio web...
-(tardará unos 5 minutos).
-	</notification>
-	<notification name="UploadPayment">
-		Has pagado [AMOUNT] LS por la subida.
-	</notification>
-	<notification name="UploadWebSnapshotDone">
-		Completada la subida de la foto del sitio web.
-	</notification>
-	<notification name="UploadSnapshotDone">
-		Completada la subida de la foto del mundo.
-	</notification>
-	<notification name="TerrainDownloaded">
-		Se ha descargado Terrain.raw
-	</notification>
-	<notification name="GestureMissing">
-		No se encuentra en la base de datos el gesto [NAME].
-	</notification>
-	<notification name="UnableToLoadGesture">
-		No se puede cargar el gesto [NAME].
-	</notification>
-	<notification name="LandmarkMissing">
-		El hito ha desaparecido de la base de datos.
-	</notification>
-	<notification name="UnableToLoadLandmark">
-		No se ha podido cargar el hito. Por favor, vuelve a intentarlo.
-	</notification>
-	<notification name="CapsKeyOn">
-		Tienes pulsada la tecla de mayúsculas.
-Esto puede influir en tu contraseña.
-	</notification>
-	<notification name="NotecardMissing">
-		La nota ha desaparecido de la base de datos.
-	</notification>
-	<notification name="NotecardNoPermissions">
-		No tienes permiso para ver esta nota.
-	</notification>
-	<notification name="RezItemNoPermissions">
-		No tienes permisos suficientes para renderizar el objeto.
-	</notification>
-	<notification name="UnableToLoadNotecard">
-		En este momento no se puede cargar la nota.
-	</notification>
-	<notification name="ScriptMissing">
-		El script ha desaparecido de la base de datos.
-	</notification>
-	<notification name="ScriptNoPermissions">
-		No tienes permisos suficientes para ver el script.
-	</notification>
-	<notification name="UnableToLoadScript">
-		No se ha podido cargar el script. Por favor, vuelve a intentarlo.
-	</notification>
-	<notification name="IncompleteInventory">
-		Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto.
-	</notification>
-	<notification name="CannotModifyProtectedCategories">
-		No puedes modificar categorías que están protegidas.
-	</notification>
-	<notification name="CannotRemoveProtectedCategories">
-		No puedes quitar categorías que están protegidas.
-	</notification>
-	<notification name="UnableToBuyWhileDownloading">
-		No se puede comprar un objeto mientras se descargan los datos.
-Por favor, vuelve a intentarlo.
-	</notification>
-	<notification name="UnableToLinkWhileDownloading">
-		No se puede enlazar un objeto mientras se descargan los datos.
-Por favor, vuelve a intentarlo.
-	</notification>
-	<notification name="CannotBuyObjectsFromDifferentOwners">
-		No puedes comprar más de un objeto a la vez.
-Por favor, selecciona un sólo objeto.
-	</notification>
-	<notification name="ObjectNotForSale">
-		Este objeto no está en venta.
-	</notification>
-	<notification name="EnteringGodMode">
-		Entrando en el modo administrativo, nivel [LEVEL]
-	</notification>
-	<notification name="LeavingGodMode">
-		Saliendo del modo administrativo, nivel [LEVEL]
-	</notification>
-	<notification name="CopyFailed">
-		No tienes pemiso para copiar esto.
-	</notification>
-	<notification name="InventoryAccepted">
-		[NAME] ha recibido tu oferta de inventario.
-	</notification>
-	<notification name="InventoryDeclined">
-		[NAME] ha rehusado tu oferta del inventario.
-	</notification>
-	<notification name="ObjectMessage">
-		[NAME]: [MESSAGE]
-	</notification>
-	<notification name="CallingCardAccepted">
-		Se ha aceptado tu tarjeta de visita.
-	</notification>
-	<notification name="CallingCardDeclined">
-		Se ha rehusado tu tarjeta de visita.
-	</notification>
-	<notification name="TeleportToLandmark">
-		Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
-Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
-	</notification>
-	<notification name="TeleportToPerson">
-		Puedes contactar con un Residente como &apos;[NAME]&apos; abriendo el panel Gente en el lado derecho de tu pantalla.
-Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
-(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
-	</notification>
-	<notification name="CantSelectLandFromMultipleRegions">
-		No puedes seleccionar un terreno que cruce las fronteras entre servidores.
-Inténtalo seleccionando un trozo más pequeño de terreno.
-	</notification>
-	<notification name="SearchWordBanned">
-		Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
-	</notification>
-	<notification name="NoContentToSearch">
-		Por favor, elige al menos un tipo de contenido a buscar (&apos;PG&apos;, &apos;Mature&apos;, o &apos;Adult&apos;).
-	</notification>
-	<notification name="SystemMessage">
-		[MESSAGE]
-	</notification>
-	<notification name="PaymentReceived">
-		[MESSAGE]
-	</notification>
-	<notification name="PaymentSent">
-		[MESSAGE]
-	</notification>
-	<notification name="EventNotification">
-		Notificación de un evento:
-
-[NAME]
-[DATE]
-		<form name="form">
-			<button name="Details" text="Detalles"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="TransferObjectsHighlighted">
-		En estos momentos, están realzados todos los objetos de esta parcela que serán transferidos al comprador de la misma.
-
-* No están realzados los árboles y hierbas que se transferirán.
-		<form name="form">
-			<button name="Done" text="Hecho"/>
-		</form>
-	</notification>
-	<notification name="DeactivatedGesturesTrigger">
-		Desactivados los gestos que tienen el mismo botón:
-[NAMES]
-	</notification>
-	<notification name="NoQuickTime">
-		No parece que tu sistema tenga instalado el software QuickTime de Apple.
-Si quieres ver media en streaming en las parcelas que los tienen, deberías ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player.
-	</notification>
-	<notification name="NoPlugin">
-		No se ha encontrado el &apos;Media Plugin&apos; para manejar el &apos;mime type&apos; &quot;[MIME_TYPE]&quot;.  Los media de este tipo no estarán disponibles.
-	</notification>
-	<notification name="MediaPluginFailed">
-		Fallo de este &apos;Media Plugin&apos;:
-    [PLUGIN]
-
-Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas.
-		<form name="form">
-			<ignore name="ignore" text="Fallo al ejecutar un &apos;Media Plugin&apos;"/>
-		</form>
-	</notification>
-	<notification name="OwnedObjectsReturned">
-		Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada.
-	</notification>
-	<notification name="OtherObjectsReturned">
-		Se han devuelto a su inventario los objetos en la parcela de terreno seleccionada propiedad de [NAME].
-	</notification>
-	<notification name="OtherObjectsReturned2">
-		Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de &apos;[NAME]&apos;.
-	</notification>
-	<notification name="GroupObjectsReturned">
-		Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada.
-Los objetos transferibles que se transfirieron al grupo se han devuelto a sus propietarios anteriores.
-Los objetos no transferibles que se transfirieron al grupo han sido borrados.
-	</notification>
-	<notification name="UnOwnedObjectsReturned">
-		Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada.
-	</notification>
-	<notification name="ServerObjectMessage">
-		Mensaje de [NAME]:
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;
-	</notification>
-	<notification name="NotSafe">
-		Este terreno tiene el daño activado.
-Aquí puedes ser herido. Si mueres, se te teleportará a tu Base.
-	</notification>
-	<notification name="NoFly">
-		Este terreno tiene desactivado el poder volar.
-Aquí no puedes volar.
-	</notification>
-	<notification name="PushRestricted">
-		Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno.
-	</notification>
-	<notification name="NoVoice">
-		Este tereno tiene desactivado el chat de voz. No podrás oír hablar a nadie.
-	</notification>
-	<notification name="NoBuild">
-		Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
-	</notification>
-	<notification name="ScriptsStopped">
-		Un administrador ha detenido temporalmente los scripts en esta región.
-	</notification>
-	<notification name="ScriptsNotRunning">
-		En esta región no se está ejecutando ningún script.
-	</notification>
-	<notification name="NoOutsideScripts">
-		Este terreno tiene desactivados los scripts externos.
-
-Los scripts no funcionan aquí, excepto los pertenecientes al propietario del terreno.
-	</notification>
-	<notification name="ClaimPublicLand">
-		Sólo puedes reclamar terreno público de la región en que estás.
-	</notification>
-	<notification name="RegionTPAccessBlocked">
-		No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor.
-
-Por favor, dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
-	</notification>
-	<notification name="URBannedFromRegion">
-		Se te ha prohibido el acceso a la región.
-	</notification>
-	<notification name="NoTeenGridAccess">
-		Tu cuenta no puede conectarse a esta región del grid teen.
-	</notification>
-	<notification name="ImproperPaymentStatus">
-		No tienes el estado de pago adecuado para entrar a esta región.
-	</notification>
-	<notification name="MustGetAgeParcel">
-		Debes haber verificado tu edad para entrar a esta parcela.
-	</notification>
-	<notification name="NoDestRegion">
-		No se ha encontrada la región de destino.
-	</notification>
-	<notification name="NotAllowedInDest">
-		No estás autorizado en el destino.
-	</notification>
-	<notification name="RegionParcelBan">
-		No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino.
-	</notification>
-	<notification name="TelehubRedirect">
-		Has sido redirigido a un punto de teleporte.
-	</notification>
-	<notification name="CouldntTPCloser">
-		No se puede teleportar a un destino tan cercano.
-	</notification>
-	<notification name="TPCancelled">
-		Teleporte cancelado.
-	</notification>
-	<notification name="FullRegionTryAgain">
-		En estos momentos, está llena la región a la que estás intentando entrar.
-Por favor, vuelve a intentarlo en unos momentos.
-	</notification>
-	<notification name="GeneralFailure">
-		Fallo general.
-	</notification>
-	<notification name="RoutedWrongRegion">
-		Mal dirigido a la región. Por favor, vuelve a intentarlo.
-	</notification>
-	<notification name="NoValidAgentID">
-		ID de agente inválido.
-	</notification>
-	<notification name="NoValidSession">
-		ID de sesión inválido.
-	</notification>
-	<notification name="NoValidCircuit">
-		Circuito de código inválido.
-	</notification>
-	<notification name="NoValidTimestamp">
-		Fecha inválida.
-	</notification>
-	<notification name="NoPendingConnection">
-		No se puede crear la conexión.
-	</notification>
-	<notification name="InternalUsherError">
-		Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
-	</notification>
-	<notification name="NoGoodTPDestination">
-		No se puede encontrar en esta región un buen destino para el teleporte.
-	</notification>
-	<notification name="InternalErrorRegionResolver">
-		Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
-	</notification>
-	<notification name="NoValidLanding">
-		No se ha podido encontrar un punto de aterrizaje válido.
-	</notification>
-	<notification name="NoValidParcel">
-		No se ha podido encontrar una parcela válida.
-	</notification>
-	<notification name="ObjectGiveItem">
-		Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]:
-[ITEM_SLURL]
-		<form name="form">
-			<button name="Keep" text="Guardar"/>
-			<button name="Discard" text="Descartar"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="UserGiveItem">
-		[NAME_SLURL] te ha dado este [OBJECTTYPE]:
-[ITEM_SLURL]
-		<form name="form">
-			<button name="Show" text="Mostrar"/>
-			<button name="Discard" text="Descartar"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="GodMessage">
-		[NAME]
-
-[MESSAGE]
-	</notification>
-	<notification name="JoinGroup">
-		[MESSAGE]
-		<form name="form">
-			<button name="Join" text="Entrar"/>
-			<button name="Decline" text="Rehusar"/>
-			<button name="Info" text="Información"/>
-		</form>
-	</notification>
-	<notification name="TeleportOffered">
-		[NAME_SLURL] te ha ofrecido teleportarte a su posición:
-
-[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
-		<form name="form">
-			<button name="Teleport" text="Teleportar"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="TeleportOfferSent">
-		Teleporte ofrecido a [TO_NAME]
-	</notification>
-	<notification name="GotoURL">
-		[MESSAGE]
-[URL]
-		<form name="form">
-			<button name="Later" text="Más tarde"/>
-			<button name="GoNow..." text="Ir ahora..."/>
-		</form>
-	</notification>
-	<notification name="OfferFriendship">
-		[NAME_SLURL] te está ofreciendo su amistad.
-
-[MESSAGE]
-
-(Por defecto, podrás ver si el otro está conectado)
-		<form name="form">
-			<button name="Accept" text="Aceptar"/>
-			<button name="Decline" text="Rehusar"/>
-		</form>
-	</notification>
-	<notification name="FriendshipOffered">
-		Has ofrecido amistad a [TO_NAME]
-	</notification>
-	<notification name="OfferFriendshipNoMessage">
-		[NAME_SLURL] está ofreciendo amistad.
-
-(De manera predeterminada, podrás ver si están conectados los demás.)
-		<form name="form">
-			<button name="Accept" text="Aceptar"/>
-			<button name="Decline" text="Rehusar"/>
-		</form>
-	</notification>
-	<notification name="FriendshipAccepted">
-		[NAME] ha aceptado tu oferta de amistad.
-	</notification>
-	<notification name="FriendshipDeclined">
-		[NAME] ha rehusado tu oferta de amistad.
-	</notification>
-	<notification name="FriendshipAcceptedByMe">
-		Aceptado el ofrecimiento de amistad.
-	</notification>
-	<notification name="FriendshipDeclinedByMe">
-		Rehusado el ofrecimiento de amistad.
-	</notification>
-	<notification name="OfferCallingCard">
-		[NAME] te está ofreciendo su tarjeta de visita.
-Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI.
-		<form name="form">
-			<button name="Accept" text="Aceptar"/>
-			<button name="Decline" text="Rehusar"/>
-		</form>
-	</notification>
-	<notification name="RegionRestartMinutes">
-		Esta región se reiniciará en [MINUTES] minutos.
-Si permaneces en esta región serás desconectado.
-	</notification>
-	<notification name="RegionRestartSeconds">
-		Esta región se reiniciará en  [SECONDS] segundos.
-Si permaneces en esta región serás desconectado.
-	</notification>
-	<notification name="LoadWebPage">
-		¿Cargar página web [URL]?
-
-[MESSAGE]
-
-Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]?
-		<form name="form">
-			<button name="Gotopage" text="Cargar"/>
-			<button name="Cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification name="FailedToFindWearableUnnamed">
-		Búsqueda fallida de [TYPE] en la base de datos.
-	</notification>
-	<notification name="FailedToFindWearable">
-		Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos.
-	</notification>
-	<notification name="InvalidWearable">
-		El ítem que quieres vestirte tiene una característica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este ítem.
-	</notification>
-	<notification name="ScriptQuestion">
-		&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, un objeto propiedad de &apos;[NAME]&apos;, quiere:
-
-[QUESTIONS]
-¿Es correcto?
-		<form name="form">
-			<button name="Yes" text="Sí"/>
-			<button name="No" text="No"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="ScriptQuestionCaution">
-		Un objeto de nombre &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, propiedad de &apos;[NAME]&apos;, quiere:
-
-[QUESTIONS]
-Si no confias en este objeto y en su creador, deberías rehusar esta petición.
-
-¿Autorizar esta petición?
-		<form name="form">
-			<button name="Grant" text="Autorizar"/>
-			<button name="Deny" text="Denegar"/>
-			<button name="Details" text="Detalles..."/>
-		</form>
-	</notification>
-	<notification name="ScriptDialog">
-		&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="ScriptDialogGroup">
-		&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [GROUPNAME]
-[MESSAGE]
-		<form name="form">
-			<button name="Ignore" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="BuyLindenDollarSuccess">
-		¡Gracias por tu pago!
-
-Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción,    y la cantidad se cargará en tu saldo de US$.
-
-Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control]
-	</notification>
-	<notification name="FirstOverrideKeys">
-		A partir de ahora, tus teclas de movimiento las gestiona un objeto.
-Prueba las teclas del cursor o AWSD para ver qué hacen.
-Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa &apos;M&apos; para hacerlo.
-	</notification>
-	<notification name="FirstSandbox">
-		Esta es una región &apos;sandbox&apos; (zona de pruebas) donde los Residentes pueden aprender a construir.
-
-Los objetos que construyas aquí serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir &apos;Tomar&apos; para que tu creación vaya a tu inventario.
-	</notification>
-	<notification name="MaxListSelectMessage">
-		Puedes seleccionar un máximo de [MAX_SELECT] ítems de esta lista.
-	</notification>
-	<notification name="VoiceInviteP2P">
-		[NAME] te está invitando a un chat de voz.
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
-		<form name="form">
-			<button name="Accept" text="Aceptar"/>
-			<button name="Decline" text="Rehusar"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="AutoUnmuteByIM">
-		[NAME] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo.
-	</notification>
-	<notification name="AutoUnmuteByMoney">
-		[NAME] ha dejado automáticamente de estar ignorado al darle dinero.
-	</notification>
-	<notification name="AutoUnmuteByInventory">
-		[NAME] ha dejado automáticamente de estar ignorado al ofrecerle inventario.
-	</notification>
-	<notification name="VoiceInviteGroup">
-		[NAME] ha empezado un chat de voz con el grupo [GROUP].
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
-		<form name="form">
-			<button name="Accept" text="Aceptar"/>
-			<button name="Decline" text="Rehusar"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="VoiceInviteAdHoc">
-		[NAME] ha empezado un chat de voz en multiconferencia.
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
-		<form name="form">
-			<button name="Accept" text="Aceptar"/>
-			<button name="Decline" text="Rehusar"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="InviteAdHoc">
-		NAME] te está invitando a un chat en multiconferencia.
-Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
-		<form name="form">
-			<button name="Accept" text="Aceptar"/>
-			<button name="Decline" text="Rehusar"/>
-			<button name="Mute" text="Ignorar"/>
-		</form>
-	</notification>
-	<notification name="VoiceChannelFull">
-		El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde.
-	</notification>
-	<notification name="ProximalVoiceChannelFull">
-		Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona.
-	</notification>
-	<notification name="VoiceChannelDisconnected">
-		Has sido desconectado de [VOICE_CHANNEL_NAME].  Vas a ser reconectado al chat de voz.
-	</notification>
-	<notification name="VoiceChannelDisconnectedP2P">
-		[VOICE_CHANNEL_NAME] ha colgado la llamada.  Vas a ser reconectado al chat de voz.
-	</notification>
-	<notification name="P2PCallDeclined">
-		[VOICE_CHANNEL_NAME] ha rehusado tu llamada.  Vas a ser reconectado al chat de voz.
-	</notification>
-	<notification name="P2PCallNoAnswer">
-		[VOICE_CHANNEL_NAME] no está disponible para coger tu llamada.  Vas a ser reconectado al chat de voz.
-	</notification>
-	<notification name="VoiceChannelJoinFailed">
-		Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde.  Vas a ser reconectado al chat de voz.
-	</notification>
-	<notification name="VoiceLoginRetry">
-		Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto.
-	</notification>
-	<notification name="VoiceEffectsExpired">
-		Una o más de las transformaciones de voz a las que estás suscrito han caducado.
-[Pulsa aquí [URL]] para renovar la suscripción.
-	</notification>
-	<notification name="VoiceEffectsExpiredInUse">
-		La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal.
-[Pulsa aquí [URL]] para renovar la suscripción.
-	</notification>
-	<notification name="VoiceEffectsWillExpire">
-		Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] días.
-[Pulsa aquí [URL]] para renovar la suscripción.
-	</notification>
-	<notification name="VoiceEffectsNew">
-		Están disponibles nuevas transformaciones de voz.
-	</notification>
-	<notification name="Cannot enter parcel: not a group member">
-		Sólo los miembros de un grupo determinado pueden visitar esta zona.
-	</notification>
-	<notification name="Cannot enter parcel: banned">
-		No puedes entrar en esta parcela, se te ha prohibido el acceso.
-	</notification>
-	<notification name="Cannot enter parcel: not on access list">
-		No puedes entrar en esta parcela, no estás en la lista de acceso.
-	</notification>
-	<notification name="VoiceNotAllowed">
-		No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME].
-	</notification>
-	<notification name="VoiceCallGenericError">
-		Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.
-	</notification>
-	<notification name="UnsupportedCommandSLURL">
-		No se admite el formato de la SLurl que has pulsado.
-	</notification>
-	<notification name="BlockedSLURL">
-		Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza.
-	</notification>
-	<notification name="ThrottledSLURL">
-		En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza.
-Por tu seguridad, serán bloqueadas durante unos segundos.
-	</notification>
-	<notification name="IMToast">
-		[MESSAGE]
-		<form name="form">
-			<button name="respondbutton" text="Responder"/>
-		</form>
-	</notification>
-	<notification name="ConfirmCloseAll">
-		¿Seguro que quieres cerrar todos los MI?
-		<usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="AttachmentSaved">
-		Se ha guardado el adjunto.
-	</notification>
-	<notification name="UnableToFindHelpTopic">
-		No se ha podido encontrar un tema de ayuda para este elemento.
-	</notification>
-	<notification name="ObjectMediaFailure">
-		Error del servidor: fallo en la actualización u obtención de los media.
-&apos;[ERROR]&apos;
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="TextChatIsMutedByModerator">
-		Un moderador ha silenciado tu chat de texto.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="VoiceIsMutedByModerator">
-		Un moderador ha silenciado tu voz.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="ConfirmClearTeleportHistory">
-		¿Estás seguro de que quieres borrar tu historial de teleportes?
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="BottomTrayButtonCanNotBeShown">
-		El botón elegido no se puede mostrar correctamente.
-Se mostrará cuando haya suficiente espacio.
-	</notification>
-	<notification name="ShareNotification">
-		Selecciona los residentes con quienes deseas compartir.
-	</notification>
-	<notification name="ShareItemsConfirmation">
-		¿Estás seguro de que quieres compartir los elementos siguientes?
-
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-
-Con los siguientes residentes:
-
-[RESIDENTS]
-		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification name="ItemsShared">
-		Los elementos se han compartido correctamente.
-	</notification>
-	<notification name="DeedToGroupFail">
-		Error de transferencia a grupo.
-	</notification>
-	<notification name="AvatarRezNotification">
-		( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; tardó [TIME] segundos en dejar de aparecer como nube.
-	</notification>
-	<notification name="AvatarRezSelfBakedDoneNotification">
-		( [EXISTENCE] segundos vivo)
-Has terminado de texturizar tu vestuario en [TIME] segundos.
-	</notification>
-	<notification name="AvatarRezSelfBakedUpdateNotification">
-		( [EXISTENCE] segundos vivo)
-Has enviado una actualización de tu apariencia después de [TIME] segundos.
-[STATUS]
-	</notification>
-	<notification name="AvatarRezCloudNotification">
-		( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; se convirtió en nube.
-	</notification>
-	<notification name="AvatarRezArrivedNotification">
-		( [EXISTENCE] segundos vivo)
-Apareció el avatar &apos;[NAME]&apos;.
-	</notification>
-	<notification name="AvatarRezLeftCloudNotification">
-		( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; salió al cabo de [TIME] segundos como nube.
-	</notification>
-	<notification name="AvatarRezEnteredAppearanceNotification">
-		( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; ya está en modo de edición de apariencia.
-	</notification>
-	<notification name="AvatarRezLeftAppearanceNotification">
-		( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; desactivó el modo de apariencia.
-	</notification>
-	<notification name="NoConnect">
-		Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
-Comprueba la configuración de la red y del servidor de seguridad.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="NoVoiceConnect">
-		Tenemos problemas de conexión con tu servidor de voz:
-
-[HOSTID]
-
-No podrás establecer comunicaciones de voz.
-Comprueba la configuración de la red y del servidor de seguridad.
-		<usetemplate name="okbutton" yestext="OK"/>
-	</notification>
-	<notification name="AvatarRezLeftNotification">
-		( [EXISTENCE] segundos vivo)
-El avatar &apos;[NAME]&apos; ya estaba totalmente cargado al salir.
-	</notification>
-	<notification name="AvatarRezSelfBakedTextureUploadNotification">
-		( [EXISTENCE] segundos con vida )
-Has actualizado una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
-	</notification>
-	<notification name="AvatarRezSelfBakedTextureUpdateNotification">
-		( [EXISTENCE] segundos con vida )
-Has actualizado de manera local una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
-	</notification>
-	<notification name="ConfirmLeaveCall">
-		¿Estás seguro de que deseas salir de esta multiconferencia?
-		<usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="Sí"/>
-	</notification>
-	<notification name="ConfirmMuteAll">
-		Has seleccionado silenciar a todos los participantes en una multiconferencia.
-Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia.
-
-¿Deseas silenciar a todos?
-		<usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/>
-	</notification>
-	<notification label="Chat" name="HintChat">
-		Para unirte a la conversación, escribe en el campo de chat que aparece a continuación.
-	</notification>
-	<notification label="Levantarme" name="HintSit">
-		Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme.
-	</notification>
-	<notification label="Hablar" name="HintSpeak">
-		Pulsa en el botón: Hablar para conectar y desconectar el micrófono.
-
-Pulsa en el cursor arriba para ver el panel de control de voz.
-
-Al ocultar el botón Hablar se desactiva la función de voz.
-	</notification>
-	<notification label="Explora el mundo" name="HintDestinationGuide">
-		La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
-	</notification>
-	<notification label="Panel lateral" name="HintSidePanel">
-		Accede de manera rápida a tu inventario, así como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral.
-	</notification>
-	<notification label="Mover" name="HintMove">
-		Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado.
-	</notification>
-	<notification label="" name="HintMoveClick">
-		1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él.
-
-2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista.
-	</notification>
-	<notification label="Nombre mostrado" name="HintDisplayName">
-		Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
-	</notification>
-	<notification label="Visión" name="HintView">
-		Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
-	</notification>
-	<notification label="Inventario" name="HintInventory">
-		Accede a tu inventario para buscar ítems. Los ítems más recientes se pueden encontrar fácilmente en la pestaña Recientes.
-	</notification>
-	<notification label="¡Tienes dólares Linden!" name="HintLindenDollar">
-		Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden.
-	</notification>
-	<notification name="PopupAttempt">
-		Se ha impedido que se abriera una ventana emergente.
-		<form name="form">
-			<ignore name="ignore" text="Permitir todas las ventanas emergentes"/>
-			<button name="open" text="Abrir ventana emergente"/>
-		</form>
-	</notification>
-	<notification name="AuthRequest">
-		El sitio en &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; de la plataforma &apos;[REALM]&apos; requiere un nombre de usuario y una contraseña.
-		<form name="form">
-			<input name="username" text="Nombre de usuario"/>
-			<input name="password" text="Contraseña"/>
-			<button name="ok" text="Enviar"/>
-			<button name="cancel" text="Cancelar"/>
-		</form>
-	</notification>
-	<notification label="" name="ModeChange">
-		Para cambiar de modo tienes que salir y reiniciar.
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification label="" name="NoClassifieds">
-		La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification label="" name="NoGroupInfo">
-		La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification label="" name="NoPicks">
-		La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification label="" name="NoWorldMap">
-		La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification label="" name="NoVoiceCall">
-		Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification label="" name="NoAvatarShare">
-		Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<notification label="" name="NoAvatarPay">
-		El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
-		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
-	</notification>
-	<global name="UnsupportedCPU">
-		- La velocidad de tu CPU no cumple los requerimientos mínimos.
-	</global>
-	<global name="UnsupportedGLRequirements">
-		Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
-
-Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
-	</global>
-	<global name="UnsupportedCPUAmount">
-		796
-	</global>
-	<global name="UnsupportedRAMAmount">
-		510
-	</global>
-	<global name="UnsupportedGPU">
-		- Tu tarjeta gráfica no cumple los requerimientos mínimos.
-	</global>
-	<global name="UnsupportedRAM">
-		- La memoria de tu sistema no cumple los requerimientos mínimos.
-	</global>
-	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
-		Si posees un terreno, puedes hacerlo tu Base.
-También puedes buscar en el Mapa lugares marcados como &quot;Puntos de Información&quot;.
-	</global>
-	<global name="You died and have been teleported to your home location">
-		Has muerto y te has teleportado a tu Base.
-	</global>
-</notifications>
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+	<global name="skipnexttime">
+		No mostrarme esto otra vez
+	</global>
+	<global name="alwayschoose">
+		Elegir siempre esta opción
+	</global>
+	<global name="implicitclosebutton">
+		Cerrar
+	</global>
+	<template name="okbutton">
+		<form>
+			<button name="OK_okbutton" text="$yestext"/>
+		</form>
+	</template>
+	<template name="okignore">
+		<form>
+			<button name="OK_okignore" text="$yestext"/>
+		</form>
+	</template>
+	<template name="okcancelbuttons">
+		<form>
+			<button name="OK_okcancelbuttons" text="$yestext"/>
+			<button name="Cancel_okcancelbuttons" text="$notext"/>
+		</form>
+	</template>
+	<template name="okcancelignore">
+		<form>
+			<button name="OK_okcancelignore" text="$yestext"/>
+			<button name="Cancel_okcancelignore" text="$notext"/>
+		</form>
+	</template>
+	<template name="okhelpbuttons">
+		<form>
+			<button name="OK_okhelpbuttons" text="$yestext"/>
+			<button name="Help" text="$helptext"/>
+		</form>
+	</template>
+	<template name="yesnocancelbuttons">
+		<form>
+			<button name="Yes" text="$yestext"/>
+			<button name="No" text="$notext"/>
+			<button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+		</form>
+	</template>
+	<notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert">
+		Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir.  Por favor, comprueba que tienes instalado el último Visor.
+
+Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha encontrado en notifications.xml.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="FloaterNotFound">
+		Error: no se pudieron encontrar estos controles:
+
+[CONTROLS]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="TutorialNotFound">
+		Actualmente, no hay un tutorial disponible.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="GenericAlert">
+		[MESSAGE]
+	</notification>
+	<notification name="GenericAlertYesCancel">
+		[MESSAGE]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+	</notification>
+	<notification name="BadInstallation">
+		Ha habido un error actualizando [APP_NAME].  Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LoginFailedNoNetwork">
+		No se puede conectar con [SECOND_LIFE_GRID].
+    &apos;[DIAGNOSTIC]&apos;
+Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MessageTemplateNotFound">
+		No se ha encontrado la plantilla de mensaje [PATH].
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="WearableSave">
+		¿Guardar los cambios en las ropas o partes del cuerpo actuales?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/>
+	</notification>
+	<notification name="CompileQueueSaveText">
+		Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
+	</notification>
+	<notification name="CompileQueueSaveBytecode">
+		Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
+	</notification>
+	<notification name="WriteAnimationFail">
+		Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde.
+	</notification>
+	<notification name="UploadAuctionSnapshotFail">
+		Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON]
+	</notification>
+	<notification name="UnableToViewContentsMoreThanOne">
+		No se puede ver a la vez los contenidos de más de un ítem. Por favor, elige un solo objeto y vuelve a intentarlo.
+	</notification>
+	<notification name="SaveClothingBodyChanges">
+		¿Guardar todos los cambios en la ropa y partes del cuerpo?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/>
+	</notification>
+	<notification name="FriendsAndGroupsOnly">
+		Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="FavoritesOnLogin">
+		Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="GrantModifyRights">
+		Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a [NAME]?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="GrantModifyRightsMultiple">
+		Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a los Residentes elegidos?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="RevokeModifyRights">
+		¿Quieres retirar los permisos de modificación a [NAME]?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="RevokeModifyRightsMultiple">
+		¿Quieres revocar los derechos de modificación a los residentes seleccionados?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="UnableToCreateGroup">
+		No se ha podido crear el grupo.
+[MESSAGE]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PanelGroupApply">
+		[NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/>
+	</notification>
+	<notification name="MustSpecifyGroupNoticeSubject">
+		Para enviar un aviso de grupo debes especificar un asunto.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AddGroupOwnerWarning">
+		Vas a añadir miembros al rol de [ROLE_NAME].
+No podrás removérseles de ese rol, sino que deberán renunciar a él por sí mismos.
+¿Estás seguro de que quieres seguir?
+		<usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="AssignDangerousActionWarning">
+		Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
+
+ *ATENCIÓN*
+ Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad.
+¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="AssignDangerousAbilityWarning">
+		Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
+
+ *ATENCIÓN*
+ Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario.
+¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="AttachmentDrop">
+		Vas a soltar tu anexado.
+    ¿Estás seguro de que quieres continuar?
+		<usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="JoinGroupCanAfford">
+		Entrar a este grupo cuesta [COST] L$.
+¿Quieres hacerlo??
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+	</notification>
+	<notification name="JoinGroupNoCost">
+		Vas a entrar al grupo [NAME].
+¿Quieres seguir?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+	</notification>
+	<notification name="JoinGroupCannotAfford">
+		Entrar a este grupo cuesta [COST] L$.
+No tienes dinero suficiente para entrar.
+	</notification>
+	<notification name="CreateGroupCost">
+		Crear este grupo te costará 100 L$.
+Los grupos necesitan más de un miembro. Si no, son borrados permanentemente.
+Por favor, invita a miembros en las próximas 48 horas.
+		<usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/>
+	</notification>
+	<notification name="LandBuyPass">
+		Por [COST] L$ puedes entrar a este terreno (&apos;[PARCEL_NAME]&apos;) durante [TIME] horas. ¿Comprar un pase?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="SalePriceRestriction">
+		El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera.
+Por favor, elige a alguien concreto como comprador si la venta es por 0 L$.
+	</notification>
+	<notification name="ConfirmLandSaleChange">
+		Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME].
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmLandSaleToAnyoneChange">
+		ATENCIÓN: Marcando &apos;vender a cualquiera&apos; hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
+
+Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME].
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsDeededToGroup">
+		¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo &apos;[NAME]&apos; al inventario de su propietario anterior?
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedByUser">
+		¿Estás seguro de que quieres devolver al inventario de &apos;[NAME]&apos; todos los objetos que sean de su propiedad en esta parcela?
+
+Objetos: [N]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsOwnedBySelf">
+		¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela?
+
+Objetos: [N]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedBySelf">
+		¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios?
+Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByUser">
+		¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario?
+Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
+
+*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
+
+Objetos: [N]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ReturnAllTopObjects">
+		¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="DisableAllTopObjects">
+		¿Estás seguro de que quieres desactivar todos los objetos de esta región?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ReturnObjectsNotOwnedByGroup">
+		¿Devolver a sus propietarios los objetos de esta parcela que NO estén compartidos con el grupo [NAME]?
+
+Objetos: [N]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="UnableToDisableOutsideScripts">
+		No se pueden desactivar los scripts.
+Toda esta región tiene activado el &apos;daño&apos;.
+Para que funcionen las armas los scripts deben estar activados.
+	</notification>
+	<notification name="MultipleFacesSelected">
+		Están seleccionadas varias caras.
+Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media.
+Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir.
+		<usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="MustBeInParcel">
+		Para configurar el Punto de llegada de la parcela,
+debes estar dentro de ella.
+	</notification>
+	<notification name="PromptRecipientEmail">
+		Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es.
+	</notification>
+	<notification name="PromptSelfEmail">
+		Por favor, escribe tu dirección de correo electrónico.
+	</notification>
+	<notification name="PromptMissingSubjMsg">
+		¿Foto por correo electrónico con el asunto o el mensaje por defecto?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ErrorProcessingSnapshot">
+		Error al procesar los datos de la foto.
+	</notification>
+	<notification name="ErrorEncodingSnapshot">
+		Error al codificar la foto.
+	</notification>
+	<notification name="ErrorUploadingPostcard">
+		Hubo un problema al enviar la foto por la siguiente razón: [REASON]
+	</notification>
+	<notification name="ErrorUploadingReportScreenshot">
+		Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON]
+	</notification>
+	<notification name="MustAgreeToLogIn">
+		Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE].
+	</notification>
+	<notification name="CouldNotPutOnOutfit">
+		No se ha podido poner el vestuario.
+La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa.
+	</notification>
+	<notification name="CannotWearTrash">
+		No puedes vestirte ropas o partes del cuerpo que estén en la Papelera
+	</notification>
+	<notification name="MaxAttachmentsOnOutfit">
+		No se puede anexar el objeto.
+Se ha superado el límite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quítate alguno.
+	</notification>
+	<notification name="CannotWearInfoNotComplete">
+		No puedes vestirte este ítem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto.
+	</notification>
+	<notification name="MustHaveAccountToLogIn">
+		Lo sentimos. Se ha quedado algún espacio en blanco.
+Tienes que volver a introducir el nombre de usuario de tu avatar.
+
+Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustaría crear una ahora?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=es-ES
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
+	</notification>
+	<notification name="InvalidCredentialFormat">
+		Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
+	</notification>
+	<notification name="DeleteClassified">
+		¿Borrar el clasificado &apos;[NAME]&apos;?
+No se reembolsan las cuotas pagadas.
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="DeleteMedia">
+		Has elegido borrar los media asociados a esta cara.
+¿Estás seguro de que quieres continuar?
+		<usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="ClassifiedSave">
+		¿Guardar los cambios en el clasificado [NAME]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
+	</notification>
+	<notification name="ClassifiedInsufficientFunds">
+		Dinero insuficiente para crear un clasificado.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="DeleteAvatarPick">
+		¿Borrar el destacado &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="DeleteOutfits">
+		¿Eliminar el vestuario seleccionado?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="PromptGoToEventsPage">
+		¿Ir a la web de eventos de [SECOND_LIFE]?
+		<url name="url">
+			http://secondlife.com/events/?lang=es-ES
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="SelectProposalToView">
+		Por favor, selecciona qué propuesta quieres ver.
+	</notification>
+	<notification name="SelectHistoryItemToView">
+		Por favor, selecciona un ítem del historial para verlo.
+	</notification>
+	<notification name="CacheWillClear">
+		La caché se limpiará cuando reinices [APP_NAME].
+	</notification>
+	<notification name="CacheWillBeMoved">
+		La caché se moverá cuando reinicies [APP_NAME].
+Nota: esto vaciará la caché.
+	</notification>
+	<notification name="ChangeConnectionPort">
+		La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
+	</notification>
+	<notification name="ChangeSkin">
+		Verás la nueva apariencia cuando reinicies [APP_NAME].
+	</notification>
+	<notification name="ChangeLanguage">
+		El cambio de idioma tendrá efecto cuando reinicies [APP_NAME].
+	</notification>
+	<notification name="GoToAuctionPage">
+		¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
+o hacer una puja?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="SaveChanges">
+		¿Guardar los cambios?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
+	</notification>
+	<notification name="GestureSaveFailedTooManySteps">
+		Fallo al guardar el gesto.
+Este gesto tiene demasiados pasos.
+Intenta quitarle algunos, y vuelve a guardarlo.
+	</notification>
+	<notification name="GestureSaveFailedTryAgain">
+		Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto.
+	</notification>
+	<notification name="GestureSaveFailedObjectNotFound">
+		No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
+	</notification>
+	<notification name="GestureSaveFailedReason">
+		Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
+	</notification>
+	<notification name="SaveNotecardFailObjectNotFound">
+		No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
+	</notification>
+	<notification name="SaveNotecardFailReason">
+		Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde.
+	</notification>
+	<notification name="ScriptCannotUndo">
+		No se han podido deshacer todos los cambios en tu versión del script.
+¿Quieres cargar la última versión guardada en el servidor?
+(**Cuidado** No podrás deshacer esta operación).
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="SaveScriptFailReason">
+		Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
+	</notification>
+	<notification name="SaveScriptFailObjectNotFound">
+		No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
+	</notification>
+	<notification name="SaveBytecodeFailReason">
+		Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde..
+	</notification>
+	<notification name="StartRegionEmpty">
+		Perdón, no está definida tu Posición inicial.
+Por favor, escribe el nombre de la región en el cajetín de Posición inicial, o elige para esa posición Mi Base o Mi última posición.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CouldNotStartStopScript">
+		No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye.
+El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
+	</notification>
+	<notification name="CannotDownloadFile">
+		No se ha podido descargar el archivo.
+	</notification>
+	<notification name="CannotWriteFile">
+		No se ha podido escribir el archivo [[FILE]]
+	</notification>
+	<notification name="UnsupportedHardware">
+		Debes saber que tu ordenador no cumple los requisitos mínimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida.
+
+¿Ir a [_URL] para más información?
+		<url name="url" option="0">
+			http://secondlife.com/support/sysreqs.php?lang=es
+		</url>
+		<usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="UnknownGPU">
+		Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce.
+Suele suceder con hardware nuevo que todavía no ha sido probado con [APP_NAME].  Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas.
+(Yo &gt; Preferencias &gt; Gráficos).
+		<form name="form">
+			<ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/>
+		</form>
+	</notification>
+	<notification name="DisplaySettingsNoShaders">
+		[APP_NAME] se cae al iniciar los &apos;driver&apos; gráficos.
+La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas.
+Te recomendamos actualizar los &apos;drivers&apos; de tu tarjeta gráfica.
+La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
+	</notification>
+	<notification name="RegionNoTerraforming">
+		En la región [REGION] no se permite modificar el terreno.
+	</notification>
+	<notification name="CannotCopyWarning">
+		No tienes permiso para copiar los elementos siguientes:
+[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="CannotGiveItem">
+		No se ha podido dar el ítem del inventario.
+	</notification>
+	<notification name="TransactionCancelled">
+		Transacción cancelada.
+	</notification>
+	<notification name="TooManyItems">
+		No puedes dar más de 42 ítems en una única transferencia del inventario.
+	</notification>
+	<notification name="NoItems">
+		No tienes permiso para transferir el ítem seleccionado.
+	</notification>
+	<notification name="CannotCopyCountItems">
+		No tienes permiso para copiar [COUNT] de los
+ítems seleccionados. Si los das, los perderás de tu inventario.
+¿Realmente quieres darlos?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="CannotGiveCategory">
+		No tienes permiso para transferir
+la carpeta seleccionada.
+	</notification>
+	<notification name="FreezeAvatar">
+		¿Congelar a este avatar?
+Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
+	</notification>
+	<notification name="FreezeAvatarFullname">
+		¿Congelar a [AVATAR_NAME]?
+Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mundo.
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
+	</notification>
+	<notification name="EjectAvatarFullname">
+		¿Expulsar a [AVATAR_NAME] de tu terreno?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/>
+	</notification>
+	<notification name="EjectAvatarNoBan">
+		¿Expulsar a este avatar de tu terreno?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
+	</notification>
+	<notification name="EjectAvatarFullnameNoBan">
+		¿Expulsar a [AVATAR_NAME] de tu terreno?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
+	</notification>
+	<notification name="EjectAvatarFromGroup">
+		Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME]
+	</notification>
+	<notification name="AcquireErrorTooManyObjects">
+		ERROR &apos;ACQUIRE&apos;: Hay demasiados objetos seleccionados.
+	</notification>
+	<notification name="AcquireErrorObjectSpan">
+		ERROR &apos;ACQUIRE&apos;: Los objetos están en más de una región.
+Por favor, mueve todos los objetos a adquirir a la
+misma región.
+	</notification>
+	<notification name="PromptGoToCurrencyPage">
+		[EXTRA]
+
+¿Ir a [_URL] para informarte sobre la compra de L$?
+		<url name="url">
+			http://secondlife.com/app/currency/?lang=es-ES
+		</url>
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="UnableToLinkObjects">
+		No se pudo enlazar estos [COUNT] objetos.
+Puedes enlazar [MAX] objetos como máximo.
+	</notification>
+	<notification name="CannotLinkIncompleteSet">
+		Sólo puedes enlazar objetos completos (no sus partes), y debes
+seleccionar más de uno.
+	</notification>
+	<notification name="CannotLinkModify">
+		Imposible enlazarlos, porque no tienes permiso para modificar
+todos los objetos.
+
+Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos.
+	</notification>
+	<notification name="CannotLinkDifferentOwners">
+		Imposible enlazarlos, porque hay objetos de distintos propietarios.
+
+Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados.
+	</notification>
+	<notification name="NoFileExtension">
+		No hay extensión de archivo en: &apos;[FILE]&apos;
+
+Por favor, asegúrate de que la extensión del archivo es correcta.
+	</notification>
+	<notification name="InvalidFileExtension">
+		Extensión inválida de archivo: [EXTENSION]
+Podría ser [VALIDS]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotUploadSoundFile">
+		No se pudo abrir el archivo de sonido que has subido para leer:
+[FILE]
+	</notification>
+	<notification name="SoundFileNotRIFF">
+		No parece que el archivo sea un archivo RIFF WAVE:
+[FILE]
+	</notification>
+	<notification name="SoundFileNotPCM">
+		No parece que el archivo sea un archivo de audio PCM WAVE:
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidChannelCount">
+		El archivo no tiene un número de canales válido (debe ser mono o estéreo):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidSampleRate">
+		No parece que el archivo tenga una frecuencia de muestreo (sample rate) adecuada (debe de ser 44.1k):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidWordSize">
+		No parece que el archivo tenga un tamaño de palabra (word size) adecuado (debe de ser de 8 o 16 bites):
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidHeader">
+		No se encontró el fragmento &apos;data&apos; en la cabecera del WAV:
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidChunkSize">
+		Tamaño de lote erróneo en el archivo WAV:
+[FILE]
+	</notification>
+	<notification name="SoundFileInvalidTooLong">
+		El archivo de audio es demasiado largo (10 segundos como máximo):
+[FILE]
+	</notification>
+	<notification name="ProblemWithFile">
+		Problemas con el archivo [FILE]:
+
+[ERROR]
+	</notification>
+	<notification name="CannotOpenTemporarySoundFile">
+		No se ha podido abrir para su escritura el archivo comprimido de sonido: [FILE]
+	</notification>
+	<notification name="UnknownVorbisEncodeFailure">
+		Códec Vorbis desconocido, fallo en : [FILE]
+	</notification>
+	<notification name="CannotEncodeFile">
+		No se puede codificar el archivo: [FILE]
+	</notification>
+	<notification name="CorruptedProtectedDataStore">
+		No se pueden rellenar el nombre de usuario y la contraseña.  Esto puede deberse a un cambio de configuración de la red.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CorruptResourceFile">
+		Archivo con los recursos corruptos: [FILE]
+	</notification>
+	<notification name="UnknownResourceFileVersion">
+		Versión de archivo desconocida para el recurso Linden en el archivo: [FILE]
+	</notification>
+	<notification name="UnableToCreateOutputFile">
+		No se ha podido crear el archivo de salida: [FILE]
+	</notification>
+	<notification name="DoNotSupportBulkAnimationUpload">
+		Actualmente, [APP_NAME] no admite la subida masiva de animaciones.
+	</notification>
+	<notification name="CannotUploadReason">
+		No se ha podido subir [FILE] por la siguiente razón: [REASON]
+Por favor, inténtalo más tarde.
+	</notification>
+	<notification name="LandmarkCreated">
+		Se ha añadido &quot;[LANDMARK_NAME]&quot; a tu carpeta [FOLDER_NAME].
+	</notification>
+	<notification name="LandmarkAlreadyExists">
+		Ya tienes un hito de esta localización.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotCreateLandmarkNotOwner">
+		No puedes crear un hito aquí porque el propietario del terreno no lo permite.
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoScripts">
+		No se pudo &apos;recompilar&apos;.
+Selecciona un objeto con script.
+	</notification>
+	<notification name="CannotRecompileSelectObjectsNoPermission">
+		No se pudo &apos;recompilar&apos;.
+
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
+	</notification>
+	<notification name="CannotResetSelectObjectsNoScripts">
+		No se pudo &apos;reiniciar&apos;.
+
+Selecciona objetos con scripts.
+	</notification>
+	<notification name="CannotResetSelectObjectsNoPermission">
+		No se pudo &apos;reiniciar&apos;.
+
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
+	</notification>
+	<notification name="CannotOpenScriptObjectNoMod">
+		Imposible abrir el script del objeto sin modificar los permisos.
+	</notification>
+	<notification name="CannotSetRunningSelectObjectsNoScripts">
+		No se puede configurar ningún script como &apos;ejecutándose&apos;.
+
+Selecciona objetos con scripts.
+	</notification>
+	<notification name="CannotSetRunningNotSelectObjectsNoScripts">
+		No se puede configurar ningún script como &apos;no ejecutándose&apos;.
+
+Selecciona objetos con scripts.
+	</notification>
+	<notification name="NoFrontmostFloater">
+		No hay nada que guardar.
+	</notification>
+	<notification name="SeachFilteredOnShortWords">
+		Se ha modificado tu búsqueda,
+eliminando las palabras demasiado cortas.
+
+Buscando: [FINALQUERY]
+	</notification>
+	<notification name="SeachFilteredOnShortWordsEmpty">
+		Los términos de tu búsqueda son muy cortos,
+por lo que no se ha hecho la búsqueda.
+	</notification>
+	<notification name="CouldNotTeleportReason">
+		Fallo en el teleporte.
+[REASON]
+	</notification>
+	<notification name="invalid_tport">
+		Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+	</notification>
+	<notification name="invalid_region_handoff">
+		Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+	</notification>
+	<notification name="blocked_tport">
+		Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
+	</notification>
+	<notification name="nolandmark_tport">
+		Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
+	</notification>
+	<notification name="timeout_tport">
+		Lo sentimos, pero el sistema no ha podido completar el teleporte.
+Vuelve a intentarlo en un momento.
+	</notification>
+	<notification name="noaccess_tport">
+		Lo sentimos, pero no tienes acceso al destino de este teleporte.
+	</notification>
+	<notification name="missing_attach_tport">
+		Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
+	</notification>
+	<notification name="too_many_uploads_tport">
+		La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
+	</notification>
+	<notification name="expired_tport">
+		Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+	</notification>
+	<notification name="expired_region_handoff">
+		Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+	</notification>
+	<notification name="no_host">
+		Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos.
+	</notification>
+	<notification name="no_inventory_host">
+		En estos momentos no está disponible el sistema del inventario.
+	</notification>
+	<notification name="CannotSetLandOwnerNothingSelected">
+		No se ha podido configurar el propietario del terreno:
+no se ha seleccionado una parcela.
+	</notification>
+	<notification name="CannotSetLandOwnerMultipleRegions">
+		No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo.
+	</notification>
+	<notification name="ForceOwnerAuctionWarning">
+		Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado.
+¿Forzar la propiedad?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="CannotContentifyNothingSelected">
+		No se ha podido &apos;contentify&apos;:
+no se ha seleccionado una parcela.
+	</notification>
+	<notification name="CannotContentifyNoRegion">
+		No se ha podido &apos;contentify&apos;:
+no se ha seleccionado una región.
+	</notification>
+	<notification name="CannotReleaseLandNothingSelected">
+		No se ha podido abandonar el terreno:
+no se ha seleccionado una parcela.
+	</notification>
+	<notification name="CannotReleaseLandNoRegion">
+		No se ha podido abandonar el terreno:
+no se ha podido encontrar la región.
+	</notification>
+	<notification name="CannotBuyLandNothingSelected">
+		Imposible comprar terreno:
+no se ha seleccionado una parcela.
+	</notification>
+	<notification name="CannotBuyLandNoRegion">
+		Imposible comprar terreno:
+no se ha podido encontrar en qué región está.
+	</notification>
+	<notification name="CannotCloseFloaterBuyLand">
+		No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
+	</notification>
+	<notification name="CannotDeedLandNothingSelected">
+		No se ha podido transferir el terreno:
+no se ha seleccionado una parcela.
+	</notification>
+	<notification name="CannotDeedLandNoGroup">
+		No se ha podido transferir el terreno:
+no has seleccionado un grupo.
+	</notification>
+	<notification name="CannotDeedLandNoRegion">
+		No se ha podido transferir el terreno:
+Ha sido imposible encontrar en qué región está.
+	</notification>
+	<notification name="CannotDeedLandMultipleSelected">
+		No se ha podido transferir el terreno:
+has seleccionado varias parcelas.
+
+Inténtalo seleccionando sólo una.
+	</notification>
+	<notification name="CannotDeedLandWaitingForServer">
+		No se ha podido transferir el terreno:
+esperando que el servidor informe acerca de la propiedad.
+
+Por favor, vuelve a intentarlo.
+	</notification>
+	<notification name="CannotDeedLandNoTransfer">
+		No se ha podido transferir el terreno:
+En la región [REGION] no se permite transferir terrenos.
+	</notification>
+	<notification name="CannotReleaseLandWatingForServer">
+		No se ha podido abandonar el terreno:
+esperando que el servidor actualice la información de la parcela.
+
+Vuelve a intentarlo en unos segundos.
+	</notification>
+	<notification name="CannotReleaseLandSelected">
+		No se ha podido abandonar el terreno:
+no eres propietario de todas las parcelas seleccionadas.
+
+Por favor, selecciona una sola parcela.
+	</notification>
+	<notification name="CannotReleaseLandDontOwn">
+		No se ha podido abandonar el terreno:
+no tienes permisos sobre esta parcela.
+Las parcelas de tu propiedad se muestran en verde.
+	</notification>
+	<notification name="CannotReleaseLandRegionNotFound">
+		No se ha podido abandonar el terreno:
+Ha sido imposible encontrar en qué región está.
+	</notification>
+	<notification name="CannotReleaseLandNoTransfer">
+		No se ha podido abandonar el terreno:
+En la región [REGION] no se permite transferir terrenos.
+	</notification>
+	<notification name="CannotReleaseLandPartialSelection">
+		No se ha podido abandonar el terreno:
+debes seleccionar toda la parcela.
+
+Selecciona una parcela completa, o divídela primero.
+	</notification>
+	<notification name="ReleaseLandWarning">
+		Vas a abandonar [AREA] m² de terreno.
+Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$.
+
+¿Abandonar este terreno?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNothingSelected">
+		No se ha podido dividir el terreno:
+
+No has seleccionado ninguna parcela.
+	</notification>
+	<notification name="CannotDivideLandPartialSelection">
+		No se ha podido dividir el terreno:
+
+Has seleccionado una parcela entera.
+Inténtalo seleccionando una parte.
+	</notification>
+	<notification name="LandDivideWarning">
+		Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto.
+
+¿Dividir el terreno?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="CannotDivideLandNoRegion">
+		No se ha podido dividir el terreno:
+Ha sido imposible encontrar en qué región está.
+	</notification>
+	<notification name="CannotJoinLandNoRegion">
+		No se ha podido unir el terreno:
+Ha sido imposible encontrar en qué región está.
+	</notification>
+	<notification name="CannotJoinLandNothingSelected">
+		No se ha podido unir el terreno:
+No hay parcelas seleccionadas.
+	</notification>
+	<notification name="CannotJoinLandEntireParcelSelected">
+		No se ha podido unir el terreno:
+Sólo has seleccionado una parcela.
+
+Selecciona terreno que incluya algo de ambas parcelas.
+	</notification>
+	<notification name="CannotJoinLandSelection">
+		No se ha podido unir el terreno:
+Debes seleccionar más de una parcela.
+
+Selecciona terreno que incluya algo de ambas parcelas.
+	</notification>
+	<notification name="JoinLandWarning">
+		Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado.
+Deberás reconfigurar el nombre y las opciones de la nueva parcela.
+
+¿Unir el terreno?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmNotecardSave">
+		Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmItemCopy">
+		¿Copiar este ítem a tu inventario?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/>
+	</notification>
+	<notification name="ResolutionSwitchFail">
+		Fallo al cambiar la resolución a [RESX] por [RESY]
+	</notification>
+	<notification name="ErrorUndefinedGrasses">
+		Error, hierbas no definidas: [SPECIES]
+	</notification>
+	<notification name="ErrorUndefinedTrees">
+		Error, árboles no definidos: [SPECIES]
+	</notification>
+	<notification name="CannotSaveWearableOutOfSpace">
+		No se ha podido guardar el archivo &apos;[NAME]&apos;. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo.
+	</notification>
+	<notification name="CannotSaveToAssetStore">
+		No se ha podido guardar [NAME] en la base central de almacenamiento.
+Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el ítem de aquí a unos minutos.
+	</notification>
+	<notification name="YouHaveBeenLoggedOut">
+		Vaya, se ha cerrado tu sesión en [SECOND_LIFE].
+            [MESSAGE]
+		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/>
+	</notification>
+	<notification name="OnlyOfficerCanBuyLand">
+		No se ha podido comprar terreno para el grupo:
+no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente.
+	</notification>
+	<notification label="Añadir como amigo" name="AddFriendWithMessage">
+		Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado.
+
+¿Ofrecer a [NAME] que sea tu amigo?
+		<form name="form">
+			<input name="message">
+				¿Quieres formar parte de mis amigos?
+			</input>
+			<button name="Offer" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification label="Guardar el vestuario" name="SaveOutfitAs">
+		Guardar como un nuevo vestuario lo que estoy llevando:
+		<form name="form">
+			<input name="message">
+				[DESC] (nuevo)
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification label="Guardar artículo" name="SaveWearableAs">
+		Guardar el ítem en mi inventario como:
+		<form name="form">
+			<input name="message">
+				[DESC] (nuevo)
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification label="Renombrar el vestuario" name="RenameOutfit">
+		Nombre del nuevo vestuario:
+		<form name="form">
+			<input name="new_name">
+				[NAME]
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="RemoveFromFriends">
+		¿Quieres eliminar a [NAME] de tu lista de amigos?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="RemoveMultipleFromFriends">
+		¿Quieres quitar a varios amigos de tu lista de amigos?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedPublicObjectsByUser">
+		¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de
+** [AVATAR_NAME] **
+en todos los otros terrenos de este sim?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllScriptedObjectsByUser">
+		¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de
+** [AVATAR_NAME] **
+en TODO EL TERRENO de este sim?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="GodDeleteAllObjectsByUser">
+		¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de
+** [AVATAR_NAME] **
+en TODO EL TERRENO de este sim?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BlankClassifiedName">
+		Debes especificar un nombre para tu clasificado.
+	</notification>
+	<notification name="MinClassifiedPrice">
+		El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$.
+
+Por favor, elige un pago mayor.
+	</notification>
+	<notification name="ConfirmItemDeleteHasLinks">
+		Por lo menos uno  de los elementos seleccionados contiene vínculos que le señalan. Si eliminas este elemento, los vínculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vínculos.
+
+¿Estás seguro de que quieres eliminar los elementos?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLock">
+		Al menos uno de los ítems que has seleccionado está bloqueado.
+
+¿Estás seguro de que quieres borrar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopy">
+		Al menos uno de los ítems que has seleccionado no es copiable.
+
+¿Estás seguro de que quieres borrar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoOwn">
+		No eres el propietario de, al menos, uno de los ítems que has seleccionado.
+
+¿Estás seguro de que quieres borrar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopy">
+		Al menos un objeto está bloqueado.
+Al menos un objeto no es copiable.
+
+¿Estás seguro de que quieres borrar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoOwn">
+		Al menos un objeto está bloqueado.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteNoCopyNoOwn">
+		Al menos un objeto no es copiable.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+		Al menos un objeto está bloqueado.
+Al menos un objeto no es copiable.
+No eres propietario de, al menos, un objeto.
+
+¿Estás seguro de que quieres borrar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLock">
+		Al menos un objeto está bloqueado.
+
+¿Estás seguro de que quieres tomar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeNoOwn">
+		No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
+
+¿Estás seguro de que quieres tomar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmObjectTakeLockNoOwn">
+		Al menos un objeto está bloqueado.
+No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
+Con todo, puedes tomar lo actualmente seleccionado.
+
+¿Estás seguro de que quieres tomar estos ítems?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="CantBuyLandAcrossMultipleRegions">
+		No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones.
+
+Por favor, selecciona un área más pequeña y vuelve a intentarlo.
+	</notification>
+	<notification name="DeedLandToGroup">
+		Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno.
+El precio de compra de la parcela no se reembolsa al propietario.
+Si se vende una parcela transferida, el precio de venta se dividirá a partes iguales entre los miembros del grupo.
+
+¿Transferir estos [AREA] m² de terreno al grupo
+&apos;[GROUP_NAME]&apos;?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="DeedLandToGroupWithContribution">
+		Al transferir esta parcela, el grupo deberá poseer y mantener el número suficiente de créditos de uso de terreno.
+El traspaso incluirá una contribución simultánea de terreno al grupo de &quot;[NAME]&quot;.
+El precio de compra del terreno no se le devolverá al propietario. Si se vende una parcela transferida, el precio de venta se dividirá en partes iguales entre los miembros del grupo.
+
+¿Transferir este terreno de [AREA] m² al grupo &apos;[GROUP_NAME]&apos;?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="DisplaySetToSafe">
+		Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
+	</notification>
+	<notification name="DisplaySetToRecommended">
+		Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
+	</notification>
+	<notification name="ErrorMessage">
+		[ERROR_MESSAGE]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AvatarMovedDesired">
+		La localización que querías no está disponible en estos momentos.
+Se te ha llevado a una región cercana.
+	</notification>
+	<notification name="AvatarMovedLast">
+		En estos momentos no está disponible tu última posición.
+Se te ha llevado a una región cercana.
+	</notification>
+	<notification name="AvatarMovedHome">
+		En estos momentos no está disponible tu Base.
+Se te ha llevado a una región cercana.
+Quizá quieras configurar una nueva posición para tu Base.
+	</notification>
+	<notification name="ClothingLoading">
+		Aún está descargándose tu ropa.
+Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente.
+		<form name="form">
+			<ignore name="ignore" text="La ropa está tardando mucho en descargarse"/>
+		</form>
+	</notification>
+	<notification name="FirstRun">
+		Se ha completado la instalación de [SECOND_LIFE].
+
+Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
+¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
+		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
+	</notification>
+	<notification name="LoginPacketNeverReceived">
+		Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
+
+Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base.
+		<url name="url">
+			http://es.secondlife.com/support/
+		</url>
+		<form name="form">
+			<button name="OK" text="OK"/>
+			<button name="Help" text="Ayuda"/>
+			<button name="Teleport" text="Teleportar"/>
+		</form>
+	</notification>
+	<notification name="WelcomeChooseSex">
+		Tu personaje aparecerá en un momento.
+
+Para caminar, usa las teclas del cursor.
+En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE].
+Por favor, elige el avatar masculino o femenino.
+Puedes cambiar más adelante tu elección.
+		<usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/>
+	</notification>
+	<notification name="CantTeleportToGrid">
+		No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrícula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="GeneralCertificateError">
+		No se puede establecer la conexión con el servidor.
+[REASON]
+
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="TrustCertificateError">
+		La autoridad de certificación de este servidor se desconoce.
+
+Información del certificado:
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+
+¿Deseas confiar en esta autoridad?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/>
+	</notification>
+	<notification name="NotEnoughCurrency">
+		[NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso.
+	</notification>
+	<notification name="GrantedModifyRights">
+		[NAME] te ha dado permiso para modificar sus objetos.
+	</notification>
+	<notification name="RevokedModifyRights">
+		Ha sido revocado tu privilegio de modificar los objetos de [NAME]
+	</notification>
+	<notification name="FlushMapVisibilityCaches">
+		Esto limpiará las cachés del mapa en esta región.
+Esto sólo es realmente útil para cuestiones de depuración (&apos;debugging&apos;).
+(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión).
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BuyOneObjectOnly">
+		No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+	</notification>
+	<notification name="OnlyCopyContentsOfSingleItem">
+		No se puede copiar a la vez los contenidos de más de un objeto.
+Por favor, selecciona sólo uno y vuelve a intentarlo.
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="KickUsersFromRegion">
+		¿Teleportar a tu base a todos los residentes en esta región?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="EstateObjectReturn">
+		¿Estás seguro de que quieres devolver los objetos propiedad de
+[USER_NAME] ?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="InvalidTerrainBitDepth">
+		No se han podido configurar las texturas de la región:
+La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH].
+
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
+	</notification>
+	<notification name="InvalidTerrainSize">
+		No se han podido configurar las texturas de la región:
+La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
+	</notification>
+	<notification name="RawUploadStarted">
+		Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos.
+	</notification>
+	<notification name="ConfirmBakeTerrain">
+		¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta &apos;Revertir&apos;?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="MaxAllowedAgentOnRegion">
+		Sólo puedes tener [MAX_AGENTS] residentes autorizados.
+	</notification>
+	<notification name="MaxBannedAgentsOnRegion">
+		Sólo puedes tener [MAX_BANNED] residentes no admitidos.
+	</notification>
+	<notification name="MaxAgentOnRegionBatch">
+		Fallo al intentar añadir [NUM_ADDED] agentes:
+Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE].
+	</notification>
+	<notification name="MaxAllowedGroupsOnRegion">
+		Sólo puedes tener [MAX_GROUPS] grupos permitidos.
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/>
+	</notification>
+	<notification name="MaxManagersOnRegion">
+		Sólo puedes tener [MAX_MANAGER] administradores del estado.
+	</notification>
+	<notification name="OwnerCanNotBeDenied">
+		No se puede añadir a la lista de residentes no admitidos al propietario del estado.
+	</notification>
+	<notification name="CanNotChangeAppearanceUntilLoaded">
+		No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma.
+	</notification>
+	<notification name="ClassifiedMustBeAlphanumeric">
+		El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación.
+	</notification>
+	<notification name="CantSetBuyObject">
+		No puede configurar el Comprar el objeto, porque éste no está en venta.
+Por favor, pon en venta el objeto y vuelve a intentarlo.
+	</notification>
+	<notification name="FinishedRawDownload">
+		Acabada la descarga del archivo raw de terreno en:
+[DOWNLOAD_PATH].
+	</notification>
+	<notification name="DownloadWindowsMandatory">
+		Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
+	</notification>
+	<notification name="DownloadWindows">
+		Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+	</notification>
+	<notification name="DownloadWindowsReleaseForDownload">
+		Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+	</notification>
+	<notification name="DownloadLinuxMandatory">
+		Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/>
+	</notification>
+	<notification name="DownloadLinux">
+		Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+	</notification>
+	<notification name="DownloadLinuxReleaseForDownload">
+		Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+	</notification>
+	<notification name="DownloadMacMandatory">
+		Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+
+¿Descargarla a tu carpeta de Programas?
+		<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
+	</notification>
+	<notification name="DownloadMac">
+		Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+
+¿Descargarla a tu carpeta de Programas?
+		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+	</notification>
+	<notification name="DownloadMacReleaseForDownload">
+		Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+
+¿Descargarla a tu carpeta de Programas?
+		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
+	</notification>
+	<notification name="FailedUpdateInstall">
+		Se ha producido un error al instalar la actualización del visor.
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="FailedRequiredUpdateInstall">
+		No hemos podido instalar una actualización necesaria. 
+No podrás iniciar sesión hasta que [APP_NAME] se haya actualizado.
+
+Descarga e instala el último visor a través de
+http://secondlife.com/download.
+		<usetemplate name="okbutton" yestext="Salir"/>
+	</notification>
+	<notification name="UpdaterServiceNotRunning">
+		Hay una actualización necesaria para la instalación de Second Life.
+
+Puedes descargar esta actualización de http://www.secondlife.com/downloads
+o instalarla ahora.
+		<usetemplate name="okcancelbuttons" notext="Salir de Second Life" yestext="Descargar e instalar ahora"/>
+	</notification>
+	<notification name="DownloadBackgroundTip">
+		Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+		<usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [NOMBRE_APL]"/>
+	</notification>
+	<notification name="DownloadBackgroundDialog">
+		Hemos descargado una actualización para la instalación de [APP_NAME].
+Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actualización]
+		<usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/>
+	</notification>
+	<notification name="RequiredUpdateDownloadedVerboseDialog">
+		Hemos descargado una actualización de software necesaria.
+Versión [VERSION]
+
+Debemos reiniciar [APP_NAME] para instalar la actualización.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RequiredUpdateDownloadedDialog">
+		Debemos reiniciar [APP_NAME] para instalar la actualización.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="DeedObjectToGroup">
+		Transferir este objeto al grupo hará que:
+* Reciba los L$ pagados en el objeto
+		<usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
+	</notification>
+	<notification name="WebLaunchExternalTarget">
+		¿Quieres abrir tu navegador para ver este contenido?
+		<usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchJoinNow">
+		¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
+		<usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchSecurityIssues">
+		Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
+		<usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchQAWiki">
+		Visita el wiki QA de [SECOND_LIFE].
+		<usetemplate ignoretext="Abrir mi navegador para el ver el wiki de &apos;QA&apos; (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchPublicIssue">
+		Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos.
+		<usetemplate ignoretext="Abrir mi navegador para usar el &apos;Public Issue Tracker&apos;" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+	</notification>
+	<notification name="WebLaunchSupportWiki">
+		Para ver las últimas noticias e informaciones, ¿ir la Blog oficial?
+		<usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchLSLGuide">
+		¿Quieres abrir la Guía de Script para tener ayuda sobre el tema?
+		<usetemplate ignoretext="Abrir mi navegador para ver la Guía de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="WebLaunchLSLWiki">
+		¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts?
+		<usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+	</notification>
+	<notification name="ReturnToOwner">
+		¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
+
+*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos!
+		<usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="GroupLeaveConfirmMember">
+		Actualmente, eres miembro del grupo [GROUP].
+¿Dejar el grupo?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmKick">
+		¿Quieres realmente expulsar a todos los residentes de la cuadrícula?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/>
+	</notification>
+	<notification name="MuteLinden">
+		Lo sentimos, pero no puedes ignorar a un Linden.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CannotStartAuctionAlreadyForSale">
+		No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta.
+	</notification>
+	<notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
+		Ya has ignorado este nombre.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RemoveItemWarn">
+		Aunque esté permitido, borrar contenidos puede dañar el objeto.
+¿Quieres borrar ese ítem?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferCallingCard">
+		En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="CantOfferFriendship">
+		En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="BusyModeSet">
+		Pasar al modo ocupado.
+Se ocultará el chat y los mensajes instantáneos   (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera.
+		<usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/>
+	</notification>
+	<notification name="JoinedTooManyGroupsMember">
+		Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta.
+[NAME] te ha invitado a ser miembro de un grupo.
+		<usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
+	</notification>
+	<notification name="JoinedTooManyGroups">
+		Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="KickUser">
+		¿Con qué mensaje quieres expulsar a este Residente?
+		<form name="form">
+			<input name="message">
+				Un administrador te ha desconectado.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="KickAllUsers">
+		¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid?
+		<form name="form">
+			<input name="message">
+				Un administrador te ha desconectado.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="FreezeUser">
+		¿Con qué mensaje quieres congelar a este residente?
+		<form name="form">
+			<input name="message">
+				Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI).
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="UnFreezeUser">
+		¿Con qué mensaje quieres congelar a este residente?
+		<form name="form">
+			<input name="message">
+				Ya no estás congelado.
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="SetDisplayNameSuccess">
+		¡Hola, [DISPLAY_NAME]!
+
+Al igual que en la vida real, normalmente se tarda algún tiempo en aprender nombres nuevos.  Te recomendamos que esperes varios días antes de [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] en objetos, scripts, búsquedas, etc.
+	</notification>
+	<notification name="SetDisplayNameBlocked">
+		Lo sentimos. No puedes cambiar tu nombre mostrado. Si crees que se trata de un error, ponte en contacto con soporte.
+	</notification>
+	<notification name="SetDisplayNameFailedLength">
+		Lo sentimos. El nombre es demasiado largo.  Los nombres mostrados pueden tener un máximo de [LENGTH] caracteres.
+
+Prueba con un nombre más corto.
+	</notification>
+	<notification name="SetDisplayNameFailedGeneric">
+		Lo sentimos. No hemos podido configurar tu nombre mostrado.  Vuelve a intentarlo más tarde.
+	</notification>
+	<notification name="SetDisplayNameMismatch">
+		Los nombres mostrados introducidos no coinciden. Vuelve a introducirlos.
+	</notification>
+	<notification name="AgentDisplayNameUpdateThresholdExceeded">
+		Lo sentimos. Tendrás que esperar para poder cambiar tu nombre mostrado.
+
+Consulta http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Vuelve a intentarlo más tarde.
+	</notification>
+	<notification name="AgentDisplayNameSetBlocked">
+		Lo sentimos. No he mos podido configurar el nombre que has solicitado porque contiene una palabra prohibida.
+ 
+ Prueba con un nombre distinto.
+	</notification>
+	<notification name="AgentDisplayNameSetInvalidUnicode">
+		El nombre mostrado que deseas configurar contiene caracteres no válidos.
+	</notification>
+	<notification name="AgentDisplayNameSetOnlyPunctuation">
+		Tu nombre mostrado debe contener letras y no debe incluir signos de puntuación.
+	</notification>
+	<notification name="DisplayNameUpdate">
+		A [OLD_NAME] ([SLID]) se le conoce ahora como [NEW_NAME].
+	</notification>
+	<notification name="OfferTeleport">
+		¿Ofrecer teleporte a tu posición con este mensaje?
+		<form name="form">
+			<input name="message">
+				Ven conmigo a [REGION]
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="OfferTeleportFromGod">
+		¿Obligar a este Residente a ir a tu localización?
+		<form name="form">
+			<input name="message">
+				Ven conmigo a [REGION]
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="TeleportFromLandmark">
+		¿Seguro que quieres teleportarte a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+		<usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+	</notification>
+	<notification name="TeleportToPick">
+		¿Teleportarte a [PICK]?
+		<usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+	</notification>
+	<notification name="TeleportToClassified">
+		¿Teleportarte a [CLASSIFIED]?
+		<usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+	</notification>
+	<notification name="TeleportToHistoryEntry">
+		¿Teleportarse a [HISTORY_ENTRY]?
+		<usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+	</notification>
+	<notification label="Mensaje a todo el estado" name="MessageEstate">
+		Escribe un anuncio breve que se enviará a todo el que esté en tu estado.
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification label="Cambiar un estado Linden" name="ChangeLindenEstate">
+		Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.).
+
+Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes.  En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor. 
+
+¿Continuar?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess">
+		Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
+
+Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$.
+Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateAllowedAgentAdd">
+		¿Añadir a la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateAllowedAgentRemove">
+		¿Quitar de la lista de permitidos sólo para este estado o para [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateAllowedGroupAdd">
+		¿Añadir a la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateAllowedGroupRemove">
+		¿Quitar de la lista de grupos permitidos sólo para este estado o para [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateBannedAgentAdd">
+		¿Denegar el acceso sólo a este estado o a [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateBannedAgentRemove">
+		¿Quitar de la lista de prohibición de acceso a este residente para que acceda sólo a este estado o a [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateManagerAdd">
+		¿Añadir al administrador del estado sólo para este estado o para [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Seleccionar el estado" name="EstateManagerRemove">
+		¿Remover al administrador del estado sólo para este estado o para [ALL_ESTATES]?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/>
+	</notification>
+	<notification label="Confirmar la expulsión" name="EstateKickUser">
+		¿Echar a [EVIL_USER] de este estado?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="EstateChangeCovenant">
+		¿Estás seguro de que quieres cambiar el contrato del estado?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked">
+		No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_KB">
+		No estás autorizado en esa región por su nivel de calificación. 
+
+¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+		</url>
+		<usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Notify">
+		No estás autorizado en esa región por su nivel de calificación.
+	</notification>
+	<notification name="RegionEntryAccessBlocked_Change">
+		No estás autorizado en esta región por tus preferencias sobre el nivel de calificación.
+
+Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo &gt; Preferencias &gt; General.
+		<form name="form">
+			<button name="OK" text="Cambiar las preferencias"/>
+			<button default="true" name="Cancel" text="Cerrar"/>
+			<ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/>
+		</form>
+	</notification>
+	<notification name="PreferredMaturityChanged">
+		Tu preferencia de nivel de calificación actual es [RATING].
+	</notification>
+	<notification name="LandClaimAccessBlocked">
+		No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_KB">
+		No puedes reclamar este terreno por su nivel de calificación. 
+
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+		</url>
+		<usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+	</notification>
+	<notification name="LandClaimAccessBlocked_Notify">
+		No puedes reclamar este terreno debido a su nivel de calificación.
+	</notification>
+	<notification name="LandClaimAccessBlocked_Change">
+		No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
+
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+		<usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked">
+		No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
+
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_KB">
+		No puedes comprar este terreno por tus preferencias de nivel de calificación. 
+
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+		<url name="url">
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
+		</url>
+		<usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
+	</notification>
+	<notification name="LandBuyAccessBlocked_Notify">
+		No puedes comprar este terreno por su nivel de calificación.
+	</notification>
+	<notification name="LandBuyAccessBlocked_Change">
+		No puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
+
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+		<usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
+	</notification>
+	<notification name="TooManyPrimsSelected">
+		Hay demasiados prims seleccionados.  Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemImportingEstateCovenant">
+		Hay problemas al importar el contrato del estado.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ProblemAddingEstateManager">
+		Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores.
+	</notification>
+	<notification name="ProblemAddingEstateGeneric">
+		Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista.
+	</notification>
+	<notification name="UnableToLoadNotecardAsset">
+		En este momento, no se pueden cargar los datos de la&apos;s nota&apos;s.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="NotAllowedToViewNotecard">
+		Permisos insuficientes para ver la nota asociada a la ID solicitada.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MissingNotecardAssetID">
+		Se ha perdido en la base de datos la ID de la nota.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="PublishClassified">
+		Recuerda: las cuotas que se pagan por los clasificados no son reembolsables.
+
+¿Publicar ahora este anuncio por [AMOUNT] L$?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="SetClassifiedMature">
+		¿Este anuncio tiene contenido moderado?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="SetGroupMature">
+		¿Este grupo tiene contenido moderado?
+		<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification label="Confirmar el reinicio" name="ConfirmRestart">
+		¿Verdaderamente quieres reiniciar la región de aquí a 2 minutos?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification label="Mensaje a toda la región" name="MessageRegion">
+		Escribe un anuncio breve que se enviará a todo el que esté en esta región.
+		<form name="form">
+			<input name="message"/>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification label="Cambiada la calificación de la región" name="RegionMaturityChange">
+		Se ha actualizado el nivel de calificación de esta región.
+Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa.
+
+Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago.
+	</notification>
+	<notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch">
+		Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME].
+	</notification>
+	<notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner">
+		No se pueden comprar a la vez objetos de propietarios diferentes.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+	</notification>
+	<notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly">
+		No se puede comprar a la vez los contenidos de más de un objeto.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+	</notification>
+	<notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner">
+		No se pueden comprar a la vez objetos de propietarios diferentes.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
+	</notification>
+	<notification name="BuyOriginal">
+		¿Comprar el objeto original de [OWNER] por [PRICE] L$?
+Pasarás a ser el propietario de este objeto.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BuyOriginalNoOwner">
+		¿Comprar el objeto original por [PRICE] L$?
+Pasarás a ser el propietario de este objeto.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopy">
+		¿Comprar una copia de [OWNER] por [PRICE] L$?
+El objeto se copiará a tu inventario.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BuyCopyNoOwner">
+		¿Comprar una copia por [PRICE] L$?
+El objeto se copiará a tu inventario.
+Podrás:
+ Modificarlo: [MODIFYPERM]
+ Copiarlo: [COPYPERM]
+ Revenderlo o darlo: [RESELLPERM]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BuyContents">
+		¿Comprar los contenidos de [OWNER] por [PRICE] L$?
+Serán copiados a tu inventario.
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BuyContentsNoOwner">
+		¿Comprar los contenidos por [PRICE] L$?
+Serán copiados a tu inventario.
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchase">
+		Esta transacción consiste en:
+[ACTION]
+
+¿Estás seguro de querer hacer esta compra?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmPurchasePassword">
+		Esta transacción consiste en:
+[ACTION]
+
+¿Estás seguro de querer hacer esta compra?
+Por favor, vuelva a escribir tu contraseña y pulsa OK.
+		<form name="form">
+			<input name="message"/>
+			<button name="ConfirmPurchase" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="SetPickLocation">
+		Nota:
+Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromObject">
+		Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se quitarán de tu inventario, no se copiarán.
+
+¿Mover el/los ítem/s del inventario?
+		<usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="MoveInventoryFromScriptedObject">
+		Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se moverán a tu inventario, no se copiarán.
+Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script.
+
+¿Mover el/los ítem/s del inventario?
+		<usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ClickActionNotPayable">
+		Advertencia: la acción &apos;Pagar al objeto&apos; ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
+		<form name="form">
+			<ignore name="ignore" text="He establecido la acción &apos;Pagar al objeto&apos; cuando construyo uno sin un script money()"/>
+		</form>
+	</notification>
+	<notification name="OpenObjectCannotCopy">
+		En este objeto, no hay ítems que estés autorizado a copiar.
+	</notification>
+	<notification name="WebLaunchAccountHistory">
+		¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
+		<usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+	</notification>
+	<notification name="ConfirmQuit">
+		¿Estás seguro de que quieres salir?
+		<usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification name="DeleteItems">
+		[QUESTION]
+		<usetemplate ignoretext="Confirmar antes de eliminar elementos" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="HelpReportAbuseEmailLL">
+		Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad].
+
+Se investigan y resuelven todas las infracciones denunciadas.
+	</notification>
+	<notification name="HelpReportAbuseSelectCategory">
+		Por favor, elige una categoría para esta denuncia de infracción.
+Seleccionar una categoría nos ayuda a clasificar y procesar las denuncias de infracciones.
+	</notification>
+	<notification name="HelpReportAbuseAbuserNameEmpty">
+		Por favor, escribe el nombre del infractor.
+Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+	</notification>
+	<notification name="HelpReportAbuseAbuserLocationEmpty">
+		Por favor, escribe la localización donde tuvo lugar la infracción.
+Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+	</notification>
+	<notification name="HelpReportAbuseSummaryEmpty">
+		Por favor, escribe un resumen de la infracción que ha habido.
+Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
+	</notification>
+	<notification name="HelpReportAbuseDetailsEmpty">
+		Por favor, escribe una descripción minuciosa de la infracción que ha habido.
+Sé tan específico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias.
+Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones.
+	</notification>
+	<notification name="HelpReportAbuseContainsCopyright">
+		Estimado Residente:
+
+Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta.
+
+(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (&apos;Abuse Team&apos;) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
+
+(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php &apos;DMCA Policy&apos;].
+
+Si todavía quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia.  En concreto, debes seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
+
+Gracias,
+
+Linden Lab
+	</notification>
+	<notification name="FailedRequirementsCheck">
+		Han desaparecido de [FLOATER] estos componentes:
+[COMPONENTS]
+	</notification>
+	<notification label="Reemplazar el anexado actual" name="ReplaceAttachment">
+		En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el ítem seleccionado"/>
+			<button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
+			<button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification label="¡Aviso! Modo Ocupado" name="BusyModePay">
+		Estás en el modo Ocupado. Por tanto, no recibirás ningún ítem a cambio de este pago.
+
+¿Quieres salir del modo Ocupado antes de completar esta transacción?
+		<form name="form">
+			<ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/>
+			<button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/>
+			<button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="ConfirmDeleteProtectedCategory">
+		La carpeta &apos;[FOLDERNAME]&apos; pertenece al sistema,   y borrar carpetas del sistema puede provocar inestabilidad.  ¿Estás seguro de que quieres borrarla?
+		<usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmEmptyTrash">
+		¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera?
+		<usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmClearBrowserCache">
+		¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmClearCookies">
+		¿Estás seguro de que quieres limpiar tus cookies?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+	</notification>
+	<notification name="ConfirmClearMediaUrlList">
+		¿Estás seguro de que quieres vaciar tu lista de URL guardadas?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+	</notification>
+	<notification name="ConfirmEmptyLostAndFound">
+		¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos?
+		<usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="CopySLURL">
+		Se ha copiado a tu portapapeles esta SLurl:
+ [SLURL]
+
+Publícala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador.
+		<form name="form">
+			<ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/>
+		</form>
+	</notification>
+	<notification name="WLSavePresetAlert">
+		¿Quieres sobrescribir la preselección guardada?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="WLDeletePresetAlert">
+		¿Quieres borrar [SKY]?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="WLNoEditDefault">
+		No puedes editar ni borrar una preselección por defecto.
+	</notification>
+	<notification name="WLMissingSky">
+		Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
+	</notification>
+	<notification name="PPSaveEffectAlert">
+		Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
+		<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="NewSkyPreset">
+		Dame un nombre para el cielo nuevo.
+		<form name="form">
+			<input name="message">
+				Preselección nueva
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="ExistsSkyPresetAlert">
+		¡Esa preselección ya existe!
+	</notification>
+	<notification name="NewWaterPreset">
+		Dame un nombre para la nueva preselección de agua.
+		<form name="form">
+			<input name="message">
+				Preselección nueva
+			</input>
+			<button name="OK" text="OK"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="ExistsWaterPresetAlert">
+		¡Esa preselección ya existe!
+	</notification>
+	<notification name="WaterNoEditDefault">
+		No puedes editar o borrar una preselección por defecto.
+	</notification>
+	<notification name="ChatterBoxSessionStartError">
+		No se puede empezar una nueva sesión de chat con [RECIPIENT].
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ChatterBoxSessionEventError">
+		[EVENT]
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ForceCloseChatterBoxSession">
+		Debe cerrarse tu sesión de chat con [NAME].
+[REASON]
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="Cannot_Purchase_an_Attachment">
+		No puedes comprar un objeto mientras esté anexado.
+	</notification>
+	<notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails">
+		Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AutoWearNewClothing">
+		¿Quieres ponerte automáticamente la ropa que vas a crear?
+		<usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="NotAgeVerified">
+		Debes haber verificado tu edad para visitar este sitio.  ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/verification.php?lang=es
+		</url>
+		<usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="Cannot enter parcel: no payment info on file">
+		Para visitar este sitio debes haber aportado información de pago en tu cuenta.  ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
+
+[_URL]
+		<url name="url" option="0">
+			https://secondlife.com/account/index.php?lang=es
+		</url>
+		<usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="MissingString">
+		La cadena [STRING_NAME] Ha desaparecido de strings.xml
+	</notification>
+	<notification name="SystemMessageTip">
+		[MESSAGE]
+	</notification>
+	<notification name="IMSystemMessageTip">
+		[MESSAGE]
+	</notification>
+	<notification name="Cancelled">
+		Cancelado
+	</notification>
+	<notification name="CancelledSit">
+		Cancelado el sentarte
+	</notification>
+	<notification name="CancelledAttach">
+		Cancelado el anexar
+	</notification>
+	<notification name="ReplacedMissingWearable">
+		Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto.
+	</notification>
+	<notification name="GroupNotice">
+		Asunto: [SUBJECT], Mensaje: [MESSAGE]
+	</notification>
+	<notification name="FriendOnline">
+		[NAME] está conectado
+	</notification>
+	<notification name="FriendOffline">
+		[NAME] está desconectado
+	</notification>
+	<notification name="AddSelfFriend">
+		Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
+	</notification>
+	<notification name="UploadingAuctionSnapshot">
+		Subiendo fotos del mundo y del sitio web...
+(tardará unos 5 minutos).
+	</notification>
+	<notification name="UploadPayment">
+		Has pagado [AMOUNT] LS por la subida.
+	</notification>
+	<notification name="UploadWebSnapshotDone">
+		Completada la subida de la foto del sitio web.
+	</notification>
+	<notification name="UploadSnapshotDone">
+		Completada la subida de la foto del mundo.
+	</notification>
+	<notification name="TerrainDownloaded">
+		Se ha descargado Terrain.raw
+	</notification>
+	<notification name="GestureMissing">
+		No se encuentra en la base de datos el gesto [NAME].
+	</notification>
+	<notification name="UnableToLoadGesture">
+		No se puede cargar el gesto [NAME].
+	</notification>
+	<notification name="LandmarkMissing">
+		El hito ha desaparecido de la base de datos.
+	</notification>
+	<notification name="UnableToLoadLandmark">
+		No se ha podido cargar el hito. Por favor, vuelve a intentarlo.
+	</notification>
+	<notification name="CapsKeyOn">
+		Tienes pulsada la tecla de mayúsculas.
+Esto puede influir en tu contraseña.
+	</notification>
+	<notification name="NotecardMissing">
+		La nota ha desaparecido de la base de datos.
+	</notification>
+	<notification name="NotecardNoPermissions">
+		No tienes permiso para ver esta nota.
+	</notification>
+	<notification name="RezItemNoPermissions">
+		No tienes permisos suficientes para renderizar el objeto.
+	</notification>
+	<notification name="UnableToLoadNotecard">
+		En este momento no se puede cargar la nota.
+	</notification>
+	<notification name="ScriptMissing">
+		El script ha desaparecido de la base de datos.
+	</notification>
+	<notification name="ScriptNoPermissions">
+		No tienes permisos suficientes para ver el script.
+	</notification>
+	<notification name="UnableToLoadScript">
+		No se ha podido cargar el script. Por favor, vuelve a intentarlo.
+	</notification>
+	<notification name="IncompleteInventory">
+		Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto.
+	</notification>
+	<notification name="CannotModifyProtectedCategories">
+		No puedes modificar categorías que están protegidas.
+	</notification>
+	<notification name="CannotRemoveProtectedCategories">
+		No puedes quitar categorías que están protegidas.
+	</notification>
+	<notification name="UnableToBuyWhileDownloading">
+		No se puede comprar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
+	</notification>
+	<notification name="UnableToLinkWhileDownloading">
+		No se puede enlazar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
+	</notification>
+	<notification name="CannotBuyObjectsFromDifferentOwners">
+		No puedes comprar más de un objeto a la vez.
+Por favor, selecciona un sólo objeto.
+	</notification>
+	<notification name="ObjectNotForSale">
+		Este objeto no está en venta.
+	</notification>
+	<notification name="EnteringGodMode">
+		Entrando en el modo administrativo, nivel [LEVEL]
+	</notification>
+	<notification name="LeavingGodMode">
+		Saliendo del modo administrativo, nivel [LEVEL]
+	</notification>
+	<notification name="CopyFailed">
+		No tienes pemiso para copiar esto.
+	</notification>
+	<notification name="InventoryAccepted">
+		[NAME] ha recibido tu oferta de inventario.
+	</notification>
+	<notification name="InventoryDeclined">
+		[NAME] ha rehusado tu oferta del inventario.
+	</notification>
+	<notification name="ObjectMessage">
+		[NAME]: [MESSAGE]
+	</notification>
+	<notification name="CallingCardAccepted">
+		Se ha aceptado tu tarjeta de visita.
+	</notification>
+	<notification name="CallingCardDeclined">
+		Se ha rehusado tu tarjeta de visita.
+	</notification>
+	<notification name="TeleportToLandmark">
+		Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
+Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
+	</notification>
+	<notification name="TeleportToPerson">
+		Puedes contactar con un Residente como &apos;[NAME]&apos; abriendo el panel Gente en el lado derecho de tu pantalla.
+Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
+	</notification>
+	<notification name="CantSelectLandFromMultipleRegions">
+		No puedes seleccionar un terreno que cruce las fronteras entre servidores.
+Inténtalo seleccionando un trozo más pequeño de terreno.
+	</notification>
+	<notification name="SearchWordBanned">
+		Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
+	</notification>
+	<notification name="NoContentToSearch">
+		Por favor, elige al menos un tipo de contenido a buscar (General, Moderado o Adulto;).
+	</notification>
+	<notification name="SystemMessage">
+		[MESSAGE]
+	</notification>
+	<notification name="PaymentReceived">
+		[MESSAGE]
+	</notification>
+	<notification name="PaymentSent">
+		[MESSAGE]
+	</notification>
+	<notification name="EventNotification">
+		Notificación de un evento:
+
+[NAME]
+[DATE]
+		<form name="form">
+			<button name="Details" text="Detalles"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="TransferObjectsHighlighted">
+		En estos momentos, están realzados todos los objetos de esta parcela que serán transferidos al comprador de la misma.
+
+* No están realzados los árboles y hierbas que se transferirán.
+		<form name="form">
+			<button name="Done" text="Hecho"/>
+		</form>
+	</notification>
+	<notification name="DeactivatedGesturesTrigger">
+		Desactivados los gestos que tienen el mismo botón:
+[NAMES]
+	</notification>
+	<notification name="NoQuickTime">
+		No parece que tu sistema tenga instalado el software QuickTime de Apple.
+Si quieres ver media en streaming en las parcelas que los tienen, deberías ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player.
+	</notification>
+	<notification name="NoPlugin">
+		No se ha encontrado el &apos;Media Plugin&apos; para manejar el &apos;mime type&apos; &quot;[MIME_TYPE]&quot;.  Los media de este tipo no estarán disponibles.
+	</notification>
+	<notification name="MediaPluginFailed">
+		Fallo de este &apos;Media Plugin&apos;:
+    [PLUGIN]
+
+Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas.
+		<form name="form">
+			<ignore name="ignore" text="Fallo al ejecutar un &apos;Media Plugin&apos;"/>
+		</form>
+	</notification>
+	<notification name="OwnedObjectsReturned">
+		Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada.
+	</notification>
+	<notification name="OtherObjectsReturned">
+		Se han devuelto a su inventario los objetos en la parcela de terreno seleccionada propiedad de [NAME].
+	</notification>
+	<notification name="OtherObjectsReturned2">
+		Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de &apos;[NAME]&apos;.
+	</notification>
+	<notification name="GroupObjectsReturned">
+		Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada.
+Los objetos transferibles que se transfirieron al grupo se han devuelto a sus propietarios anteriores.
+Los objetos no transferibles que se transfirieron al grupo han sido borrados.
+	</notification>
+	<notification name="UnOwnedObjectsReturned">
+		Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada.
+	</notification>
+	<notification name="ServerObjectMessage">
+		Mensaje de [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+	</notification>
+	<notification name="NotSafe">
+		Este terreno tiene el daño activado.
+Aquí puedes ser herido. Si mueres, se te teleportará a tu Base.
+	</notification>
+	<notification name="NoFly">
+		Este terreno tiene desactivado el poder volar.
+Aquí no puedes volar.
+	</notification>
+	<notification name="PushRestricted">
+		Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno.
+	</notification>
+	<notification name="NoVoice">
+		Este tereno tiene desactivado el chat de voz. No podrás oír hablar a nadie.
+	</notification>
+	<notification name="NoBuild">
+		Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
+	</notification>
+	<notification name="ScriptsStopped">
+		Un administrador ha detenido temporalmente los scripts en esta región.
+	</notification>
+	<notification name="ScriptsNotRunning">
+		En esta región no se está ejecutando ningún script.
+	</notification>
+	<notification name="NoOutsideScripts">
+		Este terreno tiene desactivados los scripts externos.
+
+Los scripts no funcionan aquí, excepto los pertenecientes al propietario del terreno.
+	</notification>
+	<notification name="ClaimPublicLand">
+		Sólo puedes reclamar terreno público de la región en que estás.
+	</notification>
+	<notification name="RegionTPAccessBlocked">
+		No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor.
+
+Por favor, dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+	</notification>
+	<notification name="URBannedFromRegion">
+		Se te ha prohibido el acceso a la región.
+	</notification>
+	<notification name="NoTeenGridAccess">
+		Tu cuenta no puede conectarse a esta región del grid teen.
+	</notification>
+	<notification name="ImproperPaymentStatus">
+		No tienes el estado de pago adecuado para entrar a esta región.
+	</notification>
+	<notification name="MustGetAgeParcel">
+		Debes haber verificado tu edad para entrar a esta parcela.
+	</notification>
+	<notification name="NoDestRegion">
+		No se ha encontrada la región de destino.
+	</notification>
+	<notification name="NotAllowedInDest">
+		No estás autorizado en el destino.
+	</notification>
+	<notification name="RegionParcelBan">
+		No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino.
+	</notification>
+	<notification name="TelehubRedirect">
+		Has sido redirigido a un punto de teleporte.
+	</notification>
+	<notification name="CouldntTPCloser">
+		No se puede teleportar a un destino tan cercano.
+	</notification>
+	<notification name="TPCancelled">
+		Teleporte cancelado.
+	</notification>
+	<notification name="FullRegionTryAgain">
+		En estos momentos, está llena la región a la que estás intentando entrar.
+Por favor, vuelve a intentarlo en unos momentos.
+	</notification>
+	<notification name="GeneralFailure">
+		Fallo general.
+	</notification>
+	<notification name="RoutedWrongRegion">
+		Mal dirigido a la región. Por favor, vuelve a intentarlo.
+	</notification>
+	<notification name="NoValidAgentID">
+		ID de agente inválido.
+	</notification>
+	<notification name="NoValidSession">
+		ID de sesión inválido.
+	</notification>
+	<notification name="NoValidCircuit">
+		Circuito de código inválido.
+	</notification>
+	<notification name="NoValidTimestamp">
+		Fecha inválida.
+	</notification>
+	<notification name="NoPendingConnection">
+		No se puede crear la conexión.
+	</notification>
+	<notification name="InternalUsherError">
+		Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+	</notification>
+	<notification name="NoGoodTPDestination">
+		No se puede encontrar en esta región un buen destino para el teleporte.
+	</notification>
+	<notification name="InternalErrorRegionResolver">
+		Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+	</notification>
+	<notification name="NoValidLanding">
+		No se ha podido encontrar un punto de aterrizaje válido.
+	</notification>
+	<notification name="NoValidParcel">
+		No se ha podido encontrar una parcela válida.
+	</notification>
+	<notification name="ObjectGiveItem">
+		Un objeto de nombre &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
+		<form name="form">
+			<button name="Keep" text="Guardar"/>
+			<button name="Discard" text="Descartar"/>
+			<button name="Mute" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="UserGiveItem">
+		[NAME_SLURL] te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
+		<form name="form">
+			<button name="Show" text="Mostrar"/>
+			<button name="Discard" text="Descartar"/>
+			<button name="Mute" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="GodMessage">
+		[NAME]
+
+[MESSAGE]
+	</notification>
+	<notification name="JoinGroup">
+		[MESSAGE]
+		<form name="form">
+			<button name="Join" text="Entrar"/>
+			<button name="Decline" text="Rehusar"/>
+			<button name="Info" text="Información"/>
+		</form>
+	</notification>
+	<notification name="TeleportOffered">
+		[NAME_SLURL] te ha ofrecido teleportarte a su posición:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+		<form name="form">
+			<button name="Teleport" text="Teleportar"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="TeleportOfferSent">
+		Teleporte ofrecido a [TO_NAME]
+	</notification>
+	<notification name="GotoURL">
+		[MESSAGE]
+[URL]
+		<form name="form">
+			<button name="Later" text="Más tarde"/>
+			<button name="GoNow..." text="Ir ahora..."/>
+		</form>
+	</notification>
+	<notification name="OfferFriendship">
+		[NAME_SLURL] te está ofreciendo su amistad.
+
+[MESSAGE]
+
+(Por defecto, podrás ver si el otro está conectado)
+		<form name="form">
+			<button name="Accept" text="Aceptar"/>
+			<button name="Decline" text="Rehusar"/>
+		</form>
+	</notification>
+	<notification name="FriendshipOffered">
+		Has ofrecido amistad a [TO_NAME]
+	</notification>
+	<notification name="OfferFriendshipNoMessage">
+		[NAME_SLURL] está ofreciendo amistad.
+
+(De manera predeterminada, podrás ver si están conectados los demás.)
+		<form name="form">
+			<button name="Accept" text="Aceptar"/>
+			<button name="Decline" text="Rehusar"/>
+		</form>
+	</notification>
+	<notification name="FriendshipAccepted">
+		[NAME] ha aceptado tu oferta de amistad.
+	</notification>
+	<notification name="FriendshipDeclined">
+		[NAME] ha rehusado tu oferta de amistad.
+	</notification>
+	<notification name="FriendshipAcceptedByMe">
+		Aceptado el ofrecimiento de amistad.
+	</notification>
+	<notification name="FriendshipDeclinedByMe">
+		Rehusado el ofrecimiento de amistad.
+	</notification>
+	<notification name="OfferCallingCard">
+		[NAME] te está ofreciendo su tarjeta de visita.
+Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI.
+		<form name="form">
+			<button name="Accept" text="Aceptar"/>
+			<button name="Decline" text="Rehusar"/>
+		</form>
+	</notification>
+	<notification name="RegionRestartMinutes">
+		Esta región se reiniciará en [MINUTES] minutos.
+Si permaneces en esta región serás desconectado.
+	</notification>
+	<notification name="RegionRestartSeconds">
+		Esta región se reiniciará en  [SECONDS] segundos.
+Si permaneces en esta región serás desconectado.
+	</notification>
+	<notification name="LoadWebPage">
+		¿Cargar página web [URL]?
+
+[MESSAGE]
+
+Del objeto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, propietario: [NAME]?
+		<form name="form">
+			<button name="Gotopage" text="Cargar"/>
+			<button name="Cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification name="FailedToFindWearableUnnamed">
+		Búsqueda fallida de [TYPE] en la base de datos.
+	</notification>
+	<notification name="FailedToFindWearable">
+		Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos.
+	</notification>
+	<notification name="InvalidWearable">
+		El ítem que quieres vestirte tiene una característica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este ítem.
+	</notification>
+	<notification name="ScriptQuestion">
+		&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, un objeto propiedad de &apos;[NAME]&apos;, quiere:
+
+[QUESTIONS]
+¿Es correcto?
+		<form name="form">
+			<button name="Yes" text="Sí"/>
+			<button name="No" text="No"/>
+			<button name="Mute" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="ScriptQuestionCaution">
+		Un objeto de nombre &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, propiedad de &apos;[NAME]&apos;, quiere:
+
+[QUESTIONS]
+Si no confias en este objeto y en su creador, deberías rehusar esta petición.
+
+¿Autorizar esta petición?
+		<form name="form">
+			<button name="Grant" text="Autorizar"/>
+			<button name="Deny" text="Denegar"/>
+			<button name="Details" text="Detalles..."/>
+		</form>
+	</notification>
+	<notification name="ScriptDialog">
+		&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [NAME]
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="ScriptDialogGroup">
+		&apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; de [GROUPNAME]
+[MESSAGE]
+		<form name="form">
+			<button name="Ignore" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="BuyLindenDollarSuccess">
+		¡Gracias por tu pago!
+
+Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción,    y la cantidad se cargará en tu saldo de US$.
+
+Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control]
+	</notification>
+	<notification name="FirstOverrideKeys">
+		A partir de ahora, tus teclas de movimiento las gestiona un objeto.
+Prueba las teclas del cursor o AWSD para ver qué hacen.
+Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa &apos;M&apos; para hacerlo.
+	</notification>
+	<notification name="FirstSandbox">
+		Esta es una región &apos;sandbox&apos; (zona de pruebas) donde los Residentes pueden aprender a construir.
+
+Los objetos que construyas aquí serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir &apos;Tomar&apos; para que tu creación vaya a tu inventario.
+	</notification>
+	<notification name="MaxListSelectMessage">
+		Puedes seleccionar un máximo de [MAX_SELECT] ítems de esta lista.
+	</notification>
+	<notification name="VoiceInviteP2P">
+		[NAME] te está invitando a un chat de voz.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+		<form name="form">
+			<button name="Accept" text="Aceptar"/>
+			<button name="Decline" text="Rehusar"/>
+			<button name="Mute" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="AutoUnmuteByIM">
+		[NAME] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo.
+	</notification>
+	<notification name="AutoUnmuteByMoney">
+		[NAME] ha dejado automáticamente de estar ignorado al darle dinero.
+	</notification>
+	<notification name="AutoUnmuteByInventory">
+		[NAME] ha dejado automáticamente de estar ignorado al ofrecerle inventario.
+	</notification>
+	<notification name="VoiceInviteGroup">
+		[NAME] ha empezado un chat de voz con el grupo [GROUP].
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+		<form name="form">
+			<button name="Accept" text="Aceptar"/>
+			<button name="Decline" text="Rehusar"/>
+			<button name="Mute" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="VoiceInviteAdHoc">
+		[NAME] ha empezado un chat de voz en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+		<form name="form">
+			<button name="Accept" text="Aceptar"/>
+			<button name="Decline" text="Rehusar"/>
+			<button name="Mute" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="InviteAdHoc">
+		NAME] te está invitando a un chat en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
+		<form name="form">
+			<button name="Accept" text="Aceptar"/>
+			<button name="Decline" text="Rehusar"/>
+			<button name="Mute" text="Ignorar"/>
+		</form>
+	</notification>
+	<notification name="VoiceChannelFull">
+		El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde.
+	</notification>
+	<notification name="ProximalVoiceChannelFull">
+		Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona.
+	</notification>
+	<notification name="VoiceChannelDisconnected">
+		Has sido desconectado de [VOICE_CHANNEL_NAME].  Vas a ser reconectado al chat de voz.
+	</notification>
+	<notification name="VoiceChannelDisconnectedP2P">
+		[VOICE_CHANNEL_NAME] ha colgado la llamada.  Vas a ser reconectado al chat de voz.
+	</notification>
+	<notification name="P2PCallDeclined">
+		[VOICE_CHANNEL_NAME] ha rehusado tu llamada.  Vas a ser reconectado al chat de voz.
+	</notification>
+	<notification name="P2PCallNoAnswer">
+		[VOICE_CHANNEL_NAME] no está disponible para coger tu llamada.  Vas a ser reconectado al chat de voz.
+	</notification>
+	<notification name="VoiceChannelJoinFailed">
+		Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde.  Vas a ser reconectado al chat de voz.
+	</notification>
+	<notification name="VoiceLoginRetry">
+		Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto.
+	</notification>
+	<notification name="VoiceEffectsExpired">
+		Una o más de las transformaciones de voz a las que estás suscrito han caducado.
+[Pulsa aquí [URL]] para renovar la suscripción.
+	</notification>
+	<notification name="VoiceEffectsExpiredInUse">
+		La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal.
+[Pulsa aquí [URL]] para renovar la suscripción.
+	</notification>
+	<notification name="VoiceEffectsWillExpire">
+		Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] días.
+[Pulsa aquí [URL]] para renovar la suscripción.
+	</notification>
+	<notification name="VoiceEffectsNew">
+		Están disponibles nuevas transformaciones de voz.
+	</notification>
+	<notification name="Cannot enter parcel: not a group member">
+		Sólo los miembros de un grupo determinado pueden visitar esta zona.
+	</notification>
+	<notification name="Cannot enter parcel: banned">
+		No puedes entrar en esta parcela, se te ha prohibido el acceso.
+	</notification>
+	<notification name="Cannot enter parcel: not on access list">
+		No puedes entrar en esta parcela, no estás en la lista de acceso.
+	</notification>
+	<notification name="VoiceNotAllowed">
+		No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME].
+	</notification>
+	<notification name="VoiceCallGenericError">
+		Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.
+	</notification>
+	<notification name="UnsupportedCommandSLURL">
+		No se admite el formato de la SLurl que has pulsado.
+	</notification>
+	<notification name="BlockedSLURL">
+		Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza.
+	</notification>
+	<notification name="ThrottledSLURL">
+		En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza.
+Por tu seguridad, serán bloqueadas durante unos segundos.
+	</notification>
+	<notification name="IMToast">
+		[MESSAGE]
+		<form name="form">
+			<button name="respondbutton" text="Responder"/>
+		</form>
+	</notification>
+	<notification name="ConfirmCloseAll">
+		¿Seguro que quieres cerrar todos los MI?
+		<usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="AttachmentSaved">
+		Se ha guardado el adjunto.
+	</notification>
+	<notification name="UnableToFindHelpTopic">
+		No se ha podido encontrar un tema de ayuda para este elemento.
+	</notification>
+	<notification name="ObjectMediaFailure">
+		Error del servidor: fallo en la actualización u obtención de los media.
+&apos;[ERROR]&apos;
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="TextChatIsMutedByModerator">
+		Un moderador ha silenciado tu chat de texto.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="VoiceIsMutedByModerator">
+		Un moderador ha silenciado tu voz.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="ConfirmClearTeleportHistory">
+		¿Estás seguro de que quieres borrar tu historial de teleportes?
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="BottomTrayButtonCanNotBeShown">
+		El botón elegido no se puede mostrar correctamente.
+Se mostrará cuando haya suficiente espacio.
+	</notification>
+	<notification name="ShareNotification">
+		Selecciona los residentes con quienes deseas compartir.
+	</notification>
+	<notification name="ShareItemsConfirmation">
+		¿Estás seguro de que quieres compartir los elementos siguientes?
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+Con los siguientes residentes:
+
+[RESIDENTS]
+		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification name="ItemsShared">
+		Los elementos se han compartido correctamente.
+	</notification>
+	<notification name="DeedToGroupFail">
+		Error de transferencia a grupo.
+	</notification>
+	<notification name="AvatarRezNotification">
+		( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; tardó [TIME] segundos en dejar de aparecer como nube.
+	</notification>
+	<notification name="AvatarRezSelfBakedDoneNotification">
+		( [EXISTENCE] segundos vivo)
+Has terminado de texturizar tu vestuario en [TIME] segundos.
+	</notification>
+	<notification name="AvatarRezSelfBakedUpdateNotification">
+		( [EXISTENCE] segundos vivo)
+Has enviado una actualización de tu apariencia después de [TIME] segundos.
+[STATUS]
+	</notification>
+	<notification name="AvatarRezCloudNotification">
+		( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; se convirtió en nube.
+	</notification>
+	<notification name="AvatarRezArrivedNotification">
+		( [EXISTENCE] segundos vivo)
+Apareció el avatar &apos;[NAME]&apos;.
+	</notification>
+	<notification name="AvatarRezLeftCloudNotification">
+		( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; salió al cabo de [TIME] segundos como nube.
+	</notification>
+	<notification name="AvatarRezEnteredAppearanceNotification">
+		( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; ya está en modo de edición de apariencia.
+	</notification>
+	<notification name="AvatarRezLeftAppearanceNotification">
+		( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; desactivó el modo de apariencia.
+	</notification>
+	<notification name="NoConnect">
+		Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
+Comprueba la configuración de la red y del servidor de seguridad.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="NoVoiceConnect">
+		Tenemos problemas de conexión con tu servidor de voz:
+
+[HOSTID]
+
+No podrás establecer comunicaciones de voz.
+Comprueba la configuración de la red y del servidor de seguridad.
+		<usetemplate name="okbutton" yestext="OK"/>
+	</notification>
+	<notification name="AvatarRezLeftNotification">
+		( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; ya estaba totalmente cargado al salir.
+	</notification>
+	<notification name="AvatarRezSelfBakedTextureUploadNotification">
+		( [EXISTENCE] segundos con vida )
+Has actualizado una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
+	</notification>
+	<notification name="AvatarRezSelfBakedTextureUpdateNotification">
+		( [EXISTENCE] segundos con vida )
+Has actualizado de manera local una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
+	</notification>
+	<notification name="ConfirmLeaveCall">
+		¿Estás seguro de que deseas salir de esta multiconferencia?
+		<usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="Sí"/>
+	</notification>
+	<notification name="ConfirmMuteAll">
+		Has seleccionado silenciar a todos los participantes en una multiconferencia.
+Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia.
+
+¿Deseas silenciar a todos?
+		<usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+	</notification>
+	<notification label="Chat" name="HintChat">
+		Para unirte a la conversación, escribe en el campo de chat que aparece a continuación.
+	</notification>
+	<notification label="Levantarme" name="HintSit">
+		Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme.
+	</notification>
+	<notification label="Hablar" name="HintSpeak">
+		Pulsa en el botón: Hablar para conectar y desconectar el micrófono.
+
+Pulsa en el cursor arriba para ver el panel de control de voz.
+
+Al ocultar el botón Hablar se desactiva la función de voz.
+	</notification>
+	<notification label="Explora el mundo" name="HintDestinationGuide">
+		La Guía de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración.
+	</notification>
+	<notification label="Panel lateral" name="HintSidePanel">
+		Accede de manera rápida a tu inventario, así como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral.
+	</notification>
+	<notification label="Mover" name="HintMove">
+		Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado.
+	</notification>
+	<notification label="" name="HintMoveClick">
+		1. Pulsa para caminar: Pulsa en cualquier punto del terreno para ir a él.
+
+2. Pulsa y arrastra para girar la vista: Pulsa y arrastra el cursor a cualquier parte del mundo para girar la vista.
+	</notification>
+	<notification label="Nombre mostrado" name="HintDisplayName">
+		Configura y personaliza aquí tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias.
+	</notification>
+	<notification label="Visión" name="HintView">
+		Para cambiar la vista de la cámara, utiliza los controles Orbital y Panorámica. Para restablecer tu vista, pulsa Esc o camina.
+	</notification>
+	<notification label="Inventario" name="HintInventory">
+		Accede a tu inventario para buscar ítems. Los ítems más recientes se pueden encontrar fácilmente en la pestaña Recientes.
+	</notification>
+	<notification label="¡Tienes dólares Linden!" name="HintLindenDollar">
+		Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden.
+	</notification>
+	<notification name="PopupAttempt">
+		Se ha impedido que se abriera una ventana emergente.
+		<form name="form">
+			<ignore name="ignore" text="Permitir todas las ventanas emergentes"/>
+			<button name="open" text="Abrir ventana emergente"/>
+		</form>
+	</notification>
+	<notification name="AuthRequest">
+		El sitio en &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; de la plataforma &apos;[REALM]&apos; requiere un nombre de usuario y una contraseña.
+		<form name="form">
+			<input name="username" text="Nombre de usuario"/>
+			<input name="password" text="Contraseña"/>
+			<button name="ok" text="Enviar"/>
+			<button name="cancel" text="Cancelar"/>
+		</form>
+	</notification>
+	<notification label="" name="ModeChange">
+		Para cambiar de modo tienes que salir y reiniciar.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoClassifieds">
+		La creación y edición de clasificados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoGroupInfo">
+		La creación y edición de grupos sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoPicks">
+		La creación y edición de Destacados sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoWorldMap">
+		La visualización del mapa del mundo sólo está disponible en el modo Avanzado. ¿Quieres salir y cambiar de modo? El selector de modo se encuentra en la pantalla de inicio de sesión.
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoVoiceCall">
+		Las llamadas de voz sólo están disponibles en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoAvatarShare">
+		Compartir sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<notification label="" name="NoAvatarPay">
+		El pago a otros residentes sólo está disponible en el modo Avanzado. ¿Quieres cerrar sesión y cambiar de modo?
+		<usetemplate name="okcancelbuttons" notext="No salir" yestext="Salir"/>
+	</notification>
+	<global name="UnsupportedCPU">
+		- La velocidad de tu CPU no cumple los requerimientos mínimos.
+	</global>
+	<global name="UnsupportedGLRequirements">
+		Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
+
+Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
+	</global>
+	<global name="UnsupportedCPUAmount">
+		796
+	</global>
+	<global name="UnsupportedRAMAmount">
+		510
+	</global>
+	<global name="UnsupportedGPU">
+		- Tu tarjeta gráfica no cumple los requerimientos mínimos.
+	</global>
+	<global name="UnsupportedRAM">
+		- La memoria de tu sistema no cumple los requerimientos mínimos.
+	</global>
+	<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+		Si posees un terreno, puedes hacerlo tu Base.
+También puedes buscar en el Mapa lugares marcados como &quot;Puntos de Información&quot;.
+	</global>
+	<global name="You died and have been teleported to your home location">
+		Has muerto y te has teleportado a tu Base.
+	</global>
+</notifications>
diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml
index a0f7433d7d72f2009a0c3e2c9e17e3cc2b5e3c09..ef2309dd55aa849ba87955c347bac78060e7c550 100644
--- a/indra/newview/skins/default/xui/es/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_general.xml
@@ -1,58 +1,58 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="General" name="general_tab">
-	<panel.string name="help_text">
-		La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros.
-
-Deja el cursor sobre las opciones para ver más ayuda.
-	</panel.string>
-	<panel.string name="group_info_unchanged">
-		Ha cambiado la información general del grupo
-	</panel.string>
-	<panel.string name="incomplete_member_data_str">
-		Recuperando los datos de los miembros
-	</panel.string>
-	<panel name="group_info_top">
-		<texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/>
-		<text name="prepend_founded_by">
-			Fundador:
-		</text>
-		<name_box initial_value="(obteniendo)" name="founder_name"/>
-		<text name="join_cost_text">
-			Gratis
-		</text>
-		<button label="¡ENTRA AHORA!" name="btn_join"/>
-	</panel>
-	<text_editor name="charter">
-		Carta del grupo
-	</text_editor>
-	<name_list name="visible_members">
-		<name_list.columns label="Miembro" name="name" relwidth="0.40"/>
-		<name_list.columns label="Etiqueta" name="title" relwidth="0.25"/>
-		<name_list.columns label="Estado" name="status"/>
-	</name_list>
-	<text name="my_group_settngs_label">
-		Yo
-	</text>
-	<text name="active_title_label">
-		Mi etiqueta:
-	</text>
-	<combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/>
-	<check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo.  Desmárcalo si este grupo te envía &apos;spam&apos;."/>
-	<check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/>
-	<panel name="preferences_container">
-		<text name="group_settngs_label">
-			Grupo
-		</text>
-		<check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
-		<check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
-		<spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
-		<combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es &apos;mature&apos;." width="150">
-			<combo_item name="select_mature">
-				- Selecciona el nivel de calificación -
-			</combo_item>
-			<combo_box.item label="Contenido &apos;Mature&apos;" name="mature"/>
-			<combo_box.item label="Contenido &apos;PG&apos;" name="pg"/>
-		</combo_box>
-		<check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
-	</panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="general_tab">
+	<panel.string name="help_text">
+		La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros.
+
+Deja el cursor sobre las opciones para ver más ayuda.
+	</panel.string>
+	<panel.string name="group_info_unchanged">
+		Ha cambiado la información general del grupo
+	</panel.string>
+	<panel.string name="incomplete_member_data_str">
+		Recuperando los datos de los miembros
+	</panel.string>
+	<panel name="group_info_top">
+		<texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/>
+		<text name="prepend_founded_by">
+			Fundador:
+		</text>
+		<name_box initial_value="(obteniendo)" name="founder_name"/>
+		<text name="join_cost_text">
+			Gratis
+		</text>
+		<button label="¡ENTRA AHORA!" name="btn_join"/>
+	</panel>
+	<text_editor name="charter">
+		Carta del grupo
+	</text_editor>
+	<name_list name="visible_members">
+		<name_list.columns label="Miembro" name="name" relwidth="0.40"/>
+		<name_list.columns label="Etiqueta" name="title" relwidth="0.25"/>
+		<name_list.columns label="Estado" name="status"/>
+	</name_list>
+	<text name="my_group_settngs_label">
+		Yo
+	</text>
+	<text name="active_title_label">
+		Mi etiqueta:
+	</text>
+	<combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/>
+	<check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo.  Desmárcalo si este grupo te envía &apos;spam&apos;."/>
+	<check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/>
+	<panel name="preferences_container">
+		<text name="group_settngs_label">
+			Grupo
+		</text>
+		<check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
+		<check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
+		<spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
+		<combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es moderado." width="150">
+			<combo_item name="select_mature">
+				- Selecciona el nivel de calificación -
+			</combo_item>
+			<combo_box.item label="Contenido moderado" name="mature"/>
+			<combo_box.item label="Contenido general" name="pg"/>
+		</combo_box>
+		<check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index 790c7be5819ca4eef20dd1a9eef09ddf4710855b..d9a65aabc2f4cc09b68cffe676445bdaba16441b 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -1,73 +1,73 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="General" name="general_panel">
-	<text name="language_textbox">
-		Idioma:
-	</text>
-	<combo_box name="language_combobox">
-		<combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
-		<combo_box.item label="English (Inglés)" name="English"/>
-		<combo_box.item label="Dansk (Danés) - Beta" name="Danish"/>
-		<combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
-		<combo_box.item label="Español - Beta" name="Spanish"/>
-		<combo_box.item label="Français (Francés) - Beta" name="French"/>
-		<combo_box.item label="Italiano - Beta" name="Italian"/>
-		<combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
-		<combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
-		<combo_box.item label="Português (portugués) - Beta" name="Portugese"/>
-		<combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
-	</combo_box>
-	<text name="language_textbox2">
-		(requiere reiniciar)
-	</text>
-	<text name="maturity_desired_prompt">
-		Quiero acceder a contenido:
-	</text>
-	<text name="maturity_desired_textbox"/>
-	<combo_box name="maturity_desired_combobox">
-		<combo_box.item label="&apos;PG&apos;, &apos;Mature&apos; y &apos;Adult&apos;" name="Desired_Adult"/>
-		<combo_box.item label="&apos;PG&apos; y &apos;Mature&apos;" name="Desired_Mature"/>
-		<combo_box.item label="&apos;PG&apos;" name="Desired_PG"/>
-	</combo_box>
-	<text name="start_location_textbox">
-		Localización inicial:
-	</text>
-	<combo_box name="start_location_combo">
-		<combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/>
-		<combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/>
-	</combo_box>
-	<check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/>
-	<text name="name_tags_textbox">
-		Etiquetas de los nombres:
-	</text>
-	<radio_group name="Name_Tag_Preference">
-		<radio_item label="Off" name="radio" value="0"/>
-		<radio_item label="On" name="radio2" value="1"/>
-		<radio_item label="Mostrar brevemente" name="radio3" value="2"/>
-	</radio_group>
-	<check_box label="Mi nombre" name="show_my_name_checkbox1"/>
-	<check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/>
-	<check_box label="Títulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar títulos de grupos, como Jefe o Miembro"/>
-	<check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/>
-	<check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
-	<check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/>
-	<text name="inworld_typing_rg_label">
-		Si pulsas las teclas de letras:
-	</text>
-	<radio_group name="inworld_typing_preference">
-		<radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
-		<radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
-	</radio_group>
-	<text name="title_afk_text">
-		Ausente tras:
-	</text>
-	<combo_box label="Ausente tras:" name="afk">
-		<combo_box.item label="2 minutos" name="item0"/>
-		<combo_box.item label="5 minutos" name="item1"/>
-		<combo_box.item label="10 minutos" name="item2"/>
-		<combo_box.item label="30 minutos" name="item3"/>
-		<combo_box.item label="nunca" name="item4"/>
-	</combo_box>
-	<text name="text_box3">
-		Respuesta cuando estoy en modo ocupado:
-	</text>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="general_panel">
+	<text name="language_textbox">
+		Idioma:
+	</text>
+	<combo_box name="language_combobox">
+		<combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
+		<combo_box.item label="English (Inglés)" name="English"/>
+		<combo_box.item label="Dansk (Danés) - Beta" name="Danish"/>
+		<combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
+		<combo_box.item label="Español - Beta" name="Spanish"/>
+		<combo_box.item label="Français (Francés) - Beta" name="French"/>
+		<combo_box.item label="Italiano - Beta" name="Italian"/>
+		<combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
+		<combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
+		<combo_box.item label="Português (portugués) - Beta" name="Portugese"/>
+		<combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
+	</combo_box>
+	<text name="language_textbox2">
+		(requiere reiniciar)
+	</text>
+	<text name="maturity_desired_prompt">
+		Quiero acceder a contenido:
+	</text>
+	<text name="maturity_desired_textbox"/>
+	<combo_box name="maturity_desired_combobox">
+		<combo_box.item label="General, Moderado y Adulto" name="Desired_Adult"/>
+		<combo_box.item label="General y Moderado" name="Desired_Mature"/>
+		<combo_box.item label="General" name="Desired_PG"/>
+	</combo_box>
+	<text name="start_location_textbox">
+		Localización inicial:
+	</text>
+	<combo_box name="start_location_combo">
+		<combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/>
+		<combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/>
+	</combo_box>
+	<check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/>
+	<text name="name_tags_textbox">
+		Etiquetas de los nombres:
+	</text>
+	<radio_group name="Name_Tag_Preference">
+		<radio_item label="Off" name="radio" value="0"/>
+		<radio_item label="On" name="radio2" value="1"/>
+		<radio_item label="Mostrar brevemente" name="radio3" value="2"/>
+	</radio_group>
+	<check_box label="Mi nombre" name="show_my_name_checkbox1"/>
+	<check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/>
+	<check_box label="Títulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar títulos de grupos, como Jefe o Miembro"/>
+	<check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/>
+	<check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/>
+	<check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/>
+	<text name="inworld_typing_rg_label">
+		Si pulsas las teclas de letras:
+	</text>
+	<radio_group name="inworld_typing_preference">
+		<radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/>
+		<radio_item label="Afecta al movimiento (por ejemplo, en las teclas WASD)" name="radio_move" value="0"/>
+	</radio_group>
+	<text name="title_afk_text">
+		Ausente tras:
+	</text>
+	<combo_box label="Ausente tras:" name="afk">
+		<combo_box.item label="2 minutos" name="item0"/>
+		<combo_box.item label="5 minutos" name="item1"/>
+		<combo_box.item label="10 minutos" name="item2"/>
+		<combo_box.item label="30 minutos" name="item3"/>
+		<combo_box.item label="nunca" name="item4"/>
+	</combo_box>
+	<text name="text_box3">
+		Respuesta cuando estoy en modo ocupado:
+	</text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
index 06f4fffacf5a10f6733be3645c0ea6cea6e31a5c..84fe9937b9d00b7e9adbbbd4f2dda8d90b88c8e4 100644
--- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
@@ -1,83 +1,83 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Contrato" name="Covenant">
-	<text name="estate_section_lbl">
-		Estado
-	</text>
-	<text name="estate_name_lbl">
-		Nombre:
-	</text>
-	<text name="estate_name_text">
-		mainland
-	</text>
-	<text name="estate_owner_lbl">
-		Propietario:
-	</text>
-	<text name="estate_owner_text">
-		(nadie)
-	</text>
-	<text name="estate_cov_lbl">
-		Contrato:
-	</text>
-	<text name="covenant_timestamp_text">
-		Última modificación el miér. 31 de dic. de 1969, 16:00:00
-	</text>
-	<button label="?" name="covenant_help"/>
-	<text_editor bottom="-263" height="178" name="covenant_editor">
-		No se ha aportado un contrato para este estado.
-	</text_editor>
-	<button label="Cambiar" name="reset_covenant"/>
-	<text name="covenant_help_text">
-		Los cambios en el contrato se mostrarán en todas las parcelas 
-del estado.
-	</text>
-	<text bottom_delta="-31" name="covenant_instructions">
-		Arrastra y suelta una nota para cambiar el contrato de este estado.
-	</text>
-	<text name="region_section_lbl">
-		Región
-	</text>
-	<text name="region_name_lbl">
-		Nombre:
-	</text>
-	<text name="region_name_text">
-		leyla
-	</text>
-	<text name="region_landtype_lbl">
-		Tipo:
-	</text>
-	<text name="region_landtype_text">
-		Mainland / Homestead
-	</text>
-	<text name="region_maturity_lbl">
-		Calificación:
-	</text>
-	<text name="region_maturity_text">
-		&apos;Adult&apos;
-	</text>
-	<text name="resellable_lbl">
-		Revender:
-	</text>
-	<text name="resellable_clause">
-		El terreno de esta región no se podrá revender.
-	</text>
-	<text name="changeable_lbl">
-		Dividir:
-	</text>
-	<text name="changeable_clause">
-		El terreno de esta región no se podrá unir/dividir.
-	</text>
-	<string name="can_resell">
-		El terreno comprado en esta región se podrá revender.
-	</string>
-	<string name="can_not_resell">
-		El terreno comprado en esta región no se podrá revender.
-	</string>
-	<string name="can_change">
-		El terreno comprado en esta región se podrá unir o 
-subdividir.
-	</string>
-	<string name="can_not_change">
-		El terreno comprado en esta región no se podrá unir ni
-subdividir.
-	</string>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Contrato" name="Covenant">
+	<text name="estate_section_lbl">
+		Estado
+	</text>
+	<text name="estate_name_lbl">
+		Nombre:
+	</text>
+	<text name="estate_name_text">
+		mainland
+	</text>
+	<text name="estate_owner_lbl">
+		Propietario:
+	</text>
+	<text name="estate_owner_text">
+		(nadie)
+	</text>
+	<text name="estate_cov_lbl">
+		Contrato:
+	</text>
+	<text name="covenant_timestamp_text">
+		Última modificación el miér. 31 de dic. de 1969, 16:00:00
+	</text>
+	<button label="?" name="covenant_help"/>
+	<text_editor bottom="-263" height="178" name="covenant_editor">
+		No se ha aportado un contrato para este estado.
+	</text_editor>
+	<button label="Cambiar" name="reset_covenant"/>
+	<text name="covenant_help_text">
+		Los cambios en el contrato se mostrarán en todas las parcelas 
+del estado.
+	</text>
+	<text bottom_delta="-31" name="covenant_instructions">
+		Arrastra y suelta una nota para cambiar el contrato de este estado.
+	</text>
+	<text name="region_section_lbl">
+		Región
+	</text>
+	<text name="region_name_lbl">
+		Nombre:
+	</text>
+	<text name="region_name_text">
+		leyla
+	</text>
+	<text name="region_landtype_lbl">
+		Tipo:
+	</text>
+	<text name="region_landtype_text">
+		Mainland / Homestead
+	</text>
+	<text name="region_maturity_lbl">
+		Calificación:
+	</text>
+	<text name="region_maturity_text">
+		Adulto
+	</text>
+	<text name="resellable_lbl">
+		Revender:
+	</text>
+	<text name="resellable_clause">
+		El terreno de esta región no se podrá revender.
+	</text>
+	<text name="changeable_lbl">
+		Dividir:
+	</text>
+	<text name="changeable_clause">
+		El terreno de esta región no se podrá unir/dividir.
+	</text>
+	<string name="can_resell">
+		El terreno comprado en esta región se podrá revender.
+	</string>
+	<string name="can_not_resell">
+		El terreno comprado en esta región no se podrá revender.
+	</string>
+	<string name="can_change">
+		El terreno comprado en esta región se podrá unir o 
+subdividir.
+	</string>
+	<string name="can_not_change">
+		El terreno comprado en esta región no se podrá unir ni
+subdividir.
+	</string>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_terrain.xml b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
index 903b826a0bed82fe766df4f4fceae6497f1b10cd..98b10e4895c8adc191e2c75a52513a6b079ca9e2 100644
--- a/indra/newview/skins/default/xui/es/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_terrain.xml
@@ -8,7 +8,7 @@
 	</text>
 	<spinner label="Nivel del agua" name="water_height_spin"/>
 	<button label="?" name="water_height_help"/>
-	<spinner label="Límite de elevación del &#10;terreno" name="terrain_raise_spin"/>
+	<spinner label="Límite de elevación &#10;del terreno" name="terrain_raise_spin"/>
 	<button label="?" name="terrain_raise_help"/>
 	<spinner label="Límite de bajada del &#10;terreno" name="terrain_lower_spin" bottom_delta="-34"/>
 	<button label="?" name="terrain_lower_help"/>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 75126e74c569a16fc8c1017a027667723e219bc6..e5fc33b48782f10ee0de74aa94af6b1207aec55b 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1,4343 +1,4346 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- This file contains strings that used to be hardcoded in the source.
-     It is only for those strings which do not belong in a floater.
-     For example, the strings used in avatar chat bubbles, and strings
-     that are returned from one component and may appear in many places-->
-<strings>
-	<string name="CAPITALIZED_APP_NAME">
-		SECOND LIFE
-	</string>
-	<string name="SUPPORT_SITE">
-		Portal de Soporte de Second Life
-	</string>
-	<string name="StartupDetectingHardware">
-		Identificando el hardware...
-	</string>
-	<string name="StartupLoading">
-		Instalando [APP_NAME]...
-	</string>
-	<string name="StartupClearingCache">
-		Limpiando la caché...
-	</string>
-	<string name="StartupInitializingTextureCache">
-		Iniciando la caché de las texturas...
-	</string>
-	<string name="StartupInitializingVFS">
-		Iniciando VFS...
-	</string>
-	<string name="ProgressRestoring">
-		Restaurando...
-	</string>
-	<string name="ProgressChangingResolution">
-		Cambiando la resolución...
-	</string>
-	<string name="LoginInProgress">
-		Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
-	</string>
-	<string name="LoginInProgressNoFrozen">
-		Iniciando la sesión...
-	</string>
-	<string name="LoginAuthenticating">
-		Autenticando
-	</string>
-	<string name="LoginMaintenance">
-		Realizando el mantenimiento de la cuenta...
-	</string>
-	<string name="LoginAttempt">
-		Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
-	</string>
-	<string name="LoginPrecaching">
-		Cargando el mundo...
-	</string>
-	<string name="LoginInitializingBrowser">
-		Iniciando el navegador web incorporado...
-	</string>
-	<string name="LoginInitializingMultimedia">
-		Iniciando multimedia...
-	</string>
-	<string name="LoginInitializingFonts">
-		Cargando las fuentes...
-	</string>
-	<string name="LoginVerifyingCache">
-		Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
-	</string>
-	<string name="LoginProcessingResponse">
-		Procesando la respuesta...
-	</string>
-	<string name="LoginInitializingWorld">
-		Iniciando el mundo...
-	</string>
-	<string name="LoginDecodingImages">
-		Decodificando las imágenes...
-	</string>
-	<string name="LoginInitializingQuicktime">
-		Iniciando QuickTime...
-	</string>
-	<string name="LoginQuicktimeNotFound">
-		No se ha encontrado QuickTime. Imposible iniciarlo.
-	</string>
-	<string name="LoginQuicktimeOK">
-		QuickTime se ha iniciado adecuadamente.
-	</string>
-	<string name="LoginWaitingForRegionHandshake">
-		Esperando la conexión con la región...
-	</string>
-	<string name="LoginConnectingToRegion">
-		Conectando con la región...
-	</string>
-	<string name="LoginDownloadingClothing">
-		Descargando la ropa...
-	</string>
-	<string name="InvalidCertificate">
-		El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
-	</string>
-	<string name="CertInvalidHostname">
-		El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
-	</string>
-	<string name="CertExpired">
-		Parece que el certificado que devolvió la cuadrícula está caducado.  Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
-	</string>
-	<string name="CertKeyUsage">
-		El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
-	</string>
-	<string name="CertBasicConstraints">
-		La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
-	</string>
-	<string name="CertInvalidSignature">
-		No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
-	</string>
-	<string name="LoginFailedNoNetwork">
-		Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
-	</string>
-	<string name="LoginFailed">
-		Error en el inicio de sesión.
-	</string>
-	<string name="Quit">
-		Salir
-	</string>
-	<string name="create_account_url">
-		http://join.secondlife.com/index.php?lang=es-ES
-	</string>
-	<string name="AgentLostConnection">
-		Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
-	</string>
-	<string name="SavingSettings">
-		Guardando tus configuraciones...
-	</string>
-	<string name="LoggingOut">
-		Cerrando sesión...
-	</string>
-	<string name="ShuttingDown">
-		Cerrando...
-	</string>
-	<string name="YouHaveBeenDisconnected">
-		Has sido desconectado de la región en la que estabas.
-	</string>
-	<string name="SentToInvalidRegion">
-		Has sido enviado a una región no válida.
-	</string>
-	<string name="TestingDisconnect">
-		Probando la desconexión del visor
-	</string>
-	<string name="TooltipPerson">
-		Persona
-	</string>
-	<string name="TooltipNoName">
-		(sin nombre)
-	</string>
-	<string name="TooltipOwner">
-		Propietario:
-	</string>
-	<string name="TooltipPublic">
-		Público
-	</string>
-	<string name="TooltipIsGroup">
-		(Grupo)
-	</string>
-	<string name="TooltipForSaleL$">
-		En venta: [AMOUNT] L$
-	</string>
-	<string name="TooltipFlagGroupBuild">
-		Construir el grupo
-	</string>
-	<string name="TooltipFlagNoBuild">
-		No construir
-	</string>
-	<string name="TooltipFlagNoEdit">
-		Construir el grupo
-	</string>
-	<string name="TooltipFlagNotSafe">
-		No seguro
-	</string>
-	<string name="TooltipFlagNoFly">
-		No volar
-	</string>
-	<string name="TooltipFlagGroupScripts">
-		Scripts el grupo
-	</string>
-	<string name="TooltipFlagNoScripts">
-		No scripts
-	</string>
-	<string name="TooltipLand">
-		Terreno:
-	</string>
-	<string name="TooltipMustSingleDrop">
-		Aquí se puede arrastrar sólo un ítem
-	</string>
-	<string name="TooltipPrice" value="[AMOUNT] L$:"/>
-	<string name="TooltipHttpUrl">
-		Pulsa para ver esta página web
-	</string>
-	<string name="TooltipSLURL">
-		Pulsa para ver la información de este lugar
-	</string>
-	<string name="TooltipAgentUrl">
-		Pulsa para ver el perfil del Residente
-	</string>
-	<string name="TooltipAgentInspect">
-		Obtén más información acerca de este residente.
-	</string>
-	<string name="TooltipAgentMute">
-		Pulsa para silenciar a este Residente
-	</string>
-	<string name="TooltipAgentUnmute">
-		Pulsa para quitar el silencio a este Residente
-	</string>
-	<string name="TooltipAgentIM">
-		Pulsa para enviar un MI a este Residente
-	</string>
-	<string name="TooltipAgentPay">
-		Pulsa para pagar a este Residente
-	</string>
-	<string name="TooltipAgentOfferTeleport">
-		Pulsa para enviar una petición de teleporte a este Residente
-	</string>
-	<string name="TooltipAgentRequestFriend">
-		Pulsa para enviar una petición de amistad a este Residente
-	</string>
-	<string name="TooltipGroupUrl">
-		Pulsa para ver la descripción de este grupo
-	</string>
-	<string name="TooltipEventUrl">
-		Pulsa para ver la descripción de este evento
-	</string>
-	<string name="TooltipClassifiedUrl">
-		Pulsa para ver este clasificado
-	</string>
-	<string name="TooltipParcelUrl">
-		Pulsa para ver la descripción de esta parcela
-	</string>
-	<string name="TooltipTeleportUrl">
-		Pulsa para teleportarte a esta posición
-	</string>
-	<string name="TooltipObjectIMUrl">
-		Pulsa para ver la descripción de este objeto
-	</string>
-	<string name="TooltipMapUrl">
-		Pulsa para ver en el mapa esta localización
-	</string>
-	<string name="TooltipSLAPP">
-		Pulsa para ejecutar el comando secondlife://
-	</string>
-	<string name="CurrentURL" value="URL actual: [CurrentURL]"/>
-	<string name="SLurlLabelTeleport">
-		Teleportarse a
-	</string>
-	<string name="SLurlLabelShowOnMap">
-		Mostrarla en el mapa
-	</string>
-	<string name="SLappAgentMute">
-		Silenciar
-	</string>
-	<string name="SLappAgentUnmute">
-		Quitar el silencio
-	</string>
-	<string name="SLappAgentIM">
-		MI
-	</string>
-	<string name="SLappAgentPay">
-		Pagar
-	</string>
-	<string name="SLappAgentOfferTeleport">
-		Ofrecer teleporte a
-	</string>
-	<string name="SLappAgentRequestFriend">
-		Petición de amistad
-	</string>
-	<string name="BUTTON_CLOSE_DARWIN">
-		Cerrar (⌘W)
-	</string>
-	<string name="BUTTON_CLOSE_WIN">
-		Cerrar (Ctrl+W)
-	</string>
-	<string name="BUTTON_CLOSE_CHROME">
-		Cerrar
-	</string>
-	<string name="BUTTON_RESTORE">
-		Maximizar
-	</string>
-	<string name="BUTTON_MINIMIZE">
-		Minimizar
-	</string>
-	<string name="BUTTON_TEAR_OFF">
-		Separar la ventana
-	</string>
-	<string name="BUTTON_DOCK">
-		Fijar
-	</string>
-	<string name="BUTTON_HELP">
-		Ver la Ayuda
-	</string>
-	<string name="Searching">
-		Buscando...
-	</string>
-	<string name="NoneFound">
-		No se ha encontrado.
-	</string>
-	<string name="RetrievingData">
-		Reintentando...
-	</string>
-	<string name="ReleaseNotes">
-		Notas de la versión
-	</string>
-	<string name="RELEASE_NOTES_BASE_URL">
-		http://wiki.secondlife.com/wiki/Release_Notes/
-	</string>
-	<string name="LoadingData">
-		Cargando...
-	</string>
-	<string name="AvatarNameNobody">
-		(nadie)
-	</string>
-	<string name="AvatarNameWaiting">
-		(esperando)
-	</string>
-	<string name="GroupNameNone">
-		(ninguno)
-	</string>
-	<string name="AvalineCaller">
-		Avaline: [ORDER]
-	</string>
-	<string name="AssetErrorNone">
-		No hay ningún error
-	</string>
-	<string name="AssetErrorRequestFailed">
-		Petición de asset: fallida
-	</string>
-	<string name="AssetErrorNonexistentFile">
-		Petición de asset: el archivo no existe
-	</string>
-	<string name="AssetErrorNotInDatabase">
-		Petición de asset: no se encontró el asset en la base de datos
-	</string>
-	<string name="AssetErrorEOF">
-		Fin del archivo
-	</string>
-	<string name="AssetErrorCannotOpenFile">
-		No puede abrirse el archivo
-	</string>
-	<string name="AssetErrorFileNotFound">
-		No se ha encontrado el archivo
-	</string>
-	<string name="AssetErrorTCPTimeout">
-		Tiempo de transferencia del archivo
-	</string>
-	<string name="AssetErrorCircuitGone">
-		Circuito desconectado
-	</string>
-	<string name="AssetErrorPriceMismatch">
-		No concuerda el precio en el visor y en el servidor
-	</string>
-	<string name="AssetErrorUnknownStatus">
-		Estado desconocido
-	</string>
-	<string name="texture">
-		la textura
-	</string>
-	<string name="sound">
-		el sonido
-	</string>
-	<string name="calling card">
-		la tarjeta de visita
-	</string>
-	<string name="landmark">
-		el hito
-	</string>
-	<string name="legacy script">
-		el script antiguo
-	</string>
-	<string name="clothing">
-		esa ropa
-	</string>
-	<string name="object">
-		el objeto
-	</string>
-	<string name="note card">
-		la nota
-	</string>
-	<string name="folder">
-		la carpeta
-	</string>
-	<string name="root">
-		la ruta
-	</string>
-	<string name="lsl2 script">
-		ese script de LSL2
-	</string>
-	<string name="lsl bytecode">
-		el código intermedio de LSL
-	</string>
-	<string name="tga texture">
-		esa textura tga
-	</string>
-	<string name="body part">
-		esa parte del cuerpo
-	</string>
-	<string name="snapshot">
-		la foto
-	</string>
-	<string name="lost and found">
-		Objetos Perdidos
-	</string>
-	<string name="targa image">
-		esa imagen targa
-	</string>
-	<string name="trash">
-		la Papelera
-	</string>
-	<string name="jpeg image">
-		esa imagen jpeg
-	</string>
-	<string name="animation">
-		la animación
-	</string>
-	<string name="gesture">
-		el gesto
-	</string>
-	<string name="simstate">
-		simstate
-	</string>
-	<string name="favorite">
-		ese favorito
-	</string>
-	<string name="symbolic link">
-		el enlace
-	</string>
-	<string name="symbolic folder link">
-		enlace de la carpeta
-	</string>
-	<string name="AvatarAway">
-		Ausente
-	</string>
-	<string name="AvatarBusy">
-		Ocupado
-	</string>
-	<string name="AvatarMuted">
-		Ignorado
-	</string>
-	<string name="anim_express_afraid">
-		Susto
-	</string>
-	<string name="anim_express_anger">
-		Enfado
-	</string>
-	<string name="anim_away">
-		Ausente
-	</string>
-	<string name="anim_backflip">
-		Salto mortal atrás
-	</string>
-	<string name="anim_express_laugh">
-		Carcajada
-	</string>
-	<string name="anim_express_toothsmile">
-		Gran sonrisa
-	</string>
-	<string name="anim_blowkiss">
-		Mandar un beso
-	</string>
-	<string name="anim_express_bored">
-		Aburrimiento
-	</string>
-	<string name="anim_bow">
-		Reverencia
-	</string>
-	<string name="anim_clap">
-		Aplauso
-	</string>
-	<string name="anim_courtbow">
-		Reverencia floreada
-	</string>
-	<string name="anim_express_cry">
-		Llanto
-	</string>
-	<string name="anim_dance1">
-		Baile 1
-	</string>
-	<string name="anim_dance2">
-		Baile 2
-	</string>
-	<string name="anim_dance3">
-		Baile 3
-	</string>
-	<string name="anim_dance4">
-		Baile 4
-	</string>
-	<string name="anim_dance5">
-		Baile 5
-	</string>
-	<string name="anim_dance6">
-		Baile 6
-	</string>
-	<string name="anim_dance7">
-		Baile 7
-	</string>
-	<string name="anim_dance8">
-		Baile 8
-	</string>
-	<string name="anim_express_disdain">
-		Desdén
-	</string>
-	<string name="anim_drink">
-		Beber
-	</string>
-	<string name="anim_express_embarrased">
-		Azorarse
-	</string>
-	<string name="anim_angry_fingerwag">
-		Negar con el dedo
-	</string>
-	<string name="anim_fist_pump">
-		Éxito con el puño
-	</string>
-	<string name="anim_yoga_float">
-		Yoga flotando
-	</string>
-	<string name="anim_express_frown">
-		Fruncir el ceño
-	</string>
-	<string name="anim_impatient">
-		Impaciente
-	</string>
-	<string name="anim_jumpforjoy">
-		Salto de alegría
-	</string>
-	<string name="anim_kissmybutt">
-		Bésame el culo
-	</string>
-	<string name="anim_express_kiss">
-		Besar
-	</string>
-	<string name="anim_laugh_short">
-		Reír
-	</string>
-	<string name="anim_musclebeach">
-		Sacar músculo
-	</string>
-	<string name="anim_no_unhappy">
-		No (con enfado)
-	</string>
-	<string name="anim_no_head">
-		No
-	</string>
-	<string name="anim_nyanya">
-		Ña-Ña-Ña
-	</string>
-	<string name="anim_punch_onetwo">
-		Puñetazo uno-dos
-	</string>
-	<string name="anim_express_open_mouth">
-		Abrir la boca
-	</string>
-	<string name="anim_peace">
-		&apos;V&apos; con los dedos
-	</string>
-	<string name="anim_point_you">
-		Señalar a otro/a
-	</string>
-	<string name="anim_point_me">
-		Señalarse
-	</string>
-	<string name="anim_punch_l">
-		Puñetazo izquierdo
-	</string>
-	<string name="anim_punch_r">
-		Puñetazo derecho
-	</string>
-	<string name="anim_rps_countdown">
-		PPT cuenta
-	</string>
-	<string name="anim_rps_paper">
-		PPT papel
-	</string>
-	<string name="anim_rps_rock">
-		PPT piedra
-	</string>
-	<string name="anim_rps_scissors">
-		PPT tijera
-	</string>
-	<string name="anim_express_repulsed">
-		Repulsa
-	</string>
-	<string name="anim_kick_roundhouse_r">
-		Patada circular
-	</string>
-	<string name="anim_express_sad">
-		Triste
-	</string>
-	<string name="anim_salute">
-		Saludo militar
-	</string>
-	<string name="anim_shout">
-		Gritar
-	</string>
-	<string name="anim_express_shrug">
-		Encogerse de hombros
-	</string>
-	<string name="anim_express_smile">
-		Sonreír
-	</string>
-	<string name="anim_smoke_idle">
-		Fumar: en la mano
-	</string>
-	<string name="anim_smoke_inhale">
-		Fumar
-	</string>
-	<string name="anim_smoke_throw_down">
-		Fumar: tirar el cigarro
-	</string>
-	<string name="anim_express_surprise">
-		Sorpresa
-	</string>
-	<string name="anim_sword_strike_r">
-		Estocadas
-	</string>
-	<string name="anim_angry_tantrum">
-		Berrinche
-	</string>
-	<string name="anim_express_tongue_out">
-		Sacar la lengua
-	</string>
-	<string name="anim_hello">
-		Agitar la mano
-	</string>
-	<string name="anim_whisper">
-		Cuchichear
-	</string>
-	<string name="anim_whistle">
-		Pitar
-	</string>
-	<string name="anim_express_wink">
-		Guiño
-	</string>
-	<string name="anim_wink_hollywood">
-		Guiño (Hollywood)
-	</string>
-	<string name="anim_express_worry">
-		Preocuparse
-	</string>
-	<string name="anim_yes_happy">
-		Sí (contento)
-	</string>
-	<string name="anim_yes_head">
-		Sí
-	</string>
-	<string name="texture_loading">
-		Cargando...
-	</string>
-	<string name="worldmap_offline">
-		Sin conexión
-	</string>
-	<string name="worldmap_item_tooltip_format">
-		[PRICE] L$ por [AREA] m²
-	</string>
-	<string name="worldmap_results_none_found">
-		No se ha encontrado.
-	</string>
-	<string name="Ok">
-		OK
-	</string>
-	<string name="Premature end of file">
-		Fin prematuro del archivo
-	</string>
-	<string name="ST_NO_JOINT">
-		No se puede encontrar ROOT o JOINT.
-	</string>
-	<string name="whisper">
-		susurra:
-	</string>
-	<string name="shout">
-		grita:
-	</string>
-	<string name="ringing">
-		Conectando al chat de voz...
-	</string>
-	<string name="connected">
-		Conectado
-	</string>
-	<string name="unavailable">
-		La voz no está disponible en su localización actual
-	</string>
-	<string name="hang_up">
-		Desconectado del chat de voz
-	</string>
-	<string name="reconnect_nearby">
-		Vas a ser reconectado al chat de voz con los cercanos
-	</string>
-	<string name="ScriptQuestionCautionChatGranted">
-		&apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
-	</string>
-	<string name="ScriptQuestionCautionChatDenied">
-		A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
-	</string>
-	<string name="ScriptTakeMoney">
-		Cogerle a usted dólares Linden (L$)
-	</string>
-	<string name="ActOnControlInputs">
-		Actuar en sus controles de entrada
-	</string>
-	<string name="RemapControlInputs">
-		Reconfigurar sus controles de entrada
-	</string>
-	<string name="AnimateYourAvatar">
-		Ejecutar animaciones en su avatar
-	</string>
-	<string name="AttachToYourAvatar">
-		Anexarse a su avatar
-	</string>
-	<string name="ReleaseOwnership">
-		Anular la propiedad y que pase a ser público
-	</string>
-	<string name="LinkAndDelink">
-		Enlazar y desenlazar de otros objetos
-	</string>
-	<string name="AddAndRemoveJoints">
-		Añadir y quitar uniones con otros objetos
-	</string>
-	<string name="ChangePermissions">
-		Cambiar sus permisos
-	</string>
-	<string name="TrackYourCamera">
-		Seguir su cámara
-	</string>
-	<string name="ControlYourCamera">
-		Controlar su cámara
-	</string>
-	<string name="SIM_ACCESS_PG">
-		&apos;PG&apos;
-	</string>
-	<string name="SIM_ACCESS_MATURE">
-		&apos;Mature&apos;
-	</string>
-	<string name="SIM_ACCESS_ADULT">
-		&apos;Adult&apos;
-	</string>
-	<string name="SIM_ACCESS_DOWN">
-		Desconectado
-	</string>
-	<string name="SIM_ACCESS_MIN">
-		Desconocido
-	</string>
-	<string name="land_type_unknown">
-		(desconocido)
-	</string>
-	<string name="Estate / Full Region">
-		Estado /Región completa
-	</string>
-	<string name="Estate / Homestead">
-		Estado / Homestead
-	</string>
-	<string name="Mainland / Homestead">
-		Continente / Homestead
-	</string>
-	<string name="Mainland / Full Region">
-		Continente / Región completa
-	</string>
-	<string name="all_files">
-		Todos los archivos
-	</string>
-	<string name="sound_files">
-		Sonidos
-	</string>
-	<string name="animation_files">
-		Animaciones
-	</string>
-	<string name="image_files">
-		Imágenes
-	</string>
-	<string name="save_file_verb">
-		Guardar
-	</string>
-	<string name="load_file_verb">
-		Cargar
-	</string>
-	<string name="targa_image_files">
-		Imágenes Targa
-	</string>
-	<string name="bitmap_image_files">
-		Imágenes de mapa de bits
-	</string>
-	<string name="avi_movie_file">
-		Archivo de película AVI
-	</string>
-	<string name="xaf_animation_file">
-		Archivo de anim. XAF
-	</string>
-	<string name="xml_file">
-		Archivo XML
-	</string>
-	<string name="raw_file">
-		Archivo RAW
-	</string>
-	<string name="compressed_image_files">
-		Imágenes comprimidas
-	</string>
-	<string name="load_files">
-		Cargar archivos
-	</string>
-	<string name="choose_the_directory">
-		Elegir directorio
-	</string>
-	<string name="AvatarSetNotAway">
-		Salir del estado ausente
-	</string>
-	<string name="AvatarSetAway">
-		Pasar al estado ausente
-	</string>
-	<string name="AvatarSetNotBusy">
-		Salir del estado ocupado
-	</string>
-	<string name="AvatarSetBusy">
-		Pasar al estado ocupado
-	</string>
-	<string name="shape">
-		Forma
-	</string>
-	<string name="skin">
-		Piel
-	</string>
-	<string name="hair">
-		Pelo
-	</string>
-	<string name="eyes">
-		Ojos
-	</string>
-	<string name="shirt">
-		Camisa
-	</string>
-	<string name="pants">
-		Pantalón
-	</string>
-	<string name="shoes">
-		Zapatos
-	</string>
-	<string name="socks">
-		Calcetines
-	</string>
-	<string name="jacket">
-		Chaqueta
-	</string>
-	<string name="gloves">
-		Guantes
-	</string>
-	<string name="undershirt">
-		Camiseta
-	</string>
-	<string name="underpants">
-		Ropa interior
-	</string>
-	<string name="skirt">
-		Falda
-	</string>
-	<string name="alpha">
-		Alfa
-	</string>
-	<string name="tattoo">
-		Tatuaje
-	</string>
-	<string name="physics">
-		Física
-	</string>
-	<string name="invalid">
-		inválido/a
-	</string>
-	<string name="none">
-		ninguno
-	</string>
-	<string name="shirt_not_worn">
-		Camisa no puesta
-	</string>
-	<string name="pants_not_worn">
-		Pantalones no puestos
-	</string>
-	<string name="shoes_not_worn">
-		Zapatos no puestos
-	</string>
-	<string name="socks_not_worn">
-		Calcetines no puestos
-	</string>
-	<string name="jacket_not_worn">
-		Chaqueta no puesta
-	</string>
-	<string name="gloves_not_worn">
-		Guantes no puestos
-	</string>
-	<string name="undershirt_not_worn">
-		Camiseta no puesta
-	</string>
-	<string name="underpants_not_worn">
-		Ropa interior no puesta
-	</string>
-	<string name="skirt_not_worn">
-		Falda no puesta
-	</string>
-	<string name="alpha_not_worn">
-		Alfa no puesta
-	</string>
-	<string name="tattoo_not_worn">
-		Tatuaje no puesto
-	</string>
-	<string name="physics_not_worn">
-		Física no puesta
-	</string>
-	<string name="invalid_not_worn">
-		no válido/a
-	</string>
-	<string name="create_new_shape">
-		Crear una anatomía nueva
-	</string>
-	<string name="create_new_skin">
-		Crear una piel nueva
-	</string>
-	<string name="create_new_hair">
-		Crear pelo nuevo
-	</string>
-	<string name="create_new_eyes">
-		Crear ojos nuevos
-	</string>
-	<string name="create_new_shirt">
-		Crear una camisa nueva
-	</string>
-	<string name="create_new_pants">
-		Crear unos pantalones nuevos
-	</string>
-	<string name="create_new_shoes">
-		Crear unos zapatos nuevos
-	</string>
-	<string name="create_new_socks">
-		Crear unos calcetines nuevos
-	</string>
-	<string name="create_new_jacket">
-		Crear una chaqueta nueva
-	</string>
-	<string name="create_new_gloves">
-		Crear unos guantes nuevos
-	</string>
-	<string name="create_new_undershirt">
-		Crear una camiseta nueva
-	</string>
-	<string name="create_new_underpants">
-		Crear ropa interior nueva
-	</string>
-	<string name="create_new_skirt">
-		Crear una falda nueva
-	</string>
-	<string name="create_new_alpha">
-		Crear una capa alfa nueva
-	</string>
-	<string name="create_new_tattoo">
-		Crear un tatuaje nuevo
-	</string>
-	<string name="create_new_physics">
-		Crear nueva física
-	</string>
-	<string name="create_new_invalid">
-		no válido/a
-	</string>
-	<string name="NewWearable">
-		Nuevo [WEARABLE_ITEM]
-	</string>
-	<string name="next">
-		Siguiente
-	</string>
-	<string name="ok">
-		OK
-	</string>
-	<string name="GroupNotifyGroupNotice">
-		Aviso de grupo
-	</string>
-	<string name="GroupNotifyGroupNotices">
-		Avisos del grupo
-	</string>
-	<string name="GroupNotifySentBy">
-		Enviado por
-	</string>
-	<string name="GroupNotifyAttached">
-		Adjunto:
-	</string>
-	<string name="GroupNotifyViewPastNotices">
-		Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
-	</string>
-	<string name="GroupNotifyOpenAttachment">
-		Abrir el adjunto
-	</string>
-	<string name="GroupNotifySaveAttachment">
-		Guardar el adjunto
-	</string>
-	<string name="TeleportOffer">
-		Ofrecimiento de teleporte
-	</string>
-	<string name="StartUpNotifications">
-		Llegaron avisos nuevos mientras estabas ausente...
-	</string>
-	<string name="OverflowInfoChannelString">
-		Tienes [%d] aviso/s más
-	</string>
-	<string name="BodyPartsRightArm">
-		Brazo der.
-	</string>
-	<string name="BodyPartsHead">
-		Cabeza
-	</string>
-	<string name="BodyPartsLeftArm">
-		Brazo izq.
-	</string>
-	<string name="BodyPartsLeftLeg">
-		Pierna izq.
-	</string>
-	<string name="BodyPartsTorso">
-		Torso
-	</string>
-	<string name="BodyPartsRightLeg">
-		Pierna der.
-	</string>
-	<string name="GraphicsQualityLow">
-		Bajo
-	</string>
-	<string name="GraphicsQualityMid">
-		Medio
-	</string>
-	<string name="GraphicsQualityHigh">
-		Alto
-	</string>
-	<string name="LeaveMouselook">
-		Pulsa ESC para salir de la vista subjetiva
-	</string>
-	<string name="InventoryNoMatchingItems">
-		¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
-	</string>
-	<string name="PlacesNoMatchingItems">
-		¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
-	</string>
-	<string name="FavoritesNoMatchingItems">
-		Arrastra aquí un hito para tenerlo en tus favoritos.
-	</string>
-	<string name="InventoryNoTexture">
-		No tienes en tu inventario una copia de esta textura
-	</string>
-	<string name="no_transfer" value="(no transferible)"/>
-	<string name="no_modify" value="(no modificable)"/>
-	<string name="no_copy" value="(no copiable)"/>
-	<string name="worn" value="(puesto)"/>
-	<string name="link" value="(enlace)"/>
-	<string name="broken_link" value="(enlace roto)&quot;"/>
-	<string name="LoadingContents">
-		Cargando el contenido...
-	</string>
-	<string name="NoContents">
-		No hay contenido
-	</string>
-	<string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
-	<string name="ActiveGesture" value="[GESLABEL] (activo)"/>
-	<string name="Chat Message" value="Chat:"/>
-	<string name="Sound" value="Sonido :"/>
-	<string name="Wait" value="--- Espera :"/>
-	<string name="AnimFlagStop" value="Parar la animación:"/>
-	<string name="AnimFlagStart" value="Empezar la animación:"/>
-	<string name="Wave" value="Onda"/>
-	<string name="GestureActionNone" value="Ninguno"/>
-	<string name="HelloAvatar" value="¡Hola, avatar!"/>
-	<string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
-	<string name="GetMoreGestures" value="Obtener más &gt;&gt;"/>
-	<string name="Animations" value="Animaciones,"/>
-	<string name="Calling Cards" value="Tarjetas de visita,"/>
-	<string name="Clothing" value="Ropa,"/>
-	<string name="Gestures" value="Gestos,"/>
-	<string name="Landmarks" value="Hitos,"/>
-	<string name="Notecards" value="Notas,"/>
-	<string name="Objects" value="Objetos,"/>
-	<string name="Scripts" value="Scripts,"/>
-	<string name="Sounds" value="Sonidos,"/>
-	<string name="Textures" value="Texturas,"/>
-	<string name="Snapshots" value="Fotos,"/>
-	<string name="No Filters" value="No"/>
-	<string name="Since Logoff" value="- Desde la desconexión"/>
-	<string name="InvFolder My Inventory">
-		Mi Inventario
-	</string>
-	<string name="InvFolder My Favorites">
-		Mis Favoritos
-	</string>
-	<string name="InvFolder Library">
-		Biblioteca
-	</string>
-	<string name="InvFolder Textures">
-		Texturas
-	</string>
-	<string name="InvFolder Sounds">
-		Sonidos
-	</string>
-	<string name="InvFolder Calling Cards">
-		Tarjetas de visita
-	</string>
-	<string name="InvFolder Landmarks">
-		Hitos
-	</string>
-	<string name="InvFolder Scripts">
-		Scripts
-	</string>
-	<string name="InvFolder Clothing">
-		Ropa
-	</string>
-	<string name="InvFolder Objects">
-		Objetos
-	</string>
-	<string name="InvFolder Notecards">
-		Notas
-	</string>
-	<string name="InvFolder New Folder">
-		Carpeta nueva
-	</string>
-	<string name="InvFolder Inventory">
-		Inventario
-	</string>
-	<string name="InvFolder Uncompressed Images">
-		Imágenes sin comprimir
-	</string>
-	<string name="InvFolder Body Parts">
-		Partes del cuerpo
-	</string>
-	<string name="InvFolder Trash">
-		Papelera
-	</string>
-	<string name="InvFolder Photo Album">
-		Álbum de fotos
-	</string>
-	<string name="InvFolder Lost And Found">
-		Objetos Perdidos
-	</string>
-	<string name="InvFolder Uncompressed Sounds">
-		Sonidos sin comprimir
-	</string>
-	<string name="InvFolder Animations">
-		Animaciones
-	</string>
-	<string name="InvFolder Gestures">
-		Gestos
-	</string>
-	<string name="InvFolder Favorite">
-		Favoritos
-	</string>
-	<string name="InvFolder favorite">
-		Favoritos
-	</string>
-	<string name="InvFolder Current Outfit">
-		Vestuario actual
-	</string>
-	<string name="InvFolder Initial Outfits">
-		Vestuario inicial
-	</string>
-	<string name="InvFolder My Outfits">
-		Mis vestuarios
-	</string>
-	<string name="InvFolder Accessories">
-		Accesorios
-	</string>
-	<string name="InvFolder Friends">
-		Amigos
-	</string>
-	<string name="InvFolder All">
-		Todas
-	</string>
-	<string name="Buy">
-		Comprar
-	</string>
-	<string name="BuyforL$">
-		Comprar por L$
-	</string>
-	<string name="Stone">
-		Piedra
-	</string>
-	<string name="Metal">
-		Metal
-	</string>
-	<string name="Glass">
-		Cristal
-	</string>
-	<string name="Wood">
-		Madera
-	</string>
-	<string name="Flesh">
-		Carne
-	</string>
-	<string name="Plastic">
-		Plástico
-	</string>
-	<string name="Rubber">
-		Goma
-	</string>
-	<string name="Light">
-		Claridad
-	</string>
-	<string name="KBShift">
-		Mayúsculas
-	</string>
-	<string name="KBCtrl">
-		Ctrl
-	</string>
-	<string name="Chest">
-		Tórax
-	</string>
-	<string name="Skull">
-		Cráneo
-	</string>
-	<string name="Left Shoulder">
-		Hombro izquierdo
-	</string>
-	<string name="Right Shoulder">
-		Hombro derecho
-	</string>
-	<string name="Left Hand">
-		Mano izq.
-	</string>
-	<string name="Right Hand">
-		Mano der.
-	</string>
-	<string name="Left Foot">
-		Pie izq.
-	</string>
-	<string name="Right Foot">
-		Pie der.
-	</string>
-	<string name="Spine">
-		Columna
-	</string>
-	<string name="Pelvis">
-		Pelvis
-	</string>
-	<string name="Mouth">
-		Boca
-	</string>
-	<string name="Chin">
-		Barbilla
-	</string>
-	<string name="Left Ear">
-		Oreja izq.
-	</string>
-	<string name="Right Ear">
-		Oreja der.
-	</string>
-	<string name="Left Eyeball">
-		Ojo izq.
-	</string>
-	<string name="Right Eyeball">
-		Ojo der.
-	</string>
-	<string name="Nose">
-		Nariz
-	</string>
-	<string name="R Upper Arm">
-		Brazo der.
-	</string>
-	<string name="R Forearm">
-		Antebrazo der.
-	</string>
-	<string name="L Upper Arm">
-		Brazo izq.
-	</string>
-	<string name="L Forearm">
-		Antebrazo izq.
-	</string>
-	<string name="Right Hip">
-		Cadera der.
-	</string>
-	<string name="R Upper Leg">
-		Muslo der.
-	</string>
-	<string name="R Lower Leg">
-		Pantorrilla der.
-	</string>
-	<string name="Left Hip">
-		Cadera izq.
-	</string>
-	<string name="L Upper Leg">
-		Muslo izq.
-	</string>
-	<string name="L Lower Leg">
-		Pantorrilla izq.
-	</string>
-	<string name="Stomach">
-		Abdomen
-	</string>
-	<string name="Left Pec">
-		Pecho izquierdo
-	</string>
-	<string name="Right Pec">
-		Pecho derecho
-	</string>
-	<string name="Invalid Attachment">
-		Punto de colocación no válido
-	</string>
-	<string name="YearsMonthsOld">
-		[AGEYEARS] [AGEMONTHS] de edad
-	</string>
-	<string name="YearsOld">
-		[AGEYEARS] de edad
-	</string>
-	<string name="MonthsOld">
-		[AGEMONTHS] de edad
-	</string>
-	<string name="WeeksOld">
-		[AGEWEEKS] de edad
-	</string>
-	<string name="DaysOld">
-		[AGEDAYS] de edad
-	</string>
-	<string name="TodayOld">
-		Registrado hoy
-	</string>
-	<string name="AgeYearsA">
-		[COUNT] año
-	</string>
-	<string name="AgeYearsB">
-		[COUNT] años
-	</string>
-	<string name="AgeYearsC">
-		[COUNT] años
-	</string>
-	<string name="AgeMonthsA">
-		[COUNT] mes
-	</string>
-	<string name="AgeMonthsB">
-		[COUNT] meses
-	</string>
-	<string name="AgeMonthsC">
-		[COUNT] meses
-	</string>
-	<string name="AgeWeeksA">
-		[COUNT] semana
-	</string>
-	<string name="AgeWeeksB">
-		[COUNT] semanas
-	</string>
-	<string name="AgeWeeksC">
-		[COUNT] semanas
-	</string>
-	<string name="AgeDaysA">
-		[COUNT] día
-	</string>
-	<string name="AgeDaysB">
-		[COUNT] días
-	</string>
-	<string name="AgeDaysC">
-		[COUNT] días
-	</string>
-	<string name="GroupMembersA">
-		[COUNT] miembro
-	</string>
-	<string name="GroupMembersB">
-		[COUNT] miembros
-	</string>
-	<string name="GroupMembersC">
-		[COUNT] miembros
-	</string>
-	<string name="AcctTypeResident">
-		Residente
-	</string>
-	<string name="AcctTypeTrial">
-		Prueba
-	</string>
-	<string name="AcctTypeCharterMember">
-		Miembro fundador
-	</string>
-	<string name="AcctTypeEmployee">
-		Empleado de Linden Lab
-	</string>
-	<string name="PaymentInfoUsed">
-		Ha usado información sobre la forma de pago
-	</string>
-	<string name="PaymentInfoOnFile">
-		Hay información archivada sobre la forma de pago
-	</string>
-	<string name="NoPaymentInfoOnFile">
-		No hay información archivada sobre la forma de pago
-	</string>
-	<string name="AgeVerified">
-		Edad verificada
-	</string>
-	<string name="NotAgeVerified">
-		Edad no verificada
-	</string>
-	<string name="Center 2">
-		Centro 2
-	</string>
-	<string name="Top Right">
-		Arriba der.
-	</string>
-	<string name="Top">
-		Arriba
-	</string>
-	<string name="Top Left">
-		Arriba izq.
-	</string>
-	<string name="Center">
-		Centro
-	</string>
-	<string name="Bottom Left">
-		Abajo izq.
-	</string>
-	<string name="Bottom">
-		Abajo
-	</string>
-	<string name="Bottom Right">
-		Abajo der.
-	</string>
-	<string name="CompileQueueDownloadedCompiling">
-		Descargado, compilándolo
-	</string>
-	<string name="CompileQueueScriptNotFound">
-		No se encuentra el script en el servidor.
-	</string>
-	<string name="CompileQueueProblemDownloading">
-		Problema al descargar
-	</string>
-	<string name="CompileQueueInsufficientPermDownload">
-		Permisos insuficientes para descargar un script.
-	</string>
-	<string name="CompileQueueInsufficientPermFor">
-		Permisos insuficientes para
-	</string>
-	<string name="CompileQueueUnknownFailure">
-		Fallo desconocido en la descarga
-	</string>
-	<string name="CompileQueueTitle">
-		Recompilando
-	</string>
-	<string name="CompileQueueStart">
-		recompilar
-	</string>
-	<string name="ResetQueueTitle">
-		Progreso del reinicio
-	</string>
-	<string name="ResetQueueStart">
-		restaurar
-	</string>
-	<string name="RunQueueTitle">
-		Configurar según se ejecuta
-	</string>
-	<string name="RunQueueStart">
-		Configurando según se ejecuta
-	</string>
-	<string name="NotRunQueueTitle">
-		Configurar sin ejecutar
-	</string>
-	<string name="NotRunQueueStart">
-		Configurando sin ejecutarlo
-	</string>
-	<string name="CompileSuccessful">
-		¡Compilación correcta!
-	</string>
-	<string name="CompileSuccessfulSaving">
-		Compilación correcta, guardando...
-	</string>
-	<string name="SaveComplete">
-		Guardado.
-	</string>
-	<string name="ObjectOutOfRange">
-		Script (objeto fuera de rango)
-	</string>
-	<string name="GodToolsObjectOwnedBy">
-		El objeto [OBJECT] es propiedad de [OWNER]
-	</string>
-	<string name="GroupsNone">
-		ninguno
-	</string>
-	<string name="Group" value="(grupo)"/>
-	<string name="Unknown">
-		(Desconocido)
-	</string>
-	<string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
-	<string name="NextStipendDay" value="El próximo día de pago es el"/>
-	<string name="GroupIndividualShare" value="Grupo       Aportaciones individuales"/>
-	<string name="GroupColumn" value="Grupo"/>
-	<string name="Balance">
-		Saldo
-	</string>
-	<string name="Credits">
-		Créditos
-	</string>
-	<string name="Debits">
-		Débitos
-	</string>
-	<string name="Total">
-		Total
-	</string>
-	<string name="NoGroupDataFound">
-		No se encontraron datos del grupo
-	</string>
-	<string name="IMParentEstate">
-		parent estate
-	</string>
-	<string name="IMMainland">
-		continente
-	</string>
-	<string name="IMTeen">
-		teen
-	</string>
-	<string name="RegionInfoError">
-		error
-	</string>
-	<string name="RegionInfoAllEstatesOwnedBy">
-		todos los estados propiedad de [OWNER]
-	</string>
-	<string name="RegionInfoAllEstatesYouOwn">
-		todos los estados que posees
-	</string>
-	<string name="RegionInfoAllEstatesYouManage">
-		todos los estados que administras para [OWNER]
-	</string>
-	<string name="RegionInfoAllowedResidents">
-		Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
-	</string>
-	<string name="RegionInfoAllowedGroups">
-		Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
-	</string>
-	<string name="ScriptLimitsParcelScriptMemory">
-		Memoria de los scripts de la parcela
-	</string>
-	<string name="ScriptLimitsParcelsOwned">
-		Parcelas listadas: [PARCELS]
-	</string>
-	<string name="ScriptLimitsMemoryUsed">
-		Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
-	</string>
-	<string name="ScriptLimitsMemoryUsedSimple">
-		Memoria usada: [COUNT] kb
-	</string>
-	<string name="ScriptLimitsParcelScriptURLs">
-		URLs de los scripts de la parcela
-	</string>
-	<string name="ScriptLimitsURLsUsed">
-		URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
-	</string>
-	<string name="ScriptLimitsURLsUsedSimple">
-		URLs usadas: [COUNT]
-	</string>
-	<string name="ScriptLimitsRequestError">
-		Error al obtener la información
-	</string>
-	<string name="ScriptLimitsRequestNoParcelSelected">
-		No hay una parcela seleccionada
-	</string>
-	<string name="ScriptLimitsRequestWrongRegion">
-		Error: la información del script sólo está disponible en tu región actual
-	</string>
-	<string name="ScriptLimitsRequestWaiting">
-		Obteniendo la información...
-	</string>
-	<string name="ScriptLimitsRequestDontOwnParcel">
-		No tienes permiso para examinar esta parcela
-	</string>
-	<string name="SITTING_ON">
-		Sentado en
-	</string>
-	<string name="ATTACH_CHEST">
-		Tórax
-	</string>
-	<string name="ATTACH_HEAD">
-		Cabeza
-	</string>
-	<string name="ATTACH_LSHOULDER">
-		Hombro izquierdo
-	</string>
-	<string name="ATTACH_RSHOULDER">
-		Hombro derecho
-	</string>
-	<string name="ATTACH_LHAND">
-		Mano izq.
-	</string>
-	<string name="ATTACH_RHAND">
-		Mano der.
-	</string>
-	<string name="ATTACH_LFOOT">
-		Pie izq.
-	</string>
-	<string name="ATTACH_RFOOT">
-		Pie der.
-	</string>
-	<string name="ATTACH_BACK">
-		Anterior
-	</string>
-	<string name="ATTACH_PELVIS">
-		Pelvis
-	</string>
-	<string name="ATTACH_MOUTH">
-		Boca
-	</string>
-	<string name="ATTACH_CHIN">
-		Barbilla
-	</string>
-	<string name="ATTACH_LEAR">
-		Oreja izq.
-	</string>
-	<string name="ATTACH_REAR">
-		Oreja der.
-	</string>
-	<string name="ATTACH_LEYE">
-		Ojo izq.
-	</string>
-	<string name="ATTACH_REYE">
-		Ojo der.
-	</string>
-	<string name="ATTACH_NOSE">
-		Nariz
-	</string>
-	<string name="ATTACH_RUARM">
-		Brazo der.
-	</string>
-	<string name="ATTACH_RLARM">
-		Antebrazo der.
-	</string>
-	<string name="ATTACH_LUARM">
-		Brazo izq.
-	</string>
-	<string name="ATTACH_LLARM">
-		Antebrazo izq.
-	</string>
-	<string name="ATTACH_RHIP">
-		Cadera der.
-	</string>
-	<string name="ATTACH_RULEG">
-		Muslo der.
-	</string>
-	<string name="ATTACH_RLLEG">
-		Pantorrilla der.
-	</string>
-	<string name="ATTACH_LHIP">
-		Cadera izq.
-	</string>
-	<string name="ATTACH_LULEG">
-		Muslo izq.
-	</string>
-	<string name="ATTACH_LLLEG">
-		Pantorrilla izq.
-	</string>
-	<string name="ATTACH_BELLY">
-		Vientre
-	</string>
-	<string name="ATTACH_RPEC">
-		Pecho derecho
-	</string>
-	<string name="ATTACH_LPEC">
-		Pecho izquierdo
-	</string>
-	<string name="ATTACH_HUD_CENTER_2">
-		HUD: Centro 2
-	</string>
-	<string name="ATTACH_HUD_TOP_RIGHT">
-		HUD: arriba der.
-	</string>
-	<string name="ATTACH_HUD_TOP_CENTER">
-		HUD: arriba centro
-	</string>
-	<string name="ATTACH_HUD_TOP_LEFT">
-		HUD: arriba izq.
-	</string>
-	<string name="ATTACH_HUD_CENTER_1">
-		HUD: Centro 1
-	</string>
-	<string name="ATTACH_HUD_BOTTOM_LEFT">
-		HUD: abajo izq.
-	</string>
-	<string name="ATTACH_HUD_BOTTOM">
-		HUD: abajo
-	</string>
-	<string name="ATTACH_HUD_BOTTOM_RIGHT">
-		HUD: abajo der.
-	</string>
-	<string name="CursorPos">
-		Línea [LINE], Columna [COLUMN]
-	</string>
-	<string name="PanelDirCountFound">
-		[COUNT] resultados
-	</string>
-	<string name="PanelContentsTooltip">
-		Contenido del objeto
-	</string>
-	<string name="PanelContentsNewScript">
-		Script nuevo
-	</string>
-	<string name="BusyModeResponseDefault">
-		El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
-	</string>
-	<string name="MuteByName">
-		(Por el nombre)
-	</string>
-	<string name="MuteAgent">
-		(Residente)
-	</string>
-	<string name="MuteObject">
-		(Objeto)
-	</string>
-	<string name="MuteGroup">
-		(Grupo)
-	</string>
-	<string name="MuteExternal">
-		(Externo)
-	</string>
-	<string name="RegionNoCovenant">
-		No se ha aportado un contrato para este estado.
-	</string>
-	<string name="RegionNoCovenantOtherOwner">
-		No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab.  Por favor, contacta con ese propietario para informarte sobre la venta.
-	</string>
-	<string name="covenant_last_modified" value="Última modificación: "/>
-	<string name="none_text" value="(no hay)"/>
-	<string name="never_text" value=" (nunca)"/>
-	<string name="GroupOwned">
-		Propiedad del grupo
-	</string>
-	<string name="Public">
-		Público
-	</string>
-	<string name="ClassifiedClicksTxt">
-		Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
-	</string>
-	<string name="ClassifiedUpdateAfterPublish">
-		(se actualizará tras la publicación)
-	</string>
-	<string name="NoPicksClassifiedsText">
-		No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
-	</string>
-	<string name="NoAvatarPicksClassifiedsText">
-		El usuario no tiene clasificados ni destacados
-	</string>
-	<string name="PicksClassifiedsLoadingText">
-		Cargando...
-	</string>
-	<string name="MultiPreviewTitle">
-		Vista previa
-	</string>
-	<string name="MultiPropertiesTitle">
-		Propiedades
-	</string>
-	<string name="InvOfferAnObjectNamed">
-		Un objeto de nombre
-	</string>
-	<string name="InvOfferOwnedByGroup">
-		propiedad del grupo
-	</string>
-	<string name="InvOfferOwnedByUnknownGroup">
-		propiedad de un grupo desconocido
-	</string>
-	<string name="InvOfferOwnedBy">
-		propiedad de
-	</string>
-	<string name="InvOfferOwnedByUnknownUser">
-		propiedad de un usuario desconocido
-	</string>
-	<string name="InvOfferGaveYou">
-		te ha dado
-	</string>
-	<string name="InvOfferDecline">
-		Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
-	</string>
-	<string name="GroupMoneyTotal">
-		Total
-	</string>
-	<string name="GroupMoneyBought">
-		comprado
-	</string>
-	<string name="GroupMoneyPaidYou">
-		pagado a ti
-	</string>
-	<string name="GroupMoneyPaidInto">
-		pagado en
-	</string>
-	<string name="GroupMoneyBoughtPassTo">
-		pase comprado a
-	</string>
-	<string name="GroupMoneyPaidFeeForEvent">
-		cuotas pagadas para el evento
-	</string>
-	<string name="GroupMoneyPaidPrizeForEvent">
-		precio pagado por el evento
-	</string>
-	<string name="GroupMoneyBalance">
-		Saldo
-	</string>
-	<string name="GroupMoneyCredits">
-		Créditos
-	</string>
-	<string name="GroupMoneyDebits">
-		Débitos
-	</string>
-	<string name="ViewerObjectContents">
-		Contenidos
-	</string>
-	<string name="AcquiredItems">
-		Artículos adquiridos
-	</string>
-	<string name="Cancel">
-		Cancelar
-	</string>
-	<string name="UploadingCosts">
-		Subir [NAME] cuesta [AMOUNT] L$
-	</string>
-	<string name="BuyingCosts">
-		Comprar esto cuesta [AMOUNT] L$
-	</string>
-	<string name="UnknownFileExtension">
-		Extensión de archivo desconocida [.%s]
-Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
-	</string>
-	<string name="MuteObject2">
-		Ignorar
-	</string>
-	<string name="AddLandmarkNavBarMenu">
-		Guardarme este hito...
-	</string>
-	<string name="EditLandmarkNavBarMenu">
-		Editar este hito...
-	</string>
-	<string name="accel-mac-control">
-		⌃
-	</string>
-	<string name="accel-mac-command">
-		⌘
-	</string>
-	<string name="accel-mac-option">
-		⌥
-	</string>
-	<string name="accel-mac-shift">
-		⇧
-	</string>
-	<string name="accel-win-control">
-		Ctrl+
-	</string>
-	<string name="accel-win-alt">
-		Alt+
-	</string>
-	<string name="accel-win-shift">
-		Mayús+
-	</string>
-	<string name="FileSaved">
-		Archivo guardado
-	</string>
-	<string name="Receiving">
-		Recibiendo
-	</string>
-	<string name="AM">
-		AM
-	</string>
-	<string name="PM">
-		PM
-	</string>
-	<string name="PST">
-		PST
-	</string>
-	<string name="PDT">
-		PDT
-	</string>
-	<string name="Direction_Forward">
-		Adelante
-	</string>
-	<string name="Direction_Left">
-		Izquierda
-	</string>
-	<string name="Direction_Right">
-		Derecha
-	</string>
-	<string name="Direction_Back">
-		Atrás
-	</string>
-	<string name="Direction_North">
-		Norte
-	</string>
-	<string name="Direction_South">
-		Sur
-	</string>
-	<string name="Direction_West">
-		Oeste
-	</string>
-	<string name="Direction_East">
-		Este
-	</string>
-	<string name="Direction_Up">
-		Arriba
-	</string>
-	<string name="Direction_Down">
-		Abajo
-	</string>
-	<string name="Any Category">
-		Cualquier categoría
-	</string>
-	<string name="Shopping">
-		Compras
-	</string>
-	<string name="Land Rental">
-		Terreno en alquiler
-	</string>
-	<string name="Property Rental">
-		Propiedad en alquiler
-	</string>
-	<string name="Special Attraction">
-		Atracción especial
-	</string>
-	<string name="New Products">
-		Nuevos productos
-	</string>
-	<string name="Employment">
-		Empleo
-	</string>
-	<string name="Wanted">
-		Se busca
-	</string>
-	<string name="Service">
-		Servicios
-	</string>
-	<string name="Personal">
-		Personal
-	</string>
-	<string name="None">
-		Ninguno
-	</string>
-	<string name="Linden Location">
-		Localización Linden
-	</string>
-	<string name="Adult">
-		&apos;Adult&apos;
-	</string>
-	<string name="Arts&amp;Culture">
-		Arte y Cultura
-	</string>
-	<string name="Business">
-		Negocios
-	</string>
-	<string name="Educational">
-		Educativo
-	</string>
-	<string name="Gaming">
-		Juegos de azar
-	</string>
-	<string name="Hangout">
-		Entretenimiento
-	</string>
-	<string name="Newcomer Friendly">
-		Para recién llegados
-	</string>
-	<string name="Parks&amp;Nature">
-		Parques y Naturaleza
-	</string>
-	<string name="Residential">
-		Residencial
-	</string>
-	<string name="Stage">
-		Artes escénicas
-	</string>
-	<string name="Other">
-		Otra
-	</string>
-	<string name="Rental">
-		Terreno en alquiler
-	</string>
-	<string name="Any">
-		Cualquiera
-	</string>
-	<string name="You">
-		Tú
-	</string>
-	<string name="Multiple Media">
-		Múltiples medias
-	</string>
-	<string name="Play Media">
-		Play/Pausa los media
-	</string>
-	<string name="MBCmdLineError">
-		Ha habido un error analizando la línea de comando.
-Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
-Error:
-	</string>
-	<string name="MBCmdLineUsg">
-		[APP_NAME] Uso de línea de comando:
-	</string>
-	<string name="MBUnableToAccessFile">
-		[APP_NAME] no puede acceder a un archivo que necesita.
-
-Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
-Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
-Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
-	</string>
-	<string name="MBFatalError">
-		Error fatal
-	</string>
-	<string name="MBRequiresAltiVec">
-		[APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
-	</string>
-	<string name="MBAlreadyRunning">
-		[APP_NAME] ya se está ejecutando.
-Revisa tu barra de tareas para encontrar una copia minimizada del programa.
-Si este mensaje persiste, reinicia tu ordenador.
-	</string>
-	<string name="MBFrozenCrashed">
-		En su anterior ejecución, [APP_NAME] se congeló o se cayó.
-¿Quieres enviar un informe de caída?
-	</string>
-	<string name="MBAlert">
-		Alerta
-	</string>
-	<string name="MBNoDirectX">
-		[APP_NAME] no encuentra DirectX 9.0b o superior.
-[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas.  Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
-
-¿Quieres continuar?
-	</string>
-	<string name="MBWarning">
-		¡Atención!
-	</string>
-	<string name="MBNoAutoUpdate">
-		Las actualizaciones automáticas no están todavía implementadas para Linux.
-Por favor, descarga la última versión desde www.secondlife.com.
-	</string>
-	<string name="MBRegClassFailed">
-		Fallo en RegisterClass
-	</string>
-	<string name="MBError">
-		Error
-	</string>
-	<string name="MBFullScreenErr">
-		No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
-Ejecutándose en una ventana.
-	</string>
-	<string name="MBDestroyWinFailed">
-		Error Shutdown destruyendo la ventana (DestroyWindow() failed)
-	</string>
-	<string name="MBShutdownErr">
-		Error Shutdown
-	</string>
-	<string name="MBDevContextErr">
-		No se puede construir el &apos;GL device context&apos;
-	</string>
-	<string name="MBPixelFmtErr">
-		No se puede encontrar un formato adecuado de píxel
-	</string>
-	<string name="MBPixelFmtDescErr">
-		No se puede conseguir la descripción del formato de píxel
-	</string>
-	<string name="MBTrueColorWindow">
-		Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
-Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
-	</string>
-	<string name="MBAlpha">
-		[APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit.  Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
-Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
-Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
-	</string>
-	<string name="MBPixelFmtSetErr">
-		No se puede configurar el formato de píxel
-	</string>
-	<string name="MBGLContextErr">
-		No se puede crear el &apos;GL rendering context&apos;
-	</string>
-	<string name="MBGLContextActErr">
-		No se puede activar el &apos;GL rendering context&apos;
-	</string>
-	<string name="MBVideoDrvErr">
-		[APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
-
-Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
-	</string>
-	<string name="5 O&apos;Clock Shadow">
-		Barba del día
-	</string>
-	<string name="All White">
-		Blanco del todo
-	</string>
-	<string name="Anime Eyes">
-		Ojos de cómic
-	</string>
-	<string name="Arced">
-		Arqueadas
-	</string>
-	<string name="Arm Length">
-		Brazos: longitud
-	</string>
-	<string name="Attached">
-		Cortos
-	</string>
-	<string name="Attached Earlobes">
-		Lóbulos
-	</string>
-	<string name="Back Fringe">
-		Nuca: largo
-	</string>
-	<string name="Baggy">
-		Marcadas
-	</string>
-	<string name="Bangs">
-		Bangs
-	</string>
-	<string name="Beady Eyes">
-		Ojos pequeños
-	</string>
-	<string name="Belly Size">
-		Barriga: tamaño
-	</string>
-	<string name="Big">
-		Grande
-	</string>
-	<string name="Big Butt">
-		Culo grande
-	</string>
-	<string name="Big Hair Back">
-		Pelo: moño
-	</string>
-	<string name="Big Hair Front">
-		Pelo: tupé
-	</string>
-	<string name="Big Hair Top">
-		Pelo: melena alta
-	</string>
-	<string name="Big Head">
-		Cabeza grande
-	</string>
-	<string name="Big Pectorals">
-		Grandes pectorales
-	</string>
-	<string name="Big Spikes">
-		Crestas grandes
-	</string>
-	<string name="Black">
-		Negro
-	</string>
-	<string name="Blonde">
-		Rubio
-	</string>
-	<string name="Blonde Hair">
-		Pelo rubio
-	</string>
-	<string name="Blush">
-		Colorete
-	</string>
-	<string name="Blush Color">
-		Color del colorete
-	</string>
-	<string name="Blush Opacity">
-		Opacidad del colorete
-	</string>
-	<string name="Body Definition">
-		Definición del cuerpo
-	</string>
-	<string name="Body Fat">
-		Cuerpo: gordura
-	</string>
-	<string name="Body Freckles">
-		Pecas del cuerpo
-	</string>
-	<string name="Body Thick">
-		Cuerpo grueso
-	</string>
-	<string name="Body Thickness">
-		Cuerpo: grosor
-	</string>
-	<string name="Body Thin">
-		Cuerpo delgado
-	</string>
-	<string name="Bow Legged">
-		Abiertas
-	</string>
-	<string name="Breast Buoyancy">
-		Busto: firmeza
-	</string>
-	<string name="Breast Cleavage">
-		Busto: canalillo
-	</string>
-	<string name="Breast Size">
-		Busto: tamaño
-	</string>
-	<string name="Bridge Width">
-		Puente: ancho
-	</string>
-	<string name="Broad">
-		Aumentar
-	</string>
-	<string name="Brow Size">
-		Arco ciliar
-	</string>
-	<string name="Bug Eyes">
-		Bug Eyes
-	</string>
-	<string name="Bugged Eyes">
-		Ojos saltones
-	</string>
-	<string name="Bulbous">
-		Bulbosa
-	</string>
-	<string name="Bulbous Nose">
-		Nariz de porra
-	</string>
-	<string name="Breast Physics Mass">
-		Masa del busto
-	</string>
-	<string name="Breast Physics Smoothing">
-		Suavizado del busto
-	</string>
-	<string name="Breast Physics Gravity">
-		Gravedad del busto
-	</string>
-	<string name="Breast Physics Drag">
-		Aerodinámica del busto
-	</string>
-	<string name="Breast Physics InOut Max Effect">
-		Efecto máx.
-	</string>
-	<string name="Breast Physics InOut Spring">
-		Elasticidad
-	</string>
-	<string name="Breast Physics InOut Gain">
-		Ganancia
-	</string>
-	<string name="Breast Physics InOut Damping">
-		Amortiguación
-	</string>
-	<string name="Breast Physics UpDown Max Effect">
-		Efecto máx.
-	</string>
-	<string name="Breast Physics UpDown Spring">
-		Elasticidad
-	</string>
-	<string name="Breast Physics UpDown Gain">
-		Ganancia
-	</string>
-	<string name="Breast Physics UpDown Damping">
-		Amortiguación
-	</string>
-	<string name="Breast Physics LeftRight Max Effect">
-		Efecto máx.
-	</string>
-	<string name="Breast Physics LeftRight Spring">
-		Elasticidad
-	</string>
-	<string name="Breast Physics LeftRight Gain">
-		Ganancia
-	</string>
-	<string name="Breast Physics LeftRight Damping">
-		Amortiguación
-	</string>
-	<string name="Belly Physics Mass">
-		Masa de la barriga
-	</string>
-	<string name="Belly Physics Smoothing">
-		Suavizado de la barriga
-	</string>
-	<string name="Belly Physics Gravity">
-		Gravedad de la barriga
-	</string>
-	<string name="Belly Physics Drag">
-		Aerodinámica de la barriga
-	</string>
-	<string name="Belly Physics UpDown Max Effect">
-		Efecto máx.
-	</string>
-	<string name="Belly Physics UpDown Spring">
-		Elasticidad
-	</string>
-	<string name="Belly Physics UpDown Gain">
-		Ganancia
-	</string>
-	<string name="Belly Physics UpDown Damping">
-		Amortiguación
-	</string>
-	<string name="Butt Physics Mass">
-		Masa del culo
-	</string>
-	<string name="Butt Physics Smoothing">
-		Suavizado del culo
-	</string>
-	<string name="Butt Physics Gravity">
-		Gravedad del culo
-	</string>
-	<string name="Butt Physics Drag">
-		Aerodinámica del culo
-	</string>
-	<string name="Butt Physics UpDown Max Effect">
-		Efecto máx.
-	</string>
-	<string name="Butt Physics UpDown Spring">
-		Elasticidad
-	</string>
-	<string name="Butt Physics UpDown Gain">
-		Ganancia
-	</string>
-	<string name="Butt Physics UpDown Damping">
-		Amortiguación
-	</string>
-	<string name="Butt Physics LeftRight Max Effect">
-		Efecto máx.
-	</string>
-	<string name="Butt Physics LeftRight Spring">
-		Elasticidad
-	</string>
-	<string name="Butt Physics LeftRight Gain">
-		Ganancia
-	</string>
-	<string name="Butt Physics LeftRight Damping">
-		Amortiguación
-	</string>
-	<string name="Bushy Eyebrows">
-		Cejijuntas
-	</string>
-	<string name="Bushy Hair">
-		Pelo tupido
-	</string>
-	<string name="Butt Size">
-		Culo: tamaño
-	</string>
-	<string name="Butt Gravity">
-		Gravedad del culo
-	</string>
-	<string name="bustle skirt">
-		Polisón
-	</string>
-	<string name="no bustle">
-		Sin polisón
-	</string>
-	<string name="more bustle">
-		Con polisón
-	</string>
-	<string name="Chaplin">
-		Cortito
-	</string>
-	<string name="Cheek Bones">
-		Pómulos
-	</string>
-	<string name="Chest Size">
-		Tórax: tamaño
-	</string>
-	<string name="Chin Angle">
-		Barbilla: ángulo
-	</string>
-	<string name="Chin Cleft">
-		Barbilla: contorno
-	</string>
-	<string name="Chin Curtains">
-		Barba en collar
-	</string>
-	<string name="Chin Depth">
-		Barbilla: largo
-	</string>
-	<string name="Chin Heavy">
-		Hacia la barbilla
-	</string>
-	<string name="Chin In">
-		Barbilla retraída
-	</string>
-	<string name="Chin Out">
-		Barbilla prominente
-	</string>
-	<string name="Chin-Neck">
-		Papada
-	</string>
-	<string name="Clear">
-		Transparente
-	</string>
-	<string name="Cleft">
-		Remarcar
-	</string>
-	<string name="Close Set Eyes">
-		Ojos juntos
-	</string>
-	<string name="Closed">
-		Cerrar
-	</string>
-	<string name="Closed Back">
-		Trasera cerrada
-	</string>
-	<string name="Closed Front">
-		Frontal cerrado
-	</string>
-	<string name="Closed Left">
-		Cerrada
-	</string>
-	<string name="Closed Right">
-		Cerrada
-	</string>
-	<string name="Coin Purse">
-		Poco abultada
-	</string>
-	<string name="Collar Back">
-		Espalda
-	</string>
-	<string name="Collar Front">
-		Escote
-	</string>
-	<string name="Corner Down">
-		Hacia abajo
-	</string>
-	<string name="Corner Up">
-		Hacia arriba
-	</string>
-	<string name="Creased">
-		Caídos
-	</string>
-	<string name="Crooked Nose">
-		Nariz torcida
-	</string>
-	<string name="Cuff Flare">
-		Acampanado
-	</string>
-	<string name="Dark">
-		Oscuridad
-	</string>
-	<string name="Dark Green">
-		Verde oscuro
-	</string>
-	<string name="Darker">
-		Más oscuros
-	</string>
-	<string name="Deep">
-		Remarcar
-	</string>
-	<string name="Default Heels">
-		Tacones por defecto
-	</string>
-	<string name="Dense">
-		Densas
-	</string>
-	<string name="Double Chin">
-		Mucha papada
-	</string>
-	<string name="Downturned">
-		Poco
-	</string>
-	<string name="Duffle Bag">
-		Muy abultada
-	</string>
-	<string name="Ear Angle">
-		Orejas: ángulo
-	</string>
-	<string name="Ear Size">
-		Orejas: tamaño
-	</string>
-	<string name="Ear Tips">
-		Orejas: forma
-	</string>
-	<string name="Egg Head">
-		Cabeza: ahuevada
-	</string>
-	<string name="Eye Bags">
-		Ojos: bolsas
-	</string>
-	<string name="Eye Color">
-		Ojos: color
-	</string>
-	<string name="Eye Depth">
-		Ojos: profundidad
-	</string>
-	<string name="Eye Lightness">
-		Ojos: brillo
-	</string>
-	<string name="Eye Opening">
-		Ojos: apertura
-	</string>
-	<string name="Eye Pop">
-		Ojos: simetría
-	</string>
-	<string name="Eye Size">
-		Ojos: tamaño
-	</string>
-	<string name="Eye Spacing">
-		Ojos: separación
-	</string>
-	<string name="Eyebrow Arc">
-		Cejas: arco
-	</string>
-	<string name="Eyebrow Density">
-		Cejas: densidad
-	</string>
-	<string name="Eyebrow Height">
-		Cejas: altura
-	</string>
-	<string name="Eyebrow Points">
-		Cejas: en V
-	</string>
-	<string name="Eyebrow Size">
-		Cejas: tamaño
-	</string>
-	<string name="Eyelash Length">
-		Pestañas: longitud
-	</string>
-	<string name="Eyeliner">
-		Contorno de ojos
-	</string>
-	<string name="Eyeliner Color">
-		Contorno de ojos: color
-	</string>
-	<string name="Eyes Bugged">
-		Eyes Bugged
-	</string>
-	<string name="Face Shear">
-		Cara: simetría
-	</string>
-	<string name="Facial Definition">
-		Rasgos marcados
-	</string>
-	<string name="Far Set Eyes">
-		Ojos separados
-	</string>
-	<string name="Fat Lips">
-		Prominentes
-	</string>
-	<string name="Female">
-		Mujer
-	</string>
-	<string name="Fingerless">
-		Sin dedos
-	</string>
-	<string name="Fingers">
-		Con dedos
-	</string>
-	<string name="Flared Cuffs">
-		Campana
-	</string>
-	<string name="Flat">
-		Redondeadas
-	</string>
-	<string name="Flat Butt">
-		Culo plano
-	</string>
-	<string name="Flat Head">
-		Cabeza plana
-	</string>
-	<string name="Flat Toe">
-		Empeine bajo
-	</string>
-	<string name="Foot Size">
-		Pie: tamaño
-	</string>
-	<string name="Forehead Angle">
-		Frente: ángulo
-	</string>
-	<string name="Forehead Heavy">
-		Hacia la frente
-	</string>
-	<string name="Freckles">
-		Pecas
-	</string>
-	<string name="Front Fringe">
-		Flequillo
-	</string>
-	<string name="Full Back">
-		Sin cortar
-	</string>
-	<string name="Full Eyeliner">
-		Contorno completo
-	</string>
-	<string name="Full Front">
-		Sin cortar
-	</string>
-	<string name="Full Hair Sides">
-		Pelo: volumen a los lados
-	</string>
-	<string name="Full Sides">
-		Volumen total
-	</string>
-	<string name="Glossy">
-		Con brillo
-	</string>
-	<string name="Glove Fingers">
-		Guantes: dedos
-	</string>
-	<string name="Glove Length">
-		Guantes: largo
-	</string>
-	<string name="Hair">
-		Pelo
-	</string>
-	<string name="Hair Back">
-		Pelo: nuca
-	</string>
-	<string name="Hair Front">
-		Pelo: delante
-	</string>
-	<string name="Hair Sides">
-		Pelo: lados
-	</string>
-	<string name="Hair Sweep">
-		Peinado: dirección
-	</string>
-	<string name="Hair Thickess">
-		Pelo: espesor
-	</string>
-	<string name="Hair Thickness">
-		Pelo: espesor
-	</string>
-	<string name="Hair Tilt">
-		Pelo: inclinación
-	</string>
-	<string name="Hair Tilted Left">
-		A la izq.
-	</string>
-	<string name="Hair Tilted Right">
-		A la der.
-	</string>
-	<string name="Hair Volume">
-		Pelo: volumen
-	</string>
-	<string name="Hand Size">
-		Manos: tamaño
-	</string>
-	<string name="Handlebars">
-		Muy largo
-	</string>
-	<string name="Head Length">
-		Cabeza: longitud
-	</string>
-	<string name="Head Shape">
-		Cabeza: forma
-	</string>
-	<string name="Head Size">
-		Cabeza: tamaño
-	</string>
-	<string name="Head Stretch">
-		Cabeza: estiramiento
-	</string>
-	<string name="Heel Height">
-		Tacón: altura
-	</string>
-	<string name="Heel Shape">
-		Tacón: forma
-	</string>
-	<string name="Height">
-		Altura
-	</string>
-	<string name="High">
-		Subir
-	</string>
-	<string name="High Heels">
-		Tacones altos
-	</string>
-	<string name="High Jaw">
-		Mandíbula alta
-	</string>
-	<string name="High Platforms">
-		Suela gorda
-	</string>
-	<string name="High and Tight">
-		Pegada
-	</string>
-	<string name="Higher">
-		Arrriba
-	</string>
-	<string name="Hip Length">
-		Cadera: altura
-	</string>
-	<string name="Hip Width">
-		Cadera: ancho
-	</string>
-	<string name="In">
-		Pegadas
-	</string>
-	<string name="In Shdw Color">
-		Línea de ojos: color
-	</string>
-	<string name="In Shdw Opacity">
-		Línea de ojos: opacidad
-	</string>
-	<string name="Inner Eye Corner">
-		Ojos: lagrimal
-	</string>
-	<string name="Inner Eye Shadow">
-		Inner Eye Shadow
-	</string>
-	<string name="Inner Shadow">
-		Línea de ojos
-	</string>
-	<string name="Jacket Length">
-		Chaqueta: largo
-	</string>
-	<string name="Jacket Wrinkles">
-		Chaqueta: arrugas
-	</string>
-	<string name="Jaw Angle">
-		Mandíbula: ángulo
-	</string>
-	<string name="Jaw Jut">
-		Maxilar inferior
-	</string>
-	<string name="Jaw Shape">
-		Mandíbula: forma
-	</string>
-	<string name="Join">
-		Más junto
-	</string>
-	<string name="Jowls">
-		Mofletes
-	</string>
-	<string name="Knee Angle">
-		Rodillas: ángulo
-	</string>
-	<string name="Knock Kneed">
-		Zambas
-	</string>
-	<string name="Large">
-		Aumentar
-	</string>
-	<string name="Large Hands">
-		Manos grandes
-	</string>
-	<string name="Left Part">
-		Raya: izq.
-	</string>
-	<string name="Leg Length">
-		Piernas: longitud
-	</string>
-	<string name="Leg Muscles">
-		Piernas: musculatura
-	</string>
-	<string name="Less">
-		Menos
-	</string>
-	<string name="Less Body Fat">
-		Menos gordura
-	</string>
-	<string name="Less Curtains">
-		Menos tupida
-	</string>
-	<string name="Less Freckles">
-		Menos pecas
-	</string>
-	<string name="Less Full">
-		Menos grosor
-	</string>
-	<string name="Less Gravity">
-		Más levantado
-	</string>
-	<string name="Less Love">
-		Menos michelines
-	</string>
-	<string name="Less Muscles">
-		Pocos músculos
-	</string>
-	<string name="Less Muscular">
-		Poca musculatura
-	</string>
-	<string name="Less Rosy">
-		Menos sonrosada
-	</string>
-	<string name="Less Round">
-		Menos redondeada
-	</string>
-	<string name="Less Saddle">
-		Menos cartucheras
-	</string>
-	<string name="Less Square">
-		Menos cuadrada
-	</string>
-	<string name="Less Volume">
-		Menos volumen
-	</string>
-	<string name="Less soul">
-		Pequeña
-	</string>
-	<string name="Lighter">
-		Más luminosos
-	</string>
-	<string name="Lip Cleft">
-		Labio: hoyuelo
-	</string>
-	<string name="Lip Cleft Depth">
-		Hoyuelo marcado
-	</string>
-	<string name="Lip Fullness">
-		Labios: grosor
-	</string>
-	<string name="Lip Pinkness">
-		Labios sonrosados
-	</string>
-	<string name="Lip Ratio">
-		Labios: ratio
-	</string>
-	<string name="Lip Thickness">
-		Labios: prominencia
-	</string>
-	<string name="Lip Width">
-		Labios: ancho
-	</string>
-	<string name="Lipgloss">
-		Brillo de labios
-	</string>
-	<string name="Lipstick">
-		Barra de labios
-	</string>
-	<string name="Lipstick Color">
-		Barra de labios: color
-	</string>
-	<string name="Long">
-		Más
-	</string>
-	<string name="Long Head">
-		Cabeza alargada
-	</string>
-	<string name="Long Hips">
-		Cadera larga
-	</string>
-	<string name="Long Legs">
-		Piernas largas
-	</string>
-	<string name="Long Neck">
-		Cuello largo
-	</string>
-	<string name="Long Pigtails">
-		Coletas largas
-	</string>
-	<string name="Long Ponytail">
-		Cola de caballo larga
-	</string>
-	<string name="Long Torso">
-		Torso largo
-	</string>
-	<string name="Long arms">
-		Brazos largos
-	</string>
-	<string name="Loose Pants">
-		Pantalón suelto
-	</string>
-	<string name="Loose Shirt">
-		Camiseta suelta
-	</string>
-	<string name="Loose Sleeves">
-		Puños anchos
-	</string>
-	<string name="Love Handles">
-		Michelines
-	</string>
-	<string name="Low">
-		Bajar
-	</string>
-	<string name="Low Heels">
-		Tacones bajos
-	</string>
-	<string name="Low Jaw">
-		Mandíbula baja
-	</string>
-	<string name="Low Platforms">
-		Suela fina
-	</string>
-	<string name="Low and Loose">
-		Suelta
-	</string>
-	<string name="Lower">
-		Abajo
-	</string>
-	<string name="Lower Bridge">
-		Puente: abajo
-	</string>
-	<string name="Lower Cheeks">
-		Mejillas: abajo
-	</string>
-	<string name="Male">
-		Varón
-	</string>
-	<string name="Middle Part">
-		Raya: en medio
-	</string>
-	<string name="More">
-		Más
-	</string>
-	<string name="More Blush">
-		Más colorete
-	</string>
-	<string name="More Body Fat">
-		Más gordura
-	</string>
-	<string name="More Curtains">
-		Más tupida
-	</string>
-	<string name="More Eyeshadow">
-		Más
-	</string>
-	<string name="More Freckles">
-		Más pecas
-	</string>
-	<string name="More Full">
-		Más grosor
-	</string>
-	<string name="More Gravity">
-		Menos levantado
-	</string>
-	<string name="More Lipstick">
-		Más barra de labios
-	</string>
-	<string name="More Love">
-		Más michelines
-	</string>
-	<string name="More Lower Lip">
-		Más el inferior
-	</string>
-	<string name="More Muscles">
-		Más músculos
-	</string>
-	<string name="More Muscular">
-		Más musculatura
-	</string>
-	<string name="More Rosy">
-		Más sonrosada
-	</string>
-	<string name="More Round">
-		Más redondeada
-	</string>
-	<string name="More Saddle">
-		Más cartucheras
-	</string>
-	<string name="More Sloped">
-		Más inclinada
-	</string>
-	<string name="More Square">
-		Más cuadrada
-	</string>
-	<string name="More Upper Lip">
-		Más el superior
-	</string>
-	<string name="More Vertical">
-		Más recta
-	</string>
-	<string name="More Volume">
-		Más volumen
-	</string>
-	<string name="More soul">
-		Grande
-	</string>
-	<string name="Moustache">
-		Bigote
-	</string>
-	<string name="Mouth Corner">
-		Comisuras
-	</string>
-	<string name="Mouth Position">
-		Boca: posición
-	</string>
-	<string name="Mowhawk">
-		Rapado
-	</string>
-	<string name="Muscular">
-		Muscular
-	</string>
-	<string name="Mutton Chops">
-		Patillas largas
-	</string>
-	<string name="Nail Polish">
-		Uñas pintadas
-	</string>
-	<string name="Nail Polish Color">
-		Uñas pintadas: color
-	</string>
-	<string name="Narrow">
-		Disminuir
-	</string>
-	<string name="Narrow Back">
-		Rapada
-	</string>
-	<string name="Narrow Front">
-		Entradas
-	</string>
-	<string name="Narrow Lips">
-		Labios estrechos
-	</string>
-	<string name="Natural">
-		Natural
-	</string>
-	<string name="Neck Length">
-		Cuello: longitud
-	</string>
-	<string name="Neck Thickness">
-		Cuello: grosor
-	</string>
-	<string name="No Blush">
-		Sin colorete
-	</string>
-	<string name="No Eyeliner">
-		Sin contorno
-	</string>
-	<string name="No Eyeshadow">
-		Menos
-	</string>
-	<string name="No Lipgloss">
-		Sin brillo
-	</string>
-	<string name="No Lipstick">
-		Sin barra de labios
-	</string>
-	<string name="No Part">
-		Sin raya
-	</string>
-	<string name="No Polish">
-		Sin pintar
-	</string>
-	<string name="No Red">
-		Nada
-	</string>
-	<string name="No Spikes">
-		Sin crestas
-	</string>
-	<string name="No White">
-		Sin blanco
-	</string>
-	<string name="No Wrinkles">
-		Sin arrugas
-	</string>
-	<string name="Normal Lower">
-		Normal Lower
-	</string>
-	<string name="Normal Upper">
-		Normal Upper
-	</string>
-	<string name="Nose Left">
-		Nariz a la izq.
-	</string>
-	<string name="Nose Right">
-		Nariz a la der.
-	</string>
-	<string name="Nose Size">
-		Nariz: tamaño
-	</string>
-	<string name="Nose Thickness">
-		Nariz: grosor
-	</string>
-	<string name="Nose Tip Angle">
-		Nariz: respingona
-	</string>
-	<string name="Nose Tip Shape">
-		Nariz: punta
-	</string>
-	<string name="Nose Width">
-		Nariz: ancho
-	</string>
-	<string name="Nostril Division">
-		Ventana: altura
-	</string>
-	<string name="Nostril Width">
-		Ventana: ancho
-	</string>
-	<string name="Opaque">
-		Opaco
-	</string>
-	<string name="Open">
-		Abrir
-	</string>
-	<string name="Open Back">
-		Apertura trasera
-	</string>
-	<string name="Open Front">
-		Apertura frontal
-	</string>
-	<string name="Open Left">
-		Abierta
-	</string>
-	<string name="Open Right">
-		Abierta
-	</string>
-	<string name="Orange">
-		Anaranjado
-	</string>
-	<string name="Out">
-		De soplillo
-	</string>
-	<string name="Out Shdw Color">
-		Sombra de ojos: color
-	</string>
-	<string name="Out Shdw Opacity">
-		Sombra de ojos: opacidad
-	</string>
-	<string name="Outer Eye Corner">
-		Ojos: comisura
-	</string>
-	<string name="Outer Eye Shadow">
-		Outer Eye Shadow
-	</string>
-	<string name="Outer Shadow">
-		Sombra de ojos
-	</string>
-	<string name="Overbite">
-		Retraído
-	</string>
-	<string name="Package">
-		Pubis
-	</string>
-	<string name="Painted Nails">
-		Pintadas
-	</string>
-	<string name="Pale">
-		Pálida
-	</string>
-	<string name="Pants Crotch">
-		Pantalón: cruz
-	</string>
-	<string name="Pants Fit">
-		Ceñido
-	</string>
-	<string name="Pants Length">
-		Pernera: largo
-	</string>
-	<string name="Pants Waist">
-		Caja
-	</string>
-	<string name="Pants Wrinkles">
-		Pantalón: arrugas
-	</string>
-	<string name="Part">
-		Raya
-	</string>
-	<string name="Part Bangs">
-		Flequillo partido
-	</string>
-	<string name="Pectorals">
-		Pectorales
-	</string>
-	<string name="Pigment">
-		Tono
-	</string>
-	<string name="Pigtails">
-		Coletas
-	</string>
-	<string name="Pink">
-		Rosa
-	</string>
-	<string name="Pinker">
-		Más sonrosados
-	</string>
-	<string name="Platform Height">
-		Suela: altura
-	</string>
-	<string name="Platform Width">
-		Suela: ancho
-	</string>
-	<string name="Pointy">
-		En punta
-	</string>
-	<string name="Pointy Heels">
-		De aguja
-	</string>
-	<string name="Ponytail">
-		Cola de caballo
-	</string>
-	<string name="Poofy Skirt">
-		Con vuelo
-	</string>
-	<string name="Pop Left Eye">
-		Izquierdo más grande
-	</string>
-	<string name="Pop Right Eye">
-		Derecho más grande
-	</string>
-	<string name="Puffy">
-		Hinchadas
-	</string>
-	<string name="Puffy Eyelids">
-		Ojeras
-	</string>
-	<string name="Rainbow Color">
-		Irisación
-	</string>
-	<string name="Red Hair">
-		Pelirrojo
-	</string>
-	<string name="Regular">
-		Regular
-	</string>
-	<string name="Right Part">
-		Raya: der.
-	</string>
-	<string name="Rosy Complexion">
-		Tez sonrosada
-	</string>
-	<string name="Round">
-		Redondear
-	</string>
-	<string name="Ruddiness">
-		Rubicundez
-	</string>
-	<string name="Ruddy">
-		Rojiza
-	</string>
-	<string name="Rumpled Hair">
-		Pelo encrespado
-	</string>
-	<string name="Saddle Bags">
-		Cartucheras
-	</string>
-	<string name="Scrawny Leg">
-		Piernas flacas
-	</string>
-	<string name="Separate">
-		Más ancho
-	</string>
-	<string name="Shallow">
-		Sin marcar
-	</string>
-	<string name="Shear Back">
-		Nuca: corte
-	</string>
-	<string name="Shear Face">
-		Shear Face
-	</string>
-	<string name="Shear Front">
-		Shear Front
-	</string>
-	<string name="Shear Left Up">
-		Arriba - izq.
-	</string>
-	<string name="Shear Right Up">
-		Arriba - der.
-	</string>
-	<string name="Sheared Back">
-		Rapada
-	</string>
-	<string name="Sheared Front">
-		Rapada
-	</string>
-	<string name="Shift Left">
-		A la izq.
-	</string>
-	<string name="Shift Mouth">
-		Boca: ladeada
-	</string>
-	<string name="Shift Right">
-		A la der.
-	</string>
-	<string name="Shirt Bottom">
-		Alto de cintura
-	</string>
-	<string name="Shirt Fit">
-		Ceñido
-	</string>
-	<string name="Shirt Wrinkles">
-		Camisa: arrugas
-	</string>
-	<string name="Shoe Height">
-		Caña: altura
-	</string>
-	<string name="Short">
-		Menos
-	</string>
-	<string name="Short Arms">
-		Brazos cortos
-	</string>
-	<string name="Short Legs">
-		Piernas cortas
-	</string>
-	<string name="Short Neck">
-		Cuello corto
-	</string>
-	<string name="Short Pigtails">
-		Coletas cortas
-	</string>
-	<string name="Short Ponytail">
-		Cola de caballo corta
-	</string>
-	<string name="Short Sideburns">
-		Patillas cortas
-	</string>
-	<string name="Short Torso">
-		Torso corto
-	</string>
-	<string name="Short hips">
-		Cadera corta
-	</string>
-	<string name="Shoulders">
-		Hombros
-	</string>
-	<string name="Side Fringe">
-		Lados: franja
-	</string>
-	<string name="Sideburns">
-		Patillas
-	</string>
-	<string name="Sides Hair">
-		Pelo: lados
-	</string>
-	<string name="Sides Hair Down">
-		Bajar lados del pelo
-	</string>
-	<string name="Sides Hair Up">
-		Subir lados del pelo
-	</string>
-	<string name="Skinny Neck">
-		Cuello estrecho
-	</string>
-	<string name="Skirt Fit">
-		Falda: vuelo
-	</string>
-	<string name="Skirt Length">
-		Falda: largo
-	</string>
-	<string name="Slanted Forehead">
-		Slanted Forehead
-	</string>
-	<string name="Sleeve Length">
-		Largo de manga
-	</string>
-	<string name="Sleeve Looseness">
-		Ancho de puños
-	</string>
-	<string name="Slit Back">
-		Raja trasera
-	</string>
-	<string name="Slit Front">
-		Raja frontal
-	</string>
-	<string name="Slit Left">
-		Raja a la izq.
-	</string>
-	<string name="Slit Right">
-		Raja a la der.
-	</string>
-	<string name="Small">
-		Disminuir
-	</string>
-	<string name="Small Hands">
-		Manos pequeñas
-	</string>
-	<string name="Small Head">
-		Cabeza pequeña
-	</string>
-	<string name="Smooth">
-		Leves
-	</string>
-	<string name="Smooth Hair">
-		Pelo liso
-	</string>
-	<string name="Socks Length">
-		Calcetines: largo
-	</string>
-	<string name="Soulpatch">
-		Perilla
-	</string>
-	<string name="Sparse">
-		Depiladas
-	</string>
-	<string name="Spiked Hair">
-		Crestas
-	</string>
-	<string name="Square">
-		Cuadrada
-	</string>
-	<string name="Square Toe">
-		Punta cuadrada
-	</string>
-	<string name="Squash Head">
-		Cabeza aplastada
-	</string>
-	<string name="Stretch Head">
-		Cabeza estirada
-	</string>
-	<string name="Sunken">
-		Chupadas
-	</string>
-	<string name="Sunken Chest">
-		Estrecho de pecho
-	</string>
-	<string name="Sunken Eyes">
-		Ojos hundidos
-	</string>
-	<string name="Sweep Back">
-		Sweep Back
-	</string>
-	<string name="Sweep Forward">
-		Sweep Forward
-	</string>
-	<string name="Tall">
-		Más
-	</string>
-	<string name="Taper Back">
-		Cubierta trasera
-	</string>
-	<string name="Taper Front">
-		Cubierta frontal
-	</string>
-	<string name="Thick Heels">
-		Tacones grandes
-	</string>
-	<string name="Thick Neck">
-		Cuello ancho
-	</string>
-	<string name="Thick Toe">
-		Empeine alto
-	</string>
-	<string name="Thin">
-		Delgadas
-	</string>
-	<string name="Thin Eyebrows">
-		Cejas finas
-	</string>
-	<string name="Thin Lips">
-		Hacia dentro
-	</string>
-	<string name="Thin Nose">
-		Nariz fina
-	</string>
-	<string name="Tight Chin">
-		Poca papada
-	</string>
-	<string name="Tight Cuffs">
-		Sin campana
-	</string>
-	<string name="Tight Pants">
-		Pantalón ceñido
-	</string>
-	<string name="Tight Shirt">
-		Camisa ceñida
-	</string>
-	<string name="Tight Skirt">
-		Falda ceñida
-	</string>
-	<string name="Tight Sleeves">
-		Puños ceñidos
-	</string>
-	<string name="Toe Shape">
-		Punta: forma
-	</string>
-	<string name="Toe Thickness">
-		Empeine
-	</string>
-	<string name="Torso Length">
-		Torso: longitud
-	</string>
-	<string name="Torso Muscles">
-		Torso: musculatura
-	</string>
-	<string name="Torso Scrawny">
-		Torso flacucho
-	</string>
-	<string name="Unattached">
-		Largos
-	</string>
-	<string name="Uncreased">
-		Abiertos
-	</string>
-	<string name="Underbite">
-		Prognatismo
-	</string>
-	<string name="Unnatural">
-		No natural
-	</string>
-	<string name="Upper Bridge">
-		Puente: arriba
-	</string>
-	<string name="Upper Cheeks">
-		Mejillas: arriba
-	</string>
-	<string name="Upper Chin Cleft">
-		Barbilla: prominencia
-	</string>
-	<string name="Upper Eyelid Fold">
-		Párpados
-	</string>
-	<string name="Upturned">
-		Mucho
-	</string>
-	<string name="Very Red">
-		Del todo
-	</string>
-	<string name="Waist Height">
-		Cintura
-	</string>
-	<string name="Well-Fed">
-		Mofletes
-	</string>
-	<string name="White Hair">
-		Pelo blanco
-	</string>
-	<string name="Wide">
-		Aumentar
-	</string>
-	<string name="Wide Back">
-		Completa
-	</string>
-	<string name="Wide Front">
-		Completa
-	</string>
-	<string name="Wide Lips">
-		Labios anchos
-	</string>
-	<string name="Wild">
-		Total
-	</string>
-	<string name="Wrinkles">
-		Arrugas
-	</string>
-	<string name="LocationCtrlAddLandmarkTooltip">
-		Añadir a mis hitos
-	</string>
-	<string name="LocationCtrlEditLandmarkTooltip">
-		Editar mis hitos
-	</string>
-	<string name="LocationCtrlInfoBtnTooltip">
-		Ver más información de esta localización
-	</string>
-	<string name="LocationCtrlComboBtnTooltip">
-		Historial de mis localizaciones
-	</string>
-	<string name="LocationCtrlAdultIconTooltip">
-		Región Adulta
-	</string>
-	<string name="LocationCtrlModerateIconTooltip">
-		Región Moderada
-	</string>
-	<string name="LocationCtrlGeneralIconTooltip">
-		Región General
-	</string>
-	<string name="UpdaterWindowTitle">
-		Actualizar [APP_NAME]
-	</string>
-	<string name="UpdaterNowUpdating">
-		Actualizando [APP_NAME]...
-	</string>
-	<string name="UpdaterNowInstalling">
-		Instalando [APP_NAME]...
-	</string>
-	<string name="UpdaterUpdatingDescriptive">
-		Tu visor [APP_NAME] se está actualizando a la última versión.  Llevará algún tiempo, paciencia.
-	</string>
-	<string name="UpdaterProgressBarTextWithEllipses">
-		Descargando la actualización...
-	</string>
-	<string name="UpdaterProgressBarText">
-		Descargando la actualización
-	</string>
-	<string name="UpdaterFailDownloadTitle">
-		Fallo en la descarga de la actualización
-	</string>
-	<string name="UpdaterFailUpdateDescriptive">
-		Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
-	</string>
-	<string name="UpdaterFailInstallTitle">
-		Fallo al instalar la actualización
-	</string>
-	<string name="UpdaterFailStartTitle">
-		Fallo al iniciar el visor
-	</string>
-	<string name="ItemsComingInTooFastFrom">
-		[APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
-	</string>
-	<string name="ItemsComingInTooFast">
-		[APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
-	</string>
-	<string name="IM_logging_string">
-		-- Activado el registro de los mensajes instantáneos --
-	</string>
-	<string name="IM_typing_start_string">
-		[NAME] está escribiendo...
-	</string>
-	<string name="Unnamed">
-		(sin nombre)
-	</string>
-	<string name="IM_moderated_chat_label">
-		(Moderado: por defecto, desactivada la voz)
-	</string>
-	<string name="IM_unavailable_text_label">
-		Para esta llamada no está disponible el chat de texto.
-	</string>
-	<string name="IM_muted_text_label">
-		Un moderador del grupo ha desactivado tu chat de texto.
-	</string>
-	<string name="IM_default_text_label">
-		Pulsa aquí para enviar un mensaje instantáneo.
-	</string>
-	<string name="IM_to_label">
-		A
-	</string>
-	<string name="IM_moderator_label">
-		(Moderador)
-	</string>
-	<string name="Saved_message">
-		(Guardado [LONG_TIMESTAMP])
-	</string>
-	<string name="answered_call">
-		Han respondido a tu llamada
-	</string>
-	<string name="you_started_call">
-		Has iniciado una llamada de voz
-	</string>
-	<string name="you_joined_call">
-		Has entrado en la llamada de voz
-	</string>
-	<string name="name_started_call">
-		[NAME] inició una llamada de voz
-	</string>
-	<string name="ringing-im">
-		Haciendo la llamada de voz...
-	</string>
-	<string name="connected-im">
-		Conectado, pulsa Colgar para salir
-	</string>
-	<string name="hang_up-im">
-		Se colgó la llamada de voz
-	</string>
-	<string name="conference-title-incoming">
-		Conferencia con [AGENT_NAME]
-	</string>
-	<string name="no_session_message">
-		(La sesión de MI no existe)
-	</string>
-	<string name="only_user_message">
-		Usted es el único usuario en esta sesión.
-	</string>
-	<string name="offline_message">
-		[NAME] está desconectado.
-	</string>
-	<string name="invite_message">
-		Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
-	</string>
-	<string name="muted_message">
-		Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
-	</string>
-	<string name="generic">
-		Error en lo solicitado, por favor, inténtalo más tarde.
-	</string>
-	<string name="generic_request_error">
-		Error al hacer lo solicitado; por favor, inténtelo más tarde.
-	</string>
-	<string name="insufficient_perms_error">
-		Usted no tiene permisos suficientes.
-	</string>
-	<string name="session_does_not_exist_error">
-		La sesión ya acabó
-	</string>
-	<string name="no_ability_error">
-		Usted no tiene esa capacidad.
-	</string>
-	<string name="no_ability">
-		Usted no tiene esa capacidad.
-	</string>
-	<string name="not_a_mod_error">
-		Usted no es un moderador de la sesión.
-	</string>
-	<string name="muted">
-		Un moderador del grupo ha desactivado tu chat de texto.
-	</string>
-	<string name="muted_error">
-		Un moderador del grupo le ha desactivado el chat de texto.
-	</string>
-	<string name="add_session_event">
-		No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
-	</string>
-	<string name="message">
-		No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
-	</string>
-	<string name="message_session_event">
-		No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
-	</string>
-	<string name="mute">
-		Error moderando.
-	</string>
-	<string name="removed">
-		Se te ha sacado del grupo.
-	</string>
-	<string name="removed_from_group">
-		Ha sido eliminado del grupo.
-	</string>
-	<string name="close_on_no_ability">
-		Usted ya no tendrá más la capacidad de estar en la sesión de chat.
-	</string>
-	<string name="unread_chat_single">
-		[SOURCES] ha dicho algo nuevo
-	</string>
-	<string name="unread_chat_multiple">
-		[SOURCES] ha dicho algo nuevo
-	</string>
-	<string name="session_initialization_timed_out_error">
-		Se ha agotado el tiempo del inicio de sesión
-	</string>
-	<string name="voice_morphing_url">
-		http://secondlife.com/landing/voicemorphing
-	</string>
-	<string name="paid_you_ldollars">
-		[NAME] te ha pagado [AMOUNT] L$ [REASON].
-	</string>
-	<string name="paid_you_ldollars_no_reason">
-		[NAME] te ha pagado [AMOUNT] L$.
-	</string>
-	<string name="you_paid_ldollars">
-		Has pagado [AMOUNT] L$ a [NAME] por [REASON].
-	</string>
-	<string name="you_paid_ldollars_no_info">
-		Has pagado[AMOUNT] L$
-	</string>
-	<string name="you_paid_ldollars_no_reason">
-		Has pagado [AMOUNT] L$ a [NAME].
-	</string>
-	<string name="you_paid_ldollars_no_name">
-		Has pagado [AMOUNT] L$ por [REASON].
-	</string>
-	<string name="for item">
-		para [ITEM]
-	</string>
-	<string name="for a parcel of land">
-		para una parcela de terreno
-	</string>
-	<string name="for a land access pass">
-		para un pase de acceso a terrenos
-	</string>
-	<string name="for deeding land">
-		for deeding land
-	</string>
-	<string name="to create a group">
-		para crear un grupo
-	</string>
-	<string name="to join a group">
-		para entrar a un grupo
-	</string>
-	<string name="to upload">
-		to upload
-	</string>
-	<string name="to publish a classified ad">
-		para publicar un anuncio clasificado
-	</string>
-	<string name="giving">
-		Dando [AMOUNT] L$
-	</string>
-	<string name="uploading_costs">
-		Subir esto cuesta [AMOUNT] L$
-	</string>
-	<string name="this_costs">
-		Esto cuesta [AMOUNT] L$
-	</string>
-	<string name="buying_selected_land">
-		Compra del terreno seleccionado por [AMOUNT] L$
-	</string>
-	<string name="this_object_costs">
-		Este objeto cuesta [AMOUNT] L$
-	</string>
-	<string name="group_role_everyone">
-		Todos
-	</string>
-	<string name="group_role_officers">
-		Oficiales
-	</string>
-	<string name="group_role_owners">
-		Propietarios
-	</string>
-	<string name="group_member_status_online">
-		Conectado/a
-	</string>
-	<string name="uploading_abuse_report">
-		Subiendo...
-  
-Denuncia de infracción
-	</string>
-	<string name="New Shape">
-		Anatomía nueva
-	</string>
-	<string name="New Skin">
-		Piel nueva
-	</string>
-	<string name="New Hair">
-		Pelo nuevo
-	</string>
-	<string name="New Eyes">
-		Ojos nuevos
-	</string>
-	<string name="New Shirt">
-		Camisa nueva
-	</string>
-	<string name="New Pants">
-		Pantalón nuevo
-	</string>
-	<string name="New Shoes">
-		Zapatos nuevos
-	</string>
-	<string name="New Socks">
-		Calcetines nuevos
-	</string>
-	<string name="New Jacket">
-		Chaqueta nueva
-	</string>
-	<string name="New Gloves">
-		Guantes nuevos
-	</string>
-	<string name="New Undershirt">
-		Camiseta nueva
-	</string>
-	<string name="New Underpants">
-		Ropa interior nueva
-	</string>
-	<string name="New Skirt">
-		Falda nueva
-	</string>
-	<string name="New Alpha">
-		Nueva Alfa
-	</string>
-	<string name="New Tattoo">
-		Tatuaje nuevo
-	</string>
-	<string name="New Physics">
-		Nueva física
-	</string>
-	<string name="Invalid Wearable">
-		No se puede poner
-	</string>
-	<string name="New Gesture">
-		Gesto nuevo
-	</string>
-	<string name="New Script">
-		Script nuevo
-	</string>
-	<string name="New Note">
-		Nota nueva
-	</string>
-	<string name="New Folder">
-		Carpeta nueva
-	</string>
-	<string name="Contents">
-		Contenidos
-	</string>
-	<string name="Gesture">
-		Gestos
-	</string>
-	<string name="Male Gestures">
-		Gestos de hombre
-	</string>
-	<string name="Female Gestures">
-		Gestos de mujer
-	</string>
-	<string name="Other Gestures">
-		Otros gestos
-	</string>
-	<string name="Speech Gestures">
-		Gestos al hablar
-	</string>
-	<string name="Common Gestures">
-		Gestos corrientes
-	</string>
-	<string name="Male - Excuse me">
-		Varón - Disculpa
-	</string>
-	<string name="Male - Get lost">
-		Varón – Déjame en paz
-	</string>
-	<string name="Male - Blow kiss">
-		Varón - Lanzar un beso
-	</string>
-	<string name="Male - Boo">
-		Varón - Abucheo
-	</string>
-	<string name="Male - Bored">
-		Varón - Aburrido
-	</string>
-	<string name="Male - Hey">
-		Varón – ¡Eh!
-	</string>
-	<string name="Male - Laugh">
-		Varón - Risa
-	</string>
-	<string name="Male - Repulsed">
-		Varón - Rechazo
-	</string>
-	<string name="Male - Shrug">
-		Varón - Encogimiento de hombros
-	</string>
-	<string name="Male - Stick tougue out">
-		Varón - Sacando la lengua
-	</string>
-	<string name="Male - Wow">
-		Varón - Admiración
-	</string>
-	<string name="Female - Chuckle">
-		Mujer - Risa suave
-	</string>
-	<string name="Female - Cry">
-		Mujer - Llorar
-	</string>
-	<string name="Female - Embarrassed">
-		Mujer - Ruborizada
-	</string>
-	<string name="Female - Excuse me">
-		Mujer - Disculpa
-	</string>
-	<string name="Female - Get lost">
-		Mujer – Déjame en paz
-	</string>
-	<string name="Female - Blow kiss">
-		Mujer - Lanzar un beso
-	</string>
-	<string name="Female - Boo">
-		Mujer - Abucheo
-	</string>
-	<string name="Female - Bored">
-		Mujer - Aburrida
-	</string>
-	<string name="Female - Hey">
-		Mujer - ¡Eh!
-	</string>
-	<string name="Female - Hey baby">
-		Mujer - ¡Eh, encanto!
-	</string>
-	<string name="Female - Laugh">
-		Mujer - Risa
-	</string>
-	<string name="Female - Looking good">
-		Mujer - Buen aspecto
-	</string>
-	<string name="Female - Over here">
-		Mujer - Por aquí
-	</string>
-	<string name="Female - Please">
-		Mujer - Por favor
-	</string>
-	<string name="Female - Repulsed">
-		Mujer - Rechazo
-	</string>
-	<string name="Female - Shrug">
-		Mujer - Encogimiento de hombros
-	</string>
-	<string name="Female - Stick tougue out">
-		Mujer - Sacando la lengua
-	</string>
-	<string name="Female - Wow">
-		Mujer - Admiración
-	</string>
-	<string name="AvatarBirthDateFormat">
-		[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
-	</string>
-	<string name="DefaultMimeType">
-		ninguno/ninguno
-	</string>
-	<string name="texture_load_dimensions_error">
-		No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
-	</string>
-	<string name="words_separator" value=","/>
-	<string name="server_is_down">
-		Parece que hay algún problema que ha escapado a nuestros controles.
-
-	Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.  
-        Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
-	</string>
-	<string name="dateTimeWeekdaysNames">
-		Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
-	</string>
-	<string name="dateTimeWeekdaysShortNames">
-		Dom:Lun:Mar:Mié:Jue:Vie:Sáb
-	</string>
-	<string name="dateTimeMonthNames">
-		Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
-	</string>
-	<string name="dateTimeMonthShortNames">
-		Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
-	</string>
-	<string name="dateTimeDayFormat">
-		[MDAY]
-	</string>
-	<string name="dateTimeAM">
-		AM
-	</string>
-	<string name="dateTimePM">
-		PM
-	</string>
-	<string name="LocalEstimateUSD">
-		[AMOUNT] US$
-	</string>
-	<string name="Membership">
-		Membresía
-	</string>
-	<string name="Roles">
-		Roles
-	</string>
-	<string name="Group Identity">
-		Indentidad de grupo
-	</string>
-	<string name="Parcel Management">
-		Gestión de la parcela
-	</string>
-	<string name="Parcel Identity">
-		Identidad de la parcela
-	</string>
-	<string name="Parcel Settings">
-		Configuración de la parcela
-	</string>
-	<string name="Parcel Powers">
-		Poder de la parcela
-	</string>
-	<string name="Parcel Access">
-		Acceso a la parcela
-	</string>
-	<string name="Parcel Content">
-		Contenido de la parcela
-	</string>
-	<string name="Object Management">
-		Manejo de objetos
-	</string>
-	<string name="Accounting">
-		Contabilidad
-	</string>
-	<string name="Notices">
-		Avisos
-	</string>
-	<string name="Chat" value="Chat :">
-		Chat
-	</string>
-	<string name="DeleteItems">
-		¿Deseas eliminar los elementos seleccionados?
-	</string>
-	<string name="DeleteItem">
-		¿Deseas eliminar el elemento seleccionado?
-	</string>
-	<string name="EmptyOutfitText">
-		No hay elementos en este vestuario
-	</string>
-	<string name="ExternalEditorNotSet">
-		Selecciona un editor mediante la configuración de ExternalEditor.
-	</string>
-	<string name="ExternalEditorNotFound">
-		No se encuentra el editor externo especificado.
-Inténtalo incluyendo la ruta de acceso al editor entre comillas
-(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
-	</string>
-	<string name="ExternalEditorCommandParseError">
-		Error al analizar el comando de editor externo.
-	</string>
-	<string name="ExternalEditorFailedToRun">
-		Error al ejecutar el editor externo.
-	</string>
-	<string name="Esc">
-		Esc
-	</string>
-	<string name="Space">
-		Space
-	</string>
-	<string name="Enter">
-		Enter
-	</string>
-	<string name="Tab">
-		Tab
-	</string>
-	<string name="Ins">
-		Ins
-	</string>
-	<string name="Del">
-		Del
-	</string>
-	<string name="Backsp">
-		Backsp
-	</string>
-	<string name="Shift">
-		Shift
-	</string>
-	<string name="Ctrl">
-		Ctrl
-	</string>
-	<string name="Alt">
-		Alt
-	</string>
-	<string name="CapsLock">
-		CapsLock
-	</string>
-	<string name="Home">
-		Base
-	</string>
-	<string name="End">
-		End
-	</string>
-	<string name="PgUp">
-		PgUp
-	</string>
-	<string name="PgDn">
-		PgDn
-	</string>
-	<string name="F1">
-		F1
-	</string>
-	<string name="F2">
-		F2
-	</string>
-	<string name="F3">
-		F3
-	</string>
-	<string name="F4">
-		F4
-	</string>
-	<string name="F5">
-		F5
-	</string>
-	<string name="F6">
-		F6
-	</string>
-	<string name="F7">
-		F7
-	</string>
-	<string name="F8">
-		F8
-	</string>
-	<string name="F9">
-		F9
-	</string>
-	<string name="F10">
-		F10
-	</string>
-	<string name="F11">
-		F11
-	</string>
-	<string name="F12">
-		F12
-	</string>
-	<string name="Add">
-		Añadir
-	</string>
-	<string name="Subtract">
-		Restar
-	</string>
-	<string name="Multiply">
-		Multiplicar
-	</string>
-	<string name="Divide">
-		Dividir
-	</string>
-	<string name="PAD_DIVIDE">
-		PAD_DIVIDE
-	</string>
-	<string name="PAD_LEFT">
-		PAD_LEFT
-	</string>
-	<string name="PAD_RIGHT">
-		PAD_RIGHT
-	</string>
-	<string name="PAD_DOWN">
-		PAD_DOWN
-	</string>
-	<string name="PAD_UP">
-		PAD_UP
-	</string>
-	<string name="PAD_HOME">
-		PAD_HOME
-	</string>
-	<string name="PAD_END">
-		PAD_END
-	</string>
-	<string name="PAD_PGUP">
-		PAD_PGUP
-	</string>
-	<string name="PAD_PGDN">
-		PAD_PGDN
-	</string>
-	<string name="PAD_CENTER">
-		PAD_CENTER
-	</string>
-	<string name="PAD_INS">
-		PAD_INS
-	</string>
-	<string name="PAD_DEL">
-		PAD_DEL
-	</string>
-	<string name="PAD_Enter">
-		PAD_Enter
-	</string>
-	<string name="PAD_BUTTON0">
-		PAD_BUTTON0
-	</string>
-	<string name="PAD_BUTTON1">
-		PAD_BUTTON1
-	</string>
-	<string name="PAD_BUTTON2">
-		PAD_BUTTON2
-	</string>
-	<string name="PAD_BUTTON3">
-		PAD_BUTTON3
-	</string>
-	<string name="PAD_BUTTON4">
-		PAD_BUTTON4
-	</string>
-	<string name="PAD_BUTTON5">
-		PAD_BUTTON5
-	</string>
-	<string name="PAD_BUTTON6">
-		PAD_BUTTON6
-	</string>
-	<string name="PAD_BUTTON7">
-		PAD_BUTTON7
-	</string>
-	<string name="PAD_BUTTON8">
-		PAD_BUTTON8
-	</string>
-	<string name="PAD_BUTTON9">
-		PAD_BUTTON9
-	</string>
-	<string name="PAD_BUTTON10">
-		PAD_BUTTON10
-	</string>
-	<string name="PAD_BUTTON11">
-		PAD_BUTTON11
-	</string>
-	<string name="PAD_BUTTON12">
-		PAD_BUTTON12
-	</string>
-	<string name="PAD_BUTTON13">
-		PAD_BUTTON13
-	</string>
-	<string name="PAD_BUTTON14">
-		PAD_BUTTON14
-	</string>
-	<string name="PAD_BUTTON15">
-		PAD_BUTTON15
-	</string>
-	<string name="-">
-		-
-	</string>
-	<string name="=">
-		=
-	</string>
-	<string name="`">
-		`
-	</string>
-	<string name=";">
-		;
-	</string>
-	<string name="[">
-		[
-	</string>
-	<string name="]">
-		]
-	</string>
-	<string name="\">
-		\
-	</string>
-	<string name="0">
-		0
-	</string>
-	<string name="1">
-		1
-	</string>
-	<string name="2">
-		2
-	</string>
-	<string name="3">
-		3
-	</string>
-	<string name="4">
-		4
-	</string>
-	<string name="5">
-		5
-	</string>
-	<string name="6">
-		6
-	</string>
-	<string name="7">
-		7
-	</string>
-	<string name="8">
-		8
-	</string>
-	<string name="9">
-		9
-	</string>
-	<string name="A">
-		A
-	</string>
-	<string name="B">
-		B
-	</string>
-	<string name="C">
-		C
-	</string>
-	<string name="D">
-		D
-	</string>
-	<string name="E">
-		E
-	</string>
-	<string name="F">
-		F
-	</string>
-	<string name="G">
-		G
-	</string>
-	<string name="H">
-		H
-	</string>
-	<string name="I">
-		I
-	</string>
-	<string name="J">
-		J
-	</string>
-	<string name="K">
-		K
-	</string>
-	<string name="L">
-		L
-	</string>
-	<string name="M">
-		M
-	</string>
-	<string name="N">
-		N
-	</string>
-	<string name="O">
-		O
-	</string>
-	<string name="P">
-		P
-	</string>
-	<string name="Q">
-		Q
-	</string>
-	<string name="R">
-		R
-	</string>
-	<string name="S">
-		S
-	</string>
-	<string name="T">
-		T
-	</string>
-	<string name="U">
-		U
-	</string>
-	<string name="V">
-		V
-	</string>
-	<string name="W">
-		W
-	</string>
-	<string name="X">
-		X
-	</string>
-	<string name="Y">
-		Y
-	</string>
-	<string name="Z">
-		Z
-	</string>
-	<string name="BeaconParticle">
-		Viendo balizas de partículas (azules)
-	</string>
-	<string name="BeaconPhysical">
-		Viendo balizas de objetos materiales (verdes)
-	</string>
-	<string name="BeaconScripted">
-		Viendo balizas de objetos con script (rojas)
-	</string>
-	<string name="BeaconScriptedTouch">
-		Viendo el objeto con script con balizas de función táctil (rojas)
-	</string>
-	<string name="BeaconSound">
-		Viendo balizas de sonido (amarillas)
-	</string>
-	<string name="BeaconMedia">
-		Viendo balizas de medios (blancas)
-	</string>
-	<string name="ParticleHiding">
-		Ocultando las partículas
-	</string>
-</strings>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- This file contains strings that used to be hardcoded in the source.
+     It is only for those strings which do not belong in a floater.
+     For example, the strings used in avatar chat bubbles, and strings
+     that are returned from one component and may appear in many places-->
+<strings>
+	<string name="CAPITALIZED_APP_NAME">
+		SECOND LIFE
+	</string>
+	<string name="SUPPORT_SITE">
+		Portal de Soporte de Second Life
+	</string>
+	<string name="StartupDetectingHardware">
+		Identificando el hardware...
+	</string>
+	<string name="StartupLoading">
+		Instalando [APP_NAME]...
+	</string>
+	<string name="StartupClearingCache">
+		Limpiando la caché...
+	</string>
+	<string name="StartupInitializingTextureCache">
+		Iniciando la caché de las texturas...
+	</string>
+	<string name="StartupInitializingVFS">
+		Iniciando VFS...
+	</string>
+	<string name="ProgressRestoring">
+		Restaurando...
+	</string>
+	<string name="ProgressChangingResolution">
+		Cambiando la resolución...
+	</string>
+	<string name="LoginInProgress">
+		Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
+	</string>
+	<string name="LoginInProgressNoFrozen">
+		Iniciando la sesión...
+	</string>
+	<string name="LoginAuthenticating">
+		Autenticando
+	</string>
+	<string name="LoginMaintenance">
+		Realizando el mantenimiento de la cuenta...
+	</string>
+	<string name="LoginAttempt">
+		Ha fallado el intento previo de iniciar sesión. Iniciando sesión, intento [NUMBER]
+	</string>
+	<string name="LoginPrecaching">
+		Cargando el mundo...
+	</string>
+	<string name="LoginInitializingBrowser">
+		Iniciando el navegador web incorporado...
+	</string>
+	<string name="LoginInitializingMultimedia">
+		Iniciando multimedia...
+	</string>
+	<string name="LoginInitializingFonts">
+		Cargando las fuentes...
+	</string>
+	<string name="LoginVerifyingCache">
+		Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
+	</string>
+	<string name="LoginProcessingResponse">
+		Procesando la respuesta...
+	</string>
+	<string name="LoginInitializingWorld">
+		Iniciando el mundo...
+	</string>
+	<string name="LoginDecodingImages">
+		Decodificando las imágenes...
+	</string>
+	<string name="LoginInitializingQuicktime">
+		Iniciando QuickTime...
+	</string>
+	<string name="LoginQuicktimeNotFound">
+		No se ha encontrado QuickTime. Imposible iniciarlo.
+	</string>
+	<string name="LoginQuicktimeOK">
+		QuickTime se ha iniciado adecuadamente.
+	</string>
+	<string name="LoginWaitingForRegionHandshake">
+		Esperando la conexión con la región...
+	</string>
+	<string name="LoginConnectingToRegion">
+		Conectando con la región...
+	</string>
+	<string name="LoginDownloadingClothing">
+		Descargando la ropa...
+	</string>
+	<string name="InvalidCertificate">
+		El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
+	</string>
+	<string name="CertInvalidHostname">
+		El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
+	</string>
+	<string name="CertExpired">
+		Parece que el certificado que devolvió la cuadrícula está caducado.  Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
+	</string>
+	<string name="CertKeyUsage">
+		El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
+	</string>
+	<string name="CertBasicConstraints">
+		La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
+	</string>
+	<string name="CertInvalidSignature">
+		No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
+	</string>
+	<string name="LoginFailedNoNetwork">
+		Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
+	</string>
+	<string name="LoginFailed">
+		Error en el inicio de sesión.
+	</string>
+	<string name="Quit">
+		Salir
+	</string>
+	<string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=es-ES
+	</string>
+	<string name="AgentLostConnection">
+		Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
+	</string>
+	<string name="SavingSettings">
+		Guardando tus configuraciones...
+	</string>
+	<string name="LoggingOut">
+		Cerrando sesión...
+	</string>
+	<string name="ShuttingDown">
+		Cerrando...
+	</string>
+	<string name="YouHaveBeenDisconnected">
+		Has sido desconectado de la región en la que estabas.
+	</string>
+	<string name="SentToInvalidRegion">
+		Has sido enviado a una región no válida.
+	</string>
+	<string name="TestingDisconnect">
+		Probando la desconexión del visor
+	</string>
+	<string name="TooltipPerson">
+		Persona
+	</string>
+	<string name="TooltipNoName">
+		(sin nombre)
+	</string>
+	<string name="TooltipOwner">
+		Propietario:
+	</string>
+	<string name="TooltipPublic">
+		Público
+	</string>
+	<string name="TooltipIsGroup">
+		(Grupo)
+	</string>
+	<string name="TooltipForSaleL$">
+		En venta: [AMOUNT] L$
+	</string>
+	<string name="TooltipFlagGroupBuild">
+		Construir el grupo
+	</string>
+	<string name="TooltipFlagNoBuild">
+		No construir
+	</string>
+	<string name="TooltipFlagNoEdit">
+		Construir el grupo
+	</string>
+	<string name="TooltipFlagNotSafe">
+		No seguro
+	</string>
+	<string name="TooltipFlagNoFly">
+		No volar
+	</string>
+	<string name="TooltipFlagGroupScripts">
+		Scripts el grupo
+	</string>
+	<string name="TooltipFlagNoScripts">
+		No scripts
+	</string>
+	<string name="TooltipLand">
+		Terreno:
+	</string>
+	<string name="TooltipMustSingleDrop">
+		Aquí se puede arrastrar sólo un ítem
+	</string>
+	<string name="TooltipPrice" value="[AMOUNT] L$:"/>
+	<string name="TooltipHttpUrl">
+		Pulsa para ver esta página web
+	</string>
+	<string name="TooltipSLURL">
+		Pulsa para ver la información de este lugar
+	</string>
+	<string name="TooltipAgentUrl">
+		Pulsa para ver el perfil del Residente
+	</string>
+	<string name="TooltipAgentInspect">
+		Obtén más información acerca de este residente.
+	</string>
+	<string name="TooltipAgentMute">
+		Pulsa para silenciar a este Residente
+	</string>
+	<string name="TooltipAgentUnmute">
+		Pulsa para quitar el silencio a este Residente
+	</string>
+	<string name="TooltipAgentIM">
+		Pulsa para enviar un MI a este Residente
+	</string>
+	<string name="TooltipAgentPay">
+		Pulsa para pagar a este Residente
+	</string>
+	<string name="TooltipAgentOfferTeleport">
+		Pulsa para enviar una petición de teleporte a este Residente
+	</string>
+	<string name="TooltipAgentRequestFriend">
+		Pulsa para enviar una petición de amistad a este Residente
+	</string>
+	<string name="TooltipGroupUrl">
+		Pulsa para ver la descripción de este grupo
+	</string>
+	<string name="TooltipEventUrl">
+		Pulsa para ver la descripción de este evento
+	</string>
+	<string name="TooltipClassifiedUrl">
+		Pulsa para ver este clasificado
+	</string>
+	<string name="TooltipParcelUrl">
+		Pulsa para ver la descripción de esta parcela
+	</string>
+	<string name="TooltipTeleportUrl">
+		Pulsa para teleportarte a esta posición
+	</string>
+	<string name="TooltipObjectIMUrl">
+		Pulsa para ver la descripción de este objeto
+	</string>
+	<string name="TooltipMapUrl">
+		Pulsa para ver en el mapa esta localización
+	</string>
+	<string name="TooltipSLAPP">
+		Pulsa para ejecutar el comando secondlife://
+	</string>
+	<string name="CurrentURL" value="URL actual: [CurrentURL]"/>
+	<string name="SLurlLabelTeleport">
+		Teleportarse a
+	</string>
+	<string name="SLurlLabelShowOnMap">
+		Mostrarla en el mapa
+	</string>
+	<string name="SLappAgentMute">
+		Silenciar
+	</string>
+	<string name="SLappAgentUnmute">
+		Quitar el silencio
+	</string>
+	<string name="SLappAgentIM">
+		MI
+	</string>
+	<string name="SLappAgentPay">
+		Pagar
+	</string>
+	<string name="SLappAgentOfferTeleport">
+		Ofrecer teleporte a
+	</string>
+	<string name="SLappAgentRequestFriend">
+		Petición de amistad
+	</string>
+	<string name="BUTTON_CLOSE_DARWIN">
+		Cerrar (⌘W)
+	</string>
+	<string name="BUTTON_CLOSE_WIN">
+		Cerrar (Ctrl+W)
+	</string>
+	<string name="BUTTON_CLOSE_CHROME">
+		Cerrar
+	</string>
+	<string name="BUTTON_RESTORE">
+		Maximizar
+	</string>
+	<string name="BUTTON_MINIMIZE">
+		Minimizar
+	</string>
+	<string name="BUTTON_TEAR_OFF">
+		Separar la ventana
+	</string>
+	<string name="BUTTON_DOCK">
+		Fijar
+	</string>
+	<string name="BUTTON_HELP">
+		Ver la Ayuda
+	</string>
+	<string name="Searching">
+		Buscando...
+	</string>
+	<string name="NoneFound">
+		No se ha encontrado.
+	</string>
+	<string name="RetrievingData">
+		Reintentando...
+	</string>
+	<string name="ReleaseNotes">
+		Notas de la versión
+	</string>
+	<string name="RELEASE_NOTES_BASE_URL">
+		http://wiki.secondlife.com/wiki/Release_Notes/
+	</string>
+	<string name="LoadingData">
+		Cargando...
+	</string>
+	<string name="AvatarNameNobody">
+		(nadie)
+	</string>
+	<string name="AvatarNameWaiting">
+		(esperando)
+	</string>
+	<string name="GroupNameNone">
+		(ninguno)
+	</string>
+	<string name="AvalineCaller">
+		Avaline: [ORDER]
+	</string>
+	<string name="AssetErrorNone">
+		No hay ningún error
+	</string>
+	<string name="AssetErrorRequestFailed">
+		Petición de asset: fallida
+	</string>
+	<string name="AssetErrorNonexistentFile">
+		Petición de asset: el archivo no existe
+	</string>
+	<string name="AssetErrorNotInDatabase">
+		Petición de asset: no se encontró el asset en la base de datos
+	</string>
+	<string name="AssetErrorEOF">
+		Fin del archivo
+	</string>
+	<string name="AssetErrorCannotOpenFile">
+		No puede abrirse el archivo
+	</string>
+	<string name="AssetErrorFileNotFound">
+		No se ha encontrado el archivo
+	</string>
+	<string name="AssetErrorTCPTimeout">
+		Tiempo de transferencia del archivo
+	</string>
+	<string name="AssetErrorCircuitGone">
+		Circuito desconectado
+	</string>
+	<string name="AssetErrorPriceMismatch">
+		No concuerda el precio en el visor y en el servidor
+	</string>
+	<string name="AssetErrorUnknownStatus">
+		Estado desconocido
+	</string>
+	<string name="texture">
+		la textura
+	</string>
+	<string name="sound">
+		el sonido
+	</string>
+	<string name="calling card">
+		la tarjeta de visita
+	</string>
+	<string name="landmark">
+		el hito
+	</string>
+	<string name="legacy script">
+		el script antiguo
+	</string>
+	<string name="clothing">
+		esa ropa
+	</string>
+	<string name="object">
+		el objeto
+	</string>
+	<string name="note card">
+		la nota
+	</string>
+	<string name="folder">
+		la carpeta
+	</string>
+	<string name="root">
+		la ruta
+	</string>
+	<string name="lsl2 script">
+		ese script de LSL2
+	</string>
+	<string name="lsl bytecode">
+		el código intermedio de LSL
+	</string>
+	<string name="tga texture">
+		esa textura tga
+	</string>
+	<string name="body part">
+		esa parte del cuerpo
+	</string>
+	<string name="snapshot">
+		la foto
+	</string>
+	<string name="lost and found">
+		Objetos Perdidos
+	</string>
+	<string name="targa image">
+		esa imagen targa
+	</string>
+	<string name="trash">
+		la Papelera
+	</string>
+	<string name="jpeg image">
+		esa imagen jpeg
+	</string>
+	<string name="animation">
+		la animación
+	</string>
+	<string name="gesture">
+		el gesto
+	</string>
+	<string name="simstate">
+		simstate
+	</string>
+	<string name="favorite">
+		ese favorito
+	</string>
+	<string name="symbolic link">
+		el enlace
+	</string>
+	<string name="symbolic folder link">
+		enlace de la carpeta
+	</string>
+	<string name="AvatarAway">
+		Ausente
+	</string>
+	<string name="AvatarBusy">
+		Ocupado
+	</string>
+	<string name="AvatarMuted">
+		Ignorado
+	</string>
+	<string name="anim_express_afraid">
+		Susto
+	</string>
+	<string name="anim_express_anger">
+		Enfado
+	</string>
+	<string name="anim_away">
+		Ausente
+	</string>
+	<string name="anim_backflip">
+		Salto mortal atrás
+	</string>
+	<string name="anim_express_laugh">
+		Carcajada
+	</string>
+	<string name="anim_express_toothsmile">
+		Gran sonrisa
+	</string>
+	<string name="anim_blowkiss">
+		Mandar un beso
+	</string>
+	<string name="anim_express_bored">
+		Aburrimiento
+	</string>
+	<string name="anim_bow">
+		Reverencia
+	</string>
+	<string name="anim_clap">
+		Aplauso
+	</string>
+	<string name="anim_courtbow">
+		Reverencia floreada
+	</string>
+	<string name="anim_express_cry">
+		Llanto
+	</string>
+	<string name="anim_dance1">
+		Baile 1
+	</string>
+	<string name="anim_dance2">
+		Baile 2
+	</string>
+	<string name="anim_dance3">
+		Baile 3
+	</string>
+	<string name="anim_dance4">
+		Baile 4
+	</string>
+	<string name="anim_dance5">
+		Baile 5
+	</string>
+	<string name="anim_dance6">
+		Baile 6
+	</string>
+	<string name="anim_dance7">
+		Baile 7
+	</string>
+	<string name="anim_dance8">
+		Baile 8
+	</string>
+	<string name="anim_express_disdain">
+		Desdén
+	</string>
+	<string name="anim_drink">
+		Beber
+	</string>
+	<string name="anim_express_embarrased">
+		Azorarse
+	</string>
+	<string name="anim_angry_fingerwag">
+		Negar con el dedo
+	</string>
+	<string name="anim_fist_pump">
+		Éxito con el puño
+	</string>
+	<string name="anim_yoga_float">
+		Yoga flotando
+	</string>
+	<string name="anim_express_frown">
+		Fruncir el ceño
+	</string>
+	<string name="anim_impatient">
+		Impaciente
+	</string>
+	<string name="anim_jumpforjoy">
+		Salto de alegría
+	</string>
+	<string name="anim_kissmybutt">
+		Bésame el culo
+	</string>
+	<string name="anim_express_kiss">
+		Besar
+	</string>
+	<string name="anim_laugh_short">
+		Reír
+	</string>
+	<string name="anim_musclebeach">
+		Sacar músculo
+	</string>
+	<string name="anim_no_unhappy">
+		No (con enfado)
+	</string>
+	<string name="anim_no_head">
+		No
+	</string>
+	<string name="anim_nyanya">
+		Ña-Ña-Ña
+	</string>
+	<string name="anim_punch_onetwo">
+		Puñetazo uno-dos
+	</string>
+	<string name="anim_express_open_mouth">
+		Abrir la boca
+	</string>
+	<string name="anim_peace">
+		&apos;V&apos; con los dedos
+	</string>
+	<string name="anim_point_you">
+		Señalar a otro/a
+	</string>
+	<string name="anim_point_me">
+		Señalarse
+	</string>
+	<string name="anim_punch_l">
+		Puñetazo izquierdo
+	</string>
+	<string name="anim_punch_r">
+		Puñetazo derecho
+	</string>
+	<string name="anim_rps_countdown">
+		PPT cuenta
+	</string>
+	<string name="anim_rps_paper">
+		PPT papel
+	</string>
+	<string name="anim_rps_rock">
+		PPT piedra
+	</string>
+	<string name="anim_rps_scissors">
+		PPT tijera
+	</string>
+	<string name="anim_express_repulsed">
+		Repulsa
+	</string>
+	<string name="anim_kick_roundhouse_r">
+		Patada circular
+	</string>
+	<string name="anim_express_sad">
+		Triste
+	</string>
+	<string name="anim_salute">
+		Saludo militar
+	</string>
+	<string name="anim_shout">
+		Gritar
+	</string>
+	<string name="anim_express_shrug">
+		Encogerse de hombros
+	</string>
+	<string name="anim_express_smile">
+		Sonreír
+	</string>
+	<string name="anim_smoke_idle">
+		Fumar: en la mano
+	</string>
+	<string name="anim_smoke_inhale">
+		Fumar
+	</string>
+	<string name="anim_smoke_throw_down">
+		Fumar: tirar el cigarro
+	</string>
+	<string name="anim_express_surprise">
+		Sorpresa
+	</string>
+	<string name="anim_sword_strike_r">
+		Estocadas
+	</string>
+	<string name="anim_angry_tantrum">
+		Berrinche
+	</string>
+	<string name="anim_express_tongue_out">
+		Sacar la lengua
+	</string>
+	<string name="anim_hello">
+		Agitar la mano
+	</string>
+	<string name="anim_whisper">
+		Cuchichear
+	</string>
+	<string name="anim_whistle">
+		Pitar
+	</string>
+	<string name="anim_express_wink">
+		Guiño
+	</string>
+	<string name="anim_wink_hollywood">
+		Guiño (Hollywood)
+	</string>
+	<string name="anim_express_worry">
+		Preocuparse
+	</string>
+	<string name="anim_yes_happy">
+		Sí (contento)
+	</string>
+	<string name="anim_yes_head">
+		Sí
+	</string>
+	<string name="texture_loading">
+		Cargando...
+	</string>
+	<string name="worldmap_offline">
+		Sin conexión
+	</string>
+	<string name="worldmap_item_tooltip_format">
+		[PRICE] L$ por [AREA] m²
+	</string>
+	<string name="worldmap_results_none_found">
+		No se ha encontrado.
+	</string>
+	<string name="Ok">
+		OK
+	</string>
+	<string name="Premature end of file">
+		Fin prematuro del archivo
+	</string>
+	<string name="ST_NO_JOINT">
+		No se puede encontrar ROOT o JOINT.
+	</string>
+	<string name="whisper">
+		susurra:
+	</string>
+	<string name="shout">
+		grita:
+	</string>
+	<string name="ringing">
+		Conectando al chat de voz...
+	</string>
+	<string name="connected">
+		Conectado
+	</string>
+	<string name="unavailable">
+		La voz no está disponible en su localización actual
+	</string>
+	<string name="hang_up">
+		Desconectado del chat de voz
+	</string>
+	<string name="reconnect_nearby">
+		Vas a ser reconectado al chat de voz con los cercanos
+	</string>
+	<string name="ScriptQuestionCautionChatGranted">
+		&apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
+	</string>
+	<string name="ScriptQuestionCautionChatDenied">
+		A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
+	</string>
+	<string name="ScriptTakeMoney">
+		Cogerle a usted dólares Linden (L$)
+	</string>
+	<string name="ActOnControlInputs">
+		Actuar en sus controles de entrada
+	</string>
+	<string name="RemapControlInputs">
+		Reconfigurar sus controles de entrada
+	</string>
+	<string name="AnimateYourAvatar">
+		Ejecutar animaciones en su avatar
+	</string>
+	<string name="AttachToYourAvatar">
+		Anexarse a su avatar
+	</string>
+	<string name="ReleaseOwnership">
+		Anular la propiedad y que pase a ser público
+	</string>
+	<string name="LinkAndDelink">
+		Enlazar y desenlazar de otros objetos
+	</string>
+	<string name="AddAndRemoveJoints">
+		Añadir y quitar uniones con otros objetos
+	</string>
+	<string name="ChangePermissions">
+		Cambiar sus permisos
+	</string>
+	<string name="TrackYourCamera">
+		Seguir su cámara
+	</string>
+	<string name="ControlYourCamera">
+		Controlar su cámara
+	</string>
+	<string name="SIM_ACCESS_PG">
+		General
+	</string>
+	<string name="SIM_ACCESS_MATURE">
+		Moderado
+	</string>
+	<string name="SIM_ACCESS_ADULT">
+		Adulto
+	</string>
+	<string name="SIM_ACCESS_DOWN">
+		Desconectado
+	</string>
+	<string name="SIM_ACCESS_MIN">
+		Desconocido
+	</string>
+	<string name="land_type_unknown">
+		(desconocido)
+	</string>
+	<string name="Estate / Full Region">
+		Estado /Región completa
+	</string>
+	<string name="Estate / Homestead">
+		Estado / Homestead
+	</string>
+	<string name="Mainland / Homestead">
+		Continente / Homestead
+	</string>
+	<string name="Mainland / Full Region">
+		Continente / Región completa
+	</string>
+	<string name="all_files">
+		Todos los archivos
+	</string>
+	<string name="sound_files">
+		Sonidos
+	</string>
+	<string name="animation_files">
+		Animaciones
+	</string>
+	<string name="image_files">
+		Imágenes
+	</string>
+	<string name="save_file_verb">
+		Guardar
+	</string>
+	<string name="load_file_verb">
+		Cargar
+	</string>
+	<string name="targa_image_files">
+		Imágenes Targa
+	</string>
+	<string name="bitmap_image_files">
+		Imágenes de mapa de bits
+	</string>
+	<string name="avi_movie_file">
+		Archivo de película AVI
+	</string>
+	<string name="xaf_animation_file">
+		Archivo de anim. XAF
+	</string>
+	<string name="xml_file">
+		Archivo XML
+	</string>
+	<string name="raw_file">
+		Archivo RAW
+	</string>
+	<string name="compressed_image_files">
+		Imágenes comprimidas
+	</string>
+	<string name="load_files">
+		Cargar archivos
+	</string>
+	<string name="choose_the_directory">
+		Elegir directorio
+	</string>
+	<string name="AvatarSetNotAway">
+		Salir del estado ausente
+	</string>
+	<string name="AvatarSetAway">
+		Pasar al estado ausente
+	</string>
+	<string name="AvatarSetNotBusy">
+		Salir del estado ocupado
+	</string>
+	<string name="AvatarSetBusy">
+		Pasar al estado ocupado
+	</string>
+	<string name="shape">
+		Forma
+	</string>
+	<string name="skin">
+		Piel
+	</string>
+	<string name="hair">
+		Pelo
+	</string>
+	<string name="eyes">
+		Ojos
+	</string>
+	<string name="shirt">
+		Camisa
+	</string>
+	<string name="pants">
+		Pantalón
+	</string>
+	<string name="shoes">
+		Zapatos
+	</string>
+	<string name="socks">
+		Calcetines
+	</string>
+	<string name="jacket">
+		Chaqueta
+	</string>
+	<string name="gloves">
+		Guantes
+	</string>
+	<string name="undershirt">
+		Camiseta
+	</string>
+	<string name="underpants">
+		Ropa interior
+	</string>
+	<string name="skirt">
+		Falda
+	</string>
+	<string name="alpha">
+		Alfa
+	</string>
+	<string name="tattoo">
+		Tatuaje
+	</string>
+	<string name="physics">
+		Física
+	</string>
+	<string name="invalid">
+		inválido/a
+	</string>
+	<string name="none">
+		ninguno
+	</string>
+	<string name="shirt_not_worn">
+		Camisa no puesta
+	</string>
+	<string name="pants_not_worn">
+		Pantalones no puestos
+	</string>
+	<string name="shoes_not_worn">
+		Zapatos no puestos
+	</string>
+	<string name="socks_not_worn">
+		Calcetines no puestos
+	</string>
+	<string name="jacket_not_worn">
+		Chaqueta no puesta
+	</string>
+	<string name="gloves_not_worn">
+		Guantes no puestos
+	</string>
+	<string name="undershirt_not_worn">
+		Camiseta no puesta
+	</string>
+	<string name="underpants_not_worn">
+		Ropa interior no puesta
+	</string>
+	<string name="skirt_not_worn">
+		Falda no puesta
+	</string>
+	<string name="alpha_not_worn">
+		Alfa no puesta
+	</string>
+	<string name="tattoo_not_worn">
+		Tatuaje no puesto
+	</string>
+	<string name="physics_not_worn">
+		Física no puesta
+	</string>
+	<string name="invalid_not_worn">
+		no válido/a
+	</string>
+	<string name="create_new_shape">
+		Crear una anatomía nueva
+	</string>
+	<string name="create_new_skin">
+		Crear una piel nueva
+	</string>
+	<string name="create_new_hair">
+		Crear pelo nuevo
+	</string>
+	<string name="create_new_eyes">
+		Crear ojos nuevos
+	</string>
+	<string name="create_new_shirt">
+		Crear una camisa nueva
+	</string>
+	<string name="create_new_pants">
+		Crear unos pantalones nuevos
+	</string>
+	<string name="create_new_shoes">
+		Crear unos zapatos nuevos
+	</string>
+	<string name="create_new_socks">
+		Crear unos calcetines nuevos
+	</string>
+	<string name="create_new_jacket">
+		Crear una chaqueta nueva
+	</string>
+	<string name="create_new_gloves">
+		Crear unos guantes nuevos
+	</string>
+	<string name="create_new_undershirt">
+		Crear una camiseta nueva
+	</string>
+	<string name="create_new_underpants">
+		Crear ropa interior nueva
+	</string>
+	<string name="create_new_skirt">
+		Crear una falda nueva
+	</string>
+	<string name="create_new_alpha">
+		Crear una capa alfa nueva
+	</string>
+	<string name="create_new_tattoo">
+		Crear un tatuaje nuevo
+	</string>
+	<string name="create_new_physics">
+		Crear nueva física
+	</string>
+	<string name="create_new_invalid">
+		no válido/a
+	</string>
+	<string name="NewWearable">
+		Nuevo [WEARABLE_ITEM]
+	</string>
+	<string name="next">
+		Siguiente
+	</string>
+	<string name="ok">
+		OK
+	</string>
+	<string name="GroupNotifyGroupNotice">
+		Aviso de grupo
+	</string>
+	<string name="GroupNotifyGroupNotices">
+		Avisos del grupo
+	</string>
+	<string name="GroupNotifySentBy">
+		Enviado por
+	</string>
+	<string name="GroupNotifyAttached">
+		Adjunto:
+	</string>
+	<string name="GroupNotifyViewPastNotices">
+		Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
+	</string>
+	<string name="GroupNotifyOpenAttachment">
+		Abrir el adjunto
+	</string>
+	<string name="GroupNotifySaveAttachment">
+		Guardar el adjunto
+	</string>
+	<string name="TeleportOffer">
+		Ofrecimiento de teleporte
+	</string>
+	<string name="StartUpNotifications">
+		Llegaron avisos nuevos mientras estabas ausente...
+	</string>
+	<string name="OverflowInfoChannelString">
+		Tienes [%d] aviso/s más
+	</string>
+	<string name="BodyPartsRightArm">
+		Brazo der.
+	</string>
+	<string name="BodyPartsHead">
+		Cabeza
+	</string>
+	<string name="BodyPartsLeftArm">
+		Brazo izq.
+	</string>
+	<string name="BodyPartsLeftLeg">
+		Pierna izq.
+	</string>
+	<string name="BodyPartsTorso">
+		Torso
+	</string>
+	<string name="BodyPartsRightLeg">
+		Pierna der.
+	</string>
+	<string name="GraphicsQualityLow">
+		Bajo
+	</string>
+	<string name="GraphicsQualityMid">
+		Medio
+	</string>
+	<string name="GraphicsQualityHigh">
+		Alto
+	</string>
+	<string name="LeaveMouselook">
+		Pulsa ESC para salir de la vista subjetiva
+	</string>
+	<string name="InventoryNoMatchingItems">
+		¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
+	</string>
+	<string name="PlacesNoMatchingItems">
+		¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
+	</string>
+	<string name="FavoritesNoMatchingItems">
+		Arrastra aquí un hito para tenerlo en tus favoritos.
+	</string>
+	<string name="InventoryNoTexture">
+		No tienes en tu inventario una copia de esta textura
+	</string>
+	<string name="no_transfer" value="(no transferible)"/>
+	<string name="no_modify" value="(no modificable)"/>
+	<string name="no_copy" value="(no copiable)"/>
+	<string name="worn" value="(puesto)"/>
+	<string name="link" value="(enlace)"/>
+	<string name="broken_link" value="(enlace roto)&quot;"/>
+	<string name="LoadingContents">
+		Cargando el contenido...
+	</string>
+	<string name="NoContents">
+		No hay contenido
+	</string>
+	<string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
+	<string name="ActiveGesture" value="[GESLABEL] (activo)"/>
+	<string name="Chat Message" value="Chat:"/>
+	<string name="Sound" value="Sonido :"/>
+	<string name="Wait" value="--- Espera :"/>
+	<string name="AnimFlagStop" value="Parar la animación:"/>
+	<string name="AnimFlagStart" value="Empezar la animación:"/>
+	<string name="Wave" value="Onda"/>
+	<string name="GestureActionNone" value="Ninguno"/>
+	<string name="HelloAvatar" value="¡Hola, avatar!"/>
+	<string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
+	<string name="GetMoreGestures" value="Obtener más &gt;&gt;"/>
+	<string name="Animations" value="Animaciones,"/>
+	<string name="Calling Cards" value="Tarjetas de visita,"/>
+	<string name="Clothing" value="Ropa,"/>
+	<string name="Gestures" value="Gestos,"/>
+	<string name="Landmarks" value="Hitos,"/>
+	<string name="Notecards" value="Notas,"/>
+	<string name="Objects" value="Objetos,"/>
+	<string name="Scripts" value="Scripts,"/>
+	<string name="Sounds" value="Sonidos,"/>
+	<string name="Textures" value="Texturas,"/>
+	<string name="Snapshots" value="Fotos,"/>
+	<string name="No Filters" value="No"/>
+	<string name="Since Logoff" value="- Desde la desconexión"/>
+	<string name="InvFolder My Inventory">
+		Mi Inventario
+	</string>
+	<string name="InvFolder My Favorites">
+		Mis Favoritos
+	</string>
+	<string name="InvFolder Library">
+		Biblioteca
+	</string>
+	<string name="InvFolder Textures">
+		Texturas
+	</string>
+	<string name="InvFolder Sounds">
+		Sonidos
+	</string>
+	<string name="InvFolder Calling Cards">
+		Tarjetas de visita
+	</string>
+	<string name="InvFolder Landmarks">
+		Hitos
+	</string>
+	<string name="InvFolder Scripts">
+		Scripts
+	</string>
+	<string name="InvFolder Clothing">
+		Ropa
+	</string>
+	<string name="InvFolder Objects">
+		Objetos
+	</string>
+	<string name="InvFolder Notecards">
+		Notas
+	</string>
+	<string name="InvFolder New Folder">
+		Carpeta nueva
+	</string>
+	<string name="InvFolder Inventory">
+		Inventario
+	</string>
+	<string name="InvFolder Uncompressed Images">
+		Imágenes sin comprimir
+	</string>
+	<string name="InvFolder Body Parts">
+		Partes del cuerpo
+	</string>
+	<string name="InvFolder Trash">
+		Papelera
+	</string>
+	<string name="InvFolder Photo Album">
+		Álbum de fotos
+	</string>
+	<string name="InvFolder Lost And Found">
+		Objetos Perdidos
+	</string>
+	<string name="InvFolder Uncompressed Sounds">
+		Sonidos sin comprimir
+	</string>
+	<string name="InvFolder Animations">
+		Animaciones
+	</string>
+	<string name="InvFolder Gestures">
+		Gestos
+	</string>
+	<string name="InvFolder Favorite">
+		Favoritos
+	</string>
+	<string name="InvFolder favorite">
+		Favoritos
+	</string>
+	<string name="InvFolder Current Outfit">
+		Vestuario actual
+	</string>
+	<string name="InvFolder Initial Outfits">
+		Vestuario inicial
+	</string>
+	<string name="InvFolder My Outfits">
+		Mis vestuarios
+	</string>
+	<string name="InvFolder Accessories">
+		Accesorios
+	</string>
+	<string name="InvFolder Friends">
+		Amigos
+	</string>
+	<string name="InvFolder All">
+		Todas
+	</string>
+	<string name="Buy">
+		Comprar
+	</string>
+	<string name="BuyforL$">
+		Comprar por L$
+	</string>
+	<string name="Stone">
+		Piedra
+	</string>
+	<string name="Metal">
+		Metal
+	</string>
+	<string name="Glass">
+		Cristal
+	</string>
+	<string name="Wood">
+		Madera
+	</string>
+	<string name="Flesh">
+		Carne
+	</string>
+	<string name="Plastic">
+		Plástico
+	</string>
+	<string name="Rubber">
+		Goma
+	</string>
+	<string name="Light">
+		Claridad
+	</string>
+	<string name="KBShift">
+		Mayúsculas
+	</string>
+	<string name="KBCtrl">
+		Ctrl
+	</string>
+	<string name="Chest">
+		Tórax
+	</string>
+	<string name="Skull">
+		Cráneo
+	</string>
+	<string name="Left Shoulder">
+		Hombro izquierdo
+	</string>
+	<string name="Right Shoulder">
+		Hombro derecho
+	</string>
+	<string name="Left Hand">
+		Mano izq.
+	</string>
+	<string name="Right Hand">
+		Mano der.
+	</string>
+	<string name="Left Foot">
+		Pie izq.
+	</string>
+	<string name="Right Foot">
+		Pie der.
+	</string>
+	<string name="Spine">
+		Columna
+	</string>
+	<string name="Pelvis">
+		Pelvis
+	</string>
+	<string name="Mouth">
+		Boca
+	</string>
+	<string name="Chin">
+		Barbilla
+	</string>
+	<string name="Left Ear">
+		Oreja izq.
+	</string>
+	<string name="Right Ear">
+		Oreja der.
+	</string>
+	<string name="Left Eyeball">
+		Ojo izq.
+	</string>
+	<string name="Right Eyeball">
+		Ojo der.
+	</string>
+	<string name="Nose">
+		Nariz
+	</string>
+	<string name="R Upper Arm">
+		Brazo der.
+	</string>
+	<string name="R Forearm">
+		Antebrazo der.
+	</string>
+	<string name="L Upper Arm">
+		Brazo izq.
+	</string>
+	<string name="L Forearm">
+		Antebrazo izq.
+	</string>
+	<string name="Right Hip">
+		Cadera der.
+	</string>
+	<string name="R Upper Leg">
+		Muslo der.
+	</string>
+	<string name="R Lower Leg">
+		Pantorrilla der.
+	</string>
+	<string name="Left Hip">
+		Cadera izq.
+	</string>
+	<string name="L Upper Leg">
+		Muslo izq.
+	</string>
+	<string name="L Lower Leg">
+		Pantorrilla izq.
+	</string>
+	<string name="Stomach">
+		Abdomen
+	</string>
+	<string name="Left Pec">
+		Pecho izquierdo
+	</string>
+	<string name="Right Pec">
+		Pecho derecho
+	</string>
+	<string name="Invalid Attachment">
+		Punto de colocación no válido
+	</string>
+	<string name="YearsMonthsOld">
+		[AGEYEARS] [AGEMONTHS] de edad
+	</string>
+	<string name="YearsOld">
+		[AGEYEARS] de edad
+	</string>
+	<string name="MonthsOld">
+		[AGEMONTHS] de edad
+	</string>
+	<string name="WeeksOld">
+		[AGEWEEKS] de edad
+	</string>
+	<string name="DaysOld">
+		[AGEDAYS] de edad
+	</string>
+	<string name="TodayOld">
+		Registrado hoy
+	</string>
+	<string name="AgeYearsA">
+		[COUNT] año
+	</string>
+	<string name="AgeYearsB">
+		[COUNT] años
+	</string>
+	<string name="AgeYearsC">
+		[COUNT] años
+	</string>
+	<string name="AgeMonthsA">
+		[COUNT] mes
+	</string>
+	<string name="AgeMonthsB">
+		[COUNT] meses
+	</string>
+	<string name="AgeMonthsC">
+		[COUNT] meses
+	</string>
+	<string name="AgeWeeksA">
+		[COUNT] semana
+	</string>
+	<string name="AgeWeeksB">
+		[COUNT] semanas
+	</string>
+	<string name="AgeWeeksC">
+		[COUNT] semanas
+	</string>
+	<string name="AgeDaysA">
+		[COUNT] día
+	</string>
+	<string name="AgeDaysB">
+		[COUNT] días
+	</string>
+	<string name="AgeDaysC">
+		[COUNT] días
+	</string>
+	<string name="GroupMembersA">
+		[COUNT] miembro
+	</string>
+	<string name="GroupMembersB">
+		[COUNT] miembros
+	</string>
+	<string name="GroupMembersC">
+		[COUNT] miembros
+	</string>
+	<string name="AcctTypeResident">
+		Residente
+	</string>
+	<string name="AcctTypeTrial">
+		Prueba
+	</string>
+	<string name="AcctTypeCharterMember">
+		Miembro fundador
+	</string>
+	<string name="AcctTypeEmployee">
+		Empleado de Linden Lab
+	</string>
+	<string name="PaymentInfoUsed">
+		Ha usado información sobre la forma de pago
+	</string>
+	<string name="PaymentInfoOnFile">
+		Hay información archivada sobre la forma de pago
+	</string>
+	<string name="NoPaymentInfoOnFile">
+		No hay información archivada sobre la forma de pago
+	</string>
+	<string name="AgeVerified">
+		Edad verificada
+	</string>
+	<string name="NotAgeVerified">
+		Edad no verificada
+	</string>
+	<string name="Center 2">
+		Centro 2
+	</string>
+	<string name="Top Right">
+		Arriba der.
+	</string>
+	<string name="Top">
+		Arriba
+	</string>
+	<string name="Top Left">
+		Arriba izq.
+	</string>
+	<string name="Center">
+		Centro
+	</string>
+	<string name="Bottom Left">
+		Abajo izq.
+	</string>
+	<string name="Bottom">
+		Abajo
+	</string>
+	<string name="Bottom Right">
+		Abajo der.
+	</string>
+	<string name="CompileQueueDownloadedCompiling">
+		Descargado, compilándolo
+	</string>
+	<string name="CompileQueueScriptNotFound">
+		No se encuentra el script en el servidor.
+	</string>
+	<string name="CompileQueueProblemDownloading">
+		Problema al descargar
+	</string>
+	<string name="CompileQueueInsufficientPermDownload">
+		Permisos insuficientes para descargar un script.
+	</string>
+	<string name="CompileQueueInsufficientPermFor">
+		Permisos insuficientes para
+	</string>
+	<string name="CompileQueueUnknownFailure">
+		Fallo desconocido en la descarga
+	</string>
+	<string name="CompileQueueTitle">
+		Recompilando
+	</string>
+	<string name="CompileQueueStart">
+		recompilar
+	</string>
+	<string name="ResetQueueTitle">
+		Progreso del reinicio
+	</string>
+	<string name="ResetQueueStart">
+		restaurar
+	</string>
+	<string name="RunQueueTitle">
+		Configurar según se ejecuta
+	</string>
+	<string name="RunQueueStart">
+		Configurando según se ejecuta
+	</string>
+	<string name="NotRunQueueTitle">
+		Configurar sin ejecutar
+	</string>
+	<string name="NotRunQueueStart">
+		Configurando sin ejecutarlo
+	</string>
+	<string name="CompileSuccessful">
+		¡Compilación correcta!
+	</string>
+	<string name="CompileSuccessfulSaving">
+		Compilación correcta, guardando...
+	</string>
+	<string name="SaveComplete">
+		Guardado.
+	</string>
+	<string name="ObjectOutOfRange">
+		Script (objeto fuera de rango)
+	</string>
+	<string name="GodToolsObjectOwnedBy">
+		El objeto [OBJECT] es propiedad de [OWNER]
+	</string>
+	<string name="GroupsNone">
+		ninguno
+	</string>
+	<string name="Group" value="(grupo)"/>
+	<string name="Unknown">
+		(Desconocido)
+	</string>
+	<string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
+	<string name="NextStipendDay" value="El próximo día de pago es el"/>
+	<string name="GroupIndividualShare" value="Grupo       Aportaciones individuales"/>
+	<string name="GroupColumn" value="Grupo"/>
+	<string name="Balance">
+		Saldo
+	</string>
+	<string name="Credits">
+		Créditos
+	</string>
+	<string name="Debits">
+		Débitos
+	</string>
+	<string name="Total">
+		Total
+	</string>
+	<string name="NoGroupDataFound">
+		No se encontraron datos del grupo
+	</string>
+	<string name="IMParentEstate">
+		parent estate
+	</string>
+	<string name="IMMainland">
+		continente
+	</string>
+	<string name="IMTeen">
+		teen
+	</string>
+	<string name="RegionInfoError">
+		error
+	</string>
+	<string name="RegionInfoAllEstatesOwnedBy">
+		todos los estados propiedad de [OWNER]
+	</string>
+	<string name="RegionInfoAllEstatesYouOwn">
+		todos los estados que posees
+	</string>
+	<string name="RegionInfoAllEstatesYouManage">
+		todos los estados que administras para [OWNER]
+	</string>
+	<string name="RegionInfoAllowedResidents">
+		Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
+	</string>
+	<string name="RegionInfoAllowedGroups">
+		Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
+	</string>
+	<string name="ScriptLimitsParcelScriptMemory">
+		Memoria de los scripts de la parcela
+	</string>
+	<string name="ScriptLimitsParcelsOwned">
+		Parcelas listadas: [PARCELS]
+	</string>
+	<string name="ScriptLimitsMemoryUsed">
+		Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
+	</string>
+	<string name="ScriptLimitsMemoryUsedSimple">
+		Memoria usada: [COUNT] kb
+	</string>
+	<string name="ScriptLimitsParcelScriptURLs">
+		URLs de los scripts de la parcela
+	</string>
+	<string name="ScriptLimitsURLsUsed">
+		URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
+	</string>
+	<string name="ScriptLimitsURLsUsedSimple">
+		URLs usadas: [COUNT]
+	</string>
+	<string name="ScriptLimitsRequestError">
+		Error al obtener la información
+	</string>
+	<string name="ScriptLimitsRequestNoParcelSelected">
+		No hay una parcela seleccionada
+	</string>
+	<string name="ScriptLimitsRequestWrongRegion">
+		Error: la información del script sólo está disponible en tu región actual
+	</string>
+	<string name="ScriptLimitsRequestWaiting">
+		Obteniendo la información...
+	</string>
+	<string name="ScriptLimitsRequestDontOwnParcel">
+		No tienes permiso para examinar esta parcela
+	</string>
+	<string name="SITTING_ON">
+		Sentado en
+	</string>
+	<string name="ATTACH_CHEST">
+		Tórax
+	</string>
+	<string name="ATTACH_HEAD">
+		Cabeza
+	</string>
+	<string name="ATTACH_LSHOULDER">
+		Hombro izquierdo
+	</string>
+	<string name="ATTACH_RSHOULDER">
+		Hombro derecho
+	</string>
+	<string name="ATTACH_LHAND">
+		Mano izq.
+	</string>
+	<string name="ATTACH_RHAND">
+		Mano der.
+	</string>
+	<string name="ATTACH_LFOOT">
+		Pie izq.
+	</string>
+	<string name="ATTACH_RFOOT">
+		Pie der.
+	</string>
+	<string name="ATTACH_BACK">
+		Anterior
+	</string>
+	<string name="ATTACH_PELVIS">
+		Pelvis
+	</string>
+	<string name="ATTACH_MOUTH">
+		Boca
+	</string>
+	<string name="ATTACH_CHIN">
+		Barbilla
+	</string>
+	<string name="ATTACH_LEAR">
+		Oreja izq.
+	</string>
+	<string name="ATTACH_REAR">
+		Oreja der.
+	</string>
+	<string name="ATTACH_LEYE">
+		Ojo izq.
+	</string>
+	<string name="ATTACH_REYE">
+		Ojo der.
+	</string>
+	<string name="ATTACH_NOSE">
+		Nariz
+	</string>
+	<string name="ATTACH_RUARM">
+		Brazo der.
+	</string>
+	<string name="ATTACH_RLARM">
+		Antebrazo der.
+	</string>
+	<string name="ATTACH_LUARM">
+		Brazo izq.
+	</string>
+	<string name="ATTACH_LLARM">
+		Antebrazo izq.
+	</string>
+	<string name="ATTACH_RHIP">
+		Cadera der.
+	</string>
+	<string name="ATTACH_RULEG">
+		Muslo der.
+	</string>
+	<string name="ATTACH_RLLEG">
+		Pantorrilla der.
+	</string>
+	<string name="ATTACH_LHIP">
+		Cadera izq.
+	</string>
+	<string name="ATTACH_LULEG">
+		Muslo izq.
+	</string>
+	<string name="ATTACH_LLLEG">
+		Pantorrilla izq.
+	</string>
+	<string name="ATTACH_BELLY">
+		Vientre
+	</string>
+	<string name="ATTACH_RPEC">
+		Pecho derecho
+	</string>
+	<string name="ATTACH_LPEC">
+		Pecho izquierdo
+	</string>
+	<string name="ATTACH_HUD_CENTER_2">
+		HUD: Centro 2
+	</string>
+	<string name="ATTACH_HUD_TOP_RIGHT">
+		HUD: arriba der.
+	</string>
+	<string name="ATTACH_HUD_TOP_CENTER">
+		HUD: arriba centro
+	</string>
+	<string name="ATTACH_HUD_TOP_LEFT">
+		HUD: arriba izq.
+	</string>
+	<string name="ATTACH_HUD_CENTER_1">
+		HUD: Centro 1
+	</string>
+	<string name="ATTACH_HUD_BOTTOM_LEFT">
+		HUD: abajo izq.
+	</string>
+	<string name="ATTACH_HUD_BOTTOM">
+		HUD: abajo
+	</string>
+	<string name="ATTACH_HUD_BOTTOM_RIGHT">
+		HUD: abajo der.
+	</string>
+	<string name="CursorPos">
+		Línea [LINE], Columna [COLUMN]
+	</string>
+	<string name="PanelDirCountFound">
+		[COUNT] resultados
+	</string>
+	<string name="PanelContentsTooltip">
+		Contenido del objeto
+	</string>
+	<string name="PanelContentsNewScript">
+		Script nuevo
+	</string>
+	<string name="BusyModeResponseDefault">
+		El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
+	</string>
+	<string name="MuteByName">
+		(Por el nombre)
+	</string>
+	<string name="MuteAgent">
+		(Residente)
+	</string>
+	<string name="MuteObject">
+		(Objeto)
+	</string>
+	<string name="MuteGroup">
+		(Grupo)
+	</string>
+	<string name="MuteExternal">
+		(Externo)
+	</string>
+	<string name="RegionNoCovenant">
+		No se ha aportado un contrato para este estado.
+	</string>
+	<string name="RegionNoCovenantOtherOwner">
+		No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab.  Por favor, contacta con ese propietario para informarte sobre la venta.
+	</string>
+	<string name="covenant_last_modified" value="Última modificación: "/>
+	<string name="none_text" value="(no hay)"/>
+	<string name="never_text" value=" (nunca)"/>
+	<string name="GroupOwned">
+		Propiedad del grupo
+	</string>
+	<string name="Public">
+		Público
+	</string>
+	<string name="ClassifiedClicksTxt">
+		Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+	</string>
+	<string name="ClassifiedUpdateAfterPublish">
+		(se actualizará tras la publicación)
+	</string>
+	<string name="NoPicksClassifiedsText">
+		No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
+	</string>
+	<string name="NoAvatarPicksClassifiedsText">
+		El usuario no tiene clasificados ni destacados
+	</string>
+	<string name="PicksClassifiedsLoadingText">
+		Cargando...
+	</string>
+	<string name="MultiPreviewTitle">
+		Vista previa
+	</string>
+	<string name="MultiPropertiesTitle">
+		Propiedades
+	</string>
+	<string name="InvOfferAnObjectNamed">
+		Un objeto de nombre
+	</string>
+	<string name="InvOfferOwnedByGroup">
+		propiedad del grupo
+	</string>
+	<string name="InvOfferOwnedByUnknownGroup">
+		propiedad de un grupo desconocido
+	</string>
+	<string name="InvOfferOwnedBy">
+		propiedad de
+	</string>
+	<string name="InvOfferOwnedByUnknownUser">
+		propiedad de un usuario desconocido
+	</string>
+	<string name="InvOfferGaveYou">
+		te ha dado
+	</string>
+	<string name="InvOfferDecline">
+		Rechazas [DESC] de &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
+	</string>
+	<string name="GroupMoneyTotal">
+		Total
+	</string>
+	<string name="GroupMoneyBought">
+		comprado
+	</string>
+	<string name="GroupMoneyPaidYou">
+		pagado a ti
+	</string>
+	<string name="GroupMoneyPaidInto">
+		pagado en
+	</string>
+	<string name="GroupMoneyBoughtPassTo">
+		pase comprado a
+	</string>
+	<string name="GroupMoneyPaidFeeForEvent">
+		cuotas pagadas para el evento
+	</string>
+	<string name="GroupMoneyPaidPrizeForEvent">
+		precio pagado por el evento
+	</string>
+	<string name="GroupMoneyBalance">
+		Saldo
+	</string>
+	<string name="GroupMoneyCredits">
+		Créditos
+	</string>
+	<string name="GroupMoneyDebits">
+		Débitos
+	</string>
+	<string name="ViewerObjectContents">
+		Contenidos
+	</string>
+	<string name="AcquiredItems">
+		Artículos adquiridos
+	</string>
+	<string name="Cancel">
+		Cancelar
+	</string>
+	<string name="UploadingCosts">
+		Subir [NAME] cuesta [AMOUNT] L$
+	</string>
+	<string name="BuyingCosts">
+		Comprar esto cuesta [AMOUNT] L$
+	</string>
+	<string name="UnknownFileExtension">
+		Extensión de archivo desconocida [.%s]
+Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
+	</string>
+	<string name="MuteObject2">
+		Ignorar
+	</string>
+	<string name="AddLandmarkNavBarMenu">
+		Guardarme este hito...
+	</string>
+	<string name="EditLandmarkNavBarMenu">
+		Editar este hito...
+	</string>
+	<string name="accel-mac-control">
+		⌃
+	</string>
+	<string name="accel-mac-command">
+		⌘
+	</string>
+	<string name="accel-mac-option">
+		⌥
+	</string>
+	<string name="accel-mac-shift">
+		⇧
+	</string>
+	<string name="accel-win-control">
+		Ctrl+
+	</string>
+	<string name="accel-win-alt">
+		Alt+
+	</string>
+	<string name="accel-win-shift">
+		Mayús+
+	</string>
+	<string name="FileSaved">
+		Archivo guardado
+	</string>
+	<string name="Receiving">
+		Recibiendo
+	</string>
+	<string name="AM">
+		AM
+	</string>
+	<string name="PM">
+		PM
+	</string>
+	<string name="PST">
+		PST
+	</string>
+	<string name="PDT">
+		PDT
+	</string>
+	<string name="Direction_Forward">
+		Adelante
+	</string>
+	<string name="Direction_Left">
+		Izquierda
+	</string>
+	<string name="Direction_Right">
+		Derecha
+	</string>
+	<string name="Direction_Back">
+		Atrás
+	</string>
+	<string name="Direction_North">
+		Norte
+	</string>
+	<string name="Direction_South">
+		Sur
+	</string>
+	<string name="Direction_West">
+		Oeste
+	</string>
+	<string name="Direction_East">
+		Este
+	</string>
+	<string name="Direction_Up">
+		Arriba
+	</string>
+	<string name="Direction_Down">
+		Abajo
+	</string>
+	<string name="Any Category">
+		Cualquier categoría
+	</string>
+	<string name="Shopping">
+		Compras
+	</string>
+	<string name="Land Rental">
+		Terreno en alquiler
+	</string>
+	<string name="Property Rental">
+		Propiedad en alquiler
+	</string>
+	<string name="Special Attraction">
+		Atracción especial
+	</string>
+	<string name="New Products">
+		Nuevos productos
+	</string>
+	<string name="Employment">
+		Empleo
+	</string>
+	<string name="Wanted">
+		Se busca
+	</string>
+	<string name="Service">
+		Servicios
+	</string>
+	<string name="Personal">
+		Personal
+	</string>
+	<string name="None">
+		Ninguno
+	</string>
+	<string name="Linden Location">
+		Localización Linden
+	</string>
+	<string name="Adult">
+		Adulto
+	</string>
+	<string name="Arts&amp;Culture">
+		Arte y Cultura
+	</string>
+	<string name="Business">
+		Negocios
+	</string>
+	<string name="Educational">
+		Educativo
+	</string>
+	<string name="Gaming">
+		Juegos de azar
+	</string>
+	<string name="Hangout">
+		Entretenimiento
+	</string>
+	<string name="Newcomer Friendly">
+		Para recién llegados
+	</string>
+	<string name="Parks&amp;Nature">
+		Parques y Naturaleza
+	</string>
+	<string name="Residential">
+		Residencial
+	</string>
+	<string name="Stage">
+		Artes escénicas
+	</string>
+	<string name="Other">
+		Otra
+	</string>
+	<string name="Rental">
+		Terreno en alquiler
+	</string>
+	<string name="Any">
+		Cualquiera
+	</string>
+	<string name="You">
+		Tú
+	</string>
+	<string name="Multiple Media">
+		Múltiples medias
+	</string>
+	<string name="Play Media">
+		Play/Pausa los media
+	</string>
+	<string name="MBCmdLineError">
+		Ha habido un error analizando la línea de comando.
+Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+	</string>
+	<string name="MBCmdLineUsg">
+		[APP_NAME] Uso de línea de comando:
+	</string>
+	<string name="MBUnableToAccessFile">
+		[APP_NAME] no puede acceder a un archivo que necesita.
+
+Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
+Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
+Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
+	</string>
+	<string name="MBFatalError">
+		Error fatal
+	</string>
+	<string name="MBRequiresAltiVec">
+		[APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
+	</string>
+	<string name="MBAlreadyRunning">
+		[APP_NAME] ya se está ejecutando.
+Revisa tu barra de tareas para encontrar una copia minimizada del programa.
+Si este mensaje persiste, reinicia tu ordenador.
+	</string>
+	<string name="MBFrozenCrashed">
+		En su anterior ejecución, [APP_NAME] se congeló o se cayó.
+¿Quieres enviar un informe de caída?
+	</string>
+	<string name="MBAlert">
+		Alerta
+	</string>
+	<string name="MBNoDirectX">
+		[APP_NAME] no encuentra DirectX 9.0b o superior.
+[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas.  Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
+
+¿Quieres continuar?
+	</string>
+	<string name="MBWarning">
+		¡Atención!
+	</string>
+	<string name="MBNoAutoUpdate">
+		Las actualizaciones automáticas no están todavía implementadas para Linux.
+Por favor, descarga la última versión desde www.secondlife.com.
+	</string>
+	<string name="MBRegClassFailed">
+		Fallo en RegisterClass
+	</string>
+	<string name="MBError">
+		Error
+	</string>
+	<string name="MBFullScreenErr">
+		No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
+Ejecutándose en una ventana.
+	</string>
+	<string name="MBDestroyWinFailed">
+		Error Shutdown destruyendo la ventana (DestroyWindow() failed)
+	</string>
+	<string name="MBShutdownErr">
+		Error Shutdown
+	</string>
+	<string name="MBDevContextErr">
+		No se puede construir el &apos;GL device context&apos;
+	</string>
+	<string name="MBPixelFmtErr">
+		No se puede encontrar un formato adecuado de píxel
+	</string>
+	<string name="MBPixelFmtDescErr">
+		No se puede conseguir la descripción del formato de píxel
+	</string>
+	<string name="MBTrueColorWindow">
+		Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
+Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
+	</string>
+	<string name="MBAlpha">
+		[APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit.  Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
+Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
+Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+	</string>
+	<string name="MBPixelFmtSetErr">
+		No se puede configurar el formato de píxel
+	</string>
+	<string name="MBGLContextErr">
+		No se puede crear el &apos;GL rendering context&apos;
+	</string>
+	<string name="MBGLContextActErr">
+		No se puede activar el &apos;GL rendering context&apos;
+	</string>
+	<string name="MBVideoDrvErr">
+		[APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
+
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+	</string>
+	<string name="5 O&apos;Clock Shadow">
+		Barba del día
+	</string>
+	<string name="All White">
+		Blanco del todo
+	</string>
+	<string name="Anime Eyes">
+		Ojos de cómic
+	</string>
+	<string name="Arced">
+		Arqueadas
+	</string>
+	<string name="Arm Length">
+		Brazos: longitud
+	</string>
+	<string name="Attached">
+		Cortos
+	</string>
+	<string name="Attached Earlobes">
+		Lóbulos
+	</string>
+	<string name="Back Fringe">
+		Nuca: largo
+	</string>
+	<string name="Baggy">
+		Marcadas
+	</string>
+	<string name="Bangs">
+		Bangs
+	</string>
+	<string name="Beady Eyes">
+		Ojos pequeños
+	</string>
+	<string name="Belly Size">
+		Barriga: tamaño
+	</string>
+	<string name="Big">
+		Grande
+	</string>
+	<string name="Big Butt">
+		Culo grande
+	</string>
+	<string name="Big Hair Back">
+		Pelo: moño
+	</string>
+	<string name="Big Hair Front">
+		Pelo: tupé
+	</string>
+	<string name="Big Hair Top">
+		Pelo: melena alta
+	</string>
+	<string name="Big Head">
+		Cabeza grande
+	</string>
+	<string name="Big Pectorals">
+		Grandes pectorales
+	</string>
+	<string name="Big Spikes">
+		Crestas grandes
+	</string>
+	<string name="Black">
+		Negro
+	</string>
+	<string name="Blonde">
+		Rubio
+	</string>
+	<string name="Blonde Hair">
+		Pelo rubio
+	</string>
+	<string name="Blush">
+		Colorete
+	</string>
+	<string name="Blush Color">
+		Color del colorete
+	</string>
+	<string name="Blush Opacity">
+		Opacidad del colorete
+	</string>
+	<string name="Body Definition">
+		Definición del cuerpo
+	</string>
+	<string name="Body Fat">
+		Cuerpo: gordura
+	</string>
+	<string name="Body Freckles">
+		Pecas del cuerpo
+	</string>
+	<string name="Body Thick">
+		Cuerpo grueso
+	</string>
+	<string name="Body Thickness">
+		Cuerpo: grosor
+	</string>
+	<string name="Body Thin">
+		Cuerpo delgado
+	</string>
+	<string name="Bow Legged">
+		Abiertas
+	</string>
+	<string name="Breast Buoyancy">
+		Busto: firmeza
+	</string>
+	<string name="Breast Cleavage">
+		Busto: canalillo
+	</string>
+	<string name="Breast Size">
+		Busto: tamaño
+	</string>
+	<string name="Bridge Width">
+		Puente: ancho
+	</string>
+	<string name="Broad">
+		Aumentar
+	</string>
+	<string name="Brow Size">
+		Arco ciliar
+	</string>
+	<string name="Bug Eyes">
+		Bug Eyes
+	</string>
+	<string name="Bugged Eyes">
+		Ojos saltones
+	</string>
+	<string name="Bulbous">
+		Bulbosa
+	</string>
+	<string name="Bulbous Nose">
+		Nariz de porra
+	</string>
+	<string name="Breast Physics Mass">
+		Masa del busto
+	</string>
+	<string name="Breast Physics Smoothing">
+		Suavizado del busto
+	</string>
+	<string name="Breast Physics Gravity">
+		Gravedad del busto
+	</string>
+	<string name="Breast Physics Drag">
+		Aerodinámica del busto
+	</string>
+	<string name="Breast Physics InOut Max Effect">
+		Efecto máx.
+	</string>
+	<string name="Breast Physics InOut Spring">
+		Elasticidad
+	</string>
+	<string name="Breast Physics InOut Gain">
+		Ganancia
+	</string>
+	<string name="Breast Physics InOut Damping">
+		Amortiguación
+	</string>
+	<string name="Breast Physics UpDown Max Effect">
+		Efecto máx.
+	</string>
+	<string name="Breast Physics UpDown Spring">
+		Elasticidad
+	</string>
+	<string name="Breast Physics UpDown Gain">
+		Ganancia
+	</string>
+	<string name="Breast Physics UpDown Damping">
+		Amortiguación
+	</string>
+	<string name="Breast Physics LeftRight Max Effect">
+		Efecto máx.
+	</string>
+	<string name="Breast Physics LeftRight Spring">
+		Elasticidad
+	</string>
+	<string name="Breast Physics LeftRight Gain">
+		Ganancia
+	</string>
+	<string name="Breast Physics LeftRight Damping">
+		Amortiguación
+	</string>
+	<string name="Belly Physics Mass">
+		Masa de la barriga
+	</string>
+	<string name="Belly Physics Smoothing">
+		Suavizado de la barriga
+	</string>
+	<string name="Belly Physics Gravity">
+		Gravedad de la barriga
+	</string>
+	<string name="Belly Physics Drag">
+		Aerodinámica de la barriga
+	</string>
+	<string name="Belly Physics UpDown Max Effect">
+		Efecto máx.
+	</string>
+	<string name="Belly Physics UpDown Spring">
+		Elasticidad
+	</string>
+	<string name="Belly Physics UpDown Gain">
+		Ganancia
+	</string>
+	<string name="Belly Physics UpDown Damping">
+		Amortiguación
+	</string>
+	<string name="Butt Physics Mass">
+		Masa del culo
+	</string>
+	<string name="Butt Physics Smoothing">
+		Suavizado del culo
+	</string>
+	<string name="Butt Physics Gravity">
+		Gravedad del culo
+	</string>
+	<string name="Butt Physics Drag">
+		Aerodinámica del culo
+	</string>
+	<string name="Butt Physics UpDown Max Effect">
+		Efecto máx.
+	</string>
+	<string name="Butt Physics UpDown Spring">
+		Elasticidad
+	</string>
+	<string name="Butt Physics UpDown Gain">
+		Ganancia
+	</string>
+	<string name="Butt Physics UpDown Damping">
+		Amortiguación
+	</string>
+	<string name="Butt Physics LeftRight Max Effect">
+		Efecto máx.
+	</string>
+	<string name="Butt Physics LeftRight Spring">
+		Elasticidad
+	</string>
+	<string name="Butt Physics LeftRight Gain">
+		Ganancia
+	</string>
+	<string name="Butt Physics LeftRight Damping">
+		Amortiguación
+	</string>
+	<string name="Bushy Eyebrows">
+		Cejijuntas
+	</string>
+	<string name="Bushy Hair">
+		Pelo tupido
+	</string>
+	<string name="Butt Size">
+		Culo: tamaño
+	</string>
+	<string name="Butt Gravity">
+		Gravedad del culo
+	</string>
+	<string name="bustle skirt">
+		Polisón
+	</string>
+	<string name="no bustle">
+		Sin polisón
+	</string>
+	<string name="more bustle">
+		Con polisón
+	</string>
+	<string name="Chaplin">
+		Cortito
+	</string>
+	<string name="Cheek Bones">
+		Pómulos
+	</string>
+	<string name="Chest Size">
+		Tórax: tamaño
+	</string>
+	<string name="Chin Angle">
+		Barbilla: ángulo
+	</string>
+	<string name="Chin Cleft">
+		Barbilla: contorno
+	</string>
+	<string name="Chin Curtains">
+		Barba en collar
+	</string>
+	<string name="Chin Depth">
+		Barbilla: largo
+	</string>
+	<string name="Chin Heavy">
+		Hacia la barbilla
+	</string>
+	<string name="Chin In">
+		Barbilla retraída
+	</string>
+	<string name="Chin Out">
+		Barbilla prominente
+	</string>
+	<string name="Chin-Neck">
+		Papada
+	</string>
+	<string name="Clear">
+		Transparente
+	</string>
+	<string name="Cleft">
+		Remarcar
+	</string>
+	<string name="Close Set Eyes">
+		Ojos juntos
+	</string>
+	<string name="Closed">
+		Cerrar
+	</string>
+	<string name="Closed Back">
+		Trasera cerrada
+	</string>
+	<string name="Closed Front">
+		Frontal cerrado
+	</string>
+	<string name="Closed Left">
+		Cerrada
+	</string>
+	<string name="Closed Right">
+		Cerrada
+	</string>
+	<string name="Coin Purse">
+		Poco abultada
+	</string>
+	<string name="Collar Back">
+		Espalda
+	</string>
+	<string name="Collar Front">
+		Escote
+	</string>
+	<string name="Corner Down">
+		Hacia abajo
+	</string>
+	<string name="Corner Up">
+		Hacia arriba
+	</string>
+	<string name="Creased">
+		Caídos
+	</string>
+	<string name="Crooked Nose">
+		Nariz torcida
+	</string>
+	<string name="Cuff Flare">
+		Acampanado
+	</string>
+	<string name="Dark">
+		Oscuridad
+	</string>
+	<string name="Dark Green">
+		Verde oscuro
+	</string>
+	<string name="Darker">
+		Más oscuros
+	</string>
+	<string name="Deep">
+		Remarcar
+	</string>
+	<string name="Default Heels">
+		Tacones por defecto
+	</string>
+	<string name="Dense">
+		Densas
+	</string>
+	<string name="Double Chin">
+		Mucha papada
+	</string>
+	<string name="Downturned">
+		Poco
+	</string>
+	<string name="Duffle Bag">
+		Muy abultada
+	</string>
+	<string name="Ear Angle">
+		Orejas: ángulo
+	</string>
+	<string name="Ear Size">
+		Orejas: tamaño
+	</string>
+	<string name="Ear Tips">
+		Orejas: forma
+	</string>
+	<string name="Egg Head">
+		Cabeza: ahuevada
+	</string>
+	<string name="Eye Bags">
+		Ojos: bolsas
+	</string>
+	<string name="Eye Color">
+		Ojos: color
+	</string>
+	<string name="Eye Depth">
+		Ojos: profundidad
+	</string>
+	<string name="Eye Lightness">
+		Ojos: brillo
+	</string>
+	<string name="Eye Opening">
+		Ojos: apertura
+	</string>
+	<string name="Eye Pop">
+		Ojos: simetría
+	</string>
+	<string name="Eye Size">
+		Ojos: tamaño
+	</string>
+	<string name="Eye Spacing">
+		Ojos: separación
+	</string>
+	<string name="Eyebrow Arc">
+		Cejas: arco
+	</string>
+	<string name="Eyebrow Density">
+		Cejas: densidad
+	</string>
+	<string name="Eyebrow Height">
+		Cejas: altura
+	</string>
+	<string name="Eyebrow Points">
+		Cejas: en V
+	</string>
+	<string name="Eyebrow Size">
+		Cejas: tamaño
+	</string>
+	<string name="Eyelash Length">
+		Pestañas: longitud
+	</string>
+	<string name="Eyeliner">
+		Contorno de ojos
+	</string>
+	<string name="Eyeliner Color">
+		Contorno de ojos: color
+	</string>
+	<string name="Eyes Bugged">
+		Eyes Bugged
+	</string>
+	<string name="Face Shear">
+		Cara: simetría
+	</string>
+	<string name="Facial Definition">
+		Rasgos marcados
+	</string>
+	<string name="Far Set Eyes">
+		Ojos separados
+	</string>
+	<string name="Fat Lips">
+		Prominentes
+	</string>
+	<string name="Female">
+		Mujer
+	</string>
+	<string name="Fingerless">
+		Sin dedos
+	</string>
+	<string name="Fingers">
+		Con dedos
+	</string>
+	<string name="Flared Cuffs">
+		Campana
+	</string>
+	<string name="Flat">
+		Redondeadas
+	</string>
+	<string name="Flat Butt">
+		Culo plano
+	</string>
+	<string name="Flat Head">
+		Cabeza plana
+	</string>
+	<string name="Flat Toe">
+		Empeine bajo
+	</string>
+	<string name="Foot Size">
+		Pie: tamaño
+	</string>
+	<string name="Forehead Angle">
+		Frente: ángulo
+	</string>
+	<string name="Forehead Heavy">
+		Hacia la frente
+	</string>
+	<string name="Freckles">
+		Pecas
+	</string>
+	<string name="Front Fringe">
+		Flequillo
+	</string>
+	<string name="Full Back">
+		Sin cortar
+	</string>
+	<string name="Full Eyeliner">
+		Contorno completo
+	</string>
+	<string name="Full Front">
+		Sin cortar
+	</string>
+	<string name="Full Hair Sides">
+		Pelo: volumen a los lados
+	</string>
+	<string name="Full Sides">
+		Volumen total
+	</string>
+	<string name="Glossy">
+		Con brillo
+	</string>
+	<string name="Glove Fingers">
+		Guantes: dedos
+	</string>
+	<string name="Glove Length">
+		Guantes: largo
+	</string>
+	<string name="Hair">
+		Pelo
+	</string>
+	<string name="Hair Back">
+		Pelo: nuca
+	</string>
+	<string name="Hair Front">
+		Pelo: delante
+	</string>
+	<string name="Hair Sides">
+		Pelo: lados
+	</string>
+	<string name="Hair Sweep">
+		Peinado: dirección
+	</string>
+	<string name="Hair Thickess">
+		Pelo: espesor
+	</string>
+	<string name="Hair Thickness">
+		Pelo: espesor
+	</string>
+	<string name="Hair Tilt">
+		Pelo: inclinación
+	</string>
+	<string name="Hair Tilted Left">
+		A la izq.
+	</string>
+	<string name="Hair Tilted Right">
+		A la der.
+	</string>
+	<string name="Hair Volume">
+		Pelo: volumen
+	</string>
+	<string name="Hand Size">
+		Manos: tamaño
+	</string>
+	<string name="Handlebars">
+		Muy largo
+	</string>
+	<string name="Head Length">
+		Cabeza: longitud
+	</string>
+	<string name="Head Shape">
+		Cabeza: forma
+	</string>
+	<string name="Head Size">
+		Cabeza: tamaño
+	</string>
+	<string name="Head Stretch">
+		Cabeza: estiramiento
+	</string>
+	<string name="Heel Height">
+		Tacón: altura
+	</string>
+	<string name="Heel Shape">
+		Tacón: forma
+	</string>
+	<string name="Height">
+		Altura
+	</string>
+	<string name="High">
+		Subir
+	</string>
+	<string name="High Heels">
+		Tacones altos
+	</string>
+	<string name="High Jaw">
+		Mandíbula alta
+	</string>
+	<string name="High Platforms">
+		Suela gorda
+	</string>
+	<string name="High and Tight">
+		Pegada
+	</string>
+	<string name="Higher">
+		Arrriba
+	</string>
+	<string name="Hip Length">
+		Cadera: altura
+	</string>
+	<string name="Hip Width">
+		Cadera: ancho
+	</string>
+	<string name="In">
+		Pegadas
+	</string>
+	<string name="In Shdw Color">
+		Línea de ojos: color
+	</string>
+	<string name="In Shdw Opacity">
+		Línea de ojos: opacidad
+	</string>
+	<string name="Inner Eye Corner">
+		Ojos: lagrimal
+	</string>
+	<string name="Inner Eye Shadow">
+		Inner Eye Shadow
+	</string>
+	<string name="Inner Shadow">
+		Línea de ojos
+	</string>
+	<string name="Jacket Length">
+		Chaqueta: largo
+	</string>
+	<string name="Jacket Wrinkles">
+		Chaqueta: arrugas
+	</string>
+	<string name="Jaw Angle">
+		Mandíbula: ángulo
+	</string>
+	<string name="Jaw Jut">
+		Maxilar inferior
+	</string>
+	<string name="Jaw Shape">
+		Mandíbula: forma
+	</string>
+	<string name="Join">
+		Más junto
+	</string>
+	<string name="Jowls">
+		Mofletes
+	</string>
+	<string name="Knee Angle">
+		Rodillas: ángulo
+	</string>
+	<string name="Knock Kneed">
+		Zambas
+	</string>
+	<string name="Large">
+		Aumentar
+	</string>
+	<string name="Large Hands">
+		Manos grandes
+	</string>
+	<string name="Left Part">
+		Raya: izq.
+	</string>
+	<string name="Leg Length">
+		Piernas: longitud
+	</string>
+	<string name="Leg Muscles">
+		Piernas: musculatura
+	</string>
+	<string name="Less">
+		Menos
+	</string>
+	<string name="Less Body Fat">
+		Menos gordura
+	</string>
+	<string name="Less Curtains">
+		Menos tupida
+	</string>
+	<string name="Less Freckles">
+		Menos pecas
+	</string>
+	<string name="Less Full">
+		Menos grosor
+	</string>
+	<string name="Less Gravity">
+		Más levantado
+	</string>
+	<string name="Less Love">
+		Menos michelines
+	</string>
+	<string name="Less Muscles">
+		Pocos músculos
+	</string>
+	<string name="Less Muscular">
+		Poca musculatura
+	</string>
+	<string name="Less Rosy">
+		Menos sonrosada
+	</string>
+	<string name="Less Round">
+		Menos redondeada
+	</string>
+	<string name="Less Saddle">
+		Menos cartucheras
+	</string>
+	<string name="Less Square">
+		Menos cuadrada
+	</string>
+	<string name="Less Volume">
+		Menos volumen
+	</string>
+	<string name="Less soul">
+		Pequeña
+	</string>
+	<string name="Lighter">
+		Más luminosos
+	</string>
+	<string name="Lip Cleft">
+		Labio: hoyuelo
+	</string>
+	<string name="Lip Cleft Depth">
+		Hoyuelo marcado
+	</string>
+	<string name="Lip Fullness">
+		Labios: grosor
+	</string>
+	<string name="Lip Pinkness">
+		Labios sonrosados
+	</string>
+	<string name="Lip Ratio">
+		Labios: ratio
+	</string>
+	<string name="Lip Thickness">
+		Labios: prominencia
+	</string>
+	<string name="Lip Width">
+		Labios: ancho
+	</string>
+	<string name="Lipgloss">
+		Brillo de labios
+	</string>
+	<string name="Lipstick">
+		Barra de labios
+	</string>
+	<string name="Lipstick Color">
+		Barra de labios: color
+	</string>
+	<string name="Long">
+		Más
+	</string>
+	<string name="Long Head">
+		Cabeza alargada
+	</string>
+	<string name="Long Hips">
+		Cadera larga
+	</string>
+	<string name="Long Legs">
+		Piernas largas
+	</string>
+	<string name="Long Neck">
+		Cuello largo
+	</string>
+	<string name="Long Pigtails">
+		Coletas largas
+	</string>
+	<string name="Long Ponytail">
+		Cola de caballo larga
+	</string>
+	<string name="Long Torso">
+		Torso largo
+	</string>
+	<string name="Long arms">
+		Brazos largos
+	</string>
+	<string name="Loose Pants">
+		Pantalón suelto
+	</string>
+	<string name="Loose Shirt">
+		Camiseta suelta
+	</string>
+	<string name="Loose Sleeves">
+		Puños anchos
+	</string>
+	<string name="Love Handles">
+		Michelines
+	</string>
+	<string name="Low">
+		Bajar
+	</string>
+	<string name="Low Heels">
+		Tacones bajos
+	</string>
+	<string name="Low Jaw">
+		Mandíbula baja
+	</string>
+	<string name="Low Platforms">
+		Suela fina
+	</string>
+	<string name="Low and Loose">
+		Suelta
+	</string>
+	<string name="Lower">
+		Abajo
+	</string>
+	<string name="Lower Bridge">
+		Puente: abajo
+	</string>
+	<string name="Lower Cheeks">
+		Mejillas: abajo
+	</string>
+	<string name="Male">
+		Varón
+	</string>
+	<string name="Middle Part">
+		Raya: en medio
+	</string>
+	<string name="More">
+		Más
+	</string>
+	<string name="More Blush">
+		Más colorete
+	</string>
+	<string name="More Body Fat">
+		Más gordura
+	</string>
+	<string name="More Curtains">
+		Más tupida
+	</string>
+	<string name="More Eyeshadow">
+		Más
+	</string>
+	<string name="More Freckles">
+		Más pecas
+	</string>
+	<string name="More Full">
+		Más grosor
+	</string>
+	<string name="More Gravity">
+		Menos levantado
+	</string>
+	<string name="More Lipstick">
+		Más barra de labios
+	</string>
+	<string name="More Love">
+		Más michelines
+	</string>
+	<string name="More Lower Lip">
+		Más el inferior
+	</string>
+	<string name="More Muscles">
+		Más músculos
+	</string>
+	<string name="More Muscular">
+		Más musculatura
+	</string>
+	<string name="More Rosy">
+		Más sonrosada
+	</string>
+	<string name="More Round">
+		Más redondeada
+	</string>
+	<string name="More Saddle">
+		Más cartucheras
+	</string>
+	<string name="More Sloped">
+		Más inclinada
+	</string>
+	<string name="More Square">
+		Más cuadrada
+	</string>
+	<string name="More Upper Lip">
+		Más el superior
+	</string>
+	<string name="More Vertical">
+		Más recta
+	</string>
+	<string name="More Volume">
+		Más volumen
+	</string>
+	<string name="More soul">
+		Grande
+	</string>
+	<string name="Moustache">
+		Bigote
+	</string>
+	<string name="Mouth Corner">
+		Comisuras
+	</string>
+	<string name="Mouth Position">
+		Boca: posición
+	</string>
+	<string name="Mowhawk">
+		Rapado
+	</string>
+	<string name="Muscular">
+		Muscular
+	</string>
+	<string name="Mutton Chops">
+		Patillas largas
+	</string>
+	<string name="Nail Polish">
+		Uñas pintadas
+	</string>
+	<string name="Nail Polish Color">
+		Uñas pintadas: color
+	</string>
+	<string name="Narrow">
+		Disminuir
+	</string>
+	<string name="Narrow Back">
+		Rapada
+	</string>
+	<string name="Narrow Front">
+		Entradas
+	</string>
+	<string name="Narrow Lips">
+		Labios estrechos
+	</string>
+	<string name="Natural">
+		Natural
+	</string>
+	<string name="Neck Length">
+		Cuello: longitud
+	</string>
+	<string name="Neck Thickness">
+		Cuello: grosor
+	</string>
+	<string name="No Blush">
+		Sin colorete
+	</string>
+	<string name="No Eyeliner">
+		Sin contorno
+	</string>
+	<string name="No Eyeshadow">
+		Menos
+	</string>
+	<string name="No Lipgloss">
+		Sin brillo
+	</string>
+	<string name="No Lipstick">
+		Sin barra de labios
+	</string>
+	<string name="No Part">
+		Sin raya
+	</string>
+	<string name="No Polish">
+		Sin pintar
+	</string>
+	<string name="No Red">
+		Nada
+	</string>
+	<string name="No Spikes">
+		Sin crestas
+	</string>
+	<string name="No White">
+		Sin blanco
+	</string>
+	<string name="No Wrinkles">
+		Sin arrugas
+	</string>
+	<string name="Normal Lower">
+		Normal Lower
+	</string>
+	<string name="Normal Upper">
+		Normal Upper
+	</string>
+	<string name="Nose Left">
+		Nariz a la izq.
+	</string>
+	<string name="Nose Right">
+		Nariz a la der.
+	</string>
+	<string name="Nose Size">
+		Nariz: tamaño
+	</string>
+	<string name="Nose Thickness">
+		Nariz: grosor
+	</string>
+	<string name="Nose Tip Angle">
+		Nariz: respingona
+	</string>
+	<string name="Nose Tip Shape">
+		Nariz: punta
+	</string>
+	<string name="Nose Width">
+		Nariz: ancho
+	</string>
+	<string name="Nostril Division">
+		Ventana: altura
+	</string>
+	<string name="Nostril Width">
+		Ventana: ancho
+	</string>
+	<string name="Opaque">
+		Opaco
+	</string>
+	<string name="Open">
+		Abrir
+	</string>
+	<string name="Open Back">
+		Apertura trasera
+	</string>
+	<string name="Open Front">
+		Apertura frontal
+	</string>
+	<string name="Open Left">
+		Abierta
+	</string>
+	<string name="Open Right">
+		Abierta
+	</string>
+	<string name="Orange">
+		Anaranjado
+	</string>
+	<string name="Out">
+		De soplillo
+	</string>
+	<string name="Out Shdw Color">
+		Sombra de ojos: color
+	</string>
+	<string name="Out Shdw Opacity">
+		Sombra de ojos: opacidad
+	</string>
+	<string name="Outer Eye Corner">
+		Ojos: comisura
+	</string>
+	<string name="Outer Eye Shadow">
+		Outer Eye Shadow
+	</string>
+	<string name="Outer Shadow">
+		Sombra de ojos
+	</string>
+	<string name="Overbite">
+		Retraído
+	</string>
+	<string name="Package">
+		Pubis
+	</string>
+	<string name="Painted Nails">
+		Pintadas
+	</string>
+	<string name="Pale">
+		Pálida
+	</string>
+	<string name="Pants Crotch">
+		Pantalón: cruz
+	</string>
+	<string name="Pants Fit">
+		Ceñido
+	</string>
+	<string name="Pants Length">
+		Pernera: largo
+	</string>
+	<string name="Pants Waist">
+		Caja
+	</string>
+	<string name="Pants Wrinkles">
+		Pantalón: arrugas
+	</string>
+	<string name="Part">
+		Raya
+	</string>
+	<string name="Part Bangs">
+		Flequillo partido
+	</string>
+	<string name="Pectorals">
+		Pectorales
+	</string>
+	<string name="Pigment">
+		Tono
+	</string>
+	<string name="Pigtails">
+		Coletas
+	</string>
+	<string name="Pink">
+		Rosa
+	</string>
+	<string name="Pinker">
+		Más sonrosados
+	</string>
+	<string name="Platform Height">
+		Suela: altura
+	</string>
+	<string name="Platform Width">
+		Suela: ancho
+	</string>
+	<string name="Pointy">
+		En punta
+	</string>
+	<string name="Pointy Heels">
+		De aguja
+	</string>
+	<string name="Ponytail">
+		Cola de caballo
+	</string>
+	<string name="Poofy Skirt">
+		Con vuelo
+	</string>
+	<string name="Pop Left Eye">
+		Izquierdo más grande
+	</string>
+	<string name="Pop Right Eye">
+		Derecho más grande
+	</string>
+	<string name="Puffy">
+		Hinchadas
+	</string>
+	<string name="Puffy Eyelids">
+		Ojeras
+	</string>
+	<string name="Rainbow Color">
+		Irisación
+	</string>
+	<string name="Red Hair">
+		Pelirrojo
+	</string>
+	<string name="Regular">
+		Regular
+	</string>
+	<string name="Right Part">
+		Raya: der.
+	</string>
+	<string name="Rosy Complexion">
+		Tez sonrosada
+	</string>
+	<string name="Round">
+		Redondear
+	</string>
+	<string name="Ruddiness">
+		Rubicundez
+	</string>
+	<string name="Ruddy">
+		Rojiza
+	</string>
+	<string name="Rumpled Hair">
+		Pelo encrespado
+	</string>
+	<string name="Saddle Bags">
+		Cartucheras
+	</string>
+	<string name="Scrawny Leg">
+		Piernas flacas
+	</string>
+	<string name="Separate">
+		Más ancho
+	</string>
+	<string name="Shallow">
+		Sin marcar
+	</string>
+	<string name="Shear Back">
+		Nuca: corte
+	</string>
+	<string name="Shear Face">
+		Shear Face
+	</string>
+	<string name="Shear Front">
+		Shear Front
+	</string>
+	<string name="Shear Left Up">
+		Arriba - izq.
+	</string>
+	<string name="Shear Right Up">
+		Arriba - der.
+	</string>
+	<string name="Sheared Back">
+		Rapada
+	</string>
+	<string name="Sheared Front">
+		Rapada
+	</string>
+	<string name="Shift Left">
+		A la izq.
+	</string>
+	<string name="Shift Mouth">
+		Boca: ladeada
+	</string>
+	<string name="Shift Right">
+		A la der.
+	</string>
+	<string name="Shirt Bottom">
+		Alto de cintura
+	</string>
+	<string name="Shirt Fit">
+		Ceñido
+	</string>
+	<string name="Shirt Wrinkles">
+		Camisa: arrugas
+	</string>
+	<string name="Shoe Height">
+		Caña: altura
+	</string>
+	<string name="Short">
+		Menos
+	</string>
+	<string name="Short Arms">
+		Brazos cortos
+	</string>
+	<string name="Short Legs">
+		Piernas cortas
+	</string>
+	<string name="Short Neck">
+		Cuello corto
+	</string>
+	<string name="Short Pigtails">
+		Coletas cortas
+	</string>
+	<string name="Short Ponytail">
+		Cola de caballo corta
+	</string>
+	<string name="Short Sideburns">
+		Patillas cortas
+	</string>
+	<string name="Short Torso">
+		Torso corto
+	</string>
+	<string name="Short hips">
+		Cadera corta
+	</string>
+	<string name="Shoulders">
+		Hombros
+	</string>
+	<string name="Side Fringe">
+		Lados: franja
+	</string>
+	<string name="Sideburns">
+		Patillas
+	</string>
+	<string name="Sides Hair">
+		Pelo: lados
+	</string>
+	<string name="Sides Hair Down">
+		Bajar lados del pelo
+	</string>
+	<string name="Sides Hair Up">
+		Subir lados del pelo
+	</string>
+	<string name="Skinny Neck">
+		Cuello estrecho
+	</string>
+	<string name="Skirt Fit">
+		Falda: vuelo
+	</string>
+	<string name="Skirt Length">
+		Falda: largo
+	</string>
+	<string name="Slanted Forehead">
+		Slanted Forehead
+	</string>
+	<string name="Sleeve Length">
+		Largo de manga
+	</string>
+	<string name="Sleeve Looseness">
+		Ancho de puños
+	</string>
+	<string name="Slit Back">
+		Raja trasera
+	</string>
+	<string name="Slit Front">
+		Raja frontal
+	</string>
+	<string name="Slit Left">
+		Raja a la izq.
+	</string>
+	<string name="Slit Right">
+		Raja a la der.
+	</string>
+	<string name="Small">
+		Disminuir
+	</string>
+	<string name="Small Hands">
+		Manos pequeñas
+	</string>
+	<string name="Small Head">
+		Cabeza pequeña
+	</string>
+	<string name="Smooth">
+		Leves
+	</string>
+	<string name="Smooth Hair">
+		Pelo liso
+	</string>
+	<string name="Socks Length">
+		Calcetines: largo
+	</string>
+	<string name="Soulpatch">
+		Perilla
+	</string>
+	<string name="Sparse">
+		Depiladas
+	</string>
+	<string name="Spiked Hair">
+		Crestas
+	</string>
+	<string name="Square">
+		Cuadrada
+	</string>
+	<string name="Square Toe">
+		Punta cuadrada
+	</string>
+	<string name="Squash Head">
+		Cabeza aplastada
+	</string>
+	<string name="Stretch Head">
+		Cabeza estirada
+	</string>
+	<string name="Sunken">
+		Chupadas
+	</string>
+	<string name="Sunken Chest">
+		Estrecho de pecho
+	</string>
+	<string name="Sunken Eyes">
+		Ojos hundidos
+	</string>
+	<string name="Sweep Back">
+		Sweep Back
+	</string>
+	<string name="Sweep Forward">
+		Sweep Forward
+	</string>
+	<string name="Tall">
+		Más
+	</string>
+	<string name="Taper Back">
+		Cubierta trasera
+	</string>
+	<string name="Taper Front">
+		Cubierta frontal
+	</string>
+	<string name="Thick Heels">
+		Tacones grandes
+	</string>
+	<string name="Thick Neck">
+		Cuello ancho
+	</string>
+	<string name="Thick Toe">
+		Empeine alto
+	</string>
+	<string name="Thin">
+		Delgadas
+	</string>
+	<string name="Thin Eyebrows">
+		Cejas finas
+	</string>
+	<string name="Thin Lips">
+		Hacia dentro
+	</string>
+	<string name="Thin Nose">
+		Nariz fina
+	</string>
+	<string name="Tight Chin">
+		Poca papada
+	</string>
+	<string name="Tight Cuffs">
+		Sin campana
+	</string>
+	<string name="Tight Pants">
+		Pantalón ceñido
+	</string>
+	<string name="Tight Shirt">
+		Camisa ceñida
+	</string>
+	<string name="Tight Skirt">
+		Falda ceñida
+	</string>
+	<string name="Tight Sleeves">
+		Puños ceñidos
+	</string>
+	<string name="Toe Shape">
+		Punta: forma
+	</string>
+	<string name="Toe Thickness">
+		Empeine
+	</string>
+	<string name="Torso Length">
+		Torso: longitud
+	</string>
+	<string name="Torso Muscles">
+		Torso: musculatura
+	</string>
+	<string name="Torso Scrawny">
+		Torso flacucho
+	</string>
+	<string name="Unattached">
+		Largos
+	</string>
+	<string name="Uncreased">
+		Abiertos
+	</string>
+	<string name="Underbite">
+		Prognatismo
+	</string>
+	<string name="Unnatural">
+		No natural
+	</string>
+	<string name="Upper Bridge">
+		Puente: arriba
+	</string>
+	<string name="Upper Cheeks">
+		Mejillas: arriba
+	</string>
+	<string name="Upper Chin Cleft">
+		Barbilla: prominencia
+	</string>
+	<string name="Upper Eyelid Fold">
+		Párpados
+	</string>
+	<string name="Upturned">
+		Mucho
+	</string>
+	<string name="Very Red">
+		Del todo
+	</string>
+	<string name="Waist Height">
+		Cintura
+	</string>
+	<string name="Well-Fed">
+		Mofletes
+	</string>
+	<string name="White Hair">
+		Pelo blanco
+	</string>
+	<string name="Wide">
+		Aumentar
+	</string>
+	<string name="Wide Back">
+		Completa
+	</string>
+	<string name="Wide Front">
+		Completa
+	</string>
+	<string name="Wide Lips">
+		Labios anchos
+	</string>
+	<string name="Wild">
+		Total
+	</string>
+	<string name="Wrinkles">
+		Arrugas
+	</string>
+	<string name="LocationCtrlAddLandmarkTooltip">
+		Añadir a mis hitos
+	</string>
+	<string name="LocationCtrlEditLandmarkTooltip">
+		Editar mis hitos
+	</string>
+	<string name="LocationCtrlInfoBtnTooltip">
+		Ver más información de esta localización
+	</string>
+	<string name="LocationCtrlComboBtnTooltip">
+		Historial de mis localizaciones
+	</string>
+	<string name="LocationCtrlAdultIconTooltip">
+		Región Adulta
+	</string>
+	<string name="LocationCtrlModerateIconTooltip">
+		Región Moderada
+	</string>
+	<string name="LocationCtrlGeneralIconTooltip">
+		Región General
+	</string>
+	<string name="UpdaterWindowTitle">
+		Actualizar [APP_NAME]
+	</string>
+	<string name="UpdaterNowUpdating">
+		Actualizando [APP_NAME]...
+	</string>
+	<string name="UpdaterNowInstalling">
+		Instalando [APP_NAME]...
+	</string>
+	<string name="UpdaterUpdatingDescriptive">
+		Tu visor [APP_NAME] se está actualizando a la última versión.  Llevará algún tiempo, paciencia.
+	</string>
+	<string name="UpdaterProgressBarTextWithEllipses">
+		Descargando la actualización...
+	</string>
+	<string name="UpdaterProgressBarText">
+		Descargando la actualización
+	</string>
+	<string name="UpdaterFailDownloadTitle">
+		Fallo en la descarga de la actualización
+	</string>
+	<string name="UpdaterFailUpdateDescriptive">
+		Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
+	</string>
+	<string name="UpdaterFailInstallTitle">
+		Fallo al instalar la actualización
+	</string>
+	<string name="UpdaterFailStartTitle">
+		Fallo al iniciar el visor
+	</string>
+	<string name="ItemsComingInTooFastFrom">
+		[APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
+	</string>
+	<string name="ItemsComingInTooFast">
+		[APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
+	</string>
+	<string name="IM_logging_string">
+		-- Activado el registro de los mensajes instantáneos --
+	</string>
+	<string name="IM_typing_start_string">
+		[NAME] está escribiendo...
+	</string>
+	<string name="Unnamed">
+		(sin nombre)
+	</string>
+	<string name="IM_moderated_chat_label">
+		(Moderado: por defecto, desactivada la voz)
+	</string>
+	<string name="IM_unavailable_text_label">
+		Para esta llamada no está disponible el chat de texto.
+	</string>
+	<string name="IM_muted_text_label">
+		Un moderador del grupo ha desactivado tu chat de texto.
+	</string>
+	<string name="IM_default_text_label">
+		Pulsa aquí para enviar un mensaje instantáneo.
+	</string>
+	<string name="IM_to_label">
+		A
+	</string>
+	<string name="IM_moderator_label">
+		(Moderador)
+	</string>
+	<string name="Saved_message">
+		(Guardado [LONG_TIMESTAMP])
+	</string>
+	<string name="answered_call">
+		Han respondido a tu llamada
+	</string>
+	<string name="you_started_call">
+		Has iniciado una llamada de voz
+	</string>
+	<string name="you_joined_call">
+		Has entrado en la llamada de voz
+	</string>
+	<string name="name_started_call">
+		[NAME] inició una llamada de voz
+	</string>
+	<string name="ringing-im">
+		Haciendo la llamada de voz...
+	</string>
+	<string name="connected-im">
+		Conectado, pulsa Colgar para salir
+	</string>
+	<string name="hang_up-im">
+		Se colgó la llamada de voz
+	</string>
+	<string name="conference-title-incoming">
+		Conferencia con [AGENT_NAME]
+	</string>
+	<string name="inventory_item_offered-im">
+		Ofrecido el item del inventario
+	</string>
+	<string name="no_session_message">
+		(La sesión de MI no existe)
+	</string>
+	<string name="only_user_message">
+		Usted es el único usuario en esta sesión.
+	</string>
+	<string name="offline_message">
+		[NAME] está desconectado.
+	</string>
+	<string name="invite_message">
+		Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
+	</string>
+	<string name="muted_message">
+		Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
+	</string>
+	<string name="generic">
+		Error en lo solicitado, por favor, inténtalo más tarde.
+	</string>
+	<string name="generic_request_error">
+		Error al hacer lo solicitado; por favor, inténtelo más tarde.
+	</string>
+	<string name="insufficient_perms_error">
+		Usted no tiene permisos suficientes.
+	</string>
+	<string name="session_does_not_exist_error">
+		La sesión ya acabó
+	</string>
+	<string name="no_ability_error">
+		Usted no tiene esa capacidad.
+	</string>
+	<string name="no_ability">
+		Usted no tiene esa capacidad.
+	</string>
+	<string name="not_a_mod_error">
+		Usted no es un moderador de la sesión.
+	</string>
+	<string name="muted">
+		Un moderador del grupo ha desactivado tu chat de texto.
+	</string>
+	<string name="muted_error">
+		Un moderador del grupo le ha desactivado el chat de texto.
+	</string>
+	<string name="add_session_event">
+		No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
+	</string>
+	<string name="message">
+		No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
+	</string>
+	<string name="message_session_event">
+		No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
+	</string>
+	<string name="mute">
+		Error moderando.
+	</string>
+	<string name="removed">
+		Se te ha sacado del grupo.
+	</string>
+	<string name="removed_from_group">
+		Ha sido eliminado del grupo.
+	</string>
+	<string name="close_on_no_ability">
+		Usted ya no tendrá más la capacidad de estar en la sesión de chat.
+	</string>
+	<string name="unread_chat_single">
+		[SOURCES] ha dicho algo nuevo
+	</string>
+	<string name="unread_chat_multiple">
+		[SOURCES] ha dicho algo nuevo
+	</string>
+	<string name="session_initialization_timed_out_error">
+		Se ha agotado el tiempo del inicio de sesión
+	</string>
+	<string name="voice_morphing_url">
+		http://secondlife.com/landing/voicemorphing
+	</string>
+	<string name="paid_you_ldollars">
+		[NAME] te ha pagado [AMOUNT] L$ [REASON].
+	</string>
+	<string name="paid_you_ldollars_no_reason">
+		[NAME] te ha pagado [AMOUNT] L$.
+	</string>
+	<string name="you_paid_ldollars">
+		Has pagado [AMOUNT] L$ a [NAME] por [REASON].
+	</string>
+	<string name="you_paid_ldollars_no_info">
+		Has pagado[AMOUNT] L$
+	</string>
+	<string name="you_paid_ldollars_no_reason">
+		Has pagado [AMOUNT] L$ a [NAME].
+	</string>
+	<string name="you_paid_ldollars_no_name">
+		Has pagado [AMOUNT] L$ por [REASON].
+	</string>
+	<string name="for item">
+		para [ITEM]
+	</string>
+	<string name="for a parcel of land">
+		para una parcela de terreno
+	</string>
+	<string name="for a land access pass">
+		para un pase de acceso a terrenos
+	</string>
+	<string name="for deeding land">
+		for deeding land
+	</string>
+	<string name="to create a group">
+		para crear un grupo
+	</string>
+	<string name="to join a group">
+		para entrar a un grupo
+	</string>
+	<string name="to upload">
+		to upload
+	</string>
+	<string name="to publish a classified ad">
+		para publicar un anuncio clasificado
+	</string>
+	<string name="giving">
+		Dando [AMOUNT] L$
+	</string>
+	<string name="uploading_costs">
+		Subir esto cuesta [AMOUNT] L$
+	</string>
+	<string name="this_costs">
+		Esto cuesta [AMOUNT] L$
+	</string>
+	<string name="buying_selected_land">
+		Compra del terreno seleccionado por [AMOUNT] L$
+	</string>
+	<string name="this_object_costs">
+		Este objeto cuesta [AMOUNT] L$
+	</string>
+	<string name="group_role_everyone">
+		Todos
+	</string>
+	<string name="group_role_officers">
+		Oficiales
+	</string>
+	<string name="group_role_owners">
+		Propietarios
+	</string>
+	<string name="group_member_status_online">
+		Conectado/a
+	</string>
+	<string name="uploading_abuse_report">
+		Subiendo...
+  
+Denuncia de infracción
+	</string>
+	<string name="New Shape">
+		Anatomía nueva
+	</string>
+	<string name="New Skin">
+		Piel nueva
+	</string>
+	<string name="New Hair">
+		Pelo nuevo
+	</string>
+	<string name="New Eyes">
+		Ojos nuevos
+	</string>
+	<string name="New Shirt">
+		Camisa nueva
+	</string>
+	<string name="New Pants">
+		Pantalón nuevo
+	</string>
+	<string name="New Shoes">
+		Zapatos nuevos
+	</string>
+	<string name="New Socks">
+		Calcetines nuevos
+	</string>
+	<string name="New Jacket">
+		Chaqueta nueva
+	</string>
+	<string name="New Gloves">
+		Guantes nuevos
+	</string>
+	<string name="New Undershirt">
+		Camiseta nueva
+	</string>
+	<string name="New Underpants">
+		Ropa interior nueva
+	</string>
+	<string name="New Skirt">
+		Falda nueva
+	</string>
+	<string name="New Alpha">
+		Nueva Alfa
+	</string>
+	<string name="New Tattoo">
+		Tatuaje nuevo
+	</string>
+	<string name="New Physics">
+		Nueva física
+	</string>
+	<string name="Invalid Wearable">
+		No se puede poner
+	</string>
+	<string name="New Gesture">
+		Gesto nuevo
+	</string>
+	<string name="New Script">
+		Script nuevo
+	</string>
+	<string name="New Note">
+		Nota nueva
+	</string>
+	<string name="New Folder">
+		Carpeta nueva
+	</string>
+	<string name="Contents">
+		Contenidos
+	</string>
+	<string name="Gesture">
+		Gestos
+	</string>
+	<string name="Male Gestures">
+		Gestos de hombre
+	</string>
+	<string name="Female Gestures">
+		Gestos de mujer
+	</string>
+	<string name="Other Gestures">
+		Otros gestos
+	</string>
+	<string name="Speech Gestures">
+		Gestos al hablar
+	</string>
+	<string name="Common Gestures">
+		Gestos corrientes
+	</string>
+	<string name="Male - Excuse me">
+		Varón - Disculpa
+	</string>
+	<string name="Male - Get lost">
+		Varón – Déjame en paz
+	</string>
+	<string name="Male - Blow kiss">
+		Varón - Lanzar un beso
+	</string>
+	<string name="Male - Boo">
+		Varón - Abucheo
+	</string>
+	<string name="Male - Bored">
+		Varón - Aburrido
+	</string>
+	<string name="Male - Hey">
+		Varón – ¡Eh!
+	</string>
+	<string name="Male - Laugh">
+		Varón - Risa
+	</string>
+	<string name="Male - Repulsed">
+		Varón - Rechazo
+	</string>
+	<string name="Male - Shrug">
+		Varón - Encogimiento de hombros
+	</string>
+	<string name="Male - Stick tougue out">
+		Varón - Sacando la lengua
+	</string>
+	<string name="Male - Wow">
+		Varón - Admiración
+	</string>
+	<string name="Female - Chuckle">
+		Mujer - Risa suave
+	</string>
+	<string name="Female - Cry">
+		Mujer - Llorar
+	</string>
+	<string name="Female - Embarrassed">
+		Mujer - Ruborizada
+	</string>
+	<string name="Female - Excuse me">
+		Mujer - Disculpa
+	</string>
+	<string name="Female - Get lost">
+		Mujer – Déjame en paz
+	</string>
+	<string name="Female - Blow kiss">
+		Mujer - Lanzar un beso
+	</string>
+	<string name="Female - Boo">
+		Mujer - Abucheo
+	</string>
+	<string name="Female - Bored">
+		Mujer - Aburrida
+	</string>
+	<string name="Female - Hey">
+		Mujer - ¡Eh!
+	</string>
+	<string name="Female - Hey baby">
+		Mujer - ¡Eh, encanto!
+	</string>
+	<string name="Female - Laugh">
+		Mujer - Risa
+	</string>
+	<string name="Female - Looking good">
+		Mujer - Buen aspecto
+	</string>
+	<string name="Female - Over here">
+		Mujer - Por aquí
+	</string>
+	<string name="Female - Please">
+		Mujer - Por favor
+	</string>
+	<string name="Female - Repulsed">
+		Mujer - Rechazo
+	</string>
+	<string name="Female - Shrug">
+		Mujer - Encogimiento de hombros
+	</string>
+	<string name="Female - Stick tougue out">
+		Mujer - Sacando la lengua
+	</string>
+	<string name="Female - Wow">
+		Mujer - Admiración
+	</string>
+	<string name="AvatarBirthDateFormat">
+		[day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+	</string>
+	<string name="DefaultMimeType">
+		ninguno/ninguno
+	</string>
+	<string name="texture_load_dimensions_error">
+		No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
+	</string>
+	<string name="words_separator" value=","/>
+	<string name="server_is_down">
+		Parece que hay algún problema que ha escapado a nuestros controles.
+
+	Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.  
+        Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
+	</string>
+	<string name="dateTimeWeekdaysNames">
+		Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
+	</string>
+	<string name="dateTimeWeekdaysShortNames">
+		Dom:Lun:Mar:Mié:Jue:Vie:Sáb
+	</string>
+	<string name="dateTimeMonthNames">
+		Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
+	</string>
+	<string name="dateTimeMonthShortNames">
+		Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
+	</string>
+	<string name="dateTimeDayFormat">
+		[MDAY]
+	</string>
+	<string name="dateTimeAM">
+		AM
+	</string>
+	<string name="dateTimePM">
+		PM
+	</string>
+	<string name="LocalEstimateUSD">
+		[AMOUNT] US$
+	</string>
+	<string name="Membership">
+		Membresía
+	</string>
+	<string name="Roles">
+		Roles
+	</string>
+	<string name="Group Identity">
+		Indentidad de grupo
+	</string>
+	<string name="Parcel Management">
+		Gestión de la parcela
+	</string>
+	<string name="Parcel Identity">
+		Identidad de la parcela
+	</string>
+	<string name="Parcel Settings">
+		Configuración de la parcela
+	</string>
+	<string name="Parcel Powers">
+		Poder de la parcela
+	</string>
+	<string name="Parcel Access">
+		Acceso a la parcela
+	</string>
+	<string name="Parcel Content">
+		Contenido de la parcela
+	</string>
+	<string name="Object Management">
+		Manejo de objetos
+	</string>
+	<string name="Accounting">
+		Contabilidad
+	</string>
+	<string name="Notices">
+		Avisos
+	</string>
+	<string name="Chat" value="Chat :">
+		Chat
+	</string>
+	<string name="DeleteItems">
+		¿Deseas eliminar los elementos seleccionados?
+	</string>
+	<string name="DeleteItem">
+		¿Deseas eliminar el elemento seleccionado?
+	</string>
+	<string name="EmptyOutfitText">
+		No hay elementos en este vestuario
+	</string>
+	<string name="ExternalEditorNotSet">
+		Selecciona un editor mediante la configuración de ExternalEditor.
+	</string>
+	<string name="ExternalEditorNotFound">
+		No se encuentra el editor externo especificado.
+Inténtalo incluyendo la ruta de acceso al editor entre comillas
+(por ejemplo, &quot;/ruta a mi/editor&quot; &quot;%s&quot;).
+	</string>
+	<string name="ExternalEditorCommandParseError">
+		Error al analizar el comando de editor externo.
+	</string>
+	<string name="ExternalEditorFailedToRun">
+		Error al ejecutar el editor externo.
+	</string>
+	<string name="Esc">
+		Esc
+	</string>
+	<string name="Space">
+		Space
+	</string>
+	<string name="Enter">
+		Enter
+	</string>
+	<string name="Tab">
+		Tab
+	</string>
+	<string name="Ins">
+		Ins
+	</string>
+	<string name="Del">
+		Del
+	</string>
+	<string name="Backsp">
+		Backsp
+	</string>
+	<string name="Shift">
+		Shift
+	</string>
+	<string name="Ctrl">
+		Ctrl
+	</string>
+	<string name="Alt">
+		Alt
+	</string>
+	<string name="CapsLock">
+		CapsLock
+	</string>
+	<string name="Home">
+		Base
+	</string>
+	<string name="End">
+		End
+	</string>
+	<string name="PgUp">
+		PgUp
+	</string>
+	<string name="PgDn">
+		PgDn
+	</string>
+	<string name="F1">
+		F1
+	</string>
+	<string name="F2">
+		F2
+	</string>
+	<string name="F3">
+		F3
+	</string>
+	<string name="F4">
+		F4
+	</string>
+	<string name="F5">
+		F5
+	</string>
+	<string name="F6">
+		F6
+	</string>
+	<string name="F7">
+		F7
+	</string>
+	<string name="F8">
+		F8
+	</string>
+	<string name="F9">
+		F9
+	</string>
+	<string name="F10">
+		F10
+	</string>
+	<string name="F11">
+		F11
+	</string>
+	<string name="F12">
+		F12
+	</string>
+	<string name="Add">
+		Añadir
+	</string>
+	<string name="Subtract">
+		Restar
+	</string>
+	<string name="Multiply">
+		Multiplicar
+	</string>
+	<string name="Divide">
+		Dividir
+	</string>
+	<string name="PAD_DIVIDE">
+		PAD_DIVIDE
+	</string>
+	<string name="PAD_LEFT">
+		PAD_LEFT
+	</string>
+	<string name="PAD_RIGHT">
+		PAD_RIGHT
+	</string>
+	<string name="PAD_DOWN">
+		PAD_DOWN
+	</string>
+	<string name="PAD_UP">
+		PAD_UP
+	</string>
+	<string name="PAD_HOME">
+		PAD_HOME
+	</string>
+	<string name="PAD_END">
+		PAD_END
+	</string>
+	<string name="PAD_PGUP">
+		PAD_PGUP
+	</string>
+	<string name="PAD_PGDN">
+		PAD_PGDN
+	</string>
+	<string name="PAD_CENTER">
+		PAD_CENTER
+	</string>
+	<string name="PAD_INS">
+		PAD_INS
+	</string>
+	<string name="PAD_DEL">
+		PAD_DEL
+	</string>
+	<string name="PAD_Enter">
+		PAD_Enter
+	</string>
+	<string name="PAD_BUTTON0">
+		PAD_BUTTON0
+	</string>
+	<string name="PAD_BUTTON1">
+		PAD_BUTTON1
+	</string>
+	<string name="PAD_BUTTON2">
+		PAD_BUTTON2
+	</string>
+	<string name="PAD_BUTTON3">
+		PAD_BUTTON3
+	</string>
+	<string name="PAD_BUTTON4">
+		PAD_BUTTON4
+	</string>
+	<string name="PAD_BUTTON5">
+		PAD_BUTTON5
+	</string>
+	<string name="PAD_BUTTON6">
+		PAD_BUTTON6
+	</string>
+	<string name="PAD_BUTTON7">
+		PAD_BUTTON7
+	</string>
+	<string name="PAD_BUTTON8">
+		PAD_BUTTON8
+	</string>
+	<string name="PAD_BUTTON9">
+		PAD_BUTTON9
+	</string>
+	<string name="PAD_BUTTON10">
+		PAD_BUTTON10
+	</string>
+	<string name="PAD_BUTTON11">
+		PAD_BUTTON11
+	</string>
+	<string name="PAD_BUTTON12">
+		PAD_BUTTON12
+	</string>
+	<string name="PAD_BUTTON13">
+		PAD_BUTTON13
+	</string>
+	<string name="PAD_BUTTON14">
+		PAD_BUTTON14
+	</string>
+	<string name="PAD_BUTTON15">
+		PAD_BUTTON15
+	</string>
+	<string name="-">
+		-
+	</string>
+	<string name="=">
+		=
+	</string>
+	<string name="`">
+		`
+	</string>
+	<string name=";">
+		;
+	</string>
+	<string name="[">
+		[
+	</string>
+	<string name="]">
+		]
+	</string>
+	<string name="\">
+		\
+	</string>
+	<string name="0">
+		0
+	</string>
+	<string name="1">
+		1
+	</string>
+	<string name="2">
+		2
+	</string>
+	<string name="3">
+		3
+	</string>
+	<string name="4">
+		4
+	</string>
+	<string name="5">
+		5
+	</string>
+	<string name="6">
+		6
+	</string>
+	<string name="7">
+		7
+	</string>
+	<string name="8">
+		8
+	</string>
+	<string name="9">
+		9
+	</string>
+	<string name="A">
+		A
+	</string>
+	<string name="B">
+		B
+	</string>
+	<string name="C">
+		C
+	</string>
+	<string name="D">
+		D
+	</string>
+	<string name="E">
+		E
+	</string>
+	<string name="F">
+		F
+	</string>
+	<string name="G">
+		G
+	</string>
+	<string name="H">
+		H
+	</string>
+	<string name="I">
+		I
+	</string>
+	<string name="J">
+		J
+	</string>
+	<string name="K">
+		K
+	</string>
+	<string name="L">
+		L
+	</string>
+	<string name="M">
+		M
+	</string>
+	<string name="N">
+		N
+	</string>
+	<string name="O">
+		O
+	</string>
+	<string name="P">
+		P
+	</string>
+	<string name="Q">
+		Q
+	</string>
+	<string name="R">
+		R
+	</string>
+	<string name="S">
+		S
+	</string>
+	<string name="T">
+		T
+	</string>
+	<string name="U">
+		U
+	</string>
+	<string name="V">
+		V
+	</string>
+	<string name="W">
+		W
+	</string>
+	<string name="X">
+		X
+	</string>
+	<string name="Y">
+		Y
+	</string>
+	<string name="Z">
+		Z
+	</string>
+	<string name="BeaconParticle">
+		Viendo balizas de partículas (azules)
+	</string>
+	<string name="BeaconPhysical">
+		Viendo balizas de objetos materiales (verdes)
+	</string>
+	<string name="BeaconScripted">
+		Viendo balizas de objetos con script (rojas)
+	</string>
+	<string name="BeaconScriptedTouch">
+		Viendo el objeto con script con balizas de función táctil (rojas)
+	</string>
+	<string name="BeaconSound">
+		Viendo balizas de sonido (amarillas)
+	</string>
+	<string name="BeaconMedia">
+		Viendo balizas de medios (blancas)
+	</string>
+	<string name="ParticleHiding">
+		Ocultando las partículas
+	</string>
+</strings>
diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml
index 8a2a1e1d25506cb5e9cc95f93486ac9273b652e6..6d58cf77ca59f7fa82a1e9601107fde85695a641 100644
--- a/indra/newview/skins/default/xui/fr/floater_tos.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Chargement %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3Eles%20Conditions%20d%27utilisation%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Continuer" label_selected="Continuer" name="Continue"/>
 	<button label="Annuler" label_selected="Annuler" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
index 7e29db63367afed80ae0eefa64d6cd7d3a72aa6c..2172b9848b0cb08b7590e3cf6a5eb917dacec4db 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
@@ -34,10 +34,10 @@
 		Sostituisci con:
 	</text>
 	<line_editor name="replace_editor" tool_tip="Sostituisci le parole chiave con questi termini. Per esempio, sostituire la parola chiave &apos;salve&apos; con &apos;ciao&apos; modificherà la chat &apos;Volevo solo dire salve&apos; in &apos;Volevo solo dire ciao&apos; e avvierà la gesture!"/>
-	<text name="key_label">
+	<text name="key_label" width="147">
 		Scorciatoia da tastiera:
 	</text>
-	<combo_box label="Nessuno" name="modifier_combo" />
+	<combo_box left_delta="150" label="Nessuno" name="modifier_combo" />
 	<combo_box label="Nessuno" name="key_combo" />
 	<text name="library_label">
 		Libreria:
diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml
index bb2de773f06ce3287f8aea4543250b294c5dd1b3..8cdf267f4b7ac375212151875751b813191292d6 100644
--- a/indra/newview/skins/default/xui/pl/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Ładowanie %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3EWarunki%20Serwisu%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/>
 	<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 26d5710c4a6361f6945daeab765ab951ffa7037d..8094ad376ce6ce0665af50435debdf2c1f546ee8 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -6,18 +6,18 @@
 	<string name="payee_resident">
 		Pagar residente
 	</string>
-	<text left="5" name="payee_label" width="110">
+	<text left="5" name="payee_label">
 		Pagar:
 	</text>
 	<icon name="icon_person" tool_tip="Pessoa"/>
-	<text left="115" name="payee_name">
+	<text name="payee_name">
 		Test Name That Is Extremely Long To Check Clipping
 	</text>
-	<button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/>
+	<button label="L$1" label_selected="L$1" name="fastpay 1"/>
 	<button label="L$5" label_selected="L$5" name="fastpay 5"/>
-	<button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/>
+	<button label="L$10" label_selected="L$10" name="fastpay 10"/>
 	<button label="L$20" label_selected="L$20" name="fastpay 20"/>
-	<text left="4" name="amount text">
+	<text name="amount text">
 		Outro valor:
 	</text>
 	<button label="Pagar" label_selected="Pagar" name="pay btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml
index 2675979783e820abaaf7e1e86bdb2f0e51cb3709..c4954cb61f28488368674f21ba6717c735ca6ccc 100644
--- a/indra/newview/skins/default/xui/pt/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tos.xml
@@ -4,7 +4,7 @@
 		http://secondlife.com/app/tos/
 	</floater.string>
 	<floater.string name="loading_url">
-		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+		data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETermos%20de%20Serviço%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
 	</floater.string>
 	<button label="Continuar" label_selected="Continuar" name="Continue"/>
 	<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 4adfe8e37fe285f99480bd9a059228099d0e8efe..0786a62f13ae3f6a24d12dc981e93d01417f53b9 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -2730,7 +2730,7 @@ O botão será exibido quando houver espaço suficente.
 		Selecione os residentes com quem compartilhar.
 	</notification>
 	<notification name="ShareItemsConfirmation">
-		Tem certeza de que quer compartilhar os items abaixo?
+		Tem certeza de que quer compartilhar os itens abaixo?
 
 &lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
 
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 6466f42c7559990388d9a0379f2cae9f588c32b8..1dbbcafb0e91170d297f4f6959c25bdd18a8407a 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -3587,6 +3587,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 	<string name="conference-title-incoming">
 		Conversa com [AGENT_NAME]
 	</string>
+	<string name="inventory_item_offered-im">
+		Oferta de item de inventário
+	</string>
 	<string name="no_session_message">
 		(Sessão de MI inexistente)
 	</string>
diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9d094ff731741ae089b9e10922afa20fd86dfbde
--- /dev/null
+++ b/indra/newview/skins/default/xui/zh/panel_login.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">	
+	<layout_stack name="login_widgets">
+		<layout_panel name="login">
+			<text name="username_text">
+				使用者名稱:
+			</text>			
+			<text name="password_text">
+				密碼:
+			</text>
+			<check_box label="記住密碼" name="remember_check"/>
+			<button label="登入" name="connect_btn"/>
+			<text name="mode_selection_text">
+				模式:
+			</text>
+			<combo_box name="mode_combo" tool_tip="選擇一個登入模式">
+				<combo_box.item label="基礎" name="Basic"/>
+				<combo_box.item label="進階" name="Advanced"/>
+			</combo_box>
+			<text name="start_location_text">
+				開始地點:
+			</text>
+			<combo_box name="start_location_combo">
+				<combo_box.item label="上一次的地點" name="MyLastLocation"/>
+				<combo_box.item label="我的家" name="MyHome"/>
+				<combo_box.item label="&lt;輸入區域名&gt;" name="Typeregionname"/>
+			</combo_box>
+		</layout_panel>
+		<layout_panel name="links">
+			<text name="create_new_account_text">
+				註冊
+			</text>
+			<text name="forgot_password_text">
+				忘記使用者名稱或密碼?
+			</text>
+			<text name="login_help">
+				如何登入?
+			</text>
+		</layout_panel>
+	</layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6e9eef891bd5ef3b79e50685c7b0d2922ea6119
Binary files /dev/null and b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Off.png differ
diff --git a/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png
new file mode 100644
index 0000000000000000000000000000000000000000..687cb7fb53569a577d619a09ab211290dc909807
Binary files /dev/null and b/indra/newview/skins/minimal/textures/bottomtray/Speak_Btn_Selected_Press.png differ
diff --git a/indra/newview/skins/minimal/textures/textures.xml b/indra/newview/skins/minimal/textures/textures.xml
index b4848a0619694b0d5d7235e8ffe826506423797e..e3ed01721a5f5cd76673507874e15256a9ed3ee9 100644
--- a/indra/newview/skins/minimal/textures/textures.xml
+++ b/indra/newview/skins/minimal/textures/textures.xml
@@ -6,4 +6,6 @@
   <texture name="bottomtray_close_off" file_name="bottomtray/close_off.png" preload="true" />
   <texture name="bottomtray_close_over" file_name="bottomtray/close_over.png" preload="true" />
   <texture name="bottomtray_close_press" file_name="bottomtray/close_press.png" preload="true" />
-</textures>
+  <texture name="Speak_Btn_Off" file_name="bottomtray/Speak_Btn_Off.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
+  <texture name="Speak_Btn_Selected_Press" file_name="bottomtray/Speak_Btn_Selected_Press.png" preload="true" scale.left="4" scale.top="16" scale.right="8" scale.bottom="4" />
+ </textures>
diff --git a/indra/newview/skins/minimal/xui/en/main_view.xml b/indra/newview/skins/minimal/xui/en/main_view.xml
index 45ba785c1f90dc0feba4dcd01acb4e6ee0ef6e2a..6e8ad9adaff83a94c45cea5300231af839f20350 100644
--- a/indra/newview/skins/minimal/xui/en/main_view.xml
+++ b/indra/newview/skins/minimal/xui/en/main_view.xml
@@ -8,13 +8,13 @@
  tab_stop="false" 
  name="main_view"
  width="1024">
-  <panel top="0"
-   follows="all"
-   height="768"
-   mouse_opaque="false"
-   name="login_panel_holder"
-   width="1024"/>
- 
+              <panel top="0"
+               follows="all"
+               height="768"
+               mouse_opaque="false"
+               name="login_panel_holder"
+               width="1024"/>
+
   <layout_stack border_size="0"
                 follows="all"
                 mouse_opaque="false"
@@ -96,6 +96,7 @@
                      name="stand_stop_flying_container"
                      visible="false"
                      width="500"/>
+              
               <panel follows="all"
 										 height="500"
 										 left="0"
diff --git a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
index b55e6772761dfa0ffaadc8a462ee49428d020c10..80cf365c4625e7dc2d7dd27b5789e68b2ffe6e64 100644
--- a/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_attachment_other.xml
@@ -25,6 +25,14 @@
         <menu_item_call.on_click
          function="Avatar.SendIM" />
     </menu_item_call>
+  <menu_item_call
+     label="Call"
+     name="Call">
+    <menu_item_call.on_click
+     function="Avatar.Call" />
+    <menu_item_call.on_enable
+     function="Avatar.EnableCall" />
+  </menu_item_call>
    <menu_item_separator />
     <menu_item_call
      enabled="false"
diff --git a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
index b76629f401bfaacdd38e1b5ce720948ac90bd087..2c81b5a7782cf95f5ab879203b85a3895203dd35 100644
--- a/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_avatar_other.xml
@@ -25,6 +25,14 @@
         <menu_item_call.on_click
          function="Avatar.SendIM" />
     </menu_item_call>
+  <menu_item_call
+     label="Call"
+     name="Call">
+    <menu_item_call.on_click
+     function="Avatar.Call" />
+    <menu_item_call.on_enable
+     function="Avatar.EnableCall" />
+  </menu_item_call>
    <menu_item_separator />
     <menu_item_call
      enabled="false"
diff --git a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
index 5a4a0597810bd6a2c03eb725ccb9bea82cdf5074..a11e367d6626b6ba4332c1362e6af181e247cb4d 100644
--- a/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_inspect_avatar_gear.xml
@@ -26,6 +26,15 @@
     <menu_item_call.on_click
      function="InspectAvatar.IM"/>
   </menu_item_call>
+  <menu_item_call
+   label="Call"
+   enabled="true"
+   name="call">
+    <menu_item_call.on_click
+     function="InspectAvatar.Call"/>
+    <menu_item_call.on_enable
+     function="InspectAvatar.Gear.EnableCall"/>
+  </menu_item_call>
   <menu_item_call
    label="Teleport"
    name="teleport">
diff --git a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
index 3d64133f5418b7430024c35501e71be94d16f1d8..1840ebd491f57dfd403700d6977f4add16ba6db2 100644
--- a/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/minimal/xui/en/menu_people_nearby.xml
@@ -36,6 +36,16 @@
 		<menu_item_call.on_click
          function="Avatar.IM" />
 	</menu_item_call>
+  <menu_item_call
+     label="Call"
+     layout="topleft"
+     name="Call">
+    <menu_item_call.on_click
+     function="Avatar.Call" />
+    <menu_item_call.on_enable
+     function="Avatar.EnableItem"
+     parameter="can_call" />
+  </menu_item_call>
 	<menu_item_check
      label="Block/Unblock"
      layout="topleft"
diff --git a/indra/newview/skins/minimal/xui/en/notification_visibility.xml b/indra/newview/skins/minimal/xui/en/notification_visibility.xml
index 616b544847ec8830223ec49e323fa6a87abd579f..bdd3c3d4a473626caabcbedea83e3ae060f61af9 100644
--- a/indra/newview/skins/minimal/xui/en/notification_visibility.xml
+++ b/indra/newview/skins/minimal/xui/en/notification_visibility.xml
@@ -1,12 +1,9 @@
 <?xml version="1.0" ?>
 <notification_visibility>
-  <respond name="VoiceInviteP2P" response="Decline"/>
-  <respond name="VoiceInviteAdHoc" response="Decline"/>
   <respond name="VoiceInviteGroup" response="Decline"/>
 
   <!-- group and voice are disabled features -->
   <hide tag="group"/>
-  <hide tag="voice"/>
 
   <!-- no spammy scripts -->
   <!-- <hide name="ScriptDialog"/> -->
@@ -16,6 +13,7 @@
   <hide name="FirstInventory"/>
   <hide name="HintSidePanel"/>
   <hide name="HintMove"/>
+  <hide name="HintSpeak"/>
   <hide name="HintDisplayName"/>
   <hide name="HintInventory"/>
   <hide name="HintLindenDollar"/>
diff --git a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
index 5730adab8ac390984b07baa035ad27628c4a0518..39d1a90850fdca6c3e74164eaa3b9b21660480b3 100644
--- a/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_adhoc_control_panel.xml
@@ -42,5 +42,40 @@
              show_speaking_indicator="false"
              width="147" />
         </layout_panel>
+      <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="130"
+         name="call_btn_panel"
+         user_resize="false"
+         visible="false">
+        <button
+         follows="all"
+         height="20"
+         label="Call"
+         name="call_btn"
+         width="130"
+         top="5" />
+      </layout_panel>
+      <layout_panel
+       auto_resize="false"
+       follows="top|left|right"
+       height="25"
+       layout="topleft"
+       min_height="25"
+       width="130"
+       name="end_call_btn_panel"
+       user_resize="false"
+       visible="false">
+        <button
+         follows="all"
+         height="20"
+         label="Leave Call"
+         name="end_call_btn"
+         top="5"/>
+      </layout_panel>
     </layout_stack>
 </panel>
diff --git a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
index e0c0bd13d978097e34a0a06139b3cc524080b67e..d722c54081a96d8762e0ca39826805ccde73d4a9 100644
--- a/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_bottomtray.xml
@@ -47,7 +47,7 @@
          mouse_opaque="false"
 		 name="chat_bar_layout_panel"
          user_resize="true"
-         width="308" >
+         width="312" >
 			<panel
 		   name="chat_bar"
 			  filename="panel_nearby_chat_bar.xml"
@@ -61,6 +61,79 @@
 		</layout_panel>
     <layout_panel
         auto_resize="false"
+        follows="left|right"
+        height="28"
+        layout="topleft"
+        min_height="28"
+        min_width="35"
+        mouse_opaque="false"
+        name="speak_panel"
+        top_delta="0"
+        user_resize="false"
+        width="85">
+      <button
+       follows="left|right"
+       height="23"
+       layout="topleft"
+       label="Speak"
+       left="0"
+       name="speak_btn"
+       tool_tip="Turn your microphone on and off"
+       pad_right="30"
+       halign="center"
+       use_ellipses="true"
+       tab_stop="true"
+    is_toggle="true"
+    image_selected="Speak_Btn_Selected_Press"
+    image_unselected="Speak_Btn_Off"
+		 image_pressed="Speak_Btn_Selected_Press"
+		 image_pressed_selected="Speak_Btn_Selected_Press"
+       top="5"
+       width="85">
+
+        <commit_callback
+				  function="ToggleSpeak"
+				  parameter="f1_help" />
+      </button>
+    </layout_panel>
+
+    <layout_panel
+          auto_resize="false"
+          follows="left|right"
+          height="28"
+          layout="topleft"
+          min_height="28"
+          min_width="20"
+          mouse_opaque="false"
+          name="speak_flyout_panel"
+          top_delta="0"
+          user_resize="false"
+          width="26">
+      <button
+     follows="left|right"
+     width="20"
+        top="5"
+     left="0"
+     height="23"
+     name="flyout_btn"
+     label=""
+     tab_stop="false"
+     tool_tip="Change your sound preferences"
+     is_toggle="true"
+     image_disabled="ComboButton_UpOff"
+     image_unselected="ComboButton_UpOff"
+     image_selected="ComboButton_On"
+     image_pressed="ComboButton_UpSelected"
+     image_pressed_selected="ComboButton_Selected">
+        <init_callback
+         function="Button.SetDockableFloaterToggle"
+         parameter="sound_devices" />
+      </button>
+
+    </layout_panel>
+
+    <layout_panel
+         auto_resize="false"
          follows="right"
          height="28"
          layout="topleft"
@@ -70,7 +143,7 @@
          name="gesture_panel"
          top_delta="0"
          user_resize="false"
-         width="85">
+         width="88">
 			<gesture_combo_list
              follows="left|right"
              height="23"
@@ -80,7 +153,7 @@
              view_all="false"
              left="0"
              name="Gesture"
-             tool_tip="Shows/hides gestures"
+             tool_tip="Make your avatar do things"
              top="5"
              width="82">
 				<combo_button
@@ -101,7 +174,7 @@
          mouse_opaque="false"
          name="cam_panel"
          user_resize="false"
-         width="83">
+         width="86">
 			<bottomtray_button
               can_drag="false"
              follows="left|right"
@@ -114,7 +187,7 @@
              layout="topleft"
              left="0"
              name="camera_btn"
-             tool_tip="Shows/hides camera controls"
+             tool_tip="Control your camera angle"
              top="5"
              use_ellipses="true"
              width="80">
@@ -128,15 +201,15 @@
          follows="left|right"
          height="28"
          layout="topleft"
-         min_width="17"
-         name="splitter_panel"
+         min_width="8"
+         name="splitter_panel_1"
          user_resize="false"
-         width="17">
+         width="8">
 			<icon
              follows="left|bottom"
              height="18"
              width="2"
-             left="6"
+             left="0"
              image_name="Button_Separator"
              name="separator"
              top="7"/>
@@ -149,9 +222,9 @@
 		  min_height="28"
 		  min_width="83"
 		  mouse_opaque="false"
-		  name="avatar_and_destinations_panel"
+		  name="destinations_panel"
 		  user_resize="false"
-		  width="103">
+		  width="106">
 			<bottomtray_button
 			 can_drag="false"
 			follows="left|right"
@@ -163,7 +236,7 @@
 			layout="topleft"
 			left="0"
 			name="destination_btn"
-			tool_tip="Shows destinations window"
+			tool_tip="Travel through Second Life"
 			top="5"
 			is_toggle="true"
 			use_ellipses="true"
@@ -180,9 +253,9 @@
 		  min_height="28"
 		  min_width="73"
 		  mouse_opaque="false"
-		  name="avatar_and_destinations_panel"
+		  name="avatar_panel"
 		  user_resize="false"
-		  width="103">
+		  width="106">
 			<bottomtray_button
 			 can_drag="false"
 			follows="left|right"
@@ -196,6 +269,7 @@
 			name="avatar_btn"
 			top="5"
 			is_toggle="true"
+			tool_tip="Change your appearance"
 			use_ellipses="true"
 			width="100">
 				<bottomtray_button.commit_callback
@@ -207,15 +281,15 @@
 		  follows="left|right"
 		  height="28"
 		  layout="topleft"
-		  min_width="17"
-		  name="splitter_panel"
+		  min_width="8"
+		  name="splitter_panel_2"
 		  user_resize="false"
-		  width="17">
+		  width="8">
 			<icon
              follows="left|bottom"
              height="18"
              width="2"
-             left="6"
+             left="0"
              image_name="Button_Separator"
              name="separator"
              top="7"/>
@@ -231,7 +305,7 @@
          name="people_panel"
          top_delta="0"
          user_resize="false"
-         width="105">
+         width="106">
 			<bottomtray_button
 			   can_drag="false"
 			  follows="left|right"
@@ -243,7 +317,7 @@
 			  layout="topleft"
 			  left="0"
 			  name="show_people_button"
-			  tool_tip="Shows people window"
+			  tool_tip="Find people in Second Life"
 			  top="5"
 			  is_toggle="true"
 			  use_ellipses="true"
@@ -264,7 +338,7 @@
 		   name="profile_panel"
 		   top_delta="0"
 		   user_resize="false"
-		   width="105">
+		   width="106">
 			<bottomtray_button
 			   can_drag="false"
 			  follows="left|right"
@@ -276,7 +350,7 @@
 			  layout="topleft"
 			  left="0"
 			  name="show_profile_btn"
-			  tool_tip="Shows profile window"
+			  tool_tip="View and edit your Profile"
 			  is_toggle="true"
 			  top="5"
 			  use_ellipses="true"
@@ -297,7 +371,7 @@
 		   name="howto_panel"
 		   top_delta="0"
 		   user_resize="false"
-		   width="105">
+		   width="106">
 			<bottomtray_button
 			   can_drag="false"
 			  follows="left|right"
@@ -309,7 +383,7 @@
 			  layout="topleft"
 			  left="0"
 			  name="show_help_btn"
-			  tool_tip="Open Second Life How To topics"
+			  tool_tip="View Second Life help info"
 			  is_toggle="true"
 			  top="5"
 			  use_ellipses="true"
diff --git a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
index c3f46f11e06c53de9ce83323f9d1be1924410ec4..be13bc1bb7c672f9954d63a075bc55db0fa10531 100644
--- a/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_im_control_panel.xml
@@ -77,6 +77,39 @@
              tool_tip = "Offer to teleport this person"
              width="140" />
       </layout_panel>
+      <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="140"
+         name="call_btn_panel"
+         user_resize="false">
+        <button
+         follows="left|top|right"
+         height="23"
+         label="Call"
+         name="call_btn"
+         width="140" />
+      </layout_panel>
+      <layout_panel
+       auto_resize="false"
+       follows="top|left|right"
+       height="25"
+       layout="topleft"
+       min_height="25"
+       width="140"
+       name="end_call_btn_panel"
+       user_resize="false"
+       visible="false">
+        <button
+         follows="left|top|right"
+         height="23"
+         label="End Call"
+         name="end_call_btn"
+         width="140" />
+      </layout_panel>
       <layout_panel
        mouse_opaque="false"
        auto_resize="true"
diff --git a/indra/newview/skins/minimal/xui/en/panel_people.xml b/indra/newview/skins/minimal/xui/en/panel_people.xml
index 4a72653d76cd60163ad1c6de19a2a67eb706aa40..76baacb0911393eba6703651c5f8f51209637f9e 100644
--- a/indra/newview/skins/minimal/xui/en/panel_people.xml
+++ b/indra/newview/skins/minimal/xui/en/panel_people.xml
@@ -451,6 +451,27 @@ Looking for people to hang out with? Try the Destinations button below.
 			left_pad="3"
 			name="chat_btn_lp"
 		    user_resize="false" 
+		    auto_resize="true"
+			width="52">
+				<button
+		         follows="bottom|left|right"
+		         left="1"
+		         height="23"
+		         label="Call"
+		         layout="topleft"
+		         name="call_btn"
+		         tool_tip="Call this Resident"
+		         top="0"
+		         width="51" />		
+			</layout_panel>
+						
+			<layout_panel
+			follows="bottom|left|right"
+			height="23"
+			layout="bottomleft"
+			left_pad="3"
+			name="chat_btn_lp"
+		    user_resize="false" 
 		    auto_resize="true"
 			width="77">
 				<button
diff --git a/indra/newview/skins/minimal/xui/es/menu_favorites.xml b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
index c8a7858ddb8a1d2f819481b5813b13f8ab3f445a..85210d5c49f39090506213b419f8ec96d4f254d8 100644
--- a/indra/newview/skins/minimal/xui/es/menu_favorites.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_favorites.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu name="Popup">
-	<menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+	<menu_item_call label="Teleportar" name="Teleport To Landmark"/>
 	<menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
 	<menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
 	<menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
diff --git a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
index ebe33cea117140b49fe3199166ce688854d9c93d..b4b964d096967a96d0aef66bde4790fb328ff9ee 100644
--- a/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_inspect_avatar_gear.xml
@@ -3,7 +3,7 @@
 	<menu_item_call label="Ver el perfil" name="view_profile"/>
 	<menu_item_call label="Añadir como amigo" name="add_friend"/>
 	<menu_item_call label="MI" name="im"/>
-	<menu_item_call label="Teleportarse" name="teleport"/>
+	<menu_item_call label="Teleportar" name="teleport"/>
 	<menu_item_call label="Ignorar" name="block"/>
 	<menu_item_call label="Designorar" name="unblock"/>
 	<menu_item_call label="Denunciar" name="report"/>
diff --git a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
index ed33c55aca3612b49e9e7636427e7d3fb38f5d21..c482907812ce516e182253e3e0c443624e7f5f81 100644
--- a/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
+++ b/indra/newview/skins/minimal/xui/es/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <context_menu name="Teleport History Item Context Menu">
-	<menu_item_call label="Teleportarse" name="Teleport"/>
+	<menu_item_call label="Teleportar" name="Teleport"/>
 	<menu_item_call label="Más información" name="More Information"/>
 	<menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
 </context_menu>
diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7e9a06492195f2bab6dc7f5150fef143a52d219c
--- /dev/null
+++ b/indra/newview/tests/gpus_results.txt
@@ -0,0 +1,1595 @@
+GPU String                                                                                               Supported?  Class  Recognizer
+------------------------------------------------------------------------------------------------------   ----------- -----  ------------------------------------
+ATI                                                                                                                         UNRECOGNIZED
+ATI 3D-Analyze                                                                                           unsupported    0   ATI 3D-Analyze
+ATI ASUS A9xxx                                                                                           supported      1   ATI ASUS A9xxx
+ATI ASUS AH24xx                                                                                          supported      1   ATI ASUS AH24xx
+ATI ASUS AH26xx                                                                                          supported      3   ATI ASUS AH26xx
+ATI ASUS AH34xx                                                                                          supported      1   ATI ASUS AH34xx
+ATI ASUS AH36xx                                                                                          supported      3   ATI ASUS AH36xx
+ATI ASUS AH46xx                                                                                          supported      3   ATI ASUS AH46xx
+ATI ASUS AX3xx                                                                                           supported      1   ATI ASUS AX3xx
+ATI ASUS AX5xx                                                                                           supported      1   ATI ASUS AX5xx
+ATI ASUS AX8xx                                                                                           supported      2   ATI ASUS AX8xx
+ATI ASUS EAH38xx                                                                                         supported      3   ATI ASUS EAH38xx
+ATI ASUS EAH43xx                                                                                         supported      1   ATI ASUS EAH43xx
+ATI ASUS EAH45xx                                                                                         supported      1   ATI ASUS EAH45xx
+ATI ASUS EAH48xx                                                                                         supported      3   ATI ASUS EAH48xx
+ATI ASUS EAH57xx                                                                                         supported      3   ATI ASUS EAH57xx
+ATI ASUS EAH58xx                                                                                         supported      3   ATI ASUS EAH58xx
+ATI ASUS X1xxx                                                                                           supported      3   ATI ASUS Radeon X1xxx
+ATI All-in-Wonder 9xxx                                                                                   supported      1   ATI All-in-Wonder 9xxx
+ATI All-in-Wonder HD                                                                                     supported      1   ATI All-in-Wonder HD
+ATI All-in-Wonder PCI-E                                                                                  supported      1   ATI All-in-Wonder PCI-E
+ATI All-in-Wonder X1800                                                                                  supported      3   ATI All-in-Wonder X1800
+ATI All-in-Wonder X1900                                                                                  supported      3   ATI All-in-Wonder X1900
+ATI All-in-Wonder X600                                                                                   supported      1   ATI All-in-Wonder X600
+ATI All-in-Wonder X800                                                                                   supported      2   ATI All-in-Wonder X800
+ATI Diamond X1xxx                                                                                        supported      0   ATI Radeon X1xxx
+ATI Display Adapter                                                                                                         UNRECOGNIZED
+ATI FireGL                                                                                               supported      0   ATI FireGL
+ATI FireGL 5200                                                                                          supported      0   ATI FireGL
+ATI FireGL 5xxx                                                                                          supported      0   ATI FireGL
+ATI FireMV                                                                                               supported      0   ATI FireMV
+ATI Generic                                                                                              unsupported    0   ATI Generic
+ATI Hercules 9800                                                                                        supported      1   ATI Hercules 9800
+ATI IGP 340M                                                                                             unsupported    0   ATI IGP 340M
+ATI M52                                                                                                  supported      1   ATI M52
+ATI M54                                                                                                  supported      1   ATI M54
+ATI M56                                                                                                  supported      1   ATI M56
+ATI M71                                                                                                  supported      1   ATI M71
+ATI M72                                                                                                  supported      1   ATI M72
+ATI M76                                                                                                  supported      3   ATI M76
+ATI Mobility Radeon                                                                                      supported      0   ATI Mobility Radeon
+ATI Mobility Radeon 7xxx                                                                                 supported      0   ATI Mobility Radeon 7xxx
+ATI Mobility Radeon 9600                                                                                 supported      0   ATI Mobility Radeon 9600
+ATI Mobility Radeon 9700                                                                                 supported      1   ATI Mobility Radeon 9700
+ATI Mobility Radeon 9800                                                                                 supported      1   ATI Mobility Radeon 9800
+ATI Mobility Radeon HD 2300                                                                              supported      1   ATI Mobility Radeon HD 2300
+ATI Mobility Radeon HD 2400                                                                              supported      1   ATI Mobility Radeon HD 2400
+ATI Mobility Radeon HD 2600                                                                              supported      3   ATI Mobility Radeon HD 2600
+ATI Mobility Radeon HD 2700                                                                              supported      3   ATI Mobility Radeon HD 2700
+ATI Mobility Radeon HD 3400                                                                              supported      2   ATI Mobility Radeon HD 3400
+ATI Mobility Radeon HD 3600                                                                              supported      3   ATI Mobility Radeon HD 3600
+ATI Mobility Radeon HD 3800                                                                              supported      3   ATI Mobility Radeon HD 3800
+ATI Mobility Radeon HD 4200                                                                              supported      2   ATI Mobility Radeon HD 4200
+ATI Mobility Radeon HD 4300                                                                              supported      2   ATI Mobility Radeon HD 4300
+ATI Mobility Radeon HD 4500                                                                              supported      3   ATI Mobility Radeon HD 4500
+ATI Mobility Radeon HD 4600                                                                              supported      3   ATI Mobility Radeon HD 4600
+ATI Mobility Radeon HD 4800                                                                              supported      3   ATI Mobility Radeon HD 4800
+ATI Mobility Radeon HD 5400                                                                              supported      2   ATI Mobility Radeon HD 5400
+ATI Mobility Radeon HD 5600                                                                              supported      2   ATI Mobility Radeon HD 5600
+ATI Mobility Radeon X1xxx                                                                                supported      0   ATI Radeon X1xxx
+ATI Mobility Radeon X2xxx                                                                                supported      0   ATI Mobility Radeon X2xxx
+ATI Mobility Radeon X3xx                                                                                 supported      1   ATI Mobility Radeon X3xx
+ATI Mobility Radeon X6xx                                                                                 supported      1   ATI Mobility Radeon X6xx
+ATI Mobility Radeon X7xx                                                                                 supported      1   ATI Mobility Radeon X7xx
+ATI Mobility Radeon Xxxx                                                                                 supported      0   ATI Mobility Radeon Xxxx
+ATI RV380                                                                                                supported      0   ATI RV380
+ATI RV530                                                                                                supported      1   ATI RV530
+ATI Radeon 2100                                                                                          supported      0   ATI Radeon 2100
+ATI Radeon 3000                                                                                          supported      0   ATI Radeon 3000
+ATI Radeon 3100                                                                                          supported      1   ATI Radeon 3100
+ATI Radeon 7000                                                                                          supported      0   ATI Radeon 7xxx
+ATI Radeon 7xxx                                                                                          supported      0   ATI Radeon 7xxx
+ATI Radeon 8xxx                                                                                          supported      0   ATI Radeon 8xxx
+ATI Radeon 9000                                                                                          supported      0   ATI Radeon 9000
+ATI Radeon 9100                                                                                          supported      0   ATI Radeon 9100
+ATI Radeon 9200                                                                                          supported      0   ATI Radeon 9200
+ATI Radeon 9500                                                                                          supported      0   ATI Radeon 9500
+ATI Radeon 9600                                                                                          supported      0   ATI Radeon 9600
+ATI Radeon 9700                                                                                          supported      1   ATI Radeon 9700
+ATI Radeon 9800                                                                                          supported      1   ATI Radeon 9800
+ATI Radeon HD 2300                                                                                       supported      0   ATI Radeon HD 2300
+ATI Radeon HD 2400                                                                                       supported      1   ATI Radeon HD 2400
+ATI Radeon HD 2600                                                                                       supported      2   ATI Radeon HD 2600
+ATI Radeon HD 2900                                                                                       supported      3   ATI Radeon HD 2900
+ATI Radeon HD 3000                                                                                       supported      0   ATI Radeon HD 3000
+ATI Radeon HD 3100                                                                                       supported      1   ATI Radeon HD 3100
+ATI Radeon HD 3200                                                                                       supported      0   ATI Radeon HD 3200
+ATI Radeon HD 3300                                                                                       supported      1   ATI Radeon HD 3300
+ATI Radeon HD 3400                                                                                       supported      1   ATI Radeon HD 3400
+ATI Radeon HD 3600                                                                                       supported      3   ATI Radeon HD 3600
+ATI Radeon HD 3800                                                                                       supported      3   ATI Radeon HD 3800
+ATI Radeon HD 4200                                                                                       supported      1   ATI Radeon HD 4200
+ATI Radeon HD 4300                                                                                       supported      1   ATI Radeon HD 4300
+ATI Radeon HD 4500                                                                                       supported      3   ATI Radeon HD 4500
+ATI Radeon HD 4600                                                                                       supported      3   ATI Radeon HD 4600
+ATI Radeon HD 4700                                                                                       supported      3   ATI Radeon HD 4700
+ATI Radeon HD 4800                                                                                       supported      3   ATI Radeon HD 4800
+ATI Radeon HD 5400                                                                                       supported      3   ATI Radeon HD 5400
+ATI Radeon HD 5500                                                                                       supported      3   ATI Radeon HD 5500
+ATI Radeon HD 5600                                                                                       supported      3   ATI Radeon HD 5600
+ATI Radeon HD 5700                                                                                       supported      3   ATI Radeon HD 5700
+ATI Radeon HD 5800                                                                                       supported      3   ATI Radeon HD 5800
+ATI Radeon HD 5900                                                                                       supported      3   ATI Radeon HD 5900
+ATI Radeon HD 6200                                                                                       supported      2   ATI Radeon HD 6200
+ATI Radeon HD 6300                                                                                       supported      2   ATI Radeon HD 6300
+ATI Radeon HD 6500                                                                                       supported      3   ATI Radeon HD 6500
+ATI Radeon HD 6800                                                                                       supported      3   ATI Radeon HD 6800
+ATI Radeon HD 6900                                                                                       supported      3   ATI Radeon HD 6900
+ATI Radeon OpenGL                                                                                        supported      0   ATI Radeon
+ATI Radeon RV250                                                                                         supported      0   ATI Radeon RV250
+ATI Radeon RV600                                                                                         supported      1   ATI Radeon RV600
+ATI Radeon RX9550                                                                                        supported      1   ATI Radeon RX9550
+ATI Radeon VE                                                                                            unsupported    0   ATI Radeon VE
+ATI Radeon X1000                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1200                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1300                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X13xx                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1400                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1500                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1600                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X16xx                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1700                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1800                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1900                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X19xx                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X1xxx                                                                                         supported      0   ATI Radeon X1xxx
+ATI Radeon X300                                                                                          supported      0   ATI Radeon X300
+ATI Radeon X500                                                                                          supported      0   ATI Radeon X500
+ATI Radeon X600                                                                                          supported      1   ATI Radeon X600
+ATI Radeon X700                                                                                          supported      1   ATI Radeon X700
+ATI Radeon X7xx                                                                                          supported      1   ATI Radeon X700
+ATI Radeon X800                                                                                          supported      2   ATI Radeon X800
+ATI Radeon Xpress                                                                                        supported      0   ATI Radeon Xpress
+ATI Rage 128                                                                                             supported      0   ATI Rage 128
+ATI Technologies Inc.                                                                                    supported      0   ATI Technologies
+ATI Technologies Inc.  x86                                                                               supported      0   ATI Technologies
+ATI Technologies Inc.  x86/SSE2                                                                          supported      0   ATI Technologies
+ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730                                                supported      3   ATI Mobility Radeon HD 5700
+ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2                                                 supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. AMD 760G                                                                           supported      1   ATI 760G/Radeon 3000
+ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1)                                                      supported      1   ATI 760G/Radeon 3000
+ATI Technologies Inc. AMD 780L                                                                           supported      1   ATI 780L/Radeon 3000
+ATI Technologies Inc. AMD FirePro 2270                                                                   supported      1   ATI FirePro 2000
+ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100                                            supported      0   ATI Mobility Radeon 4100
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200                                         supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250                                         supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD RADEON HD 6450                                                                 supported      3   ATI Radeon HD 6400
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics                                                 supported      2   ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics                                                        supported      2   ATI Radeon HD 6200
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics                                                 supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6300M Series                                                         supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics                                                        supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6310M                                                                supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6330M                                                                supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6350                                                                 supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6370M                                                                supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. AMD Radeon HD 6400M Series                                                         supported      3   ATI Radeon HD 6400
+ATI Technologies Inc. AMD Radeon HD 6450                                                                 supported      3   ATI Radeon HD 6400
+ATI Technologies Inc. AMD Radeon HD 6470M                                                                supported      3   ATI Radeon HD 6400
+ATI Technologies Inc. AMD Radeon HD 6490M                                                                supported      3   ATI Radeon HD 6400
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series                                               supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6530M                                                                supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6550M                                                                supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6570                                                                 supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6570M                                                                supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series                                                    supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. AMD Radeon HD 6600M Series                                                         supported      3   ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6650M                                                                supported      3   ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6670                                                                 supported      3   ATI Radeon HD 66xx
+ATI Technologies Inc. AMD Radeon HD 6700 Series                                                          supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6750                                                                 supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6750M                                                                supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6770                                                                 supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. AMD Radeon HD 6800 Series                                                          supported      3   ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6850M                                                                supported      3   ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6870                                                                 supported      3   ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6870M                                                                supported      3   ATI Radeon HD 6800
+ATI Technologies Inc. AMD Radeon HD 6900 Series                                                          supported      3   ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon HD 6970M                                                                supported      3   ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon HD 6990                                                                 supported      3   ATI Radeon HD 6900
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M                                                            supported      0   ATI Technologies
+ATI Technologies Inc. ASUS 5870 Eyefinity 6                                                              supported      0   ATI Technologies
+ATI Technologies Inc. ASUS AH2600 Series                                                                 supported      3   ATI ASUS AH26xx
+ATI Technologies Inc. ASUS AH3450 Series                                                                 supported      1   ATI ASUS AH34xx
+ATI Technologies Inc. ASUS AH3650 Series                                                                 supported      3   ATI ASUS AH36xx
+ATI Technologies Inc. ASUS AH4650 Series                                                                 supported      3   ATI ASUS AH46xx
+ATI Technologies Inc. ASUS ARES                                                                          supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH2900 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH3450 Series                                                                supported      1   ATI ASUS AH34xx
+ATI Technologies Inc. ASUS EAH3650 Series                                                                supported      3   ATI ASUS AH36xx
+ATI Technologies Inc. ASUS EAH4350 series                                                                supported      1   ATI ASUS EAH43xx
+ATI Technologies Inc. ASUS EAH4550 series                                                                supported      1   ATI ASUS EAH45xx
+ATI Technologies Inc. ASUS EAH4650 series                                                                supported      3   ATI ASUS AH46xx
+ATI Technologies Inc. ASUS EAH4670 series                                                                supported      3   ATI ASUS AH46xx
+ATI Technologies Inc. ASUS EAH4750 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH4770 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH4770 series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH4850 series                                                                supported      3   ATI ASUS EAH48xx
+ATI Technologies Inc. ASUS EAH5450 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH5550 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH5570 series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH5670 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH5750 Series                                                                supported      3   ATI ASUS EAH57xx
+ATI Technologies Inc. ASUS EAH5770 Series                                                                supported      3   ATI ASUS EAH57xx
+ATI Technologies Inc. ASUS EAH5830 Series                                                                supported      3   ATI ASUS EAH58xx
+ATI Technologies Inc. ASUS EAH5850 Series                                                                supported      3   ATI ASUS EAH58xx
+ATI Technologies Inc. ASUS EAH5870 Series                                                                supported      3   ATI ASUS EAH58xx
+ATI Technologies Inc. ASUS EAH5970 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH6850 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH6870 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH6950 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAH6970 Series                                                                supported      0   ATI Technologies
+ATI Technologies Inc. ASUS EAHG4670 series                                                               supported      0   ATI Technologies
+ATI Technologies Inc. ASUS Extreme AX600 Series                                                          supported      0   ATI Technologies
+ATI Technologies Inc. ASUS Extreme AX600XT-TD                                                            supported      0   ATI Technologies
+ATI Technologies Inc. ASUS X1300 Series x86/SSE2                                                         supported      3   ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X1550 Series                                                                  supported      3   ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X1950 Series x86/SSE2                                                         supported      3   ATI ASUS Radeon X1xxx
+ATI Technologies Inc. ASUS X800 Series                                                                   supported      0   ATI Technologies
+ATI Technologies Inc. ASUS X850 Series                                                                   supported      0   ATI Technologies
+ATI Technologies Inc. ATI All-in-Wonder HD                                                               supported      1   ATI All-in-Wonder HD
+ATI Technologies Inc. ATI FirePro 2260                                                                   supported      1   ATI FirePro 2000
+ATI Technologies Inc. ATI FirePro 2450                                                                   supported      1   ATI FirePro 2000
+ATI Technologies Inc. ATI FirePro M5800                                                                  supported      3   ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M7740                                                                  supported      3   ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7820                                                                  supported      3   ATI FirePro M7820
+ATI Technologies Inc. ATI FirePro V3700 (FireGL)                                                         supported      0   ATI FireGL
+ATI Technologies Inc. ATI FirePro V3800                                                                  supported      1   ATI FirePro 3000
+ATI Technologies Inc. ATI FirePro V4800                                                                  supported      2   ATI FirePro 4000
+ATI Technologies Inc. ATI FirePro V4800 (FireGL)                                                         supported      0   ATI FireGL
+ATI Technologies Inc. ATI FirePro V5800                                                                  supported      3   ATI FirePro 5000
+ATI Technologies Inc. ATI FirePro V7800                                                                  supported      3   ATI FirePro 7000
+ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2                                                  supported      0   ATI Mobility Radeon Xxxx
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3450                                                        supported      2   ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI MOBILITY RADEON X1600                                                          supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300                                                          supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2                                              supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2                                      supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2                                                 supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI MOBILITY RADEON X300                                                           supported      1   ATI Mobility Radeon X3xx
+ATI Technologies Inc. ATI MOBILITY RADEON X600                                                           supported      1   ATI Mobility Radeon X6xx
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200                                                     supported      0   ATI Mobility Radeon Xxxx
+ATI Technologies Inc. ATI Mobility FireGL V5700                                                          supported      1   ATI FireGL 5xxx
+ATI Technologies Inc. ATI Mobility Radeon 4100                                                           supported      0   ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon Graphics                                                       supported      0   ATI Mobility Radeon
+ATI Technologies Inc. ATI Mobility Radeon HD 2300                                                        supported      1   ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2400                                                        supported      1   ATI Mobility Radeon HD 2400
+ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT                                                     supported      1   ATI Mobility Radeon HD 2400
+ATI Technologies Inc. ATI Mobility Radeon HD 2600                                                        supported      3   ATI Mobility Radeon HD 2600
+ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT                                                     supported      3   ATI Mobility Radeon HD 2600
+ATI Technologies Inc. ATI Mobility Radeon HD 2700                                                        supported      3   ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series                                                 supported      2   ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3430                                                        supported      2   ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3450                                                        supported      2   ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3470                                                        supported      2   ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2                                              supported      2   ATI Mobility Radeon HD 3400
+ATI Technologies Inc. ATI Mobility Radeon HD 3650                                                        supported      3   ATI Mobility Radeon HD 3600
+ATI Technologies Inc. ATI Mobility Radeon HD 4200                                                        supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series                                                 supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4225                                                        supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series                                                 supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4250                                                        supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics                                               supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4270                                                        supported      2   ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series                                                 supported      2   ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series                                            supported      2   ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4330                                                        supported      2   ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series                                                 supported      2   ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4350                                                        supported      2   ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series                                                 supported      2   ATI Mobility Radeon HD 4300
+ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series                                                 supported      3   ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series                                            supported      3   ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4530                                                        supported      3   ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series                                                 supported      3   ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4550                                                        supported      3   ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4570                                                        supported      3   ATI Mobility Radeon HD 4500
+ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series                                                 supported      3   ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4650                                                        supported      3   ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series                                                 supported      3   ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4670                                                        supported      3   ATI Mobility Radeon HD 4600
+ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series                                                 supported      3   ATI Mobility Radeon HD 4800
+ATI Technologies Inc. ATI Mobility Radeon HD 4850                                                        supported      3   ATI Mobility Radeon HD 4800
+ATI Technologies Inc. ATI Mobility Radeon HD 4870                                                        supported      3   ATI Mobility Radeon HD 4800
+ATI Technologies Inc. ATI Mobility Radeon HD 5000                                                        supported      0   ATI Mobility Radeon
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series                                                 supported      0   ATI Mobility Radeon
+ATI Technologies Inc. ATI Mobility Radeon HD 5145                                                        supported      2   ATI Mobility Radeon HD 5100
+ATI Technologies Inc. ATI Mobility Radeon HD 5165                                                        supported      2   ATI Mobility Radeon HD 5100
+ATI Technologies Inc. ATI Mobility Radeon HD 530v                                                        supported      1   ATI Mobility Radeon HD 530v
+ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series                                                 supported      2   ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 540v                                                        supported      2   ATI Mobility Radeon HD 540v
+ATI Technologies Inc. ATI Mobility Radeon HD 5430                                                        supported      2   ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5450                                                        supported      2   ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series                                                 supported      2   ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 545v                                                        supported      2   ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 5470                                                        supported      2   ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI Mobility Radeon HD 550v                                                        supported      2   ATI Mobility Radeon HD 550v
+ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series                                            supported      2   ATI Mobility Radeon HD 5600
+ATI Technologies Inc. ATI Mobility Radeon HD 560v                                                        supported      2   ATI Mobility Radeon HD 560v
+ATI Technologies Inc. ATI Mobility Radeon HD 5650                                                        supported      2   ATI Mobility Radeon HD 5600
+ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series                                                 supported      3   ATI Mobility Radeon HD 5700
+ATI Technologies Inc. ATI Mobility Radeon HD 5730                                                        supported      3   ATI Mobility Radeon HD 5700
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series                                                 supported      0   ATI Mobility Radeon
+ATI Technologies Inc. ATI Mobility Radeon HD 5850                                                        supported      0   ATI Mobility Radeon
+ATI Technologies Inc. ATI Mobility Radeon HD 5870                                                        supported      0   ATI Mobility Radeon
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series                                                 supported      2   ATI Mobility Radeon HD 6300
+ATI Technologies Inc. ATI Mobility Radeon HD 6370                                                        supported      2   ATI Mobility Radeon HD 6300
+ATI Technologies Inc. ATI Mobility Radeon HD 6470M                                                       supported      3   ATI Mobility Radeon HD 6400M
+ATI Technologies Inc. ATI Mobility Radeon HD 6550                                                        supported      3   ATI Mobility Radeon HD 6500M
+ATI Technologies Inc. ATI Mobility Radeon HD 6570                                                        supported      3   ATI Mobility Radeon HD 6500M
+ATI Technologies Inc. ATI Mobility Radeon X1300                                                          supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2                                      supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2                                                 supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1350                                                          supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2                                                 supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1400                                                          supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2                                                 supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1600                                                          supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2                                                 supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2                                                 supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300                                                          supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442)                                          supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86                                                      supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2                                      supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2                                                 supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2500                                                          supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2                                                 supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. ATI Mobility Radeon. HD 530v                                                       supported      1   ATI Mobility Radeon HD 530v
+ATI Technologies Inc. ATI Mobility Radeon. HD 5470                                                       supported      2   ATI Mobility Radeon HD 5400
+ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO                                                 supported      0   ATI Radeon HD 3200
+ATI Technologies Inc. ATI RADEON XPRESS 1100                                                             supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series                                                       supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2                                              supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES                                                      supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon                                                                         supported      0   ATI Technologies
+ATI Technologies Inc. ATI Radeon 2100                                                                    supported      0   ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM)                                                 supported      0   ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 Graphics                                                           supported      0   ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 3000                                                                    supported      0   ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3000 Graphics                                                           supported      0   ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3100 Graphics                                                           supported      1   ATI Radeon 3100
+ATI Technologies Inc. ATI Radeon 5xxx series                                                             supported      3   ATI Radeon 5xxx
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series                                                     supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE                                  supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM)                                   supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon 9600 / X1050 Series                                                     supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series                                                  supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine                                              supported      0   ATI Technologies
+ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine                                              supported      0   ATI Technologies
+ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine                                       supported      2   AMD CEDAR (HD 5450)
+ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine                                     supported      3   AMD CYPRESS (HD 5800)
+ATI Technologies Inc. ATI Radeon Graphics Processor                                                      supported      0   ATI Technologies
+ATI Technologies Inc. ATI Radeon HD 2200 Graphics                                                        supported      0   ATI Technologies
+ATI Technologies Inc. ATI Radeon HD 2350                                                                 supported      0   ATI Radeon HD 2300
+ATI Technologies Inc. ATI Radeon HD 2400                                                                 supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine                                                   supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 PRO                                                             supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP                                                         supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 Pro                                                             supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 Series                                                          supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 XT                                                              supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine                                                supported      1   ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine                                                   supported      2   ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 PRO                                                             supported      2   ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine                                               supported      2   ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 Pro                                                             supported      2   ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 Series                                                          supported      2   ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2600 XT                                                              supported      2   ATI Radeon HD 2600
+ATI Technologies Inc. ATI Radeon HD 2900 GT                                                              supported      3   ATI Radeon HD 2900
+ATI Technologies Inc. ATI Radeon HD 2900 XT                                                              supported      3   ATI Radeon HD 2900
+ATI Technologies Inc. ATI Radeon HD 3200 Graphics                                                        supported      0   ATI Radeon HD 3200
+ATI Technologies Inc. ATI Radeon HD 3300 Graphics                                                        supported      1   ATI Radeon HD 3300
+ATI Technologies Inc. ATI Radeon HD 3400 Series                                                          supported      1   ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3450                                                                 supported      1   ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex                                                 supported      1   ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3470                                                                 supported      1   ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex                                                 supported      1   ATI Radeon HD 3400
+ATI Technologies Inc. ATI Radeon HD 3550                                                                 supported      1   ATI Radeon HD 3500
+ATI Technologies Inc. ATI Radeon HD 3600 Series                                                          supported      3   ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3650                                                                 supported      3   ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3650 AGP                                                             supported      3   ATI Radeon HD 3600
+ATI Technologies Inc. ATI Radeon HD 3730                                                                 supported      3   ATI Radeon HD 3700
+ATI Technologies Inc. ATI Radeon HD 3800 Series                                                          supported      3   ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3850                                                                 supported      3   ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3850 AGP                                                             supported      3   ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3870                                                                 supported      3   ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 3870 X2                                                              supported      3   ATI Radeon HD 3800
+ATI Technologies Inc. ATI Radeon HD 4200                                                                 supported      1   ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250                                                                 supported      1   ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250 Graphics                                                        supported      1   ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4270                                                                 supported      1   ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4290                                                                 supported      1   ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4300 Series                                                          supported      1   ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4300/4500 Series                                                     supported      1   ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4350                                                                 supported      1   ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1)                                            supported      1   ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD 4450                                                                 supported      1   ATI Radeon HD 4400
+ATI Technologies Inc. ATI Radeon HD 4500 Series                                                          supported      3   ATI Radeon HD 4500
+ATI Technologies Inc. ATI Radeon HD 4550                                                                 supported      3   ATI Radeon HD 4500
+ATI Technologies Inc. ATI Radeon HD 4600 Series                                                          supported      3   ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4650                                                                 supported      3   ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4670                                                                 supported      3   ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine                                                   supported      3   ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon HD 4700 Series                                                          supported      3   ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4720                                                                 supported      3   ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4730                                                                 supported      3   ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4730 Series                                                          supported      3   ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4750                                                                 supported      3   ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4770                                                                 supported      3   ATI Radeon HD 4700
+ATI Technologies Inc. ATI Radeon HD 4800 Series                                                          supported      3   ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850                                                                 supported      3   ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine                                                   supported      3   ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4850 Series                                                          supported      3   ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870                                                                 supported      3   ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine                                                   supported      3   ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 4870 X2                                                              supported      3   ATI Radeon HD 4800
+ATI Technologies Inc. ATI Radeon HD 5400 Series                                                          supported      3   ATI Radeon HD 5400
+ATI Technologies Inc. ATI Radeon HD 5450                                                                 supported      3   ATI Radeon HD 5400
+ATI Technologies Inc. ATI Radeon HD 5500 Series                                                          supported      3   ATI Radeon HD 5500
+ATI Technologies Inc. ATI Radeon HD 5570                                                                 supported      3   ATI Radeon HD 5500
+ATI Technologies Inc. ATI Radeon HD 5600 Series                                                          supported      3   ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5630                                                                 supported      3   ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5670                                                                 supported      3   ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine                                                   supported      3   ATI Radeon HD 5600
+ATI Technologies Inc. ATI Radeon HD 5700 Series                                                          supported      3   ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5750                                                                 supported      3   ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine                                                   supported      3   ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5770                                                                 supported      3   ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine                                                   supported      3   ATI Radeon HD 5700
+ATI Technologies Inc. ATI Radeon HD 5800 Series                                                          supported      3   ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5850                                                                 supported      3   ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5870                                                                 supported      3   ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine                                                   supported      3   ATI Radeon HD 5800
+ATI Technologies Inc. ATI Radeon HD 5900 Series                                                          supported      3   ATI Radeon HD 5900
+ATI Technologies Inc. ATI Radeon HD 5970                                                                 supported      3   ATI Radeon HD 5900
+ATI Technologies Inc. ATI Radeon HD 6230                                                                 supported      2   ATI Radeon HD 6200
+ATI Technologies Inc. ATI Radeon HD 6250                                                                 supported      2   ATI Radeon HD 6200
+ATI Technologies Inc. ATI Radeon HD 6350                                                                 supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. ATI Radeon HD 6390                                                                 supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine                                                  supported      3   ATI Radeon HD 6400
+ATI Technologies Inc. ATI Radeon HD 6510                                                                 supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. ATI Radeon HD 6570M                                                                supported      3   ATI Radeon HD 6500
+ATI Technologies Inc. ATI Radeon HD 6750                                                                 supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine                                                  supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6770                                                                 supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine                                                  supported      3   ATI Radeon HD 6700
+ATI Technologies Inc. ATI Radeon HD 6800 Series                                                          supported      3   ATI Radeon HD 6800
+ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine                                                  supported      3   ATI Radeon HD 6900
+ATI Technologies Inc. ATI Radeon HD3750                                                                  supported      3   ATI Radeon HD 3700
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series                                                    supported      1   ATI Radeon HD 4300
+ATI Technologies Inc. ATI Radeon HD4670                                                                  supported      3   ATI Radeon HD 4600
+ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine                                      supported      3   AMD JUNIPER (HD 5700)
+ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine                                           supported      1   AMD RV710 (HD 4300)
+ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine                                           supported      3   AMD RV730 (HD 4600)
+ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine                                           supported      3   AMD RV770 (HD 4800)
+ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine                                           supported      3   AMD RV790 (HD 4800)
+ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine                                     supported      3   AMD REDWOOD (HD 5500/5600)
+ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine                                      supported      3   AMD REDWOOD (HD 5500/5600)
+ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine                                 supported      0   ATI Technologies
+ATI Technologies Inc. ATI Radeon X1050                                                                   supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1050 Series                                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200                                                                   supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 Series                                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2                                        supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1250                                                                   supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2                                               supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1270                                                                   supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2                                               supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1300/X1550 Series                                                      supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1550 Series                                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine                                                     supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine                                                     supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X1950 GT                                                                supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series                                                  supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. ATI Radeon Xpress 1100                                                             supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1150                                                             supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200                                                             supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series                                                      supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2                                  supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1250                                                             supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2                                                    supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Radeon Xpress Series                                                           supported      0   ATI Radeon Xpress
+ATI Technologies Inc. ATI Yamaha HD 9000                                                                 supported      0   ATI Technologies
+ATI Technologies Inc. ATi RS880M                                                                         supported      1   ATI RS880M
+ATI Technologies Inc. Carte graphique VGA standard                                                       supported      0   ATI Technologies
+ATI Technologies Inc. Diamond Radeon X1550 Series                                                        supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. EG JUNIPER                                                                         supported      3   AMD JUNIPER (HD 5700)
+ATI Technologies Inc. EG PARK                                                                            supported      3   AMD PARK
+ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2)                                                      supported      0   ATI FireGL
+ATI Technologies Inc. FireMV 2400 PCI DDR x86                                                            supported      0   ATI FireMV
+ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2                                                       supported      0   ATI FireMV
+ATI Technologies Inc. GeCube Radeon X1550                                                                supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Geforce 9500 GT                                                                    supported      2   ATI Geforce 9500 GT
+ATI Technologies Inc. Geforce 9500GT                                                                     supported      2   ATI Geforce 9500 GT
+ATI Technologies Inc. Geforce 9800 GT                                                                    supported      2   ATI Geforce 9800 GT
+ATI Technologies Inc. HD3730                                                                             supported      0   ATI Technologies
+ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series                                            supported      0   ATI Radeon 9500
+ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO                                                        supported      0   ATI Technologies
+ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2                                                            supported      0   ATI Technologies
+ATI Technologies Inc. M76M                                                                               supported      3   ATI M76
+ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2                                                  supported      0   ATI Mobility Radeon
+ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2                                                  supported      0   ATI Mobility Radeon
+ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2                               supported      0   ATI Mobility Radeon
+ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2                                                      supported      0   ATI Mobility Radeon 9600
+ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2                                                      supported      1   ATI Mobility Radeon 9700
+ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2                                                      supported      1   ATI Mobility Radeon X3xx
+ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2                                                      supported      1   ATI Mobility Radeon X6xx
+ATI Technologies Inc. MOBILITY RADEON X700 SE x86                                                        supported      1   ATI Mobility Radeon X7xx
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2                                                      supported      1   ATI Mobility Radeon X7xx
+ATI Technologies Inc. MSI RX9550SE                                                                       supported      1   ATI Radeon RX9550
+ATI Technologies Inc. Mobility Radeon X2300 HD                                                           supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2                                                  supported      0   ATI Mobility Radeon X2xxx
+ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE                                                 supported      0   ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 7000 DDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2                                                supported      0   ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 7500 DDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx
+ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2                                                       supported      0   ATI Radeon 9100
+ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE                                                 supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 DDR x86/SSE2                                                           supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE                                             supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE                                          supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE                                                     supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2                                                    supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2                                              supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2                                                         supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE                                     supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2                                    supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2                                               supported      0   ATI Radeon 9200
+ATI Technologies Inc. RADEON 9500                                                                        supported      0   ATI Radeon 9500
+ATI Technologies Inc. RADEON 9550 x86/SSE2                                                               supported      0   ATI Radeon 9500
+ATI Technologies Inc. RADEON 9600 SERIES                                                                 supported      0   ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2                                             supported      0   ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 TX x86/SSE2                                                            supported      0   ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2                                                    supported      0   ATI Radeon 9600
+ATI Technologies Inc. RADEON 9600 x86/SSE2                                                               supported      0   ATI Radeon 9600
+ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE                                                 supported      1   ATI Radeon 9700
+ATI Technologies Inc. RADEON 9800 PRO                                                                    supported      1   ATI Radeon 9800
+ATI Technologies Inc. RADEON 9800 x86/SSE2                                                               supported      1   ATI Radeon 9800
+ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2                                                       unsupported    0   ATI IGP 340M
+ATI Technologies Inc. RADEON X300 Series x86/SSE2                                                        supported      0   ATI Radeon X300
+ATI Technologies Inc. RADEON X300 x86/SSE2                                                               supported      0   ATI Radeon X300
+ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2                                                   supported      0   ATI Radeon X300
+ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2                                                    supported      0   ATI Radeon X500
+ATI Technologies Inc. RADEON X550 x86/SSE2                                                               supported      0   ATI Radeon X500
+ATI Technologies Inc. RADEON X600 Series                                                                 supported      1   ATI Radeon X600
+ATI Technologies Inc. RADEON X600 x86/SSE2                                                               supported      1   ATI Radeon X600
+ATI Technologies Inc. RADEON X700 PRO x86/SSE2                                                           supported      1   ATI Radeon X700
+ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2                                                 supported      2   ATI Radeon X800
+ATI Technologies Inc. RADEON X800GT                                                                      supported      2   ATI Radeon X800
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2                                supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2                                           supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2                                                  supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2                               supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2                                          supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2                                      supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2                                                 supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2                                           supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RADEON XPRESS Series x86/SSE2                                                      supported      0   ATI Radeon Xpress
+ATI Technologies Inc. RS740                                                                              supported      0   ATI Technologies
+ATI Technologies Inc. RS780C                                                                             supported      0   AMD RS780 (HD 3200)
+ATI Technologies Inc. RS780M                                                                             supported      0   AMD RS780 (HD 3200)
+ATI Technologies Inc. RS880                                                                              supported      1   AMD RS880 (HD 4200)
+ATI Technologies Inc. RV410 Pro x86/SSE2                                                                 supported      1   ATI RV410 (X700)
+ATI Technologies Inc. RV790                                                                              supported      3   AMD RV790 (HD 4800)
+ATI Technologies Inc. Radeon (TM) HD 6470M                                                               supported      0   ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6490M                                                               supported      0   ATI Technologies
+ATI Technologies Inc. Radeon (TM) HD 6770M                                                               supported      0   ATI Technologies
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx
+ATI Technologies Inc. Radeon 7000 SDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx
+ATI Technologies Inc. Radeon 7500 DDR x86/SSE2                                                           supported      0   ATI Radeon 7xxx
+ATI Technologies Inc. Radeon 9000 DDR x86/SSE2                                                           supported      0   ATI Radeon 9000
+ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2                                                     supported      0   ATI Radeon DDR
+ATI Technologies Inc. Radeon DDR x86/SSE                                                                 supported      0   ATI Radeon DDR
+ATI Technologies Inc. Radeon DDR x86/SSE2                                                                supported      0   ATI Radeon DDR
+ATI Technologies Inc. Radeon HD 6310                                                                     supported      2   ATI Radeon HD 6300
+ATI Technologies Inc. Radeon HD 6800 Series                                                              supported      3   ATI Radeon HD 6800
+ATI Technologies Inc. Radeon SDR x86/SSE2                                                                supported      0   ATI Technologies
+ATI Technologies Inc. Radeon X1300 Series                                                                supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1300 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1300/X1550 Series                                                          supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2                                                 supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM)                                             supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1550 Series                                                                supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1550 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1600                                                                       supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2                                     supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1600 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1600/X1650 Series                                                          supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1650 Series                                                                supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1650 Series x86/SSE2                                                       supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1950 Pro                                                                   supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2                                               supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1950 Series                                                                supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X1950 Series  (Microsoft - WDDM)                                            supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X300/X550/X1050 Series                                                      supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Radeon X550/X700 Series                                                            supported      0   ATI Radeon X500
+ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2                                                 supported      0   ATI Radeon X500
+ATI Technologies Inc. SAPPHIRE RADEON X300SE                                                             supported      0   ATI Radeon X300
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2                                         supported      0   ATI Radeon X300
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2                                                    supported      0   ATI Radeon X300
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series                                                       supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2                                   supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. Sapphire Radeon HD 3730                                                            supported      3   ATI Radeon HD 3700
+ATI Technologies Inc. Sapphire Radeon HD 3750                                                            supported      3   ATI Radeon HD 3700
+ATI Technologies Inc. Standard VGA Graphics Adapter                                                      supported      0   ATI Technologies
+ATI Technologies Inc. Tul, RADEON  X600 PRO                                                              supported      0   ATI Technologies
+ATI Technologies Inc. Tul, RADEON  X600 PRO x86/SSE2                                                     supported      0   ATI Technologies
+ATI Technologies Inc. Tul, RADEON  X700 PRO                                                              supported      0   ATI Technologies
+ATI Technologies Inc. Tul, RADEON  X700 PRO x86/MMX/3DNow!/SSE2                                          supported      0   ATI Technologies
+ATI Technologies Inc. VisionTek Radeon 4350                                                              supported      0   ATI Technologies
+ATI Technologies Inc. VisionTek Radeon X1550 Series                                                      supported      0   ATI Radeon X1xxx
+ATI Technologies Inc. WRESTLER 9802                                                                      supported      0   ATI Technologies
+ATI Technologies Inc. WRESTLER 9803                                                                      supported      0   ATI Technologies
+ATI Technologies Inc. XFX Radeon HD 4570                                                                 supported      3   ATI Radeon HD 4500
+ATI Technologies Inc. Yamaha ATI HD 9000da/s                                                             supported      0   ATI Technologies
+ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048                                                        supported      0   ATI Technologies
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      0   AMD RS780 (HD 3200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      1   AMD RS880 (HD 4200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101  TCL                                    supported      1   AMD RS880 (HD 4200)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      1   AMD RV610 (HD 2400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      1   AMD RV610 (HD 2400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      1   AMD RV620 (HD 3400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      1   AMD RV620 (HD 3400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      1   AMD RV620 (HD 3400)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2           supported      3   AMD RV635 (HD 3600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      3   AMD RV670 (HD 3800)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      1   AMD RV710 (HD 4300)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      3   AMD RV730 (HD 4600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      3   AMD RV730 (HD 4600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101  TCL DRI2                               supported      3   AMD RV730 (HD 4600)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2          supported      3   AMD RV770 (HD 4800)
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2                   supported      3   AMD RV770 (HD 4800)
+Alex Mohr GL Hijacker!                                                                                                      UNRECOGNIZED
+Apple Software Renderer                                                                                  unsupported    0   Apple Software Renderer
+DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2                   supported      1   ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2                   supported      1   ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2                            supported      1   ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL                                 unsupported    0   ATI RS600 (Xpress 3200)
+DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2                   supported      1   ATI R300 (9700)
+DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL                     supported      0   ATI RV350 (9600)
+DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL                     supported      0   ATI RV350 (9600)
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2                      supported      0   ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      0   ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      0   ATI RV380
+DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2                      supported      0   ATI RV380
+DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      1   ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2                      supported      1   ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      1   ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      1   ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL                                    supported      1   ATI RV515
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      1   ATI RV515
+DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2                               supported      1   ATI RV530
+GPU_CLASS_UNKNOWN                                                                                                           UNRECOGNIZED
+Humper Chromium                                                                                                             UNRECOGNIZED
+Intel                                                                                                                       UNRECOGNIZED
+Intel  HD Graphics Family                                                                                supported      2   Intel HD Graphics
+Intel 3D-Analyze v2.2 - http://www.tommti-systems.com                                                                       UNRECOGNIZED
+Intel 3D-Analyze v2.3 - http://www.tommti-systems.com                                                                       UNRECOGNIZED
+Intel 4 Series Internal Chipset                                                                                             UNRECOGNIZED
+Intel 830M                                                                                               unsupported    0   Intel 830M
+Intel 845G                                                                                               unsupported    0   Intel 845G
+Intel 855GM                                                                                              unsupported    0   Intel 855GM
+Intel 865G                                                                                               unsupported    0   Intel 865G
+Intel 915G                                                                                               unsupported    0   Intel 915G
+Intel 915GM                                                                                              unsupported    0   Intel 915GM
+Intel 945G                                                                                               supported      0   Intel 945G
+Intel 945GM                                                                                              supported      0   Intel 945GM
+Intel 950                                                                                                supported      0   Intel 950
+Intel 965                                                                                                supported      0   Intel 965
+Intel B43 Express Chipset                                                                                                   UNRECOGNIZED
+Intel Bear Lake                                                                                          unsupported    0   Intel Bear Lake
+Intel Broadwater                                                                                         unsupported    0   Intel Broadwater
+Intel Brookdale                                                                                          unsupported    0   Intel Brookdale
+Intel Cantiga                                                                                            unsupported    0   Intel Cantiga
+Intel Eaglelake                                                                                          supported      0   Intel Eaglelake
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)                                                  UNRECOGNIZED
+Intel G33                                                                                                unsupported    0   Intel G33
+Intel G41                                                                                                supported      0   Intel G41
+Intel G41 Express Chipset                                                                                supported      0   Intel G41
+Intel G45                                                                                                supported      0   Intel G45
+Intel G45/G43 Express Chipset                                                                            supported      0   Intel G45
+Intel Graphics Media Accelerator HD                                                                      supported      0   Intel Graphics Media HD
+Intel HD Graphics                                                                                        supported      2   Intel HD Graphics
+Intel HD Graphics 100                                                                                    supported      2   Intel HD Graphics
+Intel HD Graphics 200                                                                                    supported      2   Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SH                                                                       supported      2   Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SJ                                                                       supported      2   Intel HD Graphics
+Intel HD Graphics 200 BR-1101-00SK                                                                       supported      2   Intel HD Graphics
+Intel HD Graphics 200 BR-1101-01M5                                                                       supported      2   Intel HD Graphics
+Intel HD Graphics 200 BR-1101-01M6                                                                       supported      2   Intel HD Graphics
+Intel HD Graphics BR-1004-01Y1                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1006-0364                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1006-0365                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1006-0366                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1007-02G4                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1101-04SY                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1101-04SZ                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1101-04T0                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics BR-1101-04T9                                                                           supported      2   Intel HD Graphics
+Intel HD Graphics Family                                                                                 supported      2   Intel HD Graphics
+Intel HD Graphics Family BR-1012-00Y8                                                                    supported      2   Intel HD Graphics
+Intel HD Graphics Family BR-1012-00YF                                                                    supported      2   Intel HD Graphics
+Intel HD Graphics Family BR-1012-00ZD                                                                    supported      2   Intel HD Graphics
+Intel HD Graphics Family BR-1102-00ML                                                                    supported      2   Intel HD Graphics
+Intel Inc. Intel GMA 900 OpenGL Engine                                                                                      UNRECOGNIZED
+Intel Inc. Intel GMA 950 OpenGL Engine                                                                   supported      0   Intel 950
+Intel Inc. Intel GMA X3100 OpenGL Engine                                                                 supported      0   Intel X3100
+Intel Inc. Intel HD Graphics 3000 OpenGL Engine                                                          supported      2   Intel HD Graphics
+Intel Inc. Intel HD Graphics OpenGL Engine                                                               supported      2   Intel HD Graphics
+Intel Inc. Intel HD xxxx OpenGL Engine                                                                                      UNRECOGNIZED
+Intel Intel 845G                                                                                         unsupported    0   Intel 845G
+Intel Intel 855GM                                                                                        unsupported    0   Intel 855GM
+Intel Intel 865G                                                                                         unsupported    0   Intel 865G
+Intel Intel 915G                                                                                         unsupported    0   Intel 915G
+Intel Intel 915GM                                                                                        unsupported    0   Intel 915GM
+Intel Intel 945G                                                                                         supported      0   Intel 945G
+Intel Intel 945GM                                                                                        supported      0   Intel 945GM
+Intel Intel 965/963 Graphics Media Accelerator                                                           supported      0   Intel 965
+Intel Intel Bear Lake B                                                                                  unsupported    0   Intel Bear Lake
+Intel Intel Broadwater G                                                                                 unsupported    0   Intel Broadwater
+Intel Intel Brookdale-G                                                                                  unsupported    0   Intel Brookdale
+Intel Intel Calistoga                                                                                                       UNRECOGNIZED
+Intel Intel Cantiga                                                                                      unsupported    0   Intel Cantiga
+Intel Intel Eaglelake                                                                                    supported      0   Intel Eaglelake
+Intel Intel Grantsdale-G                                                                                                    UNRECOGNIZED
+Intel Intel HD Graphics 3000                                                                             supported      2   Intel HD Graphics
+Intel Intel Lakeport                                                                                                        UNRECOGNIZED
+Intel Intel Montara-GM                                                                                   unsupported    0   Intel Montara
+Intel Intel Pineview Platform                                                                            supported      0   Intel Pineview
+Intel Intel Springdale-G                                                                                 unsupported    0   Intel Springdale
+Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1)                                               UNRECOGNIZED
+Intel Mobile 4 Series                                                                                    supported      0   Intel Mobile 4 Series
+Intel Mobile 4 Series Express Chipset Family                                                             supported      0   Intel Mobile 4 Series
+Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)                                                   UNRECOGNIZED
+Intel Mobile HD Graphics                                                                                 supported      2   Intel HD Graphics
+Intel Mobile SandyBridge HD Graphics                                                                     supported      2   Intel HD Graphics
+Intel Montara                                                                                            unsupported    0   Intel Montara
+Intel Pineview                                                                                           supported      0   Intel Pineview
+Intel Q45/Q43 Express Chipset                                                                                               UNRECOGNIZED
+Intel Royal BNA Driver                                                                                                      UNRECOGNIZED
+Intel SandyBridge HD Graphics                                                                            supported      2   Intel HD Graphics
+Intel SandyBridge HD Graphics BR-1006-00V8                                                               supported      2   Intel HD Graphics
+Intel Springdale                                                                                         unsupported    0   Intel Springdale
+Intel X3100                                                                                              supported      0   Intel X3100
+Intergraph wcgdrv 06.05.06.18                                                                                               UNRECOGNIZED
+Intergraph wcgdrv 06.06.00.35                                                                                               UNRECOGNIZED
+LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra...                      UNRECOGNIZED
+LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgr...   supported      3   NVIDIA GT 430M
+Linden Lab Headless                                                                                                         UNRECOGNIZED
+Matrox                                                                                                   unsupported    0   Matrox
+Mesa                                                                                                     unsupported    0   Mesa
+Mesa Project Software Rasterizer                                                                         unsupported    0   Mesa
+NVIDIA /PCI/SSE2                                                                                                            UNRECOGNIZED
+NVIDIA /PCI/SSE2/3DNOW!                                                                                                     UNRECOGNIZED
+NVIDIA 205                                                                                               supported      0   NVIDIA G 205M
+NVIDIA 210                                                                                               supported      1   NVIDIA G 210
+NVIDIA 310                                                                                               supported      2   NVIDIA G 310M
+NVIDIA 310M                                                                                              supported      2   NVIDIA G 310M
+NVIDIA 315                                                                                               supported      2   NVIDIA G 315
+NVIDIA 315M                                                                                              supported      2   NVIDIA G 315
+NVIDIA 320M                                                                                              supported      2   NVIDIA G 320M
+NVIDIA C51                                                                                               supported      0   NVIDIA C51
+NVIDIA D10M2-20/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA D10P1-25/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA D10P1-30/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA D10P2-50/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA D11M2-30/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA D12-P1-35/PCI/SSE2                                                                                                   UNRECOGNIZED
+NVIDIA D12U-15/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA D13M1-40/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA D13P1-40/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA D13U-10/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA D13U/PCI/SSE2                                                                                                        UNRECOGNIZED
+NVIDIA D9M                                                                                               supported      1   NVIDIA D9M
+NVIDIA D9M-20/PCI/SSE2                                                                                   supported      1   NVIDIA D9M
+NVIDIA Entry Graphics/PCI/SSE2                                                                                              UNRECOGNIZED
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW!                                                                                       UNRECOGNIZED
+NVIDIA G 102M                                                                                            supported      0   NVIDIA G102M
+NVIDIA G 103M                                                                                            supported      0   NVIDIA G103M
+NVIDIA G 105M                                                                                            supported      0   NVIDIA G105M
+NVIDIA G 110M                                                                                            supported      0   NVIDIA G 110M
+NVIDIA G100                                                                                              supported      0   NVIDIA G100
+NVIDIA G102M                                                                                             supported      0   NVIDIA G102M
+NVIDIA G103M                                                                                             supported      0   NVIDIA G103M
+NVIDIA G105M                                                                                             supported      0   NVIDIA G105M
+NVIDIA G210                                                                                              supported      1   NVIDIA G 210
+NVIDIA G210M                                                                                             supported      1   NVIDIA G 210
+NVIDIA G70/PCI/SSE2                                                                                                         UNRECOGNIZED
+NVIDIA G72                                                                                               supported      1   NVIDIA G72
+NVIDIA G73                                                                                               supported      1   NVIDIA G73
+NVIDIA G84                                                                                               supported      2   NVIDIA G84
+NVIDIA G86                                                                                               supported      3   NVIDIA G86
+NVIDIA G92                                                                                               supported      3   NVIDIA G92
+NVIDIA G92-200/PCI/SSE2                                                                                  supported      3   NVIDIA G92
+NVIDIA G94                                                                                               supported      3   NVIDIA G94
+NVIDIA G96/PCI/SSE2                                                                                                         UNRECOGNIZED
+NVIDIA G98/PCI/SSE2                                                                                                         UNRECOGNIZED
+NVIDIA GT 120                                                                                            supported      2   NVIDIA GT 120M
+NVIDIA GT 130                                                                                            supported      2   NVIDIA GT 130M
+NVIDIA GT 130M                                                                                           supported      2   NVIDIA GT 130M
+NVIDIA GT 140                                                                                            supported      2   NVIDIA GT 140M
+NVIDIA GT 150                                                                                            supported      2   NVIDIA GT 150M
+NVIDIA GT 160M                                                                                           supported      2   NVIDIA GT 160M
+NVIDIA GT 220                                                                                            supported      2   NVIDIA GT 220M
+NVIDIA GT 220/PCI/SSE2                                                                                   supported      2   NVIDIA GT 220M
+NVIDIA GT 220/PCI/SSE2/3DNOW!                                                                            supported      2   NVIDIA GT 220M
+NVIDIA GT 230                                                                                            supported      2   NVIDIA GT 230M
+NVIDIA GT 230M                                                                                           supported      2   NVIDIA GT 230M
+NVIDIA GT 240                                                                                            supported      2   NVIDIA GT 240M
+NVIDIA GT 240M                                                                                           supported      2   NVIDIA GT 240M
+NVIDIA GT 250M                                                                                           supported      2   NVIDIA GT 250M
+NVIDIA GT 260M                                                                                           supported      2   NVIDIA GT 260M
+NVIDIA GT 320                                                                                            supported      2   NVIDIA GT 320M
+NVIDIA GT 320M                                                                                           supported      2   NVIDIA GT 320M
+NVIDIA GT 330                                                                                            supported      3   NVIDIA GT 330M
+NVIDIA GT 330M                                                                                           supported      3   NVIDIA GT 330M
+NVIDIA GT 340                                                                                            supported      2   NVIDIA GT 340M
+NVIDIA GT 420                                                                                            supported      2   NVIDIA GT 420M
+NVIDIA GT 430                                                                                            supported      3   NVIDIA GT 430M
+NVIDIA GT 440                                                                                            supported      3   NVIDIA GT 440M
+NVIDIA GT 450                                                                                            supported      3   NVIDIA GT 450M
+NVIDIA GT 520                                                                                            supported      3   NVIDIA GT 520M
+NVIDIA GT 540                                                                                            supported      3   NVIDIA GT 540M
+NVIDIA GT 540M                                                                                           supported      3   NVIDIA GT 540M
+NVIDIA GT-120                                                                                            supported      2   NVIDIA GT 120
+NVIDIA GT200/PCI/SSE2                                                                                                       UNRECOGNIZED
+NVIDIA GTS 150                                                                                           supported      2   NVIDIA GT 150M
+NVIDIA GTS 240                                                                                           supported      3   NVIDIA GTS 240
+NVIDIA GTS 250                                                                                           supported      3   NVIDIA GTS 250
+NVIDIA GTS 350M                                                                                          supported      3   NVIDIA GTS 350M
+NVIDIA GTS 360                                                                                           supported      3   NVIDIA GTS 360
+NVIDIA GTS 360M                                                                                          supported      3   NVIDIA GTS 360M
+NVIDIA GTS 450                                                                                           supported      3   NVIDIA GTS 450
+NVIDIA GTX 260                                                                                           supported      3   NVIDIA GTX 260
+NVIDIA GTX 260M                                                                                          supported      3   NVIDIA GTX 260
+NVIDIA GTX 270                                                                                           supported      3   NVIDIA GTX 270
+NVIDIA GTX 280                                                                                           supported      3   NVIDIA GTX 280
+NVIDIA GTX 285                                                                                           supported      3   NVIDIA GTX 285
+NVIDIA GTX 290                                                                                           supported      3   NVIDIA GTX 290
+NVIDIA GTX 460                                                                                           supported      3   NVIDIA GTX 460
+NVIDIA GTX 460M                                                                                          supported      3   NVIDIA GTX 460M
+NVIDIA GTX 465                                                                                           supported      3   NVIDIA GTX 465
+NVIDIA GTX 470                                                                                           supported      3   NVIDIA GTX 470
+NVIDIA GTX 470M                                                                                          supported      3   NVIDIA GTX 470M
+NVIDIA GTX 480                                                                                           supported      3   NVIDIA GTX 480
+NVIDIA GTX 480M                                                                                          supported      3   NVIDIA GTX 480M
+NVIDIA GTX 550 Ti                                                                                        supported      3   NVIDIA GTX 550
+NVIDIA GTX 560                                                                                           supported      3   NVIDIA GTX 560
+NVIDIA GTX 560 Ti                                                                                        supported      3   NVIDIA GTX 560
+NVIDIA GTX 570                                                                                           supported      3   NVIDIA GTX 570
+NVIDIA GTX 580                                                                                           supported      3   NVIDIA GTX 580
+NVIDIA GTX 590                                                                                           supported      3   NVIDIA GTX 590
+NVIDIA GeForce                                                                                                              UNRECOGNIZED
+NVIDIA GeForce 2                                                                                         supported      0   NVIDIA GeForce 2
+NVIDIA GeForce 205/PCI/SSE2                                                                              supported      2   NVIDIA 205
+NVIDIA GeForce 210                                                                                       supported      2   NVIDIA 210
+NVIDIA GeForce 210/PCI/SSE2                                                                              supported      2   NVIDIA 210
+NVIDIA GeForce 210/PCI/SSE2/3DNOW!                                                                       supported      2   NVIDIA 210
+NVIDIA GeForce 3                                                                                         supported      0   NVIDIA GeForce 3
+NVIDIA GeForce 305M/PCI/SSE2                                                                             supported      1   NVIDIA 305M
+NVIDIA GeForce 310/PCI/SSE2                                                                              supported      3   NVIDIA 310
+NVIDIA GeForce 310/PCI/SSE2/3DNOW!                                                                       supported      3   NVIDIA 310
+NVIDIA GeForce 310M/PCI/SSE2                                                                             supported      1   NVIDIA 310M
+NVIDIA GeForce 315/PCI/SSE2                                                                              supported      3   NVIDIA 315
+NVIDIA GeForce 315/PCI/SSE2/3DNOW!                                                                       supported      3   NVIDIA 315
+NVIDIA GeForce 315M/PCI/SSE2                                                                             supported      2   NVIDIA 315M
+NVIDIA GeForce 320M/PCI/SSE2                                                                             supported      2   NVIDIA 320M
+NVIDIA GeForce 4 Go                                                                                      supported      0   NVIDIA GeForce 4
+NVIDIA GeForce 4 MX                                                                                      supported      0   NVIDIA GeForce 4
+NVIDIA GeForce 4 Ti                                                                                      supported      0   NVIDIA GeForce 4
+NVIDIA GeForce 405/PCI/SSE2                                                                              supported      1   NVIDIA G 405
+NVIDIA GeForce 6100                                                                                      supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2                                                                  supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!                                                           supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6150/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6150/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2                                                                supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!                                                         supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!                                                                    supported      0   NVIDIA GeForce 6100
+NVIDIA GeForce 6200                                                                                      supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW!                                                                  supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200 A-LE/AGP/SSE2                                                                        supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW!                                                                 supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200 LE/PCI/SSE2                                                                          supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2                                                              supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW!                                                       supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200/AGP/SSE/3DNOW!                                                                       supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200/AGP/SSE2                                                                             supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200/AGP/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200/PCI/SSE/3DNOW!                                                                       supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!                                                     supported      0   NVIDIA GeForce 6200
+NVIDIA GeForce 6500                                                                                      supported      0   NVIDIA GeForce 6500
+NVIDIA GeForce 6500/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 6500
+NVIDIA GeForce 6600                                                                                      supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW!                                                                    supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE2                                                                          supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW!                                                                    supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600 LE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE/3DNOW!                                                                       supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE2                                                                             supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600/AGP/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600/PCI/SSE2                                                                             supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6600/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 6600
+NVIDIA GeForce 6700                                                                                      supported      2   NVIDIA GeForce 6700
+NVIDIA GeForce 6800                                                                                      supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GT/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 6800 XT/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 6800 XT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 6800/PCI/SSE2                                                                             supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 6800/PCI/SSE2/3DNOW!                                                                      supported      2   NVIDIA GeForce 6800
+NVIDIA GeForce 7000                                                                                      supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7000M                                                                                     supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2                                                              supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW!                                                       supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!                                                 supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2                                                               supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!                                                        supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2                                                        supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2                                                        supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2                                                               supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2                                                               supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!                                              supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2                                                            supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW!                                                     supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW!                                              supported      0   NVIDIA GeForce 7000
+NVIDIA GeForce 7100                                                                                      supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2                                                        supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2                                                        supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2                                                               supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7100 GS/PCI/SSE2                                                                          supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2                                                              supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!                                                       supported      0   NVIDIA GeForce 7100
+NVIDIA GeForce 7300                                                                                      supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/AGP/SSE2                                                                          supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 LE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2                                                                  supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!                                                           supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 SE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7350 LE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7300
+NVIDIA GeForce 7500                                                                                      supported      1   NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 7500
+NVIDIA GeForce 7600                                                                                      supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW!                                                                    supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7650 GS/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7600
+NVIDIA GeForce 7800                                                                                      supported      2   NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GS/AGP/SSE2                                                                          supported      2   NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GTX/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!                                                                  supported      2   NVIDIA GeForce 7800
+NVIDIA GeForce 7900                                                                                      supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GS/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2                                                                      supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GTX/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 7950 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 7900
+NVIDIA GeForce 8100                                                                                      supported      1   NVIDIA GeForce 8100
+NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!                                                        supported      1   NVIDIA GeForce 8100
+NVIDIA GeForce 8200                                                                                      supported      1   NVIDIA GeForce 8200
+NVIDIA GeForce 8200/PCI/SSE2                                                                             supported      1   NVIDIA GeForce 8200
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 8200
+NVIDIA GeForce 8200M                                                                                     supported      1   NVIDIA GeForce 8200M
+NVIDIA GeForce 8200M G/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 8200M
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 8200M
+NVIDIA GeForce 8300                                                                                      supported      1   NVIDIA GeForce 8300
+NVIDIA GeForce 8300 GS/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 8300
+NVIDIA GeForce 8400                                                                                      supported      1   NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW!                                                                    supported      1   NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 8400
+NVIDIA GeForce 8400/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 8400
+NVIDIA GeForce 8400GS/PCI/SSE2                                                                           supported      1   NVIDIA GeForce 8400
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!                                                                    supported      1   NVIDIA GeForce 8400
+NVIDIA GeForce 8400M                                                                                     supported      1   NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GS/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!                                                                  supported      1   NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M GT/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 8400M
+NVIDIA GeForce 8500                                                                                      supported      3   NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2                                                                          supported      3   NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GeForce 8500
+NVIDIA GeForce 8600                                                                                      supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2                                                                          supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GT/PCI/SSE2                                                                          supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GTS/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW!                                                                  supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600GS/PCI/SSE2                                                                           supported      3   NVIDIA GeForce 8600
+NVIDIA GeForce 8600M                                                                                     supported      1   NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW!                                                                  supported      1   NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GT/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 8600M
+NVIDIA GeForce 8700                                                                                      supported      3   NVIDIA GeForce 8700
+NVIDIA GeForce 8700M                                                                                     supported      3   NVIDIA GeForce 8700M
+NVIDIA GeForce 8700M GT/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 8700M
+NVIDIA GeForce 8800                                                                                      supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GS/PCI/SSE2                                                                          supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GT/PCI/SSE2                                                                          supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2                                                                     supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW!                                                              supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW!                                                                  supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GTX/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800 Ultra/PCI/SSE2                                                                       supported      3   NVIDIA GeForce 8800
+NVIDIA GeForce 8800M GTS/PCI/SSE2                                                                        supported      3   NVIDIA GeForce 8800M
+NVIDIA GeForce 8800M GTX/PCI/SSE2                                                                        supported      3   NVIDIA GeForce 8800M
+NVIDIA GeForce 9100                                                                                      supported      0   NVIDIA GeForce 9100
+NVIDIA GeForce 9100/PCI/SSE2                                                                             supported      0   NVIDIA GeForce 9100
+NVIDIA GeForce 9100/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA GeForce 9100
+NVIDIA GeForce 9100M                                                                                     supported      0   NVIDIA GeForce 9100M
+NVIDIA GeForce 9100M G/PCI/SSE2                                                                          supported      0   NVIDIA GeForce 9100M
+NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 9100M
+NVIDIA GeForce 9200                                                                                      supported      1   NVIDIA GeForce 9200
+NVIDIA GeForce 9200/PCI/SSE2                                                                             supported      1   NVIDIA GeForce 9200
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA GeForce 9200
+NVIDIA GeForce 9200M GE/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 9200M
+NVIDIA GeForce 9200M GS/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 9200M
+NVIDIA GeForce 9300                                                                                      supported      1   NVIDIA GeForce 9300
+NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2                                                               supported      1   NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GS/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 9300
+NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 9300
+NVIDIA GeForce 9300 SE/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 9300
+NVIDIA GeForce 9300M                                                                                     supported      1   NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M GS/PCI/SSE2                                                                         supported      1   NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW!                                                                  supported      1   NVIDIA GeForce 9300M
+NVIDIA GeForce 9400                                                                                      supported      1   NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce 9400
+NVIDIA GeForce 9400/PCI/SSE2                                                                             supported      1   NVIDIA GeForce 9400
+NVIDIA GeForce 9400M                                                                                     supported      1   NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M G/PCI/SSE2                                                                          supported      1   NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M/PCI/SSE2                                                                            supported      1   NVIDIA GeForce 9400M
+NVIDIA GeForce 9500                                                                                      supported      2   NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 9500
+NVIDIA GeForce 9500M                                                                                     supported      2   NVIDIA GeForce 9500M
+NVIDIA GeForce 9500M GS/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 9500M
+NVIDIA GeForce 9600                                                                                      supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GS/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO 512/PCI/SSE2                                                                     supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW!                                                                  supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GT/PCI/SSE2                                                                          supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9600M                                                                                     supported      3   NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GS/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GT/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9600M
+NVIDIA GeForce 9650M GT/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 9600
+NVIDIA GeForce 9700M                                                                                     supported      2   NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GT/PCI/SSE2                                                                         supported      2   NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GTS/PCI/SSE2                                                                        supported      2   NVIDIA GeForce 9700M
+NVIDIA GeForce 9800                                                                                      supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2                                                                          supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX+/PCI/SSE2                                                                        supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW!                                                                 supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2                                                               supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GTX/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GX2/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9800
+NVIDIA GeForce 9800M                                                                                     supported      3   NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GS/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GT/PCI/SSE2                                                                         supported      3   NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GTS/PCI/SSE2                                                                        supported      3   NVIDIA GeForce 9800M
+NVIDIA GeForce FX 5100                                                                                   supported      0   NVIDIA GeForce FX 5100
+NVIDIA GeForce FX 5100/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA GeForce FX 5100
+NVIDIA GeForce FX 5200                                                                                   supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/AGP/SSE                                                                           supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/AGP/SSE2                                                                          supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/PCI/SSE2                                                                          supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200LE/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5500                                                                                   supported      0   NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE2                                                                          supported      0   NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/PCI/SSE2                                                                          supported      0   NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5600                                                                                   supported      0   NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2                                                                          supported      0   NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW!                                                                 supported      0   NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5700                                                                                   supported      1   NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700/AGP/SSE/3DNOW!                                                                    supported      1   NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700LE/AGP/SSE                                                                         supported      1   NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW!                                                                  supported      1   NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5800                                                                                   supported      1   NVIDIA GeForce FX 5800
+NVIDIA GeForce FX 5900                                                                                   supported      1   NVIDIA GeForce FX 5900
+NVIDIA GeForce FX 5900/AGP/SSE2                                                                          supported      1   NVIDIA GeForce FX 5900
+NVIDIA GeForce FX 5900XT/AGP/SSE2                                                                        supported      1   NVIDIA GeForce FX 5900
+NVIDIA GeForce FX Go5100                                                                                 supported      0   NVIDIA GeForce FX Go5100
+NVIDIA GeForce FX Go5100/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5100
+NVIDIA GeForce FX Go5200                                                                                 supported      0   NVIDIA GeForce FX Go5200
+NVIDIA GeForce FX Go5200/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5200
+NVIDIA GeForce FX Go5300                                                                                 supported      0   NVIDIA GeForce FX Go5300
+NVIDIA GeForce FX Go5600                                                                                 supported      0   NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5600/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5650/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5700                                                                                 supported      1   NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5xxx/AGP/SSE2                                                                        supported      0   NVIDIA GeForce FX Go5xxx
+NVIDIA GeForce G 103M/PCI/SSE2                                                                           supported      0   NVIDIA G103M
+NVIDIA GeForce G 105M/PCI/SSE2                                                                           supported      0   NVIDIA G105M
+NVIDIA GeForce G 110M/PCI/SSE2                                                                           supported      0   NVIDIA G 110M
+NVIDIA GeForce G100/PCI/SSE2                                                                             supported      0   NVIDIA G100
+NVIDIA GeForce G100/PCI/SSE2/3DNOW!                                                                      supported      0   NVIDIA G100
+NVIDIA GeForce G102M/PCI/SSE2                                                                            supported      0   NVIDIA G102M
+NVIDIA GeForce G105M/PCI/SSE2                                                                            supported      0   NVIDIA G105M
+NVIDIA GeForce G200/PCI/SSE2                                                                             supported      0   NVIDIA G 200
+NVIDIA GeForce G205M/PCI/SSE2                                                                            supported      0   NVIDIA G 205M
+NVIDIA GeForce G210/PCI/SSE2                                                                             supported      1   NVIDIA G 210
+NVIDIA GeForce G210/PCI/SSE2/3DNOW!                                                                      supported      1   NVIDIA G 210
+NVIDIA GeForce G210M/PCI/SSE2                                                                            supported      1   NVIDIA G 210
+NVIDIA GeForce G310M/PCI/SSE2                                                                            supported      2   NVIDIA G 310M
+NVIDIA GeForce GT 120/PCI/SSE2                                                                           supported      2   NVIDIA GT 120M
+NVIDIA GeForce GT 120/PCI/SSE2/3DNOW!                                                                    supported      2   NVIDIA GT 120M
+NVIDIA GeForce GT 120M/PCI/SSE2                                                                          supported      2   NVIDIA GT 120M
+NVIDIA GeForce GT 130M/PCI/SSE2                                                                          supported      2   NVIDIA GT 130M
+NVIDIA GeForce GT 140/PCI/SSE2                                                                           supported      2   NVIDIA GT 140M
+NVIDIA GeForce GT 220/PCI/SSE2                                                                           supported      2   NVIDIA GT 220M
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!                                                                    supported      2   NVIDIA GT 220M
+NVIDIA GeForce GT 220M/PCI/SSE2                                                                          supported      2   NVIDIA GT 220M
+NVIDIA GeForce GT 230/PCI/SSE2                                                                           supported      2   NVIDIA GT 230M
+NVIDIA GeForce GT 230M/PCI/SSE2                                                                          supported      2   NVIDIA GT 230M
+NVIDIA GeForce GT 240                                                                                    supported      2   NVIDIA GT 240M
+NVIDIA GeForce GT 240/PCI/SSE2                                                                           supported      2   NVIDIA GT 240M
+NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!                                                                    supported      2   NVIDIA GT 240M
+NVIDIA GeForce GT 240M/PCI/SSE2                                                                          supported      2   NVIDIA GT 240M
+NVIDIA GeForce GT 320/PCI/SSE2                                                                           supported      2   NVIDIA GT 320M
+NVIDIA GeForce GT 320M/PCI/SSE2                                                                          supported      2   NVIDIA GT 320M
+NVIDIA GeForce GT 325M/PCI/SSE2                                                                          supported      0   NVIDIA GT 325M
+NVIDIA GeForce GT 330/PCI/SSE2                                                                           supported      3   NVIDIA GT 330M
+NVIDIA GeForce GT 330/PCI/SSE2/3DNOW!                                                                    supported      3   NVIDIA GT 330M
+NVIDIA GeForce GT 330M/PCI/SSE2                                                                          supported      3   NVIDIA GT 330M
+NVIDIA GeForce GT 335M/PCI/SSE2                                                                          supported      1   NVIDIA GT 335M
+NVIDIA GeForce GT 340/PCI/SSE2                                                                           supported      2   NVIDIA GT 340M
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW!                                                                    supported      2   NVIDIA GT 340M
+NVIDIA GeForce GT 415M/PCI/SSE2                                                                          supported      2   NVIDIA GT 415M
+NVIDIA GeForce GT 420/PCI/SSE2                                                                           supported      2   NVIDIA GT 420M
+NVIDIA GeForce GT 420M/PCI/SSE2                                                                          supported      2   NVIDIA GT 420M
+NVIDIA GeForce GT 425M/PCI/SSE2                                                                          supported      3   NVIDIA GT 425M
+NVIDIA GeForce GT 430/PCI/SSE2                                                                           supported      3   NVIDIA GT 430M
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW!                                                                    supported      3   NVIDIA GT 430M
+NVIDIA GeForce GT 435M/PCI/SSE2                                                                          supported      3   NVIDIA GT 435M
+NVIDIA GeForce GT 440/PCI/SSE2                                                                           supported      3   NVIDIA GT 440M
+NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!                                                                    supported      3   NVIDIA GT 440M
+NVIDIA GeForce GT 445M/PCI/SSE2                                                                          supported      3   NVIDIA GT 445M
+NVIDIA GeForce GT 520M/PCI/SSE2                                                                          supported      3   NVIDIA GT 520M
+NVIDIA GeForce GT 525M/PCI/SSE2                                                                          supported      3   NVIDIA GT 525M
+NVIDIA GeForce GT 540M/PCI/SSE2                                                                          supported      3   NVIDIA GT 540M
+NVIDIA GeForce GT 550M/PCI/SSE2                                                                          supported      3   NVIDIA GT 550M
+NVIDIA GeForce GT 555M/PCI/SSE2                                                                          supported      3   NVIDIA GT 555M
+NVIDIA GeForce GTS 150/PCI/SSE2                                                                          supported      2   NVIDIA GT 150M
+NVIDIA GeForce GTS 160M/PCI/SSE2                                                                         supported      2   NVIDIA GTS 160M
+NVIDIA GeForce GTS 240/PCI/SSE2                                                                          supported      3   NVIDIA GTS 240
+NVIDIA GeForce GTS 250/PCI/SSE2                                                                          supported      3   NVIDIA GTS 250
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTS 250
+NVIDIA GeForce GTS 250M/PCI/SSE2                                                                         supported      3   NVIDIA GTS 250
+NVIDIA GeForce GTS 350M/PCI/SSE2                                                                         supported      3   NVIDIA GTS 350M
+NVIDIA GeForce GTS 360M/PCI/SSE2                                                                         supported      3   NVIDIA GTS 360M
+NVIDIA GeForce GTS 450/PCI/SSE2                                                                          supported      3   NVIDIA GTS 450
+NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTS 450
+NVIDIA GeForce GTS 455/PCI/SSE2                                                                          supported      3   NVIDIA GTS 450
+NVIDIA GeForce GTX 260/PCI/SSE2                                                                          supported      3   NVIDIA GTX 260
+NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 260
+NVIDIA GeForce GTX 260M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 260
+NVIDIA GeForce GTX 275/PCI/SSE2                                                                          supported      3   NVIDIA GTX 275
+NVIDIA GeForce GTX 280                                                                                   supported      3   NVIDIA GTX 280
+NVIDIA GeForce GTX 280/PCI/SSE2                                                                          supported      3   NVIDIA GTX 280
+NVIDIA GeForce GTX 280M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 280
+NVIDIA GeForce GTX 285/PCI/SSE2                                                                          supported      3   NVIDIA GTX 285
+NVIDIA GeForce GTX 295/PCI/SSE2                                                                          supported      3   NVIDIA GTX 295
+NVIDIA GeForce GTX 460 SE/PCI/SSE2                                                                       supported      3   NVIDIA GTX 460
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!                                                                supported      3   NVIDIA GTX 460
+NVIDIA GeForce GTX 460/PCI/SSE2                                                                          supported      3   NVIDIA GTX 460
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 460
+NVIDIA GeForce GTX 460M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 460M
+NVIDIA GeForce GTX 465/PCI/SSE2                                                                          supported      3   NVIDIA GTX 465
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 465
+NVIDIA GeForce GTX 470/PCI/SSE2                                                                          supported      3   NVIDIA GTX 470
+NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 470
+NVIDIA GeForce GTX 480/PCI/SSE2                                                                          supported      3   NVIDIA GTX 480
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2                                                                       supported      3   NVIDIA GTX 550
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!                                                                supported      3   NVIDIA GTX 550
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2                                                                       supported      3   NVIDIA GTX 560
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!                                                                supported      3   NVIDIA GTX 560
+NVIDIA GeForce GTX 560/PCI/SSE2                                                                          supported      3   NVIDIA GTX 560
+NVIDIA GeForce GTX 570/PCI/SSE2                                                                          supported      3   NVIDIA GTX 570
+NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 570
+NVIDIA GeForce GTX 580/PCI/SSE2                                                                          supported      3   NVIDIA GTX 580
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!                                                                   supported      3   NVIDIA GTX 580
+NVIDIA GeForce GTX 580M/PCI/SSE2                                                                         supported      3   NVIDIA GTX 580M
+NVIDIA GeForce GTX 590/PCI/SSE2                                                                          supported      3   NVIDIA GTX 590
+NVIDIA GeForce Go 6                                                                                      supported      1   NVIDIA GeForce Go 6
+NVIDIA GeForce Go 6100                                                                                   supported      0   NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6100/PCI/SSE2                                                                          supported      0   NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6150/PCI/SSE2                                                                          supported      0   NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6200                                                                                   supported      0   NVIDIA GeForce Go 6200
+NVIDIA GeForce Go 6200/PCI/SSE2                                                                          supported      0   NVIDIA GeForce Go 6200
+NVIDIA GeForce Go 6400                                                                                   supported      1   NVIDIA GeForce Go 6400
+NVIDIA GeForce Go 6400/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 6400
+NVIDIA GeForce Go 6600                                                                                   supported      1   NVIDIA GeForce Go 6600
+NVIDIA GeForce Go 6600/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 6600
+NVIDIA GeForce Go 6800                                                                                   supported      1   NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 6800 Ultra/PCI/SSE2                                                                    supported      1   NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 6800/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 7200                                                                                   supported      1   NVIDIA GeForce Go 7200
+NVIDIA GeForce Go 7200/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 7200
+NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce Go 7200
+NVIDIA GeForce Go 7300                                                                                   supported      1   NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7300/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7400                                                                                   supported      1   NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2                                                                          supported      1   NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW!                                                                   supported      1   NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7600                                                                                   supported      2   NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7600/PCI/SSE2                                                                          supported      2   NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!                                                                   supported      2   NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7700                                                                                   supported      2   NVIDIA GeForce Go 7700
+NVIDIA GeForce Go 7800                                                                                   supported      2   NVIDIA GeForce Go 7800
+NVIDIA GeForce Go 7800 GTX/PCI/SSE2                                                                      supported      2   NVIDIA GeForce Go 7800
+NVIDIA GeForce Go 7900                                                                                   supported      2   NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7900 GS/PCI/SSE2                                                                       supported      2   NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7900 GTX/PCI/SSE2                                                                      supported      2   NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7950 GTX/PCI/SSE2                                                                      supported      2   NVIDIA GeForce Go 7900
+NVIDIA GeForce PCX                                                                                       supported      0   NVIDIA GeForce PCX
+NVIDIA GeForce2 GTS/AGP/SSE                                                                              supported      0   NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/3DNOW!                                                                            supported      0   NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/SSE/3DNOW!                                                                        supported      0   NVIDIA GeForce 2
+NVIDIA GeForce2 MX/AGP/SSE2                                                                              supported      0   NVIDIA GeForce 2
+NVIDIA GeForce2 MX/PCI/SSE2                                                                              supported      0   NVIDIA GeForce 2
+NVIDIA GeForce3/AGP/SSE/3DNOW!                                                                           supported      0   NVIDIA GeForce 3
+NVIDIA GeForce3/AGP/SSE2                                                                                 supported      0   NVIDIA GeForce 3
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2                                                                      supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW!                                                               supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW!                                                               supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW!                                                               supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 460 Go/AGP/SSE2                                                                          supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!                                                                   supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/AGP/SSE2                                                                         supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/3DNOW!                                                                       supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW!                                                                   supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 4000/PCI/SSE2                                                                         supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW!                                                                    supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 420/AGP/SSE2                                                                          supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2                                                               supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440/AGP/SSE2                                                                          supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW!                                                                   supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2                                                             supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!                                                         supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE                                                               supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW!                                                                   supported      0   NVIDIA GeForce 4
+NVIDIA GeForce4 Ti 4400/AGP/SSE2                                                                         supported      0   NVIDIA GeForce 4
+NVIDIA Generic                                                                                                              UNRECOGNIZED
+NVIDIA ION LE/PCI/SSE2                                                                                   supported      2   NVIDIA ION
+NVIDIA ION/PCI/SSE2                                                                                      supported      2   NVIDIA ION
+NVIDIA ION/PCI/SSE2/3DNOW!                                                                               supported      2   NVIDIA ION
+NVIDIA MCP61/PCI/SSE2                                                                                                       UNRECOGNIZED
+NVIDIA MCP61/PCI/SSE2/3DNOW!                                                                                                UNRECOGNIZED
+NVIDIA MCP73/PCI/SSE2                                                                                                       UNRECOGNIZED
+NVIDIA MCP79MH/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA MCP79MX/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA MCP7A-O/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA MCP7A-S/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA MCP89-EPT/PCI/SSE2                                                                                                   UNRECOGNIZED
+NVIDIA N10M-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA N10P-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA N10P-GV2/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA N11M-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA N11M-GE2/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA N12E-GS-A1/PCI/SSE2                                                                                                  UNRECOGNIZED
+NVIDIA NB9M-GE/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA NB9M-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA NB9M-GS/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA NB9M-NS/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA NB9P-GE1/PCI/SSE2                                                                                                    UNRECOGNIZED
+NVIDIA NB9P-GS/PCI/SSE2                                                                                                     UNRECOGNIZED
+NVIDIA NV17/AGP/3DNOW!                                                                                                      UNRECOGNIZED
+NVIDIA NV17/AGP/SSE2                                                                                                        UNRECOGNIZED
+NVIDIA NV34                                                                                              supported      0   NVIDIA NV34
+NVIDIA NV35                                                                                              supported      0   NVIDIA NV35
+NVIDIA NV36/AGP/SSE/3DNOW!                                                                                                  UNRECOGNIZED
+NVIDIA NV36/AGP/SSE2                                                                                                        UNRECOGNIZED
+NVIDIA NV41/PCI/SSE2                                                                                                        UNRECOGNIZED
+NVIDIA NV43                                                                                              supported      1   NVIDIA NV43
+NVIDIA NV44                                                                                              supported      1   NVIDIA NV44
+NVIDIA NVIDIA GeForce 210 OpenGL Engine                                                                  supported      2   NVIDIA 210
+NVIDIA NVIDIA GeForce 320M OpenGL Engine                                                                 supported      2   NVIDIA 320M
+NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine                                                              supported      1   NVIDIA GeForce 7300
+NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine                                                              supported      2   NVIDIA GeForce 7600
+NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine                                                             supported      1   NVIDIA GeForce 8600M
+NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine                                                              supported      3   NVIDIA GeForce 8800
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine                                                              supported      3   NVIDIA GeForce 8800
+NVIDIA NVIDIA GeForce 9400 OpenGL Engine                                                                 supported      1   NVIDIA GeForce 9400
+NVIDIA NVIDIA GeForce 9400M OpenGL Engine                                                                supported      1   NVIDIA GeForce 9400M
+NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine                                                              supported      2   NVIDIA GeForce 9500
+NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine                                                             supported      3   NVIDIA GeForce 9600M
+NVIDIA NVIDIA GeForce GT 120 OpenGL Engine                                                               supported      2   NVIDIA GT 120M
+NVIDIA NVIDIA GeForce GT 130 OpenGL Engine                                                               supported      2   NVIDIA GT 130M
+NVIDIA NVIDIA GeForce GT 220 OpenGL Engine                                                               supported      2   NVIDIA GT 220M
+NVIDIA NVIDIA GeForce GT 230M OpenGL Engine                                                              supported      2   NVIDIA GT 230M
+NVIDIA NVIDIA GeForce GT 240M OpenGL Engine                                                              supported      2   NVIDIA GT 240M
+NVIDIA NVIDIA GeForce GT 330M OpenGL Engine                                                              supported      3   NVIDIA GT 330M
+NVIDIA NVIDIA GeForce GT 420M OpenGL Engine                                                              supported      2   NVIDIA GT 420M
+NVIDIA NVIDIA GeForce GT 425M OpenGL Engine                                                              supported      3   NVIDIA GT 425M
+NVIDIA NVIDIA GeForce GT 430 OpenGL Engine                                                               supported      3   NVIDIA GT 430M
+NVIDIA NVIDIA GeForce GT 440 OpenGL Engine                                                               supported      3   NVIDIA GT 440M
+NVIDIA NVIDIA GeForce GT 540M OpenGL Engine                                                              supported      3   NVIDIA GT 540M
+NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine                                                              supported      3   NVIDIA GTS 240
+NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine                                                              supported      3   NVIDIA GTS 250
+NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine                                                              supported      3   NVIDIA GTS 450
+NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine                                                              supported      3   NVIDIA GTX 285
+NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine                                                              supported      3   NVIDIA GTX 460
+NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine                                                             supported      3   NVIDIA GTX 460M
+NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine                                                              supported      3   NVIDIA GTX 465
+NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine                                                              supported      3   NVIDIA GTX 470
+NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine                                                              supported      3   NVIDIA GTX 480
+NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine                                                                         UNRECOGNIZED
+NVIDIA NVIDIA GeForce4 OpenGL Engine                                                                     supported      0   NVIDIA GeForce 4
+NVIDIA NVIDIA NV34MAP OpenGL Engine                                                                      supported      0   NVIDIA NV34
+NVIDIA NVIDIA Quadro 4000 OpenGL Engine                                                                  supported      3   NVIDIA Quadro 4000
+NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine                                                               supported      3   NVIDIA Quadro FX 4800
+NVIDIA NVS 2100M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 2100M
+NVIDIA NVS 300/PCI/SSE2                                                                                  supported      0   NVIDIA Quadro NVS
+NVIDIA NVS 3100M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 3100M
+NVIDIA NVS 4100/PCI/SSE2/3DNOW!                                                                          supported      0   NVIDIA Quadro NVS
+NVIDIA NVS 4200M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 4200M
+NVIDIA NVS 5100M/PCI/SSE2                                                                                supported      2   NVIDIA Quadro NVS 5100M
+NVIDIA PCI                                                                                                                  UNRECOGNIZED
+NVIDIA Quadro 2000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 2000 M/D
+NVIDIA Quadro 4000                                                                                       supported      3   NVIDIA Quadro 4000
+NVIDIA Quadro 4000 OpenGL Engine                                                                         supported      3   NVIDIA Quadro 4000
+NVIDIA Quadro 4000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 4000
+NVIDIA Quadro 5000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 50x0 M
+NVIDIA Quadro 5000M/PCI/SSE2                                                                             supported      3   NVIDIA Quadro 50x0 M
+NVIDIA Quadro 600                                                                                        supported      2   NVIDIA Quadro 600
+NVIDIA Quadro 600/PCI/SSE2                                                                               supported      2   NVIDIA Quadro 600
+NVIDIA Quadro 600/PCI/SSE2/3DNOW!                                                                        supported      2   NVIDIA Quadro 600
+NVIDIA Quadro 6000                                                                                       supported      3   NVIDIA Quadro 6000
+NVIDIA Quadro 6000/PCI/SSE2                                                                              supported      3   NVIDIA Quadro 6000
+NVIDIA Quadro CX/PCI/SSE2                                                                                                   UNRECOGNIZED
+NVIDIA Quadro DCC                                                                                        supported      0   NVIDIA Quadro DCC
+NVIDIA Quadro FX                                                                                         supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 1100/AGP/SSE2                                                                           supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 1400/PCI/SSE2                                                                           supported      2   NVIDIA Quadro 400
+NVIDIA Quadro FX 1500                                                                                    supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 1500M/PCI/SSE2                                                                          supported      1   NVIDIA Quadro FX 1500M
+NVIDIA Quadro FX 1600M/PCI/SSE2                                                                          supported      2   NVIDIA Quadro 600
+NVIDIA Quadro FX 1700                                                                                    supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 1700M/PCI/SSE2                                                                          supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 1800                                                                                    supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 1800/PCI/SSE2                                                                           supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 1800M/PCI/SSE2                                                                          supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 2500M/PCI/SSE2                                                                          supported      2   NVIDIA Quadro FX 2500M
+NVIDIA Quadro FX 2700M/PCI/SSE2                                                                          supported      3   NVIDIA Quadro FX 2700M
+NVIDIA Quadro FX 2800M/PCI/SSE2                                                                          supported      3   NVIDIA Quadro FX 2800M
+NVIDIA Quadro FX 3400                                                                                    supported      2   NVIDIA Quadro 400
+NVIDIA Quadro FX 3450                                                                                    supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2                                                                  supported      2   NVIDIA Quadro 400
+NVIDIA Quadro FX 3500                                                                                    supported      2   NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 3500M/PCI/SSE2                                                                          supported      2   NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 360M/PCI/SSE2                                                                           supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 370                                                                                     supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 370/PCI/SSE2                                                                            supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 3700                                                                                    supported      3   NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 3700M/PCI/SSE2                                                                          supported      3   NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 370M/PCI/SSE2                                                                           supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 3800                                                                                    supported      3   NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 3800M/PCI/SSE2                                                                          supported      3   NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 4500                                                                                    supported      3   NVIDIA Quadro FX 4500
+NVIDIA Quadro FX 4600                                                                                    supported      2   NVIDIA Quadro 600
+NVIDIA Quadro FX 4800                                                                                    supported      3   NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 4800/PCI/SSE2                                                                           supported      3   NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 560                                                                                     supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 5600                                                                                    supported      2   NVIDIA Quadro 600
+NVIDIA Quadro FX 570                                                                                     supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 570/PCI/SSE2                                                                            supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 570M/PCI/SSE2                                                                           supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 580/PCI/SSE2                                                                            supported      1   NVIDIA Quadro FX
+NVIDIA Quadro FX 770M/PCI/SSE2                                                                           supported      2   NVIDIA Quadro FX 770M
+NVIDIA Quadro FX 880M                                                                                    supported      3   NVIDIA Quadro FX 880M
+NVIDIA Quadro FX 880M/PCI/SSE2                                                                           supported      3   NVIDIA Quadro FX 880M
+NVIDIA Quadro FX Go700/AGP/SSE2                                                                          supported      1   NVIDIA Quadro FX
+NVIDIA Quadro NVS                                                                                        supported      0   NVIDIA Quadro NVS
+NVIDIA Quadro NVS 110M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 130M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 135M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 140M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 150M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 160M/PCI/SSE2                                                                          supported      0   NVIDIA Quadro NVS 1xxM
+NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!                                                                   supported      0   NVIDIA Quadro NVS
+NVIDIA Quadro NVS 285/PCI/SSE2                                                                           supported      0   NVIDIA Quadro NVS
+NVIDIA Quadro NVS 290/PCI/SSE2                                                                           supported      0   NVIDIA Quadro NVS
+NVIDIA Quadro NVS 295/PCI/SSE2                                                                           supported      0   NVIDIA Quadro NVS
+NVIDIA Quadro NVS 320M/PCI/SSE2                                                                          supported      2   NVIDIA Quadro NVS 320M
+NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2                                                                    supported      0   NVIDIA Quadro NVS
+NVIDIA Quadro NVS/PCI/SSE2                                                                               supported      0   NVIDIA Quadro NVS
+NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW!                                                                                  UNRECOGNIZED
+NVIDIA Quadro VX 200/PCI/SSE2                                                                                               UNRECOGNIZED
+NVIDIA Quadro/AGP/SSE2                                                                                                      UNRECOGNIZED
+NVIDIA Quadro2                                                                                           supported      0   NVIDIA Quadro2
+NVIDIA Quadro4                                                                                           supported      0   NVIDIA Quadro4
+NVIDIA RIVA TNT                                                                                          unsupported    0   NVIDIA RIVA TNT
+NVIDIA RIVA TNT2/AGP/SSE2                                                                                unsupported    0   NVIDIA RIVA TNT
+NVIDIA RIVA TNT2/PCI/3DNOW!                                                                              unsupported    0   NVIDIA RIVA TNT
+NVIDIA nForce                                                                                            unsupported    0   NVIDIA nForce
+NVIDIA unknown board/AGP/SSE2                                                                                               UNRECOGNIZED
+NVIDIA unknown board/PCI/SSE2                                                                                               UNRECOGNIZED
+NVIDIA unknown board/PCI/SSE2/3DNOW!                                                                                        UNRECOGNIZED
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine                     supported      3   ATI Radeon HD 5600
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine                     supported      3   ATI Radeon HD 5700
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine                     supported      3   ATI Radeon HD 5700
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine                    supported      3   ATI Radeon HD 6400
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine                    supported      3   ATI Radeon HD 6700
+Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com                                                    UNRECOGNIZED
+Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine                            supported      2   Intel HD Graphics
+Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine                                   supported      2   NVIDIA 320M
+Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine                                   supported      1   NVIDIA GeForce 9400
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine                                 supported      2   NVIDIA GT 120M
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine                                supported      3   NVIDIA GT 330M
+Radeon RV350 on Gallium                                                                                  supported      0   ATI RV350 (9600)
+S3                                                                                                                          UNRECOGNIZED
+S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D                                                                unsupported    0   S3
+S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE                                                            unsupported    0   S3
+S3 Graphics, Incorporated ProSavage/Twister                                                              unsupported    0   S3
+S3 Graphics, Incorporated S3 Graphics Chrome9 HC                                                         unsupported    0   S3
+S3 Graphics, Incorporated S3 Graphics DeltaChrome                                                        unsupported    0   S3
+S3 Graphics, Incorporated VIA Chrome9 HC IGP                                                             unsupported    0   S3
+SiS                                                                                                      unsupported    0   SiS
+SiS 661 VGA                                                                                              unsupported    0   SiS
+SiS 662 VGA                                                                                              unsupported    0   SiS
+SiS 741 VGA                                                                                              unsupported    0   SiS
+SiS 760 VGA                                                                                              unsupported    0   SiS
+SiS 761GX VGA                                                                                            unsupported    0   SiS
+SiS Mirage Graphics3                                                                                     unsupported    0   SiS
+Trident                                                                                                  unsupported    0   Trident
+Tungsten Graphics                                                                                        unsupported    0   Tungsten Graphics
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2                                    unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2                               unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2                                    unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2                               unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2                               unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2                                   unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2                              unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945G                                                                     unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2                                    unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT                                            unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2                               unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2                               unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2                                   unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2                                   unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2                              unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME  x86/MMX/SSE2                                                     unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME 20061017                                                          unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2                              unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2                                  unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2                             unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2                               unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2                               unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2                                   unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2                              unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2                                                unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2                                 unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2                                     unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2                                     unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2                                unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2                                unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2                                     unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT                                             unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2                                unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2                                 unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2                   unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2                    unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2                unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX...   unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2     unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1                  unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT             unsupported    0   Mesa
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MM...   unsupported    0   Mesa
+Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2               unsupported    0   Mesa
+VIA                                                                                                      unsupported    0   VIA
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;                                                                         UNRECOGNIZED
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)                                                                           UNRECOGNIZED
+VMware, Inc. Gallium 0.4 on llvmpipe                                                                                        UNRECOGNIZED
+VMware, Inc. Gallium 0.4 on softpipe                                                                                        UNRECOGNIZED
+X.Org Gallium 0.4 on AMD BARTS                                                                           supported      3   AMD BARTS (HD 6800)
+X.Org Gallium 0.4 on AMD CEDAR                                                                           supported      2   AMD CEDAR (HD 5450)
+X.Org Gallium 0.4 on AMD HEMLOCK                                                                         supported      3   AMD HEMLOCK (HD 5970)
+X.Org Gallium 0.4 on AMD JUNIPER                                                                         supported      3   AMD JUNIPER (HD 5700)
+X.Org Gallium 0.4 on AMD REDWOOD                                                                         supported      3   AMD REDWOOD (HD 5500/5600)
+X.Org Gallium 0.4 on AMD RS780                                                                           supported      0   AMD RS780 (HD 3200)
+X.Org Gallium 0.4 on AMD RS880                                                                           supported      1   AMD RS880 (HD 4200)
+X.Org Gallium 0.4 on AMD RV610                                                                           supported      1   AMD RV610 (HD 2400)
+X.Org Gallium 0.4 on AMD RV620                                                                           supported      1   AMD RV620 (HD 3400)
+X.Org Gallium 0.4 on AMD RV630                                                                           supported      2   AMD RV630 (HD 2600)
+X.Org Gallium 0.4 on AMD RV635                                                                           supported      3   AMD RV635 (HD 3600)
+X.Org Gallium 0.4 on AMD RV710                                                                           supported      1   AMD RV710 (HD 4300)
+X.Org Gallium 0.4 on AMD RV730                                                                           supported      3   AMD RV730 (HD 4600)
+X.Org Gallium 0.4 on AMD RV740                                                                           supported      3   AMD RV740 (HD 4700)
+X.Org Gallium 0.4 on AMD RV770                                                                           supported      3   AMD RV770 (HD 4800)
+X.Org R300 Project Gallium 0.4 on ATI R300                                                               supported      1   ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI R580                                                               supported      3   ATI R580 (X1900)
+X.Org R300 Project Gallium 0.4 on ATI RC410                                                              unsupported    0   ATI RC410 (Xpress 200)
+X.Org R300 Project Gallium 0.4 on ATI RS482                                                              unsupported    0   ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on ATI RS600                                                              unsupported    0   ATI RS600 (Xpress 3200)
+X.Org R300 Project Gallium 0.4 on ATI RS690                                                              supported      1   ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on ATI RV350                                                              supported      0   ATI RV350 (9600)
+X.Org R300 Project Gallium 0.4 on ATI RV370                                                              supported      0   ATI RV370 (X300)
+X.Org R300 Project Gallium 0.4 on ATI RV410                                                              supported      1   ATI RV410 (X700)
+X.Org R300 Project Gallium 0.4 on ATI RV515                                                              supported      1   ATI RV515
+X.Org R300 Project Gallium 0.4 on ATI RV530                                                              supported      1   ATI RV530
+X.Org R300 Project Gallium 0.4 on ATI RV570                                                              supported      3   ATI RV570 (X1900 GT/PRO)
+X.Org R300 Project Gallium 0.4 on R420                                                                   supported      1   ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on R580                                                                   supported      3   ATI R580 (X1900)
+X.Org R300 Project Gallium 0.4 on RC410                                                                  unsupported    0   ATI RC410 (Xpress 200)
+X.Org R300 Project Gallium 0.4 on RS480                                                                  unsupported    0   ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on RS482                                                                  unsupported    0   ATI RS48x (Xpress 200x)
+X.Org R300 Project Gallium 0.4 on RS600                                                                  unsupported    0   ATI RS600 (Xpress 3200)
+X.Org R300 Project Gallium 0.4 on RS690                                                                  supported      1   ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on RS740                                                                  supported      1   ATI R300 (9700)
+X.Org R300 Project Gallium 0.4 on RV350                                                                  supported      0   ATI RV350 (9600)
+X.Org R300 Project Gallium 0.4 on RV370                                                                  supported      0   ATI RV370 (X300)
+X.Org R300 Project Gallium 0.4 on RV410                                                                  supported      1   ATI RV410 (X700)
+X.Org R300 Project Gallium 0.4 on RV515                                                                  supported      1   ATI RV515
+X.Org R300 Project Gallium 0.4 on RV530                                                                  supported      1   ATI RV530
+XGI                                                                                                      unsupported    0   XGI
+nouveau Gallium 0.4 on NV34                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV36                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV46                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV49                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV4A                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV4B                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV4E                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV50                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV84                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV86                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV92                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV94                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV96                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NV98                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NVA0                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NVA3                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NVA5                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NVA8                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NVAA                                                                                                 UNRECOGNIZED
+nouveau Gallium 0.4 on NVAC                                                                                                 UNRECOGNIZED
diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c807f22b58fc7d04425e7c9819632983150ccb3f
--- /dev/null
+++ b/indra/newview/tests/gpus_seen.txt
@@ -0,0 +1,1593 @@
+ATI
+ATI 3D-Analyze
+ATI ASUS A9xxx
+ATI ASUS AH24xx
+ATI ASUS AH26xx
+ATI ASUS AH34xx
+ATI ASUS AH36xx
+ATI ASUS AH46xx
+ATI ASUS AX3xx
+ATI ASUS AX5xx
+ATI ASUS AX8xx
+ATI ASUS EAH38xx
+ATI ASUS EAH43xx
+ATI ASUS EAH45xx
+ATI ASUS EAH48xx
+ATI ASUS EAH57xx
+ATI ASUS EAH58xx
+ATI ASUS X1xxx
+ATI All-in-Wonder 9xxx
+ATI All-in-Wonder HD
+ATI All-in-Wonder PCI-E
+ATI All-in-Wonder X1800
+ATI All-in-Wonder X1900
+ATI All-in-Wonder X600
+ATI All-in-Wonder X800
+ATI Diamond X1xxx
+ATI Display Adapter
+ATI FireGL
+ATI FireGL 5200
+ATI FireGL 5xxx
+ATI FireMV
+ATI Generic
+ATI Hercules 9800
+ATI IGP 340M
+ATI M52
+ATI M54
+ATI M56
+ATI M71
+ATI M72
+ATI M76
+ATI Mobility Radeon
+ATI Mobility Radeon 7xxx
+ATI Mobility Radeon 9600
+ATI Mobility Radeon 9700
+ATI Mobility Radeon 9800
+ATI Mobility Radeon HD 2300
+ATI Mobility Radeon HD 2400
+ATI Mobility Radeon HD 2600
+ATI Mobility Radeon HD 2700
+ATI Mobility Radeon HD 3400
+ATI Mobility Radeon HD 3600
+ATI Mobility Radeon HD 3800
+ATI Mobility Radeon HD 4200
+ATI Mobility Radeon HD 4300
+ATI Mobility Radeon HD 4500
+ATI Mobility Radeon HD 4600
+ATI Mobility Radeon HD 4800
+ATI Mobility Radeon HD 5400
+ATI Mobility Radeon HD 5600
+ATI Mobility Radeon X1xxx
+ATI Mobility Radeon X2xxx
+ATI Mobility Radeon X3xx
+ATI Mobility Radeon X6xx
+ATI Mobility Radeon X7xx
+ATI Mobility Radeon Xxxx
+ATI RV380
+ATI RV530
+ATI Radeon 2100
+ATI Radeon 3000
+ATI Radeon 3100
+ATI Radeon 7000
+ATI Radeon 7xxx
+ATI Radeon 8xxx
+ATI Radeon 9000
+ATI Radeon 9100
+ATI Radeon 9200
+ATI Radeon 9500
+ATI Radeon 9600
+ATI Radeon 9700
+ATI Radeon 9800
+ATI Radeon HD 2300
+ATI Radeon HD 2400
+ATI Radeon HD 2600
+ATI Radeon HD 2900
+ATI Radeon HD 3000
+ATI Radeon HD 3100
+ATI Radeon HD 3200
+ATI Radeon HD 3300
+ATI Radeon HD 3400
+ATI Radeon HD 3600
+ATI Radeon HD 3800
+ATI Radeon HD 4200
+ATI Radeon HD 4300
+ATI Radeon HD 4500
+ATI Radeon HD 4600
+ATI Radeon HD 4700
+ATI Radeon HD 4800
+ATI Radeon HD 5400
+ATI Radeon HD 5500
+ATI Radeon HD 5600
+ATI Radeon HD 5700
+ATI Radeon HD 5800
+ATI Radeon HD 5900
+ATI Radeon HD 6200
+ATI Radeon HD 6300
+ATI Radeon HD 6500
+ATI Radeon HD 6800
+ATI Radeon HD 6900
+ATI Radeon OpenGL
+ATI Radeon RV250
+ATI Radeon RV600
+ATI Radeon RX9550
+ATI Radeon VE
+ATI Radeon X1000
+ATI Radeon X1200
+ATI Radeon X1300
+ATI Radeon X13xx
+ATI Radeon X1400
+ATI Radeon X1500
+ATI Radeon X1600
+ATI Radeon X16xx
+ATI Radeon X1700
+ATI Radeon X1800
+ATI Radeon X1900
+ATI Radeon X19xx
+ATI Radeon X1xxx
+ATI Radeon X300
+ATI Radeon X500
+ATI Radeon X600
+ATI Radeon X700
+ATI Radeon X7xx
+ATI Radeon X800
+ATI Radeon Xpress
+ATI Rage 128
+ATI Technologies Inc.
+ATI Technologies Inc.  x86
+ATI Technologies Inc.  x86/SSE2
+ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730
+ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2
+ATI Technologies Inc. AMD 760G
+ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1)
+ATI Technologies Inc. AMD 780L
+ATI Technologies Inc. AMD FirePro 2270
+ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200
+ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250
+ATI Technologies Inc. AMD RADEON HD 6450
+ATI Technologies Inc. AMD Radeon HD 6200 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6250 Graphics
+ATI Technologies Inc. AMD Radeon HD 6300 series Graphics
+ATI Technologies Inc. AMD Radeon HD 6300M Series
+ATI Technologies Inc. AMD Radeon HD 6310 Graphics
+ATI Technologies Inc. AMD Radeon HD 6310M
+ATI Technologies Inc. AMD Radeon HD 6330M
+ATI Technologies Inc. AMD Radeon HD 6350
+ATI Technologies Inc. AMD Radeon HD 6370M
+ATI Technologies Inc. AMD Radeon HD 6400M Series
+ATI Technologies Inc. AMD Radeon HD 6450
+ATI Technologies Inc. AMD Radeon HD 6470M
+ATI Technologies Inc. AMD Radeon HD 6490M
+ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6530M
+ATI Technologies Inc. AMD Radeon HD 6550M
+ATI Technologies Inc. AMD Radeon HD 6570
+ATI Technologies Inc. AMD Radeon HD 6570M
+ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series
+ATI Technologies Inc. AMD Radeon HD 6600M Series
+ATI Technologies Inc. AMD Radeon HD 6650M
+ATI Technologies Inc. AMD Radeon HD 6670
+ATI Technologies Inc. AMD Radeon HD 6700 Series
+ATI Technologies Inc. AMD Radeon HD 6750
+ATI Technologies Inc. AMD Radeon HD 6750M
+ATI Technologies Inc. AMD Radeon HD 6770
+ATI Technologies Inc. AMD Radeon HD 6800 Series
+ATI Technologies Inc. AMD Radeon HD 6850M
+ATI Technologies Inc. AMD Radeon HD 6870
+ATI Technologies Inc. AMD Radeon HD 6870M
+ATI Technologies Inc. AMD Radeon HD 6900 Series
+ATI Technologies Inc. AMD Radeon HD 6970M
+ATI Technologies Inc. AMD Radeon HD 6990
+ATI Technologies Inc. AMD Radeon(TM) HD 6470M
+ATI Technologies Inc. ASUS 5870 Eyefinity 6
+ATI Technologies Inc. ASUS AH2600 Series
+ATI Technologies Inc. ASUS AH3450 Series
+ATI Technologies Inc. ASUS AH3650 Series
+ATI Technologies Inc. ASUS AH4650 Series
+ATI Technologies Inc. ASUS ARES
+ATI Technologies Inc. ASUS EAH2900 Series
+ATI Technologies Inc. ASUS EAH3450 Series
+ATI Technologies Inc. ASUS EAH3650 Series
+ATI Technologies Inc. ASUS EAH4350 series
+ATI Technologies Inc. ASUS EAH4550 series
+ATI Technologies Inc. ASUS EAH4650 series
+ATI Technologies Inc. ASUS EAH4670 series
+ATI Technologies Inc. ASUS EAH4750 Series
+ATI Technologies Inc. ASUS EAH4770 Series
+ATI Technologies Inc. ASUS EAH4770 series
+ATI Technologies Inc. ASUS EAH4850 series
+ATI Technologies Inc. ASUS EAH5450 Series
+ATI Technologies Inc. ASUS EAH5550 Series
+ATI Technologies Inc. ASUS EAH5570 series
+ATI Technologies Inc. ASUS EAH5670 Series
+ATI Technologies Inc. ASUS EAH5750 Series
+ATI Technologies Inc. ASUS EAH5770 Series
+ATI Technologies Inc. ASUS EAH5830 Series
+ATI Technologies Inc. ASUS EAH5850 Series
+ATI Technologies Inc. ASUS EAH5870 Series
+ATI Technologies Inc. ASUS EAH5970 Series
+ATI Technologies Inc. ASUS EAH6850 Series
+ATI Technologies Inc. ASUS EAH6870 Series
+ATI Technologies Inc. ASUS EAH6950 Series
+ATI Technologies Inc. ASUS EAH6970 Series
+ATI Technologies Inc. ASUS EAHG4670 series
+ATI Technologies Inc. ASUS Extreme AX600 Series
+ATI Technologies Inc. ASUS Extreme AX600XT-TD
+ATI Technologies Inc. ASUS X1300 Series x86/SSE2
+ATI Technologies Inc. ASUS X1550 Series
+ATI Technologies Inc. ASUS X1950 Series x86/SSE2
+ATI Technologies Inc. ASUS X800 Series
+ATI Technologies Inc. ASUS X850 Series
+ATI Technologies Inc. ATI All-in-Wonder HD
+ATI Technologies Inc. ATI FirePro 2260
+ATI Technologies Inc. ATI FirePro 2450
+ATI Technologies Inc. ATI FirePro M5800
+ATI Technologies Inc. ATI FirePro M7740
+ATI Technologies Inc. ATI FirePro M7820
+ATI Technologies Inc. ATI FirePro V3700 (FireGL)
+ATI Technologies Inc. ATI FirePro V3800
+ATI Technologies Inc. ATI FirePro V4800
+ATI Technologies Inc. ATI FirePro V4800 (FireGL)
+ATI Technologies Inc. ATI FirePro V5800
+ATI Technologies Inc. ATI FirePro V7800
+ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON HD 3450
+ATI Technologies Inc. ATI MOBILITY RADEON X1600
+ATI Technologies Inc. ATI MOBILITY RADEON X2300
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2
+ATI Technologies Inc. ATI MOBILITY RADEON X300
+ATI Technologies Inc. ATI MOBILITY RADEON X600
+ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200
+ATI Technologies Inc. ATI Mobility FireGL V5700
+ATI Technologies Inc. ATI Mobility Radeon 4100
+ATI Technologies Inc. ATI Mobility Radeon Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 2300
+ATI Technologies Inc. ATI Mobility Radeon HD 2400
+ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2600
+ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT
+ATI Technologies Inc. ATI Mobility Radeon HD 2700
+ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 3430
+ATI Technologies Inc. ATI Mobility Radeon HD 3450
+ATI Technologies Inc. ATI Mobility Radeon HD 3470
+ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2
+ATI Technologies Inc. ATI Mobility Radeon HD 3650
+ATI Technologies Inc. ATI Mobility Radeon HD 4200
+ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4225
+ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4250
+ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Mobility Radeon HD 4270
+ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4330
+ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4350
+ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4530
+ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4550
+ATI Technologies Inc. ATI Mobility Radeon HD 4570
+ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4650
+ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4670
+ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 4850
+ATI Technologies Inc. ATI Mobility Radeon HD 4870
+ATI Technologies Inc. ATI Mobility Radeon HD 5000
+ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5145
+ATI Technologies Inc. ATI Mobility Radeon HD 5165
+ATI Technologies Inc. ATI Mobility Radeon HD 530v
+ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 540v
+ATI Technologies Inc. ATI Mobility Radeon HD 5430
+ATI Technologies Inc. ATI Mobility Radeon HD 5450
+ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 545v
+ATI Technologies Inc. ATI Mobility Radeon HD 5470
+ATI Technologies Inc. ATI Mobility Radeon HD 550v
+ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 560v
+ATI Technologies Inc. ATI Mobility Radeon HD 5650
+ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5730
+ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series
+ATI Technologies Inc. ATI Mobility Radeon HD 5850
+ATI Technologies Inc. ATI Mobility Radeon HD 5870
+ATI Technologies Inc. ATI Mobility Radeon HD 6300 series
+ATI Technologies Inc. ATI Mobility Radeon HD 6370
+ATI Technologies Inc. ATI Mobility Radeon HD 6470M
+ATI Technologies Inc. ATI Mobility Radeon HD 6550
+ATI Technologies Inc. ATI Mobility Radeon HD 6570
+ATI Technologies Inc. ATI Mobility Radeon X1300
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1350
+ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1400
+ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1600
+ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300
+ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442)
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon X2500
+ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2
+ATI Technologies Inc. ATI Mobility Radeon. HD 530v
+ATI Technologies Inc. ATI Mobility Radeon. HD 5470
+ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO
+ATI Technologies Inc. ATI RADEON XPRESS 1100
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series
+ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2
+ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES
+ATI Technologies Inc. ATI Radeon
+ATI Technologies Inc. ATI Radeon 2100
+ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM)
+ATI Technologies Inc. ATI Radeon 2100 Graphics
+ATI Technologies Inc. ATI Radeon 3000
+ATI Technologies Inc. ATI Radeon 3000 Graphics
+ATI Technologies Inc. ATI Radeon 3100 Graphics
+ATI Technologies Inc. ATI Radeon 5xxx series
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2
+ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM)
+ATI Technologies Inc. ATI Radeon 9600 / X1050 Series
+ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series
+ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Graphics Processor
+ATI Technologies Inc. ATI Radeon HD 2200 Graphics
+ATI Technologies Inc. ATI Radeon HD 2350
+ATI Technologies Inc. ATI Radeon HD 2400
+ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2400 PRO
+ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP
+ATI Technologies Inc. ATI Radeon HD 2400 Pro
+ATI Technologies Inc. ATI Radeon HD 2400 Series
+ATI Technologies Inc. ATI Radeon HD 2400 XT
+ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 PRO
+ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 2600 Pro
+ATI Technologies Inc. ATI Radeon HD 2600 Series
+ATI Technologies Inc. ATI Radeon HD 2600 XT
+ATI Technologies Inc. ATI Radeon HD 2900 GT
+ATI Technologies Inc. ATI Radeon HD 2900 XT
+ATI Technologies Inc. ATI Radeon HD 3200 Graphics
+ATI Technologies Inc. ATI Radeon HD 3300 Graphics
+ATI Technologies Inc. ATI Radeon HD 3400 Series
+ATI Technologies Inc. ATI Radeon HD 3450
+ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex
+ATI Technologies Inc. ATI Radeon HD 3470
+ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex
+ATI Technologies Inc. ATI Radeon HD 3550
+ATI Technologies Inc. ATI Radeon HD 3600 Series
+ATI Technologies Inc. ATI Radeon HD 3650
+ATI Technologies Inc. ATI Radeon HD 3650 AGP
+ATI Technologies Inc. ATI Radeon HD 3730
+ATI Technologies Inc. ATI Radeon HD 3800 Series
+ATI Technologies Inc. ATI Radeon HD 3850
+ATI Technologies Inc. ATI Radeon HD 3850 AGP
+ATI Technologies Inc. ATI Radeon HD 3870
+ATI Technologies Inc. ATI Radeon HD 3870 X2
+ATI Technologies Inc. ATI Radeon HD 4200
+ATI Technologies Inc. ATI Radeon HD 4250
+ATI Technologies Inc. ATI Radeon HD 4250 Graphics
+ATI Technologies Inc. ATI Radeon HD 4270
+ATI Technologies Inc. ATI Radeon HD 4290
+ATI Technologies Inc. ATI Radeon HD 4300 Series
+ATI Technologies Inc. ATI Radeon HD 4300/4500 Series
+ATI Technologies Inc. ATI Radeon HD 4350
+ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1)
+ATI Technologies Inc. ATI Radeon HD 4450
+ATI Technologies Inc. ATI Radeon HD 4500 Series
+ATI Technologies Inc. ATI Radeon HD 4550
+ATI Technologies Inc. ATI Radeon HD 4600 Series
+ATI Technologies Inc. ATI Radeon HD 4650
+ATI Technologies Inc. ATI Radeon HD 4670
+ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4700 Series
+ATI Technologies Inc. ATI Radeon HD 4720
+ATI Technologies Inc. ATI Radeon HD 4730
+ATI Technologies Inc. ATI Radeon HD 4730 Series
+ATI Technologies Inc. ATI Radeon HD 4750
+ATI Technologies Inc. ATI Radeon HD 4770
+ATI Technologies Inc. ATI Radeon HD 4800 Series
+ATI Technologies Inc. ATI Radeon HD 4850
+ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4850 Series
+ATI Technologies Inc. ATI Radeon HD 4870
+ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 4870 X2
+ATI Technologies Inc. ATI Radeon HD 5400 Series
+ATI Technologies Inc. ATI Radeon HD 5450
+ATI Technologies Inc. ATI Radeon HD 5500 Series
+ATI Technologies Inc. ATI Radeon HD 5570
+ATI Technologies Inc. ATI Radeon HD 5600 Series
+ATI Technologies Inc. ATI Radeon HD 5630
+ATI Technologies Inc. ATI Radeon HD 5670
+ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5700 Series
+ATI Technologies Inc. ATI Radeon HD 5750
+ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5770
+ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5800 Series
+ATI Technologies Inc. ATI Radeon HD 5850
+ATI Technologies Inc. ATI Radeon HD 5870
+ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 5900 Series
+ATI Technologies Inc. ATI Radeon HD 5970
+ATI Technologies Inc. ATI Radeon HD 6230
+ATI Technologies Inc. ATI Radeon HD 6250
+ATI Technologies Inc. ATI Radeon HD 6350
+ATI Technologies Inc. ATI Radeon HD 6390
+ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6510
+ATI Technologies Inc. ATI Radeon HD 6570M
+ATI Technologies Inc. ATI Radeon HD 6750
+ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6770
+ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD 6800 Series
+ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine
+ATI Technologies Inc. ATI Radeon HD3750
+ATI Technologies Inc. ATI Radeon HD4300/HD4500 series
+ATI Technologies Inc. ATI Radeon HD4670
+ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1050
+ATI Technologies Inc. ATI Radeon X1050 Series
+ATI Technologies Inc. ATI Radeon X1200
+ATI Technologies Inc. ATI Radeon X1200 Series
+ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1250
+ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1270
+ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon X1300/X1550 Series
+ATI Technologies Inc. ATI Radeon X1550 Series
+ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine
+ATI Technologies Inc. ATI Radeon X1950 GT
+ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series
+ATI Technologies Inc. ATI Radeon Xpress 1100
+ATI Technologies Inc. ATI Radeon Xpress 1150
+ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1200
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series
+ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. ATI Radeon Xpress 1250
+ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2
+ATI Technologies Inc. ATI Radeon Xpress Series
+ATI Technologies Inc. ATI Yamaha HD 9000
+ATI Technologies Inc. ATi RS880M
+ATI Technologies Inc. Carte graphique VGA standard
+ATI Technologies Inc. Diamond Radeon X1550 Series
+ATI Technologies Inc. EG JUNIPER
+ATI Technologies Inc. EG PARK
+ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2)
+ATI Technologies Inc. FireMV 2400 PCI DDR x86
+ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2
+ATI Technologies Inc. GeCube Radeon X1550
+ATI Technologies Inc. Geforce 9500 GT
+ATI Technologies Inc. Geforce 9500GT
+ATI Technologies Inc. Geforce 9800 GT
+ATI Technologies Inc. HD3730
+ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series
+ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO
+ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. M76M
+ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2
+ATI Technologies Inc. MOBILITY RADEON X700 SE x86
+ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2
+ATI Technologies Inc. MSI RX9550SE
+ATI Technologies Inc. Mobility Radeon X2300 HD
+ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2
+ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 7000 DDR x86/SSE2
+ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 7500 DDR x86/SSE2
+ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2
+ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 DDR x86/SSE2
+ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE
+ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2
+ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2
+ATI Technologies Inc. RADEON 9500
+ATI Technologies Inc. RADEON 9550 x86/SSE2
+ATI Technologies Inc. RADEON 9600 SERIES
+ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9600 TX x86/SSE2
+ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON 9600 x86/SSE2
+ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE
+ATI Technologies Inc. RADEON 9800 PRO
+ATI Technologies Inc. RADEON 9800 x86/SSE2
+ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2
+ATI Technologies Inc. RADEON X300 Series x86/SSE2
+ATI Technologies Inc. RADEON X300 x86/SSE2
+ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2
+ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON X550 x86/SSE2
+ATI Technologies Inc. RADEON X600 Series
+ATI Technologies Inc. RADEON X600 x86/SSE2
+ATI Technologies Inc. RADEON X700 PRO x86/SSE2
+ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON X800GT
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. RADEON XPRESS Series x86/SSE2
+ATI Technologies Inc. RS740
+ATI Technologies Inc. RS780C
+ATI Technologies Inc. RS780M
+ATI Technologies Inc. RS880
+ATI Technologies Inc. RV410 Pro x86/SSE2
+ATI Technologies Inc. RV790
+ATI Technologies Inc. Radeon (TM) HD 6470M
+ATI Technologies Inc. Radeon (TM) HD 6490M
+ATI Technologies Inc. Radeon (TM) HD 6770M
+ATI Technologies Inc. Radeon 7000 DDR x86/SSE2
+ATI Technologies Inc. Radeon 7000 SDR x86/SSE2
+ATI Technologies Inc. Radeon 7500 DDR x86/SSE2
+ATI Technologies Inc. Radeon 9000 DDR x86/SSE2
+ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon DDR x86/SSE
+ATI Technologies Inc. Radeon DDR x86/SSE2
+ATI Technologies Inc. Radeon HD 6310
+ATI Technologies Inc. Radeon HD 6800 Series
+ATI Technologies Inc. Radeon SDR x86/SSE2
+ATI Technologies Inc. Radeon X1300 Series
+ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1300 Series x86/SSE2
+ATI Technologies Inc. Radeon X1300/X1550 Series
+ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2
+ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM)
+ATI Technologies Inc. Radeon X1550 Series
+ATI Technologies Inc. Radeon X1550 Series x86/SSE2
+ATI Technologies Inc. Radeon X1600
+ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1600 Series x86/SSE2
+ATI Technologies Inc. Radeon X1600/X1650 Series
+ATI Technologies Inc. Radeon X1650 Series
+ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1650 Series x86/SSE2
+ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1950 Pro
+ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Radeon X1950 Series
+ATI Technologies Inc. Radeon X1950 Series  (Microsoft - WDDM)
+ATI Technologies Inc. Radeon X300/X550/X1050 Series
+ATI Technologies Inc. Radeon X550/X700 Series
+ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. SAPPHIRE RADEON X300SE
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series
+ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. Sapphire Radeon HD 3730
+ATI Technologies Inc. Sapphire Radeon HD 3750
+ATI Technologies Inc. Standard VGA Graphics Adapter
+ATI Technologies Inc. Tul, RADEON  X600 PRO
+ATI Technologies Inc. Tul, RADEON  X600 PRO x86/SSE2
+ATI Technologies Inc. Tul, RADEON  X700 PRO
+ATI Technologies Inc. Tul, RADEON  X700 PRO x86/MMX/3DNow!/SSE2
+ATI Technologies Inc. VisionTek Radeon 4350
+ATI Technologies Inc. VisionTek Radeon X1550 Series
+ATI Technologies Inc. WRESTLER 9802
+ATI Technologies Inc. WRESTLER 9803
+ATI Technologies Inc. XFX Radeon HD 4570
+ATI Technologies Inc. Yamaha ATI HD 9000da/s
+ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101  TCL
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101  TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2
+Alex Mohr GL Hijacker!
+Apple Software Renderer
+DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL
+DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL
+DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL
+DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2
+DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2
+GPU_CLASS_UNKNOWN
+Humper Chromium
+Intel
+Intel  HD Graphics Family
+Intel 3D-Analyze v2.2 - http://www.tommti-systems.com
+Intel 3D-Analyze v2.3 - http://www.tommti-systems.com
+Intel 4 Series Internal Chipset
+Intel 830M
+Intel 845G
+Intel 855GM
+Intel 865G
+Intel 915G
+Intel 915GM
+Intel 945G
+Intel 945GM
+Intel 950
+Intel 965
+Intel B43 Express Chipset
+Intel Bear Lake
+Intel Broadwater
+Intel Brookdale
+Intel Cantiga
+Intel Eaglelake
+Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1)
+Intel G33
+Intel G41
+Intel G41 Express Chipset
+Intel G45
+Intel G45/G43 Express Chipset
+Intel Graphics Media Accelerator HD
+Intel HD Graphics
+Intel HD Graphics 100
+Intel HD Graphics 200
+Intel HD Graphics 200 BR-1101-00SH
+Intel HD Graphics 200 BR-1101-00SJ
+Intel HD Graphics 200 BR-1101-00SK
+Intel HD Graphics 200 BR-1101-01M5
+Intel HD Graphics 200 BR-1101-01M6
+Intel HD Graphics BR-1004-01Y1
+Intel HD Graphics BR-1006-0364
+Intel HD Graphics BR-1006-0365
+Intel HD Graphics BR-1006-0366
+Intel HD Graphics BR-1007-02G4
+Intel HD Graphics BR-1101-04SY
+Intel HD Graphics BR-1101-04SZ
+Intel HD Graphics BR-1101-04T0
+Intel HD Graphics BR-1101-04T9
+Intel HD Graphics Family
+Intel HD Graphics Family BR-1012-00Y8
+Intel HD Graphics Family BR-1012-00YF
+Intel HD Graphics Family BR-1012-00ZD
+Intel HD Graphics Family BR-1102-00ML
+Intel Inc. Intel GMA 900 OpenGL Engine
+Intel Inc. Intel GMA 950 OpenGL Engine
+Intel Inc. Intel GMA X3100 OpenGL Engine
+Intel Inc. Intel HD Graphics 3000 OpenGL Engine
+Intel Inc. Intel HD Graphics OpenGL Engine
+Intel Inc. Intel HD xxxx OpenGL Engine
+Intel Intel 845G
+Intel Intel 855GM
+Intel Intel 865G
+Intel Intel 915G
+Intel Intel 915GM
+Intel Intel 945G
+Intel Intel 945GM
+Intel Intel 965/963 Graphics Media Accelerator
+Intel Intel Bear Lake B
+Intel Intel Broadwater G
+Intel Intel Brookdale-G
+Intel Intel Calistoga
+Intel Intel Cantiga
+Intel Intel Eaglelake
+Intel Intel Grantsdale-G
+Intel Intel HD Graphics 3000
+Intel Intel Lakeport
+Intel Intel Montara-GM
+Intel Intel Pineview Platform
+Intel Intel Springdale-G
+Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1)
+Intel Mobile 4 Series
+Intel Mobile 4 Series Express Chipset Family
+Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1)
+Intel Mobile HD Graphics
+Intel Mobile SandyBridge HD Graphics
+Intel Montara
+Intel Pineview
+Intel Q45/Q43 Express Chipset
+Intel Royal BNA Driver
+Intel SandyBridge HD Graphics
+Intel SandyBridge HD Graphics BR-1006-00V8
+Intel Springdale
+Intel X3100
+Intergraph wcgdrv 06.05.06.18
+Intergraph wcgdrv 06.06.00.35
+LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk
+LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk
+Linden Lab Headless
+Matrox
+Mesa
+Mesa Project Software Rasterizer
+NVIDIA /PCI/SSE2
+NVIDIA /PCI/SSE2/3DNOW!
+NVIDIA 205
+NVIDIA 210
+NVIDIA 310
+NVIDIA 310M
+NVIDIA 315
+NVIDIA 315M
+NVIDIA 320M
+NVIDIA C51
+NVIDIA D10M2-20/PCI/SSE2
+NVIDIA D10P1-25/PCI/SSE2
+NVIDIA D10P1-30/PCI/SSE2
+NVIDIA D10P2-50/PCI/SSE2
+NVIDIA D11M2-30/PCI/SSE2
+NVIDIA D12-P1-35/PCI/SSE2
+NVIDIA D12U-15/PCI/SSE2
+NVIDIA D13M1-40/PCI/SSE2
+NVIDIA D13P1-40/PCI/SSE2
+NVIDIA D13U-10/PCI/SSE2
+NVIDIA D13U/PCI/SSE2
+NVIDIA D9M
+NVIDIA D9M-20/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2
+NVIDIA Entry Graphics/PCI/SSE2/3DNOW!
+NVIDIA G 102M
+NVIDIA G 103M
+NVIDIA G 105M
+NVIDIA G 110M
+NVIDIA G100
+NVIDIA G102M
+NVIDIA G103M
+NVIDIA G105M
+NVIDIA G210
+NVIDIA G210M
+NVIDIA G70/PCI/SSE2
+NVIDIA G72
+NVIDIA G73
+NVIDIA G84
+NVIDIA G86
+NVIDIA G92
+NVIDIA G92-200/PCI/SSE2
+NVIDIA G94
+NVIDIA G96/PCI/SSE2
+NVIDIA G98/PCI/SSE2
+NVIDIA GT 120
+NVIDIA GT 130
+NVIDIA GT 130M
+NVIDIA GT 140
+NVIDIA GT 150
+NVIDIA GT 160M
+NVIDIA GT 220
+NVIDIA GT 220/PCI/SSE2
+NVIDIA GT 220/PCI/SSE2/3DNOW!
+NVIDIA GT 230
+NVIDIA GT 230M
+NVIDIA GT 240
+NVIDIA GT 240M
+NVIDIA GT 250M
+NVIDIA GT 260M
+NVIDIA GT 320
+NVIDIA GT 320M
+NVIDIA GT 330
+NVIDIA GT 330M
+NVIDIA GT 340
+NVIDIA GT 420
+NVIDIA GT 430
+NVIDIA GT 440
+NVIDIA GT 450
+NVIDIA GT 520
+NVIDIA GT 540
+NVIDIA GT 540M
+NVIDIA GT-120
+NVIDIA GT200/PCI/SSE2
+NVIDIA GTS 150
+NVIDIA GTS 240
+NVIDIA GTS 250
+NVIDIA GTS 350M
+NVIDIA GTS 360
+NVIDIA GTS 360M
+NVIDIA GTS 450
+NVIDIA GTX 260
+NVIDIA GTX 260M
+NVIDIA GTX 270
+NVIDIA GTX 280
+NVIDIA GTX 285
+NVIDIA GTX 290
+NVIDIA GTX 460
+NVIDIA GTX 460M
+NVIDIA GTX 465
+NVIDIA GTX 470
+NVIDIA GTX 470M
+NVIDIA GTX 480
+NVIDIA GTX 480M
+NVIDIA GTX 550 Ti
+NVIDIA GTX 560
+NVIDIA GTX 560 Ti
+NVIDIA GTX 570
+NVIDIA GTX 580
+NVIDIA GTX 590
+NVIDIA GeForce
+NVIDIA GeForce 2
+NVIDIA GeForce 205/PCI/SSE2
+NVIDIA GeForce 210
+NVIDIA GeForce 210/PCI/SSE2
+NVIDIA GeForce 210/PCI/SSE2/3DNOW!
+NVIDIA GeForce 3
+NVIDIA GeForce 305M/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2
+NVIDIA GeForce 310/PCI/SSE2/3DNOW!
+NVIDIA GeForce 310M/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2
+NVIDIA GeForce 315/PCI/SSE2/3DNOW!
+NVIDIA GeForce 315M/PCI/SSE2
+NVIDIA GeForce 320M/PCI/SSE2
+NVIDIA GeForce 4 Go
+NVIDIA GeForce 4 MX
+NVIDIA GeForce 4 Ti
+NVIDIA GeForce 405/PCI/SSE2
+NVIDIA GeForce 6100
+NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2
+NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150/PCI/SSE2
+NVIDIA GeForce 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2
+NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200
+NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW!
+NVIDIA GeForce 6200 A-LE/AGP/SSE2
+NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6200 LE/PCI/SSE2
+NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2
+NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200/AGP/SSE/3DNOW!
+NVIDIA GeForce 6200/AGP/SSE2
+NVIDIA GeForce 6200/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6200/PCI/SSE/3DNOW!
+NVIDIA GeForce 6200/PCI/SSE2
+NVIDIA GeForce 6200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6500
+NVIDIA GeForce 6500/PCI/SSE2
+NVIDIA GeForce 6600
+NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW!
+NVIDIA GeForce 6600 GT/AGP/SSE2
+NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW!
+NVIDIA GeForce 6600 GT/PCI/SSE2
+NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6600 LE/PCI/SSE2
+NVIDIA GeForce 6600/AGP/SSE/3DNOW!
+NVIDIA GeForce 6600/AGP/SSE2
+NVIDIA GeForce 6600/AGP/SSE2/3DNOW!
+NVIDIA GeForce 6600/PCI/SSE2
+NVIDIA GeForce 6600/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6700
+NVIDIA GeForce 6800
+NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 6800 GT/AGP/SSE2
+NVIDIA GeForce 6800 GT/PCI/SSE2
+NVIDIA GeForce 6800 XT/AGP/SSE2
+NVIDIA GeForce 6800 XT/PCI/SSE2
+NVIDIA GeForce 6800/PCI/SSE2
+NVIDIA GeForce 6800/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7000
+NVIDIA GeForce 7000M
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2
+NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2
+NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2
+NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2
+NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7100
+NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2
+NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2
+NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2
+NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300
+NVIDIA GeForce 7300 GS/PCI/SSE2
+NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 GT/AGP/SSE2
+NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW!
+NVIDIA GeForce 7300 GT/PCI/SSE2
+NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 LE/PCI/SSE2
+NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2
+NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7300 SE/PCI/SSE2
+NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7350 LE/PCI/SSE2
+NVIDIA GeForce 7500
+NVIDIA GeForce 7500 LE/PCI/SSE2
+NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7600
+NVIDIA GeForce 7600 GS/AGP/SSE2
+NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW!
+NVIDIA GeForce 7600 GS/PCI/SSE2
+NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW!
+NVIDIA GeForce 7600 GT/AGP/SSE2
+NVIDIA GeForce 7600 GT/PCI/SSE2
+NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7650 GS/PCI/SSE2
+NVIDIA GeForce 7800
+NVIDIA GeForce 7800 GS/AGP/SSE2
+NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW!
+NVIDIA GeForce 7800 GT/PCI/SSE2
+NVIDIA GeForce 7800 GTX/PCI/SSE2
+NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900
+NVIDIA GeForce 7900 GS/PCI/SSE2
+NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GT/GTO/PCI/SSE2
+NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 7900 GTX/PCI/SSE2
+NVIDIA GeForce 7950 GT/PCI/SSE2
+NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8100
+NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200
+NVIDIA GeForce 8200/PCI/SSE2
+NVIDIA GeForce 8200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8200M
+NVIDIA GeForce 8200M G/PCI/SSE2
+NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8300
+NVIDIA GeForce 8300 GS/PCI/SSE2
+NVIDIA GeForce 8400
+NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW!
+NVIDIA GeForce 8400 GS/PCI/SSE2
+NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400GS/PCI/SSE2
+NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M
+NVIDIA GeForce 8400M G/PCI/SSE2
+NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M GS/PCI/SSE2
+NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8400M GT/PCI/SSE2
+NVIDIA GeForce 8500
+NVIDIA GeForce 8500 GT/PCI/SSE2
+NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600
+NVIDIA GeForce 8600 GS/PCI/SSE2
+NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600 GT/PCI/SSE2
+NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600 GTS/PCI/SSE2
+NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600GS/PCI/SSE2
+NVIDIA GeForce 8600M
+NVIDIA GeForce 8600M GS/PCI/SSE2
+NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8600M GT/PCI/SSE2
+NVIDIA GeForce 8700
+NVIDIA GeForce 8700M
+NVIDIA GeForce 8700M GT/PCI/SSE2
+NVIDIA GeForce 8800
+NVIDIA GeForce 8800 GS/PCI/SSE2
+NVIDIA GeForce 8800 GT/PCI/SSE2
+NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2
+NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8800 GTS/PCI/SSE2
+NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 8800 GTX/PCI/SSE2
+NVIDIA GeForce 8800 Ultra/PCI/SSE2
+NVIDIA GeForce 8800M GTS/PCI/SSE2
+NVIDIA GeForce 8800M GTX/PCI/SSE2
+NVIDIA GeForce 9100
+NVIDIA GeForce 9100/PCI/SSE2
+NVIDIA GeForce 9100/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9100M
+NVIDIA GeForce 9100M G/PCI/SSE2
+NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200
+NVIDIA GeForce 9200/PCI/SSE2
+NVIDIA GeForce 9200/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9200M GE/PCI/SSE2
+NVIDIA GeForce 9200M GS/PCI/SSE2
+NVIDIA GeForce 9300
+NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2
+NVIDIA GeForce 9300 GE/PCI/SSE2
+NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300 GS/PCI/SSE2
+NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300 SE/PCI/SSE2
+NVIDIA GeForce 9300M
+NVIDIA GeForce 9300M G/PCI/SSE2
+NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9300M GS/PCI/SSE2
+NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9400
+NVIDIA GeForce 9400 GT/PCI/SSE2
+NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9400/PCI/SSE2
+NVIDIA GeForce 9400M
+NVIDIA GeForce 9400M G/PCI/SSE2
+NVIDIA GeForce 9400M/PCI/SSE2
+NVIDIA GeForce 9500
+NVIDIA GeForce 9500 GS/PCI/SSE2
+NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9500 GT/PCI/SSE2
+NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9500M
+NVIDIA GeForce 9500M GS/PCI/SSE2
+NVIDIA GeForce 9600
+NVIDIA GeForce 9600 GS/PCI/SSE2
+NVIDIA GeForce 9600 GSO 512/PCI/SSE2
+NVIDIA GeForce 9600 GSO/PCI/SSE2
+NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600 GT/PCI/SSE2
+NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9600M
+NVIDIA GeForce 9600M GS/PCI/SSE2
+NVIDIA GeForce 9600M GT/PCI/SSE2
+NVIDIA GeForce 9650M GT/PCI/SSE2
+NVIDIA GeForce 9700M
+NVIDIA GeForce 9700M GT/PCI/SSE2
+NVIDIA GeForce 9700M GTS/PCI/SSE2
+NVIDIA GeForce 9800
+NVIDIA GeForce 9800 GT/PCI/SSE2
+NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9800 GTX+/PCI/SSE2
+NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW!
+NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2
+NVIDIA GeForce 9800 GTX/PCI/SSE2
+NVIDIA GeForce 9800 GX2/PCI/SSE2
+NVIDIA GeForce 9800M
+NVIDIA GeForce 9800M GS/PCI/SSE2
+NVIDIA GeForce 9800M GT/PCI/SSE2
+NVIDIA GeForce 9800M GTS/PCI/SSE2
+NVIDIA GeForce FX 5100
+NVIDIA GeForce FX 5100/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5200
+NVIDIA GeForce FX 5200/AGP/SSE
+NVIDIA GeForce FX 5200/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5200/AGP/SSE2
+NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5200/PCI/SSE2
+NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW!
+NVIDIA GeForce FX 5200LE/AGP/SSE2
+NVIDIA GeForce FX 5500
+NVIDIA GeForce FX 5500/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5500/AGP/SSE2
+NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5500/PCI/SSE2
+NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW!
+NVIDIA GeForce FX 5600
+NVIDIA GeForce FX 5600/AGP/SSE2
+NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW!
+NVIDIA GeForce FX 5700
+NVIDIA GeForce FX 5700/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5700LE/AGP/SSE
+NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW!
+NVIDIA GeForce FX 5800
+NVIDIA GeForce FX 5900
+NVIDIA GeForce FX 5900/AGP/SSE2
+NVIDIA GeForce FX 5900XT/AGP/SSE2
+NVIDIA GeForce FX Go5100
+NVIDIA GeForce FX Go5100/AGP/SSE2
+NVIDIA GeForce FX Go5200
+NVIDIA GeForce FX Go5200/AGP/SSE2
+NVIDIA GeForce FX Go5300
+NVIDIA GeForce FX Go5600
+NVIDIA GeForce FX Go5600/AGP/SSE2
+NVIDIA GeForce FX Go5650/AGP/SSE2
+NVIDIA GeForce FX Go5700
+NVIDIA GeForce FX Go5xxx/AGP/SSE2
+NVIDIA GeForce G 103M/PCI/SSE2
+NVIDIA GeForce G 105M/PCI/SSE2
+NVIDIA GeForce G 110M/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2
+NVIDIA GeForce G100/PCI/SSE2/3DNOW!
+NVIDIA GeForce G102M/PCI/SSE2
+NVIDIA GeForce G105M/PCI/SSE2
+NVIDIA GeForce G200/PCI/SSE2
+NVIDIA GeForce G205M/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2
+NVIDIA GeForce G210/PCI/SSE2/3DNOW!
+NVIDIA GeForce G210M/PCI/SSE2
+NVIDIA GeForce G310M/PCI/SSE2
+NVIDIA GeForce GT 120/PCI/SSE2
+NVIDIA GeForce GT 120/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 120M/PCI/SSE2
+NVIDIA GeForce GT 130M/PCI/SSE2
+NVIDIA GeForce GT 140/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2
+NVIDIA GeForce GT 220/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 220M/PCI/SSE2
+NVIDIA GeForce GT 230/PCI/SSE2
+NVIDIA GeForce GT 230M/PCI/SSE2
+NVIDIA GeForce GT 240
+NVIDIA GeForce GT 240/PCI/SSE2
+NVIDIA GeForce GT 240/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 240M/PCI/SSE2
+NVIDIA GeForce GT 320/PCI/SSE2
+NVIDIA GeForce GT 320M/PCI/SSE2
+NVIDIA GeForce GT 325M/PCI/SSE2
+NVIDIA GeForce GT 330/PCI/SSE2
+NVIDIA GeForce GT 330/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 330M/PCI/SSE2
+NVIDIA GeForce GT 335M/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2
+NVIDIA GeForce GT 340/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 415M/PCI/SSE2
+NVIDIA GeForce GT 420/PCI/SSE2
+NVIDIA GeForce GT 420M/PCI/SSE2
+NVIDIA GeForce GT 425M/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2
+NVIDIA GeForce GT 430/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 435M/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2
+NVIDIA GeForce GT 440/PCI/SSE2/3DNOW!
+NVIDIA GeForce GT 445M/PCI/SSE2
+NVIDIA GeForce GT 520M/PCI/SSE2
+NVIDIA GeForce GT 525M/PCI/SSE2
+NVIDIA GeForce GT 540M/PCI/SSE2
+NVIDIA GeForce GT 550M/PCI/SSE2
+NVIDIA GeForce GT 555M/PCI/SSE2
+NVIDIA GeForce GTS 150/PCI/SSE2
+NVIDIA GeForce GTS 160M/PCI/SSE2
+NVIDIA GeForce GTS 240/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2
+NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 250M/PCI/SSE2
+NVIDIA GeForce GTS 350M/PCI/SSE2
+NVIDIA GeForce GTS 360M/PCI/SSE2
+NVIDIA GeForce GTS 450/PCI/SSE2
+NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTS 455/PCI/SSE2
+NVIDIA GeForce GTX 260/PCI/SSE2
+NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 260M/PCI/SSE2
+NVIDIA GeForce GTX 275/PCI/SSE2
+NVIDIA GeForce GTX 280
+NVIDIA GeForce GTX 280/PCI/SSE2
+NVIDIA GeForce GTX 280M/PCI/SSE2
+NVIDIA GeForce GTX 285/PCI/SSE2
+NVIDIA GeForce GTX 295/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2
+NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460/PCI/SSE2
+NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 460M/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2
+NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 470/PCI/SSE2
+NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 480/PCI/SSE2
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2
+NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2
+NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 560/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2
+NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580/PCI/SSE2
+NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW!
+NVIDIA GeForce GTX 580M/PCI/SSE2
+NVIDIA GeForce GTX 590/PCI/SSE2
+NVIDIA GeForce Go 6
+NVIDIA GeForce Go 6100
+NVIDIA GeForce Go 6100/PCI/SSE2
+NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6150/PCI/SSE2
+NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 6200
+NVIDIA GeForce Go 6200/PCI/SSE2
+NVIDIA GeForce Go 6400
+NVIDIA GeForce Go 6400/PCI/SSE2
+NVIDIA GeForce Go 6600
+NVIDIA GeForce Go 6600/PCI/SSE2
+NVIDIA GeForce Go 6800
+NVIDIA GeForce Go 6800 Ultra/PCI/SSE2
+NVIDIA GeForce Go 6800/PCI/SSE2
+NVIDIA GeForce Go 7200
+NVIDIA GeForce Go 7200/PCI/SSE2
+NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7300
+NVIDIA GeForce Go 7300/PCI/SSE2
+NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7400
+NVIDIA GeForce Go 7400/PCI/SSE2
+NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7600
+NVIDIA GeForce Go 7600/PCI/SSE2
+NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW!
+NVIDIA GeForce Go 7700
+NVIDIA GeForce Go 7800
+NVIDIA GeForce Go 7800 GTX/PCI/SSE2
+NVIDIA GeForce Go 7900
+NVIDIA GeForce Go 7900 GS/PCI/SSE2
+NVIDIA GeForce Go 7900 GTX/PCI/SSE2
+NVIDIA GeForce Go 7950 GTX/PCI/SSE2
+NVIDIA GeForce PCX
+NVIDIA GeForce2 GTS/AGP/SSE
+NVIDIA GeForce2 MX/AGP/3DNOW!
+NVIDIA GeForce2 MX/AGP/SSE/3DNOW!
+NVIDIA GeForce2 MX/AGP/SSE2
+NVIDIA GeForce2 MX/PCI/SSE2
+NVIDIA GeForce3/AGP/SSE/3DNOW!
+NVIDIA GeForce3/AGP/SSE2
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2
+NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW!
+NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 460 Go/AGP/SSE2
+NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/AGP/SSE2
+NVIDIA GeForce4 MX 4000/PCI/3DNOW!
+NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW!
+NVIDIA GeForce4 MX 4000/PCI/SSE2
+NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW!
+NVIDIA GeForce4 MX 420/AGP/SSE2
+NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX 440/AGP/SSE2
+NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW!
+NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2
+NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW!
+NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE
+NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW!
+NVIDIA GeForce4 Ti 4400/AGP/SSE2
+NVIDIA Generic
+NVIDIA ION LE/PCI/SSE2
+NVIDIA ION/PCI/SSE2
+NVIDIA ION/PCI/SSE2/3DNOW!
+NVIDIA MCP61/PCI/SSE2
+NVIDIA MCP61/PCI/SSE2/3DNOW!
+NVIDIA MCP73/PCI/SSE2
+NVIDIA MCP79MH/PCI/SSE2
+NVIDIA MCP79MX/PCI/SSE2
+NVIDIA MCP7A-O/PCI/SSE2
+NVIDIA MCP7A-S/PCI/SSE2
+NVIDIA MCP89-EPT/PCI/SSE2
+NVIDIA N10M-GE1/PCI/SSE2
+NVIDIA N10P-GE1/PCI/SSE2
+NVIDIA N10P-GV2/PCI/SSE2
+NVIDIA N11M-GE1/PCI/SSE2
+NVIDIA N11M-GE2/PCI/SSE2
+NVIDIA N12E-GS-A1/PCI/SSE2
+NVIDIA NB9M-GE/PCI/SSE2
+NVIDIA NB9M-GE1/PCI/SSE2
+NVIDIA NB9M-GS/PCI/SSE2
+NVIDIA NB9M-NS/PCI/SSE2
+NVIDIA NB9P-GE1/PCI/SSE2
+NVIDIA NB9P-GS/PCI/SSE2
+NVIDIA NV17/AGP/3DNOW!
+NVIDIA NV17/AGP/SSE2
+NVIDIA NV34
+NVIDIA NV35
+NVIDIA NV36/AGP/SSE/3DNOW!
+NVIDIA NV36/AGP/SSE2
+NVIDIA NV41/PCI/SSE2
+NVIDIA NV43
+NVIDIA NV44
+NVIDIA NVIDIA GeForce 210 OpenGL Engine
+NVIDIA NVIDIA GeForce 320M OpenGL Engine
+NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine
+NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9400 OpenGL Engine
+NVIDIA NVIDIA GeForce 9400M OpenGL Engine
+NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine
+NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine
+NVIDIA NVIDIA GeForce GT 120 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 130 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 220 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 230M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 240M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 330M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 420M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 425M OpenGL Engine
+NVIDIA NVIDIA GeForce GT 430 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 440 OpenGL Engine
+NVIDIA NVIDIA GeForce GT 540M OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine
+NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine
+NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine
+NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine
+NVIDIA NVIDIA GeForce4 OpenGL Engine
+NVIDIA NVIDIA NV34MAP OpenGL Engine
+NVIDIA NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine
+NVIDIA NVS 2100M/PCI/SSE2
+NVIDIA NVS 300/PCI/SSE2
+NVIDIA NVS 3100M/PCI/SSE2
+NVIDIA NVS 4100/PCI/SSE2/3DNOW!
+NVIDIA NVS 4200M/PCI/SSE2
+NVIDIA NVS 5100M/PCI/SSE2
+NVIDIA PCI
+NVIDIA Quadro 2000/PCI/SSE2
+NVIDIA Quadro 4000
+NVIDIA Quadro 4000 OpenGL Engine
+NVIDIA Quadro 4000/PCI/SSE2
+NVIDIA Quadro 5000/PCI/SSE2
+NVIDIA Quadro 5000M/PCI/SSE2
+NVIDIA Quadro 600
+NVIDIA Quadro 600/PCI/SSE2
+NVIDIA Quadro 600/PCI/SSE2/3DNOW!
+NVIDIA Quadro 6000
+NVIDIA Quadro 6000/PCI/SSE2
+NVIDIA Quadro CX/PCI/SSE2
+NVIDIA Quadro DCC
+NVIDIA Quadro FX
+NVIDIA Quadro FX 1100/AGP/SSE2
+NVIDIA Quadro FX 1400/PCI/SSE2
+NVIDIA Quadro FX 1500
+NVIDIA Quadro FX 1500M/PCI/SSE2
+NVIDIA Quadro FX 1600M/PCI/SSE2
+NVIDIA Quadro FX 1700
+NVIDIA Quadro FX 1700M/PCI/SSE2
+NVIDIA Quadro FX 1800
+NVIDIA Quadro FX 1800/PCI/SSE2
+NVIDIA Quadro FX 1800M/PCI/SSE2
+NVIDIA Quadro FX 2500M/PCI/SSE2
+NVIDIA Quadro FX 2700M/PCI/SSE2
+NVIDIA Quadro FX 2800M/PCI/SSE2
+NVIDIA Quadro FX 3400
+NVIDIA Quadro FX 3450
+NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2
+NVIDIA Quadro FX 3500
+NVIDIA Quadro FX 3500M/PCI/SSE2
+NVIDIA Quadro FX 360M/PCI/SSE2
+NVIDIA Quadro FX 370
+NVIDIA Quadro FX 370/PCI/SSE2
+NVIDIA Quadro FX 3700
+NVIDIA Quadro FX 3700M/PCI/SSE2
+NVIDIA Quadro FX 370M/PCI/SSE2
+NVIDIA Quadro FX 3800
+NVIDIA Quadro FX 3800M/PCI/SSE2
+NVIDIA Quadro FX 4500
+NVIDIA Quadro FX 4600
+NVIDIA Quadro FX 4800
+NVIDIA Quadro FX 4800/PCI/SSE2
+NVIDIA Quadro FX 560
+NVIDIA Quadro FX 5600
+NVIDIA Quadro FX 570
+NVIDIA Quadro FX 570/PCI/SSE2
+NVIDIA Quadro FX 570M/PCI/SSE2
+NVIDIA Quadro FX 580/PCI/SSE2
+NVIDIA Quadro FX 770M/PCI/SSE2
+NVIDIA Quadro FX 880M
+NVIDIA Quadro FX 880M/PCI/SSE2
+NVIDIA Quadro FX Go700/AGP/SSE2
+NVIDIA Quadro NVS
+NVIDIA Quadro NVS 110M/PCI/SSE2
+NVIDIA Quadro NVS 130M/PCI/SSE2
+NVIDIA Quadro NVS 135M/PCI/SSE2
+NVIDIA Quadro NVS 140M/PCI/SSE2
+NVIDIA Quadro NVS 150M/PCI/SSE2
+NVIDIA Quadro NVS 160M/PCI/SSE2
+NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW!
+NVIDIA Quadro NVS 285/PCI/SSE2
+NVIDIA Quadro NVS 290/PCI/SSE2
+NVIDIA Quadro NVS 295/PCI/SSE2
+NVIDIA Quadro NVS 320M/PCI/SSE2
+NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2
+NVIDIA Quadro NVS/PCI/SSE2
+NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW!
+NVIDIA Quadro VX 200/PCI/SSE2
+NVIDIA Quadro/AGP/SSE2
+NVIDIA Quadro2
+NVIDIA Quadro4
+NVIDIA RIVA TNT
+NVIDIA RIVA TNT2/AGP/SSE2
+NVIDIA RIVA TNT2/PCI/3DNOW!
+NVIDIA nForce
+NVIDIA unknown board/AGP/SSE2
+NVIDIA unknown board/PCI/SSE2
+NVIDIA unknown board/PCI/SSE2/3DNOW!
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine
+Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine
+Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com
+Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine
+Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine
+Radeon RV350 on Gallium
+S3
+S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D
+S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE
+S3 Graphics, Incorporated ProSavage/Twister
+S3 Graphics, Incorporated S3 Graphics Chrome9 HC
+S3 Graphics, Incorporated S3 Graphics DeltaChrome
+S3 Graphics, Incorporated VIA Chrome9 HC IGP
+SiS
+SiS 661 VGA
+SiS 662 VGA
+SiS 741 VGA
+SiS 760 VGA
+SiS 761GX VGA
+SiS Mirage Graphics3
+Trident
+Tungsten Graphics
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945G
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT
+Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME  x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME 20061017
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT
+Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT
+Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2
+Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2
+VIA
+VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE;
+VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM)
+VMware, Inc. Gallium 0.4 on llvmpipe
+VMware, Inc. Gallium 0.4 on softpipe
+X.Org Gallium 0.4 on AMD BARTS
+X.Org Gallium 0.4 on AMD CEDAR
+X.Org Gallium 0.4 on AMD HEMLOCK
+X.Org Gallium 0.4 on AMD JUNIPER
+X.Org Gallium 0.4 on AMD REDWOOD
+X.Org Gallium 0.4 on AMD RS780
+X.Org Gallium 0.4 on AMD RS880
+X.Org Gallium 0.4 on AMD RV610
+X.Org Gallium 0.4 on AMD RV620
+X.Org Gallium 0.4 on AMD RV630
+X.Org Gallium 0.4 on AMD RV635
+X.Org Gallium 0.4 on AMD RV710
+X.Org Gallium 0.4 on AMD RV730
+X.Org Gallium 0.4 on AMD RV740
+X.Org Gallium 0.4 on AMD RV770
+X.Org R300 Project Gallium 0.4 on ATI R300
+X.Org R300 Project Gallium 0.4 on ATI R580
+X.Org R300 Project Gallium 0.4 on ATI RC410
+X.Org R300 Project Gallium 0.4 on ATI RS482
+X.Org R300 Project Gallium 0.4 on ATI RS600
+X.Org R300 Project Gallium 0.4 on ATI RS690
+X.Org R300 Project Gallium 0.4 on ATI RV350
+X.Org R300 Project Gallium 0.4 on ATI RV370
+X.Org R300 Project Gallium 0.4 on ATI RV410
+X.Org R300 Project Gallium 0.4 on ATI RV515
+X.Org R300 Project Gallium 0.4 on ATI RV530
+X.Org R300 Project Gallium 0.4 on ATI RV570
+X.Org R300 Project Gallium 0.4 on R420
+X.Org R300 Project Gallium 0.4 on R580
+X.Org R300 Project Gallium 0.4 on RC410
+X.Org R300 Project Gallium 0.4 on RS480
+X.Org R300 Project Gallium 0.4 on RS482
+X.Org R300 Project Gallium 0.4 on RS600
+X.Org R300 Project Gallium 0.4 on RS690
+X.Org R300 Project Gallium 0.4 on RS740
+X.Org R300 Project Gallium 0.4 on RV350
+X.Org R300 Project Gallium 0.4 on RV370
+X.Org R300 Project Gallium 0.4 on RV410
+X.Org R300 Project Gallium 0.4 on RV515
+X.Org R300 Project Gallium 0.4 on RV530
+XGI
+nouveau Gallium 0.4 on NV34
+nouveau Gallium 0.4 on NV36
+nouveau Gallium 0.4 on NV46
+nouveau Gallium 0.4 on NV49
+nouveau Gallium 0.4 on NV4A
+nouveau Gallium 0.4 on NV4B
+nouveau Gallium 0.4 on NV4E
+nouveau Gallium 0.4 on NV50
+nouveau Gallium 0.4 on NV84
+nouveau Gallium 0.4 on NV86
+nouveau Gallium 0.4 on NV92
+nouveau Gallium 0.4 on NV94
+nouveau Gallium 0.4 on NV96
+nouveau Gallium 0.4 on NV98
+nouveau Gallium 0.4 on NVA0
+nouveau Gallium 0.4 on NVA3
+nouveau Gallium 0.4 on NVA5
+nouveau Gallium 0.4 on NVA8
+nouveau Gallium 0.4 on NVAA
+nouveau Gallium 0.4 on NVAC
diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp
index 9a6e08ee840e3adb99a024f3b74561dae119961e..ed66066b0ad840f97dc044d79c2b9396b0dac239 100644
--- a/indra/newview/tests/llremoteparcelrequest_test.cpp
+++ b/indra/newview/tests/llremoteparcelrequest_test.cpp
@@ -35,7 +35,6 @@
 #include "llurlentry.h"
 
 namespace {
-	LLControlGroup s_saved_settings("dummy_settings");
 	const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111");
 }
 
@@ -64,13 +63,12 @@ LLMessageSystem * gMessageSystem;
 char const* const _PREHASH_AgentID = 0;   // never dereferenced during this test
 char const* const _PREHASH_AgentData = 0; // never dereferenced during this test
 LLAgent gAgent;
-LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { }
+LLAgent::LLAgent() : mAgentAccess(NULL) { }
 LLAgent::~LLAgent() { }
 void LLAgent::sendReliableMessage(void) { }
 LLUUID gAgentSessionID;
 LLUUID gAgentID;
 LLUIColor::LLUIColor(void) { }
-LLAgentAccess::LLAgentAccess(LLControlGroup & settings) : mSavedSettings(settings) { }
 LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }
 LLControlGroup::~LLControlGroup(void) { }
 void LLUrlEntryParcel::processParcelInfo(const LLUrlEntryParcel::LLParcelData& parcel_data) { }
diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp
index b425b50c8bd36a2be38d959b586c880bdb867ceb..710881d81124587d8dcb5512a030732880b87c8b 100644
--- a/indra/newview/tests/llviewerhelputil_test.cpp
+++ b/indra/newview/tests/llviewerhelputil_test.cpp
@@ -73,11 +73,9 @@ static void substitute_string(std::string &input, const std::string &search, con
 }
 
 #include "../llagent.h"
-LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { }
+LLAgent::LLAgent() : mAgentAccess(NULL) { }
 LLAgent::~LLAgent() { }
 bool LLAgent::isGodlike() const { return FALSE; }
-LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { }
-LLUIColor::LLUIColor() {}
 
 LLAgent gAgent;
 
diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp
index 4d5df1043ecfbc27ca1498386fc5f98b1fb26e1e..711c2a3d51a908ba9a18316556c49f643d1c1960 100644
--- a/indra/newview/tests/llxmlrpclistener_test.cpp
+++ b/indra/newview/tests/llxmlrpclistener_test.cpp
@@ -40,8 +40,10 @@
 #include "llevents.h"
 #include "lleventfilter.h"
 #include "llsd.h"
+#include "llhost.h"
 #include "llcontrol.h"
 #include "tests/wrapllerrs.h"
+#include "tests/commtest.h"
 
 LLControlGroup gSavedSettings("Global");
 
@@ -54,7 +56,8 @@ namespace tut
     {
         data():
             pumps(LLEventPumps::instance()),
-            uri("http://127.0.0.1:8000")
+            uri(std::string("http://") +
+                LLHost("127.0.0.1", commtest_data::getport("PORT")).getString())
         {
             // These variables are required by machinery used by
             // LLXMLRPCTransaction. The values reflect reality for this test
@@ -145,7 +148,7 @@ namespace tut
         pumps.obtain("LLXMLRPCTransaction").post(request);
         // Set the timer
         F32 timeout(10);
-        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
         // and pump "mainloop" until we get something, whether from
         // LLXMLRPCListener or from the watchdog filter.
         LLTimer timer;
@@ -182,7 +185,7 @@ namespace tut
         pumps.obtain("LLXMLRPCTransaction").post(request);
         // Set the timer
         F32 timeout(10);
-        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
         // and pump "mainloop" until we get something, whether from
         // LLXMLRPCListener or from the watchdog filter.
         LLTimer timer;
@@ -218,7 +221,7 @@ namespace tut
         pumps.obtain("LLXMLRPCTransaction").post(request);
         // Set the timer
         F32 timeout(10);
-        watchdog.eventAfter(timeout, LLSD().insert("timeout", 0));
+        watchdog.eventAfter(timeout, LLSD().with("timeout", 0));
         // and pump "mainloop" until we get something, whether from
         // LLXMLRPCListener or from the watchdog filter.
         LLTimer timer;
diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py
index 1c7204a6b639cad20ee9761709be0095f632f1fe..281b72a058fde3d9ad9bc5a2092c81116d052dca 100644
--- a/indra/newview/tests/test_llxmlrpc_peer.py
+++ b/indra/newview/tests/test_llxmlrpc_peer.py
@@ -37,7 +37,7 @@
 mydir = os.path.dirname(__file__)       # expected to be .../indra/newview/tests/
 sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "lib", "python"))
 sys.path.insert(1, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests"))
-from testrunner import run, debug
+from testrunner import freeport, run, debug
 
 class TestServer(SimpleXMLRPCServer):
     def _dispatch(self, method, params):
@@ -66,11 +66,16 @@ def log_error(self, format, *args):
         # Suppress error output as well
         pass
 
-class ServerRunner(Thread):
-    def run(self):
-        server = TestServer(('127.0.0.1', 8000))
-        debug("Starting XMLRPC server...\n")
-        server.serve_forever()
-
 if __name__ == "__main__":
-    sys.exit(run(server=ServerRunner(name="xmlrpc"), *sys.argv[1:]))
+    # Instantiate a TestServer on the first free port in the specified port
+    # range. Doing this inline is better than in a daemon thread: if it blows
+    # up here, we'll get a traceback. If it blew up in some other thread, the
+    # traceback would get eaten and we'd run the subject test program anyway.
+    xmlrpcd, port = freeport(xrange(8000, 8020),
+                             lambda port: TestServer(('127.0.0.1', port)))
+    # Pass the selected port number to the subject test program via the
+    # environment. We don't want to impose requirements on the test program's
+    # command-line parsing -- and anyway, for C++ integration tests, that's
+    # performed in TUT code rather than our own.
+    os.environ["PORT"] = str(port)
+    sys.exit(run(server=Thread(name="xmlrpc", target=xmlrpcd.serve_forever), *sys.argv[1:]))
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index a04b4a9ca0c4121a6672b6a65c2a4b1da8902b3c..8aa94616d67bc7835de696246e538107e9037192 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -114,6 +114,16 @@ def construct(self):
             # Files in the newview/ directory
             self.path("gpu_table.txt")
 
+            # The summary.json file gets left in the base checkout dir by
+            # build.sh. It's only created for a build.sh build, therefore we
+            # have to check whether it exists.  :-P
+            summary_json = "summary.json"
+            summary_json_path = os.path.join(os.pardir, os.pardir, summary_json)
+            if os.path.exists(os.path.join(self.get_src_prefix(), summary_json_path)):
+                self.path(summary_json_path, summary_json)
+            else:
+                print "No %s" % os.path.join(self.get_src_prefix(), summary_json_path)
+
     def login_channel(self):
         """Channel reported for login and upgrade purposes ONLY;
         used for A/B testing"""
diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt
index fe64926da6c9cc03f47fe732788607ac83cc5f97..7720619df3017a718a3ba393f086fbb67d8db768 100644
--- a/indra/viewer_components/login/CMakeLists.txt
+++ b/indra/viewer_components/login/CMakeLists.txt
@@ -9,13 +9,11 @@ endif(LL_TESTS)
 include(LLCommon)
 include(LLMath)
 include(LLXML)
-include(Pth)
 
 include_directories(
     ${LLCOMMON_INCLUDE_DIRS}
     ${LLMATH_INCLUDE_DIRS}
     ${LLXML_INCLUDE_DIRS}
-    ${PTH_INCLUDE_DIRS}
     )
 
 set(login_SOURCE_FILES
@@ -42,7 +40,6 @@ target_link_libraries(lllogin
     ${LLCOMMON_LIBRARIES}
     ${LLMATH_LIBRARIES}
     ${LLXML_LIBRARIES}
-    ${PTH_LIBRARIES}
     )
 
 if(LL_TESTS)
@@ -50,11 +47,5 @@ if(LL_TESTS)
       lllogin.cpp
       )
 
-  set_source_files_properties(
-    lllogin.cpp
-    PROPERTIES
-      LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}"
-    )
-
   LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}")
 endif(LL_TESTS)
diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
index 88ab5a22845fe1b774dce553b4eb3c049d918ea6..e19d5724f172b5bdc552d2243007611b285076e6 100644
--- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
+++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
@@ -59,12 +59,6 @@ class LLDir_Mock : public LLDir
 		return 0;
 	}
 
-	BOOL getNextFileInDir(const std::string &dirname, 
-						  const std::string &mask, 
-						  std::string &fname) 
-	{
-		return false;
-	}
 	void getRandomFileInDir(const std::string &dirname, 
 							const std::string &mask, 
 							std::string &fname) {}
diff --git a/install.xml b/install.xml
index 9658a4195a52198ec12a7a133961eb8ab1ad3004..889386b336c1a658b38dd4ee7b2a47ea0aaae3c0 100644
--- a/install.xml
+++ b/install.xml
@@ -1252,53 +1252,6 @@ anguage Infrstructure (CLI) international standard</string>
           </map>
         </map>
       </map>
-      <key>pth</key>
-      <map>
-        <key>copyright</key>
-        <string>Copyright (c) 1999-2006 Ralf S. Engelschall &lt;rse@gnu.org&gt;</string>
-        <key>description</key>
-        <string>Portable cooperative threads package, used to support Boost.Coroutine on Mac OS X 10.4</string>
-        <key>license</key>
-        <string>lgpl</string>
-        <key>packages</key>
-        <map>
-          <key>darwin</key>
-          <map>
-            <key>md5sum</key>
-            <string>216cb6217a06c64dfae30a55ab8b975c</string>
-            <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-darwin-20090923.tar.bz2</uri>
-          </map>
-          <key>linux</key>
-          <map>
-            <key>md5sum</key>
-            <string>c5c2f73847c126e679d925beab48c7d4</string>
-            <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux-20090427.tar.bz2</uri>
-          </map>
-          <key>linux32</key>
-          <map>
-            <key>md5sum</key>
-            <string>c5c2f73847c126e679d925beab48c7d4</string>
-            <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux32-20090427.tar.bz2</uri>
-          </map>
-          <key>linux64</key>
-          <map>
-            <key>md5sum</key>
-            <string>c5c2f73847c126e679d925beab48c7d4</string>
-            <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-linux64-20090427.tar.bz2</uri>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>md5sum</key>
-            <string>c5c2f73847c126e679d925beab48c7d4</string>
-            <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/pth-2.0.7-windows-20090427.tar.bz2</uri>
-          </map>
-        </map>
-      </map>
       <key>pulseaudio</key>
       <map>
         <key>copyright</key>
diff --git a/scripts/gpu_table_tester b/scripts/gpu_table_tester
new file mode 100644
index 0000000000000000000000000000000000000000..52b1c8f31dca293e14a213a5e73cec0d023e8028
--- /dev/null
+++ b/scripts/gpu_table_tester
@@ -0,0 +1,178 @@
+#!/usr/bin/perl
+## Checks entries in the indra/newview/gpu_table.txt file against sample data
+##
+## Copyright (c) 2011, Linden Research, Inc.
+##
+## Permission is hereby granted, free of charge, to any person obtaining a copy
+## of this software and associated documentation files (the "Software"), to deal
+## in the Software without restriction, including without limitation the rights
+## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+## copies of the Software, and to permit persons to whom the Software is
+## furnished to do so, subject to the following conditions:
+##
+## The above copyright notice and this permission notice shall be included in
+## all copies or substantial portions of the Software.
+##
+## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+## THE SOFTWARE.
+
+use English;
+use Getopt::Long;
+
+( $MyName = $0 ) =~ s|.*/||;
+my $mini_HELP = "
+  $MyName --gpu-table <gpu_table.txt> 
+          [ --unrecognized-only ]
+          [ --table-only ]
+          [ <gpu-strings-file> ...]
+  
+  Checks for duplicates and invalid lines in the gpu_table.txt file.
+
+  Unless the '--table-only' option is specified, it also tests the recognition of 
+  values in the gpu-strings-files (or standard input if no files are given).  
+
+  If the --unrecognized-only option is specified, then no output is produced for
+  values that are matched, otherwise a line is output for each input line that
+  describes the results of attempting to match the value on that line.
+";
+
+&GetOptions("help"              => \$Help,
+            "gpu-table=s"       => \$GpuTable,
+            "unrecognized-only" => \$UnrecognizedOnly,
+            "table-only"        => \$TableOnly
+    )
+    || die "$mini_HELP";
+
+if ($Help)
+{
+    print $mini_HELP;
+    exit 0;
+}
+
+$ErrorsSeen = 0;
+
+die "Must specify a --gpu-table <gpu_table.txt> value"
+    unless $GpuTable;
+
+open(GPUS, "<$GpuTable")
+    || die "Failed to open gpu table '$GpuTable':\n\t$!\n";
+
+# Parse the GPU table into these table, indexed by the name
+my %NameLine;       # name -> line number on which a given name was found (catches duplicate names)
+my %RecognizerLine; # name -> line number on which a given name was found (catches duplicate names)
+my %Name;           # recognizer -> name
+my %Recognizer;     # name -> recognizer
+my %Class;          # recognizer -> class
+my %Supported;      # recognizer -> supported
+my @InOrder;        # records the order of the recognizers
+
+$Name{'UNRECOGNIZED'}      = 'UNRECOGNIZED';
+$NameLine{'UNRECOGNIZED'}  = '(hard-coded)'; # use this for error messages in table parsing
+$Class{'UNRECOGNIZED'}     = '';
+$Supported{'UNRECOGNIZED'} = '';
+
+while (<GPUS>)
+{
+    next if m|^//|;    # skip comments
+    next if m|^\s*$|;  # skip blank lines
+
+    chomp;
+    my ($name, $regex, $class, $supported, $extra) = split('\t+');
+    my $errsOnLine = $ErrorsSeen;
+    if (!$name)
+    {
+        print STDERR "No name found on $GpuTable line $INPUT_LINE_NUMBER\n";
+        $ErrorsSeen++;
+    }
+    elsif ( defined $NameLine{$name} )
+    {
+        print STDERR "Duplicate name '$name' on $GpuTable lines $NameLine{$name} and $INPUT_LINE_NUMBER:\n";
+        print STDERR "     $NameLine{$name}: /$Recognizer{$name}/  $Supported{$Recognizer{$name}}  class $Class{$Recognizer{$name}}\n";
+        print STDERR "     $INPUT_LINE_NUMBER: /$regex/  " . ($supported ? "supported" : "unsupported") .  " class $class - ignored\n";
+        $ErrorsSeen++;
+    }
+    if (!$regex)
+    {
+        print STDERR "No recognizer found on $GpuTable line $INPUT_LINE_NUMBER\n";
+        $ErrorsSeen++;
+    }
+    elsif ( defined $RecognizerLine{$regex} )
+    {
+        print STDERR "Duplicate recognizer /$regex/ found on $GpuTable lines $RecognizerLine{$regex} and $INPUT_LINE_NUMBER (ignored)\n";
+        print STDERR "     $RecognizerLine{$regex}: name '$Name{$regex}'  $Supported{$regex}  class $Class{$regex}\n";
+        print STDERR "     $INPUT_LINE_NUMBER: name '$name'  " . ($supported ? "supported" : "unsupported") .  "  class $class - ignored\n";
+        $ErrorsSeen++;
+    }
+    if ($class !~ m/[0123]/)
+    {
+        print STDERR "Invalid class value '$class' on $GpuTable line $INPUT_LINE_NUMBER\n";
+        $ErrorsSeen++;
+    }
+    if ($supported !~ m/[0123]/)
+    {
+        print STDERR "Invalid supported value '$supported' on $GpuTable line $INPUT_LINE_NUMBER\n";
+        $ErrorsSeen++;
+    }
+    if ($extra)
+    {
+        print STDERR "Extra data '$extra' on $GpuTable line $INPUT_LINE_NUMBER\n";
+        $ErrorsSeen++;
+    }
+    
+    if ($errsOnLine == $ErrorsSeen) # no errors found on this line
+    {
+        push @InOrder,$regex;
+        $NameLine{$name} = $INPUT_LINE_NUMBER;
+        $RecognizerLine{$regex} = $INPUT_LINE_NUMBER;
+        $Name{$regex} = $name;
+        $Recognizer{$name} = $regex;
+        $Class{$regex} = $class;
+        $Supported{$regex} = $supported ? "supported" : "unsupported";
+    }
+}
+
+close GPUS;
+
+print STDERR "\n" if $ErrorsSeen;
+
+exit $ErrorsSeen if $TableOnly;
+
+my %RecognizedBy;
+while (<>)
+{
+    chomp;
+    my $recognizer;
+    $RecognizedBy{$_} = 'UNRECOGNIZED';
+    foreach $recognizer ( @InOrder ) # note early exit if recognized
+    {
+        if ( m/$recognizer/ )
+        {
+            $RecognizedBy{$_} = $recognizer;
+            last; # exit recognizer loop
+        }
+    }
+}
+
+## Print results. 
+## For each input, show supported or unsupported, the class, and the recognizer name
+format STDOUT_TOP =
+GPU String                                                                                               Supported?  Class  Recognizer
+------------------------------------------------------------------------------------------------------   ----------- -----  ------------------------------------
+.
+format STDOUT =
+@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...   @<<<<<<<<<<   @>   @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...
+$_, $Supported{$RecognizedBy{$_}},$Class{$RecognizedBy{$_}},$Name{$RecognizedBy{$_}}
+.
+
+foreach ( sort keys %RecognizedBy )
+{
+    write if ! $UnrecognizedOnly || $Name{$RecognizedBy{$_}} eq 'UNRECOGNIZED';
+    $-++; # suppresses pagination
+}
+
+exit $ErrorsSeen;