From 553a1a3b59b85fe792173c5d728e3950d59bb315 Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@lindenlab.com>
Date: Fri, 10 Dec 2010 21:00:58 -0800
Subject: Sigh... another fix for ER-343.  Or maybe I forgot to commit the
 first time? LLViewerParcelOverlay::isOwned() just reports that *someone*
 ownes the parcel rather than the main *avatar* ownes the parcel.

---
 indra/newview/llviewerregion.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index c73b5fdd40..d9fd731ad3 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1503,7 +1503,8 @@ const U32 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHIN
 bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const LLBBox& bbox)
 {
 	return mParcelOverlay
-		&& ( mParcelOverlay->isOwned(pos)
+		&& ( (mParcelOverlay->isOwnedSelf(pos)
+			 || mParcelOverlay->isOwnedGroup(pos))
 			|| ((mRegionFlags & ALLOW_RETURN_ENCROACHING_OBJECT)
 				&& mParcelOverlay->encroachesOwned(bbox)) );
 }
-- 
cgit v1.2.3


From 64512b681e2f5582378d9943642a82c83cae30ac Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@lindenlab.com>
Date: Tue, 14 Dec 2010 08:52:33 -0800
Subject: ER-398 viewer's encroachment logic only uses bounding box of root
 prim Adding LLBBox::join() to allow us to compute the bounding box of a
 linked object

---
 indra/llmath/llbbox.cpp          | 13 +++++++++++++
 indra/llmath/llbbox.h            |  5 ++++-
 indra/newview/llviewerobject.cpp | 12 ++++++++++--
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/indra/llmath/llbbox.cpp b/indra/llmath/llbbox.cpp
index 72c906b5ca..67a305d269 100644
--- a/indra/llmath/llbbox.cpp
+++ b/indra/llmath/llbbox.cpp
@@ -102,6 +102,19 @@ LLBBox LLBBox::getAxisAligned() const
 
 	return aligned;
 }
+// Increases the size to contain other_box
+void LLBBox::join(const LLBBox& other_box)
+{
+	LLVector3 other_min = (other_box.mPosAgent - mPosAgent) - other_box.mMinLocal;
+	mMinLocal.mV[VX] = llmin( other_min.mV[VX], mMinLocal.mV[VX] );
+	mMinLocal.mV[VY] = llmin( other_min.mV[VY], mMinLocal.mV[VY] );
+	mMinLocal.mV[VZ] = llmin( other_min.mV[VZ], mMinLocal.mV[VZ] );
+
+	LLVector3 other_max = (other_box.mPosAgent - mPosAgent) + other_box.mMaxLocal;
+	mMaxLocal.mV[VX] = llmax( other_max.mV[VX], mMaxLocal.mV[VX] );
+	mMaxLocal.mV[VY] = llmax( other_max.mV[VY], mMaxLocal.mV[VY] );
+	mMaxLocal.mV[VZ] = llmax( other_max.mV[VZ], mMaxLocal.mV[VZ] );
+}
 
 
 void LLBBox::expand( F32 delta )
diff --git a/indra/llmath/llbbox.h b/indra/llmath/llbbox.h
index a0d434b051..8616320381 100644
--- a/indra/llmath/llbbox.h
+++ b/indra/llmath/llbbox.h
@@ -83,7 +83,10 @@ public:
 	LLVector3			agentToLocalBasis(const LLVector3& v) const;
 
 	// Get the smallest possible axis aligned bbox that contains this bbox
-	LLBBox               getAxisAligned() const;
+	LLBBox              getAxisAligned() const;
+
+	// Increases the size to contain other_box
+	void 				join(const LLBBox& other_box);
 
 
 //	friend LLBBox operator*(const LLBBox& a, const LLMatrix4& b);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index df89e6759d..15207e7346 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -518,10 +518,18 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list)
 // agent.
 bool LLViewerObject::isReturnable()
 {
-	LLBBox box_in_region_frame(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f);
+	LLBBox bounding_box(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f);
+	for (child_list_t::iterator iter = mChildList.begin();
+		 iter != mChildList.end(); iter++)
+	{
+		LLViewerObject* child = *iter;
+		LLBBox child_box(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f);
+		bounding_box.join(child_box);
+	}
+
 	return !isAttachment()
 		&& mRegionp
-		&& mRegionp->objectIsReturnable(getPositionRegion(), box_in_region_frame);
+		&& mRegionp->objectIsReturnable(getPositionRegion(), bounding_box);
 }
 
 BOOL LLViewerObject::setParent(LLViewerObject* parent)
-- 
cgit v1.2.3


From 3be87bb04685e971965ab5ac4166165c3785476f Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@lindenlab.com>
Date: Wed, 15 Dec 2010 11:23:00 -0800
Subject: ER-407 child bounding boxes not rotated properly for encroachment
 returnability Using the correct method for joining BBoxes in the agent frame
 ::addBBoxAgent()

