diff --git a/.hgtags b/.hgtags
index c614db0d3e6ab5e840e5da4ec22102591b78b4be..c892fcb28e800f4ad46772dbc8cd2acc9b7a12b1 100755
--- a/.hgtags
+++ b/.hgtags
@@ -248,31 +248,33 @@ bb9932a7a5fd00edf52d95f354e3b37ae6a942db DRTVWR-156
 6414ecdabc5d89515b08d1f872cf923ed3a5523a DRTVWR-148
 2a3965b3ad202df7ea25d2be689291bb14a1280e DRTVWR-155
 24a7281bef42bd4430ceb25db8b195449c2c7de3 DRTVWR-153
+a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
+9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
 5910f8063a7e1ddddf504c2f35ca831cc5e8f469 DRTVWR-160
 f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 3.3.3-beta1
 f0a174c2adb4bc39b16722a61d7eeb4f2a1d4843 DRTVWR-144
-2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164
+089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
 600f3b3920d94de805ac6dc8bb6def9c069dd360 DRTVWR-162
+c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
+2d6c0634b11e6f3df11002b8510a72a0433da00a DRTVWR-164
 80b5e5e9775966d3839331ffa7a16a60f9d7c930 DRTVWR-165
 fdcc08a4f20ae9bb060f4693c8980d216534efdf 3.3.3-beta2
 af5f3e43e6e4424b1da19d9e16f6b853a7b822ed DRTVWR-169
 4b3c68199a86cabaa5d9466d7b0f7e141e901d7a 3.3.3-beta3
 6428242e124b523813bfaf4c45b3d422f0298c81 3.3.3-release
-a716684aa7c07c440b1de5815b8a1f3dd3fd8bfb DRTVWR-159
-9a78ac13f047056f788c4734dd91aebfe30970e3 DRTVWR-157
-089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
-c08e2ac17a99973b2a94477659220b99b8847ae2 DRTVWR-163
 b9d0170b62eb1c7c3adaa37a0b13a833e5e659f9 DRTVWR-171
 050e48759337249130f684b4a21080b683f61732 DRTVWR-168
 09ef7fd1b0781f33b8a3a9af6236b7bcb4831910 DRTVWR-170
 f87bfbe0b62d26f451d02a47c80ebef6b9168fc2 DRTVWR-158
 f91d003091a61937a044652c4c674447f7dcbb7a 3.3.4-beta1
+005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
 bce218b2b45b730b22cc51e4807aa8b571cadef3 DRTVWR-173
 cbea6356ce9cb0c313b6777f10c5c14783264fcc DRTVWR-174
 82b5330bc8b17d0d4b598832e9c5a92e90075682 3.3.4-beta2
 57d221de3df94f90b55204313c2cef044a3c0ae2 DRTVWR-176
 eb539c65e6ee26eea2bf373af2d0f4b52dc91289 DRTVWR-177
 a8057e1b9a1246b434a27405be35e030f7d28b0c 3.3.4-beta3
+888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
 4281aa899fb2cedb7a9ca7ce91c5c29d4aa69594 DRTVWR-180
 5c08e1d8edd871807153603b690e3ee9dbb548aa DRTVWR-183
 6c75f220b103db1420919c8b635fe53e2177f318 3.3.4-beta4
@@ -283,24 +285,32 @@ ab2ffc547c8a8950ff187c4f6c95e5334fab597b 3.3.4-beta5
 7c9102fb998885621919f2474a002c35b583539b 3.3.4-release2
 8c9085066c78ed5f6c9379dc054c82a6fcdb1851 DRTVWR-207
 351eea5f9dc192fc5ddea3b02958de97677a0a12 3.3.4-release3
-005dfe5c4c377207d065fb27858d2eb0b53b143a DRTVWR-167
-888768f162d2c0a8de1dcc5fb9a08bd8bd120a6b DRTVWR-175
 a8b3eca451a9eaab59987efb0ab1c4217e3f2dcc DRTVWR-182
 1f27cdfdc54246484f8afbbe42ce48e954175cbd 3.4.0-beta1
-9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
+81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
 47f0d08ba7ade0a3905074009067c6d3df7e16ae DRTVWR-190
+cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
+c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
+9ee9387789701d597130f879d9011a4958753862 DRTVWR-189
 421126293dcbde918e0da027ca0ab9deb5b4fbf2 DRTVWR-192
+4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
 33a2fc7a910ae29ff8b4850316ed7fbff9f64d33 DRTVWR-195
 e9732c739c8a72a590216951505ea9c76a526a84 DRTVWR-193
+78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
 7602f61c804a512764e349c034c02ddabeefebc4 DRTVWR-196
 ae5c83dd61d2d37c45f1d5b8bf2b036d87599f1b DRTVWR-198
 507bdfbd6bf844a511c1ffeda4baa80016ed1346 DRTVWR-197
 b1dbb1a83f48f93f6f878cff9e52d2cb635e145c 3.4.0-beta2
 37402e2b19af970d51b0a814d79892cc5647532b DRTVWR-200
 182a9bf30e81070361bb020a78003b1cf398e79c 3.4.0-beta3
+248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203
 7649a3dff5ec22d3727377e5f02efd0f421e4cb5 DRTVWR-201
 84fb70dfe3444e75a44fb4bee43e2fc8221cebdd 3.4.0-beta4
+de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
 573e863be2f26d3687161def4b9fea9b7038dda8 3.4.0-beta5
+34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag
+6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205
+7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
 af7b28e75bd5a629cd9e0dc46fb3f1757626f493 DRTVWR-212
 015012c2b740ccdec8a8c3d6e5f898449ecfe0b8 DRTVWR-213
 62b07aa81b1957897c3846292bb9412977b0af6c 3.3.4-beta6
@@ -309,6 +319,7 @@ ceed0b65a69f1eac20d523e0203320a32f9a3f3c DRTVWR-215
 97977c67245f52db20eb15f1918cc0f24778cabc 3.4.0-release
 5adb2b8f96c3cac88ad7c7d996d707f1b29df336 3.4.1-beta1
 b3f74858a1c8720c82d0978f3877a3fc8ba459ec 3.4.1-beta1a
+b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
 2b779f233ee6f38c89cb921650c773a96e63da92 DRTVWR-220
 0b9d95f4bfb6867cbf56eaec51633b0da2f1262d DRTVWR-221
 e6e553761829dc0270eaaa712b7cb0622535b076 3.4.1-beta3
@@ -333,36 +344,31 @@ baf97f06ae17223614c5e31aa42e71d87cff07fe DRTVWR-236
 b2f21e3442542283a80e7eaebae9f833e5a927b6 DRTVWR-237
 3f9be82de642d468c5fc272cb9d96b46b5498402 3.4.1-beta12
 e59ffd3fe0838ae6b09b242a6e9df71761b88f41 3.4.1-release
-81f6b745ef27f5915fd07f988fdec9944f2bb73e DRTVWR-186
-cc953f00956be52cc64c30637bbeec310eea603f DRTVWR-181
-c04e68e1b0034fd0a20815ae24c77e5f8428e822 DRTVWR-188
-4b2c52aecb7a75de31dbb12d9f5b9a251d8707be DRTVWR-191
-78ca0bbf43a92e8914d4cfa87d69a6717ef7d4cf DRTVWR-194
-248f4acd92a706c79e842bc83d80baa7369c0c2e DRTVWR-203
-de3be913f68813a9bac7d1c671fef96d1159bcd6 DRTVWR-202
-34dbbe2b00afe90352d3acf8290eb10ab90d1c8b oz-build-test-tag
-6ee71714935ffcd159db3d4f5800c1929aac54e1 DRTVWR-205
-7b22c612fc756e0ea63b10b163e81d107f85dbf8 DRTVWR-206
-b61afe175b829c149d369524a4e974dfda99facf DRTVWR-219
 32896d5e920ca9a29256ff3b747c2e99752aa5ae DRTVWR-217
 704bbae7b182a1f2811a47a054e680522966f54a 3.4.2-beta1
+d799593b53ed733862e9a13871e318e886469377 DRTVWR-208
+e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223
 288539fc0408ed4b69a99665de33bbbc2c3c08fe DRTVWR-216
 e664473c16df1d82ffaff382e7b3e023da202d52 3.4.2-beta2
+93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
 0891d7a773a31397dcad48be3fa66531d567a821 DRTVWR-242
 710785535362b3cb801b6a3dc4703be3373bd0cd 3.4.2-beta3
-e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243
-73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4
-16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release
-d799593b53ed733862e9a13871e318e886469377 DRTVWR-208
-e497dcde7a3653e384eb223a8a460030e89c294c DRTVWR-223
-93ab02d83f51e30a3cabad98aff89601befd9413 DRTVWR-240
 2aa72e3372a83dece4df9cf72fb1e7c34f90b5e3 DRTVWR-209
 f7bedce18ad52283e6072814db23318907261487 DRTVWR-238
 7b64c96fbcadf360bd2feaae19d330166b70877c DRTVWR-210
+e9a5886052433d5db9e504ffaca10890f9932979 DRTVWR-243
+73b84b9864dc650fe7c8fc9f52361450f0849004 3.4.2-beta4
+16310aabccf315870f7cc9bf966926c0ad6954fa 3.4.2-release
 5e4e4128b256525bafc07a62e35ae8527aaa9c9d DRTVWR-241
 f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232
 4918b150e75df6b516fb6c2616d32043fa6b4cac DRTVWR-245
 94ab2b49458ab372a95d2d6949fdf574f413068d 3.4.3-beta1
+4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229
+f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246
+39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247
+7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249
+f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230
+b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255
 965b9a35e260c0f53be1a25f0db7abc8a67eaf47 DRTVWR-252
 bb10adc4f76cf0067fca7075146f00cdc0740e9d DRTVWR-251
 ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253
@@ -371,31 +377,25 @@ ab0aa2f6ba22b52fed30a2337197f589156edc75 DRTVWR-253
 44e764a6ac9e672a4f3bce821a4b6a218590c374 DRTVWR-258
 c23d734065ed593b2413385aecd8366d8e0ee96b DRTVWR-257
 452ce96d4046dc05a3ecaecc203e2cc8ddd72e76 DRTVWR-259
+9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260
 daca610d840625b5bebb966a57cb49581852c417 DRTVWR-265
 9afbdc4e24cc04feacfb2b7a10b78a64f780901a DRTVWR-266
 73280db02501f5ad041fc18b1eba68e73a81996c DRTVWR-267
 870e2d79e0063fda87187f17bbc2747766733194 3.4.3-beta3
 0a2ca6546b499239afeb66d17b2fadbcdbe36ab1 3.4.3-release
-4c3460cb1fb7c6da9965e09c734d282a8e9c81f0 DRTVWR-229
-f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246
-39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247
-7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249
-f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230
-b418be80903520c492e1173f3afbc4021cad5d07 DRTVWR-255
-9aa1aa9f1fe13c194695a0b8f0af298296241dc2 DRTVWR-260
 84fbaf2d4141bd161731430e760949dc787ca206 DRTVWR-244
 083d2d36b5bb1c54fc3dd7caac0e7ac381a9cef0 3.4.4-beta1
+391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268
 b634dec987c16e8c9c938e11e52591d9ead8fa9b DRTVWR-270
 cd39255bd23330fd30c04105f2811e941d8524fe 3.4.4-beta2
 2c4011bbc2b15b82198fd8b51f3a9fe765a08c4d DRTVWR-271
 2f8a3ef687bc55828abcb17ac1ad7cde70536d7e 3.4.4-beta3
 35cfd4cf5b895fa776592f2e630e330be7f0604e DRTVWR-273
+a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272
+37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269
 c374035d459af3c03dea2dd90880dfc25de64706 DRTVWR-275
 05d9f1dd7a954069af2a33abedb7713fa36a04cb 3.4.4-beta4
 e1bb1ae7d8b12faeb37933a737c199cc9b9f89cc 3.4.4-release
-391a8c74cec7275c5d26c85ad108d4782a3e3dd9 DRTVWR-268
-a36f1f354b02aa6e448ca13685de167d0a0a3d03 DRTVWR-272
-37dba00ad820de3a808d4039396b162a9c275b3e DRTVWR-269
 7c6dfdc1b7a2ce0d8e3a8f3ce3058547ea065c0f DRTVWR-250
 b9ff9730daa53a541925300cbd02bb14575a5705 DRTVWR-277
 af6b711a97073431953b55ee808aaa09900c27e5 DRTVWR-276
@@ -405,6 +405,8 @@ c296133849d1f103c0e2abc41e6599daed00b67b DRTVWR-280
 5df4802bec93c8d0a509946d826bb4c50c5442ec DRTVWR-281
 7c1c33ba4cfd2d15ca51cc1ac440eca551331a4a DRTVWR-283
 6b9c7dbebef793230d64e1b452577c8b142d4143 3.4.5-beta2
+37947e4f771f001b551581bf7cd0051c3153beed DRTVWR-282
+6482cceb91cda68b799f3e6cdc66d33bf123547a DRTVWR-284
 ccf991e02dc2f63fb646324230d54832683f4a9b DRTVWR-286
 2d849850558a5a0324b398d1c102d30bcbdfb88f DRTVWR-287
 e06898df8644fe567bee94f817d03abc1c380993 3.4.5-beta3
@@ -462,3 +464,5 @@ fb1630153bac5552046ea914af3f14deabc1def8 3.6.0-materials-beta1
 69429d81ae4dd321eda2607901ef0a0fde71b54c 3.6.0-release
 0a56f33ad6aa112032b14a41dad759ad377bdde9 3.6.0-release
 75cf8e855ae1af6895a35da475314c2b5acf1850 3.6.1-release
+f6741d5fe8d632651424484df0fe0cb4a01e9fbe 3.6.2-release
+fe4f7c5e9fd27e09d03deb1cc9ab3e5093f6309e 3.6.3-release
diff --git a/autobuild.xml b/autobuild.xml
index 90224692dbb001fa14c72c0b0b942a7c3dd545a0..92f91db32cb65c89cf3cfadb28e72aeb7f6a19e3 100755
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -522,9 +522,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-	      <string>91752db72202807cffb33c1ec3fd90fc</string>
+              <string>91752db72202807cffb33c1ec3fd90fc</string>
               <key>url</key>
-	      <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string>
+              <string>http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/3p-fmodex-private/rev/276321/arch/CYGWIN/installer/fmodex-4.44-windows-20130521.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -761,9 +761,9 @@
           <map>
             <key>archive</key>
             <map>
-           <key>hash</key>
-	   <string>aff5566e04003de0383941981198e04e</string>
-          <key>url</key>
+              <key>hash</key>
+              <string>aff5566e04003de0383941981198e04e</string>
+              <key>url</key>
           <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/Darwin/installer/google_breakpad-0.0.0-rev1099-darwin-20130329.tar.bz2</string>
             </map>
             <key>name</key>
@@ -773,9 +773,9 @@
           <map>
             <key>archive</key>
             <map>
-             <key>hash</key>
-	         <string>52257e5eb166a0b69c9c0c38f6e1920e</string>
-             <key>url</key>
+              <key>hash</key>
+              <string>52257e5eb166a0b69c9c0c38f6e1920e</string>
+              <key>url</key>
 	         <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273079/arch/Linux/installer/google_breakpad-0.0.0-rev1099-linux-20130329.tar.bz2</string>
             </map>
             <key>name</key>
@@ -786,7 +786,7 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-	      <string>d812a6dfcabe6528198a3191068dac09</string>
+              <string>d812a6dfcabe6528198a3191068dac09</string>
               <key>url</key>
              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273073/arch/CYGWIN/installer/google_breakpad-0.0.0-rev1099-windows-20130329.tar.bz2</string>
             </map>
@@ -879,42 +879,6 @@
           </map>
         </map>
       </map>
-      <key>gperftools</key>
-      <map>
-        <key>license</key>
-        <string>bsd</string>
-        <key>license_file</key>
-        <string>LICENSES/gperftools.txt</string>
-        <key>name</key>
-        <string>gperftools</string>
-        <key>platforms</key>
-        <map>
-          <key>linux</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>8aedfdcf670348c18a9991ae1b384a61</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/Linux/installer/gperftools-2.0-linux-20120727.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>linux</string>
-          </map>
-          <key>windows</key>
-          <map>
-            <key>archive</key>
-            <map>
-              <key>hash</key>
-              <string>f62841804acb91e1309603a84f3f0ce8</string>
-              <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/CYGWIN/installer/gperftools-2.0-windows-20120727.tar.bz2</string>
-            </map>
-            <key>name</key>
-            <string>windows</string>
-          </map>
-        </map>
-      </map>
       <key>gstreamer</key>
       <map>
         <key>license</key>
@@ -1844,9 +1808,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>24e735ae005f3ce7a21a09cc02cece17</string>
+              <string>2994f1e028fb200c454c12b5f7ca9108</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Darwin/installer/slvoice-3.2.0002.10426-darwin-20110601.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/Darwin/installer/slvoice-4.5.0009.17865-darwin-20130215.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin</string>
@@ -1856,9 +1820,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>8a0bc982367d6fdc20a28b391cd40566</string>
+              <string>957773fff7148ffaca42b1ea4a18d192</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/Linux/installer/slvoice-3.2.0002.10426-linux-20110601.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270512/arch/Linux/installer/slvoice-4.5.0009.17865-linux-20130216.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
@@ -1868,9 +1832,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>1e821cc7d25eabad013b7f3db260dd6b</string>
+              <string>24710eda136bfd42d6333e5609c2c74f</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/231678/arch/CYGWIN/installer/slvoice-3.2.0002.10426-windows-20110601.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-slvoice/rev/270464/arch/CYGWIN/installer/slvoice-4.5.0009.17865-windows-20130214.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 66ccb404a8cfee9255f7796bdddab580f35cd6ba..7712f16ade1e9abdf8a109bf848f942252911796 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -175,6 +175,7 @@ Ansariel Hiller
 	STORM-1685
 	STORM-1713
 	STORM-1899
+	MAINT-2368
 Aralara Rajal
 Ardy Lay
 	STORM-859
@@ -479,6 +480,7 @@ Hiro Sommambulist
 Hitomi Tiponi
 	STORM-1741
 	STORM-1862
+	BUG-1067
 Holger Gilruth
 Horatio Freund
 Hoze Menges
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 29ab4b17109e826137afbcc614a0c1ff66812b9d..1b211ca7b9d5f360f1e89d3effd64315fea76767 100755
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -20,6 +20,7 @@ if(WINDOWS)
     set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
     set(vivox_files
         SLVoice.exe
+        ca-bundle.crt
         libsndfile-1.dll
         vivoxplatform.dll
         vivoxsdk.dll
@@ -195,6 +196,7 @@ elseif(DARWIN)
     set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}")
     set(vivox_files
         SLVoice
+        ca-bundle.crt
         libsndfile.dylib
         libvivoxoal.dylib
         libortp.dylib
@@ -241,6 +243,7 @@ elseif(LINUX)
         libvivoxplatform.so
         libvivoxsdk.so
         SLVoice
+        # ca-bundle.crt   #No cert for linux.  It is actually still 3.2SDK.
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
     # or ARCH_PREBUILT_DIRS
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 83638b56a3d2c780e1908761911697155da07b92..7a46f47473c2c1c01fda8ac9282ebfa1924962dd 100755
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -690,8 +690,17 @@ void LLImageRaw::fill( const LLColor4U& color )
 	}
 }
 
+LLPointer<LLImageRaw> LLImageRaw::duplicate()
+{
+	if(getNumRefs() < 2)
+	{
+		return this; //nobody else refences to this image, no need to duplicate.
+	}
 
-
+	//make a duplicate
+	LLPointer<LLImageRaw> dup = new LLImageRaw(getData(), getWidth(), getHeight(), getComponents());
+	return dup; 
+}
 
 // Src and dst can be any size.  Src and dst can each have 3 or 4 components.
 void LLImageRaw::copy(LLImageRaw* src)
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 8ad6b49dd2817bddc8ec5314893b8e966c17be90..08615dc8ea3652350c3cab628f992e54c1ee44bd 100755
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -219,6 +219,9 @@ class LLImageRaw : public LLImageBase
 
 	// Copy operations
 	
+	//duplicate this raw image if refCount > 1.
+	LLPointer<LLImageRaw> duplicate();
+
 	// Src and dst can be any size.  Src and dst can each have 3 or 4 components.
 	void copy( LLImageRaw* src );
 
diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp
index 6a1e3804be3da99b2ceb4ad01100298157262782..4d1ee15661bcdacd6d4085d14bc1fd5e76e24283 100755
--- a/indra/llmath/llcamera.cpp
+++ b/indra/llmath/llcamera.cpp
@@ -42,6 +42,11 @@ LLCamera::LLCamera() :
 	mPlaneCount(6),
 	mFrustumCornerDist(0.f)
 {
+	for (U32 i = 0; i < PLANE_MASK_NUM; i++)
+	{
+		mPlaneMask[i] = PLANE_MASK_NONE;
+	}
+
 	calculateFrustumPlanes();
 } 
 
@@ -52,6 +57,11 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
 	mPlaneCount(6),
 	mFrustumCornerDist(0.f)
 {
+	for (U32 i = 0; i < PLANE_MASK_NUM; i++)
+	{
+		mPlaneMask[i] = PLANE_MASK_NONE;
+	}
+
 	mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
 	mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);
 	if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE;
@@ -87,14 +97,14 @@ F32 LLCamera::getMaxView() const
 
 void LLCamera::setUserClipPlane(LLPlane& plane)
 {
-	mPlaneCount = 7;
-	mAgentPlanes[6] = plane;
-	mPlaneMask[6] = plane.calcPlaneMask();
+	mPlaneCount = AGENT_PLANE_USER_CLIP_NUM;
+	mAgentPlanes[AGENT_PLANE_USER_CLIP] = plane;
+	mPlaneMask[AGENT_PLANE_USER_CLIP] = plane.calcPlaneMask();
 }
 
 void LLCamera::disableUserClipPlane()
 {
-	mPlaneCount = 6;
+	mPlaneCount = AGENT_PLANE_NO_USER_CLIP_NUM;
 }
 
 void LLCamera::setView(F32 vertical_fov_rads) 
@@ -161,6 +171,18 @@ size_t LLCamera::readFrustumFromBuffer(const char *buffer)
 
 // ---------------- test methods  ---------------- 
 
+static	const LLVector4a sFrustumScaler[] = 
+{
+	LLVector4a(-1,-1,-1),
+	LLVector4a( 1,-1,-1),
+	LLVector4a(-1, 1,-1),
+	LLVector4a( 1, 1,-1),
+	LLVector4a(-1,-1, 1),
+	LLVector4a( 1,-1, 1),
+	LLVector4a(-1, 1, 1),
+	LLVector4a( 1, 1, 1)		// 8 entries
+};
+
 bool LLCamera::isChanged()
 {
 	bool changed = false;
@@ -179,17 +201,6 @@ bool LLCamera::isChanged()
 
 S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius, const LLPlane* planes) 
 {
-	static const LLVector4a scaler[] = {
-		LLVector4a(-1,-1,-1),
-		LLVector4a( 1,-1,-1),
-		LLVector4a(-1, 1,-1),
-		LLVector4a( 1, 1,-1),
-		LLVector4a(-1,-1, 1),
-		LLVector4a( 1,-1, 1),
-		LLVector4a(-1, 1, 1),
-		LLVector4a( 1, 1, 1)
-	};
-
 	if(!planes)
 	{
 		//use agent space
@@ -200,14 +211,15 @@ S32 LLCamera::AABBInFrustum(const LLVector4a &center, const LLVector4a& radius,
 	bool result = false;
 	LLVector4a rscale, maxp, minp;
 	LLSimdScalar d;
-	for (U32 i = 0; i < mPlaneCount; i++)
+	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7
+	for (U32 i = 0; i < max_planes; i++)
 	{
 		mask = mPlaneMask[i];
-		if (mask != 0xff)
+		if (mask < PLANE_MASK_NUM)
 		{
 			const LLPlane& p(planes[i]);
 			p.getAt<3>(d);
-			rscale.setMul(radius, scaler[mask]);
+			rscale.setMul(radius, sFrustumScaler[mask]);
 			minp.setSub(center, rscale);
 			d = -d;
 			if (p.dot3(minp).getF32() > d) 
@@ -235,17 +247,6 @@ S32 LLCamera::AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& ra
 
 S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes) 
 {
-	static const LLVector4a scaler[] = {
-		LLVector4a(-1,-1,-1),
-		LLVector4a( 1,-1,-1),
-		LLVector4a(-1, 1,-1),
-		LLVector4a( 1, 1,-1),
-		LLVector4a(-1,-1, 1),
-		LLVector4a( 1,-1, 1),
-		LLVector4a(-1, 1, 1),
-		LLVector4a( 1, 1, 1)
-	};
-
 	if(!planes)
 	{
 		//use agent space
@@ -256,14 +257,15 @@ S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a&
 	bool result = false;
 	LLVector4a rscale, maxp, minp;
 	LLSimdScalar d;
-	for (U32 i = 0; i < mPlaneCount; i++)
+	U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM);		// mAgentPlanes[] size is 7
+	for (U32 i = 0; i < max_planes; i++)
 	{
 		mask = mPlaneMask[i];
-		if ((i != 5) && (mask != 0xff))
+		if ((i != 5) && (mask < PLANE_MASK_NUM))
 		{
 			const LLPlane& p(planes[i]);
 			p.getAt<3>(d);
-			rscale.setMul(radius, scaler[mask]);
+			rscale.setMul(radius, sFrustumScaler[mask]);
 			minp.setSub(center, rscale);
 			d = -d;
 			if (p.dot3(minp).getF32() > d) 
@@ -410,7 +412,7 @@ int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius)
 	bool res = false;
 	for (int i = 0; i < 6; i++)
 	{
-		if (mPlaneMask[i] != 0xff)
+		if (mPlaneMask[i] != PLANE_MASK_NONE)
 		{
 			float d = mAgentPlanes[i].dist(sphere_center);
 
@@ -582,14 +584,14 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)
 		return;
 	}
 
-	mPlaneMask[idx] = 0xff;
+	mPlaneMask[idx] = PLANE_MASK_NONE;
 	mAgentPlanes[idx].clear();
 }
 
 void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
 {
 	
-	for (int i = 0; i < 8; i++)
+	for (int i = 0; i < AGENT_FRUSTRUM_NUM; i++)
 	{
 		mAgentFrustum[i] = frust[i];
 	}
@@ -601,22 +603,22 @@ void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
 	//order of planes is important, keep most likely to fail in the front of the list
 
 	//near - frust[0], frust[1], frust[2]
-	mAgentPlanes[2] = planeFromPoints(frust[0], frust[1], frust[2]);
+	mAgentPlanes[AGENT_PLANE_NEAR] = planeFromPoints(frust[0], frust[1], frust[2]);
 
 	//far  
-	mAgentPlanes[5] = planeFromPoints(frust[5], frust[4], frust[6]);
+	mAgentPlanes[AGENT_PLANE_FAR] = planeFromPoints(frust[5], frust[4], frust[6]);
 
 	//left  
-	mAgentPlanes[0] = planeFromPoints(frust[4], frust[0], frust[7]);
+	mAgentPlanes[AGENT_PLANE_LEFT] = planeFromPoints(frust[4], frust[0], frust[7]);
 
 	//right  
-	mAgentPlanes[1] = planeFromPoints(frust[1], frust[5], frust[6]);
+	mAgentPlanes[AGENT_PLANE_RIGHT] = planeFromPoints(frust[1], frust[5], frust[6]);
 
 	//top  
-	mAgentPlanes[4] = planeFromPoints(frust[3], frust[2], frust[6]);
+	mAgentPlanes[AGENT_PLANE_TOP] = planeFromPoints(frust[3], frust[2], frust[6]);
 
 	//bottom  
-	mAgentPlanes[3] = planeFromPoints(frust[1], frust[0], frust[4]);
+	mAgentPlanes[AGENT_PLANE_BOTTOM] = planeFromPoints(frust[1], frust[0], frust[4]);
 
 	//cache plane octant facing mask for use in AABBInFrustum
 	for (U32 i = 0; i < mPlaneCount; i++)
@@ -693,7 +695,7 @@ void LLCamera::calculateWorldFrustumPlanes()
 	LLVector3 center = mOrigin - mXAxis*mNearPlane;
 	mWorldPlanePos = center;
 	LLVector3 pnorm;	
-	for (int p=0; p<4; p++)
+	for (int p = 0; p < PLANE_NUM; p++)
 	{
 		mLocalPlanes[p].getVector3(pnorm);
 		LLVector3 norm = rotateToAbsolute(pnorm);
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index a7cdcff4acaa415d196050cfd5f2511863dcdb38..946f9f8d84c6a868d0fdcd6917f66ccea753f572 100755
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -76,26 +76,39 @@ class LLCamera
 		PLANE_RIGHT = 1,
 		PLANE_BOTTOM = 2,
 		PLANE_TOP = 3,
-		PLANE_NUM = 4
+		PLANE_NUM = 4,
+		PLANE_MASK_NONE = 0xff		// Disable this plane
 	};
 	enum {
 		PLANE_LEFT_MASK = (1<<PLANE_LEFT),
 		PLANE_RIGHT_MASK = (1<<PLANE_RIGHT),
 		PLANE_BOTTOM_MASK = (1<<PLANE_BOTTOM),
 		PLANE_TOP_MASK = (1<<PLANE_TOP),
-		PLANE_ALL_MASK = 0xf
+		PLANE_ALL_MASK = 0xf,
 	};
 
 	enum
-	{
+	{	// Indexes to mAgentPlanes[] and mPlaneMask[]
 		AGENT_PLANE_LEFT = 0,
-		AGENT_PLANE_RIGHT,
-		AGENT_PLANE_NEAR,
-		AGENT_PLANE_BOTTOM,
-		AGENT_PLANE_TOP,
-		AGENT_PLANE_FAR,
+		AGENT_PLANE_RIGHT = 1,
+		AGENT_PLANE_NEAR = 2,
+		AGENT_PLANE_BOTTOM = 3,
+		AGENT_PLANE_TOP = 4,
+		AGENT_PLANE_FAR = 5,
+		AGENT_PLANE_USER_CLIP = 6
+	};
+	enum
+	{	// Sizes for mAgentPlanes[].  7th entry is special case for user clip
+		AGENT_PLANE_NO_USER_CLIP_NUM = 6,
+		AGENT_PLANE_USER_CLIP_NUM = 7,
+		PLANE_MASK_NUM = 8			// 7 actually used, 8 is for alignment
 	};
 
+	enum
+	{
+		AGENT_FRUSTRUM_NUM = 8
+	};
+	
 	enum {
 		HORIZ_PLANE_LEFT = 0,
 		HORIZ_PLANE_RIGHT = 1,
@@ -108,17 +121,17 @@ class LLCamera
 	};
 
 private:
-	LL_ALIGN_16(LLPlane mAgentPlanes[7]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
-	LL_ALIGN_16(LLPlane mRegionPlanes[7]);  //frustum planes in a local region space, derived from mAgentPlanes
-	LL_ALIGN_16(LLPlane mLastAgentPlanes[7]);
-	U8 mPlaneMask[8];         // 8 for alignment	
+	LL_ALIGN_16(LLPlane mAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]);  //frustum planes in agent space a la gluUnproject (I'm a bastard, I know) - DaveP
+	LL_ALIGN_16(LLPlane mRegionPlanes[AGENT_PLANE_USER_CLIP_NUM]);  //frustum planes in a local region space, derived from mAgentPlanes
+	LL_ALIGN_16(LLPlane mLastAgentPlanes[AGENT_PLANE_USER_CLIP_NUM]);
+	U8 mPlaneMask[PLANE_MASK_NUM];         // 8 for alignment	
 	
 	F32 mView;					// angle between top and bottom frustum planes in radians.
 	F32 mAspect;				// width/height
 	S32 mViewHeightInPixels;	// for ViewHeightInPixels() only
 	F32 mNearPlane;
 	F32 mFarPlane;
-	LL_ALIGN_16(LLPlane mLocalPlanes[4]);
+	LL_ALIGN_16(LLPlane mLocalPlanes[PLANE_NUM]);
 	F32 mFixedDistance;			// Always return this distance, unless < 0
 	LLVector3 mFrustCenter;		// center of frustum and radius squared for ultra-quick exclusion test
 	F32 mFrustRadiusSquared;
@@ -130,7 +143,7 @@ class LLCamera
 
 	LLVector3 mWorldPlanePos;		// Position of World Planes (may be offset from camera)
 public:
-	LLVector3 mAgentFrustum[8];  //8 corners of 6-plane frustum
+	LLVector3 mAgentFrustum[AGENT_FRUSTRUM_NUM];  //8 corners of 6-plane frustum
 	F32	mFrustumCornerDist;		//distance to corner of frustum against far clip plane
 	LLPlane& getAgentPlane(U32 idx) { return mAgentPlanes[idx]; }
 
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 03989df1709dd5169fc3b84a444d0d6a9a57a28a..ea20da01462a4231bd8be68fa2dd70fe23f6105c 100755
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -72,7 +72,8 @@
 
 static const U32 EASY_HANDLE_POOL_SIZE		= 5;
 static const S32 MULTI_PERFORM_CALL_REPEAT	= 5;
-static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds per operation
+static const S32 CURL_REQUEST_TIMEOUT = 120; // seconds per operation
+static const S32 CURL_CONNECT_TIMEOUT = 30; //seconds to wait for a connection
 static const S32 MAX_ACTIVE_REQUEST_COUNT = 100;
 
 // DEBUG //
@@ -517,6 +518,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
 	//don't verify host name so urls with scrubbed host names will work (improves DNS performance)
 	setopt(CURLOPT_SSL_VERIFYHOST, 0);
 	setopt(CURLOPT_TIMEOUT, llmax(time_out, CURL_REQUEST_TIMEOUT));
+	setopt(CURLOPT_CONNECTTIMEOUT, CURL_CONNECT_TIMEOUT);
 
 	setoptString(CURLOPT_URL, url);
 
diff --git a/indra/llplugin/slplugin/slplugin-objc.mm b/indra/llplugin/slplugin/slplugin-objc.mm
index a4347393503943ff7eb0662d5033076d59014571..a5ab1d95c890f6bcbaf95b802c4f5c5eae3ca1d7 100755
--- a/indra/llplugin/slplugin/slplugin-objc.mm
+++ b/indra/llplugin/slplugin/slplugin-objc.mm
@@ -115,7 +115,7 @@ void LLCocoaPlugin::setupGroup()
     
 }
 
-void LLCocoaPlugin::updateWindows()  //SPATTERS give this a better name.
+void LLCocoaPlugin::updateWindows()  
 {
 //    NSArray* window_list = [NSApp orderedWindows];
 //    NSWindow* current_window = [window_list objectAtIndex:0];
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index e48613b8cac71b0c4fb1d2e3c9c94fa90620023e..3526b225324d7f92e11393b6f94d470fb6f13dbf 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -628,25 +628,41 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac
 			if (v)
 			{
 				U32 v_idx = idx[j*stride+v_offset]*3;
+				v_idx = llclamp(v_idx, (U32) 0, (U32) v->getCount());
 				vert.getPosition().set(v->get(v_idx),
 								v->get(v_idx+1),
 								v->get(v_idx+2));
 			}
 			
-			if (n)
+			//bounds check n and t lookups because some FBX to DAE converters
+			//use negative indices and empty arrays to indicate data does not exist
+			//for a particular channel
+			if (n && n->getCount() > 0)
 			{
 				U32 n_idx = idx[j*stride+n_offset]*3;
+				n_idx = llclamp(n_idx, (U32) 0, (U32) n->getCount());
 				vert.getNormal().set(n->get(n_idx),
 								n->get(n_idx+1),
 								n->get(n_idx+2));
 			}
+			else
+			{
+				vert.getNormal().clear();
+			}
+
 			
-			if (t)
+			if (t && t->getCount() > 0)
 			{
 				U32 t_idx = idx[j*stride+t_offset]*2;
+				t_idx = llclamp(t_idx, (U32) 0, (U32) t->getCount());
 				vert.mTexCoord.setVec(t->get(t_idx),
 								t->get(t_idx+1));								
 			}
+			else
+			{
+				vert.mTexCoord.clear();
+			}
+
 						
 			verts.push_back(vert);
 		}
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index e20bd6cf9ddd39d964dacfeeb4618a3a50c8e270..90a8bf5f5e844e9c92e240e4b6f26ac8c3634807 100755
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -1154,7 +1154,8 @@ void LLGLManager::initExtensions()
 	// Misc
 	glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
 	glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange);
-	
+	glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize);
+
 #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS
 	LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL;
 	if (mHasVertexBufferObject)
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index 60597fd090943c42d6a8eeaaf38a216eb55aac5a..75e5fe86ec0ce1447b6df43b9fc62c3afe7fa0da 100755
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -155,6 +155,7 @@ class LLGLManager
 	S32 mVRAM; // VRAM in MB
 	S32 mGLMaxVertexRange;
 	S32 mGLMaxIndexRange;
+	S32 mGLMaxTextureSize;
 	
 	void getPixelFormat(); // Get the best pixel format
 
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
old mode 100644
new mode 100755
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index a4d77b00d6c54dba8ace3d7ddb5a65bfb2007f96..a9945f9814f92a5b4bef56b34cecb75f5e1523e1 100755
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -117,8 +117,8 @@ void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)
 
 bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
 {
-	resx = llmin(resx, (U32) 4096);
-	resy = llmin(resy, (U32) 4096);
+	resx = llmin(resx, (U32) gGLManager.mGLMaxTextureSize);
+	resy = llmin(resy, (U32) gGLManager.mGLMaxTextureSize);
 
 	stop_glerror();
 	release();
diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp
index af124d9826a5cc335ef4f6519b4e7cfeab5f2105..cc9ff7a487d60c4dc8ee28d4778ea10b9ccb5f30 100755
--- a/indra/llui/llscrolllistcolumn.cpp
+++ b/indra/llui/llscrolllistcolumn.cpp
@@ -236,7 +236,8 @@ void LLScrollColumnHeader::handleReshape(const LLRect& new_rect, bool by_user)
 		// tell scroll list to layout columns again
 		// do immediate update to get proper feedback to resize handle
 		// which needs to know how far the resize actually went
-		mColumn->mParentCtrl->updateColumns();
+		const bool force_update = true;
+		mColumn->mParentCtrl->updateColumns(force_update);
 	}
 }
 
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 224c2b918d2af5faf171e2d7faf7d07209c5a290..f54fb36abebd5085851316eae450f2d6b9262e18 100755
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -615,7 +615,6 @@ S32 LLScrollListCtrl::calcMaxContentWidth()
 
 		if (mColumnWidthsDirty)
 		{
-			mColumnWidthsDirty = false;
 			// update max content width for this column, by looking at all items
 			column->mMaxContentWidth = column->mHeader ? LLFontGL::getFontSansSerifSmall()->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0;
 			item_list::iterator iter;
@@ -629,6 +628,7 @@ S32 LLScrollListCtrl::calcMaxContentWidth()
 		}
 		max_item_width += column->mMaxContentWidth;
 	}
+	mColumnWidthsDirty = false;
 
 	return max_item_width;
 }
