summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BuildParams33
-rw-r--r--doc/contributions.txt7
-rwxr-xr-xindra/develop.py27
-rw-r--r--indra/llrender/llrender.cpp8
-rw-r--r--indra/newview/app_settings/settings.xml2
-rw-r--r--indra/newview/installers/windows/installer_template.nsi6
-rw-r--r--indra/newview/installers/windows/lang_da.nsibin0 -> 7108 bytes
-rw-r--r--indra/newview/installers/windows/lang_pl.nsibin0 -> 7450 bytes
-rw-r--r--indra/newview/installers/windows/language_menu.nsibin1302 -> 1444 bytes
-rw-r--r--indra/newview/llagent.cpp5
-rw-r--r--indra/newview/llagent.h2
-rw-r--r--indra/newview/llagentwearablesfetch.cpp1
-rw-r--r--indra/newview/llappearancemgr.cpp8
-rw-r--r--indra/newview/llappearancemgr.h2
-rw-r--r--indra/newview/llface.cpp67
-rw-r--r--indra/newview/llface.h3
-rw-r--r--indra/newview/llimview.cpp4
-rw-r--r--indra/newview/llinventorymodel.cpp2
-rw-r--r--indra/newview/lllandmarklist.cpp5
-rw-r--r--indra/newview/lllandmarklist.h4
-rw-r--r--indra/newview/llpanelface.cpp162
-rw-r--r--indra/newview/llpanelface.h1
-rw-r--r--indra/newview/llpanellandmarks.cpp27
-rw-r--r--indra/newview/llslurl.cpp21
-rw-r--r--indra/newview/llviewermenu.cpp23
-rw-r--r--indra/newview/llviewermessage.cpp4
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml26
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_self.xml13
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_self.xml12
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml2
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml2
-rw-r--r--indra/newview/tests/llslurl_test.cpp3
-rw-r--r--indra/newview/viewer_manifest.py4
-rw-r--r--install.xml4
-rw-r--r--viewer-hg-convert.shamap539
42 files changed, 987 insertions, 68 deletions
diff --git a/BuildParams b/BuildParams
index 6adae15d5f..d481072185 100644
--- a/BuildParams
+++ b/BuildParams
@@ -1,19 +1,15 @@
# BuildParams
#
# Please refer to:
-# https://wiki.lindenlab.com/wiki/Parabuild_with_Mercurial#How_Build_Parameters_Work
+# https://wiki.secondlife.com/wiki/Automated_Build_System
# Global setting for now...
Darwin.symbolfiles = "newview/Release/secondlife-symbols-darwin.tar.bz2"
CYGWIN.symbolfiles = "newview/Release/secondlife-symbols-windows.tar.bz2"
Linux.symbolfiles = "newview/secondlife-symbols-linux.tar.bz2"
-# Public Upload Locations overriding the default private ones
-S3PROXY_URL = http://automated-builds-secondlife-com.s3.amazonaws.com/
-S3INTERNAL_URL = http://automated-builds-secondlife-com.s3.amazonaws.com/
-S3GET_URL = http://automated-builds-secondlife-com.s3.amazonaws.com/
-S3PUT_URL = https://s3.amazonaws.com/automated-builds-secondlife-com/
-S3ACL = public-read
+# Use Public Upload Locations
+public_build = true
# Update Public Inworld Build Status Indicators
email_status_this_is_os = true
@@ -27,7 +23,6 @@ viewer-development.show_changes_since = 2-1-release
# Build Settings
viewer-development_coverity.coverity_product = viewer
-
viewer-development.build_debug_release_separately = true
# Notifications - to configure email notices, add a setting like this:
@@ -155,4 +150,26 @@ oz_viewer-review1_coverity.build_CYGWIN_Debug = false
oz_viewer-review1_coverity.build_CYGWIN_RelWithDebInfo = false
oz_viewer-review1_coverity.build_CYGWIN_Release = false
+oz_viewer-review2_coverity.coverity_product = viewer
+
+oz_viewer-review2.build_Linux = true
+oz_viewer-review2_debug.build_Linux = false
+oz_viewer-review2_coverity.build_Linux = false
+
+oz_viewer-review2.build_Darwin = true
+oz_viewer-review2_debug.build_Darwin = false
+oz_viewer-review2_coverity.build_Darwin = false
+
+oz_viewer-review2.build_CYGWIN = true
+oz_viewer-review2.build_CYGWIN_Debug = false
+oz_viewer-review2.build_CYGWIN_RelWithDebInfo = false
+oz_viewer-review2.build_CYGWIN_Release = true
+oz_viewer-review2_debug.build_CYGWIN_Debug = true
+oz_viewer-review2_debug.build_CYGWIN_RelWithDebInfo = true
+oz_viewer-review2_debug.build_CYGWIN_Release = false
+oz_viewer-review2_coverity.build_coverity = true
+oz_viewer-review2_coverity.build_CYGWIN_Debug = false
+oz_viewer-review2_coverity.build_CYGWIN_RelWithDebInfo = false
+oz_viewer-review2_coverity.build_CYGWIN_Release = false
+
# eof
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 9df072e937..6d93eca14c 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -64,6 +64,7 @@ Aleric Inglewood
VWR-12691
VWR-13996
VWR-14426
+ SNOW-766
Ales Beaumont
VWR-9352
Alissa Sabre
@@ -127,6 +128,8 @@ Asuka Neely
VWR-8179
Balp Allen
VWR-4157
+Be Holder
+ SNOW-397
Benja Kepler
VWR-746
Biancaluce Robbiani
@@ -153,6 +156,7 @@ Boroondas Gupte
SNOW-503
SNOW-510
SNOW-527
+ SNOW-610
SNOW-624
VWR-233
WEB-262
@@ -212,6 +216,8 @@ Dzonatas Sol
VWR-1705
VWR-1729
VWR-1812
+Eddi Decosta
+ SNOW-586
Eddy Stryker
VWR-15
VWR-23
@@ -632,6 +638,7 @@ Tharax Ferraris
VWR-605
Thickbrick Sleaford
SNOW-207
+ SNOW-586
SNOW-743
VWR-7109
VWR-9287
diff --git a/indra/develop.py b/indra/develop.py
index 3c88bb8a01..36c947327a 100755
--- a/indra/develop.py
+++ b/indra/develop.py
@@ -742,9 +742,10 @@ Options:
-p | --project=NAME set the root project name. (Doesn't effect makefiles)
Commands:
- build configure and build default target
- clean delete all build directories, does not affect sources
- configure configure project by running cmake (default command if none given)
+ build configure and build default target
+ clean delete all build directories, does not affect sources
+ configure configure project by running cmake (default if none given)
+ printbuilddirs print the build directory that will be used
Command-options for "configure":
We use cmake variables to change the build configuration.
@@ -762,15 +763,6 @@ Examples:
'''
def main(arguments):
- if os.getenv('DISTCC_DIR') is None:
- distcc_dir = os.path.join(getcwd(), '.distcc')
- if not os.path.exists(distcc_dir):
- os.mkdir(distcc_dir)
- print "setting DISTCC_DIR to %s" % distcc_dir
- os.environ['DISTCC_DIR'] = distcc_dir
- else:
- print "DISTCC_DIR is set to %s" % os.getenv('DISTCC_DIR')
-
setup = setup_platform[sys.platform]()
try:
opts, args = getopt.getopt(
@@ -832,6 +824,14 @@ For example: develop.py configure -DSERVER:BOOL=OFF"""
if cmd in ('cmake', 'configure'):
setup.run_cmake(args)
elif cmd == 'build':
+ if os.getenv('DISTCC_DIR') is None:
+ distcc_dir = os.path.join(getcwd(), '.distcc')
+ if not os.path.exists(distcc_dir):
+ os.mkdir(distcc_dir)
+ print "setting DISTCC_DIR to %s" % distcc_dir
+ os.environ['DISTCC_DIR'] = distcc_dir
+ else:
+ print "DISTCC_DIR is set to %s" % os.getenv('DISTCC_DIR')
for d in setup.build_dirs():
if not os.path.exists(d):
raise CommandError('run "develop.py cmake" first')
@@ -842,6 +842,9 @@ For example: develop.py configure -DSERVER:BOOL=OFF"""
if args:
raise CommandError('clean takes no arguments')
setup.cleanup()
+ elif cmd == 'printbuilddirs':
+ for d in setup.build_dirs():
+ print >> sys.stdout, d
else:
print >> sys.stderr, 'Error: unknown subcommand', repr(cmd)
print >> sys.stderr, "(run 'develop.py --help' for help)"
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 3a89b999bd..e26acd53a3 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -895,9 +895,7 @@ LLVector3 LLRender::getUITranslation()
{
if (mUIOffset.empty())
{
- //llassert(!mUIOffset.empty());
- llwarns << "UI offset stack empty." << llendl;
- return LLVector3(0,0,0);
+ return LLVector3::zero;
}
return mUIOffset.back();
}
@@ -906,9 +904,7 @@ LLVector3 LLRender::getUIScale()
{
if (mUIScale.empty())
{
- //llassert(!mUIScale.empty());
- llwarns << "UI scale stack empty." << llendl;
- return LLVector3(1,1,1);
+ return LLVector3(1.f, 1.f, 1.f);
}
return mUIScale.back();
}
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 07418d1b5e..9d911777d1 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8635,7 +8635,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>ShowBetaGrids</key>
<map>
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 3ea7897501..49ae58d53a 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -29,6 +29,7 @@ RequestExecutionLevel admin ; on Vista we must be admin because we write to Prog
;; (these files are in the same place as the nsi template but the python script generates a new nsi file in the
;; application directory so we have to add a path to these include files)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+!include "%%SOURCE%%\installers\windows\lang_da.nsi"
!include "%%SOURCE%%\installers\windows\lang_de.nsi"
!include "%%SOURCE%%\installers\windows\lang_en-us.nsi"
!include "%%SOURCE%%\installers\windows\lang_es.nsi"
@@ -37,18 +38,21 @@ RequestExecutionLevel admin ; on Vista we must be admin because we write to Prog
!include "%%SOURCE%%\installers\windows\lang_it.nsi"
!include "%%SOURCE%%\installers\windows\lang_ko.nsi"
!include "%%SOURCE%%\installers\windows\lang_nl.nsi"
+!include "%%SOURCE%%\installers\windows\lang_pl.nsi"
!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi"
!include "%%SOURCE%%\installers\windows\lang_zh.nsi"
# *TODO: Move these into the language files themselves
+LangString LanguageCode ${LANG_DANISH} "da"
LangString LanguageCode ${LANG_GERMAN} "de"
-LangString LanguageCode ${LANG_ENGLISH} "en"
+Langstring LanguageCode ${LANG_ENGLISH} "en"
LangString LanguageCode ${LANG_SPANISH} "es"
LangString LanguageCode ${LANG_FRENCH} "fr"
LangString LanguageCode ${LANG_JAPANESE} "ja"
LangString LanguageCode ${LANG_ITALIAN} "it"
LangString LanguageCode ${LANG_KOREAN} "ko"
LangString LanguageCode ${LANG_DUTCH} "nl"
+LangString LanguageCode ${LANG_POLISH} "da"
LangString LanguageCode ${LANG_PORTUGUESEBR} "pt"
LangString LanguageCode ${LANG_SIMPCHINESE} "zh"
diff --git a/indra/newview/installers/windows/lang_da.nsi b/indra/newview/installers/windows/lang_da.nsi
new file mode 100644
index 0000000000..0c832e8ba9
--- /dev/null
+++ b/indra/newview/installers/windows/lang_da.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/lang_pl.nsi b/indra/newview/installers/windows/lang_pl.nsi
new file mode 100644
index 0000000000..191bae4755
--- /dev/null
+++ b/indra/newview/installers/windows/lang_pl.nsi
Binary files differ
diff --git a/indra/newview/installers/windows/language_menu.nsi b/indra/newview/installers/windows/language_menu.nsi
index 988f452dea..fef8d40c69 100644
--- a/indra/newview/installers/windows/language_menu.nsi
+++ b/indra/newview/installers/windows/language_menu.nsi
Binary files differ
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 37cd289b1b..fe7e883d83 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -827,6 +827,11 @@ LLVector3d LLAgent::getPosGlobalFromAgent(const LLVector3 &pos_agent) const
return pos_agent_d + mAgentOriginGlobal;
}
+void LLAgent::sitDown()
+{
+ setControlFlags(AGENT_CONTROL_SIT_ON_GROUND);
+}
+
//-----------------------------------------------------------------------------
// resetAxes()
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 0d95683a98..c643cef78f 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -345,6 +345,8 @@ private:
//--------------------------------------------------------------------
public:
void standUp();
+ /// @brief ground-sit at agent's current position
+ void sitDown();
//--------------------------------------------------------------------
// Busy
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index f7ae320a6f..1edc96e165 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -115,6 +115,7 @@ void LLInitialWearablesFetch::processContents()
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
LLFindWearables is_wearable;
+ llassert_always(mComplete.size() != 0);
gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array,
LLInventoryModel::EXCLUDE_TRASH, is_wearable);
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 94286fd799..7159d89d21 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2307,12 +2307,17 @@ bool LLAppearanceMgr::updateBaseOutfit()
void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type)
{
- items_by_type.reserve(LLWearableType::WT_COUNT);
+ items_by_type.resize(LLWearableType::WT_COUNT);
if (items.empty()) return;
for (S32 i=0; i<items.count(); i++)
{
LLViewerInventoryItem *item = items.get(i);
+ if (!item)
+ {
+ LL_WARNS("Appearance") << "NULL item found" << llendl;
+ continue;
+ }
// Ignore non-wearables.
if (!item->isWearableType())
continue;
@@ -2335,6 +2340,7 @@ std::string build_order_string(LLWearableType::EType type, U32 i)
struct WearablesOrderComparator
{
+ LOG_CLASS(WearablesOrderComparator);
WearablesOrderComparator(const LLWearableType::EType type)
{
mControlSize = build_order_string(type, 0).size();
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 78c2142ea5..c65d9dc9ee 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -42,6 +42,8 @@ class LLOutfitUnLockTimer;
class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
{
+ LOG_CLASS(LLAppearanceMgr);
+
friend class LLSingleton<LLAppearanceMgr>;
friend class LLOutfitUnLockTimer;
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index defd882fe4..d22950cad3 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -827,6 +827,73 @@ LLVector2 LLFace::surfaceToTexture(LLVector2 surface_coord, LLVector3 position,
return tc;
}
+// Returns scale compared to default texgen, and face orientation as calculated
+// by planarProjection(). This is needed to match planar texgen parameters.
+void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_pos, F32* scale) const
+{
+ const LLMatrix4& vol_mat = getWorldMatrix();
+ const LLVolumeFace& vf = getViewerObject()->getVolume()->getVolumeFace(mTEOffset);
+ LLVector3 normal = vf.mVertices[0].mNormal;
+ LLVector3 binormal = vf.mVertices[0].mBinormal;
+ LLVector2 projected_binormal;
+ planarProjection(projected_binormal, normal, vf.mCenter, binormal);
+ projected_binormal -= LLVector2(0.5f, 0.5f); // this normally happens in xform()
+ *scale = projected_binormal.length();
+ // rotate binormal to match what planarProjection() thinks it is,
+ // then find rotation from that:
+ projected_binormal.normalize();
+ F32 ang = acos(projected_binormal.mV[VY]);
+ ang = (projected_binormal.mV[VX] < 0.f) ? -ang : ang;
+ binormal.rotVec(ang, normal);
+ LLQuaternion local_rot( binormal % normal, binormal, normal );
+ *face_rot = local_rot * vol_mat.quaternion();
+ *face_pos = vol_mat.getTranslation();
+}
+
+// Returns the necessary texture transform to align this face's TE to align_to's TE
+bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offset,
+ LLVector2* res_st_scale, F32* res_st_rot) const
+{
+ if (!align_to)
+ {
+ return false;
+ }
+ const LLTextureEntry *orig_tep = align_to->getTextureEntry();
+ if ((orig_tep->getTexGen() != LLTextureEntry::TEX_GEN_PLANAR) ||
+ (getTextureEntry()->getTexGen() != LLTextureEntry::TEX_GEN_PLANAR))
+ {
+ return false;
+ }
+
+ LLVector3 orig_pos, this_pos;
+ LLQuaternion orig_face_rot, this_face_rot;
+ F32 orig_proj_scale, this_proj_scale;
+ align_to->getPlanarProjectedParams(&orig_face_rot, &orig_pos, &orig_proj_scale);
+ getPlanarProjectedParams(&this_face_rot, &this_pos, &this_proj_scale);
+
+ // The rotation of "this face's" texture:
+ LLQuaternion orig_st_rot = LLQuaternion(orig_tep->getRotation(), LLVector3::z_axis) * orig_face_rot;
+ LLQuaternion this_st_rot = orig_st_rot * ~this_face_rot;
+ F32 x_ang, y_ang, z_ang;
+ this_st_rot.getEulerAngles(&x_ang, &y_ang, &z_ang);
+ *res_st_rot = z_ang;
+
+ // Offset and scale of "this face's" texture:
+ LLVector3 centers_dist = (this_pos - orig_pos) * ~orig_st_rot;
+ LLVector3 st_scale(orig_tep->mScaleS, orig_tep->mScaleT, 1.f);
+ st_scale *= orig_proj_scale;
+ centers_dist.scaleVec(st_scale);
+ LLVector2 orig_st_offset(orig_tep->mOffsetS, orig_tep->mOffsetT);
+
+ *res_st_offset = orig_st_offset + (LLVector2)centers_dist;
+ res_st_offset->mV[VX] -= (S32)res_st_offset->mV[VX];
+ res_st_offset->mV[VY] -= (S32)res_st_offset->mV[VY];
+
+ st_scale /= this_proj_scale;
+ *res_st_scale = (LLVector2)st_scale;
+ return true;
+}
+
void LLFace::updateRebuildFlags()
{
if (!mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index d95057f3ef..0166e45bee 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -89,6 +89,9 @@ public:
BOOL hasGeometry() const { return mGeomCount > 0; }
LLVector3 getPositionAgent() const;
LLVector2 surfaceToTexture(LLVector2 surface_coord, LLVector3 position, LLVector3 normal);
+ void getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_pos, F32* scale) const;
+ bool calcAlignedPlanarTE(const LLFace* align_to, LLVector2* st_offset,
+ LLVector2* st_scale, F32* st_rot) const;
U32 getState() const { return mState; }
void setState(U32 state) { mState |= state; }
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index b00a663a9a..129c9aec14 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -3077,7 +3077,9 @@ public:
std::string saved;
if(offline == IM_OFFLINE)
{
- saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
+ LLStringUtil::format_map_t args;
+ args["[LONG_TIMESTAMP]"] = formatted_time(timestamp);
+ saved = LLTrans::getString("Saved_message", args);
}
std::string buffer = saved + message;
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 08229d3a50..53835f0166 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -501,7 +501,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
for(S32 i = 0; i < count; ++i)
{
item = item_array->get(i);
- if (item->getActualType() == LLAssetType::AT_LINK_FOLDER)
+ if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER)
{
LLViewerInventoryCategory *linked_cat = item->getLinkedCategory();
if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT)
diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp
index 87257832b6..dd402de394 100644
--- a/indra/newview/lllandmarklist.cpp
+++ b/indra/newview/lllandmarklist.cpp
@@ -159,6 +159,11 @@ void LLLandmarkList::processGetAssetReply(
}
+BOOL LLLandmarkList::isAssetInLoadedCallbackMap(const LLUUID& asset_uuid)
+{
+ return mLoadedCallbackMap.find(asset_uuid) != mLoadedCallbackMap.end();
+}
+
BOOL LLLandmarkList::assetExists(const LLUUID& asset_uuid)
{
return mList.count(asset_uuid) != 0 || mBadList.count(asset_uuid) != 0;
diff --git a/indra/newview/lllandmarklist.h b/indra/newview/lllandmarklist.h
index 6d32f0e75b..3356f866ce 100644
--- a/indra/newview/lllandmarklist.h
+++ b/indra/newview/lllandmarklist.h
@@ -59,6 +59,10 @@ public:
S32 status,
LLExtStat ext_status );
+ // Returns TRUE if loading the landmark with given asset_uuid has been requested
+ // but is not complete yet.
+ BOOL isAssetInLoadedCallbackMap(const LLUUID& asset_uuid);
+
protected:
void onRegionHandle(const LLUUID& landmark_id);
void makeCallbacks(const LLUUID& landmark_id);
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 572e7a6212..bce496cbad 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -42,6 +42,7 @@
#include "llcolorswatch.h"
#include "llcombobox.h"
#include "lldrawpoolbump.h"
+#include "llface.h"
#include "lllineeditor.h"
#include "llmediaentry.h"
#include "llresmgr.h"
@@ -75,6 +76,7 @@ BOOL LLPanelFace::postBuild()
childSetCommitCallback("checkbox flip t",&LLPanelFace::onCommitTextureInfo, this);
childSetCommitCallback("TexRot",&LLPanelFace::onCommitTextureInfo, this);
childSetAction("button apply",&LLPanelFace::onClickApply,this);
+ childSetCommitCallback("checkbox planar align",&LLPanelFace::onCommitPlanarAlign, this);
childSetCommitCallback("TexOffsetU",LLPanelFace::onCommitTextureInfo, this);
childSetCommitCallback("TexOffsetV",LLPanelFace::onCommitTextureInfo, this);
childSetAction("button align",&LLPanelFace::onClickAutoFix,this);
@@ -359,6 +361,93 @@ private:
LLPanelFace* mPanel;
};
+// Functor that aligns a face to mCenterFace
+struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor
+{
+ LLPanelFaceSetAlignedTEFunctor(LLPanelFace* panel, LLFace* center_face) :
+ mPanel(panel),
+ mCenterFace(center_face) {}
+
+ virtual bool apply(LLViewerObject* object, S32 te)
+ {
+ LLFace* facep = object->mDrawable->getFace(te);
+ if (!facep)
+ {
+ return true;
+ }
+
+ bool set_aligned = true;
+ if (facep == mCenterFace)
+ {
+ set_aligned = false;
+ }
+ if (set_aligned)
+ {
+ LLVector2 uv_offset, uv_scale;
+ F32 uv_rot;
+ set_aligned = facep->calcAlignedPlanarTE(mCenterFace, &uv_offset, &uv_scale, &uv_rot);
+ if (set_aligned)
+ {
+ object->setTEOffset(te, uv_offset.mV[VX], uv_offset.mV[VY]);
+ object->setTEScale(te, uv_scale.mV[VX], uv_scale.mV[VY]);
+ object->setTERotation(te, uv_rot);
+ }
+ }
+ if (!set_aligned)
+ {
+ LLPanelFaceSetTEFunctor setfunc(mPanel);
+ setfunc.apply(object, te);
+ }
+ return true;
+ }
+private:
+ LLPanelFace* mPanel;
+ LLFace* mCenterFace;
+};
+
+// Functor that tests if a face is aligned to mCenterFace
+struct LLPanelFaceGetIsAlignedTEFunctor : public LLSelectedTEFunctor
+{
+ LLPanelFaceGetIsAlignedTEFunctor(LLFace* center_face) :
+ mCenterFace(center_face) {}
+
+ virtual bool apply(LLViewerObject* object, S32 te)
+ {
+ LLFace* facep = object->mDrawable->getFace(te);
+ if (!facep)
+ {
+ return false;
+ }
+ if (facep == mCenterFace)
+ {
+ return true;
+ }
+
+ LLVector2 aligned_st_offset, aligned_st_scale;
+ F32 aligned_st_rot;
+ if ( facep->calcAlignedPlanarTE(mCenterFace, &aligned_st_offset, &aligned_st_scale, &aligned_st_rot) )
+ {
+ const LLTextureEntry* tep = facep->getTextureEntry();
+ LLVector2 st_offset, st_scale;
+ tep->getOffset(&st_offset.mV[VX], &st_offset.mV[VY]);
+ tep->getScale(&st_scale.mV[VX], &st_scale.mV[VY]);
+ F32 st_rot = tep->getRotation();
+ // needs a fuzzy comparison, because of fp errors
+ if (is_approx_equal_fraction(st_offset.mV[VX], aligned_st_offset.mV[VX], 12) &&
+ is_approx_equal_fraction(st_offset.mV[VY], aligned_st_offset.mV[VY], 12) &&
+ is_approx_equal_fraction(st_scale.mV[VX], aligned_st_scale.mV[VX], 12) &&
+ is_approx_equal_fraction(st_scale.mV[VY], aligned_st_scale.mV[VY], 12) &&
+ is_approx_equal_fraction(st_rot, aligned_st_rot, 14))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+private:
+ LLFace* mCenterFace;
+};
+
struct LLPanelFaceSendFunctor : public LLSelectedObjectFunctor
{
virtual bool apply(LLViewerObject* object)
@@ -370,8 +459,26 @@ struct LLPanelFaceSendFunctor : public LLSelectedObjectFunctor
void LLPanelFace::sendTextureInfo()
{
- LLPanelFaceSetTEFunctor setfunc(this);
- LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
+ if ((bool)childGetValue("checkbox planar align").asBoolean())
+ {
+ struct f1 : public LLSelectedTEGetFunctor<LLFace *>
+ {
+ LLFace* get(LLViewerObject* object, S32 te)
+ {
+ return (object->mDrawable) ? object->mDrawable->getFace(te): NULL;
+ }
+ } get_last_face_func;
+ LLFace* last_face;
+ LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&get_last_face_func, last_face);
+
+ LLPanelFaceSetAlignedTEFunctor setfunc(this, last_face);
+ LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
+ }
+ else
+ {
+ LLPanelFaceSetTEFunctor setfunc(this);
+ LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
+ }
LLPanelFaceSendFunctor sendfunc;
LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc);
@@ -497,6 +604,44 @@ void LLPanelFace::getState()
}
}
+
+ // planar align
+ bool align_planar = false;
+ bool identical_planar_aligned = false;
+ bool is_planar = false;
+ {
+ LLCheckBoxCtrl* cb_planar_align = getChild<LLCheckBoxCtrl>("checkbox planar align");
+ align_planar = (cb_planar_align && cb_planar_align->get());
+ struct f1 : public LLSelectedTEGetFunctor<bool>
+ {
+ bool get(LLViewerObject* object, S32 face)
+ {
+ return (object->getTE(face)->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR);
+ }
+ } func;
+
+ bool texgens_identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, is_planar );
+ bool enabled = (editable && texgens_identical && is_planar);
+ childSetValue("checkbox planar align", align_planar && enabled);
+ childSetEnabled("checkbox planar align", enabled);
+
+ if (align_planar && enabled)
+ {
+ struct f2 : public LLSelectedTEGetFunctor<LLFace *>
+ {
+ LLFace* get(LLViewerObject* object, S32 te)
+ {
+ return (object->mDrawable) ? object->mDrawable->getFace(te): NULL;
+ }
+ } get_te_face_func;
+ LLFace* last_face;
+ LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&get_te_face_func, last_face);
+ LLPanelFaceGetIsAlignedTEFunctor get_is_aligend_func(last_face);
+ // this will determine if the texture param controls are tentative:
+ identical_planar_aligned = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&get_is_aligend_func);
+ }
+ }
+
// Texture scale
{
F32 scale_s = 1.f;
@@ -508,6 +653,7 @@ void LLPanelFace::getState()
}
} func;
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, scale_s );
+ identical = align_planar ? identical_planar_aligned : identical;
getChild<LLUICtrl>("TexScaleU")->setValue(editable ? llabs(scale_s) : 0);
getChild<LLUICtrl>("TexScaleU")->setTentative(LLSD((BOOL)(!identical)));
getChildView("TexScaleU")->setEnabled(editable);
@@ -526,6 +672,7 @@ void LLPanelFace::getState()
}
} func;
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, scale_t );
+ identical = align_planar ? identical_planar_aligned : identical;
getChild<LLUICtrl>("TexScaleV")->setValue(llabs(editable ? llabs(scale_t) : 0));
getChild<LLUICtrl>("TexScaleV")->setTentative(LLSD((BOOL)(!identical)));
@@ -547,6 +694,7 @@ void LLPanelFace::getState()
}
} func;
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, offset_s );
+ identical = align_planar ? identical_planar_aligned : identical;
getChild<LLUICtrl>("TexOffsetU")->setValue(editable ? offset_s : 0);
getChild<LLUICtrl>("TexOffsetU")->setTentative(!identical);
getChildView("TexOffsetU")->setEnabled(editable);
@@ -562,6 +710,7 @@ void LLPanelFace::getState()
}
} func;
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, offset_t );
+ identical = align_planar ? identical_planar_aligned : identical;
getChild<LLUICtrl>("TexOffsetV")->setValue(editable ? offset_t : 0);
getChild<LLUICtrl>("TexOffsetV")->setTentative(!identical);
getChildView("TexOffsetV")->setEnabled(editable);
@@ -578,6 +727,7 @@ void LLPanelFace::getState()
}
} func;
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, rotation );
+ identical = align_planar ? identical_planar_aligned : identical;
getChild<LLUICtrl>("TexRot")->setValue(editable ? rotation * RAD_TO_DEG : 0);
getChild<LLUICtrl>("TexRot")->setTentative(!identical);
getChildView("TexRot")->setEnabled(editable);
@@ -993,3 +1143,11 @@ void LLPanelFace::setMediaType(const std::string& mime_type)
{
}
+// static
+void LLPanelFace::onCommitPlanarAlign(LLUICtrl* ctrl, void* userdata)
+{
+ LLPanelFace* self = (LLPanelFace*) userdata;
+ self->getState();
+ self->sendTextureInfo();
+}
+
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 94c354cf02..42be9b257f 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -85,6 +85,7 @@ protected:
static void onCommitShiny( LLUICtrl* ctrl, void* userdata);
static void onCommitFullbright( LLUICtrl* ctrl, void* userdata);
static void onCommitGlow( LLUICtrl* ctrl, void *userdata);
+ static void onCommitPlanarAlign( LLUICtrl* ctrl, void* userdata);
static void onClickApply(void*);
static void onClickAutoFix(void*);
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 43814ac652..ff15e3f08e 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -974,7 +974,28 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
)
{
// disable some commands for multi-selection. EXT-1757
- return root_folder_view && root_folder_view->getSelectedCount() == 1;
+ bool is_single_selection = root_folder_view && root_folder_view->getSelectedCount() == 1;
+ if (!is_single_selection)
+ {
+ return false;
+ }
+
+ if ("show_on_map" == command_name)
+ {
+ LLFolderViewItem* cur_item = root_folder_view->getCurSelectedItem();
+ if (!cur_item) return false;
+
+ LLViewerInventoryItem* inv_item = cur_item->getInventoryItem();
+ if (!inv_item) return false;
+
+ LLUUID asset_uuid = inv_item->getAssetUUID();
+ if (asset_uuid.isNull()) return false;
+
+ // Disable "Show on Map" if landmark loading is in progress.
+ return !gLandmarkList.isAssetInLoadedCallbackMap(asset_uuid);
+ }
+
+ return true;
}
else if ("rename" == command_name)
{
@@ -1099,7 +1120,8 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
if ("cut" == command_name)
{
- can_be_modified = root_folder->canCut();
+ // "Cut" disabled for folders. See EXT-8697.
+ can_be_modified = root_folder->canCut() && listenerp->getInventoryType() != LLInventoryType::IT_CATEGORY;
}
else if ("rename" == command_name)
{
@@ -1188,6 +1210,7 @@ void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
}
mShowOnMapBtn->setEnabled(TRUE);
+ mGearLandmarkMenu->setItemEnabled("show_on_map", TRUE);
}
void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 0308f5e632..4cf1df1655 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -44,7 +44,6 @@ const char* LLSLURL::SLURL_COM = "slurl.com";
// version is required also.
const char* LLSLURL::WWW_SLURL_COM = "www.slurl.com";
-const char* LLSLURL::SECONDLIFE_COM = "secondlife.com";
const char* LLSLURL::MAPS_SECONDLIFE_COM = "maps.secondlife.com";
const char* LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME = "x-grid-location-info";
const char* LLSLURL::SLURL_APP_PATH = "app";
@@ -183,15 +182,6 @@ LLSLURL::LLSLURL(const std::string& slurl)
(slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) ||
(slurl_uri.scheme() == LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME))
{
- // *HACK: ignore http://secondlife.com/ URLs so that we can use
- // http://secondlife.com/app/ redirect URLs
- // This is only necessary while the server returns Release Note
- // urls using this format rather that pointing to the wiki
- if ((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME ||
- slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) &&
- slurl_uri.hostName() == LLSLURL::SECONDLIFE_COM)
- return;
-
// We're dealing with either a Standalone style slurl or slurl.com slurl
if ((slurl_uri.hostName() == LLSLURL::SLURL_COM) ||
(slurl_uri.hostName() == LLSLURL::WWW_SLURL_COM) ||
@@ -202,6 +192,17 @@ LLSLURL::LLSLURL(const std::string& slurl)
}
else
{
+ // Don't try to match any old http://<host>/ URL as a SLurl.
+ // SLE SLurls will have the grid hostname in the URL, so only
+ // match http URLs if the hostname matches the grid hostname
+ // (or its a slurl.com or maps.secondlife.com URL).
+ if ((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME ||
+ slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) &&
+ slurl_uri.hostName() != LLGridManager::getInstance()->getGrid())
+ {
+ return;
+ }
+
// As it's a Standalone grid/open, we will always have a hostname, as Standalone/open style
// urls are properly formed, unlike the stinky maingrid style
mGrid = slurl_uri.hostName();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c275068028..daeace0ec5 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3383,8 +3383,21 @@ class LLSelfStandUp : public view_listener_t
bool enable_standup_self()
{
- bool new_value = isAgentAvatarValid() && gAgentAvatarp->isSitting();
- return new_value;
+ return isAgentAvatarValid() && gAgentAvatarp->isSitting();
+}
+
+class LLSelfSitDown : public view_listener_t
+ {
+ bool handleEvent(const LLSD& userdata)
+ {
+ gAgent.sitDown();
+ return true;
+ }
+ };
+
+bool enable_sitdown_self()
+{
+ return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying();
}
// Used from the login screen to aid in UI work on side tray
@@ -8100,11 +8113,13 @@ void initialize_menus()
// Admin top level
view_listener_t::addMenu(new LLAdminOnSaveState(), "Admin.OnSaveState");
- // Self pie menu
+ // Self context menu
view_listener_t::addMenu(new LLSelfStandUp(), "Self.StandUp");
+ enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
+ view_listener_t::addMenu(new LLSelfSitDown(), "Self.SitDown");
+ enable.add("Self.EnableSitDown", boost::bind(&enable_sitdown_self));
view_listener_t::addMenu(new LLSelfRemoveAllAttachments(), "Self.RemoveAllAttachments");
- enable.add("Self.EnableStandUp", boost::bind(&enable_standup_self));
view_listener_t::addMenu(new LLSelfEnableRemoveAllAttachments(), "Self.EnableRemoveAllAttachments");
// we don't use boost::bind directly to delay side tray construction
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 92c61ddefe..82bc084f68 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2183,7 +2183,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
std::string saved;
if(offline == IM_OFFLINE)
{
- saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
+ LLStringUtil::format_map_t args;
+ args["[LONG_TIMESTAMP]"] = formatted_time(timestamp);
+ saved = LLTrans::getString("Saved_message", args);
}
buffer = saved + message;
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 0f02de866b..b373be4382 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -20,7 +20,7 @@
<text name="start_location_text">
Hier anfangen:
</text>
- <combo_box name="start_location_combo" width="150">
+ <combo_box name="start_location_combo">
<combo_box.item label="Mein letzter Standort" name="MyLastLocation"/>
<combo_box.item label="Mein Zuhause" name="MyHome"/>
<combo_box.item label="&lt;Region eingeben&gt;" name="Typeregionname"/>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 514b0a501b..1d58e7a540 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2408,7 +2408,7 @@ even though the user gets a free copy.
name="label shininess"
left_pad="4"
text_readonly_color="LabelDisabledColor"
- top_pad="-36"
+ top_pad="-37"
width="90">
Shininess
</text>
@@ -2445,7 +2445,7 @@ even though the user gets a free copy.
left_pad="4"
name="label bumpiness"
text_readonly_color="LabelDisabledColor"
- top_pad="-36"
+ top_pad="-37"
width="90">
Bumpiness
</text>
@@ -2563,6 +2563,17 @@ even though the user gets a free copy.
top_delta="-4"
width="120" />
-->
+ <check_box
+ follows="top|left"
+ height="16"
+ initial_value="false"
+ label="Align planar faces"
+ layout="topleft"
+ left="17"
+ name="checkbox planar align"
+ tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping."
+ top_delta="26"
+ width="140" />
<text
type="string"
length="1"
@@ -2572,8 +2583,8 @@ even though the user gets a free copy.
left="10"
name="rpt"
text_readonly_color="LabelDisabledColor"
- top_pad="4"
- width="200">
+ top_pad="2"
+ width="140">
Repeats / Face
</text>
<spinner
@@ -2586,7 +2597,7 @@ even though the user gets a free copy.
left="20"
max_val="100"
name="TexScaleU"
- top_pad="6"
+ top_pad="5"
width="185" />
<check_box
height="19"
@@ -2696,7 +2707,7 @@ even though the user gets a free copy.
bg_alpha_color="DkGray"
name="Add_Media"
left="0"
- height="63"
+ height="47"
width="290">
<text
type="string"
@@ -2782,8 +2793,9 @@ even though the user gets a free copy.
label="Align"
label_selected="Align Media"
layout="topleft"
- right="-10"
+ right="-16"
name="button align"
+ top_delta="-4"
tool_tip="Align media texture (must load first)"
width="80" />
</panel>
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 e2348375d5..84e81397be 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -23,7 +23,7 @@
<menu_item_call.on_enable
function="Self.EnableStandUp" />
</menu_item_call-->
- <menu_item_call
+ <menu_item_call
enabled="false"
label="Edit"
layout="topleft"
@@ -46,6 +46,17 @@
<menu_item_separator
layout="topleft" />
+ <menu_item_call
+ label="Sit Down"
+ layout="topleft"
+ name="Sit Down Here">
+ <menu_item_call.on_click
+ function="Self.SitDown"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableSitDown" />
+ </menu_item_call>
+
<menu_item_call
label="Stand Up"
layout="topleft"
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 d5b993152a..9059745f46 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -2,7 +2,17 @@
<context_menu
layout="topleft"
name="Self Pie">
- <menu_item_call
+ <menu_item_call
+ label="Sit Down"
+ layout="topleft"
+ name="Sit Down Here">
+ <menu_item_call.on_click
+ function="Self.SitDown"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableSitDown" />
+ </menu_item_call>
+ <menu_item_call
label="Stand Up"
layout="topleft"
name="Stand Up">
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index ea18e02ca1..30c2cde552 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -6,6 +6,16 @@
visible="false"
name="Gear Menu">
<menu_item_call
+ label="Sit Down"
+ enabled="true"
+ name="sit_down_here">
+ <menu_item_call.on_click
+ function="Self.SitDown"
+ parameter="" />
+ <menu_item_call.on_visible
+ function="Self.EnableSitDown" />
+ </menu_item_call>
+ <menu_item_call
label="Stand Up"
enabled="true"
name="stand_up">
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 9fac296e26..751dc0bf3e 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -64,6 +64,7 @@
parameter="UseDebugMenus" />
</menu_item_check>
<menu
+ create_jump_keys="true"
visible="false"
create_jump_keys="true"
label="Debug"
@@ -102,6 +103,7 @@
</menu_item_call>
-->
<menu
+ create_jump_keys="true"
label="UI Tests"
name="UI Tests"
tear_off="true">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 0b85074eb6..c79a484ef6 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -4,6 +4,7 @@
follows="left|top|right"
name="Main Menu">
<menu
+ create_jump_keys="true"
label="Me"
name="Me"
tear_off="true">
@@ -94,6 +95,7 @@
parameter="voice_effect" />
</menu_item_check>
<menu
+ create_jump_keys="true"
label="My Status"
name="Status"
tear_off="true">
@@ -138,6 +140,7 @@
</menu_item_call>
</menu>
<menu
+ create_jump_keys="true"
label="Communicate"
name="Communicate"
tear_off="true">
@@ -188,6 +191,7 @@
</menu_item_call>
</menu>
<menu
+ create_jump_keys="true"
label="World"
name="World"
tear_off="true">
@@ -901,6 +905,7 @@
</menu>
</menu>
<menu
+ create_jump_keys="true"
label="Help"
name="Help"
tear_off="true">
@@ -947,6 +952,7 @@
</menu_item_call>
</menu>
<menu
+ create_jump_keys="true"
label="Advanced"
name="Advanced"
tear_off="true"
@@ -1451,6 +1457,7 @@
<menu_item_separator/>
<menu
+ create_jump_keys="true"
label="Shortcuts"
name="Shortcuts"
tear_off="true"
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 0499873fb0..6b136495d2 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -130,7 +130,7 @@ control_name="LoginLocation"
max_chars="128"
top_pad="0"
name="start_location_combo"
- width="135">
+ width="170">
<combo_box.item
label="My last location"
name="MyLastLocation"
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index cf174da2f0..e6714af943 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -295,7 +295,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
auto_resize="true"
default_tab_group="3"
height="450"
- min_height="53"
+ min_height="73"
name="add_wearables_panel"
width="313"
tab_group="2"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 676bef2d0b..cf040b10c7 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3005,6 +3005,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="IM_default_text_label">Click here to instant message.</string>
<string name="IM_to_label">To</string>
<string name="IM_moderator_label">(Moderator)</string>
+ <string name="Saved_message">(Saved [LONG_TIMESTAMP])</string>
<!-- voice calls -->
<string name="answered_call">Your call has been answered</string>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 1b3e1c1c90..b3ab2f4f90 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -20,7 +20,7 @@
<text name="start_location_text">
Lieu de départ :
</text>
- <combo_box name="start_location_combo" width="152">
+ <combo_box name="start_location_combo">
<combo_box.item label="Dernier emplacement" name="MyLastLocation"/>
<combo_box.item label="Domicile" name="MyHome"/>
<combo_box.item label="&lt;Saisir le nom de la région&gt;" name="Typeregionname"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 47d7a88b4c..808f19a16d 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -20,7 +20,7 @@
<text name="start_location_text">
開始地点:
</text>
- <combo_box name="start_location_combo" width="160">
+ <combo_box name="start_location_combo">
<combo_box.item label="最後にログアウトした場所" name="MyLastLocation"/>
<combo_box.item label="ホーム" name="MyHome"/>
<combo_box.item label="<地域名を入力>" name="Typeregionname"/>
diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp
index b5adb217fd..40425a5caf 100644
--- a/indra/newview/tests/llslurl_test.cpp
+++ b/indra/newview/tests/llslurl_test.cpp
@@ -150,6 +150,7 @@ namespace tut
ensure_equals(" slurl, region + coords", slurl.getSLURLString(),
"http://maps.secondlife.com/secondlife/my%20region/1/2/3");
+ LLGridManager::getInstance()->setGridChoice("my.grid.com");
slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3");
ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
ensure_equals("grid slurl, region + coords", slurl.getSLURLString(),
@@ -206,6 +207,7 @@ namespace tut
ensure_equals("region" , "myregion", slurl.getRegion());
ensure_equals("grid4", "util.aditi.lindenlab.com", slurl.getGrid());
+ LLGridManager::getInstance()->setGridChoice("my.grid.com");
slurl = LLSLURL("https://my.grid.com/app/foo/bar?12345");
ensure_equals("app", slurl.getType(), LLSLURL::APP);
ensure_equals("appcmd", slurl.getAppCmd(), "foo");
@@ -246,6 +248,7 @@ namespace tut
template<> template<>
void slurlTestObject::test<3>()
{
+ LLGridManager::getInstance()->setGridChoice("my.grid.com");
LLSLURL slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3");
ensure_equals("login string", slurl.getLoginString(), "uri:my region&amp;1&amp;2&amp;3");
ensure_equals("location string", slurl.getLocationString(), "my region/1/2/3");
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index e963bcc9f7..08ba8c13b1 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -930,10 +930,10 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libopenal.so", "libopenal.so.1")
self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
try:
- self.path("libkdu_v42R.so", "libkdu.so")
+ self.path("libkdu.so")
pass
except:
- print "Skipping libkdu_v42R.so - not found"
+ print "Skipping libkdu.so - not found"
pass
try:
self.path("libfmod-3.75.so")
diff --git a/install.xml b/install.xml
index 3a9dc5f6d1..a47a732d56 100644
--- a/install.xml
+++ b/install.xml
@@ -797,9 +797,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
- <string>b379063f5f03374f85620e87ce48e497</string>
+ <string>b1f15bbabb68445e55ce23a2aeaca598</string>
<key>url</key>
- <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/indra_private-2.1.1-linux-20100820.tar.bz2</uri>
+ <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/indra_private-2.1.1-linux-20100826.tar.bz2</uri>
</map>
<key>windows</key>
<map>
diff --git a/viewer-hg-convert.shamap b/viewer-hg-convert.shamap
index b90d98d428..29f98ed8cf 100644
--- a/viewer-hg-convert.shamap
+++ b/viewer-hg-convert.shamap
@@ -13891,3 +13891,542 @@ c267182dfcb36f6c0b99b67969a3122c45004f15 520ccbb610dfdeea531d2c894756d6286702a78
07710c4679b285ffab80e83c02c85084aeead0df 2bc5c6bc5ab38bdd6ed182b29d1cd03301de7b05
35138c9bfae8e85f930e8779aab0483cb8eac623 d32e9b00a5a67db432c162e6beaab23bc50d6936
35138c9bfae8e85f930e8779aab0483cb8eac623 a6250fa92374d84353e5d80d38bafc0a315a9d71
+5c5ececdd9165d61df64ff8a7cd1ae5d518ba0ed 66bfab0dbb41ba31d535d2ce412d9f7a88c5942e
+a2a5725545a9deb75cc8b612f624358537443330 97ab2604669a6004a1b73d8fe34efa74bd91e81c
+08423454fc4dbf812770d69675badf2f5c89d43d 03c49960563fa19b919becf2602a229e7cf0fcc5
+0b240c3ba999888f964722fee88e70f33e133eab 4d325d4f59e6213d0d85a4f57bfc34801164cc02
+6ea755725c27d76ce1a161ab8262cc59247625a6 8f614d6d4b4a1862df8e0e470e03a7a0b915502b
+7d52d255301639c593b89bd31cfb5f83e72b8c33 07cf6ece7fc735f39a181b88a7dd6e3b1d6e4daa
+371195160372e391c309f6ac1acaf9d0a0a64f93 fc2c560bfc1b6239043a0e56c630889c885c4916
+07089a32bf7c97818b72f87af0f4619420148721 d775dfaf0293308b0a6c95dec63645982d58080a
+7202954103df308dcce7389a626c5615c6a99788 cfd317aa69385f5c50deb00762e517b2fef1d12b
+271ffe664bd2f74e8b5fa2a888edfabe95d1a6c8 801ae59617ee7e1da11a6beb8b0136186e5e693f
+064acd6d3ddf76fb076cf3213906697886800663 ca385c19f1a10e1e9691567ce9d44bcc6d6b3f03
+1890c874ab4876f5407ff589998993ed00cdb059 2858a1b0015137c30da2a5c656ffc0f5e14b9200
+a3e2f33837a7167e1c431fa8e77b35c00808070a 0553ced8b5a0c433ba077c2595315da0cdbbd17d
+3451d53f603add8dcdb6e7a5c084b8725f868e05 507861dac9a4f74b9dedb3b9730e65288dbd7d68
+23885c2527483ccece854095af32498aa5676131 3fe02760c682eef4783ec7c63f63f8f78a0781b2
+c1dc021ae5213233669bb114e8f25bde8d49e8d2 0f02aabb07ac0b63d2552ad75b23199e8043027c
+fdd823276070994ce9546f32ee7387ebeaf7e6ac cfdd65f867be38028944e20f87fb17921ec389ae
+160f8fa616afc2ee686d2ac12e7bf6ddc5379b60 0f7245306ff27c5f036f62471972cc92d42897e2
+1045a61877be4023b40971d942199e1862cdbfb3 36f9b2b6ec061a62ed2a1795563b4bd9903b3bd5
+712c197687c917a5b7bb13b4c9021a455c7425e4 33eeae831cdb68a9552448116780bd21ef95d848
+262a807129e69426e9feac023e634209c817ff64 1c9652fa26a2735f3b7f741169dcb224a9d60faa
+08105fadb71a4cf1a1ed27996f1c9ae18aff754f c16a903b9f32db89aa580ff95baa896620267a1e
+bc2226d86238fc3d04c5a784ceb283ddc1a2d2d3 d11f06558fb3413ed0f044ad1210a2167c3e9c98
+1be7627d95537a843aff4ae0da7d401cc5eb09b6 82d80d2e287926a7b3927ad4cdf822491ac5f292
+2527f4f1621958ee07a5452b210f180e0efe1246 f1a37dc84bfd03c6924e14ed61344dd1d7af2c64
+a9cb81d2a1bb2e0b0b904d1ce22f15aa11d9304d f5c6d4b47e22c804c15d355c1f8084e35c2fa265
+c3a397ebc129c924ff61960c6f0257d3e15f8b02 911ff09337a37348a2a3bc7465482d0955522e75
+dedc484cd0a853bf9c6cd081663108a314859624 2a6e1a7aceced726c68ea2f8b8cd82a3af708072
+6f178d14b411498dcf4aaa1345ca7947182b7753 44eb56b02a8f22fa26d29dabe01a8a14488e1e0e
+54f3510f13b672e1b7cb05ffd71a0c84eaa1f20e bc9a8165f582daa38f7b275b322e6013f368a4f5
+5be7af3d024b33e0ea91f9c2b34f3d4501b5b327 1a852727b8a31a27e72b5964f5bbbf04f5a17215
+64f74b638affde4b12e10bfb62d9ae077b276499 dd041cb6b84bbfd8b8daa69eda2e0d866f9d356c
+aac7a129f76b81f3f329a5ad8dc02d77a9963abe 4ba1f7c837d3e394e22ede6ddeddf38b72b5afb0
+80e9acc23515bcb4c093b94c57bfc080101fb77b 53d36cbc5df209d27d89065d6841cc0856ac673c
+d641ff792d91ddc136fd54c3d73ae9cd10bf2666 c8b3053e72c6b6069a3cc45646fd635740196111
+26a4d505971d128629e9e90b3e0c61badf4299a1 4a29f35ed2215cd029e7511773fcb603e00f0071
+91afc47fe4b97e8883cf10e00b2e91d3d73ec991 db3d121cea5eb21648fc2a8a8da7ac59b3711f14
+4f407b6db81f3e362f0f489cd4ba5b6bfac2a018 7ce66a87da35b91d6bd7a17ab4d43e24d828b0c3
+6fc45df1cdf333f1961414216257a6b209ddc981 09ce018e32b247afaab99d24bd1abbf00388dd37
+1bd45be73d6dc2f0bdbad962c2266d0e82f9f540 8d48ff810f46a68ff157949464dc827bfb8c114c
+8b9b9d5930cb8783790e02318e291027dec1fdb6 d087595ed4c9a912acc7942ce1324ed1fcb6a538
+bd1265f3e43f9bed9a14f065a29712172c325072 93933cfc8a004a16a5eb9f39c9ef5ca769929080
+d9718b616761d0a30018fed104134be724ccabe3 26c9805fea1adc733d5c71290d811486f506b4e3
+1e5af8092bacae80b9bf44c2edb73d5eb65fae0e f3c7e3fb15257e77949562bb6929490319f92d5c
+796d9749e40316ad3d0d9cee8f6921bd925aa766 0986d9abc7ba15a830d340ff6123931e1470015f
+b0a7b75e2720ea724d58ceaea218d38ade1382ce dcbcdd44f064772f41d87f8fe1f4156998226b34
+9c5e7652be42956726013bc332eec3053db1f509 c5acec256d84177a29aa652c8cf69b868af8dbdf
+070cd06ce26c3155229e03a0d44638b168f1bae4 d307025224ed251d6d3e26d322204a75e510e76b
+5942b26b9dfa348c7e59bdcbf072054cf223117a 69b9711df065d4868766ba283fb62ce909f192a1
+c7d1d670121afdf76f8287b62f1faa029b03126d 6916fdddee476a23d33f519ae582185cf1e907e4
+39263ded059d783eae6c2a98b0416afd09e3384c d43661300701213502a5a832c95a3e4bc66e1e5e
+ece3ae004bfd5a69de56d1cdc1bc18cdb629b726 bb285fda0475893e44874eaf37dbac62bad8fe93
+7dac97bbe561323498ddb1d9024498ca4485233b 5548911aa82d30eb980872a33b9fe6a5aae96741
+1770b24a05ed54a7fa494ff8a12cd2e308cf2989 355b35c2b3e2bc69dd86a7c53920cf93c1c50eac
+3ba6621f0fd10daf4e3f3244ec6d83c6b40a2ab4 bf10b61752f7db17d86c0834fc6108f586bf2e2c
+0d585f5f00cafd75f7b839632aa2c73b87e8a8fd 152704ba6f55e1bf62fdd93589dc1dbc5b4e2e3e
+1d45aa7a46674839e6bfebf8ddb1189416470977 442a3e52a7e1468173a548ff73ca03260dcf9d9a
+98652a5b7dd9a4c16256bd510141c5b00b574af0 9126422f87aa3e49e7556955af036f015e29fecf
+49a8c196e8a2aca4b24709d1948990f75b448909 8610a1948a8f639a882700a5a56e638bfdce1bfa
+c494f1110ec8212300c532aac570ca38e0354e08 9878ae16dd1c4df7cbbdd28dcd7b42abf0c86002
+8ed97e82ede90244c9b6d290b922185328b5e252 fd59aa574dd4634f9579dacb47823c1ee5b61c20
+18ada4642cfa110b42273b9c1ae26a3fa72e45aa 140b35158f62ad0cf119e06f2dc3a1d23e8c1c88
+b1656ed1e92cd651d943af80291e27ba9de45d77 02d8d4c951dc3b70248e0bc10c0b4ad109a03d5d
+92818c0f4916b1f16602a396e697f0d8de47ac63 a260b388689d9f5dbc321d04725675ae8abe49f1
+b67cf042fdb9a61dca5f54ed5632c4678e1cfa2c f9af5ba22a49e358bcbe4384f830dc14436f355d
+e1e4b68b2730b215bdc549a032c303d9c8f46510 e23a2156cbcee35989715c5555bed06713c29a96
+48f108599240c372b17af1324364a1ff3698f810 9a20e73f9895562f7b6461f4a48ba2bcf6fa915a
+a27ce616d045df8ef43d4f2479260bf629a73355 fb88396417264c75f4dc7bbe26d55f5ac404f006
+ba582c06809fd6922f7bd753b3ea5e7f8e5f11a9 383871a7f970c0c2a12a6e307e4752bab0d893c2
+11c7ffd26c7e4f2e6309cd164d55e852ae671f04 720df5b82cd396d9d84ea03a93fce66e44a06bb1
+9bfe19c63b517c603c9ee3ec8a5669b6c1ce4af9 8f22b03cdbd3f841c95f84ebc42d56cfa6befa49
+588977a0caeac8f67d8ff6991473bce1fded2646 29f8c1e0f40401c45c179510dde06e891f52c07f
+579ab56ab7e9c673ec0003aa6bd5be9f96bd7301 739486b83c5a3a67727a2ef5fb62f223b526f949
+b509b85889e58e5b13e6029e0c47b7e9cb76c85f 25ff5daed19851a9bac03267b1f6e6f6bf197731
+09baec3ce7c1c27f2557b78cc8ddfb24cf32add5 dd623b1a79f7f0a4a5a7d584c3ee76df184a4f44
+8086c9699c188b609fc08c664db5c050f4b87ea4 61af04dfda03c9ae256d041a752320ff6b596372
+c382e0fab7e66b813ccbe0998f8a6ee86fc4a60b 5fa3e7b9fda29fbc8588e7282363aad8eee0cfbd
+ea9c2733fbf6d22166c213cfaeb1800a30ce90e9 a73724008d6db9e242330ec049143579741d6761
+298b1322a6646a8630b4656a44d1e9e4bdab7d61 7aea8f2008544a169280578fce0107280bd4b1de
+67fa4273bff04278ec9b3e25d0991f8790a2ddc5 2e536e3e594307b6feffb7fcd583ac83c5f2d73e
+78dddb3a1dd300fb727c1855f729442c25d69d93 cc7d5e69827f7f952fc60ca6b5af8f69c11bc67d
+36ea57fc1c67f4e806d35fb15d39f33b400510a6 8277dba809eb5bd7163158ed5b1cb62b41da7ee9
+4e01b259fdd4429fe5e2efe14c3a1266714e0c88 e46a6e6c8176a4f7ff110c244e91596e3efdf567
+5d5e820de3ef131a895b89519753734124f3a74c f95b48b08f5ec2fea03c325a9f26bd21ef20d069
+8d006f07bf22da25db071efaea0804eddb600970 b2d72673aa6c8cbac1c565340994b514ec4cc37d
+788c48f49ba1d9c352be86b1434b458ab66ecd42 41807eb23a357a99c05c2662c02982c38afe1250
+24ced57037101a42fd47d5e53a2ce3e36c6b15a1 d90e0f2abd1fbe193bc8e59b0ac393f4a8a76aed
+99a474b2e33288073af1db395968f3536f8941f5 f2f3a215935bc3a46440ba973c86b13d7295352e
+307ec4b73895fb7d1007f98bf2e5eae731e5c16e 3ca3d3675a55599a68d3bd44a09f8bec14ab8cff
+3195c3a33fe71f43c86c695c01e7ec268a20f54d 0813e932df6243ed0cee958cf37de1fc60b9a518
+9b5c88fea509da6c82ee3ada5aedcf4cd4ab5502 f0825f9b0db7a3080d9cd1ba95b9a2873e14a56c
+0f7e446130a89330e33e0f61edd7e3a4d5f5777a 8f670f3c95706e473316e3929fa07ed123f50572
+df35aedac04be171a7ec10df58636c6bd4fca1ad 0b39f9fcdeb1f8c1a389b079b26dbda208e55479
+d8def9fdd6577ffba808c41b8ecc8f13fa219773 41b1a0393cd5589ff3111af1352378b7dd53d07c
+b16e3e1e5af804db3a817d066f252037dc634a43 b10da9095387d7307ea930f42d104cea881c9b62
+0a39b7f7a08a593afa65aa3f0d88bf66653906b7 7404c0f2c5b6daad3388a928c1e67b75bc513d6c
+c638606d3723fc375139a6c7bac102c830d76cb5 d791304c05565d5fa27fdc47c08635b2ac3b776b
+0e1df71eef189c849d25d82f94bea50a8d08d5ce aac9d5f0238f2c9867ccbde3b71fdc48f0bf5737
+08cd58f0ccc2eb6b5a52081421eaf384c5af06a0 aeb37e55b2c675b8270863711050366561af3d3d
+211aeed4e8f4c9107fd1ed31ea29f08fb1db3bfd c5407844273842488de997b3d3b814e91f1a08ef
+c245b7d852e0f16700bb0ed5c8c92c385935e343 184bf2c188c2444db3fbdf7c09c47a8539e80640
+afa69e8d559a8960fddaee1bb7fdf392e22afa56 f6b44442b32bbe6e25364374ef6aec02d5b16ee7
+5f69724b57df17dbc91ddf14c352e6f8d0f252ce fb25e84af925740394d9a750aeedce0e368bcaf6
+0b6510af17871f151f0bf6a580cf2e7143daa161 962c68da6afc4ae461db63a2a0cc3c67f82960a1
+e86aaf84bf89f1f06f53d21121da907fcef3c168 d47433444112361cf36cdd5b707dee2c4b7fe1b2
+be3899299950211ef9d99b9928e4a69d7ef812b6 7b57d38a9cb17b8b4daa08983308655f79807b49
+e1973f1e374c17a0c4b017e73fc0aa557745fbd4 e23ddad349b6276b39d84d180e0b3597239117f5
+17f4e34f11798eaf77eb33c2375bc06d6e225323 5671c09da75614034528cd18c2b1fa85df596b36
+e644cd567b1161f567876414f67ba45579823f9d 6724449336146ab10baeb1bf441e866fdba94e48
+c002214bcf3af7319199b946b1acd7bb3099c825 abb902ffced26b87f90432bd19ad7e356e6a2069
+491edf15255a1045942751eb65d588a554ff5e0f d450f6647879dc48fd39fe8bbd7b0c380771203a
+e0d28526c117ed483ab2b144bc321925b0dc89e6 cefe1c5f441fd52e2e95df9f8fae695347aea0c1
+e01102fd80903b485c5f3013f72ee34a5d83bb1c 71052e2a41de6ac285e6b0bf1be37b9f83f1bcb1
+18edc4858b28d1126709b1736b95c7afdcb680c8 d53e8fbedf4167e51ab23e88a480140ee28672e9
+c4553aaee0ed4b431867e8a31229e0d4ac600e91 6ceb29625a47627f5f375686490953a6a85965ff
+f95d7cab0fe6daa5fe78f80b6aa16ace6fd98f12 38b081ada4ed0b548cbfb6f12dce7d358fe429b0
+a38b6aee5af99b5f69b82fc6c7ff55e65fa3b45e f65c5827fdad4ec963fb2f9b84157d3bd69aef7d
+7cf3979243401e21c60a01015608d4f09438ed8d 7b61cbb611f25f4291ee5dd91f95532cd76b6d17
+12dd548be46577b74a8e13a39c3e4859fa5a0566 ff9aadff2281b8380b0fa150a0aeb29d57ceccf3
+5789043409bbb90b4950f6b4ae2816cf143e3ad6 35058f073c1f213156bc7d8e7d4e568882a79a0b
+3a59c2729b37a7e35f9380f1d99f0c416d5d1563 2a0dcda815a88afcf74cc1adb9030970fbd043cf
+d06f35fd8c7991183687486193f121b2c504fd1f 99cae3106b625e538993a4a883e1cd85f4012014
+cba9bf2cf5194da14105cc28e792f908ef672864 f71615bb527d8eb95748f60aa28cf8facc83f9d2
+6a68dd0222f940edb6c7785339f88e8e1c6caa0b 60282aec053e2993a496d12c3a70c419a92b7037
+38b1bf7b4f3d94e30d4180ce50eb63e582b9993e d6c4049d4b895a9c034695bd42484df745db83ce
+9a2d88bd2141d388a2e022ef993a78a1420dbe90 12bbb2f87143501e8483a2742be61dc249abd883
+ede2c9f28dd5f684ce288c7b86b16a6b4a4de4a2 dd08632a2331f32b14b80e7825f87799771fa8a5
+706b8df74b3f1185c629b2746648c22f1eb493b8 851dcd14ec99fe88aa373d42f29bcc22e51a0409
+08dc2f58ab784ff76c7920be017e026773d0d100 9344e5f8ae5533e6eb790cc35c7d9e046c8fdeb8
+37e9e67533d7dd65dac910f19b65f777803b3e70 3af4a96e0d6e49c295ff3417e522b1c6ee6e23d4
+04c21166cb45b2ce437ef2dadc78f2305812ec17 f0914de01cc2473df856cea4206e020819216f75
+8499ff40544cecef0edd07934f18baef10af2a2c c233f7ffbacedc74a8933203e119e314482989cf
+9874486f6e056333b1584d390c94f129ce06564a d3d9cb1f4f2fe61af970deb2d7a2b8142e928972
+bd146cb3d857cd628e55e9a92e8d954966a426e4 8316ca7eaec2e7bac565846b49d3075a539f1070
+0b8a8fda5b4f9dfef4b1d6a45fb9113a3fc245c6 32d4d57b3873f41357045112f3f561d0595cc4db
+9a20ba9d3b719fdac1809d4c2946ff3973892789 d5eb635ffa88ef2bde7fb829bdd61fc38bd8582e
+6b5030faf67e5c7590ee6e182602587b1b244f93 576835275497df1c3090d3954949c4a868411022
+e833e7a7121cfa53f6ce45821cce62b360bcea34 e80f3f02d252f972b560db8edbb4b903d7d986cb
+b4fa63a2d907e3c4da775f0d49a3223e88cb1242 d590977ad2eea48c4a74f2afae282c4169b1ad68
+a3bdc91c91b4546e2ade3bb98e0a7f37a198913d aaadecd751332c1e3dee6f66809bd54a4acbce19
+6101755e247c315a14fbd4e41bee057013e099a1 80fc06d522246fb2972e8ac72270fd1813855730
+3c0c0203e7caadc1a3664be2ce861dfd2c98ecc2 00366e122b9b9ac11298ba6f030ede2b620b2039
+dcf3380bf77989c85ebd4146a6e57ef0ce2d2647 2f746808e602d9699563722668835378120440b1
+afe09ef1253675133ee467962633217d9032eaec 1e254e694b81e384cd38909a2f73edca8b9c0ad4
+1cf51e021a62ce22fa37b073979d4d0ee7979281 62943f9f59620bd1b0652cbbb3e63fd593c0c07b
+d4f35361f93d025f2c665bd646a3d76deaebd142 0c7d388fe6522c13fbf31e77da06b6a1ab654233
+47a02f4d6d2715ac797faab85b5eb41cfe99d358 95c665ac8ca9878ff7b5d49ee92b93417be1ff01
+b379d162769e3e6093cf4486dafe14cc589ad693 1ce9ef6b3e7b22de24907b8e8764555941321655
+8badb2274c90d36ecbb0fabdc5a1e8254f102471 8a7f94564b283f31b42af614dfe23d2778abb891
+649103c5f76a84b6b469f866acbd40d76998e1a9 40f6bdf174b5d40ec3c0a41355410fd89bbb319d
+334fc6eba31c9ae731ae4415ba83cf86039eea57 e997bcbdebe457317e60a53b63a27f43da31da02
+d1536931b880dc6709bcbd2abb52d20f1180034c 18af2c7d36549a60adc6ac32aa7d8f4b607b9e7e
+dfe2bf1d14865041730250d9bbf486406736eabf 742c9d8291ff578c3b652515e835a8397e607c8c
+51186a5b40063e7dad6388a99ddaddc6ab89d0bd 9dfbab4714659816a2693e1e1c1d5b83b58e4375
+194106f7443ebac4cdeffe6ce4d883b3f5465111 4366bc2e0603fc0f9d1a3e95bf864b90d321fcaa
+778a5a83ef4e5e70652fbc00f2e1f8375e587afc 65f17fe1430f22b9ef280d1b881a00a7aa419757
+36680184ec50ecf5fff92ee33db711b7512d923a 49b55024b1f7a4cc776d1160b2d1fc95560a0c9a
+57e136beedee9122dbbf46a1d91f6514f058b829 892fccc4064d67e42f48a05ab789eb7b8a131130
+0aaf4b4676f27560cc436d0ff74b7d812a1e6662 a890b4c57ef8f89834de5e2e41da41bc342f9fd0
+7371669945e7f690c9f2f22b04dee0b0b3cf70a6 21fa726e54d490058c975214dd1773699c8ff284
+3196941d73f122f5dbe42aa0ffdc28a2470ea089 c923fb8dae0f6ef4157a2c2a2fa898110ca0505e
+f37fa9b31c9b82b0ca1f13c5b18c024c63bc7598 19eef5d0208e75f2550b63047edce075d4cbe1a1
+6f25e5a4f0e0d7bbe1ed3e14e7da4d371e290c67 42e6a2db92f56af099e3dbdcb5bfe3b4c501aa94
+7afdf5c80c20934ad0c228f41406b3c5df06cdd8 b731415c92d88089a0fe990e57d5f2337f440993
+69e3791e134fc080564d46a71251f15fb1934070 1b249d6f75edcd8ab6647623f017a034d8254c24
+f2365628646e7703ef47e54ea5c3ab877afc465a 9b5c7790d4119991edf02e1e050349e4c0d5bacd
+bde80560117295f6b3e61f9b47f3bdea826945ca c6e688ac453304d2201551c4940b8d52c390fa9e
+42a31ea27be742c452a73e88dda918ea66947a07 c72cb035110ca6007860db68c74c5d0cee4af213
+1d89b85c797bff6ac251999056d54cf46b6c869e bca9dd535f15a4f2232f4b27d82a3cd18e740490
+610181b56d3c39852c7432fefa76ad517fc942fb 4ea0f7b0d13981e6bba59dbf9c54ab492a0832ef
+d58b75f4d0412ba33f1daac52572ab34ad6cbcb2 3fcd22f3552e181871fce5bac6099d34cc843b74
+21fa62ef7038ddb1539e2eba3690e236f4a866c8 2577139c8809ea6cd6c31ea0e3aa770a2b654879
+053ff9dea22d3507ac08c7d671f5f9dceceab0fb baffe5b3c466248beb827452fe978f5cbe427c42
+495a8d490c861c78ddbc68877e4ee593a8770be2 7fb0274c98368fb73bcb0851ddc8a814e9d982a3
+9028be7fec186159dc733b225ed558410aaf03de 0cfe91f9c83c165c25973f6f07c26a629e0f87de
+4b6b655ef6aaf8192b81358a759ba6b02dbcd1df 6117cb9dcefeddaeaca6d2fc3c5fa4e1c39323d9
+1772f8d2575bd717794dfb3624508d5324dbd823 3d65b0698399489ce1e9256a95721755f77532aa
+ea82fcd4589d3cae4e6ef1b6ba826ea2e4b4e846 3823f14efbb9894829b2ff1de6e7c57e0fea1f2c
+e17fb66322f0cf51fc19e17111b38e82d78c50d6 57f355054415ca89296b5bc207bdd0db5c0f9d67
+bf541483d9074c18c6d4f4bd19caf0de82013cbf 369872fa9c5386d2bdc2a37e29355183a7f64b01
+15cac4881bf11eba172556d63416a5d462e5d6d4 f6e9805ebad1c03f66444193a38676cc543e7ab9
+b94be036dcce0c8324d966846dfd2475349a5eda 9bdc7dca3dcab0dcbee0639e8ffeef02ac2559ea
+482aec5c620497a4c242babd135f1898bba271b3 dee119d7a5156c8198d21f595de1ed225aafc647
+9e23eb15550830b5efe1012c8169339931ec5f32 9d45e31e4e39e3736da22ea917623fb2b36f393f
+c336ae03e4b5dc45dcb05e2e9bcf7a7e62f3f6b3 83606bbdc084c962229c671fc2b13d1091e5ff29
+dd081111855a722ccba3f1513a18c54fd875aa1c df8c61ac8ee3e9be12fa7650b9d69a7de2c2f565
+569666ad2d30d83cab0eec1eb206f7e91e89d398 1dd0fe381c0abaf8c434c78052b329d5aa0517dc
+3df270968da72fc7f7143cf778a2148abcf507f6 1253c128500080e53968786bc1c17ce74c62ceda
+edf4f38c846a1e895cdb839bc5c044fe1761d770 a4fe5db599acb138f97aa1b0794ee5e5b44af74d
+4ecbc3c25fc27871654b705fafc7d74ac77a65c2 cd3f5c873321f2cb3d5c73c7eee58d854ef9068c
+1ed421424048a5ae8045ebc1d2b853c3a98b5493 dc9d3795d39ce5f527f434573c93e3a6e3f4e1d7
+ead7b61a6b95fdfb556ffbacdbfef3eaf0d4a168 9d396223cb9f90ae4721ef135ac42462268140a7
+3620b7690b1de428e8bada86124566157ea674a5 43913bc3230819d2f37ee479a5d6899f6397346c
+d7cba3b0a2f4fcb2b729a0422ff70ba730c8b92b 1ae13dc1fed06ac5889ff4b03f7aad90deeb8305
+9524268a86761b4bd5a421af3dae48850d93ca5e 9e3bb1f2469cbb66857b3325f7c833b76c58e9ab
+7aaea473895e09869e5ed26d85be21c122d56788 fa7326e4b22f85c5bb3e68ca474098f6db7dabc4
+fc8ad4823407d51a64464e0d8cdaaade1573a0cc a533f10e2fb8d270fc34e1fa43a82efd2f3f2052
+f805a49439909faee9153212444c1dafce92df7d 1112bb17dad3fef743bd7a1d57ac043bca8ee4d2
+3932458625bd1c4f62a6c88dcef4dadce5b00339 cca85f45d1766be0bf9528f4cb9ef6a62cb1a900
+a260368d321c4c5ad69a965d08c032025be639b0 a6906e163c1bb3426b7ff2621541b715e51ee5e6
+d913eb3b9c4538bda5837732a21cb9413b6a6c60 3a129414a10cb712b62f073f8674be3a7ac40c52
+e1687576d22105db59e68c67ab5f856957d1865d a7cf5992ffabeb2f49532613967abc83d872ac2d
+5fb718e8abbfb59a9fa9c0222a555aee964f4b6c 50530f5c170d602713736b2ed95c356e3320d521
+bc1cf9fc03d2cea7e4ac55df76cb2eb7cd550ef8 1d1cf9052ecdf957721c5bc9d87f63f414059fbc
+d3163a313db90a1699151c8ffd7f2afd66abcf37 9f23cfcf4eecc74142a40a14fdbea93a127acb98
+c63d01d56d0e27db3fa130dd6bb4eec08f2ccfee 532b5d15329c99f380a2ee1c7faf9075d40658b0
+0f112fbae4954a6ebec53306c085ac57b4a91331 e4d4c51515d7a662543a1c3028ed82d685ccb376
+2db202cd64345bd67d757ab8c3175fdbd38a6cc2 f38a76f983d7c6a4c3949ebc5cf5ac2b6ff96ddc
+fafcbd5220c0696f6951c5ce77815d883957ac39 3d097a3b8f52702dda4b754ff92f9b6fedc6a070
+372fb87d85f7d78c6ff285b4789bd868cb000c97 89d61d346af18a20a5049a0fa019624943cbcb06
+8d8239a10bdf8001317553202717277334022b21 51bc8c8bd9bbb3e3f8ceb0a70c2eda8eca3bcf05
+336b16d21b54fbb57d5c6eb0db923df73d16e176 273d510a0a8e823d59810fb8612c648ec7096be0
+997456b101841697cd1b5bb22955ff9e314405f5 7454dfdd5013b216ab1231420a077ce1f87f386c
+8a75298a6965eb35721e63420e7703272d172671 6ff6bed0bdd0d37ffe6594b44d415f3a920dc135
+7143feebabd71312547d647a32a341c07c0f3121 e2276257cf5204c143aa191eeb17c84c719dc2ea
+3f95c322795af28d9b8f8730b9479a8925042039 e735c5ac250ecf0baef7e6988e95ce0d51c070bb
+038a7eab2205921584fed72a75c59d3739f120e4 ad8feaf3c843bdf43fcd344afdf0073c833724ff
+934f757ed10b41413e6b064739cda7146023068e 8c9a849f090287dfd7a0a14ffa4be32187b3950a
+7c0f51ca82fd21389cb7cf833887c63dda79b2fc 335bd0b75c15f898d06e6e1af616293f5f06e96a
+276fdc7b9cfa8a7913f17e0c60a4603ba3181cf8 4e1d1585e8cf218b04a065b6abd834f9d4a586ef
+1c763473a1b5b63c0bbd74afb7befc5522b69d17 91dbf65421f54310b2b64e80761400891c6df89b
+eeff72dbd3f8a43c78070f01cb4054564b3e6aa0 effe24eaf9dfeee69e26048711c174a388b1f1c8
+9ff0560f60433ee3d194006ae0ae36fd6dd1ccfe ae6732309415db5ee7d6cc61d7b7fa9893ed69ea
+28d69f6c7f787230c3569ca07d5c1ad338aeb6a6 69120ea81f5d17f4969263f42c7f0822c00d086b
+2d797b9506cda9cc17310bcaed23b7d27071b941 3d8664a7d2a82e48cff2c168a6e4650075180e62
+bd73296081f8b98c8cce93694e58de8fa4e0452c 5ac16b98a63d250957e69a05ea149b1232ada130
+11bf20602885c3d2d42d8a7f7361d2005a708b5c 7836cc8b93be35d387f8b95b1fb4cfd5f224ff53
+3c79fdb428663a03116f9ce02353e4c41adc1718 ced954b2463d6108db7ba9af4cc2b1806c56dac3
+802b67382e31c31118494570a15e8c1b4ca3749e 65c10fda5684325f147eada48af47afa4eec1848
+e67bf3d79e4341be1ab6eb9a26ab669005736de7 acf8080bdd9b80fe3109a781a063c9257a31ebc6
+dfeef23df3a5eb6d31ff46c17e8ae5bb09ca79fe 475eab0c6e5e296655d7c88fce76b6673feafdee
+2fedbfb21c2e1946d53bd0a1da51ddef77544005 9f9b8a0a763e9b5938835c497a7eb6644ae6b72e
+3daaa4e168b8cd1cb858214f1e42a1c4d95af731 76ef916dff07f053c8592649bef852ef1055b971
+34b7003a5e4a4e8da612d9d62a8cb314d9c56bcb fb2819f74d19363adb5a28c356ca25098ec37196
+cc6c02d43135b77cfb6c11474145248e72fac05b ffb78950143e9beb0f07e3f4bee7e5cb27df2033
+f86ab98adc3d7fd4eaa61d1a4685c5d8a1efdbab 8572c3d700c39de103ae9f96e5dd1417e774eb50
+20c04f6504943d5cd8d45261a69d06cd3b81c56b fa6bd431d8348ab4a2e70eee60d01226f2ade31b
+d70dae59dc5a54322f736e0f1167908d80b8c2bc a835f03814bcf9fc3f8dd8ab14e5db691054257f
+ceee5d13f032c0735c3290cfe7d80dc6dbda0c58 a835f03814bcf9fc3f8dd8ab14e5db691054257f
+624e1473ad34771d003637c8877df9c7a6165d23 ea093af353febe94b8cf48cc19619701e10ab640
+b90515a211a961867d0e46cd46a0aadd4c6963cb ae1e8aae00d878f67fe45fd4fab825b115810606
+a548e35be52c3f668116116e6b628a0cadb11468 ae1e8aae00d878f67fe45fd4fab825b115810606
+f75d1322a1ebf7b541565c2e550f80ef6954c273 4b86718d69137a00ffe2eb22ca9b70f7f6c06468
+87d4633d20b776ac4524145305ba379f7e738610 8a893783ca1ec8b194325d959633e27633f1c6df
+1601b5295e1bc57d7250b693993323ad7d0b3214 8a893783ca1ec8b194325d959633e27633f1c6df
+7f21a122567530338b31d57eb2e83041157797bf 987a9dd5015b7abea3b6ac89bf4f5829cffca14f
+a4e992a26a6734570524a37b581fd1641da3f6a6 681d431ee0080ed4653680c82d749cd2e354290a
+e4e1d3f4fd990a118b9add32c1f3304e1aca4077 e2caa48b35afc85a89b5f1769053ca3c9a51ad5d
+8c05621974f473cc8b68278eb750e045a83942fa 0c799fe0a011467c5216f5b09f62ddee26a6f0e7
+db8ee62ca3519c1488aee09a9e02c9f73d2cbc85 b86eb563a75614a3ec58912ad28207865d631acb
+a3f472952a16d9cbcfc16681447920bde04a6ed2 79b48fd354244c840934eab857defead20011961
+74b62646437e5ead313f5afcc9269aedbe0048be 2750d230b6d3e4a461883db2d0fb03bee98a58f3
+c446b746447692bcfdd65e6b0131b51030e228cd f8df324df0763d2ed51ce40a0760e2a5472c8d12
+9b08c210edcfb3fe36890bfc6171c8a6d4aaa5c9 1e5b43fdf43b85f806d1a6cc93b1fddff8ed3b7d
+3e482e6e28769c3f2f4e5587f0fe4c1b33949a1d d4e3bd2e370fb730236979343f054dc3881cf868
+904809c542f4517806ba794d85f31bbddde2782b d4e3bd2e370fb730236979343f054dc3881cf868
+47df1b3fd94ee76165231899179630770fce72b0 737994fe21b23cf9a0e3c7f541bc43ef16312b2b
+9eb2b70f60540dd159dceb39850bb5a518ffaf19 efe99d0926806a1617b9b3ebf18e4b1cf06b4c6a
+b1c6890eeb989a2cf83d8107aceb4c09e385371c efe99d0926806a1617b9b3ebf18e4b1cf06b4c6a
+0bc66c6c1e73f9f52d244f450d6e9c86de74ba8c 681b1a44b6e90ecd754aba809a76fba2f606946c
+f73b3197fe8ef329ad8a3b88c617361ed126448a b64eaf5e5991a93bf7078d81d3424df8ae5a146c
+00aabe555ea6631277a80781176a33041168f2a5 c7b4cea3ff1de56872a01a1ef72c9c1e258acc73
+34a314297b7f7b3102790088cd867076efa71ec2 822cb176f7e9faf258ef317b8029ecfff326c843
+f1d2229164bbab5c10509913ea392da694a7cd5a 5b30c371718c17d598e84bd040672ab9e129872c
+15f8294dbd52f36cc90fa0f9c85ddb23192ac09a 8d0a189d0d345457e5ff170f000a8e7e16e76fb3
+bb98be9decdf7c43f6dfe1b117d2c67f86345850 5b30c371718c17d598e84bd040672ab9e129872c
+ed019e2607a9040e4e18fffc5f8a13956d8d3722 8d0a189d0d345457e5ff170f000a8e7e16e76fb3
+d90064c9f1ba8c2e8f12e7976035faf8673ae8a5 8b83aa1fcb7bd052713627a46a654005751393e3
+cdc2f8348087e25ed4e2fe0191f5b0019c26a544 8b83aa1fcb7bd052713627a46a654005751393e3
+49dc96bf6cfa6455b99ac5523980df195b8d87c8 8b83aa1fcb7bd052713627a46a654005751393e3
+144df58602c078063cd05d4b4cb7857634db5116 4ab2d0b484e7ec22e13e3f98498c8477fff1570c
+e4f164f0409af48d958c7c85d869aef51d02adc3 4ab2d0b484e7ec22e13e3f98498c8477fff1570c
+d23189d0c67c8236c10750db126b0bef0a9cb50c d34a287f441bdc13f4bcdc00264bccce36cdd665
+5e93b5c5b0d27291e566eeb4ff51edf7386f107a 4985d6a110a1b1a02dd298d4fa309d4410b9976f
+917f8aaed631de48b04cd58608ecf842c9fecdee 0833cb3134257eb203462b4ab9ac8585f98f78b0
+0bcd630eec0af1b93ada21b105ab86fd3195b19b 80f69b2cc7c181f0fcdbf4a9aebec1fa7f811907
+96fff66678ed221a048180cae965419e4fb88385 7f0f4b58b4954085ea80eaa00120779a81479e2c
+3d3ac980fc387e0b4004e8a41bfe7279e4365b87 f130bf0b129b8dc484db22f53db7714e63fac5c1
+e2d0e01fa54f37de3dec3390c82d462c634821db 34984eabb9009e9065add99d98fe2c34ce109d79
+30c46bfa9a50c03ce5d3e614a037b828bde52ff9 6676bd5e8ffb652c302b31f09a0b9e1138666c25
+013dfc16d6ce62aef324499404130c76d5d613ed 30ee90948b63ba6c58e97274ec309f16c9bdfb22
+b369662a4efb68be33e4f0d40e036755e9251e58 b4a06542a9c80970d5d2f35b9269da63a90ce911
+99143cfe3caa98ac07fd05c12fc1105c8f2cc24a e097fd3f7ec58b4ea4544af0c261fd331aca0aac
+cd1e49987aca33ea855927e803ac1eb799ec25c2 a1334903915531f6ea25966382cab06106cddf5b
+aba0c2a6c7e1d1f2499d8a345a1fb73271c8d62c 14cfcbd39b39e7d63969cd2bc694f93a57b0ed77
+2f9e7eb5deaa058718080e70cbdcc19df78a7d1b 4cd29a255848fa5e60024b5d8d68d082bf72860a
+8df381d89e7bd89cc3e6b79cde8fcdfb7c503363 14b7a7cce78f4a5249b0514ee7afc306c6788a93
+1a0b445d095058e40f699d4234827bbba7baeca4 7d6dc4137087a7e3f9d1d3c63b8b2538a26d34f6
+478908e4a5dbbb32ae4d69e2e9ec3f0cc7469c97 878cdae6fb396b995ecf5457793cc1cecff74a6d
+602f64fcb8049d8a1a7db86408ab3d408440b342 51f2a2182d36b21135c74e116449b215c86f4da5
+da0a34c638afb2c2b9b04ce5dd93b4d0dd9c4a5a ce7752b08c9225e8c319836a08ae5d23b4534571
+10bf9966681da0a648baa9329f604ec43f09bf82 07924579dc9ff8bc9987baeca0144ffb6f280699
+28c4eea7bf0e4b47a836d7aea59047851c40701c 116d8c04916dcd8d53de4b8b5911a79aef4b966c
+01a4e51fdeb44cec209b3b089e9f42ef1729f350 ce7752b08c9225e8c319836a08ae5d23b4534571
+541e28cd37875dbb0879525072ee4e4f79c6155b 167ad3960b77f87935ddda6ea0a551752d91c370
+6a12325c1b6b2aec32c3a0e7f8dbbe6b3316db8b 01b0a19860324cea67964a8624433af422c0b626
+ab023b8df2b29a0ba121f12a7a2f126c8db5dff7 504760e3b35629287ddb1c4e6fd19d21a9a4a5a8
+787e2fb7df2d998bcc4e5260d4fd22bd52b7be18 ae64c453ab8c94ac5b44d746b8ef72d3ec2fc0fc
+2553f8b29fae6bb9b83d506e5f6d741180ed1819 1dd47ee15af3516591ede7037cb12ad35832f876
+42fde10ac0f971384a18afb6cefd317389bad461 34792399db3f0d70e95311b9d6f61ee4d31b9cec
+63c4e4aa3b6a35f2d7c4c8434f3873a4d6ec70de 0b60da166f9a0aa867d1dabc558e10a3b225b0eb
+70c1bb674d7e8aef1123d898d01ad823299f4379 c3d47e8a8f1f7f27c7ec538011ec75fbc2c04bc0
+c6a9cc5028ca63dbdc85f21d38e02f64fc996bc0 302db9b20713d9edb468cf26a464219c387a4637
+f7331b5749ed0e239e6ec1252f4553576dc5855a d15f0f88c243e9e34a870faf9eeb0497b13bde0a
+ac638fef69a9afc5c3baf4f0796483dd86fe723e c0b2d37e46c1ccaeb84e111958b28f4bd755127f
+d4a9b50475c8d57a5616cb8efc7b7d700e7ad46e c0b2d37e46c1ccaeb84e111958b28f4bd755127f
+0209ded0df164a65380565cb974ba7b6e6d9f3b7 0cc8c01b31363c04edbacf419843d6c8917f9002
+21e6f0751403d078a76753ddd960dcb1e27c8495 e12d7df770ffbbe9d99bcd0315d1103f7fa28e29
+76bd528035064374446e44af80c71e3016d8d5d1 c6af322c1539d3f718a408725dc1891db415777e
+b1af318cb0ccf1401cf9a86d4854a4503a82260c 3df5051737197142bcdf10ddba56e6e5e0ef6231
+55c0ac7ddab297d009896c4d7d18f74b266e3177 0b85d3c482ad3930676e17f31b5bb30a511c3516
+ef717196763d20a49b5052b0e820e6ed796bb93f 151fd0bd161ebc49338f1c6f68a26d5e2e063d99
+e910539f2f90b70a4718dfd76e7abea441483273 151fd0bd161ebc49338f1c6f68a26d5e2e063d99
+3971e72f8859f3abf19bab10425a09a2b44eec8d 91537be71c5eafbd9f2c43b440cea52abcc225df
+548977cd0c950daad7ed463bc5182ce483976b0e 151fd0bd161ebc49338f1c6f68a26d5e2e063d99
+cc9f9b999d1f819bebc99b9a69576f6de0a8d63a 3fb41ab68b3a2f011680be694a166ef80651e87e
+ef0e94697ec258acc364e1bd67c5fa6b947806bc 91537be71c5eafbd9f2c43b440cea52abcc225df
+dcc45918454b2ade6d9e4acb875725451a37ee82 54ff890a3b5e178b59c0714de88fdf6b0fd1b1d6
+2823d3cd515bc6d768afa2ee3295a53dc78a5ee8 7d02b2cbdf9ae8586b67d7d6b11682d01fd2c6b3
+ecb23d20a9de2bc07e4c8a242183cf062e7c3b8b 92f9c3f4449d6c2312298de62354e20e0115fda4
+29f0c3cf96216006acf309518fb186482a073fa6 92f9c3f4449d6c2312298de62354e20e0115fda4
+07c001727af5e44420ccdd97b7f43376e7c27200 750a52afd817776d587ddf7d016f52bcfb70287d
+1d0d2dd586ab0ac69abf7f9a8d6c00477f85f366 750a52afd817776d587ddf7d016f52bcfb70287d
+0db1c6cb292d4d2faa08fd213127aa0435015ce4 a35fe5e070595c63a8b79ed59e18fdf90619c264
+d616619f563e2af2c3ffad8e7a33a5d029427bcb f7e809c9dcf581adcbb866a7e27f5ddaa05af2fd
+ebd1cec6f138300365e9c480981af45ed25be976 28d8f997062654b45cfec70a41098180fbad4a5a
+f84652107d6c440380745854e4cd45fc3e48c3e6 185bf00dfb7bcf20c7c4dd43029eebdb60f78b13
+b5457b9613fe9b3ab7d3fe8998bd9f8c4e14d682 83c60ba0a4f994c3f7f1573c4462c2cc09cf5117
+0de02c9ec598ccd413b1b85622002e9b2168018d 1c6958c3f658c630019e53175888530a8a98bc57
+10f02c59761cb1d566604e04724d42343e2ddf17 6b3c85c24924065e78f2ed9163e490380f93965c
+0def2820c00c42ff630169f7b37aaa48a15b187c f7e809c9dcf581adcbb866a7e27f5ddaa05af2fd
+8b8cfc69c022fa295007f818c693d1f406894a3f 9abb88dd3f2e541ff34b7130fb02569061183a54
+5b5cc4a8642ddb5f309d01d7f95dca6474001159 4adc9bac2be1668b665d9ec37b15df7487e352fa
+f62c347bb9addda4f4d1882e2364a955a22afb32 78a7646374fe89cd05034ec69cb05152d5f18333
+b1ba14f9725a67ee5c4418ad5ff0a005838d7721 1f3c7a664fb727cb0220cf572cd106a6d2ef80ad
+889f5f2ece3df5663e5e64acddc828fd4ea1f60d 660b709a528c2809ebc9c4506707f84c19726b36
+cf6cf9344aadb69756b76e7f284d4679556f3319 5e744b1f734fa7862e59c8852fdeec632d81b6e5
+6e8606d4b350947ed87a37e8984d597522f0370a 5e744b1f734fa7862e59c8852fdeec632d81b6e5
+babb41195f70f374f8816ecfe6bd59f8f7eccc1e 337d0092d9406bd2b93ea7108513f7d199d45bb5
+8573b48f05c8e1f05ee2e036c2f0715ad5608673 42600ae6c98671c673926eca2fe8b1dad1acc62b
+509b502018f31c344ef5ea4e8f093c82b074c1b8 47f6458850b827282d250d665bcdb51210613390
+6ac2959df48ee440a0677cf735110e3540bab285 0ad7ec87331f128166ffd0b70db70a9ebac771f0
+ead29f1366c3b7155d286f2639f2d8d0190b453e 44abffb397573128fd12ab72e03674098ada0d1b
+7f3e91e29471efc93755bda3003ed12d14ef8a24 86746a951ab9487f058e26cf714bfac71d96df8c
+446bda52c32e2f6d2cf1a60988a739465f6c8576 ab7772ea3c4fdd4f8cb28dd26c2d3ad560c135b4
+269f91445d1ec0e4437b868bc65c7d06a9833f1d 2e7d5443efff3048d463dd91959a1101f27ec9b3
+4306d66df940339e5fbdfee21e2bacf7f0203c87 62c977180863c4b8f16158c2d25b27c2ef00c2ab
+60519de8d194d117df73941037e49f6a55cf6978 7687cd9891ff596c88540786c5df917de2a0a4f2
+a79a7985c87cf4d4e1eab2a5a7be23473eb74cb6 503021167c705d3bf06bb7eda1b7e4535c8462bd
+7ecff5c2e0fbbb6a8e5c04040ddcced0b31d7b00 f82a7eb4127000554810d22616d2aaf673271598
+7ceaef6a240f0971aa106a0f6fc59fc08ec18b9e 51da18b5e7a0a981c47bbb2eb146bd0c4893540e
+b919780567e9dc2f871e75a1095abbb0b3f49040 2febc35ff0c768e77115d605a81209d0e46c099b
+7d4cbdf01e822c8e7deeaf2300727f5a7af73275 0ceff9065d5daf08ac8047b3ab3aef28b429cf6f
+88f75e33832467da599bdb2ad5d068ffd959a092 51da18b5e7a0a981c47bbb2eb146bd0c4893540e
+55e8b3855bc913aa88ec55e555b1e0491589ad90 acf6425ffc002f2f3e56ff8f8906850fbafbf56c
+cea873378e22f332ef6b002790ccdb4225e1348f d4fe9898feacef9847e4a0fd6c5f7c3381800d8a
+02f07dd139d766478b351d00018ce49c3346cfcf e5b584ad46f1919e889b970d8507ddcd89e77ccc
+10d619eae33ee18daaea848695c11bcf67e45195 a7de392ddeff1fee276d4b7c82547053dfed4d07
+e787bf8ad115249d346f2552a03924fce35e4326 9be3d0de3da10e6e97343417767367a98a574da6
+5e9a077df6125835e893578b9904195bc64b1117 ce8a1cb20f6cd2c8525c9e49fabfc4f9be430070
+b2847d0963bdb5b4016fe1798a4322d3f84ff376 710c486d6be25d55cf52bd433e91e676b57b8a86
+f8ef3e55bfbbad2a34972f925adf193d71c2b326 77037bd2892f64358c2826cc2d1a6282f4d296fb
+741b3a355e81536d36687062e27e041229beb630 7e92790d78cb2632ef0992161668e71b7d32bb4a
+b8251fb85d66beb23b2e890ff3208310f588e2c4 c55c24a16cda7bfb1f3480fb46bdaa5acb1d980f
+cbf66ab7bc0fab5c4985d56c5a3e431afd12bd6b f6f99da2a9cb3f74d2867080985065d948c5337f
+a6537781700d0179318aab401b6078566a7a6ed6 5508050eee79df1a0a45f887b66745b90641222d
+3c99501485e04fd5604011d42f5d27b6640c718d 513b5d7cff7a37986684171b9db1aaf6dd68b0e5
+262d2b88dd0b5787137220def659e6c0236b2b0c cb31c25450566fb8d6bde05616b2c57653833033
+c2a3aea06ac54be2578d0873d5d7cbc30570bf93 40d2a6549d49de2983043276a6c2d7dbd3ba1c72
+8e34aa2fe3357d05e6df7b5db587bc727bdc263a 4b88e810bae34a48c4134f82d3e0422e08078ba4
+79cf5549077f4ab53b9d2b09090513bfdebd7693 4a0ce32a5a82891b5b9cb18dec2e10d41020bdad
+53aacb305d5c71ba1dd72cd4cf94738b54b5b48a 6963bff5b92f1d66147489e45109acc2ce0b2b20
+2c0e7faebd3ad47f922ba68fc9b7569a9cddcb70 7358f113974f5bc99c11ef3b35b04ff55e5eaf0a
+21288da813cde8780f5594a86d18a1832660e79f 52be24e74cb0221ecf8b7fd4bd0702b3c27d0325
+661ab870a0ac658e1d637ad730c8c4aa848e7738 cd603122a85d6eadbde6c87a3deff71c2a3d59ce
+4debaca33b41009f58d90f35e90374efaff330ef 47e2b28fafb0ca6c27e7acd0ac1b7fb25a3522a1
+629d52590de23120c658ed425f5f23fee2e4c5f7 c0164233fdb1615f4a59d0ff9833432ed7b3be6d
+6c5dcffad1d57c0b01d5ea89f5bbd929cad0381c 79d01dc9bbe2a067a601e64b733a45d8e0d5eb97
+32ff7e88da92a18a12e00dddf2b509d0c420a8b0 62e9a8a6e811e1a3a27e716a0aa74a4979e3392b
+1e37cdbef38abafa91d172cc835efdeeb204b715 77ee4f85a6c949e2fcd9fc813f6646be1655ec49
+d84cccbed112d9b53fc13dcf14ffc5cdc27630d3 300d3011ef69c46b8dd9087d0b1a8324e1375db6
+fd0d0a7b8eb45e6bb8b253f791dc29ded1fd27d0 ef3584fa7467fda102354a613a424c8ab274e16d
+117d99160683208d2fe9d03263f8b2328b09c872 0aa6ead58b39e1967ffbec97ddcab76d73715554
+98ebbe2bbae83675478aabad54ed5dd637efd876 e1bc442dc95585762bcf4c9786121bd8ba429876
+16f1697699615b526a2a66545f1504714aa707b6 3b6a62557531cc286c50a70c410d21b0f9da2188
+e9d6526dd76f4b8917989dea873ed8b15fa96d81 a1fced514a0cde1f67202387b5c4a473f80c2f1a
+2ed45dc039386bf4d1cf909b6e6a9965ec9f7424 b78a9c14bf69c2095ed80bd20ddd237c8254ae10
+7ade7c63bd78b498f7f7e96afa739a900af3432b 46c7b36793c9cf1e88e2b640d45d057d10e97b70
+915b5f98ab7106cf8ea452a966de6ddf4b18b7b5 f195aaef7e759cd531f7c87351b64382aed9174b
+cd7b26593ee1501a849cf0a3c84fc3ac97a00ad9 3b704b1b36f4722575e3378a7ef29fb0750ccf33
+8b779147696f9957f4317887cb465b86eaf965c2 d000753adf19a9da2eec7a25663705a698c4efe5
+ce5b1e9de361a1e486c502a62a543dbdc42a38f2 e741f630ee4fea1c48d6eaeb46a41222e12dd590
+95d31777466bf60d82361f179c4995ad56a6ece6 28f52b3d2e3d56cb8a97de9be1039f1b03e21f25
+0fd59a0e5634495ffca23f6f7bd9ea6e198c07c4 12c209e46c0d194e1de360131d8c8b285c785e45
+b409c74f5435034cab3677a76eb796406d10052f dda38c3df87c71066cd04c83a4e97ac28ef067b2
+b873a3087aae760785cda9cd1666a3f90b8e9931 d8ed01e11ebd6cf20845de167b32526eeedd01c6
+075978c15314a66699afb6a1c6d5ca9e3326d35a 361b295255b2860d303fd3e9e2ba78bfc3b4deb1
+80c9e173e37930eba713bd631c8fd55cae48f10d 96718051b0b68522be980eb8dd072c7c71738f87
+9abec4ba873cac94c9394ab71d37416fa7479aa3 867704926a0651f10fa1a4a8711325bb6e187055
+49f577dd95d592ec2a8d268d438e034fe5b5bd4f c80ae8904645af82771e4abc7cb818e08405e647
+48a0ab1a6a48198e6f418b2522f04a31a676f5e2 bf52742368c9141340d061aae14cfbff9178a2aa
+986dc1f15bc31c1f72677a2ffae7290c729d9bb1 8f1754d49d6f33a9bbe0c2f2d230d351188863eb
+cf848ea595d9457501f3142ed18267593d00447e 67faf2ffdbd5d3215a13fbf60621b757a690ea8c
+7e459733948f4e49507276df3bcef535d6994d08 da61766d40c1f0dd3b374b81f8765e6dd0e6dfa6
+3f8fb2bed75cfa4e962e13c3a25fcbac39031089 64c5d70a37694e21ca2aa746bc67cc6375bc9a6e
+bc52ea817eaf781b0992ab19ec9b223f91cdd58f 89d3c8bbc122dff9ff057c54d78060ec58182760
+29a134b1936fface0a4875b1f3608bec9288a77d 2743124ba4ec46e862c15f57d5f57fc681d4c05a
+92fd90bd795a18dd6b85e257a3f3de618fd1236d 75641ffd74a153b1dcd7f954a7e0cf7ab4cffd18
+77cc9dbc639ab839d0f9cb144abd20fc0defa50b d15f0cdd434afd38612da4c4b62ff8ee1d8133c1
+20802f9ab6b69760e2e543d7c4eb9f339f78efa4 663cfa5ef2c4dc13c22fc64c5e97de2a207150c3
+ee45c7c252681ff4444bd521200a6ac5febe9d9c 8a4ee67a519122e46bad7e5c2aa06c2c81a47474
+3b4e317dac43174922c8e32a1b7a5bfca438ee9a 6e575c62d2b8bdc3bfaad0ed8809f9fb2ec4fff5
+3aedf19df38454b3b5b56994ccbc7f2e164c226e d8e9ac1a77304f04144f0773675cc584ddb8071a
+efeaee80cc93da038df59ea89079ff148334a17a d8e9ac1a77304f04144f0773675cc584ddb8071a
+e79736fb3ca4d60c0d76249780c1e3c28d412741 399130221cfc789722268c7c63027bfda4be2dec
+94c6c66b0c5911e31944f754fb8087e33986cf17 399130221cfc789722268c7c63027bfda4be2dec
+fb7f4d6fb35ae0c1db608d3c4395befc8dcfcc91 f356344e9076ac7898222f3f8da6accb40c333a4
+609febc12fcfa89c38303c6e493b7d47609b253e 3bc38a50f36cbfccef4c7741659b742c4451fe57
+b31cfeaa78c036d70cea9b653ad702cfeaa8ffa0 8c898fe4407c5f70a4186619df5a8cad87dc7086
+fc414570c9f8d59d4fddce24ca35519c564e4f2c 399130221cfc789722268c7c63027bfda4be2dec
+e073660d4d98f42310f19767894d52093282b133 c6c659b890643b637f41b0f32d3164749d37d783
+6bb5c0b334f9f45a50ca7f379a81f4d756501761 8c898fe4407c5f70a4186619df5a8cad87dc7086
+2b2a13e3383a49fb562f8ba980d07f844e87f9da 6f3399d48f6c88cfc2082286f2806a83e080afcd
+04fc6252f417a4f57c738e4bbbe6f9cb5b509820 38de1292825e0cd5e1d04b6da6e128df155fd828
+cb2ecabea423cb572da19158ff744946e0f8a00c 0cc52f3610e122f2f0ad342c90e64175e8b18c30
+2fb7055dc7a1d4ab0a6b136e643045df45b37a18 80c47006ed9df6117273fa201aa8576a363a7767
+bcd2233fb456033983cbf31f789b850eccbda8fb 452c2201ad495ad862c42bccc7ee7b6c1bf38129
+4b5616619c8c49564f95bfa9508755eca308fdf4 ac07c94732a4b9b651ec1afdcbc836f36ea6222c
+ccfcc17cedf6587b8c51a2df7b505f668b91733e c6c185fffd798db7698eeab25eff5b7b9f5c7096
+a60bdab92cfbebb31912f20dc416b492155360e8 793b67ba2476e7c69b90759859e2c834ffa7ef36
+d1e6fbe666570157b0043aa85052a61808a10f9c 2d614d1db40137add49f4810b34b6bf8a8199007
+e1e225cd1debd7b546c998c05623e43ace8755b0 c5c13d305993cfc79c19b8cd10018c6be9a02b14
+768a87bde2dd5836b6c3102e29b114930148c867 1d4b3099ef26ab587c7fa1424de3a5261bad91eb
+ff2ca1974f91fce24bead30e097ccb14c199f501 a72986c69a84dd8bbb2e816f41594d09094e0077
+9a0d5509de1f6adb6638c0d6b2d328b812861149 9558e4a3307a828e416cdb7a83e8df91a8a7c7d5
+5ab3bea6bd2f7afdec9000fd1ad07a3930c90017 0070d48afbc9a33e3671b8c504e3bb257e9f1027
+13c77a962e494fd8e53463003a6326f21867dc5d b9a66df6018da3d226ce1927c5a1237a5c83c402
+14c0ef02b60f6b757d2655a02ba3562c712701ec 2286c8ce1f0d11e37bc2f422d8a1141abfb1dee3
+b593c868061c8a27afc81ab47b4464333458854b 99a6c121b1fab8d619e4aa461d5842bf05e9c20d
+2237a314ea2035ad84e27606d31a9d8d89a2e852 8ce15d32a6c961f149a04564653467567080742c
+84a9b0dc0dc342020cb5f8aad4b3bb27e6cfe54c a079ff1e5101d35e5e9121b6195fc7e45fff10be
+a61f16432aca3b2c61fe25c62577ec7c767f52e6 d2b7c0a93d36ec4fd5a0ed6995548c9afc5081dc
+5a1938ee06e0e25725601d63dd11eeb50f002d39 c61e1102b4c038c0106996922d475fb1e656cd19
+bb238447d0a48f8920941031cf3c20671529fe28 d159dc34064f38c391afe5422332e9b1a0cd0990
+456245cf2d42e2c5b2ecd506fe63b90077159780 c7706c3afd0b2250de94023601a1c18855185bee
+caef46a3ff91430c1fe40135a040339c1c0af4ad 11171572dbcb020bf986b9fabcea691e11212052
+f603b9d510e1e2a2eb6822ad0e4d88639be57fe8 8238f9a6e48024ceffa65b39bfddf883f6df920a
+f55241f4ac9bb79654b2414b12011c4071e4c047 4cf6634aa839c34e4bea0fb32c9ce11b5d8bfb98
+aad271c813a2da9f534c83503154f366fc07c4d7 96ee127b50dae0c58093541d43f4de6c84e65dfd
+4ecae2701c796dd261e4ed4058f9c5bc65f312c5 aea858a1ce32d588efbb476dd3b26e3ee82c3bf7
+494326d89c966d832e1cc7ecdd6add8e28ccacd5 aea858a1ce32d588efbb476dd3b26e3ee82c3bf7
+11122e1fc5cf981d712b59c37101cde107cc00d2 84d4fa5bfb681f036db78c0b716fdc25f5173538
+0a4e00b26cc516e8678ad7084a00546bb886b6a0 0238de47db9606560f72a89e1623649293251686
+a9c6503c6b27fe267e09de4b49e2bc4a99756160 7c1c392ca1725520d283aa17eee03a5e84cb9ebc
+c6dba3442febb2bf7f43295a7cbde0e268e6ea3c 30c0848cace8d33e17ac3d6df8f1d460ce0e36ce
+18afdf2ff8a277cb73da7a40d6261f8526a6e0a3 7c1c392ca1725520d283aa17eee03a5e84cb9ebc
+1712d2057a9f35092d0857c975c689abe3a71e55 a46dc3270e606968ca02f74844596e7dc2b2122b
+7a839d9c9732984d77f411f7671b20ae848a7186 a0e1429341c65d149f7cf1f686a0fec65227ddbd
+f2ae6cb669e79c060459cbab1d9f2717f16fa527 858c7fe07d3b0785849c92feee46956e8d53beb4
+590fb90646deff979eca2d3476fb537ead158b57 973d67828aa210d4dbf84a13906d6f82021e2a68
+f215e77d9fe8f620fc29f3d2c15dd0ebb3a1a3a0 d18581a5f0cea0678fc02636ecf1c30c7a7d671b
+48747c8890670fe47bed0a72ad9bde3ef0500161 6548aa06e7a9843ec8d591beb327af8c7e5d5d3f
+500050bd86168caae0f78867308808d59bbe01e9 2645476df0b1fb42bd74274f33bebccae1a2ca5f
+cf62b95f4961dd8335063ce9d4bcd121a1ed5604 e2a7a573697e79f799c357c51c4c977756b1ca5c
+bf55323b1d8640190a3f2a6747546286d6a905d5 633a050b3e67fb30104e2de0d99f6b0c9d322956
+005405a7687c2464c8095101e24fbb4eaec748f2 069012ca5b16accc46516294d71c894e5f28eda1
+60b527e8e2dc2e264830150cd6fe586bafb40278 ab0fbe1f093120ce827ce3200577a1ece96df466
+eb5ed016d3dd6b503837a4d228cba26212cb4e6e e8b14e5a78c3a15f629d174723b666f2f1ebb3fa
+2d69536576731329c2748530e8ac156a9b1db6b4 6a1cdabd33311050fd39d1fe1dfcb23e36dd1bb0
+59f88bc08b92050706e9e666fe6dbf2cab7dfa53 6e3b2e13906ba8ff22d3c8490b02d518adb2c907
+70395a799fd1411ea7aeccbdedf2eca6964c7cb2 6e3b2e13906ba8ff22d3c8490b02d518adb2c907
+ef160381948b448c2e691031c33051f5bd2943ea 6e3b2e13906ba8ff22d3c8490b02d518adb2c907
+fd46494f8acb7873e6b32f0a7b55b49d5c5f5a50 6e3b2e13906ba8ff22d3c8490b02d518adb2c907
+ce77c2087cec2a1b85f922013e34f82d545dc2c0 8a906e581c989838b696e500411d27d7a54f8d6a
+ffcc49e25af8b9988350804c2efeca4a9aff0469 bb38ff1a763738609e1b3cada6d15fa61e5e84b9
+2b4a8ff5ef7c8669171195d6051e04bea16872b2 bb38ff1a763738609e1b3cada6d15fa61e5e84b9
+c833ad59f80a5cbbd5ec95c51b24a3eec4dfdb4f 08f6d1ab5da29675da93c9638184910f5e4a3e1d
+88e9170e4412a957b9022a3ed6382a4d4ee0428e b3f9041e389f4e9698268d87fd10d1fc9f471f2a
+6ee7ca7cf60b1dd0ba5e2338b4841dc7ac69d259 09a7024d094d0626b8983921bad79f070af45b51
+b57ef42975d69b964b448e2341028f21f8391911 b3f9041e389f4e9698268d87fd10d1fc9f471f2a
+a779078f6a61c30579fde56a8270ca03fe0353b8 182e2b07b24819a3ba8f6ce31d4d950e48c37a44
+e3e3d4aa6e9889cab293f35a00098623d7050a8c 838cfce97052d5d41980bf0bb8417080e2dc063b
+963827526c5d8a12f460ce1f39381cb1a548c251 dfa1e2e9dab09d15a811e279273bd3f91a3a1764
+a982a7124e0e2aea69d016b0a50ac5c44e99d301 86baa3e4a1eae7166f9b27bd04a79cbf39adb161
+56215d16c5ff2806d338425218c7a38f84d55fa7 0a7edca939cf1f8fdec7415785e430f7074ae9c9
+912b59d3c695fb1a7f6625bf1ee98380050da30e 10ec0c4b79c9cc994b1b16b94e5a9ba722e32ad6
+df63be6effca2930fabd3c5ac90f2f5a6831ee08 511823566054fc995395d7cefd886afe668fc220
+489208e86f4d906c92b45ab75596349c014ee3da 1f9c8403a321783ac1ec810f435c9495f4215651
+e09b1aaefd7496dfa450a0eebc2f5d0123c0aa11 4b487a3e56e9ebfc96a5377b419a84b18ea450ef
+f393601e09def2eca841a17a35e7ac98de0e5c4e 079acb68b85f626bfe4bae9e3f1ddb15894c19e0
+a2bee14815b5a69a78dd85d24b87ba70bf079ef4 f9ae2db50089842ce735f380a8ebce724f9c046f
+bd4d9b4fff8fc4bb5cfc8c2ee107a85cb60123af 948ab51ebb57cecd1ff4f0fd98bd3afe7c247448
+cce574a80120e06a4e5675708a22b1eb01478fb0 a7e82b63c32074feee9122d84ad794b706b6a9e4
+a9a36b3e7442ed7b4fffdee79c605b395fadd3b8 63e8f1935eb487586d5c626200906023e3aa0d4d
+a81b257427c2917d257e0fefd53f36fda1e9ea9f f766a2da51133f2137e882e5b64dc9176d403889
+fc6be9db5185113339f8a8612ad06227cdb37f36 e5944642d55142f7690d1e5ee8f2bf0ddfb5a8dd
+2e82b8d39123c94d6a619e3ec070c33ced9d2fb5 8492baaf5f5843a48adfd0776ed6bf0fb5102368
+fa6edf5db9a5616fcd32c3497fdf9fcb5bdff1d2 839246111082a59eb0fbe12bcd47275f7e876d3e
+a0a8e0eab99ab84fe87bc9933afababad2b9b801 497e9cdb4d4115014feaf108a70b738205ed842a
+2a5858ce7df6f61875285d9024ee30ebb4a9e818 9c405164a8d52ca30f60c4fe36f3275b4176a8b1
+f18a3c2d4d6076a7cafbcc3d4d8b279ce0005a77 497e9cdb4d4115014feaf108a70b738205ed842a
+24056882acb43a3353c5ee4503abf22db96378e9 a13e43fdd9f418a924227da8cbaf73c68a8b4360
+0c837d232fd5cae3486e3396540114223b18aa72 8a8ffcc9a94fd040a87f4a257d93edb745327766
+9210e8678a0c87e6a6f41aae35baf1ee9da1fe24 0fb33d1f4555a958ea6659bd3634e520a6498253
+5e03364217ae748984e9ec32eb68b6df19a91e92 995e84449ac704c65a4ed6447a58767134d9d004
+d7516bf8b7121358cb68372c833946c77d91d023 3eaa3bebef0623b1855de65d9cd2d5e247b6f8f6
+fa6e00805128a7a56dcbfb1dff0239d3e3333615 0d7cd94236b1c370a89eb691f8ab8a4c30c0acde
+e4d996c1c8cab96af14616287b735265e1cd8b67 2e5b328819f586bb270aaeed607b3f47167665cb
+46cd7051ce81cb7b018a54b3f413c5b08587073c 9e7a0ad6fac51751741fa7f0bd59b1073b36dd59
+0aac567995050157959b22c63f894b82079c16e3 01a5315ae5aa26abb73b4f95a184c2a80fba099f
+491e01aab0fb99c8867dac6d851b09c8e4bfa4e6 c2c3fb930fbc0ce6723cf5536594ecc3ac203181
+0e4d02438a4475a3b96a50777c1da394dbdbfb41 c98e3e7b1552c2fa045fe74abacc147c37343a5a
+358e7b7878725078f188d2894c4ba0fdd4c00417 c98e3e7b1552c2fa045fe74abacc147c37343a5a
+1bb50e24c2c07ed1a8843911fdb91269433f4c9e c98e3e7b1552c2fa045fe74abacc147c37343a5a
+daee1cab2a01720cfc6d2688b545b2efb9aeceb5 8bc403b4b4d6e9b1bc70fc31b033729b67acaabd
+586e3a1e9780ca72795efdf2a7c23589856ad5da abe0c8bf8063289dcd63ff321e1d65c28d793abe
+d2f84872f14bcaafd2fbe864bd962a28b3d7b797 b31fc8d8d3b7886dfd656a3c209e6004f95babc0
+32623b58af8f23d7b82cf0f2e380f0cb021c33dc 93cb159ec35a389d7d81bd513fe929f623b848c9
+2d6e3c013c21caf5d991ed6f47d43e9c21a12aa2 686f8b6d6eb36dfed46af06327920edd559d0dfc
+a90a1b77a904f5050bab13e2e7928aa97b55a133 627346fa495ce4a06d779c4efd7497a2e3348de9
+aad35cb693d91a0eee3e57e72cfc4e582158b944 06b44d76135e18c19d8be62537d25a93883335fc
+955c801c5d3c74ebcf5630cac1c9c3ff91615e2a 664ba832510fa56d689fea38b3463d6244258d59
+af2e23b431ee80cd9c86012228da6afed014d59f a043ef5eb84f09452e91e5002e00a342867a3f87
+a6ae40bdf3b943f99974a852c75f79f925ebf11b 24a5773d735af6d418f937ab3060292217113f9d
+8468ae92fc39ca60fb0631aa3cc80edee13446fd ad5a1110f42fb6d352124e1d445d2fc56b0af22e
+2a213ac519f97bd8484d66d59f773a86e5316b78 9db770e6b8b4aecb4c516e8e38135326315ed0b1
+0ebb8bfd909fb5b986efb577d16f9d39ea898dee b4af7adb8934472753dbdbf396774d2db7726d28
+6d771f97b95732498f629fa1b1fae293fb0535dd 24a5773d735af6d418f937ab3060292217113f9d
+57b08b52bf57157dc8539b02fbc24c27593f86c7 d872481b97b278a3f8a79ac85a75172ca8b115ee
+8b1c2cbacd644fa51fcf2a951b11ff8e83c9ba0b d872481b97b278a3f8a79ac85a75172ca8b115ee
+be55d06f477349561d74df85630acc482c37bfb1 24596bc71823cc9711e4a8e463929d54b8e76998
+554f5d5ac7f5f7e0317a2dc2fc78adcb6b0d6962 d90770415fb4dae6a868e26b47649a09cc05e394
+080f903d4f152bec5882f4b6c2fd7b448e1173c8 016050f733f76e95ac9f5c4ccf4429a7110d0c9b
+af03630eb89af97fbfd8d76f6912665cd97b9587 c727731739f9d5b30986c191c5d02a7a8d80bb65
+1aa0d0348a68d07164863431e542061786f98bcf 09f13edf6aa8c1cef43c8ba7f17289e75096a6a4
+ac617ee90acf68794feef501b99ae43ab538a558 09f13edf6aa8c1cef43c8ba7f17289e75096a6a4
+f84f5fca57946f838e79a59be20dffe407e9d3a7 edb3d5536c38643633925215404f2f02350f37d4
+426780dc180359b13f72bb6a259f9c4effe88cf9 fe1a7607de6ce5c3dedf96907e114ca0a208076a
+edef0997a11b5e3bc1c82cce0509e0d57bdde64b 6b93a09d0cdf42d7cee85979de6d7b18e34f6dd1