---
 indra/llmath/llbbox.cpp          | 14 --------------
 indra/llmath/llbbox.h            |  4 ----
 indra/newview/llviewerobject.cpp |  2 +-
 3 files changed, 1 insertion(+), 19 deletions(-)

diff --git a/indra/llmath/llbbox.cpp b/indra/llmath/llbbox.cpp
index 67a305d269..d2208f604e 100644
--- a/indra/llmath/llbbox.cpp
+++ b/indra/llmath/llbbox.cpp
@@ -102,20 +102,6 @@ LLBBox LLBBox::getAxisAligned() const
 
 	return aligned;
 }
-// Increases the size to contain other_box
-void LLBBox::join(const LLBBox& other_box)
-{
-	LLVector3 other_min = (other_box.mPosAgent - mPosAgent) - other_box.mMinLocal;
-	mMinLocal.mV[VX] = llmin( other_min.mV[VX], mMinLocal.mV[VX] );
-	mMinLocal.mV[VY] = llmin( other_min.mV[VY], mMinLocal.mV[VY] );
-	mMinLocal.mV[VZ] = llmin( other_min.mV[VZ], mMinLocal.mV[VZ] );
-
-	LLVector3 other_max = (other_box.mPosAgent - mPosAgent) + other_box.mMaxLocal;
-	mMaxLocal.mV[VX] = llmax( other_max.mV[VX], mMaxLocal.mV[VX] );
-	mMaxLocal.mV[VY] = llmax( other_max.mV[VY], mMaxLocal.mV[VY] );
-	mMaxLocal.mV[VZ] = llmax( other_max.mV[VZ], mMaxLocal.mV[VZ] );
-}
-
 
 void LLBBox::expand( F32 delta )
 {
diff --git a/indra/llmath/llbbox.h b/indra/llmath/llbbox.h
index 8616320381..28e69b75e1 100644
--- a/indra/llmath/llbbox.h
+++ b/indra/llmath/llbbox.h
@@ -85,10 +85,6 @@ public:
 	// Get the smallest possible axis aligned bbox that contains this bbox
 	LLBBox              getAxisAligned() const;
 
-	// Increases the size to contain other_box
-	void 				join(const LLBBox& other_box);
-
-
 //	friend LLBBox operator*(const LLBBox& a, const LLMatrix4& b);
 
 private:
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 15207e7346..ae2154d63b 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -524,7 +524,7 @@ bool LLViewerObject::isReturnable()
 	{
 		LLViewerObject* child = *iter;
 		LLBBox child_box(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f);
-		bounding_box.join(child_box);
+		bounding_box.addBBoxAgent(child_box);
 	}
 
 	return !isAttachment()
-- 
cgit v1.2.3


From 7fc9d701190a75c8f96a0a808d793dbc34860916 Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@lindenlab.com>
Date: Fri, 17 Dec 2010 19:52:45 -0800
Subject: For object-vs-parcel overlap we now use list of axis aligned boxes
 one box for each prim, for less slop on queries

---
 indra/newview/llviewerobject.cpp        | 15 ++++++++-----
 indra/newview/llviewerparceloverlay.cpp | 39 +++++++++++++++++----------------
 indra/newview/llviewerparceloverlay.h   |  6 ++---
 indra/newview/llviewerregion.cpp        |  4 ++--
 indra/newview/llviewerregion.h          |  2 +-
 5 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index ae2154d63b..18d6e4c8c8 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -518,18 +518,21 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list)
 // agent.
 bool LLViewerObject::isReturnable()
 {
-	LLBBox bounding_box(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f);
+	if (isAttachment())
+	{
+		return false;
+	}
+	std::vector<LLBBox> boxes;
+	boxes.push_back(LLBBox(getPositionRegion(), getRotationRegion(), getScale() * -0.5f, getScale() * 0.5f).getAxisAligned());
 	for (child_list_t::iterator iter = mChildList.begin();
 		 iter != mChildList.end(); iter++)
 	{
 		LLViewerObject* child = *iter;
-		LLBBox child_box(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f);
-		bounding_box.addBBoxAgent(child_box);
+		boxes.push_back(LLBBox(child->getPositionRegion(), child->getRotationRegion(), child->getScale() * -0.5f, child->getScale() * 0.5f).getAxisAligned());
 	}
 
-	return !isAttachment()
-		&& mRegionp
-		&& mRegionp->objectIsReturnable(getPositionRegion(), bounding_box);
+	return mRegionp
+		&& mRegionp->objectIsReturnable(getPositionRegion(), boxes);
 }
 
 BOOL LLViewerObject::setParent(LLViewerObject* parent)
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 58d9009c90..395da5a036 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -145,27 +145,28 @@ BOOL LLViewerParcelOverlay::isOwnedOther(const LLVector3& pos) const
 	return (PARCEL_OWNED == overlay || PARCEL_FOR_SALE == overlay);
 }
 