@@ -643,7 +643,7 @@ bool LLScrollListCtrl::updateColumnWidths()
 		if (!column) continue;
 
 		// update column width
-		S32 new_width = column->getWidth();
+		S32 new_width = 0;
 		if (column->mRelWidth >= 0)
 		{
 			new_width = (S32)llround(column->mRelWidth*mItemListRect.getWidth());
@@ -652,6 +652,10 @@ bool LLScrollListCtrl::updateColumnWidths()
 		{
 			new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding) / mNumDynamicWidthColumns;
 		}
+		else
+		{
+			new_width = column->getWidth();
+		}
 
 		if (column->getWidth() != new_width)
 		{
@@ -693,9 +697,9 @@ void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp)
 }
 
 
-void LLScrollListCtrl::updateColumns()
+void LLScrollListCtrl::updateColumns(bool force_update)
 {
-	if (!mColumnsDirty)
+	if (!mColumnsDirty && !force_update)
 		return;
 
 	mColumnsDirty = false;
@@ -749,7 +753,7 @@ void LLScrollListCtrl::updateColumns()
 	}
 
 	// propagate column widths to individual cells
-	if (columns_changed_width)
+	if (columns_changed_width || force_update)
 	{
 		item_list::iterator iter;
 		for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index 40a49074c1b370e48c63a1a701d564c7f5d49f4e..679aab3fe5ae6d3c3eb946881162412b35fce979 100755
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -341,7 +341,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
 
 	static void onClickColumn(void *userdata);
 
-	virtual void updateColumns();
+	virtual void updateColumns(bool force_update = false);
 	S32 calcMaxContentWidth();
 	bool updateColumnWidths();
 
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index b4900e5f0c2417095b866e30ad452a83b76b8996..ac9ec8e8ee1dc306d07f9a2a95a863a0a9b68bbe 100755
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -134,7 +134,7 @@ LLDir_Mac::LLDir_Mac()
 		
 		{
             mOSCacheDir = *cachedir;
-            //SPATTERS TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away.
+            //Aura TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away.
             CreateDirectory(mOSCacheDir, secondLifeString, NULL);
 		}
 		
diff --git a/indra/llvfs/llvfs_objc.mm b/indra/llvfs/llvfs_objc.mm
index 4f9e2f81e93a0c19c1d09f9e2806d5b316fed1f9..47b0e73978fb71631766357a629e9b0588fbbcc0 100755
--- a/indra/llvfs/llvfs_objc.mm
+++ b/indra/llvfs/llvfs_objc.mm
@@ -58,7 +58,7 @@ std::string* findSystemDirectory(NSSearchPathDirectory searchPathDirectory,
     if ([paths count])
     {
         path = [paths objectAtIndex:0];
-        //SPATTERS HACK:  Always attempt to create directory, ignore errors.
+        //HACK:  Always attempt to create directory, ignore errors.
         NSError *error = nil;
 
         [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 019d2278428cea9a462def3ac9ff2c9ce1407c72..1483151f2b806edc8d968db987375d8f8799cda3 100755
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -335,6 +335,8 @@ int yyerror(const char *fmt, ...);
 "ATTACH_HUD_BOTTOM_LEFT" { count(); yylval.ival = 36; return(INTEGER_CONSTANT); }
 "ATTACH_HUD_BOTTOM"		{ count(); yylval.ival = 37; return(INTEGER_CONSTANT); }
 "ATTACH_HUD_BOTTOM_RIGHT"	{ count(); yylval.ival = 38; return(INTEGER_CONSTANT); }
+"ATTACH_NECK"   { count(); yylval.ival = 39; return(INTEGER_CONSTANT); }
+"ATTACH_AVATAR_CENTER"   { count(); yylval.ival = 40; return(INTEGER_CONSTANT); }
 
 "LAND_LEVEL"		{ count(); yylval.ival = E_LANDBRUSH_LEVEL; return(INTEGER_CONSTANT); }
 "LAND_RAISE"		{ count(); yylval.ival = E_LANDBRUSH_RAISE; return(INTEGER_CONSTANT); }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b3e55ccc00837423496bed820057a6a197c7860f..da7466f6b5be7ddbfdf3fc151c01e72aef248a5f 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1675,6 +1675,7 @@ if (WINDOWS)
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
+      ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ca-bundle.crt
       ${GOOGLE_PERF_TOOLS_SOURCE}
       ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
       ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index b72762837ea636398fece3c5651f664c2ee82ffb..0f44168a4d54427731b95473ed03e4730fe645b6 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.6.2
+3.6.4
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index f0d8b77afd8ea7748cfa6abb687f25a1d0a72261..a87310955fa929d2952741f27a903971398779e9 100755
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -274,7 +274,8 @@ ATTACH_LLLEG		Passed to llAttachToAvatar to attach task to left lower leg
 ATTACH_BELLY		Passed to llAttachToAvatar to attach task to belly
 ATTACH_LEFT_PEC		Passed to llAttachToAvatar to attach task to left pectoral
 ATTACH_RIGHT_PEC	Passed to llAttachToAvatar to attach task to right pectoral
-
+ATTACH_NECK			Passed to llAttachToAvatar to attach task to neck
+ATTACH_AVATAR_CENTER	Passed to llAttachToAvatar to attach task to avatar center
 LAND_LEVEL			Passed to llModifyLand to level terrain
 LAND_RAISE			Passed to llModifyLand to raise terrain
 LAND_LOWER			Passed to llModifyLand to lower terrain
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 2a4e10fb6f0cc2f942510c2e1f79075f70b0e8ef..015c307afc71f035c283595a3ac92755283a7094 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8489,6 +8489,18 @@
     <integer>0</integer>
   </map>
 
+  <key>RenderDepthOfFieldInEditMode</key>
+  <map>
+    <key>Comment</key>
+    <string>Whether to use depth of field effect when in edit mode</string>
+    <key>Persist</key>
+    <integer>1</integer>
+    <key>Type</key>
+    <string>Boolean</string>
+    <key>Value</key>
+    <integer>0</integer>
+  </map>
+
   <key>CameraDoFResScale</key>
   <map>
     <key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
index 43ed41a2050c11affab3e55a044787fa7be14bf3..efd0d03965725dcdd8b3fcb42efc68c0c9718690 100755
--- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
+++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl
@@ -45,3 +45,4 @@ mat4 getObjectSkinnedTransform()
 		
 	return mat;
 }
+
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 4c39014c8b5238a1cdfc75d41fd96fad94ccab47..122577b13236c49e45a0a127c2cac60b6245b307 100755
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -32,567 +32,531 @@
 //		1 - We claim to support this card.
 //
 
-3Dfx									.*3Dfx.*								0	0	0	0
-3Dlabs									.*3Dlabs.*								0	0	0	0
-ATI 3D-Analyze							.*ATI.*3D-Analyze.*						0	0	0	0
-ATI All-in-Wonder 7500					.*ATI.*All-in-Wonder 75.*				0	1	0	0
-ATI All-in-Wonder 8500					.*ATI.*All-in-Wonder 85.*				0	1	0	0
-ATI All-in-Wonder 9200					.*ATI.*All-in-Wonder 92.*				0	1	0	0
-ATI All-in-Wonder 9xxx					.*ATI.*All-in-Wonder 9.*				1	1	0	0
-ATI All-in-Wonder HD					.*ATI.*All-in-Wonder HD.*				1	1	1	3.3
-ATI All-in-Wonder X600					.*ATI.*All-in-Wonder X6.*				1	1	0	0
-ATI All-in-Wonder X800					.*ATI.*All-in-Wonder X8.*				1	1	1	2.1
-ATI All-in-Wonder X1800					.*ATI.*All-in-Wonder X18.*				3	1	0	0
-ATI All-in-Wonder X1900					.*ATI.*All-in-Wonder X19.*				3	1	0	0
-ATI All-in-Wonder PCI-E					.*ATI.*All-in-Wonder.*PCI-E.*			1	1	0	0
-ATI All-in-Wonder Radeon				.*ATI.*All-in-Wonder Radeon.*			0	1	0	0
-ATI ASUS ARES							.*ATI.*ASUS.*ARES.*						3	1	0	0
-ATI ASUS A9xxx							.*ATI.*ASUS.*A9.*						1	1	0	0
-ATI ASUS AH24xx							.*ATI.*ASUS.*AH24.*						1	1	1	3.3
-ATI ASUS AH26xx							.*ATI.*ASUS.*AH26.*						1	1	1	3.3
-ATI ASUS AH34xx							.*ATI.*ASUS.*AH34.*						1	1	1	3.3
-ATI ASUS AH36xx							.*ATI.*ASUS.*AH36.*						1	1	1	3.3
-ATI ASUS AH46xx							.*ATI.*ASUS.*AH46.*						2	1	1	3.3
-ATI ASUS AX3xx							.*ATI.*ASUS.*AX3.*						1	1	0	0
-ATI ASUS AX5xx							.*ATI.*ASUS.*AX5.*						1	1	0	0
-ATI ASUS AX8xx							.*ATI.*ASUS.*AX8.*						2	1	0	0
-ATI ASUS EAH24xx						.*ATI.*ASUS.*EAH24.*					2	1	0	0
-ATI ASUS EAH26xx						.*ATI.*ASUS.*EAH26.*					3	1	0	0
-ATI ASUS EAH29xx						.*ATI.*ASUS.*EAH29.*					3	1	0	0
-ATI ASUS EAH34xx						.*ATI.*ASUS.*EAH34.*					1	1	0	0
-ATI ASUS EAH36xx						.*ATI.*ASUS.*EAH36.*					2	1	0	0
-ATI ASUS EAH38xx						.*ATI.*ASUS.*EAH38.*					2	1	1	3.3
-ATI ASUS EAH43xx						.*ATI.*ASUS.*EAH43.*					2	1	1	3.3
-ATI ASUS EAH45xx						.*ATI.*ASUS.*EAH45.*					2	1	0	0
-ATI ASUS EAH48xx						.*ATI.*ASUS.*EAH48.*					3	1	1	3.3
-ATI ASUS EAH57xx						.*ATI.*ASUS.*EAH57.*					3	1	1	4.1
-ATI ASUS EAH58xx						.*ATI.*ASUS.*EAH58.*					5	1	1	4.1
-ATI ASUS EAH62xx						.*ATI.*ASUS.*EAH62.*					2	1	0	0
-ATI ASUS EAH63xx						.*ATI.*ASUS.*EAH63.*					2	1	0	0
-ATI ASUS EAH64xx						.*ATI.*ASUS.*EAH64.*					2	1	0	0
-ATI ASUS EAH65xx						.*ATI.*ASUS.*EAH65.*					2	1	0	4.1
-ATI ASUS EAH66xx						.*ATI.*ASUS.*EAH66.*					3	1	0	4.1
-ATI ASUS EAH67xx						.*ATI.*ASUS.*EAH67.*					3	1	0	0
-ATI ASUS EAH68xx						.*ATI.*ASUS.*EAH68.*					5	1	0	4
-ATI ASUS EAH69xx						.*ATI.*ASUS.*EAH69.*					5	1	0	4.1
-ATI ASUS Radeon X1xxx					.*ATI.*ASUS.*X1.*						2	1	1	2.1
-ATI Radeon X7xx							.*ATI.*ASUS.*X7.*						1	1	0	0
-ATI Radeon X19xx						.*ATI.*(Radeon|Diamond) X19.* ?.*		2	1	1	2.1
-ATI Radeon X18xx						.*ATI.*(Radeon|Diamond) X18.* ?.*		3	1	1	2.1
-ATI Radeon X17xx						.*ATI.*(Radeon|Diamond) X17.* ?.*		1	1	1	2.1
-ATI Radeon X16xx						.*ATI.*(Radeon|Diamond) X16.* ?.*		1	1	1	2.1
-ATI Radeon X15xx						.*ATI.*(Radeon|Diamond) X15.* ?.*		1	1	1	2.1
-ATI Radeon X13xx						.*ATI.*(Radeon|Diamond) X13.* ?.*		1	1	1	2.1
-ATI Radeon X1xxx						.*ATI.*(Radeon|Diamond) X1.. ?.*		0	1	1	2.1
-ATI Radeon X2xxx						.*ATI.*(Radeon|Diamond) X2.. ?.*		1	1	1	2.1
-ATI Display Adapter						.*ATI.*display adapter.*				1	1	1	4.1
-ATI FireGL 5200							.*ATI.*FireGL V52.*						1	1	1	2.1
-ATI FireGL 5xxx							.*ATI.*FireGL V5.*						2	1	1	3.3
-ATI FireGL								.*ATI.*Fire.*GL.*						4	1	1	4.2
-ATI FirePro M3900						.*ATI.*FirePro.*M39.*					2	1	0	0
-ATI FirePro M5800						.*ATI.*FirePro.*M58.*					3	1	0	0
-ATI FirePro M7740						.*ATI.*FirePro.*M77.*					3	1	0	0
-ATI FirePro M7820						.*ATI.*FirePro.*M78.*					5	1	1	4.2
-ATI FireMV								.*ATI.*FireMV.*							0	1	1	1.3
-ATI Generic								.*ATI.*Generic.*						0	0	0	0
-ATI Hercules 9800						.*ATI.*Hercules.*9800.*					1	1	0	0
-ATI IGP 340M							.*ATI.*IGP.*340M.*						0	0	0	0
-ATI M52									.*ATI.*M52.*							1	1	0	0
-ATI M54									.*ATI.*M54.*							1	1	0	0
-ATI M56									.*ATI.*M56.*							1	1	0	0
-ATI M71									.*ATI.*M71.*							1	1	0	0
-ATI M72									.*ATI.*M72.*							1	1	0	0
-ATI M76									.*ATI.*M76.*							3	1	0	0
-ATI Radeon HD 64xx						.*ATI.*AMD Radeon.* HD [67]4..[MG]		2	1	1	4.2
-ATI Radeon HD 65xx						.*ATI.*AMD Radeon.* HD [67]5..[MG]		2	1	1	4.2
-ATI Radeon HD 66xx						.*ATI.*AMD Radeon.* HD [67]6..[MG]		3	1	1	4.2
-ATI Radeon HD 7100						.*ATI.*AMD Radeon.* HD 71.*				2	1	0	0
-ATI Radeon HD 7200						.*ATI.*AMD Radeon.* HD 72.*				2	1	0	0
-ATI Radeon HD 7300						.*ATI.*AMD Radeon.* HD 73.*				2	1	0	4.2
-ATI Radeon HD 7400						.*ATI.*AMD Radeon.* HD 74.*				2	1	0	4.2
-ATI Radeon HD 7500						.*ATI.*AMD Radeon.* HD 75.*				3	1	1	4.2
-ATI Radeon HD 7600						.*ATI.*AMD Radeon.* HD 76.*				3	1	0	4.2
-ATI Radeon HD 7700						.*ATI.*AMD Radeon.* HD 77.*				4	1	1	4.2
-ATI Radeon HD 7800						.*ATI.*AMD Radeon.* HD 78.*				5	1	1	4.2
-ATI Radeon HD 7900						.*ATI.*AMD Radeon.* HD 79.*				5	1	1	4.2
-ATI ASUS HD7100							.*ATI.*ASUS.* HD71.*					2	1	0	0
-ATI ASUS HD7200							.*ATI.*ASUS.* HD72.*					2	1	0	0
-ATI ASUS HD7300							.*ATI.*ASUS.* HD73.*					2	1	0	0
-ATI ASUS HD7400							.*ATI.*ASUS.* HD74.*					2	1	0	0
-ATI ASUS HD7500							.*ATI.*ASUS.* HD75.*					3	1	1	4.2
-ATI ASUS HD7600							.*ATI.*ASUS.* HD76.*					3	1	0	0
-ATI ASUS HD7700							.*ATI.*ASUS.* HD77.*					4	1	1	4.2
-ATI ASUS HD7800							.*ATI.*ASUS.* HD78.*					5	1	1	4.2
-ATI ASUS HD7900							.*ATI.*ASUS.* HD79.*					5	1	1	4.2
-ATI Mobility Radeon 4100				.*ATI.*Mobility.*41..					1	1	1	3.3
-ATI Mobility Radeon 7xxx				.*ATI.*Mobility.*Radeon 7.*				0	1	1	1.3
-ATI Mobility Radeon 8xxx				.*ATI.*Mobility.*Radeon 8.*				0	1	0	0
-ATI Mobility Radeon 9800				.*ATI.*Mobility.*98.*					1	1	0	0
-ATI Mobility Radeon 9700				.*ATI.*Mobility.*97.*					0	1	1	2.1
-ATI Mobility Radeon 9600				.*ATI.*Mobility.*96.*					1	1	1	2.1
-ATI Mobility Radeon HD 530v				.*ATI.*Mobility.*HD *530v.*				1	1	1	3.3
-ATI Mobility Radeon HD 540v				.*ATI.*Mobility.*HD *540v.*				1	1	1	3.3
-ATI Mobility Radeon HD 545v				.*ATI.*Mobility.*HD *545v.*				2	1	1	4
-ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD *550v.*				3	1	1	4
-ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD *560v.*				3	1	1	3.2
-ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD *565v.*				3	1	1	3.3
-ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD *23.*				0	1	1	2.1
-ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD *24.*				1	1	1	3.3
-ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD *26.*				1	1	1	3.3
-ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD *27.*				3	1	0	0
-ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD *31.*				0	1	0	0
-ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD *32.*				0	1	0	0
-ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD *34.*				1	1	1	3.3
-ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD *36.*				1	1	1	4
-ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD *38.*				3	1	1	3.3
-ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD *42.*				1	1	1	4
-ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*HD *43.*				1	1	1	4
-ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD *45.*				1	1	1	4
-ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD *46.*				2	1	1	3.3
-ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD *48.*				3	1	1	3.3
-ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD *51.*				3	1	1	3.2
-ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD *53.*				3	1	0	0
-ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD *54.*				2	1	1	4.2
-ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD *55.*				3	1	0	0
-ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD *56.*				3	1	1	4.2
-ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD *57.*				3	1	1	4.1
-ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD *62.*				3	1	0	0
-ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD *63.*				3	1	1	4.2
-ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD *64.*				3	1	0	0
-ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD *65.*				5	1	1	4.2
-ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD *66.*				5	1	0	0
-ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD *67.*				5	1	0	0
-ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD *68.*				5	1	0	0
-ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD *69.*				5	1	0	0
-ATI Radeon HD 2300						.*ATI.*Radeon HD *23..					0	1	1	3.3
-ATI Radeon HD 2400						.*ATI.*Radeon HD *24..					1	1	1	4
-ATI Radeon HD 2600						.*ATI.*Radeon HD *26..					2	1	1	3.3
-ATI Radeon HD 2900						.*ATI.*Radeon HD *29..					3	1	1	3.3
-ATI Radeon HD 3000						.*ATI.*Radeon HD *30..					0	1	0	0
-ATI Radeon HD 3100						.*ATI.*Radeon HD *31..					1	1	0	0
-ATI Radeon HD 3200						.*ATI.*Radeon HD *32..					1	1	1	4
-ATI Radeon HD 3300						.*ATI.*Radeon HD *33..					1	1	1	3.3
-ATI Radeon HD 3400						.*ATI.*Radeon HD *34..					1	1	1	4
-ATI Radeon HD 3500						.*ATI.*Radeon HD *35..					2	1	0	0
-ATI Radeon HD 3600						.*ATI.*Radeon HD *36..					3	1	1	3.3
-ATI Radeon HD 3700						.*ATI.*Radeon HD *37..					3	1	0	0
-ATI HD3700								.*ATI.* HD37..							3	1	0	3.3
-ATI Radeon HD 3800						.*ATI.*Radeon HD *38..					3	1	1	4
-ATI Radeon HD 4100						.*ATI.*Radeon HD *41..					1	1	0	0
-ATI Radeon HD 4200						.*ATI.*Radeon HD *42..					1	1	1	4
-ATI Radeon HD 4300						.*ATI.*Radeon HD *43..					2	1	1	4
-ATI Radeon HD 4400						.*ATI.*Radeon HD *44..					2	1	0	0
-ATI Radeon HD 4500						.*ATI.*Radeon HD *45..					2	1	1	3.3
-ATI Radeon HD 4600						.*ATI.*Radeon HD *46..					3	1	1	4
-ATI Radeon HD 4700						.*ATI.*Radeon HD *47..					3	1	1	3.3
-ATI Radeon HD 4800						.*ATI.*Radeon HD *48..					3	1	1	4
-ATI ASUS EAH5400						.*ATI.*ASUS EAH54..						3	1	1	4.2
-ATI Radeon HD 5400						.*ATI.*Radeon HD *54..					3	1	1	4.2
-ATI Radeon HD 5500						.*ATI.*Radeon HD *55..					3	1	1	4.2
-ATI ASUS EAH5500						.*ATI.*ASUS EAH55..						3	1	1	4.2
-ATI Radeon HD 5600						.*ATI.*Radeon HD *56..					3	1	1	4.2
-ATI Radeon HD 5700						.*ATI.*Radeon HD *57..					3	1	1	4.2
-ATI Radeon HD 5800						.*ATI.*Radeon HD *58..					4	1	1	4.2
-ATI Radeon HD 5900						.*ATI.*Radeon HD *59..					4	1	1	4.2
-ATI Radeon HD 6200						.*ATI.*Radeon HD *62..					0	1	1	4.2
-ATI Radeon HD 6300						.*ATI.*Radeon HD *63..					1	1	1	4.2
-ATI Radeon HD 6400						.*ATI.*Radeon HD *64..					3	1	1	4.2
-ATI Radeon HD 6500						.*ATI.*Radeon HD *65..					3	1	1	4.2
-ATI Radeon HD 6600						.*ATI.*Radeon HD *66..					3	1	1	4.2
-ATI Radeon HD 6700						.*ATI.*Radeon HD *67..					3	1	1	4.2
-ATI Radeon HD 6800						.*ATI.*Radeon HD *68..					4	1	1	4.2
-ATI Radeon HD 6900						.*ATI.*Radeon HD *69..					5	1	1	4.2
-ATI Radeon OpenGL						.*ATI.*Radeon OpenGL.*					0	0	0	0
-ATI Radeon 2100							.*ATI.*Radeon 21..						0	1	1	2.1
-ATI Radeon 3000							.*ATI.*Radeon 30..						1	1	1	4
-ATI Radeon 3100							.*ATI.*Radeon 31..						0	1	1	3.3
-ATI Radeon 5xxx							.*ATI.*Radeon 5...						3	1	0	0
-ATI Radeon 7xxx							.*ATI.*Radeon 7...						0	1	1	2
-ATI Radeon 8xxx							.*ATI.*Radeon 8...						0	1	0	0
-ATI Radeon 9000							.*ATI.*Radeon 90..						0	1	1	1.3
-ATI Radeon 9100							.*ATI.*Radeon 91..						0	1	0	0
-ATI Radeon 9200							.*ATI.*Radeon 92..						0	1	1	1.3
-ATI Radeon 9500							.*ATI.*Radeon 95..						0	1	1	2.1
-ATI Radeon 9600							.*ATI.*Radeon 96..						0	1	1	2.1
-ATI Radeon 9700							.*ATI.*Radeon 97..						1	1	0	0
-ATI Radeon 9800							.*ATI.*Radeon 98..						1	1	1	2.1
-ATI Radeon RV250						.*ATI.*RV250.*							0	1	0	0
-ATI Radeon RV600						.*ATI.*RV6.*							1	1	0	0
-ATI Radeon RX700						.*ATI.*RX70.*							1	1	0	0
-ATI Radeon RX800						.*ATI.*Radeon *RX80.*					2	1	0	0
-ATI RS880M								.*ATI.*RS880M							1	1	0	0
-ATI Radeon RX9550						.*ATI.*RX9550.*							1	1	0	0
-ATI Radeon VE							.*ATI.*Radeon.*VE.*						0	0	0	0
-ATI Radeon X300							.*ATI.*Radeon *X3.*						1	1	1	2.1
-ATI Radeon X400							.*ATI.*Radeon ?X4.*						0	1	0	0
-ATI Radeon X500							.*ATI.*Radeon ?X5.*						1	1	1	2.1
-ATI Radeon X600							.*ATI.*Radeon ?X6.*						1	1	1	2.1
-ATI Radeon X700							.*ATI.*Radeon ?X7.*						2	1	1	2.1
-ATI Radeon X800							.*ATI.*Radeon ?X8.*						1	1	1	2.1
-ATI Radeon X900							.*ATI.*Radeon ?X9.*						2	1	0	0
-ATI Radeon Xpress						.*ATI.*Radeon Xpress.*					0	1	1	2.1
-ATI Rage 128							.*ATI.*Rage 128.*						0	1	0	0
-ATI R300 (9700)							.*R300.*								0	1	1	2.1
-ATI R350 (9800)							.*R350.*								1	1	0	0
-ATI R580 (X1900)						.*R580.*								3	1	0	0
-ATI RC410 (Xpress 200)					.*RC410.*								0	0	0	0
-ATI RS48x (Xpress 200x)					.*RS48.*								0	0	0	0
-ATI RS600 (Xpress 3200)					.*RS600.*								0	0	0	0
-ATI RV350 (9600)						.*RV350.*								0	1	0	0
-ATI RV370 (X300)						.*RV370.*								0	1	0	0
-ATI RV410 (X700)						.*RV410.*								1	1	0	0
-ATI RV515								.*RV515.*								1	1	0	0
-ATI RV570 (X1900 GT/PRO)				.*RV570.*								3	1	0	0
-ATI RV380								.*RV380.*								0	1	0	0
-ATI RV530								.*RV530.*								1	1	0	0
-ATI RX480 (Xpress 200P)					.*RX480.*								0	1	0	0
-ATI RX700								.*RX700.*								1	1	0	0
-AMD ANTILLES (HD 6990)					.*(AMD|ATI).*Antilles.*					3	1	0	0
-AMD BARTS (HD 6800)						.*(AMD|ATI).*Barts.*					3	1	1	2.1
-AMD CAICOS (HD 6400)					.*(AMD|ATI).*Caicos.*					3	1	0	0
-AMD CAYMAN (HD 6900)					.*(AMD|ATI).*(Cayman|CAYMAM).*			3	1	0	0
-AMD CEDAR (HD 5450)						.*(AMD|ATI).*Cedar.*					2	1	0	0
-AMD CYPRESS (HD 5800)					.*(AMD|ATI).*Cypress.*					3	1	0	0
-AMD HEMLOCK (HD 5970)					.*(AMD|ATI).*Hemlock.*					3	1	0	0
-AMD JUNIPER (HD 5700)					.*(AMD|ATI).*Juniper.*					3	1	0	0
-AMD PARK								.*(AMD|ATI).*Park.*						3	1	0	0
-AMD REDWOOD (HD 5500/5600)				.*(AMD|ATI).*Redwood.*					3	1	0	0
-AMD TURKS (HD 6500/6600)				.*(AMD|ATI).*Turks.*					3	1	0	0
-AMD RS780 (HD 3200)						.*RS780.*								0	1	1	2.1
-AMD RS880 (HD 4200)						.*RS880.*								0	1	1	3.2
-AMD RV610 (HD 2400)						.*RV610.*								1	1	0	0
-AMD RV620 (HD 3400)						.*RV620.*								1	1	0	0
-AMD RV630 (HD 2600)						.*RV630.*								2	1	0	0
-AMD RV635 (HD 3600)						.*RV635.*								3	1	0	0
-AMD RV670 (HD 3800)						.*RV670.*								3	1	0	0
-AMD R680 (HD 3870 X2)					.*R680.*								3	1	0	0
-AMD R700 (HD 4800 X2)					.*R700.*								3	1	0	0
-AMD RV710 (HD 4300)						.*RV710.*								0	1	1	1.4
-AMD RV730 (HD 4600)						.*RV730.*								3	1	0	0
-AMD RV740 (HD 4700)						.*RV740.*								3	1	0	0
-AMD RV770 (HD 4800)						.*RV770.*								3	1	0	0
-AMD RV790 (HD 4800)						.*RV790.*								3	1	0	0
-ATI 760G/Radeon 3000					.*ATI.*AMD 760G.*						1	1	1	3.3
-ATI 780L/Radeon 3000					.*ATI.*AMD 780L.*						1	1	0	0
-ATI Radeon DDR							.*ATI.*Radeon ?DDR.*					0	1	0	0
-ATI FirePro 2000						.*ATI.*FirePro 2.*						2	1	1	4.1
-ATI FirePro 3000						.*ATI.*FirePro V3.*						2	1	0	0
-ATI FirePro 4000						.*ATI.*FirePro V4.*						2	1	0	0
-ATI FirePro 5000						.*ATI.*FirePro V5.*						3	1	0	0
-ATI FirePro 7000						.*ATI.*FirePro V7.*						3	1	0	0
-ATI FirePro M							.*ATI.*FirePro M.*						3	1	1	4.2
-ATI R300 (9700)							.*R300.*								0	1	1	2.1
-ATI Radeon								.*ATI.*(Diamond|Radeon).*				0	1	0	4.2
-Intel X3100								.*Intel.*X3100.*						1	1	1	2.1
-Intel GMA 3600							.*Intel.* 3600.*						0	1	1	3
-Intel 830M								.*Intel.*830M							0	0	0	0
-Intel 845G								.*Intel.*845G							0	0	1	1.4
-Intel 855GM								.*Intel.*855GM							0	0	1	1.4
-Intel 865G								.*Intel.*865G							0	0	1	1.4
-Intel 900								.*Intel.*900.*900						0	0	0	0
-Intel 915GM								.*Intel.*915GM							0	0	1	1.4
-Intel 915G								.*Intel.*915G							0	0	1	1.4
-Intel 945GM								.*Intel.*945GM.*						0	1	1	1.4
-Intel 945G								.*Intel.*945G.*							0	1	1	1.4
-Intel 950								.*Intel.*950.*							0	1	1	1.4
-Intel 965								.*Intel.*965.*							0	1	1	2.1
-Intel G33								.*Intel.*G33.*							1	0	1	1.4
-Intel G41								.*Intel.*G41.*							1	1	1	2.1
-Intel G45								.*Intel.*G45.*							1	1	1	2.1
-Intel Bear Lake							.*Intel.*Bear Lake.*					1	0	1	1.4
-Intel Broadwater						.*Intel.*Broadwater.*					0	0	1	1.4
-Intel Brookdale							.*Intel.*Brookdale.*					0	0	1	1.3
-Intel Cantiga							.*Intel.*Cantiga.*						0	0	1	2
-Intel Eaglelake							.*Intel.*Eaglelake.*					1	1	1	2
-Intel Graphics Media HD					.*Intel.*Graphics Media.*HD.*			1	1	1	2.1
-Intel HD Graphics 2000					.*Intel.*HD Graphics 2.*				2	1	0	4
-Intel HD Graphics 3000					.*Intel.*HD Graphics 3.*				3	1	1	3.1
-Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*				3	1	1	4
-Intel HD2000							.*Intel.*HD2000.*						2	1	0	0
-Intel HD3000							.*Intel.*HD3000.*						3	1	0	0
-Intel HD Graphics						.*Intel.*HD Graphics.*					2	1	1	4
-Intel Mobile 4 Series					.*Intel.*Mobile.* 4 Series.*			0	1	1	2.1
-Intel 4 Series Internal					.*Intel.* 4 Series Internal.*			1	1	1	2.1
-Intel Media Graphics HD					.*Intel.*Media Graphics HD.*			0	1	0	0
-Intel Montara							.*Intel.*Montara.*						0	0	1	1.3
-Intel Pineview							.*Intel.*Pineview.*						0	1	1	1.4
-Intel Springdale						.*Intel.*Springdale.*					0	0	1	1.3
-Intel Grantsdale						.*Intel.*Grantsdale.*					1	1	0	0
-Intel Q45/Q43							.*Intel.*Q4.*							1	1	1	2.1
-Intel B45/B43							.*Intel.*B4.*							1	1	1	2.1
-Intel 3D-Analyze						.*Intel.*3D-Analyze.*					2	1	0	0
-Matrox									.*Matrox.*								0	0	0	0
-Mesa									.*Mesa.*								1	0	1	2.1
-Gallium									.*Gallium.*								1	1	1	2.1
-NVIDIA G100M							.*NVIDIA .*100M.*						4	1	1	3.3
-NVIDIA G102M							.*NVIDIA .*102M.*						1	1	1	3.3
-NVIDIA G103M							.*NVIDIA .*103M.*						2	1	1	3.3
-NVIDIA G105M							.*NVIDIA .*105M.*						2	1	1	3.3
-NVIDIA G 110M							.*NVIDIA .*110M.*						1	1	1	3.3
-NVIDIA G 120M							.*NVIDIA .*120M.*						1	1	1	3.3
-NVIDIA G 205M							.*NVIDIA .*205M.*						1	1	0	0
-NVIDIA G 410M							.*NVIDIA .*410M.*						3	1	1	4.2
-NVIDIA GT 120M							.*NVIDIA .*GT *12*M.*					3	1	1	3.3
-NVIDIA GT 130M							.*NVIDIA .*GT *13*M.*					3	1	1	3.3
-NVIDIA GT 140M							.*NVIDIA .*GT *14*M.*					3	1	1	3.3
-NVIDIA GT 150M							.*NVIDIA .*GTS *15*M.*					2	1	0	0
-NVIDIA GTS 160M							.*NVIDIA .*GTS *16*M.*					2	1	0	0
-NVIDIA G210M							.*NVIDIA .*G21*M.*						3	1	0	0
-NVIDIA GT 220M							.*NVIDIA .*GT *22*M.*					3	1	1	3.3
-NVIDIA GT 230M							.*NVIDIA .*GT *23*M.*					3	1	1	3.3
-NVIDIA GT 240M							.*NVIDIA .*GT *24*M.*					3	1	1	3.3
-NVIDIA GTS 250M							.*NVIDIA .*GTS *25*M.*					3	1	0	0
-NVIDIA GTS 260M							.*NVIDIA .*GTS *26*M.*					3	1	0	0
-NVIDIA GTX 260M							.*NVIDIA .*GTX *26*M.*					3	1	0	0
-NVIDIA GTX 270M							.*NVIDIA .*GTX *27*M.*					3	1	0	0
-NVIDIA GTX 280M							.*NVIDIA .*GTX *28*M.*					3	1	0	0
-NVIDIA 300M								.*NVIDIA .*30*M.*						3	1	1	4.2
-NVIDIA G 310M							.*NVIDIA .*31*M.*						2	1	0	0
-NVIDIA GT 320M							.*NVIDIA .*GT *32*M.*					3	1	0	0
-NVIDIA GT 325M							.*NVIDIA .*GT *32*M.*					3	1	1	3.3
-NVIDIA GT 330M							.*NVIDIA .*GT *33*M.*					3	1	1	3.3
-NVIDIA GT 340M							.*NVIDIA .*GT *34*M.*					4	1	1	3.3
-NVIDIA GTS 350M							.*NVIDIA .*GTS *35*M.*					4	1	1	3.3
-NVIDIA GTS 360M							.*NVIDIA .*GTS *360M.*					5	1	1	3.3
-NVIDIA 405M								.*NVIDIA .* 40*M.*						2	1	0	4.2
-NVIDIA 410M								.*NVIDIA .* 41*M.*						3	1	0	0
-NVIDIA GT 415M							.*NVIDIA .*GT *41*M.*					3	1	1	4.2
-NVIDIA GT 420M							.*NVIDIA .*GT *42*M.*					3	1	1	4.2
-NVIDIA GT 430M							.*NVIDIA .*GT *43*M.*					3	1	1	4.2
-NVIDIA GT 440M							.*NVIDIA .*GT *44*M.*					3	1	1	4.2
-NVIDIA GT 450M							.*NVIDIA .*GT *45*M.*					3	1	0	0
-NVIDIA GTX 460M							.*NVIDIA .*GTX *46*M.*					4	1	1	4.2
-NVIDIA GTX 470M							.*NVIDIA .*GTX *47*M.*					3	1	0	0
-NVIDIA GTX 480M							.*NVIDIA .*GTX *48*M.*					3	1	1	4.2
-NVIDIA GT 520M							.*NVIDIA .*GT *52*M.*					3	1	1	4.2
-NVIDIA GT 530M							.*NVIDIA .*GT *53*M.*					3	1	1	4.2
-NVIDIA GT 540M							.*NVIDIA .*GT *54*M.*					3	1	1	4.2
-NVIDIA GT 550M							.*NVIDIA .*GT *55*M.*					3	1	1	4.2
-NVIDIA GTX 560M							.*NVIDIA .*GTX *56*M.*					3	1	0	0
-NVIDIA GTX 570M							.*NVIDIA .*GTX *57*M.*					5	1	0	0
-NVIDIA GTX 580M							.*NVIDIA .*GTX *58*M.*					5	1	1	4.2
-NVIDIA 610M								.*NVIDIA.* 61*M.*						3	1	1	4.2
-NVIDIA GT 620M							.*NVIDIA .*GT *62*M.*					3	1	0	0
-NVIDIA GT 630M							.*NVIDIA .*GT *63*M.*					3	1	0	0
-NVIDIA GT 640M							.*NVIDIA .*GT *64*M.*					3	1	0	0
-NVIDIA GT 650M							.*NVIDIA .*GT *65*M.*					3	1	0	0
-NVIDIA GTX 660M							.*NVIDIA .*GTX *66*M.*					5	1	0	0
-NVIDIA GTX 670M							.*NVIDIA .*GTX *67*M.*					5	1	1	4.2
-NVIDIA GTX 680M							.*NVIDIA .*GTX *68*M.*					5	1	0	0
-NVIDIA GTX 690M							.*NVIDIA .*GTX *69*M.*					5	1	0	0
-NVIDIA G100								.*NVIDIA .*G10.*						3	1	1	4.2
-NVIDIA GT 120							.*NVIDIA .*GT *12.*						2	1	0	3
-NVIDIA GT 130							.*NVIDIA .*GT *13.*						2	1	0	3.3
-NVIDIA GTS 150							.*NVIDIA .*GTS *15.*					2	1	0	0
-NVIDIA 200								.*NVIDIA .*GeForce 20.*					2	1	1	3.3
-NVIDIA G200								.*NVIDIA .*GeForce G20.*				2	1	1	3.3
-NVIDIA G210								.*NVIDIA .*GeForce G210.*				3	1	1	3.3
-NVIDIA 210								.*NVIDIA .*GeForce 210.*				3	1	1	3.3
-NVIDIA GT 220							.*NVIDIA .*GT *22.*						2	1	1	3.3
-NVIDIA GT 230							.*NVIDIA .*GT *23.*						2	1	1	3.3
-NVIDIA GT 240							.*NVIDIA .*GT *24.*						4	1	1	3.3
-NVIDIA GTS 240							.*NVIDIA .*GTS *24.*					4	1	1	3.3
-NVIDIA GTS 250							.*NVIDIA .*GTS *25.*					4	1	1	3.3
-NVIDIA GTX 260							.*NVIDIA .*GTX *26.*					4	1	1	3.3
-NVIDIA GTX 270							.*NVIDIA .*GTX *27.*					4	1	0	3.3
-NVIDIA GTX 280							.*NVIDIA .*GTX *28.*					4	1	1	3.3
-NVIDIA GTX 290							.*NVIDIA .*GTX *29.*					5	1	0	3.3
-NVIDIA 310								.*NVIDIA .*GeForce 310.*				3	1	1	3.3
-NVIDIA 315								.*NVIDIA .*GeForce 315.*				3	1	1	3.3
-NVIDIA GT 320							.*NVIDIA .*GT *32.*						3	1	0	3.3
-NVIDIA GT 330							.*NVIDIA .*GT *33.*						3	1	0	3.3
-NVIDIA GT 340							.*NVIDIA .*GT *34.*						3	1	0	0
-NVIDIA 405								.*NVIDIA .* 405.*						3	1	0	3.3
-NVIDIA GT 420							.*NVIDIA .*GT *42.*						3	1	1	4.2
-NVIDIA GT 430							.*NVIDIA .*GT *43.*						3	1	1	4.2
-NVIDIA GT 440							.*NVIDIA .*GT *44.*						4	1	0	4.2
-NVIDIA GTS 450							.*NVIDIA .*GTS *45.*					4	1	1	4.2
-NVIDIA GTX 460							.*NVIDIA .*GTX *46.*					5	1	1	4.3
-NVIDIA GTX 470							.*NVIDIA .*GTX *47.*					5	1	1	4.2
-NVIDIA GTX 480							.*NVIDIA .*GTX *48.*					5	1	1	4.2
-NVIDIA 510								.*NVIDIA .* 510.*						3	1	0	0
-NVIDIA GT 520							.*NVIDIA .*GT *52.*						3	1	1	4.2
-NVIDIA GT 530							.*NVIDIA .*GT *53.*						3	1	1	4.2
-NVIDIA GT 540							.*NVIDIA .*GT *54.*						3	1	1	4.2
-NVIDIA GTX 550							.*NVIDIA .*GTX *55.*					5	1	1	4.3
-NVIDIA GTX 560							.*NVIDIA .*GTX *56.*					5	1	1	4.2
-NVIDIA GTX 570							.*NVIDIA .*GTX *57.*					5	1	1	4.2
-NVIDIA GTX 580							.*NVIDIA .*GTX *58.*					5	1	1	4.3
-NVIDIA GTX 590							.*NVIDIA .*GTX *59.*					5	1	1	4.2
-NVIDIA GT 610							.*NVIDIA .*GT *61.*						3	1	1	4.2
-NVIDIA GT 620							.*NVIDIA .*GT *62.*						3	1	0	4.2
-NVIDIA GT 630							.*NVIDIA .*GT *63.*						3	1	0	4.2
-NVIDIA GT 640							.*NVIDIA .*GT *64.*						3	1	0	4.3
-NVIDIA GT 650							.*NVIDIA .*GT *65.*						3	1	1	4.2
-NVIDIA GTX 650							.*NVIDIA .*GTX *65.*					3	1	1	4.2
-NVIDIA GTX 660							.*NVIDIA .*GTX *66.*					5	1	0	4.3
-NVIDIA GTX 670							.*NVIDIA .*GTX *67.*					5	1	1	4.2
-NVIDIA GTX 680							.*NVIDIA .*GTX *68.*					5	1	1	4.2
-NVIDIA GTX 690							.*NVIDIA .*GTX *69.*					5	1	1	4.2
-NVIDIA C51								.*NVIDIA .*C51.*						0	1	1	2
-NVIDIA G72								.*NVIDIA .*G72.*						1	1	0	0
-NVIDIA G73								.*NVIDIA .*G73.*						1	1	0	0
-NVIDIA G84								.*NVIDIA .*G84.*						2	1	0	0
-NVIDIA G86								.*NVIDIA .*G86.*						3	1	0	0
-NVIDIA G92								.*NVIDIA .*G92.*						3	1	0	0
-NVIDIA GeForce							.*GeForce 256.*							0	0	0	0
-NVIDIA GeForce 2						.*GeForce ?2 ?.*						0	1	1	1.5
-NVIDIA GeForce 3						.*GeForce ?3 ?.*						2	1	1	2.1
-NVIDIA GeForce 3 Ti						.*GeForce ?3 Ti.*						0	1	0	0
-NVIDIA GeForce 4						.*NVIDIA .*GeForce ?4.*					0	1	1	1.5
-NVIDIA GeForce 4 Go						.*NVIDIA .*GeForce ?4.*Go.*				0	1	0	0
-NVIDIA GeForce 4 MX						.*NVIDIA .*GeForce ?4 MX.*				0	1	0	0
-NVIDIA GeForce 4 PCX					.*NVIDIA .*GeForce ?4 PCX.*				0	1	0	0
-NVIDIA GeForce 4 Ti						.*NVIDIA .*GeForce ?4 Ti.*				0	1	0	0
-NVIDIA GeForce 6100						.*NVIDIA .*GeForce 61.*					3	1	1	4.2
-NVIDIA GeForce 6200						.*NVIDIA .*GeForce 62.*					0	1	1	2.1
-NVIDIA GeForce 6500						.*NVIDIA .*GeForce 65.*					1	1	1	2.1
-NVIDIA GeForce 6600						.*NVIDIA .*GeForce 66.*					2	1	1	2.1
-NVIDIA GeForce 6700						.*NVIDIA .*GeForce 67.*					2	1	1	2.1
-NVIDIA GeForce 6800						.*NVIDIA .*GeForce 68.*					1	1	1	2.1
-NVIDIA GeForce 7000						.*NVIDIA .*GeForce 70.*					1	1	1	2.1
-NVIDIA GeForce 7100						.*NVIDIA .*GeForce 71.*					1	1	1	2.1
-NVIDIA GeForce 7200						.*NVIDIA .*GeForce 72.*					1	1	0	0
-NVIDIA GeForce 7300						.*NVIDIA .*GeForce 73.*					1	1	1	2.1
-NVIDIA GeForce 7500						.*NVIDIA .*GeForce 75.*					2	1	1	2.1
-NVIDIA GeForce 7600						.*NVIDIA .*GeForce 76.*					2	1	1	2.1
-NVIDIA GeForce 7800						.*NVIDIA .*GeForce 78.*					2	1	1	2.1
-NVIDIA GeForce 7900						.*NVIDIA .*GeForce 79.*					3	1	1	2.1
-NVIDIA GeForce 8100						.*NVIDIA .*GeForce 81.*					1	1	0	0
-NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 8200M.*				1	1	0	3.3
-NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*					1	1	0	2.1
-NVIDIA GeForce 8300						.*NVIDIA .*GeForce 83.*					3	1	1	3.3
-NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 8400M.*				1	1	1	3.3
-NVIDIA GeForce 8400						.*NVIDIA .*GeForce 84.*					2	1	1	3.3
-NVIDIA GeForce 8500						.*NVIDIA .*GeForce 85.*					2	1	1	3.3
-NVIDIA GeForce 8600M					.*NVIDIA .*GeForce 8600M.*				2	1	1	3.3
-NVIDIA GeForce 8600						.*NVIDIA .*GeForce 86.*					3	1	1	3.3
-NVIDIA GeForce 8700M					.*NVIDIA .*GeForce 8700M.*				2	1	1	3.3
-NVIDIA GeForce 8700						.*NVIDIA .*GeForce 87.*					3	1	0	0
-NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 8800M.*				2	1	1	3.3
-NVIDIA GeForce 8800						.*NVIDIA .*GeForce 88.*					3	1	1	3.3
-NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 9100M.*				0	1	0	0
-NVIDIA GeForce 9100						.*NVIDIA .*GeForce 91.*					0	1	0	3.3
-NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 9200M.*				1	1	0	3.1
-NVIDIA GeForce 9200						.*NVIDIA .*GeForce 92.*					1	1	0	3.3
-NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 9300M.*				1	1	1	3.3
-NVIDIA GeForce 9300						.*NVIDIA .*GeForce 93.*					1	1	1	3.3
-NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 9400M.*				2	1	1	3.3
-NVIDIA GeForce 9400						.*NVIDIA .*GeForce 94.*					3	1	1	3.3
-NVIDIA GeForce 9500M					.*NVIDIA .*GeForce 9500M.*				1	1	1	3.3
-NVIDIA GeForce 9500						.*NVIDIA .*GeForce 95.*					3	1	1	3.3
-NVIDIA GeForce 9600M					.*NVIDIA .*GeForce 9600M.*				2	1	1	3.3
-NVIDIA GeForce 9600						.*NVIDIA .*GeForce 96.*					3	1	1	3.3
-NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 9700M.*				0	1	1	3.3
-NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 9800M.*				2	1	1	3.3
-NVIDIA GeForce 9800						.*NVIDIA .*GeForce 98.*					3	1	1	3.3
-NVIDIA GeForce FX 5100					.*NVIDIA .*GeForce FX 51.*				0	1	0	0
-NVIDIA GeForce FX 5200					.*NVIDIA .*GeForce FX 52.*				0	1	0	2.1
-NVIDIA GeForce FX 5300					.*NVIDIA .*GeForce FX 53.*				0	1	0	0
-NVIDIA GeForce FX 5500					.*NVIDIA .*GeForce FX 55.*				0	1	1	2.1
-NVIDIA GeForce FX 5600					.*NVIDIA .*GeForce FX 56.*				1	1	1	2.1
-NVIDIA GeForce FX 5700					.*NVIDIA .*GeForce FX 57.*				0	1	1	2.1
-NVIDIA GeForce FX 5800					.*NVIDIA .*GeForce FX 58.*				1	1	0	0
-NVIDIA GeForce FX 5900					.*NVIDIA .*GeForce FX 59.*				1	1	1	2.1
-NVIDIA GeForce FX Go5100				.*NVIDIA .*GeForce FX Go51.*			0	1	0	0
-NVIDIA GeForce FX Go5200				.*NVIDIA .*GeForce FX Go52.*			0	1	0	0
-NVIDIA GeForce FX Go5300				.*NVIDIA .*GeForce FX Go53.*			0	1	0	0
-NVIDIA GeForce FX Go5500				.*NVIDIA .*GeForce FX Go55.*			0	1	0	0
-NVIDIA GeForce FX Go5600				.*NVIDIA .*GeForce FX Go56.*			0	1	1	2.1
-NVIDIA GeForce FX Go5700				.*NVIDIA .*GeForce FX Go57.*			1	1	1	1.5
-NVIDIA GeForce FX Go5800				.*NVIDIA .*GeForce FX Go58.*			1	1	0	0
-NVIDIA GeForce FX Go5900				.*NVIDIA .*GeForce FX Go59.*			1	1	0	0
-NVIDIA GeForce FX Go5xxx				.*NVIDIA .*GeForce FX Go.*				0	1	0	0
-NVIDIA GeForce Go 6100					.*NVIDIA .*GeForce Go 61.*				0	1	1	2.1
-NVIDIA GeForce Go 6200					.*NVIDIA .*GeForce Go 62.*				0	1	0	0
-NVIDIA GeForce Go 6400					.*NVIDIA .*GeForce Go 64.*				1	1	1	2
-NVIDIA GeForce Go 6500					.*NVIDIA .*GeForce Go 65.*				1	1	0	0
-NVIDIA GeForce Go 6600					.*NVIDIA .*GeForce Go 66.*				0	1	1	2.1
-NVIDIA GeForce Go 6700					.*NVIDIA .*GeForce Go 67.*				1	1	0	0
-NVIDIA GeForce Go 6800					.*NVIDIA .*GeForce Go 68.*				0	1	1	2.1
-NVIDIA GeForce Go 7200					.*NVIDIA .*GeForce Go 72.*				1	1	0	0
-NVIDIA GeForce Go 7300 LE				.*NVIDIA .*GeForce Go 73.*LE.*			1	1	0	0
-NVIDIA GeForce Go 7300					.*NVIDIA .*GeForce Go 73.*				1	1	1	2.1
-NVIDIA GeForce Go 7400					.*NVIDIA .*GeForce Go 74.*				1	1	1	2.1
-NVIDIA GeForce Go 7600					.*NVIDIA .*GeForce Go 76.*				1	1	1	2.1
-NVIDIA GeForce Go 7700					.*NVIDIA .*GeForce Go 77.*				0	1	1	2.1
-NVIDIA GeForce Go 7800					.*NVIDIA .*GeForce Go 78.*				2	1	0	0
-NVIDIA GeForce Go 7900					.*NVIDIA .*GeForce Go 79.*				1	1	1	2.1
-NVIDIA D9M								.*NVIDIA .*D9M.*						1	1	0	0
-NVIDIA G94								.*NVIDIA .*G94.*						3	1	0	0
-NVIDIA GeForce Go 6						.*GeForce Go 6.*						1	1	0	0
-NVIDIA ION 2							.*NVIDIA .*ION 2.*						2	1	0	0
-NVIDIA ION 								.*NVIDIA Corporation.*ION.*				2	1	1	3.3
-NVIDIA NB8M								.*NVIDIA .*NB8M.*						1	1	0	0
-NVIDIA NB8P								.*NVIDIA .*NB8P.*						2	1	0	0
-NVIDIA NB9E								.*NVIDIA .*NB9E.*						3	1	0	0
-NVIDIA NB9M								.*NVIDIA .*NB9M.*						1	1	0	0
-NVIDIA NB9P								.*NVIDIA .*NB9P.*						2	1	0	0
-NVIDIA N10								.*NVIDIA .*N10.*						1	1	0	0
-NVIDIA GeForce PCX						.*GeForce PCX.*							0	1	0	0
-NVIDIA Generic							.*NVIDIA .*Unknown.*					0	0	0	3
-NVIDIA NV17								.*NVIDIA .*NV17.*						0	1	0	0
-NVIDIA NV34								.*NVIDIA .*NV34.*						0	1	0	0
-NVIDIA NV35								.*NVIDIA .*NV35.*						0	1	0	0
-NVIDIA NV36								.*NVIDIA .*NV36.*						1	1	0	0
-NVIDIA NV41								.*NVIDIA .*NV41.*						1	1	0	0
-NVIDIA NV43								.*NVIDIA .*NV43.*						1	1	0	0
-NVIDIA NV44								.*NVIDIA .*NV44.*						1	1	0	0
-NVIDIA nForce							.*NVIDIA .*nForce.*						0	0	0	3.3
-NVIDIA MCP51							.*NVIDIA .*MCP51.*						1	1	0	0
-NVIDIA MCP61							.*NVIDIA .*MCP61.*						1	1	0	0
-NVIDIA MCP67							.*NVIDIA .*MCP67.*						1	1	0	0
-NVIDIA MCP68							.*NVIDIA .*MCP68.*						1	1	0	0
-NVIDIA MCP73							.*NVIDIA .*MCP73.*						1	1	0	0
-NVIDIA MCP77							.*NVIDIA .*MCP77.*						1	1	0	0
-NVIDIA MCP78							.*NVIDIA .*MCP78.*						1	1	0	0
-NVIDIA MCP79							.*NVIDIA .*MCP79.*						1	1	0	0
-NVIDIA MCP7A							.*NVIDIA .*MCP7A.*						1	1	0	0
-NVIDIA Quadro2							.*Quadro2.*								0	1	0	0
-NVIDIA Quadro 1000M						.*Quadro.*1000M.*						2	1	0	4.2
-NVIDIA Quadro 2000 M/D					.*Quadro.*2000.*						3	1	0	4.2
-NVIDIA Quadro 3000M						.*Quadro.*3000M.*						3	1	0	0
-NVIDIA Quadro 4000M						.*Quadro.*4000M.*						3	1	0	0
-NVIDIA Quadro 4000						.*Quadro *4000.*						3	1	0	4.2
-NVIDIA Quadro 50x0 M					.*Quadro.*50.0.*						3	1	0	0
-NVIDIA Quadro 6000						.*Quadro.*6000.*						3	1	0	0
-NVIDIA Quadro 400						.*Quadro.*400.*							2	1	0	3.3
-NVIDIA Quadro 600						.*Quadro.*600.*							2	1	0	3.3
-NVIDIA Quadro4							.*Quadro4.*								0	1	0	0
-NVIDIA Quadro DCC						.*Quadro DCC.*							0	1	0	0
-NVIDIA Quadro CX						.*Quadro.*CX.*							3	1	0	0
-NVIDIA Quadro FX 770M					.*Quadro.*FX *770M.*					2	1	0	0
-NVIDIA Quadro FX 1500M					.*Quadro.*FX *1500M.*					1	1	0	2.1
-NVIDIA Quadro FX 1600M					.*Quadro.*FX *1600M.*					2	1	0	0
-NVIDIA Quadro FX 2500M					.*Quadro.*FX *2500M.*					2	1	0	0
-NVIDIA Quadro FX 2700M					.*Quadro.*FX *2700M.*					3	1	0	0
-NVIDIA Quadro FX 2800M					.*Quadro.*FX *2800M.*					3	1	0	3.3
-NVIDIA Quadro FX 3500					.*Quadro.*FX *3500.*					2	1	0	2.1
-NVIDIA Quadro FX 3600					.*Quadro.*FX *3600.*					3	1	0	0
-NVIDIA Quadro FX 3700					.*Quadro.*FX *3700.*					3	1	0	3.3
-NVIDIA Quadro FX 3800					.*Quadro.*FX *3800.*					3	1	0	3.2
-NVIDIA Quadro FX 4500					.*Quadro.*FX *45.*						3	1	0	0
-NVIDIA Quadro FX 880M					.*Quadro.*FX *880M.*					3	1	0	3.3
-NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro *FX *4800.*			3	1	0	0
-NVIDIA Quadro FX						.*Quadro FX.*							1	1	0	3.3
-NVIDIA Quadro NVS 1xxM					.*Quadro NVS *1.[05]M.*					0	1	1	3.3
-NVIDIA Quadro NVS 300M					.*NVIDIA .*NVS *300M.*					2	1	0	0
-NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS *320M.*					2	1	0	0
-NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS *2100M.*					2	1	0	0
-NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS *3100M.*					2	1	0	0
-NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS *4200M.*					2	1	0	4.1
-NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS *5100M.*					2	1	0	0
-NVIDIA Quadro NVS						.*NVIDIA .*NVS							0	1	0	3.2
-NVIDIA Corporation N12P					.*NVIDIA .*N12P.*						1	1	1	4.1
-NVIDIA Corporation N11M					.*NVIDIA .*N11M.*						2	1	0	0
-NVIDIA RIVA TNT							.*RIVA TNT.*							0	0	0	0
-S3										.*S3 Graphics.*							0	0	1	1.4
-SiS										SiS.*									0	0	1	1.5
-Trident									Trident.*								0	0	0	0
-Tungsten Graphics						Tungsten.*								0	0	0	0
-XGI										XGI.*									0	0	0	0
-VIA										VIA.*									0	0	0	0
-Apple Generic							Apple.*Generic.*						0	0	0	0
-Apple Software Renderer					Apple.*Software Renderer.*				0	0	0	0
-Humper									Humper.*								0	1	1	2.1
-PowerVR SGX545							.*PowerVR SGX.*							1	1	1	3
+3Dfx									.*3Dfx.*											0	0	0	0
+3Dlabs									.*3Dlabs.*											0	0	0	0
+ATI 3D-Analyze							.*ATI.*3D-Analyze.*									0	0	0	0
+ATI All-in-Wonder 7500					.*ATI.*All-in-Wonder 75.*							0	1	0	0
+ATI All-in-Wonder 8500					.*ATI.*All-in-Wonder 85.*							0	1	0	0
+ATI All-in-Wonder 9200					.*ATI.*All-in-Wonder 92.*							0	1	0	0
+ATI All-in-Wonder 9xxx					.*ATI.*All-in-Wonder 9.*							1	1	0	2.1
+ATI All-in-Wonder HD					.*ATI.*All-in-Wonder HD.*							1	1	1	3.3
+ATI All-in-Wonder X600					.*ATI.*All-in-Wonder X6.*							1	1	0	0
+ATI All-in-Wonder X800					.*ATI.*All-in-Wonder X8.*							1	1	1	2.1
+ATI All-in-Wonder X1800					.*ATI.*All-in-Wonder X18.*							3	1	0	0
+ATI All-in-Wonder X1900					.*ATI.*All-in-Wonder X19.*							3	1	0	0
+ATI All-in-Wonder PCI-E					.*ATI.*All-in-Wonder.*PCI-E.*						1	1	0	0
+ATI All-in-Wonder Radeon				.*ATI.*All-in-Wonder Radeon.*						0	1	0	0
+ATI Radeon X1300						.*ATI.*(ASUS|Radeon).*X13.*							2	1	1	2.1
+ATI Radeon X1500						.*ATI.*(ASUS|Radeon).*X15.*							2	1	1	2.1
+ATI Radeon X1600						.*ATI.*(ASUS|Radeon).*X16.*							2	1	1	2.1
+ATI Radeon X1700						.*ATI.*(ASUS|Radeon).*X17.*							2	1	1	2.1
+ATI Radeon X1800						.*ATI.*(Radeon|Diamond) X18.* ?.*					3	1	1	2.1
+ATI Radeon X1900						.*ATI.*(Radeon|Diamond|ASUS) X19.* ?.*				2	1	1	2.1
+ATI Radeon X17xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1
+ATI Radeon X16xx						.*ATI.*(Radeon|Diamond) X17.* ?.*					1	1	1	2.1
+ATI Radeon X28xx						.*ATI.*(Radeon|Diamond) X28.. ?.*					1	1	1	2.1
+ATI Display Adapter						.*ATI.*display adapter.*							1	1	1	4.1
+ATI FireGL 5200							.*ATI.*FireGL V52.*									1	1	1	2.1
+ATI FireGL 5xxx							.*ATI.*FireGL V5.*									2	1	1	3.3
+ATI FireGL								.*ATI.*Fire.*GL.*									4	1	1	4.2
+ATI FirePro M3900						.*ATI.*FirePro.*M39.*								2	1	0	4.1
+ATI FirePro M5800						.*ATI.*FirePro.*M58.*								3	1	0	0
+ATI FirePro M7740						.*ATI.*FirePro.*M77.*								3	1	0	0
+ATI FirePro M7820						.*ATI.*FirePro.*M78.*								5	1	1	4.2
+ATI FireMV								.*ATI.*FireMV.*										0	1	1	3.2
+ATI Generic								.*ATI.*Generic.*									0	0	0	0
+ATI Hercules 9800						.*ATI.*Hercules.* 9800.*							1	1	0	0
+ATI IGP 340M							.*ATI.*IGP.* 34[0-9]M.*								0	0	0	1.3
+ATI M52									.*ATI.*M52.*										1	1	0	0
+ATI M54									.*ATI.*M54.*										1	1	0	0
+ATI M56									.*ATI.*M56.*										1	1	0	0
+ATI M71									.*ATI.*M71.*										1	1	0	0
+ATI M72									.*ATI.*M72.*										1	1	0	0
+ATI M76									.*ATI.*M76.*										3	1	0	0
+ATI Radeon HD 6300M						.*ATI.*AMD Radeon.* (HD|HD )63..M					2	1	1	4.2
+ATI Radeon HD 6400M						.*ATI.*AMD Radeon.* (HD|HD )64..M					2	1	1	4.2
+ATI Radeon HD 6500M						.*ATI.*AMD Radeon.* (HD|HD )65..M					2	1	1	4.2
+ATI Radeon HD 6600M						.*ATI.*AMD Radeon.* (HD 6|6)6..M					3	1	1	4.2
+ATI Radeon HD 6700M						.*ATI.*AMD Radeon.* (HD|HD )67..M					3	1	1	4.2
+ATI Radeon HD 6800M						.*ATI.*AMD Radeon.* (HD|HD )68..M					3	1	1	4.2
+ATI Radeon HD 6300G						.*ATI.*AMD Radeon.* (HD|HD )63..G					2	1	1	4.2
+ATI Radeon HD 6400G						.*ATI.*AMD Radeon.* (HD|HD )64..G					2	1	1	4.2
+ATI Radeon HD 6500G						.*ATI.*AMD Radeon.* (HD|HD )65..G					2	1	1	4.2
+ATI Radeon HD 6600G						.*ATI.*AMD Radeon.* (HD|HD )66..G					3	1	1	4.2
+ATI Radeon HD 7100						.*ATI.*(Radeon|ASUS).* (HD|HD )71.*					2	1	0	0
+ATI Radeon HD 7200						.*ATI.*(Radeon|ASUS).* (HD|HD )72.*					2	1	0	4.2
+ATI Radeon HD 7300						.*ATI.*(Radeon|ASUS).* (HD|HD )73.*					2	1	0	4.2
+ATI Radeon HD 7400						.*ATI.*(Radeon|ASUS).* (HD|HD )74.*					2	1	0	4.2
+ATI Radeon HD 7500						.*ATI.*(Radeon|ASUS).* (HD|HD )75.*					3	1	1	4.2
+ATI Radeon HD 7600						.*ATI.*(Radeon|ASUS).* (HD|HD )76.*					3	1	0	4.2
+ATI Radeon HD 7700						.*ATI.*(Radeon|ASUS).* (HD|HD )77.*					4	1	1	4.2
+ATI Radeon HD 7800						.*ATI.*(Radeon|ASUS).* (HD|HD )78.*					5	1	1	4.2
+ATI Radeon HD 7900						.*ATI.*(Radeon|ASUS).* (HD|HD )79.*					5	1	1	4.2
+ATI Radeon HD 7000 Series				.*ATI.*(Radeon|ASUS).* (HD|HD )7000 Series.*		3	1	1	4.2
+ATI Mobility Radeon 4100				.*ATI.*Mobility.* 41..								1	1	1	3.3
+ATI Mobility Radeon 5000				.*ATI.*Mobility.* 50..								1	1	1	4.2
+ATI Mobility Radeon 7xxx				.*ATI.*Mobility.*Radeon 7.*							0	1	1	1.3
+ATI Mobility Radeon 8xxx				.*ATI.*Mobility.*Radeon 8.*							0	1	0	0
+ATI Mobility Radeon 9800				.*ATI.*Mobility.* 98.*								1	1	0	0
+ATI Mobility Radeon 9700				.*ATI.*Mobility.* 97.*								0	1	1	2.1
+ATI Mobility Radeon 9600				.*ATI.*Mobility.* 96.*								1	1	1	2.1
+ATI Mobility Radeon HD 530v				.*ATI.*Mobility.*HD 530v.*							1	1	1	3.3
+ATI Mobility Radeon HD 540v				.*ATI.*Mobility.*HD 540v.*							1	1	1	3.3
+ATI Mobility Radeon HD 545v				.*ATI.*Mobility.*HD 545v.*							2	1	1	4
+ATI Mobility Radeon HD 550v				.*ATI.*Mobility.*HD 550v.*							3	1	1	4
+ATI Mobility Radeon HD 560v				.*ATI.*Mobility.*HD 560v.*							3	1	1	3.2
+ATI Mobility Radeon HD 565v				.*ATI.*Mobility.*HD 565v.*							3	1	1	3.3
+ATI Mobility Radeon HD 2300				.*ATI.*Mobility.*HD 23.*							0	1	1	2.1
+ATI Mobility Radeon HD 2400				.*ATI.*Mobility.*HD 24.*							1	1	1	3.3
+ATI Mobility Radeon HD 2600				.*ATI.*Mobility.*HD 26.*							1	1	1	3.3
+ATI Mobility Radeon HD 2700				.*ATI.*Mobility.*HD 27.*							3	1	0	0
+ATI Mobility Radeon HD 3100				.*ATI.*Mobility.*HD 31.*							0	1	0	0
+ATI Mobility Radeon HD 3200				.*ATI.*Mobility.*HD 32.*							0	1	0	0
+ATI Mobility Radeon HD 3400				.*ATI.*Mobility.*HD 34.*							1	1	1	4
+ATI Mobility Radeon HD 3600				.*ATI.*Mobility.*HD 36.*							1	1	1	4
+ATI Mobility Radeon HD 3800				.*ATI.*Mobility.*HD 38.*							3	1	1	3.3
+ATI Mobility Radeon HD 4200				.*ATI.*Mobility.*HD 42.*							1	1	1	4
+ATI Mobility Radeon HD 4300				.*ATI.*Mobility.*(HD |HD)43.*						1	1	1	4
+ATI Mobility Radeon HD 4500				.*ATI.*Mobility.*HD 45.*							1	1	1	4
+ATI Mobility Radeon HD 4600				.*ATI.*Mobility.*HD 46.*							2	1	1	3.3
+ATI Mobility Radeon HD 4800				.*ATI.*Mobility.*HD 48.*							3	1	1	3.3
+ATI Mobility Radeon HD 5000 Series		.*ATI.*Mobility.*HD 50.*							3	1	1	3.2
+ATI Mobility Radeon HD 5100				.*ATI.*Mobility.*HD 51.*							3	1	1	3.2
+ATI Mobility Radeon HD 5300				.*ATI.*Mobility.*HD 53.*							3	1	0	0
+ATI Mobility Radeon HD 5400				.*ATI.*Mobility.*HD 54.*							2	1	1	4.2
+ATI Mobility Radeon HD 5500				.*ATI.*Mobility.*HD 55.*							3	1	0	4.2
+ATI Mobility Radeon HD 5600				.*ATI.*Mobility.*HD 56.*							3	1	1	4.2
+ATI Mobility Radeon HD 5700				.*ATI.*Mobility.*HD 57.*							3	1	1	4.1
+ATI Mobility Radeon HD 6200				.*ATI.*Mobility.*HD 62.*							3	1	0	0
+ATI Mobility Radeon HD 6300				.*ATI.*Mobility.*HD 63.*							3	1	1	4.2
+ATI Mobility Radeon HD 6400M			.*ATI.*Mobility.*HD 64.*							3	1	0	0
+ATI Mobility Radeon HD 6500M			.*ATI.*Mobility.*HD 65.*							5	1	1	4.2
+ATI Mobility Radeon HD 6600M			.*ATI.*Mobility.*HD 66.*							5	1	0	0
+ATI Mobility Radeon HD 6700M			.*ATI.*Mobility.*HD 67.*							5	1	0	0
+ATI Mobility Radeon HD 6800M			.*ATI.*Mobility.*HD 68.*							5	1	0	0
+ATI Mobility Radeon HD 6900M			.*ATI.*Mobility.*HD 69.*							5	1	0	0
+ATI Mobility Radeon Graphics			.*ATI Mobility Radeon Graphics.*					1	1	0	4
+ATI Radeon HD 2300						.*ATI.*Radeon.* (HD|HD )23..						0	1	1	3.3
+ATI Radeon HD 2400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)24..				1	1	1	4
+ATI Radeon HD 2600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)26..				2	1	1	4
+ATI Radeon HD 2900						.*ATI.*Radeon.* (HD|HD )29..						3	1	1	3.3
+ATI Radeon HD 3000						.*ATI.*Radeon.* (HD|HD )30..						0	1	0	0
+ATI Radeon HD 3100						.*ATI.*Radeon.* (HD|HD )31..						1	1	0	0
+ATI Radeon HD 3200						.*ATI.*Radeon.* (HD|HD )32..						1	1	1	4
+ATI Radeon HD 3300						.*ATI.*Radeon.* (HD|HD )33..						1	1	1	3.3
+ATI Radeon HD 3400						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)34..			1	1	1	4
+ATI Radeon HD 3500						.*ATI.*Radeon.* (HD|HD )35..						2	1	0	0
+ATI Radeon HD 3600						.*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)36..			3	1	1	4
+ATI Radeon HD 3700						.*ATI.*Radeon.* (HD|HD )37..						3	1	0	3.3
+ATI HD3700								.*ATI.* HD37..										3	1	0	3.3
+ATI Radeon HD 3800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)38..				3	1	1	4
+ATI Radeon HD 4100						.*ATI.*Radeon.* (HD|HD )41..						1	1	0	0
+ATI Radeon HD 4200						.*ATI.*Radeon.* (HD|HD )42..						1	1	1	4
+ATI Radeon HD 4300						.*ATI.*(Radeon|ASUS).* (HD4|HD 4|EAH4|4)3..			2	1	1	4
+ATI Radeon HD 4400						.*ATI.*Radeon.* (HD|HD )44..						2	1	0	0
+ATI Radeon HD 4500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)45..				2	1	1	3.3
+ATI Radeon HD 4600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)46..				3	1	1	4
+ATI Radeon HD 4700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)47..				3	1	1	3.3
+ATI Radeon HD 4800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)48..				3	1	1	4
+ATI Radeon HD 5400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)54..				3	1	1	4.2
+ATI Radeon HD 5500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)55..				3	1	1	4.2
+ATI Radeon HD 5600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)56..				3	1	1	4.2
+ATI Radeon HD 5700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)57..				3	1	1	4.2
+ATI Radeon HD 5800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)58..				4	1	1	4.2
+ATI Radeon HD 5900						.*ATI.*Radeon.* (HD|HD )59..						4	1	1	4.2
+ATI Radeon HD 6200						.*ATI.*Radeon.* (HD|HD )62..						0	1	1	4.2
+ATI Radeon HD 6300						.*ATI.*Radeon.* (HD|HD )63..						1	1	1	4.2
+ATI Radeon HD 6400						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)64..				3	1	1	4.2
+ATI Radeon HD 6500						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)65..				3	1	1	4.2
+ATI Radeon HD 6600						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)66..				3	1	1	4.2
+ATI Radeon HD 6700						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)67..				3	1	1	4.2
+ATI Radeon HD 6800						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)68..				4	1	1	4.2
+ATI Radeon HD 6900						.*ATI.*(Radeon|ASUS).* (HD|HD |EAH)69..				5	1	1	4.2
+ATI Radeon OpenGL						.*ATI.*Radeon OpenGL.*								0	0	0	0
+ATI Radeon 2100							.*ATI.*Radeon 21..									0	1	1	2.1
+ATI Radeon 3000							.*ATI.*Radeon 30..									1	1	1	4
+ATI Radeon 3100							.*ATI.*Radeon 31..									0	1	1	3.3
+ATI Radeon 5xxx							.*ATI.*Radeon 5...									3	1	0	0
+ATI Radeon 7xxx							.*ATI.*Radeon 7...									0	1	1	2
+ATI Radeon 8xxx							.*ATI.*Radeon 8...									0	1	0	0
+ATI Radeon 9000							.*ATI.*Radeon 90..									0	1	1	1.3
+ATI Radeon 9100							.*ATI.*Radeon 91..									0	1	0	0
+ATI Radeon 9200							.*ATI.*Radeon 92..									0	1	1	1.3
+ATI Radeon 9500							.*ATI.*Radeon 95..									0	1	1	2.1
+ATI Radeon 9600							.*ATI.*Radeon 96..									0	1	1	2.1
+ATI Radeon 9700							.*ATI.*Radeon 97..									1	1	0	0
+ATI Radeon 9800							.*ATI.*Radeon 98..									1	1	1	2.1
+ATI Radeon RV250						.*ATI.*RV250.*										0	1	0	0
+ATI Radeon RV600						.*ATI.*RV6.*										1	1	0	0
+ATI Radeon RX700						.*ATI.*RX70.*										1	1	0	0
+ATI Radeon RX800						.*ATI.*Radeon RX80.*								2	1	0	0
+ATI RS880M								.*ATI.*RS880M										1	1	0	0
+ATI Radeon RX9550						.*ATI.*RX9550.*										1	1	0	0
+ATI Radeon VE							.*ATI.*Radeon.*VE.*									0	0	0	0
+ATI Radeon X300							.*ATI.*Radeon X3.*									1	1	1	2.1
+ATI Radeon X400							.*ATI.*Radeon ?X4.*									0	1	0	0
+ATI Radeon X500							.*ATI.*Radeon ?X5.*									1	1	1	2.1
+ATI Radeon X600							.*ATI.*(Radeon |ASUS Extreme A)X6.*					1	1	1	2.1
+ATI Radeon X700							.*ATI.*Radeon ?X7.*									2	1	1	2.1
+ATI Radeon X800							.*ATI.*Radeon ?X8.*									1	1	1	2.1
+ATI Radeon X900							.*ATI.*Radeon ?X9.*									2	1	0	0
+ATI Radeon X1000						.*ATI.*Radeon ?X10.*								2	1	0	2.1
+ATI Radeon X1200						.*ATI.*Radeon ?X12.*								2	1	0	2.1
+ATI Radeon X1400						.*ATI.*Radeon ?X14.*								2	1	0	2.1
+ATI Radeon X2300						.*ATI.*Radeon ?X23.*								2	1	0	2.1
+ATI Radeon Xpress						.*ATI.*Radeon Xpress.*								0	1	1	2.1
+ATI Rage 128							.*ATI.*Rage 128.*									0	1	0	0
+ATI R300 (9700)							.*R300.*											0	1	1	2.1
+ATI R350 (9800)							.*R350.*											1	1	0	0
+ATI R580 (X1900)						.*R580.*											3	1	0	0
+ATI RC410 (Xpress 200)					.*RC410.*											0	0	0	0
+ATI RS48x (Xpress 200x)					.*RS48.*											0	0	0	0
+ATI RS600 (Xpress 3200)					.*RS600.*											0	0	0	0
+ATI RV350 (9600)						.*RV350.*											0	1	0	0
+ATI RV370 (X300)						.*RV370.*											0	1	0	0
+ATI RV410 (X700)						.*RV410.*											1	1	0	0
+ATI RV515								.*RV515.*											1	1	0	0
+ATI RV570 (X1900 GT/PRO)				.*RV570.*											3	1	0	0
+ATI RV380								.*RV380.*											0	1	0	0
+ATI RV530								.*RV530.*											1	1	0	0
+ATI RX480 (Xpress 200P)					.*RX480.*											0	1	0	0
+ATI RX700								.*RX700.*											1	1	0	0
+AMD ANTILLES (HD 6990)					.*(AMD|ATI).*Antilles.*								3	1	0	0
+ATI ROBSON								.*(AMD|ATI).*ROBSON.*								3	1	0	4
+AMD BARTS (HD 6800)						.*(AMD|ATI).*Barts.*								3	1	1	2.1
+AMD WRESTLER							.*(AMD|ATI).*WRESTLER.*								3	1	1	4
+AMD SUMO								.*(AMD|ATI).*SUMO.*									3	1	1	4.1
+AMD CAICOS (HD 6400)					.*(AMD|ATI).*Caicos.*								3	1	0	0
+AMD CAYMAN (HD 6900)					.*(AMD|ATI).*(Cayman|CAYMAM).*						3	1	0	0
+AMD CEDAR (HD 5450)						.*(AMD|ATI).*Cedar.*								2	1	0	2.1
+AMD CYPRESS (HD 5800)					.*(AMD|ATI).*Cypress.*								3	1	0	0
+AMD HEMLOCK (HD 5970)					.*(AMD|ATI).*Hemlock.*								3	1	0	0
+AMD JUNIPER (HD 5700)					.*(AMD|ATI).*Juniper.*								3	1	0	0
+AMD PARK								.*(AMD|ATI).*Park.*									3	1	0	0
+AMD REDWOOD (HD 5500/5600)				.*(AMD|ATI).*Redwood.*								3	1	0	1.4
+AMD TURKS (HD 6500/6600)				.*(AMD|ATI).*Turks.*								3	1	0	2.1
+AMD RS780 (HD 3200)						.*RS780.*											0	1	1	2.1
+AMD RS880 (HD 4200)						.*RS880.*											0	1	1	3.2
+AMD RV610 (HD 2400)						.*RV610.*											1	1	0	0
+AMD RV620 (HD 3400)						.*RV620.*											1	1	0	0
+AMD RV630 (HD 2600)						.*RV630.*											2	1	0	0
+AMD RV635 (HD 3600)						.*RV635.*											3	1	0	1.4
+AMD RV670 (HD 3800)						.*RV670.*											3	1	0	0
+AMD R680 (HD 3870 X2)					.*R680.*											3	1	0	0
+AMD R700 (HD 4800 X2)					.*R700.*											3	1	0	0
+AMD RV710 (HD 4300)						.*RV710.*											0	1	1	1.4
+AMD RV730 (HD 4600)						.*RV730.*											3	1	0	1.4
+AMD RV740 (HD 4700)						.*RV740.*											3	1	0	0
+AMD RV770 (HD 4800)						.*RV770.*											3	1	0	0
+AMD RV790 (HD 4800)						.*RV790.*											3	1	0	0
+ATI 760G/Radeon 3000					.*ATI.*AMD 760G.*									1	1	1	3.3
+ATI 780L/Radeon 3000					.*ATI.*AMD 780L.*									1	1	0	0
+ATI Radeon DDR							.*ATI.*Radeon ?DDR.*								0	1	0	0
+ATI FirePro 2000						.*ATI.*FirePro 2.*									2	1	1	4.2
+ATI FirePro 3000						.*ATI.*FirePro V3.*									2	1	0	0
+ATI FirePro 4000						.*ATI.*FirePro V4.*									2	1	0	4.1
+ATI FirePro 5000						.*ATI.*FirePro V5.*									3	1	0	0
+ATI FirePro 7000						.*ATI.*FirePro V7.*									3	1	0	0
+ATI FirePro M							.*ATI.*FirePro M.*									3	1	1	4.2
+ATI R300 (9700)							.*R300.*											0	1	1	2.1
+Intel X3100								.*Intel.*X3100.*									1	1	1	2.1
+Intel GMA 3600							.*Intel.* 3600.*									0	1	1	3
+Intel 830M								.*Intel.*830M										0	0	0	0
+Intel 845G								.*Intel.*845G										0	0	1	1.4
+Intel 855GM								.*Intel.*855GM										0	0	1	1.4
+Intel 865G								.*Intel.*865G										0	0	1	1.4
+Intel 900								.*Intel.*900.*900									0	0	0	0
+Intel 915GM								.*Intel.*915GM										0	0	1	1.4
+Intel 915G								.*Intel.*915G										0	0	1	1.4
+Intel 945GM								.*Intel.*945GM.*									0	1	1	1.4
+Intel 945G								.*Intel.*945G.*										0	1	1	1.4
+Intel 950								.*Intel.*950.*										0	1	1	1.4
+Intel 965								.*Intel.*965.*										0	1	1	2.1
+Intel G33								.*Intel.*G33.*										1	0	1	1.4
+Intel G41								.*Intel.*G41.*										1	1	1	2.1
+Intel G45								.*Intel.*G45.*										1	1	1	2.1
+Intel Bear Lake							.*Intel.*Bear Lake.*								1	0	1	1.4
+Intel Broadwater						.*Intel.*Broadwater.*								0	0	1	1.4
+Intel Brookdale							.*Intel.*Brookdale.*								0	0	1	1.3
+Intel Cantiga							.*Intel.*Cantiga.*									0	0	1	2
+Intel Eaglelake							.*Intel.*Eaglelake.*								1	1	1	2
+Intel Graphics Media HD					.*Intel.*Graphics Media.*HD.*						1	1	1	2.1
+Intel HD Graphics 2000					.*Intel.*HD Graphics 2.*							2	1	0	4
+Intel HD Graphics 3000					.*Intel.*HD Graphics 3.*							3	1	1	3.1
+Intel HD Graphics 4000					.*Intel.*HD Graphics 4.*							3	1	1	4
+Intel HD Graphics						.*Intel.*HD Graphics.*								2	1	1	4
+Intel Mobile 4 Series					.*Intel.*Mobile.* 4 Series.*						0	1	1	2.1
+Intel 4 Series Internal					.*Intel.* 4 Series Internal.*						1	1	1	2.1
+Intel Media Graphics HD					.*Intel.*Media Graphics HD.*						0	1	0	0
+Intel Montara							.*Intel.*Montara.*									0	0	1	1.3
+Intel Pineview							.*Intel.*Pineview.*									0	1	1	1.4
+Intel Springdale						.*Intel.*Springdale.*								0	0	1	1.3
+Intel Grantsdale						.*Intel.*Grantsdale.*								1	1	0	0
+Intel Q45/Q43							.*Intel.*Q4.*										1	1	1	2.1
+Intel B45/B43							.*Intel.*B4.*										1	1	1	2.1
+Intel 3D-Analyze						.*Intel.*3D-Analyze.*								2	1	0	0
+Matrox									.*Matrox.*											0	0	0	0
+Mesa									.*Mesa.*											1	0	1	3
+Gallium									.*Gallium.*											1	1	1	2.1
+NVIDIA G100M							.*NVIDIA .* 10[0-9]M.*								4	1	1	3.3
+NVIDIA G 110M							.*NVIDIA .* 11[0-9]M.*								1	1	1	3.3
+NVIDIA G 120M							.*NVIDIA .* 12[0-9]M.*								1	1	1	3.3
+NVIDIA G 200M							.*NVIDIA .* 20[0-9]M.*								1	1	0	0
+NVIDIA G 410M							.*NVIDIA .* 41[0-9]M.*								3	1	1	4.2
+NVIDIA GT 130M							.*NVIDIA .*GT 13[0-9]M.*							3	1	1	3.3
+NVIDIA GT 140M							.*NVIDIA .*GT 14[0-9]M.*							3	1	1	3.3
+NVIDIA GT 150M							.*NVIDIA .*GTS 15[0-9]M.*							2	1	0	0
+NVIDIA GTS 160M							.*NVIDIA .*GTS 16[0-9]M.*							2	1	0	0
+NVIDIA G210M							.*NVIDIA .*G21[0-9]M.*								3	1	0	3.3
+NVIDIA GT 220M							.*NVIDIA .*GT 22[0-9]M.*							3	1	1	3.3
+NVIDIA GT 230M							.*NVIDIA .*GT 23[0-9]M.*							3	1	1	3.3
+NVIDIA GT 240M							.*NVIDIA .*GT 24[0-9]M.*							3	1	1	3.3
+NVIDIA GTS 250M							.*NVIDIA .*GTS 25[0-9]M.*							3	1	0	3.3
+NVIDIA GTS 260M							.*NVIDIA .*GTS 26[0-9]M.*							3	1	0	0
+NVIDIA GTX 260M							.*NVIDIA .*GTX 26[0-9]M.*							3	1	0	3.3
+NVIDIA GTX 270M							.*NVIDIA .*GTX 27[0-9]M.*							3	1	0	0
+NVIDIA GTX 280M							.*NVIDIA .*GTX 28[0-9]M.*							3	1	0	3.3
+NVIDIA 300M								.*NVIDIA .*GT 30[0-9]M.*							3	1	1	4.2
+NVIDIA G 310M							.*NVIDIA .* 31[0-9]M.*								2	1	0	3.3
+NVIDIA GT 320M							.*NVIDIA .* 32[0-9]M.*								3	1	0	3.3
+NVIDIA GT 330M							.*NVIDIA .*GT 33[0-9]M.*							3	1	1	3.3
+NVIDIA GT 340M							.*NVIDIA .*GT 34[0-9]M.*							4	1	1	3.3
+NVIDIA GTS 350M							.*NVIDIA .*GTS 35[0-9]M.*							4	1	1	3.3
+NVIDIA GTS 360M							.*NVIDIA .*GTS 36[0-9]M.*							5	1	1	3.3
+NVIDIA 400M								.*NVIDIA .* 40[0-9]M.*								2	1	0	0
+NVIDIA 410M								.*NVIDIA .* 41[0-9]M.*								3	1	0	0
+NVIDIA GT 420M							.*NVIDIA .*GT 42[0-9]M.*							3	1	1	4.2
+NVIDIA GT 430M							.*NVIDIA .*GT 43[0-9]M.*							3	1	1	4.2
+NVIDIA GT 440M							.*NVIDIA .*GT 44[0-9]M.*							3	1	1	4.2
+NVIDIA GT 450M							.*NVIDIA .*GT 45[0-9]M.*							3	1	0	0
+NVIDIA GTX 460M							.*NVIDIA .*GTX 46[0-9]M.*							4	1	1	4.3
+NVIDIA GTX 470M							.*NVIDIA .*GTX 47[0-9]M.*							3	1	0	4.2
+NVIDIA GTX 480M							.*NVIDIA .*GTX 48[0-9]M.*							3	1	1	4.2
+NVIDIA GT 520M							.*NVIDIA .*GT 52[0-9]M.*							3	1	1	4.2
+NVIDIA GT 530M							.*NVIDIA .*GT 53[0-9]M.*							3	1	1	4.2
+NVIDIA GT 540M							.*NVIDIA .*GT 54[0-9]M.*							3	1	1	4.2
+NVIDIA GT 550M							.*GeForce GT 55[0-9]M.*								3	1	1	4.2
+NVIDIA GTX 560M							.*NVIDIA .*GTX 56[0-9]M.*							3	1	0	4.2
+NVIDIA GTX 570M							.*NVIDIA .*GTX 57[0-9]M.*							5	1	0	4.2
+NVIDIA GTX 580M							.*NVIDIA .*GTX 58[0-9]M.*							5	1	1	4.2
+NVIDIA 610M								.*NVIDIA.* 61[0-9]M.*								3	1	1	4.2
+NVIDIA GT 620M							.*NVIDIA .*GT 62[0-9]M.*							3	1	0	4.2
+NVIDIA GT 630M							.*NVIDIA .*GT 63[0-9]M.*							3	1	0	4.2
+NVIDIA GT 640M							.*NVIDIA .*GT 64[0-9]M.*							3	1	0	4.2
+NVIDIA GT 650M							.*NVIDIA .*GT 65[0-9]M.*							3	1	0	4.2
+NVIDIA GTX 660M							.*NVIDIA .*GTX 66[0-9]M.*							5	1	0	4.3
+NVIDIA GTX 670M							.*NVIDIA .*GTX 67[0-9]M.*							5	1	1	4.2
+NVIDIA GTX 680M							.*NVIDIA .*GTX 68[0-9]M.*							5	1	0	4.2
+NVIDIA GTX 690M							.*NVIDIA .*GTX 69[0-9]M.*							5	1	0	0
+NVIDIA G100								.*NVIDIA .*G10.*									3	1	1	4.2
+NVIDIA GT 120							.*NVIDIA .*GT 12.*									2	1	0	3.3
+NVIDIA GT 130							.*NVIDIA .*GT 13.*									2	1	0	3.3
+NVIDIA GT 140							.*NVIDIA .*GT 14.*									2	1	0	3.3
+NVIDIA GTS 150							.*NVIDIA .*GTS 15.*									2	1	0	0
+NVIDIA 200								.*NVIDIA .*GeForce 20.*								2	1	1	3.3
+NVIDIA G200								.*NVIDIA .*GeForce G20.*							2	1	1	3.3
+NVIDIA G210								.*NVIDIA .*GeForce G210.*							3	1	1	3.3
+NVIDIA 210								.*NVIDIA .*GeForce 210.*							3	1	1	3.3
+NVIDIA GT 220							.*NVIDIA .*GT 22.*									2	1	1	3.3
+NVIDIA GT 230							.*NVIDIA .*GT 23.*									2	1	1	3.3
+NVIDIA GT 240							.*NVIDIA .*GT 24.*									4	1	1	3.3
+NVIDIA GTS 240							.*NVIDIA .*GTS 24.*									4	1	1	3.3
+NVIDIA GTS 250							.*NVIDIA .*GTS 25.*									4	1	1	3.3
+NVIDIA GTX 260							.*NVIDIA .*GTX 26.*									4	1	1	3.3
+NVIDIA GTX 270							.*NVIDIA .*GTX 27.*									4	1	0	3.3
+NVIDIA GTX 280							.*NVIDIA .*GTX 28.*									4	1	1	3.3
+NVIDIA GTX 290							.*NVIDIA .*GTX 29.*									5	1	0	3.3
+NVIDIA 310								.*NVIDIA .*GeForce 310.*							3	1	1	3.3
+NVIDIA 315								.*NVIDIA .*GeForce 315.*							3	1	1	3.3
+NVIDIA GT 320							.*NVIDIA .*GT 32.*									3	1	0	3.3
+NVIDIA GT 330							.*NVIDIA .*GT 33.*									3	1	0	3.3
+NVIDIA GT 340							.*NVIDIA .*GT 34.*									3	1	0	3.3
+NVIDIA 405								.*NVIDIA .* 405.*									3	1	0	3.3
+NVIDIA GT 420							.*NVIDIA .*GT 42.*									3	1	1	4.2
+NVIDIA GT 430							.*NVIDIA .*GT 43.*									3	1	1	4.3
+NVIDIA GT 440							.*NVIDIA .*GT 44.*									4	1	0	4.3
+NVIDIA GTS 450							.*NVIDIA .*GTS 45.*									4	1	1	4.2
+NVIDIA GTX 460							.*NVIDIA .*GTX 46.*									5	1	1	4.3
+NVIDIA GTX 470							.*NVIDIA .*GTX 47.*									5	1	1	4.2
+NVIDIA GTX 480							.*NVIDIA .*GTX 48.*									5	1	1	4.2
+NVIDIA 510								.*NVIDIA .* 510.*									3	1	0	4.2
+NVIDIA GT 520							.*NVIDIA .*GT 52.*									3	1	1	4.2
+NVIDIA GT 530							.*NVIDIA .*GT 53.*									3	1	1	4.2
+NVIDIA GT 540							.*NVIDIA .*GT 54.*									3	1	1	4.2
+NVIDIA GTX 550							.*NVIDIA .*GTX 55.*									5	1	1	4.3
+NVIDIA GTX 560							.*NVIDIA .*GTX 56.*									5	1	1	4.3
+NVIDIA GTX 570							.*NVIDIA .*GTX 57.*									5	1	1	4.2
+NVIDIA GTX 580							.*NVIDIA .*GTX 58.*									5	1	1	4.3
+NVIDIA GTX 590							.*NVIDIA .*GTX 59.*									5	1	1	4.2
+NVIDIA 605								.*NVIDIA .* 605.*									3	1	1	4.2
+NVIDIA GT 610							.*NVIDIA .*GT 61.*									3	1	1	4.2
+NVIDIA GT 620							.*NVIDIA .*GT 62.*									3	1	0	4.2
+NVIDIA GT 630							.*NVIDIA .*GT 63.*									3	1	0	4.2
+NVIDIA GT 640							.*NVIDIA .*GT 64.*									3	1	0	4.2
+NVIDIA GT 650							.*NVIDIA .*GT 65.*									3	1	1	4.2
+NVIDIA GTX 650							.*NVIDIA .*GTX 65.*									3	1	1	4.2
+NVIDIA GTX 660							.*NVIDIA .*GTX 66.*									5	1	0	4.3
+NVIDIA GTX 670							.*NVIDIA .*GTX 67.*									5	1	1	4.2
+NVIDIA GTX 680							.*NVIDIA .*GTX 68.*									5	1	1	4.2
+NVIDIA GTX 690							.*NVIDIA .*GTX 69.*									5	1	1	4.2
+NVIDIA C51								.*NVIDIA .*C51.*									0	1	1	2
+NVIDIA G72								.*NVIDIA .*G72.*									1	1	0	0
+NVIDIA G73								.*NVIDIA .*G73.*									1	1	0	0
+NVIDIA G84								.*NVIDIA .*G84.*									2	1	0	0
+NVIDIA G86								.*NVIDIA .*G86.*									3	1	0	0
+NVIDIA G92								.*NVIDIA .*G92.*									3	1	0	0
+NVIDIA GeForce							.*GeForce 256.*										0	0	0	0
+NVIDIA GeForce 2						.*GeForce ?2 ?.*									0	1	1	1.5
+NVIDIA GeForce 4						.*NVIDIA .*GeForce ?4.*								0	1	1	1.5
+NVIDIA GeForce 6100						.*NVIDIA .*GeForce 61.*								3	1	1	4.2
+NVIDIA GeForce 6200						.*NVIDIA .*GeForce 62.*								0	1	1	2.1
+NVIDIA GeForce 6500						.*NVIDIA .*GeForce 65.*								1	1	1	2.1
+NVIDIA GeForce 6600						.*NVIDIA .*GeForce 66.*								2	1	1	2.1
+NVIDIA GeForce 6700						.*NVIDIA .*GeForce 67.*								2	1	1	2.1
+NVIDIA GeForce 6800						.*NVIDIA .*GeForce 68.*								1	1	1	2.1
+NVIDIA GeForce 7000						.*NVIDIA .*GeForce 70.*								1	1	1	2.1
+NVIDIA GeForce 7100						.*NVIDIA .*GeForce 71.*								1	1	1	2.1
+NVIDIA GeForce 7200						.*NVIDIA .*GeForce 72.*								1	1	0	0
+NVIDIA GeForce 7300						.*NVIDIA .*GeForce 73.*								1	1	1	2.1
+NVIDIA GeForce 7500						.*NVIDIA .*GeForce 75.*								2	1	1	2.1
+NVIDIA GeForce 7600						.*NVIDIA .*GeForce 76.*								2	1	1	2.1
+NVIDIA GeForce 7800						.*NVIDIA .*GeForce 78.*								2	1	1	2.1
+NVIDIA GeForce 7900						.*NVIDIA .*GeForce 79.*								3	1	1	2.1
+NVIDIA GeForce 8100						.*NVIDIA .*GeForce 81.*								1	1	0	3.3
+NVIDIA GeForce 8200M					.*NVIDIA .*GeForce 820[0-9]M.*						1	1	0	3.3
+NVIDIA GeForce 8200						.*NVIDIA .*GeForce 82.*								1	1	0	3.3
+NVIDIA GeForce 8300						.*NVIDIA .*GeForce 83.*								3	1	1	3.3
+NVIDIA GeForce 8400M					.*NVIDIA .*GeForce 840[0-9]M.*						1	1	1	3.3
+NVIDIA GeForce 8400						.*NVIDIA .*GeForce 84.*								2	1	1	3.3
+NVIDIA GeForce 8500						.*NVIDIA .*GeForce 85.*								2	1	1	3.3
+NVIDIA GeForce 8600M					.*NVIDIA .*GeForce 860[0-9]M.*						2	1	1	3.3
+NVIDIA GeForce 8600						.*NVIDIA .*GeForce 86.*								3	1	1	3.3
+NVIDIA GeForce 8700M					.*NVIDIA .*GeForce 870[0-9]M.*						2	1	1	3.3
+NVIDIA GeForce 8700						.*NVIDIA .*GeForce 87.*								3	1	0	0
+NVIDIA GeForce 8800M					.*NVIDIA .*GeForce 880[0-9]M.*						2	1	1	3.3
+NVIDIA GeForce 8800						.*NVIDIA .*GeForce 88.*								3	1	1	3.3
+NVIDIA GeForce 9100M					.*NVIDIA .*GeForce 910[0-9]M.*						0	1	0	3.3
+NVIDIA GeForce 9100						.*NVIDIA .*GeForce 91.*								0	1	0	3.3
+NVIDIA GeForce 9200M					.*NVIDIA .*GeForce 920[0-9]M.*						1	1	0	3.3
+NVIDIA GeForce 9200						.*NVIDIA .*GeForce 92.*								1	1	0	3.3
+NVIDIA GeForce 9300M					.*NVIDIA .*GeForce 930[0-9]M.*						1	1	1	3.3
+NVIDIA GeForce 9300						.*NVIDIA .*GeForce 93.*								1	1	1	3.3
+NVIDIA GeForce 9400M					.*NVIDIA .*GeForce 940[0-9]M.*						2	1	1	3.3
+NVIDIA GeForce 9400						.*NVIDIA .*GeForce 94.*								3	1	1	3.3
+NVIDIA GeForce 9500M					.*NVIDIA .*GeForce 950[0-9]M.*						1	1	1	3.3
+NVIDIA GeForce 9500						.*NVIDIA .*GeForce 95.*								3	1	1	3.3
+NVIDIA GeForce 9600M					.*NVIDIA .*GeForce 960[0-9]M.*						2	1	1	3.3
+NVIDIA GeForce 9600						.*NVIDIA .*GeForce 96.*								3	1	1	3.3
+NVIDIA GeForce 9700M					.*NVIDIA .*GeForce 970[0-9]M.*						0	1	1	3.3
+NVIDIA GeForce 9800M					.*NVIDIA .*GeForce 980[0-9]M.*						2	1	1	3.3
+NVIDIA GeForce 9800						.*NVIDIA .*GeForce 98.*								3	1	1	3.3
+NVIDIA GeForce FX 5100					.*NVIDIA .*GeForce FX 51.*							0	1	0	0
+NVIDIA GeForce FX 5200					.*NVIDIA .*GeForce FX 52.*							0	1	0	2.1
+NVIDIA GeForce FX 5300					.*NVIDIA .*GeForce FX 53.*							0	1	0	0
+NVIDIA GeForce FX 5500					.*NVIDIA .*GeForce FX 55.*							0	1	1	2.1
+NVIDIA GeForce FX 5600					.*NVIDIA .*GeForce FX 56.*							1	1	1	2.1
+NVIDIA GeForce FX 5700					.*NVIDIA .*GeForce FX 57.*							0	1	1	2.1
+NVIDIA GeForce FX 5800					.*NVIDIA .*GeForce FX 58.*							1	1	0	0
+NVIDIA GeForce FX 5900					.*NVIDIA .*GeForce FX 59.*							1	1	1	2.1
+NVIDIA GeForce FX Go5100				.*NVIDIA .*GeForce FX Go51.*						0	1	0	0
+NVIDIA GeForce FX Go5200				.*NVIDIA .*GeForce FX Go52.*						0	1	0	1.5
+NVIDIA GeForce FX Go5300				.*NVIDIA .*GeForce FX Go53.*						0	1	0	0
+NVIDIA GeForce FX Go5500				.*NVIDIA .*GeForce FX Go55.*						0	1	0	0
+NVIDIA GeForce FX Go5600				.*NVIDIA .*GeForce FX Go56.*						0	1	1	2.1
+NVIDIA GeForce FX Go5700				.*NVIDIA .*GeForce FX Go57.*						1	1	1	1.5
+NVIDIA GeForce FX Go5800				.*NVIDIA .*GeForce FX Go58.*						1	1	0	0
+NVIDIA GeForce FX Go5900				.*NVIDIA .*GeForce FX Go59.*						1	1	0	0
+NVIDIA GeForce FX Go5xxx				.*NVIDIA .*GeForce FX Go.*							0	1	0	0
+NVIDIA GeForce Go 6100					.*NVIDIA .*GeForce Go 61.*							0	1	1	2.1
+NVIDIA GeForce Go 6200					.*NVIDIA .*GeForce Go 62.*							0	1	0	1.5
+NVIDIA GeForce Go 6400					.*NVIDIA .*GeForce Go 64.*							1	1	1	2.1
+NVIDIA GeForce Go 6500					.*NVIDIA .*GeForce Go 65.*							1	1	0	0
+NVIDIA GeForce Go 6600					.*NVIDIA .*GeForce Go 66.*							0	1	1	2.1
+NVIDIA GeForce Go 6700					.*NVIDIA .*GeForce Go 67.*							1	1	0	0
+NVIDIA GeForce Go 6800					.*NVIDIA .*GeForce Go 68.*							0	1	1	2.1
+NVIDIA GeForce Go 7200					.*NVIDIA .*GeForce Go 72.*							1	1	0	2.1
+NVIDIA GeForce Go 7300 LE				.*NVIDIA .*GeForce Go 73.*LE.*						1	1	0	0
+NVIDIA GeForce Go 7300					.*NVIDIA .*GeForce Go 73.*							1	1	1	2.1
+NVIDIA GeForce Go 7400					.*NVIDIA .*GeForce Go 74.*							1	1	1	2.1
+NVIDIA GeForce Go 7600					.*NVIDIA .*GeForce Go 76.*							1	1	1	2.1
+NVIDIA GeForce Go 7700					.*NVIDIA .*GeForce Go 77.*							0	1	1	2.1
+NVIDIA GeForce Go 7800					.*NVIDIA .*GeForce Go 78.*							2	1	0	0
+NVIDIA GeForce Go 7900					.*NVIDIA .*GeForce Go 79.*							1	1	1	2.1
+NVIDIA D9M								.*NVIDIA .*D9M.*									1	1	0	0
+NVIDIA G94								.*NVIDIA .*G94.*									3	1	0	0
+NVIDIA GeForce Go 6						.*GeForce Go 6.*									1	1	0	0
+NVIDIA ION 2							.*NVIDIA .*ION 2.*									2	1	0	0
+NVIDIA ION 								.*NVIDIA Corporation.*ION.*							2	1	1	3.3
+NVIDIA NB8M								.*NVIDIA .*NB8M.*									1	1	0	0
+NVIDIA NB8P								.*NVIDIA .*NB8P.*									2	1	0	0
+NVIDIA NB9E								.*NVIDIA .*NB9E.*									3	1	0	0
+NVIDIA NB9M								.*NVIDIA .*NB9M.*									1	1	0	0
+NVIDIA NB9P								.*NVIDIA .*NB9P.*									2	1	0	0
+NVIDIA N10								.*NVIDIA .*N10.*									1	1	0	2.1
+NVIDIA GeForce PCX						.*GeForce PCX.*										0	1	0	1.5
+NVIDIA Generic							.*NVIDIA .*Unknown.*								0	0	0	2.1
+NVIDIA NV17								.*NVIDIA .*NV17.*									0	1	0	0
+NVIDIA NV34								.*NVIDIA .*NV34.*									0	1	0	0
+NVIDIA NV35								.*NVIDIA .*NV35.*									0	1	0	0
+NVIDIA NV36								.*NVIDIA .*NV36.*									1	1	0	0
+NVIDIA NV41								.*NVIDIA .*NV41.*									1	1	0	0
+NVIDIA NV43								.*NVIDIA .*NV43.*									1	1	0	0
+NVIDIA NV44								.*NVIDIA .*NV44.*									1	1	0	0
+NVIDIA nForce							.*NVIDIA .*nForce.*									0	0	0	3.3
+NVIDIA MCP51							.*NVIDIA .*MCP51.*									1	1	0	0
+NVIDIA MCP61							.*NVIDIA .*MCP61.*									1	1	0	2.1
+NVIDIA MCP67							.*NVIDIA .*MCP67.*									1	1	0	0
+NVIDIA MCP68							.*NVIDIA .*MCP68.*									1	1	0	0
+NVIDIA MCP73							.*NVIDIA .*MCP73.*									1	1	0	0
+NVIDIA MCP77							.*NVIDIA .*MCP77.*									1	1	0	0
+NVIDIA MCP78							.*NVIDIA .*MCP78.*									1	1	0	0
+NVIDIA MCP79							.*NVIDIA .*MCP79.*									1	1	0	0
+NVIDIA MCP7A							.*NVIDIA .*MCP7A.*									1	1	0	0
+NVIDIA Quadro2							.*Quadro2.*											0	1	0	1.5
+NVIDIA Quadro 1000M						.*Quadro.* (K1|1)00[0-9]M.*							2	1	0	4.2
+NVIDIA Quadro 2000 M/D					.*Quadro.* (K2|2)000.*								3	1	0	4.2
+NVIDIA Quadro 3000M						.*Quadro.* (K3|3)00[0-9]M.*							3	1	0	4.2
+NVIDIA Quadro 4000M						.*Quadro.* (K4|4)00[0-9]M.*							3	1	0	4.2
+NVIDIA Quadro 4000						.*Quadro 4000.*										3	1	0	4.2
+NVIDIA Quadro 50x0 M					.*Quadro.* 50.0.*									3	1	0	4.2
+NVIDIA Quadro 6000						.*Quadro.* 6000.*									3	1	0	0
+NVIDIA Quadro 400						.*Quadro.* 400.*									2	1	0	3.3
+NVIDIA Quadro 600						.*Quadro.* 600.*									2	1	0	4.2
+NVIDIA Quadro4							.*Quadro4.*											0	1	0	1.5
+NVIDIA Quadro DCC						.*Quadro DCC.*										0	1	0	0
+NVIDIA Quadro CX						.*Quadro.*CX.*										3	1	0	0
+NVIDIA Quadro FX 770M					.*Quadro.*FX 77[0-9]M.*								2	1	0	3.3
+NVIDIA Quadro FX 1500M					.*Quadro.*FX 150[0-9]M.*							1	1	0	2.1
+NVIDIA Quadro FX 1600M					.*Quadro.*FX 160[0-9]M.*							2	1	0	3.3
+NVIDIA Quadro FX 2500M					.*Quadro.*FX 250[0-9]M.*							2	1	0	2.1
+NVIDIA Quadro FX 2700M					.*Quadro.*FX 270[0-9]M.*							3	1	0	3.3
+NVIDIA Quadro FX 2800M					.*Quadro.*FX 280[0-9]M.*							3	1	0	3.3
+NVIDIA Quadro FX 3500					.*Quadro.*FX 3500.*									2	1	0	2.1
+NVIDIA Quadro FX 3600					.*Quadro.*FX 3600.*									3	1	0	3.3
+NVIDIA Quadro FX 3700					.*Quadro.*FX 3700.*									3	1	0	3.3
+NVIDIA Quadro FX 3800					.*Quadro.*FX 3800.*									3	1	0	3.3
+NVIDIA Quadro FX 4500					.*Quadro.*FX 45.*									3	1	0	2.1
+NVIDIA Quadro FX 880M					.*Quadro.*FX 88[0-9]M.*								3	1	0	3.3
+NVIDIA Quadro FX 4800					.*NVIDIA .*Quadro FX 4800.*							3	1	0	3.1
+NVIDIA Quadro FX						.*Quadro FX.*										1	1	0	3.3
+NVIDIA Quadro NVS 1xxM					.*Quadro NVS 1.[05]M.*								0	1	1	3.3
+NVIDIA Quadro NVS 300M					.*NVIDIA .*NVS 30[0-9]M.*							2	1	0	0
+NVIDIA Quadro NVS 320M					.*NVIDIA .*NVS 32[0-9]M.*							2	1	0	0
+NVIDIA Quadro NVS 2100M					.*NVIDIA .*NVS 210[0-9]M.*							2	1	0	3.3
+NVIDIA Quadro NVS 3100M					.*NVIDIA .*NVS 310[0-9]M.*							2	1	0	3.3
+NVIDIA Quadro NVS 4200M					.*NVIDIA .*NVS 420[0-9]M.*							2	1	0	4.2
+NVIDIA Quadro NVS 5100M					.*NVIDIA .*NVS 510[0-9]M.*							2	1	0	0
+NVIDIA Quadro NVS						.*NVIDIA .*NVS										0	1	0	4.2
+NVIDIA Corporation N12P					.*NVIDIA .*N12P.*									1	1	1	4.1
+NVIDIA Corporation N11M					.*NVIDIA .*N11M.*									2	1	0	3.1
+NVIDIA RIVA TNT							.*RIVA TNT.*										0	0	0	1.5
+S3										.*S3 Graphics.*										0	0	1	1.4
+SiS										SiS.*												0	0	1	1.5
+Trident									Trident.*											0	0	0	0
+Tungsten Graphics						Tungsten.*											0	0	0	0
+XGI										XGI.*												0	0	0	0
+VIA										VIA.*												0	0	0	0
+Apple Generic							Apple.*Generic.*									0	0	0	0
+Apple Software Renderer					Apple.*Software Renderer.*							0	0	0	0
+Humper									Humper.*											0	1	1	2.1
+PowerVR SGX545							.*PowerVR SGX.*										1	1	1	3
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 39d1b3de50b686f98c09ccb9e9205590368e9e7c..e366de9b13c2c62fcdb5f1266e97fbdee513b33a 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -135,6 +135,16 @@ void LLDrawPoolAvatar::prerender()
 	{
 		sBufferUsage = GL_STREAM_DRAW_ARB;
 	}
+
+	if (!mDrawFace.empty())
+	{
+		const LLFace *facep = mDrawFace[0];
+		if (facep && facep->getDrawable())
+		{
+			LLVOAvatar* avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
+			updateRiggedVertexBuffers(avatarp);
+		}
+	}
 }
 
 LLMatrix4& LLDrawPoolAvatar::getModelView()
@@ -1434,6 +1444,65 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 	}
 }
 
+void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
+{
+	face->setGeomIndex(0);
+	face->setIndicesIndex(0);
+		
+	//rigged faces do not batch textures
+	face->setTextureIndex(255);
+
+	if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
+	{ //make a new buffer
+		if (sShaderLevel > 0)
+		{
+			buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
+		}
+		else
+		{
+			buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
+		}
+		buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
+	}
+	else
+	{ //resize existing buffer
+		buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
+	}
+
+	face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
+	face->setVertexBuffer(buffer);
+
+	U16 offset = 0;
+		
+	LLMatrix4 mat_vert = skin->mBindShapeMatrix;
+	glh::matrix4f m((F32*) mat_vert.mMatrix);
+	m = m.inverse().transpose();
+		
+	F32 mat3[] = 
+	{ m.m[0], m.m[1], m.m[2],
+		m.m[4], m.m[5], m.m[6],
+		m.m[8], m.m[9], m.m[10] };
+
+	LLMatrix3 mat_normal(mat3);				
+
+	//let getGeometryVolume know if alpha should override shiny
+	U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
+
+	if (type == LLDrawPool::POOL_ALPHA)
+	{
+		face->setPoolType(LLDrawPool::POOL_ALPHA);
+	}
+	else
+	{
+		face->setPoolType(LLDrawPool::POOL_AVATAR);
+	}
+
+	//llinfos << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << llendl;
+	face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
+
+	buffer->flush();
+}
+
 void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
 {
 	LLVector4a* weight = vol_face.mWeights;
@@ -1453,60 +1522,27 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
 		buffer->getNumIndices() != vol_face.mNumIndices ||
 		(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
 	{
-		face->setGeomIndex(0);
-		face->setIndicesIndex(0);
-		
-		//rigged faces do not batch textures
-		face->setTextureIndex(255);
-
-		if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
-		{ //make a new buffer
-			if (sShaderLevel > 0)
+		if (drawable && drawable->isState(LLDrawable::REBUILD_ALL))
+		{ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
+			for (S32 i = 0; i < drawable->getNumFaces(); ++i)
 			{
-				buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
-			}
-			else
-			{
-				buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
+				LLFace* facep = drawable->getFace(i);
+				U32 face_data_mask = facep->getRiggedVertexBufferDataMask();
+				if (face_data_mask)
+				{
+					LLPointer<LLVertexBuffer> cur_buffer = facep->getVertexBuffer();
+					const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i);
+					getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face);
+				}
 			}
-			buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
-		}
-		else
-		{ //resize existing buffer
-			buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
-		}
-
-		face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
-		face->setVertexBuffer(buffer);
-
-		U16 offset = 0;
-		
-		LLMatrix4 mat_vert = skin->mBindShapeMatrix;
-		glh::matrix4f m((F32*) mat_vert.mMatrix);
-		m = m.inverse().transpose();
-		
-		F32 mat3[] = 
-		{ m.m[0], m.m[1], m.m[2],
-		  m.m[4], m.m[5], m.m[6],
-		  m.m[8], m.m[9], m.m[10] };
-
-		LLMatrix3 mat_normal(mat3);				
-
-		//let getGeometryVolume know if alpha should override shiny
-		U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture());
+			drawable->clearState(LLDrawable::REBUILD_ALL);
 
-		if (type == LLDrawPool::POOL_ALPHA)
-		{
-			face->setPoolType(LLDrawPool::POOL_ALPHA);
+			buffer = face->getVertexBuffer();
 		}
 		else
-		{
-			face->setPoolType(LLDrawPool::POOL_AVATAR);
+		{ //just rebuild this face
+			getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
 		}
-
-		face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
-
-		buffer->flush();
 	}
 
 	if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
@@ -1591,11 +1627,6 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
 			}
 		}
 	}