-bool LLViewerParcelOverlay::encroachesOwned(const LLBBox& bbox) const
+bool LLViewerParcelOverlay::encroachesOwned(const std::vector<LLBBox>& boxes) const
 {
-	LLBBox bbox_aligned = bbox.getAxisAligned();
-
-	LLVector3 min = bbox_aligned.getMinAgent();
-	LLVector3 max = bbox_aligned.getMaxAgent();
+	// boxes are expected to already be axis aligned
+	for (S32 i = 0; i < boxes.size(); ++i)
+	{
+		LLVector3 min = boxes[i].getMinAgent();
+		LLVector3 max = boxes[i].getMaxAgent();
+		
+		S32 left   = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+		S32 right  = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+		S32 top    = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
+		S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
 	
-	S32 left   = S32(llclamp((min.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
-	S32 right  = S32(llclamp((max.mV[VX] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
-	S32 top    = S32(llclamp((min.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
-	S32 bottom = S32(llclamp((max.mV[VY] / PARCEL_GRID_STEP_METERS), 0.f, REGION_WIDTH_METERS - 1));
-
-	for (S32 row = top; row <= bottom; row++)
-		for (S32 column = left; column <= right; column++)
-		{
-			U8 type = ownership(row, column);
-			if (PARCEL_SELF == type
-				|| PARCEL_GROUP == type )
-				return true;
-		}
-
+		for (S32 row = top; row <= bottom; row++)
+			for (S32 column = left; column <= right; column++)
+			{
+				U8 type = ownership(row, column);
+				if (PARCEL_SELF == type
+					|| PARCEL_GROUP == type )
+					return true;
+			}
+	}
 	return false;
 }
 
diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h
index 4aa42eb8a4..c80baedda6 100644
--- a/indra/newview/llviewerparceloverlay.h
+++ b/indra/newview/llviewerparceloverlay.h
@@ -57,9 +57,9 @@ public:
 	BOOL			isOwnedOther(const LLVector3& pos) const;
 
 	// "encroaches" means the prim hangs over the parcel, but its center
-	// might be in another parcel. for now, we simply test bounding boxes
-	// which isn't perfect, but is close
-	bool 			encroachesOwned(const LLBBox& bbox) const;
+	// might be in another parcel. for now, we simply test axis aligned 
+	// bounding boxes which isn't perfect, but is close
+	bool encroachesOwned(const std::vector<LLBBox>& boxes) const;
 	
 	BOOL			isSoundLocal(const LLVector3& pos) const;
 
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 43b26fe830..32e7cc3468 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1500,13 +1500,13 @@ LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)
 const U32 ALLOW_RETURN_ENCROACHING_OBJECT = REGION_FLAGS_ALLOW_RETURN_ENCROACHING_OBJECT
 											| REGION_FLAGS_ALLOW_RETURN_ENCROACHING_ESTATE_OBJECT;
 
-bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const LLBBox& bbox)
+bool LLViewerRegion::objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const
 {
 	return (mParcelOverlay != NULL)
 		&& (mParcelOverlay->isOwnedSelf(pos)
 			|| mParcelOverlay->isOwnedGroup(pos)
 			|| ((mRegionFlags & ALLOW_RETURN_ENCROACHING_OBJECT)
-				&& mParcelOverlay->encroachesOwned(bbox)) );
+				&& mParcelOverlay->encroachesOwned(boxes)) );
 }
 
 void LLViewerRegion::showReleaseNotes()
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 76228c0d2a..3d3f1d62a6 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -295,7 +295,7 @@ public:
 
 	LLSpatialPartition* getSpatialPartition(U32 type);
 
-	bool objectIsReturnable(const LLVector3& pos, const LLBBox& bbox);
+	bool objectIsReturnable(const LLVector3& pos, const std::vector<LLBBox>& boxes) const;
 public:
 	struct CompareDistance
 	{
-- 
cgit v1.2.3


From 049b00a6f10d50609055810b0800f49476b351d2 Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@lindenlab.com>
Date: Mon, 20 Dec 2010 09:03:59 -0800
Subject: Fixing windows build error about inequality comparison between S32
 and U32.

---
 indra/newview/llviewerparceloverlay.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 395da5a036..1207ef3340 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -148,7 +148,7 @@ BOOL LLViewerParcelOverlay::isOwnedOther(const LLVector3& pos) const
 bool LLViewerParcelOverlay::encroachesOwned(const std::vector<LLBBox>& boxes) const
 {
 	// boxes are expected to already be axis aligned
-	for (S32 i = 0; i < boxes.size(); ++i)
+	for (U32 i = 0; i < boxes.size(); ++i)
 	{
 		LLVector3 min = boxes[i].getMinAgent();
 		LLVector3 max = boxes[i].getMaxAgent();
-- 
cgit v1.2.3


From 375bdb6d1eb58e7f9f84be947d05ca44e550752d Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@lindenlab.com>
Date: Wed, 22 Dec 2010 10:06:36 -0800
Subject: removing some very old debug spam

---
 indra/newview/llvoavatar.cpp | 25 -------------------------
 1 file changed, 25 deletions(-)

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index bb4c5b1804..fd89044995 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2106,31 +2106,6 @@ void LLVOAvatar::computeBodySize()
 			gAgent.sendAgentSetAppearance();
 		}
 	}
-
-/* debug spam
-	std::cout << "skull = " << skull << std::endl;				// adebug
-	std::cout << "head = " << head << std::endl;				// adebug
-	std::cout << "head_scale = " << head_scale << std::endl;	// adebug
-	std::cout << "neck = " << neck << std::endl;				// adebug
-	std::cout << "neck_scale = " << neck_scale << std::endl;	// adebug
-	std::cout << "chest = " << chest << std::endl;				// adebug
-	std::cout << "chest_scale = " << chest_scale << std::endl;	// adebug
-	std::cout << "torso = " << torso << std::endl;				// adebug
-	std::cout << "torso_scale = " << torso_scale << std::endl;	// adebug
-	std::cout << std::endl;	// adebug
-
-	std::cout << "pelvis_scale = " << pelvis_scale << std::endl;// adebug
-	std::cout << std::endl;	// adebug
-
-	std::cout << "hip = " << hip << std::endl;					// adebug
-	std::cout << "hip_scale = " << hip_scale << std::endl;		// adebug
-	std::cout << "ankle = " << ankle << std::endl;				// adebug
-	std::cout << "ankle_scale = " << ankle_scale << std::endl;	// adebug
-	std::cout << "foot = " << foot << std::endl;				// adebug
-	std::cout << "mBodySize = " << mBodySize << std::endl;		// adebug
-	std::cout << "mPelvisToFoot = " << mPelvisToFoot << std::endl;	// adebug
-	std::cout << std::endl;		// adebug
-*/
 }
 
 //------------------------------------------------------------------------
-- 
cgit v1.2.3


From 9b0e4d20a96ad01de33ec6d4ff87cb2a15d36d58 Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@lindenlab.com>
Date: Wed, 22 Dec 2010 10:47:18 -0800
Subject: Setting viewer version numbers back to what they were as per Merov's
 review request.

---
 indra/llcommon/llversionviewer.h              | 2 +-
 indra/newview/English.lproj/InfoPlist.strings | 4 ++--
 indra/newview/Info-SecondLife.plist           | 2 +-
 indra/newview/res/viewerRes.rc                | 8 ++++----
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 356e0f4c0f..d6fa5b1997 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -35,7 +35,7 @@ const S32 LL_VERSION_BUILD = 0;
 const char * const LL_CHANNEL = "Second Life Developer";
 
 #if LL_DARWIN
-const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.indra.viewer";
+const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.snowglobe.viewer";
 #endif
 
 #endif
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index fb1c465493..4bf67b1367 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -2,6 +2,6 @@
 
 CFBundleName = "Second Life";
 
-CFBundleShortVersionString = "Second Life version 2.4.0.211776";
-CFBundleGetInfoString = "Second Life version 2.4.0.211776, Copyright 2004-2010 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 2.1.1.0";
+CFBundleGetInfoString = "Second Life version 2.1.1.0, Copyright 2004-2010 Linden Research, Inc.";
 
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 5412fd5d5c..3cda7467dd 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -60,7 +60,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>2.4.0.211776</string>
+	<string>2.1.1.0</string>
 	<key>CSResourcesFileMapped</key>
 	<true/>
 </dict>
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index d71a4abe3c..5e8cee1f5f 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -129,8 +129,8 @@ TOOLSIT                 CURSOR                  "toolsit.cur"
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,4,0,211776
- PRODUCTVERSION 2,4,0,211776
+ FILEVERSION 2,1,1,0
+ PRODUCTVERSION 2,1,1,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -147,12 +147,12 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "Linden Lab"
             VALUE "FileDescription", "Second Life"
-            VALUE "FileVersion", "2.4.0.211776"
+            VALUE "FileVersion", "2.1.1.0"
             VALUE "InternalName", "Second Life"
             VALUE "LegalCopyright", "Copyright � 2001-2010, Linden Research, Inc."
             VALUE "OriginalFilename", "SecondLife.exe"
             VALUE "ProductName", "Second Life"
-            VALUE "ProductVersion", "2.4.0.211776"
+            VALUE "ProductVersion", "2.1.1.0"
         END
     END
     BLOCK "VarFileInfo"
-- 
cgit v1.2.3