-
-	if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1))
-	{
-		drawable->clearState(LLDrawable::REBUILD_ALL);
-	}
 }
 
 void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
@@ -1771,7 +1802,6 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
 
 void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)
 {
-	updateRiggedVertexBuffers(avatar);
 	renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);
 }
 
@@ -1840,7 +1870,6 @@ void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
 
 void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
 {
-	updateRiggedVertexBuffers(avatar);
 	renderRigged(avatar, RIGGED_SIMPLE);
 }
 
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 7d0368a9459d7b7363228e12e7968730e490f14b..4fbda1f862b90aa67a98d3d17b8a82b7beb5223e 100755
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -133,6 +133,7 @@ class LLDrawPoolAvatar : public LLFacePool
 	void endDeferredRiggedSimple();
 	void endDeferredRiggedBump();
 		
+	void getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);
 	void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,
 									  LLFace* facep, 
 									  const LLMeshSkinInfo* skin, 
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 7882fe6f3325b01ae92471f71a23a12a20f6cdb9..ef816ddaf66e996d3717f86f8eeacb76c9881ae0 100755
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -768,7 +768,7 @@ bool less_than_max_mag(const LLVector4a& vec)
 }
 
 BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
-								const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
+								const LLMatrix4& mat_vert_in, BOOL global_volume)
 {
 	//get bounding box
 	if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
@@ -777,10 +777,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
 		LLMatrix4a mat_vert;
 		mat_vert.loadu(mat_vert_in);
 
-		LLMatrix4a mat_normal;
-		mat_normal.loadu(mat_normal_in);
-
-		//VECTORIZE THIS
 		LLVector4a min,max;
 	
 		if (f >= volume.getNumVolumeFaces())
@@ -797,100 +793,68 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
 		llassert(less_than_max_mag(max));
 
 		//min, max are in volume space, convert to drawable render space
-		LLVector4a center;
-		LLVector4a t;
-		t.setAdd(min, max);
-		t.mul(0.5f);
-		mat_vert.affineTransform(t, center);
-		LLVector4a size;
-		size.setSub(max, min);
-		size.mul(0.5f);
 
-		llassert(less_than_max_mag(min));
-		llassert(less_than_max_mag(max));
+		//get 8 corners of bounding box
+		LLVector4Logical mask[6];
 
-		if (!global_volume)
+		for (U32 i = 0; i < 6; ++i)
 		{
-			//VECTORIZE THIS
-			LLVector4a scale;
-			scale.load3(mDrawablep->getVObj()->getScale().mV);
-			size.mul(scale);
+			mask[i].clear();
 		}
 
-		// Catch potential badness from normalization before it happens
-		//
-		mat_normal.mMatrix[0].normalize3fast();
-		mat_normal.mMatrix[1].normalize3fast();
-		mat_normal.mMatrix[2].normalize3fast();
+		mask[0].setElement<2>(); //001
+		mask[1].setElement<1>(); //010
+		mask[2].setElement<1>(); //011
+		mask[2].setElement<2>();
+		mask[3].setElement<0>(); //100
+		mask[4].setElement<0>(); //101
+		mask[4].setElement<2>();
+		mask[5].setElement<0>(); //110
+		mask[5].setElement<1>();
 
-		llassert(mat_normal.mMatrix[0].isFinite3());
-		llassert(mat_normal.mMatrix[1].isFinite3());
-		llassert(mat_normal.mMatrix[2].isFinite3());
+		LLVector4a v[8];
 
-		LLVector4a v[4];
+		v[6] = min;
+		v[7] = max;
 
-		//get 4 corners of bounding box
-		mat_normal.rotate(size,v[0]);
+		for (U32 i = 0; i < 6; ++i)
+		{
+			v[i].setSelectWithMask(mask[i], min, max);
+		}
 
-		//VECTORIZE THIS
-		LLVector4a scale;
-		
-		scale.set(-1.f, -1.f, 1.f);
-		scale.mul(size);
-		mat_normal.rotate(scale, v[1]);
-		
-		scale.set(1.f, -1.f, -1.f);
-		scale.mul(size);
-		mat_normal.rotate(scale, v[2]);
-		
-		scale.set(-1.f, 1.f, -1.f);
-		scale.mul(size);
-		mat_normal.rotate(scale, v[3]);
+		LLVector4a tv[8];
 
+		//transform bounding box into drawable space
+		for (U32 i = 0; i < 8; ++i)
+		{
+			mat_vert.affineTransform(v[i], tv[i]);
+		}
+	
+		//find bounding box
 		LLVector4a& newMin = mExtents[0];
 		LLVector4a& newMax = mExtents[1];
-		
-		newMin = newMax = center;
-		
-		llassert(less_than_max_mag(center));
-		
-		for (U32 i = 0; i < 4; i++)
-		{
-			LLVector4a delta;
-			delta.setAbs(v[i]);
-			LLVector4a min;
-			min.setSub(center, delta);
-			LLVector4a max;
-			max.setAdd(center, delta);
 
-			newMin.setMin(newMin,min);
-			newMax.setMax(newMax,max);
+		newMin = newMax = tv[0];
 
-			llassert(less_than_max_mag(newMin));
-			llassert(less_than_max_mag(newMax));
+		for (U32 i = 1; i < 8; ++i)
+		{
+			newMin.setMin(newMin, tv[i]);
+			newMax.setMax(newMax, tv[i]);
 		}
 
 		if (!mDrawablep->isActive())
-		{
+		{	// Shift position for region
 			LLVector4a offset;
 			offset.load3(mDrawablep->getRegion()->getOriginAgent().mV);
 			newMin.add(offset);
 			newMax.add(offset);
-			
-			llassert(less_than_max_mag(newMin));
-			llassert(less_than_max_mag(newMax));
 		}
 
-		t.setAdd(newMin, newMax);
+		LLVector4a t;
+		t.setAdd(newMin,newMax);
 		t.mul(0.5f);
 
-		llassert(less_than_max_mag(t));
-		
-		//VECTORIZE THIS
 		mCenterLocal.set(t.getF32ptr());
-		
-		llassert(less_than_max_mag(newMin));
-		llassert(less_than_max_mag(newMax));
 
 		t.setSub(newMax,newMin);
 		mBoundingSphereRadius = t.getLength3().getF32()*0.5f;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index fc22daa4a389031846793c8246e2b610f41be3ea..38f03bd40320e6f628f6b6052b4aa7d2f8069bb5 100755
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -195,7 +195,7 @@ class LLFace
 	void		setSize(S32 numVertices, S32 num_indices = 0, bool align = false);
 	
 	BOOL		genVolumeBBoxes(const LLVolume &volume, S32 f,
-								   const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE);
+								   const LLMatrix4& mat, BOOL global_volume = FALSE);
 	
 	void		init(LLDrawable* drawablep, LLViewerObject* objp);
 	void		destroy();
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 544eee396b90685de4641634f0b295415ab2786f..532c44c93286bb99babde4fada8cb91173352611 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2118,7 +2118,7 @@ void LLPanelLandOptions::refreshSearch()
 
 	bool can_change =
 			LLViewerParcelMgr::isParcelModifiableByAgent(
-				parcel, GP_LAND_CHANGE_IDENTITY)
+				parcel, GP_LAND_FIND_PLACES)
 			&& region
 			&& !(region->getRegionFlag(REGION_FLAGS_BLOCK_PARCEL_SEARCH));
 
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 0b10fbb03f4a618cd425f6836ae673f6bdf7efa8..9fa40bc6b9939d6bac8b6ef988f8e85c80bf402c 100755
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -166,7 +166,7 @@ void LLGestureMgr::activateGestures(LLViewerInventoryItem::item_array_t& items)
 			continue;
 		}
 		else 
-		{ // Make gesture active and persistent through login sessions.  -spatters 07-12-06
+		{ // Make gesture active and persistent through login sessions.  -Aura 07-12-06
 			activateGesture(item->getUUID());
 		}
 
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 8809530ad8fed1ab57c5a89569ee5d0a737b8048..4991c8b030f61a6e589bb7cfddcdfb59c299eef1 100755
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3445,7 +3445,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t&   items
 			}
 		}
 
-		//Added by spatters to force inventory pull on right-click to display folder options correctly. 07-17-06
+		//Added by aura to force inventory pull on right-click to display folder options correctly. 07-17-06
 		mCallingCards = mWearables = FALSE;
 
 		LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
index 2b92b0b3d1c1e1ce216da214932f6dc02c015574..a567d1217a1b049db2695c742ec54c9e4bc906e3 100755
--- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
@@ -92,7 +92,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize()
 
 void LLMenuOptionPathfindingRebakeNavmesh::quit()
 {
-	if (mIsInitialized)
+	if (mIsInitialized)		// Quitting from the login screen leaves this uninitialized
 	{
 		if (mNavMeshSlot.connected())
 		{
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index 8602271f84470e016ec1cd6f78502351e5b44876..8eaf691d6fbe2e9a7c6254a0693bb37caec397ad 100755
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -413,7 +413,7 @@ class LLMeshUploadThread : public LLThread
 
 	void startRequest() { ++mPendingUploads; }
 	void stopRequest() { --mPendingUploads; }
-		
+
 	bool finished() { return mFinished; }
 	virtual void run();
 	void preStart();
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 80d3b2ee7bd31b1e1d7606b1620d7ccab7393818..b2a3a9f645541c397f962399858e797d862272cd 100755
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -416,9 +416,9 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id,
 }
 
 
-void LLNameListCtrl::updateColumns()
+void LLNameListCtrl::updateColumns(bool force_update)
 {
-	LLScrollListCtrl::updateColumns();
+	LLScrollListCtrl::updateColumns(force_update);
 
 	if (!mNameColumn.empty())
 	{
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 271802d48a52ad5c99e483494a9063b45f539135..5aa1e1c458b0569d5e58bb367b07e4a216b543c2 100755
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -149,7 +149,7 @@ class LLNameListCtrl
 
 	void sortByName(BOOL ascending);
 
-	/*virtual*/ void updateColumns();
+	/*virtual*/ void updateColumns(bool force_update);
 
 	/*virtual*/ void	mouseOverHighlightNthItem( S32 index );
 private:
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 04f4454adf7364d502146176bd9ec1c498acce48..dd13e8abf4b48b36a68f9574a5241ddc618e2dca 100755
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -85,6 +85,7 @@ class LLPanelGroupInvite::impl
 	std::string		mAlreadyInGroup;
 	std::string		mTooManySelected;
 	bool		mConfirmedOwnerInvite;
+	std::set<LLUUID>	mInviteeIDs;
 
 	void (*mCloseCallback)(void* data);
 
@@ -117,31 +118,30 @@ LLPanelGroupInvite::impl::~impl()
 	}
 }
 
+const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap.
+
 void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,
 										const uuid_vec_t& agent_ids)
 {
 	std::string name;
 	LLUUID id;
 
+	if (names.size() + mInviteeIDs.size() > MAX_GROUP_INVITES)
+	{
+		// Fail! Show a warning and don't add any names.
+		LLSD msg;
+		msg["MESSAGE"] = mTooManySelected;
+		LLNotificationsUtil::add("GenericAlert", msg);
+		return;
+	}
+
 	for (S32 i = 0; i < (S32)names.size(); i++)
 	{
 		name = names[i];
 		id = agent_ids[i];
 
 		// Make sure this agent isn't already in the list.
-		bool already_in_list = false;
-		std::vector<LLScrollListItem*> items = mInvitees->getAllData();
-		for (std::vector<LLScrollListItem*>::iterator iter = items.begin();
-			 iter != items.end(); ++iter)
-		{
-			LLScrollListItem* item = *iter;
-			if (item->getUUID() == id)
-			{
-				already_in_list = true;
-				break;
-			}
-		}
-		if (already_in_list)
+		if (mInviteeIDs.find(id) != mInviteeIDs.end())
 		{
 			continue;
 		}
@@ -152,6 +152,7 @@ void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,
 		row["columns"][0]["value"] = name;
 
 		mInvitees->addElement(row);
+		mInviteeIDs.insert(id);
 	}
 }
 
@@ -193,7 +194,6 @@ void LLPanelGroupInvite::impl::submitInvitations()
 		role_member_pairs[item->getUUID()] = role_id;
 	}
 	
-	const S32 MAX_GROUP_INVITES = 100; // Max invites per request. 100 to match server cap.
 	if (role_member_pairs.size() > MAX_GROUP_INVITES)
 	{
 		// Fail!
@@ -334,6 +334,12 @@ void LLPanelGroupInvite::impl::handleRemove()
 			mInvitees->getAllSelected();
 	if (selection.empty()) return;
 
+	std::vector<LLScrollListItem*>::iterator iter;
+	for(iter = selection.begin(); iter != selection.end(); ++iter)
+	{
+		mInviteeIDs.erase( (*iter)->getUUID() );
+	}
+
 	// Remove all selected invitees.
 	mInvitees->deleteSelectedItems();
 	mRemoveButton->setEnabled(FALSE);
@@ -459,6 +465,7 @@ void LLPanelGroupInvite::clear()
 	mImplementation->mRoleNames->clear();
 	mImplementation->mRoleNames->removeall();
 	mImplementation->mOKButton->setEnabled(FALSE);
+	mImplementation->mInviteeIDs.clear();
 }
 
 void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 20a2ddc3b12fb2cc0b164ae63c5243e002ddb76f..725afb9014dce406059ca02cbebd2f418b626c18 100755
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -2537,7 +2537,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
 	}
 	else if	(type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::SPHERE)
 	{
-		/*LLVolumeParams volume_params;
+		LLVolumeParams volume_params;
 		volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
 		volume_params.setBeginAndEndS( 0.f, 1.f );
 		volume_params.setBeginAndEndT( 0.f, 1.f );
@@ -2547,7 +2547,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)
 		
 		gGL.diffuseColor4fv(color.mV);
 		pushVerts(sphere);
-		LLPrimitive::sVolumeManager->unrefVolume(sphere);*/
+		LLPrimitive::sVolumeManager->unrefVolume(sphere);
 	}
 	else if (type == LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification::CYLINDER)
 	{
@@ -2629,51 +2629,67 @@ void renderPhysicsShapes(LLSpatialGroup* group)
 	{
 			continue;
 		}
-		LLVOVolume* volume = drawable->getVOVolume();
-		if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )
+
+		if (drawable->isSpatialBridge())
 		{
-			if (!group->getSpatialPartition()->isBridge())
+			LLSpatialBridge* bridge = drawable->asPartition()->asBridge();
+
+			if (bridge)
 			{
 				gGL.pushMatrix();
-				LLVector3 trans = drawable->getRegion()->getOriginAgent();
-				gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
-				renderPhysicsShape(drawable, volume);
+				gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
+				bridge->renderPhysicsShapes();
 				gGL.popMatrix();
 			}
-			else
-			{
-				renderPhysicsShape(drawable, volume);
-			}
 		}
 		else
 		{
-			LLViewerObject* object = drawable->getVObj();
-			if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
+			LLVOVolume* volume = drawable->getVOVolume();
+			if (volume && !volume->isAttachment() && volume->getPhysicsShapeType() != LLViewerObject::PHYSICS_SHAPE_NONE )
 			{
-				gGL.pushMatrix();
-				gGL.multMatrix((F32*) object->getRegion()->mRenderMatrix.mMatrix);
-				//push face vertices for terrain
-				for (S32 i = 0; i < drawable->getNumFaces(); ++i)
+				if (!group->getSpatialPartition()->isBridge())
 				{
-					LLFace* face = drawable->getFace(i);
-					if (face)
+					gGL.pushMatrix();
+					LLVector3 trans = drawable->getRegion()->getOriginAgent();
+					gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+					renderPhysicsShape(drawable, volume);
+					gGL.popMatrix();
+				}
+				else
+				{
+					renderPhysicsShape(drawable, volume);
+				}
+			}
+			else
+			{
+				LLViewerObject* object = drawable->getVObj();
+				if (object && object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
+				{
+					gGL.pushMatrix();
+					gGL.multMatrix((F32*) object->getRegion()->mRenderMatrix.mMatrix);
+					//push face vertices for terrain
+					for (S32 i = 0; i < drawable->getNumFaces(); ++i)
 					{
-						LLVertexBuffer* buff = face->getVertexBuffer();
-						if (buff)
+						LLFace* face = drawable->getFace(i);
+						if (face)
 						{
-							glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+							LLVertexBuffer* buff = face->getVertexBuffer();
+							if (buff)
+							{
+								glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 
-							buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
-							gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
-							buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+								buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
+								gGL.diffuseColor3f(0.2f, 0.5f, 0.3f);
+								buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
 									
-							gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
-							glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-							buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+								gGL.diffuseColor3f(0.2f, 1.f, 0.3f);
+								glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+								buff->draw(LLRender::TRIANGLES, buff->getNumIndices(), 0);
+							}
 						}
 					}
+					gGL.popMatrix();
 				}
-				gGL.popMatrix();
 			}
 		}
 	}
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 79cc66fda53cc4902d303c40fa6228925455410c..ef852bc905e2d400e0ee99ff65d6daca16b2cbe4 100755
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -1922,10 +1922,10 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
 		h >>= i;
 		if(w * h *c > 0) //valid
 		{
-			LLPointer<LLImageRaw> newraw = new LLImageRaw(raw->getData(), raw->getWidth(), raw->getHeight(), raw->getComponents());
-			newraw->scale(w, h) ;
-			raw = newraw;
-
+			//make a duplicate to keep the original raw image untouched.
+			raw = raw->duplicate();
+			raw->scale(w, h) ;
+			
 			discardlevel += i ;
 		}
 	}
@@ -1935,9 +1935,12 @@ bool LLTextureCache::writeToFastCache(S32 id, LLPointer<LLImageRaw> raw, S32 dis
 	memcpy(mFastCachePadBuffer + sizeof(S32), &h, sizeof(S32));
 	memcpy(mFastCachePadBuffer + sizeof(S32) * 2, &c, sizeof(S32));
 	memcpy(mFastCachePadBuffer + sizeof(S32) * 3, &discardlevel, sizeof(S32));
-	if(w * h * c > 0) //valid
+
+	S32 copy_size = w * h * c;
+	if(copy_size > 0) //valid
 	{
-		memcpy(mFastCachePadBuffer + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD, raw->getData(), w * h * c);
+		copy_size = llmin(copy_size, TEXTURE_FAST_CACHE_ENTRY_SIZE - TEXTURE_FAST_CACHE_ENTRY_OVERHEAD);
+		memcpy(mFastCachePadBuffer + TEXTURE_FAST_CACHE_ENTRY_OVERHEAD, raw->getData(), copy_size);
 	}
 	S32 offset = id * TEXTURE_FAST_CACHE_ENTRY_SIZE;
 
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 28d0abc9d2504a4f3900bedd36bb3cf220d853ea..558159775f6a3d8a8931c9b3265dbbce87fd2cad 100755
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -122,7 +122,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	// don't pick transparent so users can't "pay" transparent objects
-	mPick = gViewerWindow->pickImmediate(x, y, FALSE);
+	mPick = gViewerWindow->pickImmediate(x, y, FALSE, TRUE);
 	mPick.mKeyMask = mask;
 
 	// claim not handled so UI focus stays same
@@ -1688,6 +1688,13 @@ BOOL LLToolPie::handleRightClickPick()
 			showVisualContextMenuEffect();
 		}
 	}
+	else if (mPick.mParticleOwnerID.notNull())
+	{
+		if (gMenuMuteParticle && mPick.mParticleOwnerID != gAgent.getID())
+		{
+			gMenuMuteParticle->show(x,y);
+		}
+	}
 
 	LLTool::handleRightMouseDown(x, y, mask);
 	// We handled the event.
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 41ed2faaa5dd57654c8d1250dd6ba33a02b44053..2d51e62f70a18c1cfdc459de7f7d747980131fc1 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -170,6 +170,7 @@ LLContextMenu	*gMenuObject = NULL;
 LLContextMenu	*gMenuAttachmentSelf = NULL;
 LLContextMenu	*gMenuAttachmentOther = NULL;
 LLContextMenu	*gMenuLand	= NULL;
+LLContextMenu	*gMenuMuteParticle = NULL;
 
 const std::string SAVE_INTO_TASK_INVENTORY("Save Object Back to Object Contents");
 
@@ -426,6 +427,9 @@ void init_menus()
 	gMenuLand = LLUICtrlFactory::createFromFile<LLContextMenu>(
 		"menu_land.xml", gMenuHolder, registry);
 
+	gMenuMuteParticle = LLUICtrlFactory::createFromFile<LLContextMenu>(
+		"menu_mute_particle.xml", gMenuHolder, registry);
+
 	///
 	/// set up the colors
 	///
@@ -2437,6 +2441,9 @@ void cleanup_menus()
 	delete gMenuLand;
 	gMenuLand = NULL;
 
+	delete gMenuMuteParticle;
+	gMenuMuteParticle = NULL;
+
 	delete gMenuBarView;
 	gMenuBarView = NULL;
 
@@ -2790,6 +2797,13 @@ bool enable_object_edit()
 	return enable;
 }
 
+bool enable_mute_particle()
+{
+	const LLPickInfo& pick = LLToolPie::getInstance()->getPick();
+
+	return pick.mParticleOwnerID != LLUUID::null && pick.mParticleOwnerID != gAgent.getID();
+}
+
 // mutually exclusive - show either edit option or build in menu
 bool enable_object_build()
 {
@@ -6210,6 +6224,33 @@ class LLLandEdit : public view_listener_t
 	}
 };
 
+class LLMuteParticle : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		LLUUID id = LLToolPie::getInstance()->getPick().mParticleOwnerID;
+		
+		if (id.notNull())
+		{
+			std::string name;
+			gCacheName->getFullName(id, name);
+
+			LLMute mute(id, name, LLMute::AGENT);
+			if (LLMuteList::getInstance()->isMuted(mute.mID))
+			{
+				LLMuteList::getInstance()->remove(mute);
+			}
+			else
+			{
+				LLMuteList::getInstance()->add(mute);
+				LLPanelBlockedList::showPanelAndSelect(mute.mID);
+			}
+		}
+
+		return true;
+	}
+};
+
 class LLWorldEnableBuyLand : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -8703,6 +8744,9 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLLandBuyPass(), "Land.BuyPass");
 	view_listener_t::addMenu(new LLLandEdit(), "Land.Edit");
 
+	// Particle muting
+	view_listener_t::addMenu(new LLMuteParticle(), "Particle.Mute");
+
 	view_listener_t::addMenu(new LLLandEnableBuyPass(), "Land.EnableBuyPass");
 	commit.add("Land.Buy", boost::bind(&handle_buy_land));
 
@@ -8725,6 +8769,7 @@ void initialize_menus()
 	enable.add("EnablePayObject", boost::bind(&enable_pay_object));
 	enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
 	enable.add("EnableEdit", boost::bind(&enable_object_edit));
+	enable.add("EnableMuteParticle", boost::bind(&enable_mute_particle));
 	enable.add("VisibleBuild", boost::bind(&enable_object_build));
 	commit.add("Pathfinding.Linksets.Select", boost::bind(&LLFloaterPathfindingLinksets::openLinksetsWithSelectedObjects));
 	enable.add("EnableSelectInPathfindingLinksets", boost::bind(&enable_object_select_in_pathfinding_linksets));
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 143420e2274971e814ee97484d0293651ef1be8e..7f09fc2d8faf74acc4c56cd89083ca960a1736c0 100755
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -177,6 +177,7 @@ extern LLContextMenu		*gMenuObject;
 extern LLContextMenu		*gMenuAttachmentSelf;
 extern LLContextMenu		*gMenuAttachmentOther;
 extern LLContextMenu		*gMenuLand;
+extern LLContextMenu		*gMenuMuteParticle;
 
 // Needed to build menus when attachment site list available
 extern LLMenuGL* gAttachSubMenu;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index cbc895390cd4266f80b5544cd876ffc6237292b6..b4ed2adb07e1129c3ec8dadfee80ad491feda296 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -7219,8 +7219,12 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)
 	LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance();
 	if(instance)
 	{
-		instance->trackURL(
-						   sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]);
+		llinfos << "Object named " << object_name 
+			<< " is offering TP to region "
+			<< sim_name << " position " << pos
+			<< llendl;
+
+		instance->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]);
 		LLFloaterReg::showInstance("world_map", "center");
 	}
 	
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index 978c307c60e173575102e9208a9bab053d39cefb..09b6b8eb4b9a2da7f33c826f60736da38e0bd309 100755
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -502,9 +502,13 @@ void LLViewerPartSim::destroyClass()
 //static
 BOOL LLViewerPartSim::shouldAddPart()
 {
-	if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
+	if (sParticleCount >= MAX_PART_COUNT)
 	{
+		return FALSE;
+	}
 
+	if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
+	{
 		F32 frac = (F32)sParticleCount/(F32)sMaxParticleCount;
 		frac -= PART_THROTTLE_THRESHOLD;
 		frac *= PART_THROTTLE_RESCALE;
@@ -514,7 +518,10 @@ BOOL LLViewerPartSim::shouldAddPart()
 			return FALSE;
 		}
 	}
-	if (sParticleCount >= MAX_PART_COUNT)
+
+	// Check frame rate, and don't add more if the viewer is really slow
+	const F32 MIN_FRAME_RATE_FOR_NEW_PARTICLES = 4.f;
+	if (gFPSClamped < MIN_FRAME_RATE_FOR_NEW_PARTICLES)
 	{
 		return FALSE;
 	}
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 6bda1499d04ac716d39817d0cb3b1c6fdaabb537..8cb35cd30b38bbdf1d6a87192c36b1efc0f6b506 100755
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1227,10 +1227,10 @@ void LLViewerFetchedTexture::dump()
 // ONLY called from LLViewerFetchedTextureList
 void LLViewerFetchedTexture::destroyTexture() 
 {
-	//if(LLImageGL::sGlobalTextureMemoryInBytes < sMaxDesiredTextureMemInBytes)//not ready to release unused memory.
-	//{
-	//	return;
-	//}
+	if(LLImageGL::sGlobalTextureMemory < sMaxDesiredTextureMem * 0.95f)//not ready to release unused memory.
+	{
+		return ;
+	}
 	if (mNeedsCreateTexture)//return if in the process of generating a new texture.
 	{
 		return;
@@ -1318,7 +1318,12 @@ void LLViewerFetchedTexture::addToCreateTexture()
 							destroyRawImage();
 							return;
 						}
-						mRawImage->scale(w >> i, h >> i);					
+
+						{
+							//make a duplicate in case somebody else is using this raw image
+							mRawImage = mRawImage->duplicate(); 
+							mRawImage->scale(w >> i, h >> i) ;					
+						}
 					}
 				}
 			}
@@ -1549,7 +1554,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 	else if (pixel_priority < 0.001f && !have_all_data)
 	{
 		// Not on screen but we might want some data
-		if (mBoostLevel > BOOST_HIGH)
+		if (mBoostLevel > BOOST_SELECTED)
 		{
 			// Always want high boosted images
 			priority = 1.f;
@@ -2704,7 +2709,11 @@ void LLViewerFetchedTexture::setCachedRawImage()
 				--i;
 			}
 			
-			mRawImage->scale(w >> i, h >> i);
+			{
+				//make a duplicate in case somebody else is using this raw image
+				mRawImage = mRawImage->duplicate(); 
+				mRawImage->scale(w >> i, h >> i) ;
+			}
 		}
 		mCachedRawImage = mRawImage;
 		mRawDiscardLevel += i;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 5509c6e0e55857f2ffe288cd6b33d51ef5937401..3a62ab68a018de88a1d6e2b11b986a24a70865ad 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -229,8 +229,10 @@ LLFrameTimer	gAwayTriggerTimer;
 BOOL			gShowOverlayTitle = FALSE;
 
 LLViewerObject*  gDebugRaycastObject = NULL;
+LLVOPartGroup* gDebugRaycastParticle = NULL;
 LLVector4a       gDebugRaycastIntersection;
-LLVector2       gDebugRaycastTexCoord;
+LLVector4a		gDebugRaycastParticleIntersection;
+LLVector2        gDebugRaycastTexCoord;
 LLVector4a       gDebugRaycastNormal;
 LLVector4a       gDebugRaycastTangent;
 S32				gDebugRaycastFaceHit;
@@ -2843,6 +2845,8 @@ void LLViewerWindow::updateUI()
 											  &gDebugRaycastTangent,
 											  &gDebugRaycastStart,
 											  &gDebugRaycastEnd);
+
+		gDebugRaycastParticle = gPipeline.lineSegmentIntersectParticle(gDebugRaycastStart, gDebugRaycastEnd, &gDebugRaycastParticleIntersection, NULL);
 	}
 
 	updateMouseDelta();
@@ -3663,7 +3667,7 @@ void LLViewerWindow::pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback
 		pick_transparent = TRUE;
 	}
 
-	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, TRUE, callback);
+	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, FALSE, TRUE, callback);
 	schedulePick(pick_info);
 }
 
@@ -3719,7 +3723,7 @@ void LLViewerWindow::returnEmptyPicks()
 }
 
 // Performs the GL object/land pick.
-LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_transparent)
+LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_transparent, BOOL pick_particle)
 {
 	BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
 	if (in_build_mode || LLDrawPoolAlpha::sShowDebugAlpha)
@@ -3728,10 +3732,10 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot,  BOOL pick_trans
 		// "Show Debug Alpha" means no object actually transparent
 		pick_transparent = TRUE;
 	}
-
+	
 	// shortcut queueing in mPicks and just update mLastPick in place
 	MASK	key_mask = gKeyboard->currentMask(TRUE);
-	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, TRUE, NULL);
+	mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_particle, TRUE, NULL);
 	mLastPick.fetchResults();
 
 	return mLastPick;
@@ -4290,7 +4294,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 	F32 scale_factor = 1.0f ;
 	if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))
 	{	
-		if ((image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)
+		if ((image_width <= gGLManager.mGLMaxTextureSize && image_height <= gGLManager.mGLMaxTextureSize) && 
+			(image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)
 		{
 			if (scratch_space.allocate(image_width, image_height, GL_RGBA, true, true))
 			{
@@ -4305,6 +4310,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 					snapshot_height = image_height;
 					reset_deferred = true;
 					mWorldViewRectRaw.set(0, image_height, image_width, 0);
+					LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
+					LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
 					scratch_space.bindTarget();
 				}
 				else
@@ -4515,6 +4522,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 	if (reset_deferred)
 	{
 		mWorldViewRectRaw = window_rect;
+		LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
+		LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
 		scratch_space.flush();
 		scratch_space.release();
 		gPipeline.allocateScreenBuffer(original_width, original_height);
@@ -5128,13 +5137,15 @@ LLPickInfo::LLPickInfo()
 	  mTangent(),
 	  mBinormal(),
 	  mHUDIcon(NULL),
-	  mPickTransparent(FALSE)
+	  mPickTransparent(FALSE),
+	  mPickParticle(FALSE)
 {
 }
 
 LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos, 
 		       MASK keyboard_mask, 
 		       BOOL pick_transparent,
+			   BOOL pick_particle,
 		       BOOL pick_uv_coords,
 		       void (*pick_callback)(const LLPickInfo& pick_info))
 	: mMousePt(mouse_pos),
@@ -5150,7 +5161,8 @@ LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,
 	  mTangent(),
 	  mBinormal(),
 	  mHUDIcon(NULL),
-	  mPickTransparent(pick_transparent)
+	  mPickTransparent(pick_transparent),
+	  mPickParticle(pick_particle)
 {
 }
 
@@ -5168,6 +5180,10 @@ void LLPickInfo::fetchResults()
 	LLVector4a origin;
 	origin.load3(LLViewerCamera::getInstance()->getOrigin().mV);
 	F32 icon_dist = 0.f;
+	LLVector4a start;
+	LLVector4a end;
+	LLVector4a particle_end;
+
 	if (hit_icon)
 	{
 		LLVector4a delta;
@@ -5177,14 +5193,24 @@ void LLPickInfo::fetchResults()
 
 	LLViewerObject* hit_object = gViewerWindow->cursorIntersect(mMousePt.mX, mMousePt.mY, 512.f,
 									NULL, -1, mPickTransparent, &face_hit,
-									&intersection, &uv, &normal, &tangent);
+									&intersection, &uv, &normal, &tangent, &start, &end);
 	
 	mPickPt = mMousePt;
 
 	U32 te_offset = face_hit > -1 ? face_hit : 0;
 
-	//unproject relative clicked coordinate from window coordinate using GL
-	
+	if (mPickParticle)
+	{ //get the end point of line segement to use for particle raycast
+		if (hit_object)
+		{
+			particle_end = intersection;
+		}
+		else
+		{
+			particle_end = end;
+		}
+	}
+
 	LLViewerObject* objectp = hit_object;
 
 
@@ -5199,6 +5225,7 @@ void LLPickInfo::fetchResults()
 		mHUDIcon = hit_icon;
 		mPickType = PICK_ICON;
 		mPosGlobal = mHUDIcon->getPositionGlobal();
+
 	}
 	else if (objectp)
 	{
@@ -5248,6 +5275,18 @@ void LLPickInfo::fetchResults()
 		}
 	}
 	
+	if (mPickParticle)
+	{ //search for closest particle to click origin out to intersection point
+		S32 part_face = -1;
+
+		LLVOPartGroup* group = gPipeline.lineSegmentIntersectParticle(start, particle_end, NULL, &part_face);
+		if (group)
+		{
+			mParticleOwnerID = group->getPartOwner(part_face);
+			mParticleSourceID = group->getPartSource(part_face);
+		}
+	}
+
 	if (mPickCallback)
 	{
 		mPickCallback(*this);
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 930ed9d5a9dff58d9a54e508bc97a173cb818eef..5d2df2dfd721994bed248419925552cc0570b8cd 100755
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -65,6 +65,7 @@ class LLWindow;
 class LLRootView;
 class LLWindowListener;
 class LLViewerWindowListener;
+class LLVOPartGroup;
 class LLPopupView;
 
 #define PICK_HALF_WIDTH 5
@@ -87,7 +88,8 @@ class LLPickInfo
 	LLPickInfo();
 	LLPickInfo(const LLCoordGL& mouse_pos, 
 		MASK keyboard_mask, 
-		BOOL pick_transparent, 
+		BOOL pick_transparent,
+		BOOL pick_particle,
 		BOOL pick_surface_info,
 		void (*pick_callback)(const LLPickInfo& pick_info));
 
@@ -108,6 +110,8 @@ class LLPickInfo
 	LLVector3d		mPosGlobal;
 	LLVector3		mObjectOffset;
 	LLUUID			mObjectID;
+	LLUUID			mParticleOwnerID;
+	LLUUID			mParticleSourceID;
 	S32				mObjectFace;
 	LLHUDIcon*		mHUDIcon;
 	LLVector3       mIntersection;
@@ -118,6 +122,7 @@ class LLPickInfo
 	LLVector4		mTangent;
 	LLVector3		mBinormal;
 	BOOL			mPickTransparent;
+	BOOL			mPickParticle;
 	void		    getSurfaceInfo();
 
 private:
@@ -356,7 +361,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	void			returnEmptyPicks();
 
 	void			pickAsync(S32 x, S32 y_from_bot, MASK mask, void (*callback)(const LLPickInfo& pick_info), BOOL pick_transparent = FALSE);
-	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent);
+	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_particle = FALSE);
 	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
 										   LLVector4a* intersection);
 
@@ -502,6 +507,8 @@ extern LLFrameTimer		gAwayTriggerTimer;		// how long the avatar has been away
 
 extern LLViewerObject*  gDebugRaycastObject;
 extern LLVector4a       gDebugRaycastIntersection;
+extern LLVOPartGroup*	gDebugRaycastParticle;
+extern LLVector4a		gDebugRaycastParticleIntersection;
 extern LLVector2        gDebugRaycastTexCoord;
 extern LLVector4a       gDebugRaycastNormal;
 extern LLVector4a       gDebugRaycastTangent;
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index b46c55321c691fe70a29c63dc92477900c1e5ecd..af55c8f741ad800fba5c576def69a47daca9b7e7 100755
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -714,14 +714,7 @@ BOOL LLVoiceClient::isParticipantAvatar(const LLUUID& id)
 
 BOOL LLVoiceClient::isOnlineSIP(const LLUUID& id)
 {
-	if (mVoiceModule) 
-	{
-		return mVoiceModule->isOnlineSIP(id);
-	}
-	else
-	{
 		return FALSE;
-	}
 }
 
 BOOL LLVoiceClient::getIsSpeaking(const LLUUID& id)
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index bd9ea029a9a423d628d61ae4a6085b3b6ef56303..1e20a814a01d981263178735c74666677bd282f7 100755
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -198,7 +198,6 @@ class LLVoiceModuleInterface
 	//@{
 	virtual BOOL getVoiceEnabled(const LLUUID& id)=0;		// true if we've received data for this avatar
 	virtual std::string getDisplayName(const LLUUID& id)=0;
-	virtual BOOL isOnlineSIP(const LLUUID &id)=0;	
 	virtual BOOL isParticipantAvatar(const LLUUID &id)=0;
 	virtual BOOL getIsSpeaking(const LLUUID& id)=0;
 	virtual BOOL getIsModeratorMuted(const LLUUID& id)=0;
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 93351d21f5e4092c94a2436cddd9891b7a3d6b97..6ff849cfd2a353086248861330ebde0546842fe6 100755
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -182,17 +182,10 @@ class LLVivoxVoiceClientMuteListObserver : public LLMuteListObserver
 	/* virtual */ void onChange()  { LLVivoxVoiceClient::getInstance()->muteListChanged();}
 };
 
-class LLVivoxVoiceClientFriendsObserver : public LLFriendObserver
-{
-public:
-	/* virtual */ void changed(U32 mask) { LLVivoxVoiceClient::getInstance()->updateFriends(mask);}
-};
 
 static LLVivoxVoiceClientMuteListObserver mutelist_listener;
 static bool sMuteListListener_listening = false;
 
-static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL;
-
 ///////////////////////////////////////////////////////////////////////////////////////////////
 
 class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder
@@ -390,7 +383,6 @@ void LLVivoxVoiceClient::terminate()
 void LLVivoxVoiceClient::cleanUp()
 {
 	deleteAllSessions();
-	deleteAllBuddies();
 	deleteAllVoiceFonts();
 	deleteVoiceFontTemplates();
 }
@@ -476,10 +468,10 @@ void LLVivoxVoiceClient::connectorCreate()
 
 	std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel");
 		
-	if(savedLogLevel != "-1")
+	if(savedLogLevel != "-0")
 	{
 		LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL;
-		loglevel = "10";
+		loglevel = "0";
 	}
 	
 	stream 
@@ -792,9 +784,9 @@ void LLVivoxVoiceClient::stateMachine()
 						std::string loglevel = gSavedSettings.getString("VivoxDebugLevel");
 						if(loglevel.empty())
 						{
-							loglevel = "-1";	// turn logging off completely
+							loglevel = "0";	// turn logging off completely
 						}
-
+						loglevel = "0";	// turn logging off completely
 						params.args.add("-ll");
 						params.args.add(loglevel);
 						params.cwd = gDirUtilp->getAppRODataDir();
@@ -1202,25 +1194,12 @@ void LLVivoxVoiceClient::stateMachine()
 				setState(stateVoiceFontsReceived);
 			}
 
-			// request the current set of block rules (we'll need them when updating the friends list)
-			accountListBlockRulesSendMessage();
-			
-			// request the current set of auto-accept rules
-			accountListAutoAcceptRulesSendMessage();
-			
 			// Set up the mute list observer if it hasn't been set up already.
 			if((!sMuteListListener_listening))
 			{
 				LLMuteList::getInstance()->addObserver(&mutelist_listener);
 				sMuteListListener_listening = true;
 			}
-
-			// Set up the friends list observer if it hasn't been set up already.
-			if(friendslist_listener == NULL)
-			{
-				friendslist_listener = new LLVivoxVoiceClientFriendsObserver;
-				LLAvatarTracker::instance().addObserver(friendslist_listener);
-			}
 			
 			// Set the initial state of mic mute, local speaker volume, etc.
 			{
@@ -1291,9 +1270,7 @@ void LLVivoxVoiceClient::stateMachine()
 		case stateNoChannel:
 			LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL;
 			mSpatialJoiningNum = 0;
-			// Do this here as well as inside sendPositionalUpdate().  
-			// Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync.
-			sendFriendsListUpdates();
+
 			
 			if(mSessionTerminateRequested || (!mVoiceEnabled && mIsInitialized))
 			{
@@ -1490,7 +1467,6 @@ void LLVivoxVoiceClient::stateMachine()
 					mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
 					sendPositionalUpdate();
 				}
-
 				mIsInitialized = true;
 			}
 		break;
@@ -1648,7 +1624,7 @@ void LLVivoxVoiceClient::stateMachine()
 void LLVivoxVoiceClient::closeSocket(void)
 {
 	mSocket.reset();
-	mConnected = false;	
+	mConnected = false;
 	mConnectorHandle.clear();
 	mAccountHandle.clear();
 }
@@ -1665,7 +1641,7 @@ void LLVivoxVoiceClient::loginSendMessage()
 		<< "<AccountName>" << mAccountName << "</AccountName>"
 		<< "<AccountPassword>" << mAccountPassword << "</AccountPassword>"
 		<< "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>"
-		<< "<EnableBuddiesAndPresence>true</EnableBuddiesAndPresence>"
+        << "<EnableBuddiesAndPresence>false</EnableBuddiesAndPresence>"
 		<< "<BuddyManagementMode>Application</BuddyManagementMode>"
 		<< "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>"
 		<< (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"")
@@ -1701,42 +1677,6 @@ void LLVivoxVoiceClient::logoutSendMessage()
 	}
 }
 
-void LLVivoxVoiceClient::accountListBlockRulesSendMessage()
-{
-	if(!mAccountHandle.empty())
-	{		
-		std::ostringstream stream;
-
-		LL_DEBUGS("Voice") << "requesting block rules" << LL_ENDL;
-
-		stream
-		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListBlockRules.1\">"
-			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-		<< "</Request>"
-		<< "\n\n\n";
-
-		writeString(stream.str());
-	}
-}
-
-void LLVivoxVoiceClient::accountListAutoAcceptRulesSendMessage()
-{
-	if(!mAccountHandle.empty())
-	{		
-		std::ostringstream stream;
-
-		LL_DEBUGS("Voice") << "requesting auto-accept rules" << LL_ENDL;
-
-		stream
-		<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListAutoAcceptRules.1\">"
-			<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-		<< "</Request>"
-		<< "\n\n\n";
-
-		writeString(stream.str());
-	}
-}
-
 void LLVivoxVoiceClient::sessionGroupCreateSendMessage()
 {
 	if(!mAccountHandle.empty())
@@ -2568,10 +2508,7 @@ void LLVivoxVoiceClient::sendPositionalUpdate(void)
 	{
 		writeString(stream.str());
 	}
-	
-	// Friends list updates can be huge, especially on the first voice login of an account with lots of friends.
-	// Batching them all together can choke SLVoice, so send them in separate writes.
-	sendFriendsListUpdates();
+
 }
 
 void LLVivoxVoiceClient::buildSetCaptureDevice(std::ostringstream &stream)
@@ -2669,275 +2606,6 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
 	
 }
 
-void LLVivoxVoiceClient::checkFriend(const LLUUID& id)
-{
-	buddyListEntry *buddy = findBuddy(id);
-
-	// Make sure we don't add a name before it's been looked up in the avatar name cache
-	LLAvatarName av_name;
-	if (LLAvatarNameCache::get(id, &av_name))
-	{
-		// *NOTE: We feed legacy names to Vivox because we don't know if their service
-		// can support a mix of new and old clients with different sorts of names.
-		std::string name = av_name.getAccountName();
-		
-		if (buddy)
-		{
-			// This buddy is already in both lists (vivox buddies and avatar cache).
-            // Trust the avatar cache more for the display name (vivox display name are notoriously wrong)
-            buddy->mDisplayName = name;
-		}
-		else
-		{
-			// This buddy was not in the vivox list, needs to be added.
-			buddy = addBuddy(sipURIFromID(id), name);
-			buddy->mUUID = id;
-		}
-		
-		const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id);
-		buddy->mCanSeeMeOnline = (relationInfo && relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
-		// In all the above cases, the buddy is in the SL friends list and tha name has been resolved (which is how we got here).
-		buddy->mNameResolved = true;
-		buddy->mInSLFriends = true;
-	}
-	else
-	{
-		// This name hasn't been looked up yet in the avatar cache. Don't do anything with this buddy list entry until it has.
-		if (buddy)
-		{
-			buddy->mNameResolved = false;
-		}
-		// Initiate a lookup.
-		// The "lookup completed" callback will ensure that the friends list is rechecked after it completes.
-		lookupName(id);
-	}
-}
-
-void LLVivoxVoiceClient::clearAllLists()
-{
-	// FOR TESTING ONLY
-	
-	// This will send the necessary commands to delete ALL buddies, autoaccept rules, and block rules SLVoice tells us about.
-	buddyListMap::iterator buddy_it;
-	for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
-	{
-		buddyListEntry *buddy = buddy_it->second;
-		buddy_it++;
-		
-		std::ostringstream stream;
-
-		if(buddy->mInVivoxBuddies)
-		{
-			// delete this entry from the vivox buddy list
-			buddy->mInVivoxBuddies = false;
-			LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
-			stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
-				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-				<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
-				<< "</Request>\n\n\n";		
-		}
-
-		if(buddy->mHasBlockListEntry)
-		{
-			// Delete the associated block list entry (so the block list doesn't fill up with junk)
-			buddy->mHasBlockListEntry = false;
-			stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
-				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-				<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
-				<< "</Request>\n\n\n";								
-		}
-		if(buddy->mHasAutoAcceptListEntry)
-		{
-			// Delete the associated auto-accept list entry (so the auto-accept list doesn't fill up with junk)
-			buddy->mHasAutoAcceptListEntry = false;
-			stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
-				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-				<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
-				<< "</Request>\n\n\n";
-		}
-
-		writeString(stream.str());
-
-	}
-}
-
-void LLVivoxVoiceClient::sendFriendsListUpdates()
-{
-	if(mBuddyListMapPopulated && mBlockRulesListReceived && mAutoAcceptRulesListReceived && mFriendsListDirty)
-	{
-		mFriendsListDirty = false;
-		
-		if(0)
-		{
-			// FOR TESTING ONLY -- clear all buddy list, block list, and auto-accept list entries.
-			clearAllLists();
-			return;
-		}
-		
-		LL_INFOS("Voice") << "Checking vivox buddy list against friends list..." << LL_ENDL;
-		
-		buddyListMap::iterator buddy_it;
-		for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
-		{
-			// reset the temp flags in the local buddy list
-			buddy_it->second->mInSLFriends = false;
-		}
-		
-		// correlate with the friends list
-		{
-			LLCollectAllBuddies collect;
-			LLAvatarTracker::instance().applyFunctor(collect);
-			LLCollectAllBuddies::buddy_map_t::const_iterator it = collect.mOnline.begin();
-			LLCollectAllBuddies::buddy_map_t::const_iterator end = collect.mOnline.end();
-			
-			for ( ; it != end; ++it)
-			{
-				checkFriend(it->second);
-			}
-			it = collect.mOffline.begin();
-			end = collect.mOffline.end();
-			for ( ; it != end; ++it)
-			{
-				checkFriend(it->second);
-			}
-		}
-				
-		LL_INFOS("Voice") << "Sending friend list updates..." << LL_ENDL;
-
-		for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
-		{
-			buddyListEntry *buddy = buddy_it->second;
-			buddy_it++;
-			
-			// Ignore entries that aren't resolved yet.
-			if(buddy->mNameResolved)
-			{
-				std::ostringstream stream;
-
-				if(buddy->mInSLFriends && !buddy->mInVivoxBuddies)
-				{					
-					if(mNumberOfAliases > 0)
-					{
-						// Add (or update) this entry in the vivox buddy list
-						buddy->mInVivoxBuddies = true;
-						LL_DEBUGS("Voice") << "add/update " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
-						stream 
-							<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddySet.1\">"
-								<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-								<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
-								<< "<DisplayName>" << buddy->mDisplayName << "</DisplayName>"
-								<< "<BuddyData></BuddyData>"	// Without this, SLVoice doesn't seem to parse the command.
-								<< "<GroupID>0</GroupID>"
-							<< "</Request>\n\n\n";	
-					}
-				}
-				else if(!buddy->mInSLFriends)
-				{
-					// This entry no longer exists in your SL friends list.  Remove all traces of it from the Vivox buddy list.
- 					if(buddy->mInVivoxBuddies)
-					{
-						// delete this entry from the vivox buddy list
-						buddy->mInVivoxBuddies = false;
-						LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
-						stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
-							<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-							<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
-							<< "</Request>\n\n\n";		
-					}
-
-					if(buddy->mHasBlockListEntry)
-					{
-						// Delete the associated block list entry, if any
-						buddy->mHasBlockListEntry = false;
-						stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
-							<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-							<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
-							<< "</Request>\n\n\n";								
-					}
-					if(buddy->mHasAutoAcceptListEntry)
-					{
-						// Delete the associated auto-accept list entry, if any
-						buddy->mHasAutoAcceptListEntry = false;
-						stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
-							<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-							<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
-							<< "</Request>\n\n\n";
-					}
-				}
-				
-				if(buddy->mInSLFriends)
-				{
-
-					if(buddy->mCanSeeMeOnline)
-					{
-						// Buddy should not be blocked.
-
-						// If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
-						
-						// If the buddy has a block list entry, delete it.
-						if(buddy->mHasBlockListEntry)
-						{
-							buddy->mHasBlockListEntry = false;
-							stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
-								<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-								<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
-								<< "</Request>\n\n\n";		
-							
-							
-							// If we just deleted a block list entry, add an auto-accept entry.
-							if(!buddy->mHasAutoAcceptListEntry)
-							{
-								buddy->mHasAutoAcceptListEntry = true;								
-								stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateAutoAcceptRule.1\">"
-									<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-									<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
-									<< "<AutoAddAsBuddy>0</AutoAddAsBuddy>"
-									<< "</Request>\n\n\n";
-							}
-						}
-					}
-					else
-					{
-						// Buddy should be blocked.
-						
-						// If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
-
-						// If this buddy has an autoaccept entry, delete it
-						if(buddy->mHasAutoAcceptListEntry)
-						{
-							buddy->mHasAutoAcceptListEntry = false;
-							stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
-								<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-								<< "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
-								<< "</Request>\n\n\n";
-						
-							// If we just deleted an auto-accept entry, add a block list entry.
-							if(!buddy->mHasBlockListEntry)
-							{
-								buddy->mHasBlockListEntry = true;
-								stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateBlockRule.1\">"
-									<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-									<< "<BlockMask>" << buddy->mURI << "</BlockMask>"
-									<< "<PresenceOnly>1</PresenceOnly>"
-									<< "</Request>\n\n\n";								
-							}
-						}
-					}
-
-					if(!buddy->mInSLFriends && !buddy->mInVivoxBuddies)
-					{
-						// Delete this entry from the local buddy list.  This should NOT invalidate the iterator,
-						// since it has already been incremented to the next entry.
-						deleteBuddy(buddy->mURI);
-					}
-
-				}
-				writeString(stream.str());
-			}
-		}
-	}
-}
-
 /////////////////////////////
 // Response/Event handlers
 
@@ -3711,7 +3379,7 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
 			 voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager                                          
 			 and event is not fired.                                                                                                               
 			 
-			 So, we have to call LLSpeakerMgr::update() here.                                                                                                              
+			 So, we have to call LLSpeakerMgr::update() here. 
 			 */
 			LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel();
 			
@@ -3743,83 +3411,6 @@ void LLVivoxVoiceClient::participantUpdatedEvent(
 	}
 }
 
-void LLVivoxVoiceClient::buddyPresenceEvent(
-		std::string &uriString, 
-		std::string &alias, 
-		std::string &statusString,
-		std::string &applicationString)
-{
-	buddyListEntry *buddy = findBuddy(uriString);
-	
-	if(buddy)
-	{
-		LL_DEBUGS("Voice") << "Presence event for " << buddy->mDisplayName << " status \"" << statusString << "\", application \"" << applicationString << "\""<< LL_ENDL;
-		LL_DEBUGS("Voice") << "before: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
-
-		if(applicationString.empty())
-		{
-			// This presence event is from a client that doesn't set up the Application string.  Do things the old-skool way.
-			// NOTE: this will be needed to support people who aren't on the 3010-class SDK yet.
-
-			if ( stricmp("Unknown", statusString.c_str())== 0) 
-			{
-				// User went offline with a non-SLim-enabled viewer.
-				buddy->mOnlineSL = false;
-			}
-			else if ( stricmp("Online", statusString.c_str())== 0) 
-			{
-				// User came online with a non-SLim-enabled viewer.
-				buddy->mOnlineSL = true;
-			}
-			else
-			{
-				// If the user is online through SLim, their status will be "Online-slc", "Away", or something else.
-				// NOTE: we should never see this unless someone is running an OLD version of SLim -- the versions that should be in use now all set the application string.
-				buddy->mOnlineSLim = true;
-			} 
-		}
-		else if(applicationString.find("SecondLifeViewer") != std::string::npos)
-		{
-			// This presence event is from a viewer that sets the application string
-			if ( stricmp("Unknown", statusString.c_str())== 0) 
-			{
-				// Viewer says they're offline
-				buddy->mOnlineSL = false;
-			}
-			else
-			{
-				// Viewer says they're online
-				buddy->mOnlineSL = true;
-			}
-		}
-		else
-		{
-			// This presence event is from something which is NOT the SL viewer (assume it's SLim).
-			if ( stricmp("Unknown", statusString.c_str())== 0) 
-			{
-				// SLim says they're offline
-				buddy->mOnlineSLim = false;
-			}
-			else
-			{
-				// SLim says they're online
-				buddy->mOnlineSLim = true;
-			}
-		} 
-
-		LL_DEBUGS("Voice") << "after: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
-		
-		// HACK -- increment the internal change serial number in the LLRelationship (without changing the actual status), so the UI notices the change.
-		LLAvatarTracker::instance().setBuddyOnline(buddy->mUUID,LLAvatarTracker::instance().isBuddyOnline(buddy->mUUID));
-
-		notifyFriendObservers();
-	}
-	else
-	{
-		LL_DEBUGS("Voice") << "Presence for unknown buddy " << uriString << LL_ENDL;
-	}	
-}
-
 void LLVivoxVoiceClient::messageEvent(
 		std::string &sessionHandle, 
 		std::string &uriString, 
@@ -4010,70 +3601,12 @@ void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, st
 	}
 }
 
-void LLVivoxVoiceClient::subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType)
-{
-	buddyListEntry *buddy = findBuddy(buddyURI);
-	
-	if(!buddy)
-	{
-		// Couldn't find buddy by URI, try converting the alias...
-		if(!alias.empty())
-		{
-			LLUUID id;
-			if(IDFromName(alias, id))
-			{
-				buddy = findBuddy(id);
-			}
-		}
-	}
-	
-	if(buddy)
-	{
-		std::ostringstream stream;
-		
-		if(buddy->mCanSeeMeOnline)
-		{
-			// Sending the response will create an auto-accept rule
-			buddy->mHasAutoAcceptListEntry = true;
-		}
-		else
-		{
-			// Sending the response will create a block rule
-			buddy->mHasBlockListEntry = true;
-		}
-		
-		if(buddy->mInSLFriends)
-		{
-			buddy->mInVivoxBuddies = true;
-		}
-		
-		stream
-			<< "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.SendSubscriptionReply.1\">"
-				<< "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
-				<< "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
-				<< "<RuleType>" << (buddy->mCanSeeMeOnline?"Allow":"Hide") << "</RuleType>"
-				<< "<AutoAccept>"<< (buddy->mInSLFriends?"1":"0")<< "</AutoAccept>"
-				<< "<SubscriptionHandle>" << subscriptionHandle << "</SubscriptionHandle>"
-			<< "</Request>"
-			<< "\n\n\n";
-			
-		writeString(stream.str());
-	}
-}
-
 void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
 {
 	LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;
 	mTuningEnergy = energy;
 }
 
-void LLVivoxVoiceClient::buddyListChanged()
-{
-	// This is called after we receive a BuddyAndGroupListChangedEvent.
-	mBuddyListMapPopulated = true;
-	mFriendsListDirty = true;
-}
-
 void LLVivoxVoiceClient::muteListChanged()
 {
 	// The user's mute list has been updated.  Go through the current participant list and sync it with the mute list.
@@ -4092,15 +3625,6 @@ void LLVivoxVoiceClient::muteListChanged()
 	}
 }
 
-void LLVivoxVoiceClient::updateFriends(U32 mask)
-{
-	if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::POWERS))
-	{
-		// Just resend the whole friend list to the daemon
-		mFriendsListDirty = true;
-	}
-}
-
 /////////////////////////////
 // Managing list of participants
 LLVivoxVoiceClient::participantState::participantState(const std::string &uri) : 
@@ -4699,34 +4223,6 @@ bool LLVivoxVoiceClient::answerInvite(std::string &sessionHandle)
 	return false;
 }
 
-BOOL LLVivoxVoiceClient::isOnlineSIP(const LLUUID &id)
-{
-	bool result = false;
-	buddyListEntry *buddy = findBuddy(id);
-	if(buddy)
-	{
-		result = buddy->mOnlineSLim;
-		LL_DEBUGS("Voice") << "Buddy " << buddy->mDisplayName << " is SIP " << (result?"online":"offline") << LL_ENDL;
-	}
-
-	if(!result)
-	{
-		// This user isn't on the buddy list or doesn't show online status through the buddy list, but could be a participant in an existing session if they initiated a text IM.
-		sessionState *session = findSession(id);
-		if(session && !session->mHandle.empty())
-		{
-			if((session->mTextStreamState != streamStateUnknown) || (session->mMediaStreamState > streamStateIdle))
-			{
-				LL_DEBUGS("Voice") << "Open session with " << id << " found, returning SIP online state" << LL_ENDL;
-				// we have a p2p text session open with this user, so by definition they're online.
-				result = true;
-			}
-		}
-	}
-	
-	return result;
-}
-
 bool LLVivoxVoiceClient::isVoiceWorking() const
 {
   //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758)
@@ -4783,7 +4279,7 @@ BOOL LLVivoxVoiceClient::isSessionCallBackPossible(const LLUUID &session_id)
 // Currently this will be false only for PSTN P2P calls.
 BOOL LLVivoxVoiceClient::isSessionTextIMPossible(const LLUUID &session_id)
 {
-	bool result = TRUE; 
+	bool result = TRUE;
 	sessionState *session = findSession(session_id);
 	
 	if(session != NULL)
@@ -5832,224 +5328,6 @@ void LLVivoxVoiceClient::verifySessionState(void)
 	}
 }
 
-LLVivoxVoiceClient::buddyListEntry::buddyListEntry(const std::string &uri) :
-	mURI(uri)
-{
-	mOnlineSL = false;
-	mOnlineSLim = false;
-	mCanSeeMeOnline = true;
-	mHasBlockListEntry = false;
-	mHasAutoAcceptListEntry = false;
-	mNameResolved = false;
-	mInVivoxBuddies = false;
-	mInSLFriends = false;
-}
-
-void LLVivoxVoiceClient::processBuddyListEntry(const std::string &uri, const std::string &displayName)
-{
-	buddyListEntry *buddy = addBuddy(uri, displayName);
-	buddy->mInVivoxBuddies = true;	
-}
-
-LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri)
-{
-	std::string empty;
-	buddyListEntry *buddy = addBuddy(uri, empty);
-	if(buddy->mDisplayName.empty())
-	{
-		buddy->mNameResolved = false;
-	}
-	return buddy;
-}
-
-LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri, const std::string &displayName)
-{
-	buddyListEntry *result = NULL;
-	buddyListMap::iterator iter = mBuddyListMap.find(uri);
-	
-	if (iter != mBuddyListMap.end())
-	{
-		// Found a matching buddy already in the map.
-		LL_DEBUGS("Voice") << "adding existing buddy " << uri << LL_ENDL;
-		result = iter->second;
-	}
-
-	if (!result)
-	{
-		// participant isn't already in one list or the other.
-		LL_DEBUGS("Voice") << "adding new buddy " << uri << LL_ENDL;
-		result = new buddyListEntry(uri);
-		result->mDisplayName = displayName;
-
-		if (!IDFromName(uri, result->mUUID))
-		{
-			LL_DEBUGS("Voice") << "Couldn't find ID for buddy " << uri << " (\"" << displayName << "\")" << LL_ENDL;
-		}
-
-		mBuddyListMap.insert(buddyListMap::value_type(result->mURI, result));
-	}
-	
-	return result;
-}
-
-LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const std::string &uri)
-{
-	buddyListEntry *result = NULL;
-	buddyListMap::iterator iter = mBuddyListMap.find(uri);
-	if(iter != mBuddyListMap.end())
-	{
-		result = iter->second;
-	}
-	
-	return result;
-}
-
-LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const LLUUID &id)
-{
-	buddyListEntry *result = NULL;
-	buddyListMap::iterator iter;
-
-	for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
-	{
-		if(iter->second->mUUID == id)
-		{
-			result = iter->second;
-			break;
-		}
-	}
-	
-	return result;
-}
-
-LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddyByDisplayName(const std::string &name)
-{
-	buddyListEntry *result = NULL;
-	buddyListMap::iterator iter;
-
-	for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
-	{
-		if(iter->second->mDisplayName == name)
-		{
-			result = iter->second;
-			break;
-		}
-	}
-	
-	return result;
-}
-
-void LLVivoxVoiceClient::deleteBuddy(const std::string &uri)
-{
-	buddyListMap::iterator iter = mBuddyListMap.find(uri);
-	if(iter != mBuddyListMap.end())
-	{
-		LL_DEBUGS("Voice") << "deleting buddy " << uri << LL_ENDL;
-		buddyListEntry *buddy = iter->second;
-		mBuddyListMap.erase(iter);
-		delete buddy;
-	}
-	else
-	{
-		LL_DEBUGS("Voice") << "attempt to delete nonexistent buddy " << uri << LL_ENDL;
-	}
-	
-}
-
-void LLVivoxVoiceClient::deleteAllBuddies(void)
-{
-	while(!mBuddyListMap.empty())
-	{
-		deleteBuddy(mBuddyListMap.begin()->first);
-	}
-	
-	// Don't want to correlate with friends list when we've emptied the buddy list.
-	mBuddyListMapPopulated = false;
-	
-	// Don't want to correlate with friends list when we've reset the block rules.
-	mBlockRulesListReceived = false;
-	mAutoAcceptRulesListReceived = false;
-}
-
-void LLVivoxVoiceClient::deleteAllBlockRules(void)
-{
-	// Clear the block list entry flags from all local buddy list entries
-	buddyListMap::iterator buddy_it;
-	for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
-	{
-		buddy_it->second->mHasBlockListEntry = false;
-	}
-}
-
-void LLVivoxVoiceClient::deleteAllAutoAcceptRules(void)
-{
-	// Clear the auto-accept list entry flags from all local buddy list entries
-	buddyListMap::iterator buddy_it;
-	for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
-	{
-		buddy_it->second->mHasAutoAcceptListEntry = false;
-	}
-}
-
-void LLVivoxVoiceClient::addBlockRule(const std::string &blockMask, const std::string &presenceOnly)
-{
-	buddyListEntry *buddy = NULL;
-
-	// blockMask is the SIP URI of a friends list entry
-	buddyListMap::iterator iter = mBuddyListMap.find(blockMask);
-	if(iter != mBuddyListMap.end())
-	{
-		LL_DEBUGS("Voice") << "block list entry for " << blockMask << LL_ENDL;
-		buddy = iter->second;
-	}
-
-	if(buddy == NULL)
-	{
-		LL_DEBUGS("Voice") << "block list entry for unknown buddy " << blockMask << LL_ENDL;
-		buddy = addBuddy(blockMask);
-	}
-	
-	if(buddy != NULL)
-	{
-		buddy->mHasBlockListEntry = true;
-	}
-}
-
-void LLVivoxVoiceClient::addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy)
-{
-	buddyListEntry *buddy = NULL;
-
-	// blockMask is the SIP URI of a friends list entry
-	buddyListMap::iterator iter = mBuddyListMap.find(autoAcceptMask);
-	if(iter != mBuddyListMap.end())
-	{
-		LL_DEBUGS("Voice") << "auto-accept list entry for " << autoAcceptMask << LL_ENDL;
-		buddy = iter->second;
-	}
-
-	if(buddy == NULL)
-	{
-		LL_DEBUGS("Voice") << "auto-accept list entry for unknown buddy " << autoAcceptMask << LL_ENDL;
-		buddy = addBuddy(autoAcceptMask);
-	}
-
-	if(buddy != NULL)
-	{
-		buddy->mHasAutoAcceptListEntry = true;
-	}
-}
-
-void LLVivoxVoiceClient::accountListBlockRulesResponse(int statusCode, const std::string &statusString)
-{
-	// Block list entries were updated via addBlockRule() during parsing.  Just flag that we're done.
-	mBlockRulesListReceived = true;
-}
-
-void LLVivoxVoiceClient::accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString)
-{
-	// Block list entries were updated via addBlockRule() during parsing.  Just flag that we're done.
-	mAutoAcceptRulesListReceived = true;
-}
-
 void LLVivoxVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
 {
 	mParticipantObservers.insert(observer);
@@ -6198,11 +5476,6 @@ void LLVivoxVoiceClient::onAvatarNameCache(const LLUUID& agent_id,
 
 void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name)
 {
-	// If the avatar whose name just resolved is on our friends list, resync the friends list.
-	if(LLAvatarTracker::instance().getBuddyInfo(id) != NULL)
-	{
-		mFriendsListDirty = true;
-	}
 	// Iterate over all sessions.
 	for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
 	{
@@ -6815,7 +6088,6 @@ void LLVivoxVoiceClient::updateVoiceMorphingMenu()
 		}
 	}
 }
-
 void LLVivoxVoiceClient::notifyVoiceFontObservers()
 {
 	LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL;
@@ -7205,18 +6477,6 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
 			{
 				deviceString.clear();
 			}			
-			else if (!stricmp("Buddies", tag))
-			{
-				LLVivoxVoiceClient::getInstance()->deleteAllBuddies();
-			}
-			else if (!stricmp("BlockRules", tag))
-			{
-				LLVivoxVoiceClient::getInstance()->deleteAllBlockRules();
-			}
-			else if (!stricmp("AutoAcceptRules", tag))
-			{
-				LLVivoxVoiceClient::getInstance()->deleteAllAutoAcceptRules();
-			}
 			else if (!stricmp("SessionFont", tag))
 			{
 				id = 0;
@@ -7251,7 +6511,7 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
 void LLVivoxProtocolParser::EndTag(const char *tag)
 {
 	const std::string& string = textBuffer;
-
+	
 	responseDepth--;
 	
 	if (ignoringTags)
@@ -7348,24 +6608,10 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
 		{
 			LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString);
 		}
-		else if (!stricmp("Buddy", tag))
-		{
-            // NOTE : Vivox does *not* give reliable display name for Buddy tags
-            // We don't take those very seriously as a result...
-			LLVivoxVoiceClient::getInstance()->processBuddyListEntry(uriString, displayNameString);
-		}
-		else if (!stricmp("BlockRule", tag))
-		{
-			LLVivoxVoiceClient::getInstance()->addBlockRule(blockMask, presenceOnly);
-		}
 		else if (!stricmp("BlockMask", tag))
 			blockMask = string;
 		else if (!stricmp("PresenceOnly", tag))
 			presenceOnly = string;
-		else if (!stricmp("AutoAcceptRule", tag))
-		{
-			LLVivoxVoiceClient::getInstance()->addAutoAcceptRule(autoAcceptMask, autoAddAsBuddy);
-		}
 		else if (!stricmp("AutoAcceptMask", tag))
 			autoAcceptMask = string;
 		else if (!stricmp("AutoAddAsBuddy", tag))
@@ -7597,16 +6843,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
 
 			LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy);
 		}
-		else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent"))
-		{
-			LLVivoxVoiceClient::getInstance()->buddyPresenceEvent(uriString, alias, statusString, applicationString);
-		}
-		else if (!stricmp(eventTypeCstr, "BuddyAndGroupListChangedEvent"))
-		{
-			// The buddy list was updated during parsing.
-			// Need to recheck against the friends list.
-			LLVivoxVoiceClient::getInstance()->buddyListChanged();
-		}
 		else if (!stricmp(eventTypeCstr, "BuddyChangedEvent"))
 		{
 			/*
@@ -7629,11 +6865,7 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
 		{
 			LLVivoxVoiceClient::getInstance()->sessionNotificationEvent(sessionHandle, uriString, notificationType);
 		}
-		else if (!stricmp(eventTypeCstr, "SubscriptionEvent"))  
-		{
-			LLVivoxVoiceClient::getInstance()->subscriptionEvent(uriString, subscriptionHandle, alias, displayNameString, applicationString, subscriptionType);
-		}
-		else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))  
+		else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))
 		{
 			/*
 			 <Event type="SessionUpdatedEvent">
@@ -7696,14 +6928,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
 		{
 			LLVivoxVoiceClient::getInstance()->connectorShutdownResponse(statusCode, statusString);			
 		}
-		else if (!stricmp(actionCstr, "Account.ListBlockRules.1"))
-		{
-			LLVivoxVoiceClient::getInstance()->accountListBlockRulesResponse(statusCode, statusString);						
-		}
-		else if (!stricmp(actionCstr, "Account.ListAutoAcceptRules.1"))
-		{
-			LLVivoxVoiceClient::getInstance()->accountListAutoAcceptRulesResponse(statusCode, statusString);						
-		}
 		else if (!stricmp(actionCstr, "Session.Set3DPosition.1"))
 		{
 			// We don't need to process these, but they're so spammy we don't want to log them.
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index a6f40eb3e99d8e2adca4c5d08dd147a2a2cb8b4d..e2d1585c15b2ee0391b73e46a87b49c711e66cdf 100755
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -48,7 +48,6 @@ class LLVivoxProtocolParser;
 class LLAvatarName;
 class LLVivoxVoiceAccountProvisionResponder;
 class LLVivoxVoiceClientMuteListObserver;
-class LLVivoxVoiceClientFriendsObserver;	
 
 
 class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
@@ -181,7 +180,6 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	//@{
 	virtual BOOL getVoiceEnabled(const LLUUID& id);		// true if we've received data for this avatar
 	virtual std::string getDisplayName(const LLUUID& id);
-	virtual BOOL isOnlineSIP(const LLUUID &id);
 	virtual BOOL isParticipantAvatar(const LLUUID &id);
 	virtual BOOL getIsSpeaking(const LLUUID& id);
 	virtual BOOL getIsModeratorMuted(const LLUUID& id);
@@ -490,14 +488,10 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);
 	void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy);
 	void auxAudioPropertiesEvent(F32 energy);
-	void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString);
 	void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);
 	void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType);
-	void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType);
 	
-	void buddyListChanged();
 	void muteListChanged();
-	void updateFriends(U32 mask);
 		
 	/////////////////////////////
 	// Sending updates of current state
@@ -588,24 +582,6 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 
 	typedef std::map<std::string, buddyListEntry*> buddyListMap;
 	
-	// This should be called when parsing a buddy list entry sent by SLVoice.		
-	void processBuddyListEntry(const std::string &uri, const std::string &displayName);
-
-	buddyListEntry *addBuddy(const std::string &uri);
-	buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName);
-	buddyListEntry *findBuddy(const std::string &uri);
-	buddyListEntry *findBuddy(const LLUUID &id);
-	buddyListEntry *findBuddyByDisplayName(const std::string &name);
-	void deleteBuddy(const std::string &uri);
-	void deleteAllBuddies(void);
-
-	void deleteAllBlockRules(void);
-	void addBlockRule(const std::string &blockMask, const std::string &presenceOnly);
-	void deleteAllAutoAcceptRules(void);
-	void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy);
-	void accountListBlockRulesResponse(int statusCode, const std::string &statusString);						
-	void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString);
-
 	/////////////////////////////
 	// session control messages
 
@@ -774,8 +750,7 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	void buildSetCaptureDevice(std::ostringstream &stream);
 	void buildSetRenderDevice(std::ostringstream &stream);
 	
-	void clearAllLists();
-	void checkFriend(const LLUUID& id);
+
 	void sendFriendsListUpdates();
 
 	// start a text IM session with the specified user
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index e226583097042055543c42779457b0cb108f5e83..6402a484ec502c7e00772c694bbca4f3637797a8 100755
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -193,8 +193,14 @@ void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)
 	const LLVector3& pos_agent = getPositionAgent();
 	newMin.load3( (pos_agent - mScale).mV);
 	newMax.load3( (pos_agent + mScale).mV);
+
+	llassert(newMin.isFinite3());
+	llassert(newMax.isFinite3());
+
 	LLVector4a pos;
 	pos.load3(pos_agent.mV);
+
+	llassert(pos.isFinite3());
 	mDrawable->setPositionGroup(pos);
 }
 
@@ -234,6 +240,37 @@ LLDrawable* LLVOPartGroup::createDrawable(LLPipeline *pipeline)
 
  const F32 MAX_PARTICLE_AREA_SCALE = 0.02f; // some tuned constant, limits on how much particle area to draw
 
+ LLUUID LLVOPartGroup::getPartOwner(S32 idx)
+ {
+	 LLUUID ret = LLUUID::null;
+
+	 if (idx < (S32) mViewerPartGroupp->mParticles.size())
+	 {
+		 ret = mViewerPartGroupp->mParticles[idx]->mPartSourcep->getOwnerUUID();
+	 }
+
+	 return ret;
+ }
+
+ LLUUID LLVOPartGroup::getPartSource(S32 idx)
+ {
+	 LLUUID ret = LLUUID::null;
+
+	 if (idx < (S32) mViewerPartGroupp->mParticles.size())
+	 {
+		 LLViewerPart* part = mViewerPartGroupp->mParticles[idx];
+		 if (part && part->mPartSourcep.notNull() &&
+			 part->mPartSourcep->mSourceObjectp.notNull())
+		 {
+			 LLViewerObject* source = part->mPartSourcep->mSourceObjectp;
+			 ret = source->getID();
+		 }
+	 }
+
+	 return ret;
+ }
+
+
 F32 LLVOPartGroup::getPartSize(S32 idx)
 {
 	if (idx < (S32) mViewerPartGroupp->mParticles.size())
@@ -316,6 +353,10 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 			inv_camera_dist_squared = 1.f / camera_dist_squared;
 		else
 			inv_camera_dist_squared = 1.f;
+
+		llassert(llfinite(inv_camera_dist_squared));
+		llassert(!llisnan(inv_camera_dist_squared));
+
 		F32 area = part->mScale.mV[0] * part->mScale.mV[1] * inv_camera_dist_squared;
 		tot_area = llmax(tot_area, area);
  		
@@ -387,20 +428,63 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 	return TRUE;
 }
 
-void LLVOPartGroup::getGeometry(S32 idx,
-								LLStrider<LLVector4a>& verticesp,
-								LLStrider<LLVector3>& normalsp, 
-								LLStrider<LLVector2>& texcoordsp,
-								LLStrider<LLColor4U>& colorsp, 
-								LLStrider<U16>& indicesp)
+
+BOOL LLVOPartGroup::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+										  S32 face,
+										  BOOL pick_transparent,
+										  S32* face_hit,
+										  LLVector4a* intersection,
+										  LLVector2* tex_coord,
+										  LLVector4a* normal,
+										  LLVector4a* bi_normal)
 {
-	if (idx >= (S32) mViewerPartGroupp->mParticles.size())
+	LLVector4a dir;
+	dir.setSub(end, start);
+
+	F32 closest_t = 2.f;
+	BOOL ret = FALSE;
+	
+	for (U32 idx = 0; idx < mViewerPartGroupp->mParticles.size(); ++idx)
 	{
-		return;
+		const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx]));
+
+		LLVector4a v[4];
+		LLStrider<LLVector4a> verticesp;
+		verticesp = v;
+		
+		getGeometry(part, verticesp);
+
+		F32 a,b,t;
+		if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, a,b,t) ||
+			LLTriangleRayIntersect(v[1], v[3], v[2], start, dir, a,b,t))
+		{
+			if (t >= 0.f &&
+				t <= 1.f &&
+				t < closest_t)
+			{
+				ret = TRUE;
+				closest_t = t;
+				if (face_hit)
+				{
+					*face_hit = idx;
+				}
+
+				if (intersection)
+				{
+					LLVector4a intersect = dir;
+					intersect.mul(closest_t);
+					intersection->setAdd(intersect, start);
+				}
+			}
+		}
 	}
 
-	const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx]));
+	return ret;
+}
 
+void LLVOPartGroup::getGeometry(const LLViewerPart& part,
+								LLStrider<LLVector4a>& verticesp)
+{
 	LLVector4a part_pos_agent;
 	part_pos_agent.load3(part.mPosAgent.mV);
 	LLVector4a camera_agent;
@@ -452,8 +536,6 @@ void LLVOPartGroup::getGeometry(S32 idx,
 	up.mul(0.5f*part.mScale.mV[1]);
 
 
-	LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
-
 	//HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should)
 	// this works because there is actually a 4th float stored after the vertex position which is used as a texture index
 	// also, somebody please VECTORIZE THIS
@@ -472,6 +554,25 @@ void LLVOPartGroup::getGeometry(S32 idx,
 	(*verticesp++).getF32ptr()[3] = 0.f;
 	verticesp->setAdd(ppamu, right);
 	(*verticesp++).getF32ptr()[3] = 0.f;
+}
+
+
+								
+void LLVOPartGroup::getGeometry(S32 idx,
+								LLStrider<LLVector4a>& verticesp,
+								LLStrider<LLVector3>& normalsp, 
+								LLStrider<LLVector2>& texcoordsp,
+								LLStrider<LLColor4U>& colorsp, 
+								LLStrider<U16>& indicesp)
+{
+	if (idx >= (S32) mViewerPartGroupp->mParticles.size())
+	{
+		return;
+	}
+	
+	const LLViewerPart &part = *((LLViewerPart*) (mViewerPartGroupp->mParticles[idx]));
+
+	getGeometry(part, verticesp);
 
 	*colorsp++ = part.mColor;
 	*colorsp++ = part.mColor;
@@ -480,6 +581,7 @@ void LLVOPartGroup::getGeometry(S32 idx,
 
 	if (!(part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK))
 	{ //not fullbright, needs normal
+		LLVector3 normal = -LLViewerCamera::getInstance()->getXAxis();
 		*normalsp++   = normal;
 		*normalsp++   = normal;
 		*normalsp++   = normal;
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index 42c1252d01f69c9fccfbf08c272c35205b03f10b..2befb018239f85f43a04490c516c95187609eafd 100755
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -69,11 +69,23 @@ class LLVOPartGroup : public LLAlphaObject
 	virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
 	virtual U32 getPartitionType() const;
 	
+	/*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+										  S32 face,
+										  BOOL pick_transparent,
+										  S32* face_hit,
+										  LLVector4a* intersection,
+										  LLVector2* tex_coord,
+										  LLVector4a* normal,
+										  LLVector4a* tangent);
+
 	/*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
 	/*virtual*/ void updateTextures();
 
 	/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
 	/*virtual*/ BOOL        updateGeometry(LLDrawable *drawable);
+	void		getGeometry(const LLViewerPart& part,							
+								LLStrider<LLVector4a>& verticesp);
+				
 				void		getGeometry(S32 idx,
 								LLStrider<LLVector4a>& verticesp,
 								LLStrider<LLVector3>& normalsp, 
@@ -83,6 +95,9 @@ class LLVOPartGroup : public LLAlphaObject
 
 	void updateFaceSize(S32 idx) { }
 	F32 getPartSize(S32 idx);
+	LLUUID getPartOwner(S32 idx);
+	LLUUID getPartSource(S32 idx);
+
 	void setViewerPartGroup(LLViewerPartGroup *part_groupp)		{ mViewerPartGroupp = part_groupp; }
 	LLViewerPartGroup* getViewerPartGroup()	{ return mViewerPartGroupp; }
 
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 547ea3369d4894058ad273518a32b21d631f4132..4ff9bc6981111c3e72c9ec4aaec5afb1f80b3da0 100755
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1112,7 +1112,13 @@ void LLVOVolume::sculpt()
 		
 		S32 max_discard = mSculptTexture->getMaxDiscardLevel();
 		if (discard_level > max_discard)
-			discard_level = max_discard;    // clamp to the best we can do
+		{
+			discard_level = max_discard;    // clamp to the best we can do			
+		}
+		if(discard_level > MAX_DISCARD_LEVEL)
+		{
+			return; //we think data is not ready yet.
+		}
 
 		S32 current_discard = getVolume()->getSculptLevel() ;
 		if(current_discard < -2)
@@ -1451,7 +1457,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global)
 			continue;
 		}
 		res &= face->genVolumeBBoxes(*volume, i,
-										mRelativeXform, mRelativeXformInvTrans,
+										mRelativeXform, 
 										(mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global);
 		
 		if (rebuild)
@@ -4833,7 +4839,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 
 			if (is_rigged)
 			{
-				drawablep->setState(LLDrawable::RIGGED);
+				if (!drawablep->isState(LLDrawable::RIGGED))
+				{
+					drawablep->setState(LLDrawable::RIGGED);
+
+					//first time this is drawable is being marked as rigged,
+					// do another LoD update to use avatar bounding box
+					vobj->updateLOD();
+				}
 			}
 			else
 			{
diff --git a/indra/newview/noise.h b/indra/newview/noise.h
index 0923bffcf2c8090997743783cde0365d9f6dc717..b3efad73c5622063e5334c3ba75e2129f90e6461 100755
--- a/indra/newview/noise.h
+++ b/indra/newview/noise.h
@@ -310,6 +310,8 @@ static void normalize3(F32 v[3])
 
 static void init(void)
 {
+	// we want repeatable noise (e.g. for stable terrain texturing), so seed with known value
+	srand(42);
 	int i, j, k;
 
 	for (i = 0 ; i < B ; i++) {
@@ -340,6 +342,9 @@ static void init(void)
 		for (j = 0 ; j < 3 ; j++)
 			g3[B + i][j] = g3[i][j];
 	}
+
+	// reintroduce entropy
+	srand(time(NULL));		// Flawfinder: ignore
 }
 
 #undef B
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 7c74d4dcca7b45eefd9f807bf9e24160dbf272ce..e77d85849d4f11e86a4eac5f413cc5251a05da12 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -164,6 +164,7 @@ S32 LLPipeline::RenderGlowIterations;
 F32 LLPipeline::RenderGlowWidth;
 F32 LLPipeline::RenderGlowStrength;
 BOOL LLPipeline::RenderDepthOfField;
+BOOL LLPipeline::RenderDepthOfFieldInEditMode;
 F32 LLPipeline::CameraFocusTransitionTime;
 F32 LLPipeline::CameraFNumber;
 F32 LLPipeline::CameraFocalLength;
@@ -608,6 +609,7 @@ void LLPipeline::init()
 	connectRefreshCachedSettingsSafe("RenderGlowWidth");
 	connectRefreshCachedSettingsSafe("RenderGlowStrength");
 	connectRefreshCachedSettingsSafe("RenderDepthOfField");
+	connectRefreshCachedSettingsSafe("RenderDepthOfFieldInEditMode");
 	connectRefreshCachedSettingsSafe("CameraFocusTransitionTime");
 	connectRefreshCachedSettingsSafe("CameraFNumber");
 	connectRefreshCachedSettingsSafe("CameraFocalLength");
@@ -1118,6 +1120,7 @@ void LLPipeline::refreshCachedSettings()
 	RenderGlowWidth = gSavedSettings.getF32("RenderGlowWidth");
 	RenderGlowStrength = gSavedSettings.getF32("RenderGlowStrength");
 	RenderDepthOfField = gSavedSettings.getBOOL("RenderDepthOfField");
+	RenderDepthOfFieldInEditMode = gSavedSettings.getBOOL("RenderDepthOfFieldInEditMode");
 	CameraFocusTransitionTime = gSavedSettings.getF32("CameraFocusTransitionTime");
 	CameraFNumber = gSavedSettings.getF32("CameraFNumber");
 	CameraFocalLength = gSavedSettings.getF32("CameraFocalLength");
@@ -4843,18 +4846,6 @@ void LLPipeline::renderPhysicsDisplay()
 		}
 	}
 
-	for (LLCullResult::bridge_iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
-	{
-		LLSpatialBridge* bridge = *i;
-		if (!bridge->isDead() && hasRenderType(bridge->mDrawableType))
-		{
-			gGL.pushMatrix();
-			gGL.multMatrix((F32*)bridge->mDrawable->getRenderMatrix().mMatrix);
-			bridge->renderPhysicsShapes();
-			gGL.popMatrix();
-		}
-	}
-
 	gGL.flush();
 
 	if (LLGLSLShader::sNoFixedFunction)
@@ -5303,6 +5294,42 @@ void LLPipeline::renderDebug()
 		gUIProgram.bind();
 	}
 
+	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST) && !hud_only)
+	{ //draw crosshairs on particle intersection
+		if (gDebugRaycastParticle)
+		{
+			if (LLGLSLShader::sNoFixedFunction)
+			{ //this debug display requires shaders
+				gDebugProgram.bind();
+
+				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+				LLVector3 center(gDebugRaycastParticleIntersection.getF32ptr());
+				LLVector3 size(0.1f, 0.1f, 0.1f);
+
+				LLVector3 p[6];
+
+				p[0] = center + size.scaledVec(LLVector3(1,0,0));
+				p[1] = center + size.scaledVec(LLVector3(-1,0,0));
+				p[2] = center + size.scaledVec(LLVector3(0,1,0));
+				p[3] = center + size.scaledVec(LLVector3(0,-1,0));
+				p[4] = center + size.scaledVec(LLVector3(0,0,1));
+				p[5] = center + size.scaledVec(LLVector3(0,0,-1));
+				
+				gGL.begin(LLRender::LINES);
+				gGL.diffuseColor3f(1.f, 1.f, 0.f);
+				for (U32 i = 0; i < 6; i++)
+				{
+					gGL.vertex3fv(p[i].mV);
+				}
+				gGL.end();
+				gGL.flush();
+
+				gDebugProgram.unbind();
+			}
+		}
+	}
+
 	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA))
 	{
 		LLVertexBuffer::unbind();
@@ -5336,7 +5363,7 @@ void LLPipeline::renderDebug()
 			if (i > 3)
 			{ //render shadow frusta as volumes
 				if (mShadowFrustPoints[i-4].empty())
-			{
+				{
 					continue;
 				}
 
@@ -6990,6 +7017,48 @@ void LLPipeline::setRenderHighlightTextureChannel(LLRender::eTexIndex channel)
 	sRenderHighlightTextureChannel = channel;
 }
 
+LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection,
+														S32* face_hit)
+{
+	LLVector4a local_end = end;
+
+	LLVector4a position;
+
+	LLDrawable* drawable = NULL;
+
+	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); 
+			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
+	{
+		LLViewerRegion* region = *iter;
+
+		LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_PARTICLE);
+		if (part && hasRenderType(part->mDrawableType))
+		{
+			LLDrawable* hit = part->lineSegmentIntersect(start, local_end, TRUE, face_hit, &position, NULL, NULL, NULL);
+			if (hit)
+			{
+				drawable = hit;
+				local_end = position;						
+			}
+		}
+	}
+
+	LLVOPartGroup* ret = NULL;
+	if (drawable)
+	{
+		//make sure we're returning an LLVOPartGroup
+		llassert(drawable->getVObj()->getPCode() == LLViewerObject::LL_VO_PART_GROUP);
+		ret = (LLVOPartGroup*) drawable->getVObj().get();
+	}
+		
+	if (intersection)
+	{
+		*intersection = position;
+	}
+
+	return ret;
+}
+
 LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end,
 														BOOL pick_transparent,												
 														S32* face_hit,
@@ -7549,7 +7618,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 	{
 
 		bool dof_enabled = !LLViewerCamera::getInstance()->cameraUnderWater() &&
-							!LLToolMgr::getInstance()->inBuildMode() &&
+			(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
 							RenderDepthOfField;
 
 
@@ -9569,7 +9638,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 	pp.push_back(LLVector3(max.mV[0], max.mV[1], max.mV[2]));
 
 	//add corners of camera frustum
-	for (U32 i = 0; i < 8; i++)
+	for (U32 i = 0; i < LLCamera::AGENT_FRUSTRUM_NUM; i++)
 	{
 		pp.push_back(camera.mAgentFrustum[i]);
 	}
@@ -9596,7 +9665,7 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 
 	for (U32 i = 0; i < 12; i++)
 	{ //for each line segment in bounding box
-		for (U32 j = 0; j < 6; j++) 
+		for (U32 j = 0; j < LLCamera::AGENT_PLANE_NO_USER_CLIP_NUM; j++) 
 		{ //for each plane in camera frustum
 			const LLPlane& cp = camera.getAgentPlane(j);
 			const LLVector3& v1 = pp[bs[i*2+0]];
@@ -9682,19 +9751,19 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 			}
 		}
 				
-		for (U32 j = 0; j < 6; ++j)
+		for (U32 j = 0; j < LLCamera::AGENT_PLANE_NO_USER_CLIP_NUM; ++j)
 		{
 			const LLPlane& cp = camera.getAgentPlane(j);
 			F32 dist = cp.dist(pp[i]);
 			if (dist > 0.05f) //point is above some plane, not contained
-					{
+			{
 				found = false;
 				break;
-						}
-					}
+			}
+		}
 
-					if (found)
-					{
+		if (found)
+		{
 			fp.push_back(pp[i]);
 		}
 	}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index b03e0960422e6d56e864fcd88537fe482e63fc0c..b12dc3edbbd23e4160de8a94b503dfedf651907c 100755
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -47,6 +47,7 @@ class LLViewerObject;
 class LLTextureEntry;
 class LLCullResult;
 class LLVOAvatar;
+class LLVOPartGroup;
 class LLGLSLShader;
 class LLDrawPoolAlpha;
 
@@ -188,6 +189,12 @@ class LLPipeline
 												LLVector4a* normal = NULL,               // return the surface normal at the intersection point
 												LLVector4a* tangent = NULL             // return the surface tangent at the intersection point  
 		);
+
+	//get the closest particle to start between start and end, returns the LLVOPartGroup and particle index
+	LLVOPartGroup* lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection,
+														S32* face_hit);
+
+
 	LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
 											  BOOL pick_transparent,
 											  S32* face_hit,                          // return the face hit
@@ -889,6 +896,7 @@ class LLPipeline
 	static F32 RenderGlowWidth;
 	static F32 RenderGlowStrength;
 	static BOOL RenderDepthOfField;
+	static BOOL RenderDepthOfFieldInEditMode;
 	static F32 CameraFocusTransitionTime;
 	static F32 CameraFNumber;
 	static F32 CameraFocalLength;
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
index 46ba4bd29d2786bf2c0ac1f7835dffb4765eac06..0a8beec7de025d569fb13bc68e5c6dbbfce16d3f 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -112,4 +112,15 @@
          <menu_item_call.on_enable
           function="Object.EnableInspect" />
    </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index 28e032ce5f0e4f90c4eaf1c016efbb3d9003bfce..bcbc8d5b86c7df1ba7d93c0e69ee85e92b55769e 100755
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -143,4 +143,15 @@ name="Edit Outfit">
     <menu_item_call.on_enable
      function="Attachment.EnableDrop" />
   </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
index e7c2b80da27f45f8b69c8297352885aab5d5a87c..8be2683680fa6115b4a9740e6112320899a74e52 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -103,4 +103,15 @@
         <menu_item_call.on_enable
          function="EnablePayAvatar" />
     </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index c1ff026a74e51fb856db513c20fe177cc6882d12..ca0c9bd5e4947d8235235fc6b7c65364df09edae 100755
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -269,4 +269,16 @@
             <menu_item_call.on_visible
              function="Advanced.EnableAppearanceToXML"/>
     </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_land.xml b/indra/newview/skins/default/xui/en/menu_land.xml
index cc6d8ad9c1d8dcd37fd57b56d324dd8feca35a91..2ad5cbbe951cd561d4b72ab58fa5afb16380842b 100755
--- a/indra/newview/skins/default/xui/en/menu_land.xml
+++ b/indra/newview/skins/default/xui/en/menu_land.xml
@@ -61,4 +61,15 @@
         <menu_item_call.on_enable
          function="EnableEdit" />
     </menu_item_call>
+   <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_mute_particle.xml b/indra/newview/skins/default/xui/en/menu_mute_particle.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a4261bf39e6ea5f411d477fa195132e765ccdcfd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_mute_particle.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu
+ layout="topleft"
+ name="Mute Particle Pie">
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index f6004621a652988262a4c0d0225236fa449bf661..52ab7da51550113eb57baca78fa4ac8f1a3f35b9 100755
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -196,4 +196,15 @@
     <menu_item_call.on_enable
         function="Object.EnableDelete" />
   </menu_item_call>
+  <menu_item_separator
+       layout="topleft" />
+  <menu_item_call
+     enabled="false"
+     label="Block Particle Owner"
+     name="Mute Particle">
+    <menu_item_call.on_click
+     function="Particle.Mute" />
+    <menu_item_call.on_enable
+     function="EnableMuteParticle" />
+  </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 8667d0277a9cd90ded0aed5a7c9d36005d71ed6e..a4e01ff1c9c78d4fa4718a7ae52a78512df43263 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6804,7 +6804,6 @@ This will add a bookmark in your inventory so you can quickly IM this Resident.
    name="RegionRestartMinutes"
    priority="high"
    sound="UISndAlert"
-   persist="true"
    type="notify">
 This region will restart in [MINUTES] minutes.
 If you stay in this region you will be logged out.
@@ -6815,7 +6814,6 @@ If you stay in this region you will be logged out.
    name="RegionRestartSeconds"
    priority="high"
    sound="UISndAlert"
-   persist="true"
    type="notify">
 This region will restart in [SECONDS] seconds.
 If you stay in this region you will be logged out.
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 d7db7caf66efc65ee754638f17d96d29569d9320..3c4d28803729b82942bcca6674ea73e2f59192e1 100755
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -47,7 +47,7 @@
         Better
     </text>
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -56,16 +56,15 @@
      top_delta="-2"
      width="2" />
   <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
      left_pad="41"
-     name="LowMidraphicsDivet"
-     top_delta="-2"
+     name="LowMidGraphicsDivet"
      width="2" />
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -74,7 +73,7 @@
      top_delta="0"
      width="2" />
   <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -83,7 +82,7 @@
      top_delta="0"
      width="2" />
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -92,7 +91,7 @@
      top_delta="0"
      width="2" />
   <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
@@ -101,7 +100,7 @@
      top_delta="0"
      width="2" />
     <icon
-     color="0.12 0.12 0.12 1"
+     color="DkGray"
      height="14"
      image_name="Rounded_Square"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml
index 89aef57ccaea0ab8274168fa6bda56f017a4520c..0eeccbeac516983fcf523daae0cf7685a0f481a1 100755
--- a/indra/newview/skins/default/xui/en/role_actions.xml
+++ b/indra/newview/skins/default/xui/en/role_actions.xml
@@ -70,8 +70,8 @@
 		     longdescription="Toggle &apos;Show Place in Search&apos; and setting a parcel&apos;s category in About Land &gt; Options tab."
 		     name="land find places" value="17" />
 		<action
-		     description="Change parcel name, description, and &apos;Show Place in Search&apos; settings"
-		     longdescription="Change parcel name, description, and &apos;Show Place in Search&apos; settings. This is done in About Land &gt; Options tab."
+		     description="Change parcel name, description, and &apos;Moderate Content&apos; settings"
+		     longdescription="Change parcel name, description, and &apos;Moderate Content&apos; settings. This is done in About Land &gt; Options tab."
 		     name="land change identity" value="18" />
 		<action description="Set landing point and set teleport routing"
 		     longdescription="On a group-owned parcel, Members in a Role with this Ability can set a landing point to specify where incoming teleports arrive, and also set teleport routing for further control. This is done in About Land &gt; Options tab."
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 9f02e90ea303e35e82026f9fe71041918587bb7c..dd7df368c77292700e571810ad8a5b809efc2ca4 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2516,6 +2516,8 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale
 	<string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string>
 	<string name="ATTACH_HUD_BOTTOM">HUD Bottom</string>
 	<string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string>
+	<string name="ATTACH_NECK">Neck</string>
+	<string name="ATTACH_AVATAR_CENTER">Avatar Center</string>
 
 	<!-- script editor -->
 	<string name="CursorPos">Line [LINE], Column [COLUMN]</string>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 53a3e732caa52401624638432d38645154d6c9d2..5e08e54b7c6de60882f99a135e607a8957065278 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -366,6 +366,7 @@ def construct(self):
             self.path("zlib1.dll")
             self.path("vivoxplatform.dll")
             self.path("vivoxoal.dll")
+            self.path("ca-bundle.crt")
             
             # Security
             self.path("ssleay32.dll")
@@ -726,6 +727,7 @@ def path_optional(src, dst):
                                 'libvivoxoal.dylib',
                                 'libvivoxsdk.dylib',
                                 'libvivoxplatform.dylib',
+                                'ca-bundle.crt',
                                 'SLVoice',
                                 ):
                      self.path2basename(libdir, libfile)