From b6ebf63e0986b5cd7bf46f3d7480a5ae52de8474 Mon Sep 17 00:00:00 2001 From: samjay3d <71744685+samjay3d@users.noreply.github.com> Date: Mon, 1 Mar 2021 22:23:53 -0800 Subject: [PATCH] Daz To Unreal 4.1.0 (#8) * Improved Genesis 8.1 materials Updated PBRSkin materials and improvements to the material system to support the updates. * Resubmitting the PBRSkin material saved from UE4.25. * Some improvements to the PBRSkin Material for DazToUnreal. * Unmapped Ambient Occlusion from the PBRSkin material. Unmapped Ambient Occlusion from the PBRSkin material. It was causing artifacts in shadows. * Base Subsurface Profile is created once for the character Base Subsurface Profile is created once for the character. * Genesis8.1 character get a PostProcess Animation Blueprint automatically Genesis8.1 character get a PostProcess Animation Blueprint automatically Consolidated the PostProcess animation settings into a dictionary so there doesn't need to be a special field per character type. * Added a setting to not rename morphs to the display name on transfer. * Added an option to remove the rotation on the character root at import. * Removing intermediate file that was accidently submitted * Early Pose support checked in, but disabled Early Pose support checked in, but disabled Also added an option for exporting a CSV of the material settings. I use this for reference when updating materials in Unreal. * Advanced Options are now hidden behind a checkbox Advanced Options are now hidden behind a checkbox. Most of these aren't needed in general and I don't want the interface to look overly complicated when first loaded. * Set Mouth Close to override it's controllers during export if it's chosen as a morph Set Mouth Close to override it's controllers during export if it's chosen as a morph * Added button to the Morphs interface for selecting the Genesis8.1 morphs needed for ARKit Added button to the Morphs interface for selecting the Genesis8.1 morphs needed for ARKit * Updated Versions Added Version for Next Release. Added .gitignore Co-authored-by: David-Vodhanel <39318287+David-Vodhanel@users.noreply.github.com> --- .gitignore | 3 + Common/DzRuntimePluginAction.cpp | 188 +++++ Common/DzRuntimePluginAction.h | 7 + Unreal/DazStudioPlugin/DzUnrealAction.cpp | 67 +- Unreal/DazStudioPlugin/DzUnrealAction.h | 2 +- Unreal/DazStudioPlugin/DzUnrealDialog.cpp | 49 +- Unreal/DazStudioPlugin/DzUnrealDialog.h | 4 + .../DzUnrealMorphSelectionDialog.cpp | 68 +- .../DzUnrealMorphSelectionDialog.h | 1 + Unreal/DazStudioPlugin/version.h | 2 +- .../Content/BasePBRSkinMaterial.uasset | Bin 107426 -> 99791 bytes .../Content/PBRSkinParameters.uasset | Bin 152853 -> 150216 bytes .../DazToUnreal/DazToUnreal.uplugin | 2 +- .../DazToUnreal/Private/DazToUnreal.cpp | 102 +-- .../Private/DazToUnrealMaterials.cpp | 171 ++++- .../DazToUnreal/Private/DazToUnrealPoses.cpp | 5 +- .../Source/DazToUnreal/Public/DazToUnreal.h | 2 +- .../DazToUnreal/Public/DazToUnrealMaterials.h | 11 +- .../DazToUnreal/Public/DazToUnrealPoses.h | 2 +- .../DazToUnreal/Public/DazToUnrealSettings.h | 39 +- .../DzUnrealMorphSelectionDialog.cpp | 722 ------------------ 21 files changed, 628 insertions(+), 819 deletions(-) create mode 100644 .gitignore delete mode 100644 enc_temp_folder/6a78368314534b289560b0c36b376e2d/DzUnrealMorphSelectionDialog.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a9f59c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vs +out +CMakeSettings.json diff --git a/Common/DzRuntimePluginAction.cpp b/Common/DzRuntimePluginAction.cpp index a08b93c..d94b82d 100644 --- a/Common/DzRuntimePluginAction.cpp +++ b/Common/DzRuntimePluginAction.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include @@ -41,6 +43,7 @@ DzRuntimePluginAction::DzRuntimePluginAction(const QString& text, const QString& ExportMorphs = false; ExportSubdivisions = false; ShowFbxDialog = false; + ControllersToDisconnect.append("facs_bs_MouthClose_div2"); } DzRuntimePluginAction::~DzRuntimePluginAction() @@ -116,6 +119,84 @@ void DzRuntimePluginAction::Export() AssetType = "Environment"; ExportNode(Selection); } + else if (AssetType == "Pose") + { + PoseList.clear(); + DzNode* Selection = dzScene->getPrimarySelection(); + int poseIndex = 0; + DzNumericProperty* previousProperty = nullptr; + for (int index = 0; index < Selection->getNumProperties(); index++) + { + DzProperty* property = Selection->getProperty(index); + DzNumericProperty* numericProperty = qobject_cast(property); + QString propName = property->getName(); + if (numericProperty) + { + QString propName = property->getName(); + if (MorphMapping.contains(propName)) + { + poseIndex++; + numericProperty->setDoubleValue(0.0f, 0.0f); + for (int frame = 0; frame < MorphMapping.count() + 1; frame++) + { + numericProperty->setDoubleValue(dzScene->getTimeStep() * double(frame), 0.0f); + } + numericProperty->setDoubleValue(dzScene->getTimeStep() * double(poseIndex),1.0f); + PoseList.append(propName); + } + } + } + + DzObject* Object = Selection->getObject(); + if (Object) + { + for (int index = 0; index < Object->getNumModifiers(); index++) + { + DzModifier* modifier = Object->getModifier(index); + DzMorph* mod = qobject_cast(modifier); + if (mod) + { + for (int propindex = 0; propindex < modifier->getNumProperties(); propindex++) + { + DzProperty* property = modifier->getProperty(propindex); + QString propName = property->getName(); + QString propLabel = property->getLabel(); + DzNumericProperty* numericProperty = qobject_cast(property); + if (numericProperty) + { + QString propName = property->getName(); + qDebug() << propName; + if (MorphMapping.contains(modifier->getName())) + { + poseIndex++; + numericProperty->setDoubleValue(0.0f, 0.0f); + for (int frame = 0; frame < MorphMapping.count() + 1; frame++) + { + numericProperty->setDoubleValue(dzScene->getTimeStep() * double(frame), 0.0f); + } + numericProperty->setDoubleValue(dzScene->getTimeStep() * double(poseIndex), 1.0f); + PoseList.append(modifier->getName()); + } + } + } + + } + + } + } + + dzScene->setAnimRange(DzTimeRange(0, poseIndex * dzScene->getTimeStep())); + dzScene->setPlayRange(DzTimeRange(0, poseIndex * dzScene->getTimeStep())); + + ExportNode(Selection); + } + else if (AssetType == "SkeletalMesh") + { + QList DisconnectedModifiers = DisconnectOverrideControllers(); + DzNode* Selection = dzScene->getPrimarySelection(); + ExportNode(Selection); + ReconnectOverrideControllers(DisconnectedModifiers); + } else { DzNode* Selection = dzScene->getPrimarySelection(); @@ -340,4 +421,111 @@ void DzRuntimePluginAction::GetScenePropList(DzNode* Node, QMap DzRuntimePluginAction::DisconnectOverrideControllers() +{ + QList ModifiedList; + DzNode* Selection = dzScene->getPrimarySelection(); + int poseIndex = 0; + DzNumericProperty* previousProperty = nullptr; + for (int index = 0; index < Selection->getNumProperties(); index++) + { + DzProperty* property = Selection->getProperty(index); + DzNumericProperty* numericProperty = qobject_cast(property); + QString propName = property->getName(); + if (numericProperty && !numericProperty->isOverridingControllers()) + { + QString propName = property->getName(); + if (MorphMapping.contains(propName) && ControllersToDisconnect.contains(propName)) + { + numericProperty->setOverrideControllers(true); + ModifiedList.append(propName); + } + } + } + + DzObject* Object = Selection->getObject(); + if (Object) + { + for (int index = 0; index < Object->getNumModifiers(); index++) + { + DzModifier* modifier = Object->getModifier(index); + DzMorph* mod = qobject_cast(modifier); + if (mod) + { + for (int propindex = 0; propindex < modifier->getNumProperties(); propindex++) + { + DzProperty* property = modifier->getProperty(propindex); + QString propName = property->getName(); + QString propLabel = property->getLabel(); + DzNumericProperty* numericProperty = qobject_cast(property); + if (numericProperty && !numericProperty->isOverridingControllers()) + { + QString propName = property->getName(); + if (MorphMapping.contains(modifier->getName()) && ControllersToDisconnect.contains(modifier->getName())) + { + numericProperty->setOverrideControllers(true); + ModifiedList.append(modifier->getName()); + } + } + } + + } + + } + } + + return ModifiedList; +} + +void DzRuntimePluginAction::ReconnectOverrideControllers(QList& DisconnetedControllers) +{ + DzNode* Selection = dzScene->getPrimarySelection(); + int poseIndex = 0; + DzNumericProperty* previousProperty = nullptr; + for (int index = 0; index < Selection->getNumProperties(); index++) + { + DzProperty* property = Selection->getProperty(index); + DzNumericProperty* numericProperty = qobject_cast(property); + QString propName = property->getName(); + if (numericProperty && numericProperty->isOverridingControllers()) + { + QString propName = property->getName(); + if (DisconnetedControllers.contains(propName)) + { + numericProperty->setOverrideControllers(false); + } + } + } + + DzObject* Object = Selection->getObject(); + if (Object) + { + for (int index = 0; index < Object->getNumModifiers(); index++) + { + DzModifier* modifier = Object->getModifier(index); + DzMorph* mod = qobject_cast(modifier); + if (mod) + { + for (int propindex = 0; propindex < modifier->getNumProperties(); propindex++) + { + DzProperty* property = modifier->getProperty(propindex); + QString propName = property->getName(); + QString propLabel = property->getLabel(); + DzNumericProperty* numericProperty = qobject_cast(property); + if (numericProperty && numericProperty->isOverridingControllers()) + { + QString propName = property->getName(); + if (DisconnetedControllers.contains(modifier->getName())) + { + numericProperty->setOverrideControllers(false); + } + } + } + + } + + } + } +} + #include "moc_DzRuntimePluginAction.cpp" diff --git a/Common/DzRuntimePluginAction.h b/Common/DzRuntimePluginAction.h index b56ae5b..5a6f360 100644 --- a/Common/DzRuntimePluginAction.h +++ b/Common/DzRuntimePluginAction.h @@ -29,10 +29,12 @@ class DzRuntimePluginAction : public DzAction { QString MorphString; QString FBXVersion; QMap MorphMapping; + QList PoseList; bool ExportMorphs; bool ExportSubdivisions; bool ShowFbxDialog; + bool ExportMaterialPropertiesCSV; DzNode* Selection; virtual QString getActionGroup() const { return tr("Bridges"); } @@ -54,4 +56,9 @@ class DzRuntimePluginAction : public DzAction { // During Environment export props need to get disconnected as they are exported. void DisconnectNode(DzNode* Node, QList& AttachmentList); void ReconnectNodes(QList& AttachmentList); + + // During Skeletal Mesh Export Disconnect Override Controllers + QList DisconnectOverrideControllers(); + void ReconnectOverrideControllers(QList& DisconnetedControllers); + QList ControllersToDisconnect; }; \ No newline at end of file diff --git a/Unreal/DazStudioPlugin/DzUnrealAction.cpp b/Unreal/DazStudioPlugin/DzUnrealAction.cpp index 88cd507..9abd1fb 100644 --- a/Unreal/DazStudioPlugin/DzUnrealAction.cpp +++ b/Unreal/DazStudioPlugin/DzUnrealAction.cpp @@ -81,6 +81,7 @@ void DzUnrealAction::executeAction() ExportSubdivisions = dlg->subdivisionEnabledCheckBox->isChecked(); MorphMapping = dlg->GetMorphMapping(); ShowFbxDialog = dlg->showFbxDialogCheckBox->isChecked(); + ExportMaterialPropertiesCSV = dlg->exportMaterialPropertyCSVCheckBox->isChecked(); SubdivisionDialog = DzUnrealSubdivisionDialog::Get(dlg); SubdivisionDialog->LockSubdivisionProperties(ExportSubdivisions); FBXVersion = dlg->fbxVersionCombo->currentText(); @@ -103,9 +104,28 @@ void DzUnrealAction::WriteConfiguration() if (AssetType != "Environment") { - writer.startMemberArray("Materials", true); - WriteMaterials(Selection, writer); - writer.finishArray(); + if (ExportMaterialPropertiesCSV) + { + QString filename = CharacterFolder + CharacterName + "_Maps.csv"; + QFile file(filename); + file.open(QIODevice::WriteOnly); + QTextStream stream(&file); + stream << "Version, Object, Material, Type, Color, Opacity, File" << endl; + + writer.startMemberArray("Materials", true); + WriteMaterials(Selection, writer, stream); + writer.finishArray(); + } + else + { + QString throwaway; + QTextStream stream(&throwaway); + writer.startMemberArray("Materials", true); + WriteMaterials(Selection, writer, stream); + writer.finishArray(); + } + + writer.startMemberArray("Morphs", true); if (ExportMorphs) @@ -129,6 +149,22 @@ void DzUnrealAction::WriteConfiguration() writer.finishArray(); } + if (AssetType == "Pose") + { + writer.startMemberArray("Poses", true); + + for (QList::iterator i = PoseList.begin(); i != PoseList.end(); ++i) + { + writer.startObject(true); + writer.addMember("Name", *i); + writer.addMember("Label", MorphMapping[*i]); + writer.finishObject(); + } + + writer.finishArray(); + + } + if (AssetType == "Environment") { writer.startMemberArray("Instances", true); @@ -157,7 +193,7 @@ void DzUnrealAction::SetExportOptions(DzFileIOSettings& ExportOptions) } // Write out all the surface properties -void DzUnrealAction::WriteMaterials(DzNode* Node, DzJsonWriter& Writer) +void DzUnrealAction::WriteMaterials(DzNode* Node, DzJsonWriter& Writer, QTextStream& Stream) { DzObject* Object = Node->getObject(); DzShape* Shape = Object ? Object->getCurrentShape() : NULL; @@ -183,7 +219,11 @@ void DzUnrealAction::WriteMaterials(DzNode* Node, DzJsonWriter& Writer) Writer.addMember("Data Type", QString("String")); Writer.addMember("Texture", QString("")); Writer.finishObject(); - //Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << "Asset Type" << ", " << presentationType << ", " << "String" << ", " << "" << endl; + + if (ExportMaterialPropertiesCSV) + { + Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << "Asset Type" << ", " << presentationType << ", " << "String" << ", " << "" << endl; + } } for (int propertyIndex = 0; propertyIndex < Material->getNumProperties(); propertyIndex++) @@ -210,8 +250,11 @@ void DzUnrealAction::WriteMaterials(DzNode* Node, DzJsonWriter& Writer) Writer.addMember("Data Type", QString("Texture")); Writer.addMember("Texture", TextureName); Writer.finishObject(); + if (ExportMaterialPropertiesCSV) + { + Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << Name << ", " << Material->getDiffuseColor().name() << ", " << "Texture" << ", " << TextureName << endl; + } continue; - //Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << Name << ", " << Material->getDiffuseColor().name() << ", " << "Texture" << ", " << TextureName << endl; } DzColorProperty* ColorProperty = qobject_cast(Property); @@ -235,7 +278,10 @@ void DzUnrealAction::WriteMaterials(DzNode* Node, DzJsonWriter& Writer) Writer.addMember("Data Type", QString("Color")); Writer.addMember("Texture", TextureName); Writer.finishObject(); - //Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << Name << ", " << ColorProperty->getColorValue().name() << ", " << "Color" << ", " << TextureName << endl; + if (ExportMaterialPropertiesCSV) + { + Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << Name << ", " << ColorProperty->getColorValue().name() << ", " << "Color" << ", " << TextureName << endl; + } continue; } @@ -260,7 +306,10 @@ void DzUnrealAction::WriteMaterials(DzNode* Node, DzJsonWriter& Writer) Writer.addMember("Data Type", QString("Double")); Writer.addMember("Texture", TextureName); Writer.finishObject(); - //Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << Name << ", " << NumericProperty->getDoubleValue() << ", " << "Double" << ", " << TextureName << endl; + if (ExportMaterialPropertiesCSV) + { + Stream << "2, " << Node->getLabel() << ", " << Material->getName() << ", " << Material->getMaterialName() << ", " << Name << ", " << NumericProperty->getDoubleValue() << ", " << "Double" << ", " << TextureName << endl; + } } } } @@ -271,7 +320,7 @@ void DzUnrealAction::WriteMaterials(DzNode* Node, DzJsonWriter& Writer) while (Iterator.hasNext()) { DzNode* Child = Iterator.next(); - WriteMaterials(Child, Writer); + WriteMaterials(Child, Writer, Stream); } } diff --git a/Unreal/DazStudioPlugin/DzUnrealAction.h b/Unreal/DazStudioPlugin/DzUnrealAction.h index f51abab..f0b9e44 100644 --- a/Unreal/DazStudioPlugin/DzUnrealAction.h +++ b/Unreal/DazStudioPlugin/DzUnrealAction.h @@ -20,7 +20,7 @@ class DzUnrealAction : public DzRuntimePluginAction { DzUnrealSubdivisionDialog* SubdivisionDialog; void executeAction(); - void WriteMaterials(DzNode* Node, DzJsonWriter& Stream); + void WriteMaterials(DzNode* Node, DzJsonWriter& Writer, QTextStream& Stream); void WriteInstances(DzNode* Node, DzJsonWriter& Writer, QMap& WritenInstances, QList& ExportedGeometry, QUuid ParentID = QUuid()); QUuid WriteInstance(DzNode* Node, DzJsonWriter& Writer, QUuid ParentID); void WriteConfiguration(); diff --git a/Unreal/DazStudioPlugin/DzUnrealDialog.cpp b/Unreal/DazStudioPlugin/DzUnrealDialog.cpp index 3aeee1f..a5030fd 100644 --- a/Unreal/DazStudioPlugin/DzUnrealDialog.cpp +++ b/Unreal/DazStudioPlugin/DzUnrealDialog.cpp @@ -60,9 +60,15 @@ DzUnrealDialog::DzUnrealDialog(QWidget *parent) : // Set the dialog title setWindowTitle(tr("Daz To Unreal")); - + layout()->setSizeConstraint(QLayout::SetFixedSize); QFormLayout* mainLayout = new QFormLayout(this); + + + advancedWidget = new QWidget(); + QHBoxLayout* advancedLayoutOuter = new QHBoxLayout(this); + advancedLayoutOuter->addWidget(advancedWidget); QFormLayout* advancedLayout = new QFormLayout(this); + advancedWidget->setLayout(advancedLayout); // Asset Name assetNameEdit = new QLineEdit(this); @@ -127,29 +133,33 @@ DzUnrealDialog::DzUnrealDialog(QWidget *parent) : // Show FBX Dialog option showFbxDialogCheckBox = new QCheckBox("", this); + connect(showFbxDialogCheckBox, SIGNAL(stateChanged(int)), this, SLOT(HandleShowFbxDialogCheckBoxChange(int))); + + // Export Material Property CSV option + exportMaterialPropertyCSVCheckBox = new QCheckBox("", this); + connect(exportMaterialPropertyCSVCheckBox, SIGNAL(stateChanged(int)), this, SLOT(HandleExportMaterialPropertyCSVCheckBoxChange(int))); // Add the widget to the basic dialog mainLayout->addRow("Asset Name", assetNameEdit); mainLayout->addRow("Asset Type", assetTypeCombo); mainLayout->addRow("Enable Morphs", morphsLayout); mainLayout->addRow("Enable Subdivision", subdivisionLayout); - //mainLayout->addRow("Project", projectLayout); advancedLayout->addRow("Intermediate Folder", intermediateFolderLayout); advancedLayout->addRow("Port", portEdit); advancedLayout->addRow("FBX Version", fbxVersionCombo); advancedLayout->addRow("Show FBX Dialog", showFbxDialogCheckBox); + advancedLayout->addRow("Export Material CSV", exportMaterialPropertyCSVCheckBox); addLayout(mainLayout); // Advanced advancedSettingsGroupBox = new QGroupBox("Advanced Settings", this); - advancedSettingsGroupBox->setLayout(advancedLayout); + advancedSettingsGroupBox->setLayout(advancedLayoutOuter); + advancedSettingsGroupBox->setCheckable(true); + advancedSettingsGroupBox->setChecked(false); + advancedSettingsGroupBox->setFixedWidth(500); // This is what forces the whole forms width addWidget(advancedSettingsGroupBox); - - - // Make the dialog fit its contents, with a minimum width, and lock it down - resize(QSize(500, 0).expandedTo(minimumSizeHint())); - setFixedWidth(width()); - setFixedHeight(height()); + advancedWidget->setHidden(true); + connect(advancedSettingsGroupBox, SIGNAL(clicked(bool)), this, SLOT(HandleShowAdvancedSettingsCheckBoxChange(bool))); // Help assetNameEdit->setWhatsThis("This is the name the asset will use in Unreal."); @@ -158,6 +168,8 @@ DzUnrealDialog::DzUnrealDialog(QWidget *parent) : intermediateFolderButton->setWhatsThis("DazToUnreal will collect the assets in a subfolder under this folder. Unreal will import them from here."); portEdit->setWhatsThis("The UDP port used to talk to the DazToUnreal Unreal plugin.\nThis needs to match the port set in the Project Settings in Unreal.\nDefault is 32345."); fbxVersionCombo->setWhatsThis("The version of FBX to use when exporting assets."); + showFbxDialogCheckBox->setWhatsThis("Checking this will show the FBX Dialog for adjustments before export."); + exportMaterialPropertyCSVCheckBox->setWhatsThis("Checking this will write out a CSV of all the material properties. Useful for reference when changing materials."); // Load Settings if (!settings->value("IntermediatePath").isNull()) @@ -185,6 +197,15 @@ DzUnrealDialog::DzUnrealDialog(QWidget *parent) : { showFbxDialogCheckBox->setChecked(settings->value("ShowFBXDialog").toBool()); } + if (!settings->value("ExportMaterialPropertyCSV").isNull()) + { + exportMaterialPropertyCSVCheckBox->setChecked(settings->value("ExportMaterialPropertyCSV").toBool()); + } + if (!settings->value("ShowAdvancedSettings").isNull()) + { + advancedSettingsGroupBox->setChecked(settings->value("ShowAdvancedSettings").toBool()); + advancedWidget->setHidden(!advancedSettingsGroupBox->isChecked()); + } if (!settings->value("FBXExportVersion").isNull()) { int index = fbxVersionCombo->findText(settings->value("FBXExportVersion").toString()); @@ -273,4 +294,14 @@ void DzUnrealDialog::HandleShowFbxDialogCheckBoxChange(int state) { settings->setValue("ShowFBXDialog", state == Qt::Checked); } +void DzUnrealDialog::HandleExportMaterialPropertyCSVCheckBoxChange(int state) +{ + settings->setValue("ExportMaterialPropertyCSV", state == Qt::Checked); +} + +void DzUnrealDialog::HandleShowAdvancedSettingsCheckBoxChange(bool checked) +{ + settings->setValue("ShowAdvancedSettings", checked); + advancedWidget->setHidden(!checked); +} #include "moc_DzUnrealDialog.cpp" diff --git a/Unreal/DazStudioPlugin/DzUnrealDialog.h b/Unreal/DazStudioPlugin/DzUnrealDialog.h index 27c601f..9cd0e86 100644 --- a/Unreal/DazStudioPlugin/DzUnrealDialog.h +++ b/Unreal/DazStudioPlugin/DzUnrealDialog.h @@ -31,8 +31,10 @@ class DzUnrealDialog : public DzBasicDialog { QPushButton* subdivisionButton; QCheckBox* subdivisionEnabledCheckBox; QGroupBox* advancedSettingsGroupBox; + QWidget* advancedWidget; QComboBox* fbxVersionCombo; QCheckBox* showFbxDialogCheckBox; + QCheckBox* exportMaterialPropertyCSVCheckBox; // Pass so the DazTRoUnrealAction can access it from the morph dialog QString GetMorphString(); @@ -50,6 +52,8 @@ private slots: void HandleSubdivisionCheckBoxChange(int state); void HandleFBXVersionChange(const QString& fbxVersion); void HandleShowFbxDialogCheckBoxChange(int state); + void HandleExportMaterialPropertyCSVCheckBoxChange(int state); + void HandleShowAdvancedSettingsCheckBoxChange(bool checked); private: QSettings* settings; diff --git a/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.cpp b/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.cpp index 4e7eee9..47ff889 100644 --- a/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.cpp +++ b/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.cpp @@ -126,14 +126,17 @@ DzUnrealMorphSelectionDialog::DzUnrealMorphSelectionDialog(QWidget *parent) : QPushButton* ArmsJCMButton = new QPushButton("Arms"); QPushButton* LegsJCMButton = new QPushButton("Legs"); QPushButton* TorsoJCMButton = new QPushButton("Torso"); + QPushButton* ARKit81Button = new QPushButton("ARKit(Genesis8.1)"); ((QGridLayout*)JCMGroupBox->layout())->addWidget(ArmsJCMButton, 0, 0); ((QGridLayout*)JCMGroupBox->layout())->addWidget(LegsJCMButton, 0, 1); ((QGridLayout*)JCMGroupBox->layout())->addWidget(TorsoJCMButton, 0, 2); + ((QGridLayout*)JCMGroupBox->layout())->addWidget(ARKit81Button, 1, 0); connect(ArmsJCMButton, SIGNAL(released()), this, SLOT(HandleArmJCMMorphsButton())); connect(LegsJCMButton, SIGNAL(released()), this, SLOT(HandleLegJCMMorphsButton())); connect(TorsoJCMButton, SIGNAL(released()), this, SLOT(HandleTorsoJCMMorphsButton())); - + connect(ARKit81Button, SIGNAL(released()), this, SLOT(HandleARKitGenesis81MorphsButton())); + treeLayout->addWidget(JCMGroupBox); morphsLayout->addLayout(treeLayout); @@ -609,6 +612,69 @@ void DzUnrealMorphSelectionDialog::HandleTorsoJCMMorphsButton() RefreshExportMorphList(); } +// Hard coded list of morphs for Genesis 8.1 and ARKit +// It just adds them all, the other functions will ignore any that don't fit the character +void DzUnrealMorphSelectionDialog::HandleARKitGenesis81MorphsButton() +{ + QStringList MorphsToAdd; + + MorphsToAdd.append("facs_jnt_EyeWideLeft"); + MorphsToAdd.append("facs_jnt_EyeWideRight"); + MorphsToAdd.append("facs_jnt_EyeBlinkLeft"); + MorphsToAdd.append("facs_jnt_EyeBlinkRight"); + MorphsToAdd.append("facs_bs_EyeSquintLeft_div2"); + MorphsToAdd.append("facs_bs_EyeSquintRight_div2"); + MorphsToAdd.append("facs_jnt_JawForward"); + MorphsToAdd.append("facs_jnt_JawLeft"); + MorphsToAdd.append("facs_jnt_JawRight"); + MorphsToAdd.append("facs_jnt_JawOpen"); + MorphsToAdd.append("facs_bs_MouthClose_div2"); + MorphsToAdd.append("facs_bs_MouthFunnel_div2"); + MorphsToAdd.append("facs_bs_MouthPucker_div2"); + MorphsToAdd.append("facs_bs_MouthLeft_div2"); + MorphsToAdd.append("facs_bs_MouthRight_div2"); + MorphsToAdd.append("facs_bs_MouthSmileLeft_div2"); + MorphsToAdd.append("facs_bs_MouthSmileRight_div2"); + MorphsToAdd.append("facs_bs_MouthFrownLeft_div2"); + MorphsToAdd.append("facs_bs_MouthFrownRight_div2"); + MorphsToAdd.append("facs_bs_MouthDimpleLeft_div2"); + MorphsToAdd.append("facs_bs_MouthDimpleRight_div2"); + MorphsToAdd.append("facs_bs_MouthStretchLeft_div2"); + MorphsToAdd.append("facs_bs_MouthStretchRight_div2"); + MorphsToAdd.append("facs_bs_MouthRollLower_div2"); + MorphsToAdd.append("facs_bs_MouthRollUpper_div2"); + MorphsToAdd.append("facs_bs_MouthShrugLower_div2"); + MorphsToAdd.append("facs_bs_MouthShrugUpper_div2"); + MorphsToAdd.append("facs_bs_MouthPressLeft_div2"); + MorphsToAdd.append("facs_bs_MouthPressRight_div2"); + MorphsToAdd.append("facs_bs_MouthLowerDownLeft_div2"); + MorphsToAdd.append("facs_bs_MouthLowerDownRight_div2"); + MorphsToAdd.append("facs_bs_MouthUpperUpLeft_div2"); + MorphsToAdd.append("facs_bs_MouthUpperUpRight_div2"); + MorphsToAdd.append("facs_bs_BrowDownLeft_div2"); + MorphsToAdd.append("facs_bs_BrowDownRight_div2"); + MorphsToAdd.append("facs_ctrl_BrowInnerUp"); + MorphsToAdd.append("facs_bs_BrowOuterUpLeft_div2"); + MorphsToAdd.append("facs_bs_BrowOuterUpRight_div2"); + MorphsToAdd.append("facs_ctrl_CheekPuff"); + MorphsToAdd.append("facs_bs_CheekSquintLeft_div2"); + MorphsToAdd.append("facs_bs_CheekSquintRight_div2"); + MorphsToAdd.append("facs_bs_NoseSneerLeft_div2"); + MorphsToAdd.append("facs_bs_NoseSneerRight_div2"); + MorphsToAdd.append("facs_bs_TongueOut"); + + + // Add the list for export + foreach(QString MorphName, MorphsToAdd) + { + if (morphs.contains(MorphName) && !morphsToExport.contains(morphs[MorphName])) + { + morphsToExport.append(morphs[MorphName]); + } + } + RefreshExportMorphList(); +} + // Refresh the Right export list void DzUnrealMorphSelectionDialog::RefreshExportMorphList() { diff --git a/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.h b/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.h index 7f0c7ed..e5a888a 100644 --- a/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.h +++ b/Unreal/DazStudioPlugin/DzUnrealMorphSelectionDialog.h @@ -78,6 +78,7 @@ public slots: void HandleArmJCMMorphsButton(); void HandleLegJCMMorphsButton(); void HandleTorsoJCMMorphsButton(); + void HandleARKitGenesis81MorphsButton(); private: diff --git a/Unreal/DazStudioPlugin/version.h b/Unreal/DazStudioPlugin/version.h index 4c1804c..8c72d6e 100644 --- a/Unreal/DazStudioPlugin/version.h +++ b/Unreal/DazStudioPlugin/version.h @@ -3,7 +3,7 @@ // Version number for DazToUnreal #define PLUGIN_MAJOR 1 -#define PLUGIN_MINOR 0 +#define PLUGIN_MINOR 1 #define PLUGIN_REV 0 #define PLUGIN_BUILD 1 diff --git a/Unreal/UnrealPlugin/DazToUnreal/Content/BasePBRSkinMaterial.uasset b/Unreal/UnrealPlugin/DazToUnreal/Content/BasePBRSkinMaterial.uasset index ec7e50f73e46e289c6f0b343b6ae7c87a0d856d4..70375068f249889f407ccc11e613844c80e0fd2f 100644 GIT binary patch literal 99791 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%0AW*6uqjf3L4S43F-LO7#a`enZe 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 VC0Q)h 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 l%#T?fGt)CL3-GZCGV}2 zeHDkGi{IT}vR7Oe;Y8sE9VXe?6w*f=y9tx$2Dq4rP&n}#1K~ZT39My*P@$(C2P-BD z7eGO4K;i60#TpBkb47cR-jxki6O!Pd3M_NE2_PoE$)iRX7XLth!wy`>vXvoJ88sTOR zlmAVQf`g5TJrr((JhjO1Z1ztAA3yJjDNq~pV+YzpY)*Y>ZuOP^5+F>|1Oc_R=aq#c zAa^y4Eg>fMplxMtNrK;KCvFA>NIz5t67y`zNqEScg19i_&I9o-1FE)`8^HpeV73-u zkRb>DIxzrQ8$%&B_6!;(CNKviYQ-SN=WugW!u*}WpbdeVTiAmZC`i(PK>XX(QwD~! zE%KF_=L8mY%J@sgzTWf}K0rVqz%HmDvxOk+T|mmYp$qyBerRvS1Snh^f4@EdqiB zTrLN;2ZQX-Io<-cM-~P~B0=^}&e1?YIkxmHc9d;w9qd6ABO?4jt(HYam%R)~O(`+@ zCwK!CYvUjZI8hc3N0>rwP&EMwQcQj<4aAJBgFV~pTDx3|go{fdo+}&dCE|C5Q3^ zihdH%3~FFokZv+-6tE+Iqx@8;DJX;w)U8tvO5v-$6cRc5J?9Vy7@;YA_06h*U)v9n~2*WS)AZ9RBWwSq`K={4#*>PqYKn6bW+oj`aN#f07dn3vbYYu=^$E7_V#!qS*5l1ZvPPiiU$d zkVc&P97rI;{z^d2L6$Pz0dnXU2?=thPN>5{;ebO6h(!=sev=*d6meR&nM7i>fWQEF zepT}co=C?NEF5hAvli@S4jmlJJ3S~sh}F_yAhXU6h+oQ2OpNiTxdfEuztc|*nuH68 zAL}`lsBB{fM}qbg&>sK}KAUzd3<)9$M2Z5AJVT$zK!SKu5qm(rRRkdz;;R4-MHt)| z4Ewp&AWZYZ2%rutBH#|T>ZoP{WH~OK2{`{4qX|c#jD(`<0xFsf%fe}aa;k{hJdo_I zT??SVDchJroIyru@dH5dK86_JW(;>AW(e@{nF->Oy3=yP32c;mNRU6U8_G7ny!WC< zNCl`(s=$GS3a(=XUaz0a1B|Mu76ptr$;wNzNCg0gsz5(oe=XL>2UrzwE`Xkdj)(%f z06+$0eldFG47vfT1NzxBhF_s_d?tWx>_I`rMCHHB_{AcJ zDm11LkY8#8F;F=EF5@iyt2X;a{*6NybpA(GAaH>EUB>Z#Y?6brng5Y|vO}m1g&=I< zsAPeFx|xz~fTI3)QD>O5NRI{L&L2T_UKrl!-H_(;-UCU{QqY1XQg+YGqjDQ?SIx4FcsJ4Hfat~GG z;fSBSAXYZVAfPavah}-+BHS7(2fBp65`cUL*(_f?_}%cI@{Xx0FIhQ%-?HCJuL2YT zGX+hD-hl&YcP9MQkmK1(;~%9Nj%m&eD1Sg~kWfd|Ib{#AMKZ`ij2+BRPdZwq>e}Pb zN1gGXWLChHf27{V_oTw?E0<}X8=!Z~JdlDh5XbBt#zdDwmtBRGrtPiZ}qyzt{K&C%`4mirr+NqKE zoc_Rup28@{As{y9s4#kTj{gggi+?5jRPfU4rUJ0K(?ZVc&0_|v?gTtGI^oeZqhnpi zXBQHL(NEJ36k!cV2m*mhXCx?`->(GVxCJ(`0-HlXNW~yhAiz&yRXD2Wfw~?y)qq4K zst1ICi0xg1fPFe;0=DINLzB5OAV8G;j4oLVu#F7_c03bAKD#0hxaueMxbPoO%xh%S z0$lZzbaDuR%SH5oqv!%j-U-O1GWA*gHaI+r0{xv*2eK#fvi5kF=&{XAtCl44biSNV84DP{3&6i z$H5ZNa2wTAp-wSXh$94s1l|EaAyAqx!0C7g1dX~z0hB(}sRco8vkAoXG?ReJhXe^~ zr9c3+eK6 zMn0urkb}5^I&nfds}?7nh`Hg_uYhrL-NP!EjmpJkapLTBOu04Vbn2s zcp%*cEb$XV}t=) zeHYa-@eBR*bBTr#-x*ry>QA(Rtsd+ceecw-CmnZ!?b8q-$WIy()F#~JgW&+D@d@JZ zd*F3&fDWwag#Kp@@GLbd2HpivXh3n4L7qwgI_Xmnnldmx1ft`F>l8WH;9Cqh@E^X$ z5g7^e14{%3ARQP#P@g{SP98yjrOlye5B`N__%Af0f1#QF3k~uwG_!x9ng0vT;$LXc zf1z3a2ih#kFV9YCK;i+z>f{DmLD3>kpZ`jmN6~Ja($0MS@Dv7aXCI~ii3XgD!1yN` z#tG>kX+Vz#jDMO3oRh%#CmK*-fbmbXGu+wzcN@-Z{wEsHY5?PmC-(#dEu;LBar%5l zD>#LhP&AqUKwCu7n*IZA0Y%F@r5&Q4PaltOzySsfU_Iyfj~|c!9CGsX@4vtv0T)W- zA2NYi2fyI}9w0w}JK)P2)CG(XM*#C{{0aRX|KI8X{zUY32OB zo&S{lC-mRx+5d~*j8M}6Ie;FrQ-PoUAL!Zpiyoj3o#_!g)idsL`hcPV<4@=W_dEWd z_GkAmdLXBA0DBgIjY17Fw?8HS37zl&zi0UWRu51M06p)36B{)!yw4<@z<)v~INZcQ5KRJ_d zBJ)q^1PA<{;s0AbKz#-5In%QhcP0Ul_DkLg^y~MG>%Y}=mZxWWTUJJh#{X z;C0>Hq860dC-x43G)D9s<1w@b&}rV1N$b%?oJTfqovS z5rB=rn+y;qKurhUIDni6@(t*%rcnx}P}d~tT0>o{sA~pw0cHQp4}ZM_G66XN9(V@i z0MCFvU_P)mK>isWkbCwF=mwsFwE*h^=A6L*4zS@225bTBID-MZ06WfLKsTTZfX^-f z2iOC^zdxVR&+aJl@c?uJ16bG3amp0HfCdV_rLKr~feKKIr>rD*=SD#? z0i-M^qveeDw&Ht^&3A`ECmYSXrljmG3dFU_M%8GKdY{m;DH$;rF}FUtauXI3D|d~I zrR53D1J4Vq6LI30=c7PAL<|}}{Z}jp>MXgp;VS9O#LXOJS#v`lD69CVbles^Dv?=N z+y?g+3cn_qM2KpaCFY1m9=0DX4_9uF_z^5B@fwJfxvkHr=O}tIrXT82KvW_Z4QA*k z8zbo-tUeETs_OW{U+Y%q#o~s+iMB;aas+&a@Hro%FaFaQAGI<>xY;Cxb z?<#ZgabLme!fR*nU)m|)l^k_@6W`BEDDHNsN+M~^z*9>6t)~DjaQktth*&bnu+y_q z;enk-qxgfEb6iELd_ti`$@`DB4ZmP5hs*{AR@zc?HKWnETdlrYcizq5+a82d5n}US z5Tdk?eo^1B5c)vJoyxrI>O6*B7t;>?gUGmsYu8@atrc#0Y9#I<<>ggimT&o|wD!Z; z;vdT`&$u+ym`EHne015oNCWb3EO{d`TR*s07f}7tSsg~@l(ziCGe)D~TJyV=hD1^G zj1?onp_T7yCCJ{*k9_!bkYVDFwVVsgmIovel~$JG-|QeO&M_~NW7>qN#nfaWG^7Ug z3qKSD_V#zz%BDLmrKT&<^9^_3>wB2Dt8Nu&+?ZJUqxW(FwNQH))L6D2XFB+6A=g1F z$u-ZyC-zvHX&F~jo{@fd##sHm0>5(tt=Nf7&$GENx*9!|Dj;w*ufJlog%jV~;3KXG z)%26=6s((^ndh)pzaxbrxBPD+VE6qa-O-iG=Rb6$)UbpGeU9cb;*Mn#M9VM&rQ&X> z9^MP|?Ri;kFriZ?qv)b(TgBj!mfzmEXyCD6Vntj^@X)P+fy3#!wX1~3?wqZB+hwfj zPF88GJ)DIoLa&0yGU8;QOGz%Ns;OZFqZG?r+sn0k@j@2qj70dMBnCn?8DXO1Ev=H1 zNtJG?m5C+Q0xkwb^mMgNq{K0|$D_R8f!|lIhS;Ka+laXMIK-`#QFWa}ZX< zT0>UvXSPUM>d+SH@pcmhYMr{LPJ(27j{DTqU*Y8|IELYjOhmXPTLr8%ReOsV;q1tm zd`SjKOO4&bMStnl#`}c2`J=MM#o)H3l=tT^)QIw;3klx4Y{FK^b2mdhsd;<)8LjI4 zUA?3tY!-Zx1n;G)#_xtYwDhAr;Wy1?E~b)a1jSqQ>Mjzgh%esK+E2&(>J$2|-zaOm zI-4!fKQ{huMWjh?A==03ONVu`Rxt)HlXo2ubM{=#9&D6(y@95>=ldr`7QVES@GES} zPgn*eh7@L}M`h4AZ7e-B(Tr3`sJQeSI{iq*%`4~cF{bm^ZTPsG zV9+lcfMW^lvvov%ytypa*IqXvM>=#_%fu@I2t}aFLHp+gHx8o zxT|NXr`SI8?cv24F%c(5>kV(Bx5U;Hl1cm&J|m@bs|}QCk)?VU3OEU^58-UE9& zrMicAot;0b*S@dACadpbQb(^Dk#C(@YHP2nbuLsmYRr8@jm7$4`v-i$V39EJcz5IJXtNrn+_beYQvU8B!q&FInAOIY;njyHz?#Ahv%A%>&jb@=S(G zy?YUhoc6xvIo$9wR)h!)AUzIa63OlF8~!HgwZ{4TV-YPUJv z_Ti%@eMn+Jb!HvrO##L<5f?hs&V^P2?7YG33*G`kb73I5vF~znkFc4`(Ut@VMzWav5pfH3e-$Us@owDa=_3q{q+pon@Z*Bg+?(xw zys59d&qsK4TTjrGT%M8TmJ=}xT)mtTK*BP96?8T3wc=rW|8RV;+z7g8{P@L$?fBSI z0^SDqzR8N))uIwp`jPtf#6JRVw$?S_+mLTI`wo&M6GVJ&H%9N8YD#h;b|`kR`cjvf zQ$A%*AraGqzguIDVVo$*AZcJN<+=PLST|{P@|(xy%Zd zAi-8WMlAh$QgV(t*KP^h>&+v<(SgACv!ul1o)T+x+QMyqaz>JoD@4(DROEMFSi!jK zHL{<~In`~t3_Oziutuu*fKuvu;E+m-V0ydMR2OyX{=}g0MtfVOPbZuBUZ3XlJyY;R z-K?n2Gvg^ky2Gx3DDaDaVJkYI^DCC}PDK zKw)B9delSS#`Fv3b)FEEPy`TR**CV|YKPFoD z0rd5Sl4Vf^P@(qXr*{gyt#BuZYoOo&XP^CYA*sdWhPp%d3xS3%LI5ryeX!?fgnH|E5&&V22uDT>UYITth(O1 zAwiT#s%2y8D%vL*y{EzyqihjLE@{#c&UeUqM52=%cZEpNWif{Kur98}nxln%TTLSt zDI3g?@F_g9`?ReeGfbyu(xW(17b$fptlvMsGwae*nb14y*M?GK?Yk7YVMf* zh<=2VV2+=ULU;3NnO774=2# z@l&5Ow>AyFZ!wFQMAYe5O)TI}y_v=<3XSB{lsK<-aVmyJ-$2p5Ze6v5eZP|;Pee&$ zH#_!SZEM4L{EI*m)2SO8-g)xHbe8xL(|0$+S@_>n?I)S{!4g_h{PLSyK6e;OZmxV= z8uI+{V^P+Wd6zfQz~lWUqM`Fg}40PgyvwX+!CCv zsZU0b(S()1^-j)znAEWtELc!U{@td^yK3)~Q@Kd1QgwMeU)_kD)NE>p)&|o#k)`*E zZQ7St`vXigL=!*q?}+U2QQXPi?84ukCmpV}N^*|siCD)=?En1Os(!GdX76ZDe1h3l zwKF+JM_dS=}vWgHqmFC$Q>!~Swna>6}_wc3g*XEKedOo50tP>Mhru`<_Ab?};jM&xs0# z#0NSt^W4%f7yly55rz@O#9K{y(JkhnY{|1H=40i^XDNqta?SzO%OW$jWWLzCla51c z3m#q~=PKNu=TinFyuaUCjgTk971u~@*ZnNL{K4MX+$O#@t+0w25!8$;mz7X8belO zO2*DN{~qOpHN4}#v^9OX_vyV0eLPk>M(Bj11Vf0@SqjAf zf*D#>qe@HuE{nHx$*oAE7~}<+5E6RQI%|v$+3es-7}p{a%@s=URbU6QR`QUuc(65R zdi;G%nyI++5XnKygU2~4LT1|Be4p%WON-Q=|k7b^tjmYNG%?fg}M|2WG|?O zgy4ucKqbU4P>^}(Q42HZi5dg_x^i;n^Py2ya)Z9;n;wF_?bNZ3H;Bb;r&2i06&sX| z3!a*;5h8PyJj}>=m8X@ru&C4a+7@cIMs7^FK7B3u(I=VV<6N zXH1J{dtJCvo_4d2`N|82sP_+h@+|xa^4A_R?w-$H59Bqx+a;0&2YcKRs`xznja)o6 zUI;C(VwLCK_0Z<9a(*&d^@~euE>SgvY>Vf8JcY50M=fv=1(p{QOJ-oRK)d5k2{=O26 z@;!V6Md+TA6k>c&KmutE!{MC1V#BTL>>Cl|KK&^=<$+7GvhG9V%QpuHRc;3>Y!Z^T*BvRVOZU8)65H$p zEm|)+YNSl|%_o7>4D-MD`dIfI+R}N*3|KJ@DV0$Qv)W?X+OkqfQp9R}`WjC+8rIQV zY!blJA=xHty&Ie)`3Mv>K8cx3B15$rs|>PQ3eIL0hpsbU3dWWb<1@b<^vrshON)j| zuws3vY^ii@l+`HL8f2|*e0z?ohBDCKee6>p;-6Oxw|_SgDkR%eQ2a$9a4g7LNr zgLI`wnT5WG`UyU0d80nC{=;1ANdDV`!pb(iN46JdwvLeqKfBYundM3+rL!pW1k3&x z!$a)8ncgTJqjmj#{-PAzH$C`My>3e{A}w%&OG>amp*|o`i8@9VE^zm3eMNgZvGx9L zKul+R4619Ln&zY!|A=ROi_FzMpHPb&P5+{oWT3Z_Z?we5+RM+aY3C(U%wlM@Uk$ED z7Y-+I9+Wzw`QTi%!OTEwb%)aS=#X)mFWdR`p5 z(#j2@+HL7Q+F9D)!v7=|5|!!vd6v`XqmnP_M3jJ%mABCMqqVZ5IA8M-u(C8tQt_ui zEXgHLtxIUxBPMB1AH|er!$>`mNUj!cSE0xT$}Qaqn8A1hZKpX-{e3pXu(n2r(UhRK3R{O64&)rdy@t&tw-#U^g?#qc zyziqN9J{|@9C$WaXzxLv6IaG_WjHgAN!r$VK3#~!Ku(EMC6s=yY;X-QS-H&QV^{Si ziB9IJ^Hv9DrzKoZknGu0Do%a}KWK`hIkWrNJE9%T!bWJ`?zEHF){%IC9RJ6j9hZ@{ z(Ub!Y0=Fr(sbp-L=y{i~4Wwb&9~rzmajWA$qpdz;8C9tnnN8(|`a5B>izvCzF19B^ zU#<#o6w#*|sCX;%M`~r|F(&N3sjl(n_;y37s<#Q!2qnR`;wc8hR59G|>}R5D4}MmN zDA&;!u2y?ma+6v1U|Q2=0Ly4RkbOKIL;RhS*lgNlVo@9JW=a>oIiI-n%nn-|*J0)d zf}@%acTYRM(Kf~~nQ&5!7qW`=m+2?0v(n=|sh_T6KkmC|<{W*eO=LbkmdU&hKP2@q z%d2+#xz{B5QTDh=3N4ab+hZVf+AZJEhAjwJkeUQZK!&BU&%%-bWpVw+#V}+9F>sDbXk`XnTcd| zjb6&^#3!bztk`{8>9RZI=Bilzam3@HQWDOkaPl%6e7%4;(He#Ho>!)$a>|L$iZyJn zj%K~~mkjtuzXsv41z;ll%?&6+!k!i5bn7>&W0dV33?E4(e{neC_iWzhYa}4xk3^Tm zqLA8TvtdO$G+dU)8h@^@O;Fzw64CVThDb1)y1~`YIQY$?euSK`Ze#8wNyoSKX5dcW zCovQ2yqW&^l~0ms;9rsiSm8E4(qFldntBf$c_5v&|$@|LUl)7*bJ1K?k@*S z8Zxd)k7>E9xxvDuT&J`r-MB8aS>JF{As#1(tr(TO+v(Hx;#~tbv>w#yu?D;|EWy(q z-V+vOb29i&HGtT^BBXBNNze!;EFgv~?#*HzzGFT&(LlV7StZGD@vuKx<9_pK-5d=o zmW#$!gucpMw8&~of5z}{g@R?{AtWNnT-4h%`Ek?(oC%#VZ3?H^l<+V(;7&v7PTa?hn8Swa#&*$fLDOmE*Q*-NO}6pj;ZINFXo zOq&i6_WVRNEHp>_INX~bf*vFAl7qlbLp;18w83%;?V#y~id#A8)wY*Hc&iCn7XPBu ztFjdsW?s&y58A&fPJCv zX@181LbWu%sL_qdhpqm}nHh@ux#^m(qApQ~b|?D2A*~JeB7UDc(anKj9IoH>L{bBE zQBbWtBR##Ewe;YU@Tl8TWtP*`O2*sXlO}g~ngcqjn=?%>#tIWyGe~X5NJ%8h8ryPx z%;4sGk)%ZIwlVg zb@)mV!)^gXV^0~A4O`xYPYSFVD@~0~)?L**u{qP-P9k#E5wSku462gdAz<96UNgc#9>;~1~Uzh1w?)9a665vz4|jNKl${1<+^@8PH@})5+3onnw~4f zVa&Exx3BN}|DYwBR~0ugH%>}#sl7>MAgW`0AWe_+mWEQy`alzIEKSKe-(0%>T=sy_ zR(gTDUG94YjvCpAd3Uv~RH>E8REL9J=a=I?=fA~W5LBThqfykTBJ$%OcXGI7%z;Ir zB_}65A!hWN!1u+F{A|u{n!@$Bnnz@j@u4jTkH@Z?HFO`Am34TGDt?)t0YfbQ|gW)bJ{gt=Ad{X(b=sALRsG3GD|* zv73Fhj+qYOC}<^8(V%f9HW$-VM**L&FDPtEVxVn=dLlK@n*4c8Gn*i51?_p>=Zx-g4ZgK!4X0PnNMT4} z9?8A+XbkG9bW6V6^x4RSrJr1a1KF!0ikQ<#;N>p2FNR{>r9}-zEi5m5#Car|nX5}Uk zb@(jBKaBG9PsGc9m7Xe*P4ae6LB@SF&}(4ZYp1{QE*fqK@5**UxDeKz2L9p~Vb4pM zS*YMNmO7?a@;^y+iLj9MC5dF<@fIcEi-Ij~J4h~LIV`eH-bQe}F)1M@zRxtb-7plzN_%vXU1`(H?#MF2)pGKgcGzq71)`wQgj4r&#-CgOi zkP&tGixr&v4XD;qgHGyOu}11PNh*%AL?$}!4JjX%ADBzdlY-{U+@6d8u5CsEM&-HKp0NzQjRrR1_{EDfKZx^&O8;lM$1ns23( z*!a_9_dap3uNVUo;W;f)-hDb?#s@riMMoP|R*4Xnu(d zi@{68uIf-Xq177cdnbb1V0WqeLQks@s}DB1IPR|hi;n6B)-qNIcv{lqV_`DypxZrG zBjEs_jz*n@oB2WFaVCUn#FfcRg(Q?o9Xp5HGtrcpjvljYhap2YyYWB1pTAT!u^3Z> z^Uf7^MJsUNhz-*ifoSuK#0+=^V;H<3M)k(TtX(wLPUmTO>b*oU8hc~Gy0>3a)>cxB z_-+ub{TV<7>RgbRLj+_Em&)_k13sAhc#O)d9~tCDnapsb*+SMGrHcuCQ;$;OEimZY(llmr z=#QFt_au8fn8X~lN}76_8W_nAdu-Pdzj%%b9n1-NC&Vh?dY4~Q2HCM^75V9zKfR{m-fHr?9j!PHZ;$C`DUP| zKOR?1EI1Tq-akfdP`?yddbI(0L-eQ+Ows@H{4_-qRM7d6fUP3EsyQWnD#usIRO}Qp zj)Km<<1?|IF^4PguLOF$0_lf+b$)jwrtvo|V z_<46d)^m>stl@X*EgXABTF&AeBy+d-2fa2!-*=jOteDgxe%;eg$o(#et70ewIxviG z^ph{X7E;sU$zOQQv!Rw<%EGwFAi8>2-{ZF8@R6aiG0zfBZT`42w|_)UwOoU=$dJo3 zS-nVcJLe{+X(u7iiJMYs&a0xx_HCo`ZF3Co>;;@_6u5Comj2cq(GLpoAGe~XUnP1M zMcduFWwv(m40$yn33r6&Vu!PlVW?= z;l|`_xAmavutR(*XLd1MWxoheNtmm&UxQbV%^?M5sZD)Md-=(KHAaInx z?RAczs8)=28d*1bK;%ZKTUUoKJqXrXylEW8={wISiu|zCP?c?zJH{^N(+O3R&04?y%yTj$g>+VztQ&TGE+Mso^-?}`52^x85P}_BmNs<)*ZRgdm>IT}JY5MC(p4Bc~=)8c) z1b4I(7r}RmsKQyzazzJIAl;Bgl}8@r7)`ks%Z z!H=A7k}Pf=60Y{zl=pcvuTlRWi=FPyL!N}#Ue`)U#PtaNaqITTszcX4wumAh2l4Dc z>Zc04TA|&(UwF~k@kLiynmYNK4ynd2M4>NPZ{>u)`ha&{pm9PvU-sn5m!d0r zu&!q2do)WvfljTMX`gVRdwyV9Nj<#=VFtYWE;@dB@y3&7-D5Ti=|(lZT8alpuXFax zB^{HN7@a*iu(GKR93Ws1L-lNOwilkP=S)m(-vu^q_hji9(w--IEwF*V_8va#V$e`f@3@;`qm-t65Z#e*^v4QX$bMwW?PkGnw=-vGfw+4ts^b$c6#f$ceOECl81eo zS44>iVIY^wy0@Q>w?E(V@k!Ejk`gpRIz`bHmA|~{CF&p`WW%*~UPT1M`TAODd^O*! zABjjq7PjdqZRm~YjtwNFD6CDq@(u;oSYdzN82;lHzw3INrq`qwhaYx_4konjRjtQW zHd3cZRm<*muEA|}x1))!uD-lPq$03-smFjxxO`#eJZIBO@5@HAi`v2iH!^HHhZ|sv zJWn3neHjjE)GlI_a*eLO4oz%zU8>r(tc)>)^xpkCEho4(=wR5@7?F@uwI6x7IGEqq zw>~Y%)5gv1#(gXA$BWxrif)6WvQ6%c$!>hbxDpR?L|Lv-htwa?joY`Y8ZoV zpEEdbd^7n|BpS#+;z*Is1^o)y9;?Z0k6J)Bjix|S5nZmWt(^LG`)pmurKnEnACLw& zLfki4qIJA7!_(CPJNazQsy|#FBfd=980-X27B6qQZg5|osM-zn>X4#sSkjsj#O%YI zdcu&p#Rd};G3R%r>mvB#;`zaI(W$+FU+VHWGp>{7w=cW0Z+hrw60|+&YP`D*nZ1l{ z)e*hvqZ8}!{ludujhT7TB>6eE#m=M4yD_k6l_|}wF7OV7sM=AW_nO6(qPhyNoC}0K z_$43Wi6s>&>`n6s#bu&ct6y_do+D$|<8nW&iEei)cvPpIM|SIWh?E{wID<#3wQ<|& zBJuOIuqq9&-5!JeiZ8kpaCGk)L?NFxW_IAP>ZZw^wd?V88A!s37`-vuN21Sf#Aa5U zN6$LwBA}-DT;ATzQlu-&6K~}(W{FAP#o;4BsWfJL6q7}@#r{C*JwiBVv3B)=vuW#e z0UF(e``rZig;ky!&YZb^+xv2Q0(<=d;#%VwCW&YRM~`-*<3$u| zd@*N=sQq~Mdl=tv;*1nxj1ne3c#~4_o(IA!kva-yLJEjlVZts;4-p@XPU}7LvAdI9 zj24-UQ!>2Unc7-UsCWJS){J%TwO#3tKYq|vI0yAZW8-*TCf}b6*16TJEjgcS9IueR zR#9byM}{lK*{QCgnt?E{RaU(h{yb50rHF{pSN{uiOk*)y`r`V-Wcth{(z?SdhVJZ-Q23lnXzit zyNxJfo>r;e+Pt58D7>&dZD1kWPx?HegU~#TicUMCzR21GpMfg!?xbe}i1&hK@Xd`B zxmM+Mw)tLn&8pJo#*{oqofdXCJbZKJE>}EbT$LjS0h5n{-%-84%>5xphAp#atw_g9 zOEAK@bCO$!JD25#d07l29&!o`IJPDCgy#BKVKTQTzv9IG_;zzUBLk(u(>V#KK;9#2^P^<2XxiRbtLLP zZdX{(8SQoK-BGKg?b@~=H@xY&aV;BjJ;A5+vXWc=`7*-1trwze&1?RS5FY*Ms}3UZ ztsdE*OQ&7lids`oy)|I&_);^i!u*5fhe~mG!+ZASCs*fpGj*;ojr&L-hY}+YIrL*7 zG2X^^@xh69BbMGGQyqThPMp1Rm@mD`HE^P+@@oZX4ZX%4cqwqQT9}iiM>rxGF~@v; zZw)m|XF9k0D0Zmcy`QH_N$I|i)WzPjRj=i02XlB_!N`6cy6<*4<}@kc;be+cL>-My zPF(?;)thX2rD?!E>7eEFo=IY~fuS1oQalAcm+OMayrXJuIR_67Pp%FxYe)A(~YFx1!D*8~UF3D%$*MsBYMH;d?NjGG%e3%dr`-Vx)$%V%DFI4rZG zZgo|>20!8v{PSqz2wsrd;bXQ=l*eHhNC#u7p^jja1C z^3sKG`jY3qGAZ{j`MeMvy}4>siAP7Vmf1?uC-3E#N%AN!eYo;PUGLZ{5_p(X&M+0z z%zgOIocZVRp2}qj)@)72$83dk+_c%LUHLwS-46mj5H6FNPYbXSkzFOY=;1c9Lyfg- z>Ct3{e5}T7zQ`p#`VfM*oxU+O+%E~7UpZ19wRwEJ4=+cd3;14HL7A~B4w%{L>GiZ?6w%JP?8 zghuw<=QoVI_U7rkM;@>$&65nxyb3c~GmT-<2v667NL;=>!lto)j{YE2)cm$2Q5^h!f*rodoFX%4ri>)g zEikkIZyL65y7$hdU;y8_hf#X2;Fb()r+Z=!9$Lr9w(#LYWp}0NP&GYyqpXrnk7=hv za?i$(aNX>D&-TM@(9Qmur>#jGD^lntBW!ntM$T`UfSCAe(q7EH4Bvm=@LJyQ<~bym z&>E%8Z(svCUM;^Y}(YAv09Gzf@@*lrgqOC)QY@?yN3v&-MnsX5Z-IwwE1~1 zz92_^=i?H?I(Q{sE1X;&{0EMSblIW}pyQoL~*x0)&iL~jK>WVvF z7|YnB<&{DYmvb!N)qL}RQaCa^mCIW%!YT>gvzA{bo|Cd_^zzEr#>0%br{FFpIS^tY zLR>64@C|+ojhU#NH+!~9ccy>gF-tc7aa$H;vQ!Klm)gn1k=A)}p$Z;v+mE-;=3cIWAP57#5A);6s2EREpE@L;Fv zF}B|ah$;V?2{ZF<=0ZkWGy8_~Qu)RQAC;q|22!MpvTnwDGV|VDt47}#^4@qewO+Y3 z&z%B-+WiH^$8EC%^#?8Iyv`%3M`DDklSuP=1ic$L*^(*}ZJW?r2t57GpH*t%I6e(E zPI_BBrjn5~XkL|?NkTEhrGloVjvW$&kDf#S*?!qxgwR1fg|qYdmrnunapJ=}ffDd+oT>>=pD55yuE8(V;n@^ zN&d}@ree*zrlDTT9jY4Y&RO6g7~MaGU2Yu^cUhd`lV0xEJVvcI^dYV*qWilP{y(I( z`_VY=8kRvUQmLy#6%RP2ws4)Qc5fb4chn$Qve*_sJe~aZW|nh`vRONUL<&K?_6_Mi zw&>0}EsQ-#CllJp+VM_c>vc?gjAvr`fq)QKilOP`c zT_gzaqXyZmj*p9&bu%gEdkv30`ptt265<}zJl2;y$11s)$wsz&ZS?Vl!*#W>z^ew+ zv;+^fS-yFF=rNpT!8#akCA)Y?LhB0YY(~?Rw0d^)Q0i!Uy?W_deWLtQmhWQa@(E4Sv`lXZuYfvs*P z%sQVm0*>PG~ho`c9<=QQV$TWBRM^w#*l$2qm3z#Y67d|2=cV2UdO?O_-Os3Bj zap}D=IC7=L{5m-99)BC_`^7;<;ulP|rPh?^EM8PCwI?7&_oB?=niamrntnt?qsNdZsc7qy z^f;TS=SjREi6UawjE+)NExt{^N;h@xo3kZ`CvSfxy1S;q?5kWIm$(t_jkU?Q!HrL2 zD&tb~IRxn1MgI=~Q9!Q0T#?uk8E1OEwa7dpfg@38UKUr^e4uBY)d@#<=1Ff?ZL0%& zBx&eYcZvD#U415icLd^79&jQD)ct&Ij4YPw>9^~wPMWX<%+o<+4V>~>U{Oibfxm}Ro#48Iy~tA=;H%?F&XY24gvgAHiM+KcRuAItIzeI`Q(JaHy z)!3RJ#YaxqotZFY81`6i($!Q-wd^M3rm*piNhY=``G3>orNTYXhsqm4Tf2u*8L(Zx z*D3Fao}O#*S_|(2;hZBc08{r9!}PuuPeL|?Z!V5 zzqAdQ_$1n+#~tu$DH)9^GvXL50~c)f_HL);lUJ9AkA&h^4PXMAn!|p zup@i9*~8k4VMA$NA2(dove4%Es%|gudgP?an%j=UYU9Qv*%yE0$NgK7e5IJrl;niQ zJ6b&T$IMGA<~liX#mju_eB>=Zzl1x@P1|ZFio_>KY&2J0ZjN%&QQ}sclQw+e^xqE< zfc3}v=!=u4*Q#W!C*-H^0%RfTIvjR-1c#cq-_R$G8VK?%AQt|%P=!ODo$mPVzz{iX zZwTHbLLEmmSUZ!RwC>y(5KqqZhfi!83p-jn^Yd?hR)a7f?qQJ^w>mnV<3P~THrnYI zhjVHh13<@)*;?`U^LAUo%Lae8&(3@BN7{Z`_C_yj*M`F7M1uZ)@?O)>tUgs@fJo-& zI2y%$&LugG^R(#({lY(3m;iRY<4Fu27wL9XTU%M(Uh5aiQmq`Gk766%qO-a4R^gjp z{F1K(cuodJONoy3m8b8;UvPPkF6$u+k*LxF#)on~i=xuh+gje4Yk)n|Bgmip!Zs;u zjZ6FMz4M)aG3cFl-u8Mdo*Wz26^XIe8e%bMacI#HwEyt{P(XGFEWGOr*kHVAh!Z?7I)+%e=i&u- z7k{r>L}*UHp5WApdFrZKZk;u55Y1|B%Gg($!5)RVTHbTR8BrIk(c!4jE=QBOP{6{( zU&XOItSf&>4%h~@y5}gyBklwvE=09@(1QZp8TayoHa8WU<)yfqFm|o)u~FX4PI2$L zz1%R$Q~Mo*ta{_m17aQX=8Hf26TX~Ya}GPny{MU&n)iUSUf2jU@4NVzANmh(sod?!v67FgHsJy(x&rWVd9({So4Ir%pU-9Q}IIYnW>!>YV5U+PFoV|ab;bDwdi zXCQKxH`bj=Juem9Jad{i?naz=;!cXBEgJhD0xPpz9Nn}fE!u6$v*+%=U9fs$6JAKD z5~sT4L(|a&TVZ+IX2kSI#sk4ea6k|fNImQhUe2(bCN7VIEG{9IV~=Q;;ji_FeD9Qd zdB^YamYeUm#3zj>OAs7?_)9L^K|7h_M9^bqn{0w`298Ek=xjZYzA}+ z|MtWtkTfxn>BSs(Y^t*E@W)2PkA;*2sCCL6tH+S<0&Lv>! zbG4B_-Sqh{e%=l3E(}Ls0=w)ET2661$wj(H1=$gq%RW{P_G(ky@HCtFHncT+9ab+k zw-Ytm=@a|4$<4#iZ@SuTA{D`raFLXjwYKuXWi$(JzEJ0a-=36Ifq7VD*pKe-nAlQ-_(e*3MQ+(l#t zbMoi+__1AW6nNuRKEJ=mf826_@vexy{;9%$zg)Hy8By{YoJ)*T zI?Ex~ZghLr*eo+wwc$(+g38B_`YJLCBu9DRjNgomFmMjlH9w1qtIP-KZhzqM3=1v3 zu-z~?M8=Mv)tp29aB1ej4zRrl!$~Z871Op{<<)<*{8sDEvc2Y*CXV{IAI5o&b>`6L z^~XwBP<+6LlUCMKbe$uf>$`&qy4cltVZhQ&yq2pIUKO}d4sKmxk1DqMwQhZJZ|}`+ z4qemouS;aT{G_n=DY9lad;9ILo6e2mQW`9m8%hxP#RCiBA?6DWd|I&gL2MLlAlP7X zU(bZ2&e#ZpP*)N5+_wj+k?)*jjVF) zCYeL!3>q7gDr@vrX&L!e9rMJ{%8i^hk$f!IhEsQp5(npWhM#K-iP&*vqg?U_3iL&p zrUxHD!V9s`laDL6xzRR%m;_Bx$|+72zQ%GvQFSVO$5nSbA95>iSs~joN4ce2d1N}e zpq^8oun901nV+l|HUs9qpU`{V2rPHZdCzHircBDcKWi&otc4_Qoi%G_?c_Ov+-ePa z-3rgU3zXrCUh9m1UdtcomxJF3e&X@TyK7h&J{<4M>QnE_`@8z9Dq`_H&O|d#w9x(K zhj}g_dvNghulfR}W2Ui>^;bxqz4yKv4F(v>B>w?N$&sZiV#;OCbNwv=gr?WWfWf?` zA8+{VXaBOw+u0t#wmF3#A9m(YkXd4Ed=LRL!+Z!HQT$r#st;4$7s^7wyOPQ~c2^10 zb}smUk(Z3zPyAWpB?#eXcToO>*D}##cQxFD&^MD}j|} z53M{yuvwg_%DD{YZkk9yS0reTr z&**3V=SxE@PQu{8B|ewq{&oI|?U1j_eUReshLJ@~0K80Q&O9_v-DERne1GRXeL(0s z);!?Xmw`AV8y>!C*f;fIf{L@dq~=Qpf?2L(OHd>SiBdcS%?Bpj0qYkGf?*dkcKng? zGQY{s9^n7X5B-2Rv*Y=Bv62hY=KQPUs#Wm2Gi{^#i4k3_RQK;gzDY=4T5>pTHV66OM8xo(zq; zL4c^@=4bwIrFLal0TIl+c8_Q7S{IReYl)KwgIo#t19F`Cc})v?HJrK0oSklIKiJ){ zO6hMDD(_rw?lp4h6}ZArGup0j1>UlLy);q$YfW$_cxbco8x z>jzHCez`SRLlPVGVIPN%78I|qeeJ7WoCJj< zFI1H|+u{feofW)(7jW)3AjgIrI~9Bnbey$g4+osZrmXk*#|OOr_MYxdr|Q3stN0L@4Z`yiJ>6Z(Z%&G_~95KLMaY^erWf2zFvvIpQJumN}PYBY_E) zGE#N$o4oq*WE&@-HJ;{Lg$*hfC6MB&Ne?Ky3uoDGw5-11jrLM}bGDC8nSlbu`tI2X^nc^m`Cv zj80;Yjs09OJDITHKw!4w+A-HMZJV)O^FkOn9`*z~03mFz@`zT5s_!D>ZyX->0k{k` zq`q0WO1&>|n;!dV8=A8&lJhbCV4#$m3Kbwzdw=9d^Emt~r0?HvuT&_#N zhG72XB%%7@cQo=gNf;LQt;F|Z{F7l)hC4h@c^}?!<3I&|T8LjsO-eA7`NkiAi6nt$ z;UnjggZKDJ=sE#e2&p&emwLb9(ep@w2PX$AN=(SLW^IvZ3sD3 zrq96@%Z&qm_(?F^(Kd8QH?~6;6(r$^CW{uIM^eolc}N`8$ZmVT8f>;3S?A`2DG;77 zwyL5>nskn?(q)Q3_cKhd2awC;R>3jJ@a49RMkov%;K(M!p5mVG{;KV#jc5{kW0NQEz2H*Sd=jlIw_Nn2swi<@x zJwRU-;6-VdyG%#$B5LLQE8dG&0iY$F7W3G=`MDn)(__JRCmn_CrU_L|Jp2fvAKPb0Sl(!*=bamq*#^a$cAp;s|BC7n9S0!LZU{A0}Nj^B8M0M zd|-(23y)-WI1TcXf8R$;bBCSHq3OD~)?{!Cgc20;-k;d6u_^Bc0A}an6MoeFQUl(6 z^M~A3#}b!q=T9Brt~m;qXA^Td$ho8xY(a!gjCbX6SnOQ}9Q zm#hmh$9CUA65WJ%VY(r8>^m&>yJVHYPAiZx2R<|%GtKBmK>nfD%T`E_(MK^#MD_D< zd^>{jUawUnl+Lk`OJ{L)t&dGljNJzwDcNZlBue^z|_*a#0USnxmegWqel zAzk>&@!N%;PX^X}>31Sd!yFpe!*SS?t^mc!Qp|_;fI$W8vXna|JdDc{_}ql zrDXh2XU^cmF*K~F#-6npMm}8BIofeU&x;S>H4ZRc!{;CA1)JN9x4!;$+2r>HeEp2U z*CizP0wYX;UDl#>lFr1dh1#j)m_A zzuwZ~N+TmfUOvl%ATItZk1iOYovdHw%LBm)=M$g&q!5s5L-1vT9!z{w-yLS*w%tsP zGzq66LYD=TI&X83GJ(RLU=!SaDMRD1&!x$Mr4^~+?|kXPgTlP8Nh5{gKX?qLjDJ@m z05BK>MvcJ(DUBK>yJvhv;L1Hi*oZcL5%1KStfR6D_bP=NLgn~;!D2VYZCz*zC(>x9 zc{emC%jFE9QYO($`X;a(r=N-*iW$2^wZl_xTU4VVaPT5gFPW<4v+i<0w?Qvjsv82J z$wp>>W4(0PY>Zp+2xPYrm*XEZ^TRPdC?1BcmD12@JM-mLUm5G6y52eSU;M?geIhX5 z`S;%l5H|AW2AX@pr)^$A_=r|5Q(6CWE5PkR!bi&e%BoBotQzVY_k>z;ui zaZKQR1{wW&YhfHh#5Vy6wu=A@9OqX@j&BcEZ=3Di0_p@w;#LA5pZ(1DyG~oMJ9a}0 z&h;9vJaj`D9v{aI6jP^1{GlEs?Km3T>cTDysgAOt*wG)#$F%Ib*Cku_i-tn_%%CN| z&o*uZE9io`RO9rfFseCvtS9<1p8&12k5q@XsWuOLx@g>IvX&vX)iy8hN6#BUb20hy zeRrTT4%&A>T}L+fnj@;dIoNHiJ?7vHENCaN^1%bQ0>ATHzsCFRvsSb~HTPLRUhwkA zNz%8tgy+E*-IROjzB>SOzT7{wtlyr%D+T|?8=ue*{b=3uQDA=Xqsb0knSdx0gac7S z_20j9HU`oVn^HE8zQ^AQZ$8;_592;Fc5J3mOvKM=@n^Fbwsk4QM!>6=Mu{O<p;ZUs5`VjFY= zB41?{j6*=W8b!JvK@{z|IW@jGV=k{oWS+2z&G`=U+*fy?+!X){eFELOMtv1!2br>+XL7oFaG+F&JA1dFwB|H zaVtpOdT7h@B5)t5>?i)t1wyElPD*Zp4osvzrl@Rhhh?%4!yvZ0%s1VRIyB3A)Q6@X zAvtWVr%GWG9Q3KVE(Ek;Gq1_Y5Bt>Dya24|A-@ zL@G-f+6Fzm46E_lnO z&aEDAhv!+Dud*fgZwIJf{Eu8$1@4?Nr^~4KL>NzLP`flIZ^%J2 zKYi=1uZ}ZG!Cz-mNqlpW>&#qgXwApEKhhwCtzCUpbMtjnxU2`rk9@B>VjM!?6?0#D|)KR1z*eG$_ zH-Y+nxkqUW2!XklEHxjk-s&~mM3>@jF@7AY$_=jhLuA(LKs&)uZ;rRUUJm!khFg7f z7#<}^CJpZMU-;79Z~po}%e!UI^!NMxXUH^56g%#ETO2DS3PTwi2Pau@Iq}5{I&46W z#5NolFJFN#N%&sZSA`$*S5DT1#?na=?GR>C-C}Iyg?oyDB%kA2s77OvGX)X#a|B>e zI~RhVQu@IkVDZnx#OeYAc=AEru_k`&Olh10++-@&eB+Dn#&!_Vfk*0cjnK7nmGm0h zVXP)=VQu$bkxirty=FLLEZg+ng9>$Uj45 z<2q!ORbj5kOBwcf@Fj z&Hb@4xhOfltOwGva_h%zr^GKhQuFF}nE@Q?`&M~@&V?0+o~Lm(*H!f+U-D0=6Yn}P z+6#V;K>Y1ORV`7R)nuKW-FaKVM{QD z22xwZSGS9=id*^FEVP+zyesfqzy43{uqV;JE8w-Dbz-DWthS4>uEg_)cf5hiy5q=t zYk9SKf?hu`(hy~*&mnMD-L3#o4qy@CK>v7h8Cjxmzp0o976j2t`Sd9Bg$*OPv5`MG zKK*@K{B$14F}UEe8;p4VQ8Eeev5)Q8W4b3CuM}G&Px3SqSmUr&V=6`Sjqjca-3alM zjq{9(T*_6zC@rMqh?v^lcsE2F;4THbTdpBgkj%%F7| z8?rC{NPc46-x{<%i2TNe*Mj?hGmy4tdgd-KkEh)EfxeOJUdaY^K@pNE&x*dA~-5A!XO z;hxL}vi3qjCIORV!3}u1gF0_MCeuOfsKf7$vvl`Y7@!iZV5(F;dd12b;`y3?4v&X< zY74Jt&-iF??)_b$jbrA&A24ms+Q_M=XL{_rW}=~sWN(hd`}7TcMX)`?TX#8Q&yIq| z!Rg_j?ooJ;zl07(9O(TyWecXcbiNY1Q62!Y`ygY{-QE4U|MX9}4Xzl;0bMXHAMaI+NJidwQ%5kkvNygZ~Z22&bXgO?sXTBvve@k8&`AWO6isaQSs0)ezOF#bQyIBv+l(2kMOPtNH`Do*Tym0pU;k49S-o4*d64)WsX zX{0*OPbFjTFEbEO?l0^k{UI|JKVRU%@!mifdB0#k+q1yqNs2u&Soj@nHUbzcp@8jS zO`EAjT6tqQ>PBq~b?1<|lXuE?;>ciFi%6AaH`I=8Y_8=YoeeF7<^q3i)Oefhq&rle z%T(=~13=QnV8vE_P^aUV(4O{I^%u5^ zSvEMMhS`BOj=|OhTpLnZb99u^7lVxQo)%sO>y}_pY{&=24&k!_yiLtoStm7rW=1xv zzcpU%L-88f!b1*)V7nHssj+XaC86==tD=2}5UbR^J<%#kQ7Q`kjuTEp45O z_XO@$D|DC&KDOkVxatqpQ9j7QrMB5q)N6$?+{R5?%qK)-)RITmF`E3Xq7xEOQ{^75>4UGMvxr2-Jw73*X6RtJJ0rw!Q-8FqBt~Y%fzk zr(0UFSbWt{-(@Pd+J-j(oV470m(>p0HJPhM&3Dktj5AvN^>AwQ<$GNjjA-!>G-uX{bz#)r>qp*JZ3F>wu&RfU3S@Fi8|9uC{$QSgCqP5u_voi`)&5$q{OF@YVixm@wQ-ifd3;V|52sL| zClyb54{l6v>USH)*Ide%O#xOc+T|kRIK<3zKWF>>1e`N{V1DS%JXAYbxBamm+P#`C zUVd)eYtlYAB&hK6oIw}fK1zWQ^|5dQ=8}XG=H^lEL;(9+g@Ie;1u{ESJB@bz+3)z{ zW4eLEhGYHjm4G}E-Ij4;}jk4n53>P+mh-LiwPEckDE=&ocIHx5-cgH3uSSvB>S z|4DEId{7a@0l0*;*gm{)aNNW0r0Q3X*Uh$WmhFG?q24|0l$+J5k0KXxw;#HltM(6a zo@OML7i2pV@s;=rZ+)kz&DFm3>It+m$|Um)z}XcLh+)M~h3qRo_Y3|jLp{^89`nlC z+v{T52R>(Yl{`MdHmIECC!{UVb`PCn*4#r(@DNQvabasyMd7z7{007`MPEv+*8bHRc#@bZ*5_KT6BR6yi4<&Q<3+ro0#%2J9oJ!Cp)r zjzq*APolRkp|P*gg^N(CYL4u7sxio-m2bs0^gEfETEe-xC@{d1XrO)R+e z^+Py1fGTtA@QPj$)8L^NhPNT|S5OF)NtT>AD3kjFK?Uo4n6p1+T+z#xyBgW9JH$qV zO`~F8b!v{XBE_6Vmw3kCZnncmZjldzhiw{U39(JRj@*V;CSN?%W9U9yRpa&m4%&l0 zF&NqdqA^R6Hg3Y=_FROR06Tl!L3`Qg6%gz%Pely7v&v*S;!U#XMz!iGfJC!vD{Br? z`n>O}e6Y8iR0gE!LX$BXWpTBu4f(jSs5n;&ZccXx!0~`aZ=L3n|FW;=^t-;y=d%Aj zy*t2~?1_*CPV=}5c=|NY4XSHEekaa-Kv!(u#O*&JzCMGjU|!)HW^Dk|w)U}VZP8CV+SQT^a#$TW zO7QP~PTKp_hk8Obgu~uIP;Js!T&g2I94wyE>=`jaf1r1*%2g<*n8gp~wpTPxQiJ^v zRM81y+F6$<_woTox@mB-i^l0LD*9GD=keRE@K{UAbu{IY*<{0&0)1bYG?ivExz|zE z)rW0I=!`=_&EudZ&N)<|;!pqVU-xsg{VE`zjS*;YtU-n%U%}suO`kef@FeDU&-$$+ z)8=tpN}t2yA)hvY8SLgEI&6mBnK8^%CERyfIZ%X~ZuJR`Sh_TbYB!jaIc^D_;ffdR zt{ot}L=j(g*ZRb~iC161v06e5OLHn-Do3ym%j-c#nS&geQr9ny8%j2`O{-=Zgxwb;knW;&0kaIkIz!92Rs0%^F z#htBBR8+2EoB*+HsEGvG!C5bn9kue>#U@@3Pkw4$VDk&e)zK-0BZ^x%$q0O2d(@O+ z`EdK;HE^!ZHY19CfuvmCiE^Z9Nr&_>9GTJ~ZcKYE`NTyC#f?7ZCnl6mb3L*2LEYA5f`Wsb~W7E-0Z;uU$kvOf7RZPJQF(?*KQ zn*+j`9lKW!Gtl62X+ch9f}=w8E44fzxG08Uag5N}5zQhwQ_4qK%`|+@5RCuj#x&Fx z0+6N2cllKnozXil))zAi01mYW3*5aFz`%xQGaS78b;{A+$5>4qLzZkRW4p4(t9HcX z;Rs_h23xyfF3sY7s9-x;>FWFyJD&^q zoBrXP{nDR)_c~MVx8rA>GC_K|&((TAOVEu2Y;3tT$V-2@TMKsusP2Vyo&z{U)t!Xl zDI}y#USy~hJwHdp7ltT%BDqDOU?n@^DDp!eWvU0Lla?;6@-EMzw+yyRThg5%q{IrH=FK>p@t)>==_*maCq&z^I8 ztkNUn7rS{*Kyo*Td_G=enGb&JFD0=G0nrRv&+?tr-c6=al)-u`DF2VXlQntW)mke|F$gh2`PR4LB&crbBM?P)3z=~Nk?xFI;@g9pM9EO`>;;2mq z<)|H{Q+O7eXaUapa}7|NgNI9F&($&A<6cf$*xCU6rC4nCaIhWG6eD=qu|PVyRf*lzqQYZtRFkM8M@EYK99ui`U``hG<#@$X@)91T2TdK9j`~BgVw!`)2?JbT zmKAW$QB~bM8^(cyCYSSEeJ5}pxP$XLQO=B~%%wkbnHMXNW;d~U#9KTO;#2>40Cnkj ztX-)9001BWNkll%lnIE;SC*R=1o$LWj$p*Vw-!8hp6x+PJQuEv3Lz=mu`ev{d2iO)%b5c%yYYzrR zw_KCkO}U^w-n(1r^Ond6m6fph?x=Ki2IeXQUwLuO(UE!!lFHNzDxsA=lx|68JS_Lz z$u9(PvgI~_#CQ9dTlow?EL}H-U*Vq9>9~W2hl;!fIP`oODD6YgMG&gvNDw~DkJZph zisruEpZX8}sO2!b0qsFmj;5p0i)<1)$FYR7vq?^D?gz@?hv>`~dq~VRN8m~0Y>3jF zg8__XTTIJNvZLKd0i7kmA{OUxoY@y5>gDGg?GeL6)&~zUJeW|~NBZ$5Zeb4W3hSo9 zS!nMvz^1P=Vy_8J<1pe?N93yS)pAt^%U-5_KM4WvazJ^k?AJtF zqtow^CfTSB7#SJoJsvi!ghNcdh;lWsoD9f%x08uC2@Y2x!Nzt}QCS}y4RhU?jUyHZ zXE{c$s?xS7hdc6J7eA3V`U7=eLV)Ne7W3{Lv5kbI7&i6lkHB=C7>j8>`uqNu;VN8A zmi$zJXn@49^~?#jS3ZjGg`Y9oZ9Y<5CKx2yRxEeLqbj882lAq&?%Cp&W#?l1ha5ce zCd*XWM3-q6Wc4dop|&6>I~71>FCSW@OXI?-IX?gRj;^--*?_ihGh&f@-6&rV0~J6P zKS1=k&G)T>B)Tog(|tOCCxm?m;P_NgF8fXBhY)$nc-)id9RPheh=&h+>gZ4Y`+wwU z#@?ZlKA5JH2vq;Kfk+2*_c}Urm};l$>gSeYY9K{Ve#>+i-QqQB4kC&=jO*w^c1?r;9HEqXIY(vc6Qjof_OYD85Y@ zs*5dJUYoWC8?xG>QQd%T7B`BHuT0g8WfxI~xUzOuomF2<>!l+v)@4=NkL{l;hWchy z^J~6AR?%+>>XUzcOOV;e<^OYD+@kBnJ8^zDPG0yUJ*?Zj@@v7AX>YL4`9+~8KEvmS zJqWG6kwCpDWz+zXlBn~Mgmr76hOa9HI-v%1#B?l+Ft?ah!W4fr257x=55JiTx7%Px zLZ;VJr4YNE?`Db4&ImLuds?(NX-6Gp8ir$*i6o}IM|WTJfDq}`jV}UQ-#?g$zB!TJ z$L*2~T7pnKMA~R~*u8Rtw!w#6fVk1RjrOYDErx%Iz^dYQ4n=k3Zd0iThn!TK)*IDw z4?fVNu)tM7K#^es&rIs~d#62xvlWdK|8%0yqK4b@D3Cbn>A59$WU5p7OOdxGB3gTsNH zaGuT>*8FxZFoUoEFrHlO2K#^@pIKM&Zu=ky>;~RO5Oy`q?TW*PCM;l>WU`Hg`n1zt z3MZ!#%d`sQyN$|wGXE~1ETQ`a!)rRmq8{qfIR_V_jqK6gPtETJMwgAi%!+xfw+Wt) z0^>d#!8vCGK=+hI%7~aG^YP3XpAasCeBW6RNP=+eQa7_UU4K8XuuG z**FVs`J$?H=0TEJHb#V#hFmqrg!I&~flYSw8Fr*_yEs(Is<-C;!Dg!`>Anw71XzFR zz09%-rpUkY@upXd}l- z+qT|c#A}0}=vc58qoN@BA<48xwbIy4h)e8({R3Ex7B^5dl-n+&bU4uRytm;{gvUn- zhajO$KpSGU5r1v3^*SuhDNJS-cz6G`x#o+b3ap8}b#f}{$;y`x!(4Nz2izZ0?2pv_&zbIm#Cm~*YY*Zw;DoKpfEHy!dIU0+Z(%t%W;k(IKXQ6DGT#NV-0u$r;JO8o2Z}$i{ z>EcnJZdRqi3VrH~f3Y^jhM_A*@v~DXdwfB6XAw^=2LfYJH}eh zLiDj0g@qSop=um#?Zo&)`r=R~c0PVDHlONi3zMz$V7Z%g@ANa@WF5d;PxJ{4ww++F z;^&X0;-oM|HUE0qE~V>s9MXNyFv&D2)ny5n!1a?N;vgJjqdgsFWqqKx5%}|yes&`0 z#v997s$Odxjg`dn)$<`*C@3!kvw|cV0*ox_%5*l*iIT^8`_S zaYqoFwCJgP+m0Rfm4<&|@kFMhtCA6>cd|PGNAocWhwmw|z?! z;gX-g7eAZ@I41k*14PaX%x2vZ`URkoa#39xwwqS!?BP*?c`Wfvw3X8%EMwz7#rPO; zoIJ2&741FhwO_YD@UK$&>T$Lv%JO(Flm{!`Z6lxUQ(xvrQ@a}sG#8Hg*&tJWS_3cN ziA`+Aya$7NoTy>lRor&wYP0F{$UZ+E_SKurL$=?~^$Xo_t?vQg41Nk<0NS#51iFbx z=d2L6@U;<%)P(XRap!WZv`m=NwvI=FlrcjOVrklYbc?gfBbMowSAz^ua>qZ2@$bZT zGh8@s_R^R{(tMgE%Z~w&?%i}4aH@G#)r!!Q2mC%YL zy;L`$aXjf4XF=0zhgisAZ4Zi7ZCu(#FRK)xKR_5CfblR2hcl;}s{`Kr1IZcC<_5HZ zi^i(eO5iS0%N{S5k!*g&rLGS(_<6B?4D|zSDQ^8f!;!`7{u5*oNjTE(`YFc=LvEbb z+un$G%SjIUWR~0}Znr*}`mS;7A4&++j!D6}RTpb8(lq0nJW%nn9|E#o_CQeU?3}@;X zRg&va0`%3LZiifGVXZd=4X9e`0pgTtAJ{d~@4Azx{^f7GJ}0NQ02Hg-y_NyNR7D(o zj5E2d@#X-XX9M!KA7(p;!|?1ZnAgn$1oJQowQ%Ay0iIBe4`2u~>E~320DXa>Ow5&6 zw80_M2eShWIJK5=*)+app5 z;7I$3be;-U4N^W-%c=2;Icsds?c1`5PDjh9<;eO0w>L1-%C6${-42t>xjoDn6!Sb= zthEgD*+ium)v3mdQXTS%p-tKLEuGpe*}fRI{f-NaVKB=PEV|~t80BS*l21k zOc#{J@#RcB5A!gM!SS5|o6T#i4npLNy^0(x^>N@jNaERk*|#n!d0h(TdjkrBN4@^> zfAsI&LonRuq$`*4cB}?&DZJ58A@dLDEFtX~hb^~_>qMKO2`{eUbam&yc`xogP(>_H znQTQ-SV2dP`5cRyRv#B(j>MO=m#tp+x`A&%HEZ#JK5-)sm`v)8zC+U%c#X+(#6`3?LCV_}<=`Y)m8qH3u}v=W7yKIxtPJH9AUp%DJ_t zHQF7e?NyfsMZ?#qHs(L{um9WL0WjpukDUE-NjSTTJ9UBD{ysC;XZE;|;+Y+vMSv~Rk7R(XG+>8hz zgdK4jXytp+TZO@8?`U>>ImAeFK?qum8ZYQSxws({|8_?3Mn3K0f%FaOqShNr{pe zwmt9@*ShW;+$&EGG;DO|MhZ*xIu+5xErN{0tCavwetOW3*biQI zVWrt*cbD{Q+X=VEXsIhC$m*VRt1T;V4+r`tW#DCj1;q9qGlp?<9&WzQV*;7O6}AV? zpj~X+@Lz%2CT`8Gzl<&|V!@-%#Uynvwg$`Lxk)xkX+1;jw)-Q?#|5+g2H` zb@QqR*6NT?J#Cj$*#v95)okl)n3kXzp5%ZVEx5fcO0WO7e8)JQ;;ACuS8QzdCcUBH zPabKH!Z-gw;Ijoii~KMB!QZa{<3TkE5E3Q3k_Tn)IMOzW!Cp*X;12I(HDD_GH!&fde9<^WXcj(s z%DVIwP9DLB636C>oHWc#3ss85wpKp241ZnF8S7DySg+8mW!2NCaa-nB1^a0szh}Q4 zP}=x6DYTO5+!4>1tHUMi&HJGzcUSPyv1Ghcw!Zc;7}52@n%_PkuWk2WaVEl@FPO4l z>L!EoT;Uf`8h_vq{>v}F^2>iI+vJQF^M!4cX9PWrWYPg5*K$ht_W$}n{=)-%4n((AeJ`l14@N>jEMdzcyFJJ%uL?D+l>1m%T;^(ctl?kX-l9Xa` zQLO}XdV0!%lFj;4PL2Vkg!GH|Lc3Q9GAjq<0FgXMa0)YtRtJwK`GN-!JAv$mvjAT} zpugkOOkqQaZjq`To%|-wfOmD#4+CK&Hn*_gvcc&un5{FZ{LBJ}{uqVUJLpKp5-3=- zGpZYEvfa%3*{HkO$V>8&vrdyI%cnkZOrUn|k#cF?v&z?GcHK)%jvY1 z#V%STgL@v=7{NCEJ42bC*C+E8(HLx(d5>ScVVvjszYhl0>)gKSH@LUI_G|z5%jchd z?v1D)65xiyhk8B$5EF9!M!8NazWQ2N)eeMRuMVjt63~jy^ZH3XKd|YL87^VgHhUQj zVPxaZT6nWkd{02T543&X-frfZje9O=nGDX`k=k|T;p8S;$LR3ML`VRKZy?f%w`Vd? z-nmUn7=+nq3E@;ZnQ)Rflm@luQ<$oPCKKgJN>f)S8;9RUwfhLq)^<`Wm|ihZqq z#(V0J&o(@5Q$NcA%&Vo&?O)r&TDAQ(Hp?u9=ZD8D?49h>O2yLKr79i7x#ZUlKyM$s z`@%pMD%vUo61S3d<$GAgKp&}_ z$h9tZLL~bgYfD$Rd#g0n*YB43mW%NKwp~Ej_%~D4Lqej zX=Pbm{qFUNU2>gJTx2!8f@@eF5o88V;S#-b*O%vW4*;7l3$*fQOB<&IVw=%@Io@+u zES(bYMc>{lc%su~bWBp@>=1exz_Z5?xL|%#R#4ei3eS8VbWF35wv#Isah6h|d}(@F zJ(ww5FXNLuGwB{3cf7ILeF#uJx?EJ48OwWVzaI5>O+vun;dvHsbl6|(2T9cqd}mbW z$GB*o<~c6*a8l2GAG95ZGo)m4X+9_Q_D5TbYGR&oJvc*Bd7R6;xgy{@0LCQZY~(gbN*UMo*1{?+yb9sC}} za0%c+0EdI|;}g%=jhi5bmalaa3C-H*Fo!$9)AwQWrUQ5cY$@{Tmt3k>jqw1uzcHJK ziRQ`H92a{O3%cw}vyk5?$d?qL*xrjU?nje+GQQu$JWfado_f@N#;EHhr!&8&Oi`Lo zJ!xI&!N2=i%e)nA8k-W3yVJ)qAj(GH-e2snMs+kOJ_4ghsiN6hKJHVy4j`qM<-aAkA{ zyOQH5j}^{bn5%)0my7k1Mq$ovl4SO1MqC<^uD^9gvWT|ps9ec;nwb=r!JfdX_Ktzc zV8s}ZBxE4IH399I6Q!}n`Jqbw#JiieV)b`HYD?V}8jeTwq>}!MgP0HHrpkJFirlVE z`js)_O`IZXKuM~N-^B_*g%B^qalMqN@&87CczU|tn@49blpT6!q z4!j!N1b3Egu7BaQ{Xw5aP(QEKDJ%QW5|GP4!5GQHUXCw-9k^i!zhs$K~ZO=J_QCU z__l5dUl&w*(MSH;wjc!&z6$JGR$?O?_<&Bom-8Xq zpmc?DQ%CuV9-sOx;4|SQMZUDvD9Nc`${G*13yvh1SJ?HZ@$ij$>Um+zU4I?CbvD46 zyyvkF=5Ig$lxO@4(8SiIzz6!Cu{Uo4!L8>3JW)IOi4>WDLabEXV&RCX))QbP1KRc^ z>t_XgO7PA+Y{f6pAXbO*kCQrV+=n z^u%HWrtQj$EBoGHTg48nilzOz}b>)XG7DO0~1C(zCoZf0ZmB0Z=B%R zzWg%3A@+d?a_XPo7WYxtp2tGTIH^NLf^@)TGPPzp?L_gSt(PIohKk9o8iMwemh?|^ zNTk@n&^Di?h=XZmvm4JiG|2ofvnXXG}YrNAwCM z6C?A0sPh<}AQr`ga7^aXfO&{vB?&yWm=^!jdh!{t7DWwWZ72h%<9lKmS(?_1U&1pT z_QidI4;jDuwyqi9i%trU->F1SyKuMMm)M+w{AjHMUSq5pRDMJhRS#z|^DY3&ncTSt zz=R8o3FapP6#*K5KEMwMaXD};-dNm;L!a1I?BvxBR4>Gt+BN{(_y>&wtf25xAo~~8K-%z{5JTomR0%JKK1ya_Pkwoxh#m*i7)GS zlHOscsY?P*`)5Myi2vpzZUE*?pw|-q8Zc52`5dFw*ko&PCz);nZn_u2TAU77!v^Np z@bMjI^=}V?bpq-Wy&6pjG3>$sm=jgF-9F^_KXcwR?(6Enk;w`@f?Xtcun&s&iFmKQ z_DO~Qsbl(mgAOuUr)yq@;5l+p%RF9qEcHb=C>VE8uOMSEAP8I!_Y3V~Lq12o-`;PS zmM=Vy>{iZp@nC(H=w0`e^Tw2JNBInY>d4o47JcC=`M?=62&~KINxo+ZChbYNC;$K; z07*naR6o}1%ij$v-rE_}ikt5V$ae$6@Rl3?Z{B`~?OpLdczO4^eq&rf9tG|m#kI(} zo5(XmdFa55_9187TPN_*NgHV+q;%3(wc0oyU$L)6NnazM%G@fHg=lXDVyP($bZTQyK4&$c%*_N{If#rT*oa-GcAHqyP9kbZ=P>xyCys+u z6~eKrF*y959e>CmS%jkfNUIs7#nR{_HhHA4!D2dd8?8K@`4CClzAVj|MZ8Xrfw_BY zuuoqC-yCQ<)zHye9wT&k9`qYM8GZ0N$5io%oVNrgyxJc+4+A+;>cvNXIofk`a0qx< z2tvMbbbT&>3~)BVBzVXxL16B1FeHIy`B`LvT1dZi7n3`g{EhDP@g${_=3*J?2yY7u z$EFs4P-%3ccZ|{|2}l7KVAriApoLEOBVuI3LRmu@Z*ncAz9C7B-~x zdE)P^(%(@N^F|-aQKl-#HCloYi2sx2l*gwkC!RB}rMl5xn&7+gNW*eG>ks~vPygro zYN=0|=CnJ&m#(*Q<}^C|4s&?!w#FhuIH*;+!qPgH07@D-t-2k+6Smdui&>bzIe2?J zlMSw%$;RDh2O@9Rbq_#Ce4Q3BvH4OE2iAh4e$#@?Ul!uG182oH!&!N4GAL_`lx~Eg)T;H5Iq{GB@*&Tx>dC5?pg*$YzP9~waEagy2 za4qPp->RA}b#uHZY2des$2??Xi@5==VEW-9llp2IstbMk_t48y<03gt`g@JM8NmV6 z>$RX4@Zc}H!_i#ZnE1Q>e(B&bkTwjesY*tSmeXan?cJa8>vq_>oaPV)j>S3Lw|)e4 z21^2VmH23Z6HF{S&dle{H1#P#u@wNwrhJNvhsWp=y1q9j)Tr#BdVGow z+ieM6PF@$1N>S8P-^EV=6PSb1rF<(6BU#iR`Se78wnsJ`c}fSTJk7`V3(8%*+SS)& zzs4!9?FAAlaxJZ$1*V&8Rq@J_=VkgwlluJYwQ(0cw1e=D}bH{SL&&-wB|e z_<5iI%}3wK`~8~Kkh1c)=||r=LlA0zPC$%=&$vuC)L3T^Y}B?VNq{*;0b|c$aIV2x zGx*V%BazIVox)%o0=c7PC-YBuS-LZjEny9E4oN;vm`w|pgxXXm->3sNa48&vR@DaK z7c_%Tp=tJIu-g1W-?~xfVD@rzp)=KjPVO7r&>-h^7!gMu&k!xT6PmCq$2L!h<(q-A z3-@w$`@xTnbfw+Kr`UU5w95_VZm-{I3FbuJ<+e}eGTn7x(VhCXPaXc@EjyZ)BB`Gi zoMuHY%rQpHQ-&@z_wlkL;JF^c<~g4{AOt@L_dFfw=lPE}Au&N=R*(5!QmqD-`flhddzrb?~hn9QMQs_DDazTB6$#t46bZ zJSj1)yk)DC>yUtxq(Yt+*22w0NqddqLJ=Yihe~4meQI|AXx%rvR=;_$UtTB8A$u&~ z8eQuH5^)Ulm%pdwRL{U?UF@NI>W9+fbc^2P4yO}AxVEWjpD9#sebBr|EDMZf2Y#|t zf9g)kQy-ZzJJ&PXvXp&!oyHT?EM{zX#0|=mwKr}PD+8Vh;7nV^4+6dUNT>GxN@1O9 zi}ZuJ=?8!nmoEs-Z;|&Mft_R|FVBR$B4JQzUfPp%Qc{;A(6)ph-?*U{7Cd^r{P9L^ z5>~gEh}B?{T{!yhSk+QP_gcZmYppD>i+l5J$yu7t8Qi(;dniqQ%@r>9@ztd6hT%JC z$s(^Cc0#TG+{}+-an0=<;(Lg53~sc$xyJ6;9Atf-?WIHEz`rYH{LU3vp1bGSrblNx z#NV_mb8#J)vZZ|;gS$_C+xKf0ZIyYU8v@1S3bM|=vNa3)O1Tf%+5XX^gNC8>nSpfL zQRFQ>_658P;NJ$+O+hXTxZY>P{CKc03GzM@TfN!kx)T=OF0FE)db2zRRJV57% z=v4C;UJmB_Ql1?EH}n1Wz7SlF>-{~B@FMUJe`q(LO9FrChro7_@$GlMqa?Tv(7*N< z`2oUqMM?*iji|mkMorra=kL9b)M(7b$p?Ol?;D9T9Gxh*wj*{C)^uqEEnlh4X+QZ$ zl``PuFgk1`FgAR!rx|1M=5@01Eq0j9VUGbiS8f80&q|{)NfS?F z$_YaXe#5XSYE-?IaFHqllz7|M4hOl#aSi)Z%2Ae&OtyS@MC^b%iDYd9f3I8M5rpE)xzg2<*ZL@Ftrumc#ES7gN0s(cs%n5 z;{&%QG-vBy&e<^scRnV}c4wN)7;>=Jm;aKIC%o!B_pg=cn}2y0!15#$y;2y`vlC>x z`I9w);lHk8k^!4nIXpD<&IQC-?yd5J5teJ3;lq=^w%hf$Q+4`W1N$UXc;&N}SIK!TRs~(oanO2*vZNF!P-!6>l0|I|u zhrwe%@ffoeVp9d*B0Vf7={35|#%X7DKNaUAJw0lypVc`?;f<=WL|L~?> z`r4x~)L6IA7%0+S{i@Hh#Qjj)h0OS~J4rgx)^OUY`Wnx$qu&C!5dQ|1et1s)pvTA6 zu_(|{mfqa)Sh}Zz!X>ro+X=c;Pl$7Oe~EfFAU*nA6LsY?)PsEZn&)Yo7!RIHQB!LS z$Y;B2sygbdfsH+Na8RCM&_BagPrU$@m(s%11)P4JV=zc>!^~aT$cdK=4l3+4))~MD z{*n((etz&{y3mgWPXzB2))|3GLcBJ7fKDVe`UVAVm+nl`5?m9ei09Nehf&nvj*CO;GsY>G!Y(IAsnC_r zy4^r};<9xMdRg@ix$5*}ftNmst10(w-O>Vf1*4GJV=kd1^u%MiI@wDnx;-5mYiPI6 ztI|Ybz4movzTA$4Dz*!)!D6eu?bgM$Mt>Ik-e)_pPi356Bfw$Ctoa$PK6l%q_8F-F ze$;)ob;r7lw|*JuYyA??8{P`kwc&^QP*5f#-}8adFl@8jA8_aGLm*&m|2hNs=qL0^Ks|ZKq-Ojed8>zkn2_)Mn*sdlXufIWMc)qO zcMiGP1$h%~QmBtV2P%e@Y9B|(41I)Vi7b>R0y$8GMp|3Qdff0OFf? zR~wkkOUp$nkDVK@1RA&5I$r3 zrLcq!QxV@-AD+gZ?NcsM^KJW~KApZ1e5}0#yF~TdlUe=t8M^P`$*MLx1}^J46Ue&+ z$oY*=bh-zSp8+F5PmsyvsljpGiQ!}|fP?((3YZij%b#>=P>q6dJ5*t|-g!OPPOM>8T-VLTsbLg{ zSg|>E$2#~NncF(47tB zww)X8QCxCOWGor)w7Xn12F$@#{#{2Wj-9}oGd65S-RqmT{U*3g+C${Qph;|o9S8x~ zb9jSTJt4^)88R6fe)sj1BAX0Cu_SSGI*9zy_oXIz*-yfFSi^=sMw_i9ZFu5jRrzRO zcH5F$hBqDv2|5?@ouo?LnJJGP;F( zl_~!BZqniFZDqwus9xq}`^I-O`wRe8KJuI2 z1mu)I*Vdd`a0Z|aR+BzBeix81DIskyq?3ql)u@(vCe~nIVus&0N! z$z%La8rx(cT!*|qsubnR}_MKbQ9*^Rmn*UEkR@G3L-)sYFX5>9)x z9Szs7^6iXnk~|hKCfWmW`~!}D<#b>W8`xX|ma|*~U;5=x19ibAi_KwASmk>z2Lq6@ z6;5n)>;U@k-m=BQO+fu}h%N)ZdiS|)d9Pnz74)6_Tv+xV{JID?3$ruGO+XQo5L*|4 zbk6|JbVbYd2~3zrM;jw}97s}=Vq~D6_;b@uryDO{@m_`YKmK}hZrm9QlERrs8R3a8 z9c~hYVrO=5lZ6I{RFL$P6iht%$Rq{toru)5%|UH1py264a|nNY@Mx($ZKsGQuJ%X2 z(Lvpp6E)#3MteTE6D3OGP>$|L(dBRgb50Lj1AI+ip4JnOu2HyUl%Asa79b z(0rDM0Gc;!IsE4VzG=%3U;j8LxpISmj}Ss)i)KY{DA4AkhJCCsmj@iFRpdwQjh-5v zircnHBmX90n-S50^EEi0{HvXUhrLE8nfn40&lp4FXJ?d-Ri1KHU#z{uI}iqg(8TZ5 zUAZ{s!4-GXO~Fwm*+#WmHf2Q(tbo)6Ch4At%) zsa*RqxSLzY=P9<-@Hx4T>x{)7y&|tQKJ~qIZc<$Mre*ljrk6+4BG~5z?=nwqRdt8? z%#9UN$f+lYSC)+E-G@VV`@)o`=k6n+*1VLBdE8gdq&4mW@$v&e97uI< zK*v^v#h`|7^m)Zh8Y0TgIHe*?Z*mwC(P(#N*j7#=S1w6vw7gEl1qsiJ zbM?jZul<$3Y;VSwZO7v*vi3DxvDy1D=uu(56<9M`CBF)sG;-}P`N$*_hR+&<$L3I} zogj(we>j=>TmY!ON#POM9awgtS3PY`(fw&A)y;iJ2v^$d@gjvs@+cZFeR|9pdyCW2 z!XraIhi#1kU;`hy(5y1~REH&Q2gW)@8NTIfK@;bRzWsY*f^AW3yCX0C5}IGfZ5eKY z?3)$&Y~8S!%4^td3}t?g_a<}lk4UIbE%N=fNq&P8vG?FzN$z<)#hn>m-O2ynhbv;Y z!lI=dENkIk^5WyYR$!`eh*gnN<}D5W1Lpk!9r^X^KRW&I?*lL?X!DRzf$R|2$oK*g zir-5d5>v@WUHsZet<(ZLS@_>d>+Dh6!4PbG;N0z82Ee!9*Uae-7?^iSytEl&6>?DV zAh}7K9R>D@BMBnM#JXJPG!~cP0b1G2Uf>Qv>J5#~KDPy!#;eIWNq;Y1KTq|^b;mnB zx5IP$V95iKTELFeXgA@eTPCpd+kM~2E!BtGauuwBMYHkGq`It5C>pX})HUNet8LY_ zwLa;qYkk`OZpddGlvO}|#V!r@RqdYTsemu4Lq& z38rjUZz2@ip5#VjI*30v13_l9lfWGh-7)mdyo7Tej-@uAjB3G?YaxnRbf?O8AoPj8 z58kmV3;k5@e&i-8NqJ>}^`FCNkxY4l(#2!%fEQHJ9V6pc>hym#3Uy7|6jGfoL?QM) zxUr7`^w~5RkIxgEL9N6OA6S)#@65A$Hhd%E z9qdeE#quM;nh?-r11|a0OcojQTLI|6=2C>EZ)cFBFu7TnJj+K^_ea@#yMRuA-pRE` zfNh^1I$mY+itK(ris3UC%w{5p#)N+2poTb>)u14&Q<6K5Jf0U}^hbYIP6meS(FZ+c zVzntv#&dFW?gj>mhsOlq^k>YgD%Tp1Dqg|km^2_a@8TL0?I#(Xut$02iKmkt{z+^& zaoicwN@+@MQ$N#{?QVOm4IUfi^o{1WTwr-*5-h+njmB+=)$jE^0Fu#noA3-kq0;rp zLqT~oI6BVj=hUCi1LV#iyqw}^1?|xOG6C3>95)TwXieO~$5!3y_SR(}>}4bn{Ij#+ z)E@V-!)e}l)u!N9#|$PuzAwOakQCvB2a4TR6HQ(-na9Hx4?0%IjcUu`vAY@YM3{Qy zMAeuPcY_-h2aqbuIvlg6#^!1k2Xd(wONGO7rnJ;ch(n_Vi>{glyb6Lm%i{vN+pW(LL0A1*S3WaB_f0WQyyfQIpl!xqRYxV0(SP>f|_)yxmUm?0fo~J z0aQRmv~=h^2_~rqZVYqdJ9h5`bP6A~Nj&rugN&so^G0;K;ixV<6JgBDxxpF3$zhTj zTeCrm50VR@wUfX>!De`{d+%z2Bf7%{4~;b>TNz;X&Nk5;GQ!~BrNt+UuEcG^Yh`hB z$40-koY(e4N``mcZsY%?Sp7bme8zlaW}=6P;CLNlIxEIWgRglghsV|X7hQMlJnNAc zZIwIU*)DN))RphPv`PQ8Khw2~cN|!k$;(8QWq825KU-h>y16GG4usXS&3HXb0$C?o za-jEc=y@Nm>-C{P%?I7x=Neik(_iTqfjMIhFm7+Y^L9Qkq_!WJArO}d*cB2Q$(Plp zD5!~+WDLpau<^8&q!RU?b~0b{#E%CdoZj$>F?fMtbm^psEdZ?fWT7Pf83ZR0nMCOq zb^M2$wzW>zDSW_ALeBg_mRce$^GZ*y1h7afu$0jw+MKa5M+0Gl7oVlmNUSj}7Zfvw zi$A{2YPp;9y12O5w0X&Gm$F=x+blH*=e)E}umX8I7?b6NzX>7q7}??!%IU_<;afJn z4GHV970-PTy54SdO^1$ZHN3af+`8b!F^YS;xV`O&!TDa1@GedJQ|B6_X9vImx?cs( z=XYB=M_NZ8ALI}Ih2Q%-ZR05+uc!`;2pP2Q1oAWCwDaP@ATA01&423;EuFCw*&DU7 z4ik)R>X!d^_v{Csa>$pFc9+XMFXH?eyvD zKRJtDwcOMTZ!gr}ROoxQS9khbc!<$S1%L8?bF>qE$aWm>-N^$W@zlR2yC=WlED{gy z7W(NnoY_@IDq!mIsi!BcbpP2e{OrpYpMU=H1z+z!H~7}4cb99uqQKX4L)*J<=IeI= zv{Ap|nqCGbmse{0C|}b0(r*>=838t6O&lhnYW6;vXgNZ$cD-@HCA&GBh}y9AdjwEN zBOOuXqiSmQYGU%Flu|$skB-W|p(d3z#PgX)xJ+nMxW+43-v^zD;vsKyPF}<&XC)vp z{R~z5BBOaGQu<~cE`tF2bEPbI;grYt#nf%%T@F=i<_){jfk`THkSR5{@}L8 z9lgf`ly`M!*F&mh+;_Z_yP)n|+iu-haGYtxzB!BE`q(Z$3%-OqJfq^E>CXln5pci1 zth(_YE*4L7J2pgZ7Si^e;?;IL+JRa`Vp=*WkvktsR^R(hqVElo4opD zUbU72>_&I{-4Djaj=nqZbU|Ly@g#5a<1B%qgLqDZdlW}$0v#QRg-iy#)xdz{bUkMa zOj=D>Tukf<8>jfzraFIt+BhQKPR>~EY-aNNx<+#D?sGQ4PNDwPX`H^v^~B@|de^T! z2Wk%YGr2HG!;V6-{%ntyN$8>`;}`9yh6jlC)Dm_MXz?E}S6X3le^_<}*03^boH2xr z6@O8vF>$6&E@f+7OxkcP9;>eQm8{g{v&Lf?$~$#)qP|hxnm5PdOR(M1lp**|O z@EL$NVkR?_Oh!)-%QW@yz?=ajpP7urlkFFN?w5j}_^p~V$#moIL`ywL4`eXLshyob z&IEjBV2-0borjyU`52u>wxx)bgB{|ubmozt;}0J^P?^qeFJ?U?R`#Cw(eCh?oAEQh zTOknOf-wS|kRDXHPaYV|;`mqJ;cXSzBmPyV&0C6x>=q~KAB{SoI@BH$_rN1k)MH&A z)$Y3yRX)NU!{cLz#GHH_$@2C`>I=40KH0a&sr{C+)^9cn@M3}t9ff=n8_GjfmoBd*ndPJeJovMw5FmGHH?X!B)pmNPM}3jk zCadcOUH?PG{Q**ffISR&-#jD^I}Fa#6{7{+H}3)g%g zDqTq7fkZ`l;c>!!*Lmz7qaf|-vBJ%LjUjzWj|-(X#p1bJHXcY?TRPFmgnQj8z{IIv z*Ff8@iy>HLi!%mNdMu`X>Wi}e9W<}oqMK#w>UYTWwSA8L5xxDMO2obtwN1i6A>Zv| zmXBeo+l|s(JP!Zr7ha0!*y{9HzHa()^N*TSdUSj)pncab3IG5g07*naRH%M}mpI;j zWMcd2b_4RmJQakJ&l2k~!2$GHf8UjtE;q86`1%3S`ROpo*4{_KT|5X#X?udWrMCXt z8RE5M<6ai$l7!_goX-NN#qIXgJ&lpFR0%*l>k@O>7p{0>c5tF|zKAj*?>te`o*jW? zUlv6Ri8NChrwY~P+6V*Dx!2${mY^t;)oPb6dP8RMs42&;PdxI(*x?3%J~pEy5|`IK zpK-WWxPqU*t8rRjC`at7V%W>4`cv6Kne3Wn$&auama`a|Yk};dv<#J67hYZ`$hsjqJIsWZ2~V_`CVE;K-N> ztvl^=4**Ay{Ow1C^KJmW%pPSX-JA|Vie{Ii*{nb}n6$~^Ea9ytocKi3wp%OK5kC=S9*3^^61K)=$xG6p z))nD>rTxESHdk|gKs0Z1*zh}SwS!rSE&W9}(!GxM1$A^9{WW;~4yv2;(X{JyfCQZ+ z%By!cyW@_(U2jyU?vxMMgLvYQ+pgRZyJmEw=?bXx!L$5?In0vP(!A`PfU(>3S=&bo zZ?k|z=$(KB&*@J15NIM#G7$SMIMpc%roWy(1A_?vU-)_52jC7mN%lp8E{;ADa+BGz zp^c0G+^sAZPU%4TkF$Z<8SsrooDqO)sn1F!!G!^lQz2s+$g$Pepo44aB_zVJ9Nda6 z)0UGn1Md)ybm)fd!jC_2^Ck}Vtvk^pZ`fgEeI3mu7MvQ)?&{TsOEssos7_%6y>XqU zr!x5Q@%RrY>P@z#CoHFN^;JsisSz+_9k&J3f*&$Ey8<}MT}S)WRW4`i>hJi2I^tdd z7nA*ED-Zo)yZD8l`?J$G5(zsKdI2Y(&tRp_bO#GOY_RG8&%-tXkg*K8&Y#IH6%)Rv z;E>>)odDMx+@()Kxp5a+Zsvjyyu+!Enl@SRKf0+0fOGup6FCmxYddxV;E3ZF`n=FV zEsLpHL}I5FiKTZq7%BKrG$0nI8RcGDU4D~j;ql)N9_X1}mdT|2P}z?Pan?ZMC26>Il&=*eSK8^~&adW4lhM@;b8?Ndu*yq+$vaE8MTKn@IN=*bdBZ-}b3Sj;sS2Hup8AeSi(7`EIU58dtd5AMo$>srw2GdYAeh8Qa+QLe}YCw__e8 zjCiUp&O~LaJ*`fOJZtehat%uAUb}mfSi!&h?f3*fF?0u74rH}KV~9HFWtAm$H5eH z?F4upni;N_bo4Ph0%oYq7`%8MQXFJli-WWs3f%~g>e7VmqHpz$Ef=kN)cW=Tr?RNqooPv!F z+!)C{13>qefAOyh&kM`PrJBSkzN1#B&rSd7XsiX?u4r=%DfrDZ`{IE`62&`CQ+boeaW za@aBGY9}%h?dWKogY>!B*e@Co4X0_oyU(1kK z*NhYO%woZx33k@P<4`nu0BFzc3aT)(k`uW?fEcAbM+u&U|U z6#J0CLpd?Zc{hc;G~y{0T5!pO)>Go;9-PK#{zCL*X=2DuhS!a?p#Ll6(#BWKr#=U4 z#BT|kyfU#@j7Pd?oS4MvT1TVxYi`!l?KK7&hx+Xi3B%Ag%%-hjYqnI|y@sW+8;JVW zm&>XtZrDqCQ_DJ<0(LfQJ<-R6;s7RDbFbTb&Y0_Dq;1jQ$M<{WdpsP;L<*)lmjGu(!AF1D{YgP@flPuVz?$zV`!D~}Uvn_pp0p-~B1zDcAuo$2pV&#< z4QvR)CJvL8FDVViwQWFPd4Cm{Mq+rdLW@DG`m zNPUfRjNxIYSN!%G-uMn*}oSA}cEoDjdO3^GRTe&$8%)h{X7KhTCfNLvA3@ z=Q;?I(*RvLNe6mr1Jh((pT5s!cqpV5mr=Nnv3Xgw!E3Sdr&sYe`nsrZK?l;~C;M6t z^31lf+3F7I*6t9`bgyBz*Os37pD{O5(yIn+F?LDcSicMB1r^}3|kNm7XZSsBA-wp)i6kl@!$2@kJO9Om0OSAKkjR_0J zHwdwvMbx?5+z*%7FAho@%#YvyUv^A;qDYT~nV;oShf?L_mDN$JTeo=#>)#Dk=` z9td)Fd<+gJeeki%2tYdn-{)Y`Q`{%;nXv2z@}8lgS^)9_K_dC{KNHZLK_t$B6}-At zTbFS&hj)M>87lKPq;*$HvT!M9+fiOxy8%%Kz+I+AS9YOalZUG5=A;q*#$KgOgY+IO zCfnmr{sh|o(LXHhS66&0lkynFlL>HTJD^W9D>X5%o@jQqCr{<#H%FyfhM{URZcdN) zbtNn#{puMjY<~AmGl4$7(~G%>KeMFy&_S;^>DdAJAn(|@jQ=o`XguWR4-jy=fL8}_ z2Gpk!!Z;C_DYE6^p)`N-KmV23eY9>b#f7MsR|vH^vwFJ1!du(m=csR6Wpy;C?KvZe zpSWaqajdo{Fp+ODjc25$_-2Z8<6R86(=fkcx+$#Nhs_3eZk*|^V}+Ouyh^0=ri}ub z@l~Ab=6)muXP{Htap`u9;A}Ad+E%dTQ%veR?yf!TvkHf5Xs{ocYNeXt8G9$<0A8zB z*Rx#|c5PLAtM6&B{gRvYlhEWED9gO|vYbJzbfm5vOWMfQpPt27=Y~+-9y~Bbzfup@ zu9el`(|^7c_T?*-J5mm~@MUYViG@Q4=d;iWnQc!yflTVzdn|VeIO}D5cLY-V4kR}Q z^~Z`~^5>a>xvA!flF8$VGLx0KUXjr1k7cT9C1dHZ4aUif%N>R@FHcTx5>Bjre;|G^ zI<~l=8%pzna9sBZTd~ODAKU5)ozK6M733gnQHl3y3|4&;-{sbd`Q^=W?Z zU3pssnKIK}Fng{|!Xr1^gU=8Ir&*ZK0P56X?%jQmmM4hc5%9Hfj*w1D6Op}1iUvZ= z?|A4ywO_Nke6+QW)0A{@4Q{d2B62>XQ$srasm_F#?1`T`lb@Z$el;8CBtJMJhr79; zYo3wutt2YB}Q_5a6sWuv9n=cbLA{*=lC9$N9sD7 zza&@oIHA+a{1V0wj*PWSWD>Hpi0)+AFH-(B?4Ru0*ixY@^1pYH+CcZzA_<&PT@Y4fJS zhcExtU;b}`7uNBq;aD&9d7+GT>Np4qc>LVyJ;9mu`w}2L(dDe5JBmaMuaEA|U{)w` zRtbmuV{DtL$tN2s`wS9J1{zt>Z0YfNsWpFC8!anBFX& zf{5Szt6Q~5C*`F|R$(JS?2X+z;4$7jH@b#+IS!)T)~FQpjdiyZ*Yrt$ur%Hp&u?T} zE;l5J-BcIF*gYV{;-JX&V<$dCXQt}aKM0!NH^DaonCga*X@yywQ-$h{^pwc4!7=qDV zMpuAII}Y$P9(WhCjU2QwXqGd=iHphIkjeep;NhBTTz!+*u{V#K&-~7C0`;Ax5|<(V z$qbjX)OPBY{2D3FJbz;Apl;WxhJbX&1{Iz-&u4}hDU#0<>HzC6&* zz&~;-9dXP-A|bUO`ZSx<ClugTM0Mz+Tww!ewAKm)B9qq1VRr)ittNzqsq>-um5 zloVMXTG_Pi`Rx~3Gber}bSkg%j0;Nl#X(s#1IhW{er|(lL7sNis%KLf%VT!+uIp+e zlx`(e;$(Kgs_`E7E3`DNYdzb@N4w2KWv^3z#?Lywqh~~Cyz5({zxZ=MvnRbV!@@Q_ zh3$gk`(;Xyx!9KtlZ59xM@zOh`S{StB>GD4|MxmNNA+BDXHo;!#OLTOVxMBqq+fv* zG)G@0B@FtWif4~Sc3}34#N2M}4yhyjgA2fQ{Jfh2?HBQsv|6(Rkeo@MTo{bCv%qFM zSTn(8(2s~LBNucm7-dzx0>#0U_+(_{PiarK3fD z;+a8OoF0VnWuo)aj>mgBY}Vl{nX>_G==d|&w6XD6vGLfrSHL@`6SsI0QE{&Bmijq& zUB_adY~j(MARbFfeA_0L)w7t!(k0J~I!E?QeDjsUMjEmW8U0v3tcxRv#VmH<6%W-t zrvrAu1>1g2_YB^!N>i&sa`+^8xQ$|mi&P3)_NVt%zT$J|SiT4yL+DPP%5kPu&HL)w z;>-Qehx*PxW3^yo-fiMtUPWE&<#Wjo-{72&WaggFYK8MQw`;()&q3Vsd)_!5iH~W3sEwF9uNv-om7!_>6&seESXV-ssW^h4elp zflq(<@Bp86L*(3u;>189a#T}%-B|R~f~wtNf!#@bXF%TQi%ETC<_;iF_QAuyCp>ua zfR8g985|%4^shf*p4^0+LFF-MetIkqRS=)VxfcRGdBGJji%`bs7|j`wxaFIHF9}RgdQV_|7I9(@pfQGgRI){N9m-kOh+id*af zxQ_m86WX@l{I-AS@A>KPXtHDSTL?@5Z}e*GZ37-R%qNL*)Pd(qPNBJHAlVNAdE$li zt$tNFK6#t)fB#?q&zIlvPyBWvvy-8A8XD;t=Cot*#+t4%zCnPu516BPFD6KKI6?^T zo0p&^GmvG-fXR8teIxU*+8~<;3;oE%4KKdPBoN(5;~F2#D<5RmkbOp9yK2VIk8?5> zA>OrY6O3r-%V46PzL`4#FtY)d3knMD2fcK7MQ_-#Xg^m9W3z|k9j_@J&da`ZS2wFC z`XhEZjfp{;LO&9jv7`TO74dgile`B&e#D`@bR#dyiDewvF*HBgm6y-ZUQ7ZK^Ik^f z$uB#9Kl^9?l)m;`Kl$Zv|IOWh#()DbY4US^d8?1N`*Of#`^T4uhS-7ll0bai=VC|E zvkBU~qo+Bp4-&}mY@;z)iTb_6<;-44{Z~L=j}UMYX2+4EFv0eVQxd;ONO~tmnvy9e zHVIpu(Hrh!1)ff&Gr8>GOh8=b+i}ZVy$KD&cPAJ%n2d#rG3*p5d&@)Z))C(j$3R-F<`|k&8@Mzl z1#&!DUgKSG;~n%FYtbHvjvVL%yAX#!NWJ#h{QofdO|Q7SI|RrJn>*Gv`61gWi%~7j zX~C+Kl{U{7ZX&2vL|XzlRT*Eu)Q1`yfY)x>_jXX(>-H2*-7bA0VJ{3&SLLD ztrsuFu~t2tv!ZNw#Ep{_?ieql%=S2N9MoXTXPL8rX@XJ_4;WxaF~`w14X_)|j^mH% zYL2ElI3riH1DHbU#@z^{z6RfBYuQ)dZW*j*u?$7?RlUZ20e4Q{N-FPbVCD_gz)#-M*);md#tk0%=XCVe21V*inik-`0nZoCJuE5?rgUyFS0e%A}N0^V&+Wb3VA zu~pYFPg-HwTp1sLPe=+oc)Se?+VSz&${wC49Eb03L~IIW-uXw`U%JOJ+{HE`>BhS^KvN8k7}hCY}i@igsiPXuAyM*_w# z*kt29@8Xf29RYF7hwpLLVEqwGek9&pXrao^Aa&9r(^7jhyS{P- zpB`Q1&C&j%*~1Q_G$;yfeF-tj!Py6uUR^I-`|~7iw%2AlBwG1g-?wC(g^`eLMa25= z!Kk=hD^MT=e0lTRf7?Is(>`)bnbUsN1W+5o>b?O-JKi+7*D z{P24}c=`43egEZ0pM3oCxv0M6I#@fGzxmhy*30ktegBO8y7QpXy|xn*FU*VyOGnXS z)gw5(;(0dM$A;M{%?2xm#DR0$(fMWF$R>19X>}9^9v5LbDu=5)&hYRtU>w@F)+QoX zmz~GaG^E`4fwn*E;Km!Cu@A{Lm5Bid_N&nzQBMb}0XJiMvp}NPjQ6f4GqaT?(34>B z0i1^IvWVz7MX-rDrfVypSC$P?F6cT2&P4!h#SIPP994{`90-0UP*Zg|s3|y9wqh@$ zK8zAOwOvp9FZ}tR$xnXi;F1!b&M{)Fz8G+DPTM;JvAaJy69(^>=IW}25o5o`Si0- zUq02_7Ua*{7jNEh_wwD#N8kC$mya}$csql;m)={6fF#%R-SmZl;H^OPdRajrIzdbE zx}Bod-pZ%rUvtW@(|h)sAMn1T|3k=g4Y?8^E=O$Dat$ACh?wLPL(ZP`+=W^jiu*2%Q;=S@J^WT#dY zc=_&kzyI>xAN}a%hd=)D%V(ebSd;&AZG7w`h#V|u2>;Q4@F&enGJeqovT55gE~ATc z?Ce#*aYq!K3OLSSe5YRamdIbGDc!Z4*tXKy<+(QAwy9b>e{PwQ1lq4RM+;Cx-`xe zdwout_Cq>v2WnIQxu5wHnoqp#r+aSQUL8Y8ImfcA>A5&vknf@&C~ki6Z7kV_+PQr& z)q_B0_N2gxn{*sSDVgsaaXBSUk`UqkP80u=Pd<71_}72*@`F!4)!s-x-huGlV?XJR z`=J|QIRp6WE6yTxFG2k8bbX`WCHFCxSiWBI5nSD9j`WDm_~Df4UQ*q9auE;R_kj6G zs1*T7y1F%nhyW~AOJ~3K~(6$Q64_45hrokq4-Br z@RZD11BN_kAsx9)@u&ABdu+(ZD4syw?~-ND>MSy~ zyV0{1shY--w)0$G#68O-&f50SUChIlAmNsZu}MBhH1mX`^vPeX#Tl>mrnrZCXo-Sr zqkv-!qFZ~v_438#8Z{&tjZOa0?ij0P`^_W2If!NZlHLb__Ex=wT6pFu zzYe?#9BLTp@RIbOGfRoyt^lAMtVGQKbgD#1F^NFvcx%sGwq(J?`S{}>y?p;yzyI>R zU;Ez6_kaAumoGm1M0*?dS~}&|Lq&OOj?WWtwAGi4zWoX5*aac67AN!C8XPd@n8x`2wx5rv~b^;!F6wFx@ zX5o0OPw{!@XeuqHWUO>~A0wcAfdD~LAmyKhUebU5`KK=*|KP_jAAkDs%V)a2=i52? zoc`O7ev@iVcug$6Qvm#%H+s5I_X)oG@-y#Dpn>C^E)Cwu{!SC`BXuBCjQGf`L`RfQ z_UIk}^qhq_H`&<@k|vmyFJ?~drL!J?4U)ejKm(`054Bq*N8QC-*suJ>qj2MwzGr7h zpOq1DDa6ssj}ap?EG%pyzr^!^+lRrA{>0efSU92@H z`Q>;0?tf}xVA+MZXX%EEx*N+D&^gl?pn}N#WEpv|HMP&SGRVqr>)_zUr9wPf8$Tpe zF&D#$)yS$DYxCeVJcyJ#AAZ$Q*Eefya}NE19X`jiS0HgAQUFKH#>vdHVPPsPOchhF z+-~|ajzcPyTbJdrbGf*qPU;7uSn30CaeUIK+nDS*+(mn=#o39~b++RmjlI6DA*oEg zN|j5oy1QTqdJ&iH?a%$pf2=vCXa2Pl-~fV-;(VqbVABWL7*JtA`Evc(W?3)!oAhY= z)w2bd!%y|WANc+MBo*3KyeCp3JdE(!$Dh6Y_(wl{`O&AJ%1=jW@2TGD!$LZ(=ZLEp zlboA=AL^*@YZFa;?*Me4fU^J}y>*2D^4%wrbz@NBz`fCjkN(|%@89vxhPOGIsKkp* zV%Spqss+WgkM2sx0}|c=@m8f`u$SZ>gC{Za*vZS^fNV@Y{{Uxm=;t5c@Y|mF!Q&mH zLx)p7UOC53!Z>)#M~9v6&N&Rzui~irQ=QH&RNQHft(aAV7`MQb7i$(B>w62BcZ`v* zJ3d3QFlUGldc697fGZX`3G8Z8#7T>lsuFNk8NsO<;g3Jj?RDKXa5sF@6Y7-oqcQq@jMIjkFs_Mv+mo5ljr$+`ObFd zIG0i89Rud+B-0vV@xA2~0bY-V1SUTje6F|ie*A+^UViw=kFub)#HKj^n(I~)%XB( zPy{#kBAm3laV*Xa8n^Uqd)Ui1S%SV)jpamSr_Wl_Oe;RmmheoVsT={BSIU;q1~&=R zxlrm8{+j-XdqOVqYdj8d7!MJDXDHou-KwQQ;R|%vy(rB^bo}+Kv+Ks|RQj`!a&Drt z)@M7DvRyF`77aW&^b}aUtt!@=-|>(9gFkH*2{QQw{`ljMU%vaRzxML$dOPoP-QoZ6 zLrrw)ztj<(HMwsreDzx-e+$?k<3vvC;zwx(Te)sSFU7kix zN?g~1FW{7z$w6&3?&uB}T>i5|1|cqyvH8C{58)hTLd6byB0vLY`Hz&G*mxV`evFoC zx9_q+j$n*pJFb1$vCPCv;?s5oQ8II#98sWMa6!?W<+WUj!A>7fTy5oF?Te5&a=(>B zQIUR*>|E_pNV#F=G(p6L1W_;bkWk1dX?HO8CWn+AYgY&G_>A`9Jrk zk86JpCh1-Y!1xqj9rW6^A7hsut7)0DRB`}s4%J2k<}=sCkA2j_>+t2Hr32?FzVB<| zfA72Bd-+uJ^qn3`c>5i0@M$l_%{xx<{nA@{N+O9kvd#v6N;ZGJfD`#p4-dWj;*<19 zk(l`0==04%PF1u+V27fe-pe2R_jLypjC6FE#CWw+h?G5eX^qD5aM%OTJNA*7KNzYO6diK8^mq1vLLpr2!Gi5<-Hir$)v=748`#-o6XA)qxb z2Na8-L1&rWB678<+s5T8w|(L&8!V>$(aH{1ZLhr8y*yluu3dWC`A<#9fAK&4c|8=D z8-H;5WqvL2m4gqU>UU!jCv!h|4~gRh-xYs}Zzk+55aO9iZ^!4f|5LrE|3f{#`{}!{ z^e}>U2A_Q_obKXl;`gn*FTdcLo+A^JUwaQ-`{#(BFVZlp6Jm0I;hhDO2rxJPvLlh6 zO9w6o{99%095QL>IM?338?T%-oznR^6`s7)Pc{5DiR!%ntXlqbHGN`_N@uyGnM(oP zYS-_fD-6D>y(7XSdtVPY9JuL^iJY%gmI6I}L9ah)EJH4sV{$*lT8)u+1hAM(V}^r5 zIX~+o*+JY~##qBbrIRe*5NwSWJF4@c?~^ZxVlxU-Fm5&^xOWZ0lT*qPs#ta7qv#RG zMshuhb3WSS(7_lte3&zt1krkEkDh}JU`UyM|^5eHy*y!*AD~wKu7d*^802OU--cdw*Jr{ zEZUQC#DAlgAEr^lyx&jZrs0R|NOVc?6*mX*_r{*H0&aGI`5*rJ|MK#C{@H)pD+NDj z*D?)j&IN;!p(%6&(@%OoHh{>kH5>x)M=mMRg-<|S!T9|-wfPqoid6zmv$9sAnMq*4 z8p3WElwqx~3uSZOFCJZL?tafTx-~86!^bwNzeVG^P|41nZO^u`3avXBp2@XeGKBHrNjJ1dC$wvGb@bX9a=)b9g;zgCWjF zkq>=MjL8j{6zy+otFaJwg>rIrw;#Ak^WZ?+5}&rH?=enW$*x|s$XoTwMa`>YFgL9s z0uIBnZkn=e&4u=Cl;qSQm!kFE{-o_~ZaE$R(wO3P<+i1n{E{`d{_3y%vd;jxbmY1J zFLZ;PiOIC{WvNalIa24+QrnZ}4db47uOu^%I)`jiTQz5=>oU}HSbUu2`ixhnsM2}; zl}qoy;rI6YKh`JqKKY>$>=VTYHyS-?r>NYwxok=Xvj~ zMlRtFgRBcok5~w!0$*j}PvSeiSUY%Tu*mG-Nge(*o!atxE z2Y7{fjkrYGEv!PWoc$)r;78fWDgBnS5ZdW$Gw4^)b{pP;6|d!7p#3()C0w!>L-T}> zUAA(m&q3%(T>NUVs`Vt-8d?^Z?4_?N9R!#>iZDIl8^I@k-FI0fF#S+7Z;OwsU>04!_Kwyy{b1h~w{ac&Qv&7ax0Y z_4qZ@e%Iu$*tEOkt-Y@6DJIG~O8T6?BRT7H|IvFzVHHt0bWZJc@SX+ev;Q}Y{wXYZ znf}9PMqM8z>Ub_Uc$!JROM#oSU;f+w``LH=Ti*^|6;w&1Ei92$xlNk`WFhAk$iSMI zN+{lNIN(SayK9xg7w4r%jVFD0fM&i8F!+fl+Vs*Vc~q3V-wunqEXXFZ;>rlgN-wQW z_$14VnaW$Zo19ze)1>7Pv(U!(^u|LBP>!|^7C>PNADf!m14Oc3l~yTx?h?Lq-{B!4 zIdIO@i;q9NdffH9pY#Hd z4LYY9jEe37unCxTJ&HJzXB4M!&KNT7z{%Sfgz3~w`x)KS8L&^#(Ul$y8ao#AxS&HV z>Ga<(2F(VA%Z^|Ag+(x9qngW-99~oB`a*RBf^*w+v0K zjN1~-Iv`JU?t^Z+92zrj7M){GQGjqc*vF50%coK|Go${?-#v@88FIJv%ku^y&Fs734m9$hm7(8>LqVmzu- z37r^c)uH3eQ4l3uB4ip*0l+ignSf5Krp7HyHu~Zy!h96xv|g0X5F%VW(OF2jA+<}ktm*3D; zerT#m1?9SQSh_R=8S;#*x$h(+|8^Ndvz4iQTSgkgA{WPo)wE?H=Kn!B;Ke8#ybWs8 zVuM#g8SX%1mcBY|R10m#i(m_~6gcD@hzi|!?m4G1c|>TzM_vaona7+{7ReIXa6~&Y znE2ooyH{yG3chgS)Po!;;7{{d8T>_O$MF0G`(+srm0Jem{EE^3 z{jDY9vU6}KV5Ex!ZvH?hk;P@vmB;Y%o_)PV!xGdfJ`S898>jTo1JiL8uA}!YzwX$( zT!^wL>^T8D5D@zV*3CU%Lhyy4J`Ip>IvFGg*ZK4K4{dLdHwDr8Z!pRQn~wkWfAyEU zAp*~Ckkoj!lf~?>PHSE_F*R)C?GaNU^1#qmguLviveClbZx^P5jIX@82ao($*uwQ% z((oFdk-gIDGrGi_13%!aa9A@f`VD0>7XJkd zZsS8X5`<3nly6aO@JTPBi?romDs3ne+2su6)_v(Y#TI|`IK`ZtkI20ZI;MxrW`2ar zT$te&ytS}jH=KpHp%aPCDZ|*zS*^~Wc4ON-X_x)nex8U;xi{uJueTM7piSL$(2IVX zou&|-Jq&BzQ(m^~#Fyfiadt;=HpXP|iW7al-KRxn-7kd>qSMOIb%c%}z6>we=(7*H zdGX}z@~*TNpeO#)H-(OG09?{pI3rl^2w;!=rPA~44Islc(TfkyuJ1ntj}C-o$V>JJ zu6*Q3JezS8LZ1DHN+=W~M5-4{s^fdFe(gamanrsrSd8LWcKg@BKs$G*PwZOFh$v7) zN8CL+L77guK`0D--#j!v4Ixad43P=yns{nOm<`L&Yog+=GRbH7B`;ETiv77iY>Oai zt&AZTDx9^fV?EPEBRe2kxj1(;fkC=j;v7IVOIAau}Ru-Tj+ z%-Lhi&BK60z-Fs(X-DKZaAoaoh79H&1r{=Rb|(FPXJONJR_!iQ+A#c@2djVW zUwDWdd#Ck7z?G-}WKO(y^=s+x@QJV%qG@yXFoIE<&lOEc0!^tb94US`&p(8Z9~O~M zVJiD;3vmR@>c}S z0|Ayu^blBm3R^h~m(<8HV+a%7<(rl2U3@_dsOT$xL^<#YB9|%8qzcy#sHjX$U37d+2bP^jSC#@R+(0@m`Zet+fn6klF_mLAe+vOx; zBIP-lHL!06-w;OnrbKi0WcAtcC$?h@B=;lw?YIah1zwb?ywl88qYGit?Wx#SW|nzy z^&h```9J;KU*DIEYw90TklQ9r>5NcGgAgf z`VKxOX&2ZbJd+3I(&OR}e(d4nS1EDikofv<0X zr_$_6bnchr`S{Rh`}dgo^xVIjemMfHdEg<9$A?o;bk_OpA?+Ac{1qP@i80{g<4A+2 z5&iuVn}UD(&-|%K4SjRDu9}MtR)bie>X-~$W9YuQ< zm2}F}o&NAZoG|wWUNPdQ_tMbN^|9ccylY^gFYn%GR`3j7Y>Lo1BoNPLpr0CB22$29 z|8Kv_OyJ*WY1DoKtS6ZYGK*j03rAxMY_n>tI16DI^E(Sj=L2tTC*809%5V0a zff#2>WbVX?5@O^7Y#O5Q2JVTr@`ROx*G_+j#_}~+=UCJ1z<`pK`X$l|w9@9ETnS~F z=*XY@yMuKGS#CK0Ey=W9QImen;&Q68xO_>$Co@^_%MyKeGV% z&t{uT4*y_?%DMaR5+KGJBV-SN83VI|zFDXqeM#w8{?4z_39u(%iTLSmnmCo#n%Q8{ zfQ*wW5b+SKh~|fQfw$n}- zcA0O>E8W;cZl_##ih&PqbGFnL5x!bYV0%XOA&-b{)_bP?@t@`Vz|=SSVFkT_5?AP4 zfo*^O+kEiGZi6!Sy#o+pIsNTn=p3kwPdXT@2&y3++RsVAyB%p4(X8n;z-!M0@R-oI z|8!zI1s@gKjN;Tx{T=N)TW}fRx#XTBXs6H_LLVuv(Ni1^$DN)g26W1=yzCj!38nG4 zp#hGwix+%}IAIy_OTYHpXW#xEpGv;fhz%`n|`Ig+YC(zhxMDQz#kTh0lw&+tg0qmdLv*-;k>fWS74iX4XP z{!#Wbt8n!@5}YJb)(Sa=f25%BtQ{@nUN1-f#t*!R9#R{k#X_^B8$Z=zU?Ri>Cy`@f zxYyq1NU_s2W}S3E6A$Ni|3o$Xxl2|X=iGyFJu;=oF%vX$|^7cM9%-^Pd?(vK41O8$^5wTvf{Ul-TBIOH^*>ALs3cYTqFU#w|3nhKU)ZW>JqxkhbHWPF1 zfP+NrCDfR1G&&WrL-2EAJx{$sL-(Z&GAC8T34!^$I1ovl^#t>oY(62i(HI5;5}+DMV!x{@z!;p{ZG z5zDU~){qkbPlud=D| z6!So$T+bjRJ7qTZc1Rn2_ud6dfIfn-0a>_hBM*m-bKhl$A4z^8$b6M>boZ@6r|-tO zNkf-_?DcpO^nG*QO&W9bP=28l(}Rk1$W)WFs+89a>r)&<#gB zCUJiA*S~!B=|A;t;A&O^%xe>`r4ej2h7W=c5&#*+4o>hUFWd@V72lq{B&8Q;_!QNv zWtd;sZz6Oi5{uskUNjIHTPg)pc84%|1r2=~lb}OoNBdO-IYr-%V2Mzh$UKM$n?c;+ zgSO)rXW*LQc4*#5@p>C}q*X@R`!_+03CaH^C>zUfhP$c)+*m05TF-JWZ0bw6zv%#e z^oReu?55`#K5a2{3rFFtgM9!x+9=$?jXf!^zIT1iUf39vys1z5)b4cp_|{ej-=OgF za7Hq$MwgKlegV=!y>svKvGECZ2H6K-gqI*|^XO88_&5GKQrnLE+%dfkJDFFE{&oa9 z<|~f#>a50Z_`s+$1=Bd+j9mZ#AOJ~3K~xsN$Bvg*zG&o9!Kr^6VwMSX1UWto-F%HF z9~mXBNqwEyjX^^@jW=gs`t`4!efnSjsFWPQ2Nv-@AL%f|u8xOrgqYHpTfdZcN zDtq(aMvmhSzjZ&tjNkr!{>OeKr&M+Ryb3S#g}1RHZP_wQMEkT6GdI1en7r)(#Pdtp zSgb581iz&A3pneLn)xg2u>wZKCJV5-RMs*X>5E5~ZytLVJ|nIS`RU}MER)CKUOZ!0 z9tTHP99bvk>pmVJ;;61pe1{R;DevnASJ=Eupz~WmWxQb-;q=x*Bp-*KP9w_6!*c~} zL|$eCkh1~I4D$W}I=TNKpDD1rr#^M~(y#yK*{A>Hr&7q|4TAPi=}=ga0eDGhrHH&t z=1nARk$dspx-R}(!;pUPy$=frgSuY|SoHEWI!>81w%WqNQ=L(9aZFi@cVH$U$ju2Z z*}(vwIvsS=#?f`>xyKu8!?iwl+A;{ONLyI^R=W9xjY&t&MnXj1hBnSNQWY*VS=&V% zl{QbcKMH3<{(U0hb-)?ksYl?Zl@Z?{V%oO$g&+H?*~9Xfx`Scb_2MIi+DWILj>I{f z6M#S?t8jre!=cbgiDw3oo`(_N zk>6>3r}PNJQ60%&M>*FO7P!wVyS{ho-zgFEqKw$t(WgVGT&DSq`aaTAfqV=k25Kkb z^j??_o;+~Gb5l{6`vJaqG-n4akO!4qGkH|k&Bn|E&`FvvfBCo0zU|ZBGA6FU;G#KN zm9a(BTZP0_76W{m z+ny5bi2uAX=%-wg#N106;YK%vB*bb^{-*o@xlcV=k4NYCGhRRW<3E}&`3leIPn#V1 zo5Mv38J54!T{|p!o2<4JOW=Ck&f=c4=rA0vbKi)=xF@!39lI|) z&H+4lTqkuSu+Elsy#=Je?ohhHA#+E1Kj7g;U>?aWCh0(!0XX_!P=MU&NKz0a$1vdL zpbv$-zSmQJZ#Y;K2gjK`T%=>?Sg|t&emOkRDvcx`Td0Sfh06sy1BJ}nh|V&8<4a#T z`_!lZ72llbTH^@Xf-+1j!y$0XN`y@HFcdG*{Sx4w++y-m5C12= z?f^D*K;E0QaLZ8+iu4!uE533T)gT^tY@kM>w^4qPv-0JW=zbBjmGd-SqGf{ME$YNi z;qq80&ESKTJ^M+cDo$;8CSsDe9RGgB3_t$z2|aDm(~Etb-oCubxc3q z^~KNsST_9T_^yw#(?(L4xA*`{IhHI3Q`5?>K1(aeg!|L~u2>qUoXO@Qy#|~+I_qzt zk<;J-mrgAN`DC}O9OrvW&;y;BsY5RUvl4aoGL z4#Ew=Z0^x1$ivRV9sf*=Qh1!!5j(%`a=SA+Zv-kQ&g`Zh9~{Y-iF_jwInf#8U;5XE zNyMpZJ_9Z%jZv{U^1(%>M2P0~!sq9!w9Pouj?W8NkvfCgw zZf`|ar4CQ!Mz)9>vK$jqF)GlMimX^8Qbf18BR}a;EceAXBD76;SmxkPy5Oi05EmPY z{}x4K!(fAMYHfBrvFGp&wT-=iQE}rvLO1;XpCYRqX_r$JSdUfrN<5Vp+pFxUqRYN@ zd~sSw9+~BPmH5Cg-Cl-RiXBpWr34`bp#F-PKi( z#fNFLdQBNyPq#&g-=V?RG4`UXSZe{i2pqf>UL z@H(u&ew3t32KjoBsJgcxaekbz@+_H41Wy_E%|$zue4BvTfqCv9oOA#4|H=2|iGw3) zdg16_18#=Xp#D1;R(nOJ22)UQ>>Paz$de8Eqqh}1k8v{91J+HN!o_drHybx=I=E!b z^iZ2Bue91keSj&NJWLyy+Kg`M+tJ{_v)Y2wjzIotc*2*=@C07e@{@m17QID|pn{Ve z`X;=}NkT*Uq)`b@XheOBTWC@XXNf({C(rD+^LEJ2=`?0p6V@&9C2O*T1@C}*oa!f+ zJV*U6eD1St)3iNj0%?B~Qc`W~zSqVtF)rcD#e#E_x6k?0pn=Il+6h4e?+QPB^ytyq zJ!Z(V2*!rDK|+>}XBgB`Hl0S!v=7sv9$w-vp%?GmzkaNi7xX+%)pcMu0X?GYqqYkg zqR;)+#%cdd(Q_7nB|+EsobBh+Ug9_{8o?IS<-!a8!caOBmI;@9Wc0!(08HV1G05q4 z8mY?x^q7soesshVu1ADAwn|5Fmj`rC*$;4|Wqoekj)d96IGj_eul&YW&%WhPxFlFT za;!R*i^@%y&p(=RfMX*wHJ-t{W$I5IZZQki@lsv`iRv=G6`~t3?-9_Pr`Z)REO-!%yynYbXIc8iML76J{tI&_XrY$P;LYV&2`N`HfZ77K&<0_#x5^?Z7Kk0g(_UnMA^N#aJtgKh)%uQ(PscLx*SD>r@ghc-ZKNfiL()S$L z?s4wsSiYkT7HV$tn|6}+2G7V}ypzB79*%U!_{GDkJC8l)E2#>kZ1!+4x$zr5b3!aBOo_?-=?xlaYu!C8p< zcwS&$BvLU?;Q0k&gByX_R3syRvJ8DPYas2RqnKG39fm#lSHJQP&whhPh2Qq+!+C*a z!0=0aRhverCAkwJ9RrKF1tg>+h{eG1F3j74Noa^}VMt=~lC$LW)=FHm20ikjNu`!{ zIEWu`SV17oWG?n^--@)MZVV(`JQmSvPUV|isSc`av;l9I-B!czKnIrQ*+{p@YRuts zEX2fn-%KkWpmAc^ByWk_@Dwc`|7Ii?G29l?(eZ!!Cw~0w@BY@;@_G7szTe$+`B=Zz zGvX7s-I3zrt>G9WjAOu1CL~pWoTgjfbj4xjEDA1X}F|@9gvGd-`u8fvx&xNoh_qp5As#(Wni)lQ{L=&X4aK~70KT~WYs4*JzC-BD0Sou( zfIYe$kjCbx@!|8;ul|FxZ~YU0B>YbbS6;x#cFSGiW{KL% z9uKRffoS0EG&{e*f=hl8NbUK_lJDIoN;xh{f%9JJLGO_Ab9cY7+h*uuHPn~&p zdhSM`elnq4Ce^#;k>424;)IU^wx6;bAlIPVlEiLfJI(=IJ=WQ;?(u##RDYu$&J-P&y2p$({NX%8f36>ymk8Ti0|@% zmC#@WC7p$DDC$6Y{!ga?h8;j>BAsdEX+hvVQ|%K4%M>w7mb!n9PT-G!icUbQ5vE~z zZ`sYV;wkeWiC64gy(CY&tj;rnwlaZzJ5IV4=ep9kONpg~1@aqqv72>3dTdx>UN@dG zEXk?J7$gWmYB|s_^)@mN`ES!JaG)DvBh5O*msH_P{pz|&UcxA#5XrLFJO7=%yQ>UzOjG~4L`Z4G*PF$ zU7!D49v+AyYvUK)mfmdu;w{Y^ zA>C=Kb)KBSl|a}pD;fYab6+$i^m-BoZ-7lpyVu*~Z7p;IjIJACMM~fD3`l+Vh8(Al zh_;1dExH9)p38u=Roamb`MJOP-^X@Ny$!?1F2l!vB|Y*i=i}88J9tOnN5o&UxAu*~ z*v)#siw}M5V;?(3ML==XticYdo!y|4GnuQt1X$l`PoPb<6!JU&mp=Z0L0m_n5IWa# zFwghf0y4tWP|ULt=UhJpmZ`^q&r$dd4u9#RK3@LOxb6cC9}u%9_vIh{XO^HE{$Y`M z65!W_^U{xhnJ8Z*_6sS`v;LorMENLF$4*D#G6fuU%sv8+?WSMf5Af))mD1u~a!OD< zKXIm$3Kx(4kt}CE^L^h%`E|b8pXh$bW~3!MdZWV;9=!t4pq<^s+2i!n8TeUs*LCu* zvrFf6PbYk<+%CTuVO z6PIU*1s!lhlbqPKESi=!n1fFnvPMF0I~#b3$|<_G-iDWD*yF@tDqmTQ1K2K3Loik| z)Y*0XE)mtjzlQx|Kk`>%!#vhywp)tD*c-p?<($Pl^3dD6_?AH*QI}1rjZqM|jQ$-Y zLaXgVB+eeRjeBnoA3jQZF=yCmuF55{fa%1CPZ6S%yrYsZf;vhg>V_uoKg{dEI+>$p zMqF}p{MV5g2fuVjaxs|Es_y|bpN|A*r~c}}qdpR(V43p6(>DSaacRzo>j7NKJ9)jaqKZT%TJ5sr;Plp4Jqqu*N)J@1SX5cI{=1-Q(-;!!jo!bt<4#OEi zpE9ISI1^4uPhgpT;4l3-IsqL`r<9hvJgh8&y!@B{D=uyG7S6(xuMJC^diSSY>b!M& z^W>S)KQh(RPNR6@8-`}$y*u(RT5Z1Qt@h|io{Hv{`=o{KoybCvW#EYzw~z*IEpzFl zO_&DX)OJ0g8y(0U7m)gdboc=;@4=Ael4W$`kVKkHU@&V_FMO`@iqkvdA4WdzX)G;92L>AU(#LZ~Mn7{I$A_Y#e+yR4K2CB5tD)^+c-!-pTffA-@{`Q6>W;oM5gs7yLUmb-TP zJ2xG%&Of@Tv*intWzZ-qM0P-EzRKDfESfL}i_F&0FFb3|asXlE=#MT{d_8z1Oy0Rj zxx}H~=(HLpxSS|tKOtubd`dt8eZ=?*Sb8%DN$?CF-+je<{!aO~5gGaC=gb@&-D7A+ z|BFoBXPO`4Sj7{He!RpHU7j5co#v+#S{;I;f0i1^iyU#4lit{6i0i1HUX;X{f(MKK z!hgzaz?lQMGv%K9RL0x`*9K~_DkLfz7e*Phl^vm-&~%{QXSR_z=`2IM$L^JHna!7( z_?0`O_?#ZBp5h*7EJ;JtdmCAG9QMUMrs%Tp&7aViG^O2mt;QPf zSq(Etks)<;iz980p);Ge5t!KYOQSY-;kO-lDz$@wa663`wB0Z8`fk$Xz2wi)^$%#2 z*A;bg&8C|+A6~H$ZN!5#)4o#NrHbVo)y&slq%m$Cm538jbVm91aN7!Mw&eu6yE~up&YL4Irp9XkB&<#P4_*&?=hmYyZ&lH#E^X}ARU_(y; zuI+sXTolRH?~oCR5+oxcB7!7I4moEK0f`bM3`ou(NR}W;BumaJNR|weBuf?n0m&JO zl7%;;(|)_Uc-Q^*`u5#->-Xz9U8hdhsrsMORi`>ki<|39=mp1gg;LWc5R~<%8gvrR z6NGHk+ZD* zD^3Zv2)^V|LT*Jzc~3Q!E5V$bd{v}ilhZ*|&h?hVazJp0NJCOiKCe{HhH=_3eTkH- z?j+9Z5n6_kgPav}s$hjm=T}stPItHWx{kVsEbq;*d_Fef*Vb8?}t~^0_ zCj8V+!L!e_&?;%3UpO0@+eIZoAJ3SEE3C7IfRnVeGy)DGylQ!DGLP<~7a}xFQf2`m zU5OB&L$a54Q9{wxf}p&8%gvmY-)W52L(fB)fU!=Te|aj#bU*Rwy|o1`o9VOqjmDfz z7_uYb{zNL(eCMXk1ik0>+;=O|aoil=Dd5Xq+S_jKhc2wOr zSCj6Y4#n(=;2okOgHR}!?NeF%L?VNaO+_y2x*tL$bVWwU3e3em`6)PA;bo;%an>L_ z=6aJ*ALYk>!B08yg^oRz$+C&rZaZZ1dX6!L{1^k5)zXB68nPx|q_WXZmz=$ajon+SHm(sO2aD?D zsojnzD$gC_OXM<&Wyu82&mB+loVC=7F7@1)#b@3aygt>!seu((;4^BN)+KHl*3}v) zMb!B$g;=iV=$^p(@KkwEFU6svQAEt`(KRlF&B1j8r7LGx1S!T2x@m~~?mcR2ePWT= zlwtc&b+QA~Re630!Nk&ncX(O(ai@i@9XTiY4rULhd!8UU*LXUs+h%VTK{Vt&GzJQn z6DAYO{M4p}VnVudvm$u@;edu;l?4kmS^`7Yf;)swUaUw<_u|z(dY-LGjgoFrfyr1B zxod<<)%|tS0*i&sny5Akb|oJ$Ol1>74<%!(@25+>!QxyK4>vkX>qT(SfzduLBEIe2 zKJHjZ)*k-OSPxOa#>}LE9=MvKq3f{mEa=@ti8mJ7dM(vm9*<}CZVu6PA0A+pnu}bi z&zMwn zT&RO!$oP>Qi0d}EFfBd!9)}Ub&85rlOR-iK?7evR^+g>8s8NtIu@@s%A54^9k+aID z#O*bykj+nV0?oa`-{B?@$~cg;U6^@P`?`(MaimE1;^y4Zq@nvQij0=`uA@m>N!K7L*%j{#@8yLK zxENOq(r>Wbz?tbVni8JA2?_e(O^I=@PN@iM;)(QW$cGOCBxCn>s?XbS;FJWYIfNrp z7??9p&@SWpiauoDe|^sP&C3lm$|~o&>{`cNj6AA!yQ|Z*maDO`it+wSPL6Fnmxs$@ zY?kJUl_cC_L*090tmLuuk*uyI_YGH$IZxe4rBTf~%I!MZnfj_gpAJ&M4{q_X7VM@G{jQ>0z)%!^^}-Efnz$x z0{W`LQ`-0XuJfHos?C=^s#oF)?R>d2=3;HJ=~dR2EO$|@Gx1%))%QMLH)fH->cOQe zvfRhp0^4~td(}8@(cXAndx2HlX~CyOTAE`$)1HKwAuZ`wzru!eEY$^t2y46UBKUa@ zhBdEev@Qt842JPJO)v1qW7J(M_a%AaYsWZr_WIR$4kga6Q?;5iF6XC z@xBAOEs-kHDM@+1HJp=*Xd+pW^Id8#S|G2cZdSuSzql}x5mTFctIlQly+O2xc{Yvr z_LjZp^;Do=@z9~{HL)XxTp&-jaqy_F*{)54RGnvUTlm4C-xk_;Z%yo1WjjxOg~Y znmE|o6y%*)C^^Wxc@|06@8P~$@G+>99}P1LVUDTtRacly*3Oc$1G2zDpAI9_VWBKa zp9|$`h8QOW#W>kLB%Hp(R%bnjwvZMJWymSPVfTRmA-;XgTcaUjh;sxFclI*EZRWb2 zJ{pT}d$AF|#fh@OzTp?5Hsm0^%8FFBHJ$)6-^UULMPMq-6+z7GY5g%75`Q}_BkF=(Ef_4q%Sgg7?U$s@% zi2RQ&b6!9E1NQ_<&coiRRV#I`_uNap*2Zg5@h{&fs6 zQdaNc(jz)|Bv1MJzEF#Y4vims=;z3sCiV8O3as7YmQ4^xE5V!)njzJoUo?Yo6F%#^ z;4;Bec(q-~QX+$7XsK#ND;>vuHExr~wpP)csqIDhxP_lVMTl0J^&U#z0~AMNq(}IM zt;>4r6XH(_o6NQ7@dHq)wGMb|}ZBdlJvsM@gXqGr^=rnD-zp5Y$F7@@tzx$$U|q6!STrZqfU zlr|lS=Y$WK3R7le2_7C6repOQCyof;nYNP+<;HVzUqMpdDP&MFsWQSroGG62$!NV1 zOAt$cbtc|wud|uoZF{~tbYhEYoRJIi^1$VId3gv;p(~MpW;Lp>MTdo9%~Ys{WxD@e z6ZEr}4Rwi_OMUaitm;x{uatp6R4Y=VLdqf;Xn|pi{f@oap8jcK&Sd0b{Ur8xlXhO- zopC`AYID4qp@;xZH2r8t3ZA%A>zY8IwHa$@ z3q=uzxMin8ry`-X1cWwINIgncig9Bk#~hYTKMDOD@r}C>QAehc^n$704a-iqX=Zn# zSO_F(udXZpR?^<_MC_oB&RjFJJ(Ybp;8h_h29~^_936)pPDt%>|NL#?>(Ybl#SK~YZ4zp`zTVt6 z7^Q4rtr_~~+}HAzC+aSZA~;77Q1NZ91VvKt7fz~5HTtW4D9(sQ&GwZS}aX{evXpi$` z)=FKhRogoq-#p|HqD&EC8|D@_x$5LL}6OzY_ zZ}LpA16mN>$=$?VRyTI{-@4B&pFNt>F-E$$f@dCmsx8uCIvN6!zD({D(PUIA&GDd? zx+kzd@?x+2E0K=NE}*&#sEj#E*a0)pkBvP+Uhfc%QTL~5CK{B_aD{%xJMvo21?U=+ zw5s+-K9hj2h1pBoj5GFh7SAS;=uXd0SPuJhnVXfLie|mkYiNN~o>^CEd%TwL7P9I# z8E%J6mD4$%l)(3Czo;mSm+W}|fXbu2j%w`|_IQ-Zb$)uQC>D40X%3pjS0V$eW{8wo zbMmn&y8NuZ;Korsv}io8_d8QV?$M|n$R3UZ;}7MttX8HZAyg6Q6pY>!?S#z%n%A}y zE3z(aXWnEpBzT{aFm56-!Ig8YFHyK`T{+Y|hVq`&4(E1_q`@%stD^+;feL8LEM?7m z^SXucE%;cWye{=&&Cj|I8zJuCeK6AA2Z4jtEY^4Eo%AvkO<}%x+SNC2i8eRZX;vg8 z6hS;Y)z65Ac4DL_gp3>6BeQsAu`N3-O@|2`w&;@!s)@X-4{$XbXwEb)8y*pz)IH5v zn3IOQmFWMGMV|jkfys`|QHV5bGW^7g+InL}GOJ`Em-OzmH9a$;zvEEH=Fa@6 zDrEKEMmR)4;Bal(d*>x|AUrlSs^za!8u-MOvp(u%eQLtZ(|2R;{mPQwIR&%|qO7#* zWz1U!M#(uh^ZR%si&@9?C=xkJyEa%4uZ5tfN0f+^&0ey3yY{9MdqH11ihiv#OpkM} z@ikq?0>PRGcSV|xxF7_nlZZIM)(M?&WN(!nueu)%E$}M%M!hQZ&ajRr@5ky|rp_}P z>7Wr_CgiB#8`6DPBBW$Ri56DiN@wS7=nJff6lif79aJ?3U2b&yV5MH61y{!T!iGU4 zd3txV6bd^gyI_m%gX7}JOp*qUvjGb_v1pIEG%ZIkG8dUZzdB+XI*O z1^W5W*I1;nSZ_MV`Qy&47Fez!6nQ{`5)}lT9)0rKNh)J?bl8rUuMZ_@QPk%K&x#}j zMS*i4R88c3+9RWo^-HfCxzsWw>NpjwGkPxq?@ie8%qAskr#6D?efu=a2PvNBgS@@A zeGjEe+1TvSR4MGX7&$uHF&pt8P~~8Q__H_Kn_mkZqhnMv%je#TFwdG~q(jSU3D1Il zOrl$)QsQ9~MjlVq-n@~Xwu^7>0Wvsu$@1frQeV=6x|0L)VdAPeBss?cy`>nlO&m3V zo%9)-`2kTL7Sl0sy~%xBE_9bVj|n{risRLLD^xSrAA}6LW(z*xi@6zn zg&3<7`}FH5#+t(ZYNXTq-FxXl4W^BPbQbj$0j1GcK5G`UPq@IeGKsY47KTqDL%xZJ zy|*=slBE)c%c*>*+OsivT2BwR1)gQzOzFNKe;4EU471RSmz!fA(S<4sS(dnFS;ljg z+{bmR2Z@8-5{%YOV#LYlR=5{v8kQq8x}*6+GkRQR_gm4ZSZI=!c0FE;jJ>E4+M5e` z7*Znpd^AI%cGi`i@i6DYF{xq=14zyYef-5#t=<57#^wSq6EmWww3H4Bf3JQ?t$;OO zTTa;MCA*}Q8Qo{GBSJL)`x;dRtJr0tUaVetj~<1PlMv%57)I!uDOaJi1Y-|*PF*4^+m5hs zdTco~fl4=L^!fjSVH4u^<+<9$@&5EQsdn=Ox>}dN2VA~sgd#G z6krc-G`_RJ^|vf`PJgf!-K`EiM!5S7!pkwvdY;T*A+ZLBqWUcM!Q@bTQPwhTm9FFN zY-H&4JTLJ|7hgJlbAh!>Oq~Gr?34axPZD|(>S476sofQ!fq}&acgNMyM%(_Eh&A_@ zTb6W}iq9U}+_*kQ+#KsA#2+o&lav%Pc~-7mSZ|~PuhB?0d-5?~MKYmt>YPn3!fl^~yf&-l%1dgxxaWmur*qho zgz^0Du;xUCP*T;4BCL0)TqcG+yf+dXZ58JxA2Z%MzW_2X zo^Yw9uCSM#sJ1I0Z$L_IoV!sqEK+UOuEfOZr+^{tW{BAJa-&Vf{!|Ke7fUfKKFMjr z%J%l;E2KKaBhxw-_;e^W3HNpAHdxc@_)<>cf26##_GV(|bP0_rol_dmP)M<l`&wi9+nB3$ZJsgyg9 z##cV?Q_q6qkra>WlL^pE5!|kQ_V&ud3@J#NRo^ZHKUi9OH0Z_VLxlLU5d7R8?J>oI zD)VssoJw2DvvPBI!xJg|lXui2Y39+vF@>gRMUHNh4+)otZ&dKP&-D*R=&2RQM-s*{ zEw*TI-W2bjOl8baasM!=nd}!UDu_9R>dh=W0hJ=1#1p&_n zK3y7i?WO3aw@-84k8)WvW~W4OTb)WuuFDVKTUW?L;G0pLv>ov5;?~>o;q#$0BR3kT z4Vt(XN}RO$WQ7BJvA1rn2pr$3PfKb5n>b)KW9+52y^I@itS4m}Nk*%(Pxr6m zZWW4@Ybf1Zx=0~1EUR^y1KCKz?)+0S1Rt=_d5Y(C0|O2oMelnmeBKr}45ngJUR=73 zW)KsSf&D&&VJ!@+dXg2Pag{X|u$*pWSe-J>T}R;tWP$Vennf znO+IZ%Xhq^WRP=(A4KsIr_Sa33nh4gm znFR))OTF*;mvjnamXKP;2}1b~;71f3+GAGW6$DCgQwZi^`_;P!^a>CeNC9b{0y6ug zX(#m)Kl!Mx`!w$tirYPcw$|tq4zPLKMC3n=PZuYpU402Qk+5n{-CV&!Y&fT{eXb4j z+*Qvv>N$p3h_qg$e)X}vtt>??3w+=xW$=*2lkD@N^*~{sOU^mOA9-| zp)^Ug=G^Nc=~J66vuM-7%vTVxBI*V|iheRsIYE#_u$RJWJAuq#Z6d?9A}0~0V;>g6hn8RBpR^@gf*zi4&;CzYrdS%)Rc{+C;Js4HG(Q5pncGtgh6zSE0ffX_&q zJ=sb}acG~HYEInBdgM@x%UOY$^RES#V_$q6CEDPK{4`Vo1uz)Tu#6Iras2M)RJr zQ;ouSP+eHX0*>>$HN|PeRS)rq5F}R}{gUwBCKFr-qZT=(^s2U~ympE+3!+-XWgTVX z2Gbnv;ig+JT~-&D#~Kct@7Q)3lB89Cv|c@;*)|_p+gRb!cBeg}CM&T&FHz>OoG(AJ zv4XH?N}z>tF?)(t(O8jv<=l=3k*w?nV>A0v(6mvWB76BnPm^JBT?zL}qdeaHvyaJQD2ri(|#L-CQjp^$hXL*Oa#6&Ib7}W4mBap!6-0-IbDUv`cKWrwDm|%jz#S_0~W)E!*Yof-l*aJS47*LBgFV?aW8Xw1D>-eBe= zw`x31pcEVy{=lhwYR2$Vml7Aj&8m{-TLK&=F38O${9JuZO0w+CK~j&0%1RwT{0=La zxp$OrR_QWywOo2G+oUZVe@Ze#dErskaoi)5=eRvv0%dWvZVY-J zJP)bN{!p(;lp5h3L@Ka$YAuba8!V&IRd#(K(TQG3j1W&SBB($%l>I{yHrbKV-X_y# zE&b4gsQ0y5p0SBuJMWyA)^I2Sgc_>sh-&dsam04-eIx@TxHLv{hsQZ82)NdlBkvI3 z?H|0Q)YW%@T#r5VhT+Kg6n2N2mn!(ixO9a2T^@9@P&AQ3*0cAl#L3mG*)~`U6Q?9Y z)}n)+MYUqr(;}G+b2@>6)i^Qw9qSp!O2~c#rCp6 zn1^_T44)nacQIW4)JuW|Ii0(@K0x~ZLYdLDB z*W6JelJDFh42${s@~Z^zCYj%KN3wOCLl$92Pg;9`#i(yS<1s(ghD-vAe#?qJW=|`D zZ-$6}DuJblDd9|;Wbh%R<*~`Ddz`t5xf$BsgQj+CBKTX~!H;BFy2hM$<;7!Lw5tN? zW2Kd)oIk3xUrxiGO(M|6+qWooL02y{+u|tf{7^^XY{==6X6TL}VMiZ^t#411sF{y1 zCB<4(y@a(2-pz=};$CWhn{Z`*jvp8GJZ%I{Z*!XaW?oYmNve+{pyoygUYG#Q_->d#CJHaZs zdhpa!(_sTa^DJ?lbbT~U-;~AC-l3Y+^jq)sXtspF!w+3N=a?E|>?>Vsu_j&@a6KqJ zKj3Fcd|4I0gfBYUFn0U-EgM`jz7n^<9z->TwrYukorE(osoGaml`UA2R$uLhjGZpg zXD&o(!90f&lKF}fg>V@)vT&09d4iC%5PA7BOB%v%?;tTxy~^Ota=F=OW#&k|K6)Pl zn24=EwhlM*q*z7Y%jdmvjMa{}u>3+q0R>#Sc6HXGcI&CyMyM}Q1Y&!3uabX2?dhk*l@dv+YiVRki*NwG-nr4jwUwM3Q6Sr~d68LU*_HE;2nm(5{;qn);D{pZRo>$#AExM5rtVy&u z++B#LzDFN;C&hciuBx-Z@Lzl86ZEm%)3SD3hS3N*5`dxqU7 z>e7?7X|&KQjQo`0?2WRu5e4n6Oy)Lq!+j(w_phfUA{so>qAtWwsFbdLj=U)PQB1T7^lzHdFB-RQn6POuQoND47t8t_k8N;G5$8A|f_dih`yNv; zZC{T`5B9C)65Ykiu2$wn^s8P^0}bz-3Qj>g?w3Quyi)EU*i$d#WXrY4Od^GPY^;zH zNvB=mk$GQpKz%Tp*LhN%2`x3SG9m2QTVxJi)FtRg;`^b0_N`;Tj5(gXV#HGRG+k6a zl*%la0MTlMn;@;Y-&Z+of-h$_-woA*R5 zod*_i(6c9_1s%Vs4DpKZqYSOJTl*`N$AQaIo9M$Ec9?DUzjP_R8 zy!u?M8~*FD;tC294kkl=q9>7Ncdv$!;x&~iHPwo!Qtq&&i z=p1mn_O;io9XC}f$j9M9!B8@1voGTm@0#G^AbR}{_mj0Ot* zOF7FhhV~0c@^PB``E}6GIAXBxh%sBDk?$D|u3@@6pih z26lz{B~J#CleN7o^z;E6a*|Rb%sgVto376Zu?nryqqz{P)jo9{k+EGJ8aw;gw>oW9qNfFg^@ZOSPA#{2$IbmjKv-8 z@l?Xfo6l@$BQ>&Mltx`GqgxZXmmXx3=N8z}zfWjW{I2m;0Dtn`F2>r0C?RLV;o`TK zAMq|ReSE1*VnU5{agZWPW$?Chupr8&<=rFPE_8ad(;2mdTB_GR+H5f}Z3&Svu7Z7$ zCDk9u3!!Bf3L*5A?HhTR{$SYSifPol@>8PWk^NDa{Ww>Q18jP-~cKW3#E`c-cS)@I~ z?E*Ww+{>kMDznCKZ2WJ;t*kx5Qb3h6q8i@k*7Pq30aI-C_-YcF)t}m~kC^OYO0_97 zMTY*5Lin7!8#R;BHM4kHlU%-MzH*=_L26-sjnS5gBFWKRwlAt<_ks!%y4Dz8fzq zCWckbORMSXceVqqM4!m9R}Z(91^2x>+tmmYJ5kSh+WG?T>J!`-q5oM{#?Bwm zbCE7RjGBSI-ax{-fvqQc zyz7JZh}Lf9@~0iN6~0oQAuaNeS?f7ZyKXpS&i3-4OM%6Cz~_g0!bdQ3Xi6P1Sq*7) z)Z7*mgX-fa?2?3-WIE5M?+QoUzQ9*}x3RH7bJPf{WL~2`HWTZ%n%P-%9=&&gc=qe> zGb_^H)ILPDf2eBA;94YOw{XqBU}!D6Z}3U6R?iTaa%4L1JWiK1=6pH%UEPC4EB+LlH|e zOB)a>lq0TZW@`w7H36tu)Y4qf!~%30#uC+0vbQnP(>DZRK(oSTh86~LmIj6(ELct! z+GHICD?Mv_LlDt#D=^g8GrM7EYh`Hxt(xR>JvVedtCY92F^85}+Cz*j3~g;c*P~>t zXJBFhfz@mFr6EdkP_?&h;hJIX{;iDdXJwau%Mv#+G&A61r~j->*+$R8*32H-O?_us z6Ns@LymAl)v?66$Ih~u9X7=WWb~YyZ@|G5&CN_rpcF+eTp->Y-1z_p<7Xo60Qz|(9 zj-bOi&fk^%p5fu)acl!;eOr0L??wM72df-r;D1#)?1)U*4>bK$<%rM&{zT;h(VwgS z$;y%cWaW3ishl02e+8%C5g05mcm5MC|9Y$&eD6=gg9|?ZPy(~VZ?~^CgFFOM;2Cl_ z1)PEl5VD8wq`@iB3g`*^Ia$EzcO(_gsfAOR!9FMCuf5NMbAUSkrOU!jYght$_9gen zzj$!=x0V0UWs&}58&*f0k8F3i1PhQNewFp%+~8y0kfse~CBCJ!5MVOYY3W)$cK z8?0etdH{5TB|upW%rBt{Fw$pXKnP&!!-W9;mqUK@3p6rhsGB0iv+U zcGyeFfj}b~6$P#HbZJ){K5j_9OM*)Sx#*%XR>d*V1!=WQeOX4(cicN#6o(7fXWIVS-o^e}b?`aiSB)wUe{Juc{aSUfs0@~Vk!P}f(e|sQrAZMt z36a9nyx_>@U~QjqyKIkUmWPslBu9^j&UFXMEW~^SyGScUVMuDlg>d&Sye>_p{(vr& zB<6%9a+aBawkZ8J1s`Xsu+YaCM+eu*z=1y*{VmJ0`CP+e=H`dB!acTZ|GR#+iL&1>v2!ksDofY9C6 z>W30R-nnBc2qjm2zOfPsJpXlt1GCZ}CLkvLc3BYxUH!tW_@|c@Kxq7RS@HSugDgf$ zO1KId67@&6a)&2*i5FEh%r?5Vfe0P&s?Qf&q1pfk`n=u-gaD=-+^c>*jIV-s{TIy< zHNRFJ)4xR>a83gzGK6aZtnt}IfDph0)=MXz_%gwf%0poSVug>Z{e8VA!f#VjG}KJ& z$@n-wNi7-;)Z=8@B%o8u7JkP1$m5MbKEt<;4ZG|FOJ5xu=4H@yk{eqr;E=kcrKFad1)bz+drhX-G3$09d?c1akNscNncJ{ z165`1W?!`D_9d%1y$8FVwMwkc7@?0Ie9$UOsPtmaKt$7Dsneq^3MU^db6&mD^9EGS zm9@XS+=NKutFOzjzQ|_v#$j#X6X5v(_7bp5PS6Cv{P_|VAOtYaz=h1e$bSEO;3N5WpOVH|4}R{!YN|r&wuekxDb+%qgNJ1;~)f`tb3( zNKG6Mp7fniBxc36aeEd%$;y#Zfw?nLwn3>pP1-WVvfh~e`6ZFNB>9#ih3^LAB~o*& z2gPnEHCFFL^@yRDDn!I{aLuX)v<7K3zZ+##5PWg}_Jz0eHB!lkL>f!4kmS7rBH9DA ztw+{}lfo1kxunCvR8}?w%+HN5Np|@JbA^+Yo<0sCpf`Sbx))7A+e9wieYx&w9^-kW zuE5eU<^zf6BYkJy-F>!+hJM{D^rf6aff=E_&kY7zg?C^=JbELUOl+@yWVxJ)Z(|Yw zy{|C|EM)k70>YCdI2$-b4W1VP#Nlx|>^>HJ^8ogRLC{;AUp7Gc>-{bm<2UkOK?j&wM+0!IlPq5Mb|oxRC!zoehT<6v8R|*3p;TF^ovV zOHP&`_?Hs!dv>6c>i|ZK|F#DP=J!?r@M(f$4fy>@3&a=S$PuD{VE~TtdFTOz0OmNn zw*Pty96iwIGvL483xnh2bN9da{1=~-z2m>L!;ih=zxezYpOep?UmJY^QAQ-pB+vvz z8NemXuhBIu)|`PaT3`zjiO=Hya{$7(!71#bG#~_o8y)b2%;5Ap^3#u})hJwgHsm!W z^I|mesg&xhk|?}NpxwxTicM&nfzJN4mIuXGoFaMb{$ ze;BwyVFOwf@r}F+JP&~P`7%Es1TfFRg-*Oy(dfQNvZ7oo`aEuFiN5PT%qqW2`S9F# zfXzd@QVuV?0jFQlgc-XG&II~r|3@AG2m$RCgbP{15B`okhI4=m247XemfrR7!tdGx zFtZbj3%0*CuaiIyo4;Uj(^gYg2$$-=_ZISz+ z9yEIYt~Wp%zf=PP0ZYF>ur)|P4=(kctyzwak8ht;I1cq%eR$!YZs%JHpLb{O5J-A& zm&%CeKwlz-SMVK%Fi3vei4!~Ux}$^d#182Gr~}E+f%d06u!GY{$hspc_>ci~Fq>__ z{lD)3w4*0mK=9KKEMSH57dpW1CW+IF#UYcve}U7@IDqC)cK|qt0b5^yn~n!gzazlY zRDc;_CWURkP1NwrANZxD@QG%%+W!G6=b$=%+N>yjf~?-RoCQlanIP2L^3i`96)boM z{xmAUry(SOW0LcoPSY4CcY#^-&uM?=?UphZ*IERHHcfW7UR}SC;KixWJ-%g~CmxD5%$k$P< zvC|2Ex^=*GCit~2-|qmelY$ok7BTtOBCtFl1mMFC7ZU%z-Y*<}cmZ(0zqH8fohx0N zoDk8J{OiYAul%h%zo`JYAHa8#MlX25cR@=Oyx=CBem4!m_!>VdRR2+-+K&oVe^dxq z0HAs&2`3-^;N(t*n&PKV?#J3Zo5Rx@BJuu+wstY7EI&NCz2WTwJY*G~2WwgNXY%xboPav` z@53zfKNd4#qM48KSH~qwiL9t{oQf~~eV74HQ~c+hn_`CNL-$8#<rX9_o#D5rfCbLyRnNCeWKp=#&tKB`$FD(7ycqM3UkRMp@_&3heqzi2@lo-K zE&s>IrYE-iA0Hu}*z$jToOWW%|MAh%i7o%f$1Eqd{QsHA0TwX)^es;44cN~KxVQ<= z{*Ig&lHmU6mfT;ui+Qu64dMLaZLt>&;$rxxwQPSFlKi&KKizTQ>Mc+S0<_D&-Czg+ z58nYX&cD281_WzBrN4s_o;eZC{2$#ZuZ33q(*Yimn`#nU6p{F|z2w+ig=Y%>eP|-V zJNKiG|1_F_O@CDBiD=gT=)nmOXnTJe%}~AkAT+#I(G-rMLfbK&n13Idc;BG;TfcBo?}xDI3_raO%PESpUBdP5f^<{$^o*DH`%4tI(V_AWEAJ!>_&3x3X*5r?c=+F=Hg#$nhrQ)2z q++4y!EbL;OV(cue>>@(kqU=IKY~0sa#Kl>zasO_Ntnjd$` zDk9iI!wMKc5mEVUo}WcjP;e0x;kk>5g5k5`@>vjFSl$Z0d%LSTJv~!3lbPUo?;Pu# zN_Ew}Rds)L>(|p+w#mGAnR&^)wj16QOwCLtQ-1mM5=cy@O-mQ2_0O}KO!q=&TRW2} z0aDC=IRL>X(`^nlX1pPoKATn@_SwPBS({GH>e+qckfn0QWud)f5n49G+MA>V;jZ>G z0dIGXh*h=lGlUIqN{fZR3PYty;()eymKDvMSu#Dpe8xjXWu_?)9!`)ZiuXY5aa($i zyJnV_mCl^g!&z1`y*Oj~l(Le{@)w@Ved8N~|21vsOXvs=aM`oA#7M%Q>YOr^=xMy zPt8Q%OqdaqKS7d z#!A1BjS;~Y-H3HcwK3uCaj;-S91= zX{1zW#feqP1Zcv4YudoG4OX+%S z0byoWoK6%rnh*4nM&tbMdl(E++2s<+vs-nso0h19D|w2G5HrG;8ON)D~} z)d7k^>Sc7ailYzGLaiPS0;H4H+kc3nkb03xRx$H)TBy~-I{JF={FS1RdMBV>ufw!Z ztA`^(U+>i~q=yq!sZIb872AV^{iHA5z?4f0UVK#PAla@Oevz()4{eZvaP2D(6l!@F zusH}j{^fx}JEADB{Er6;wMUAw{AY?1hbD-$P~lRP1)-u;V9!$|G*LRy&Kgo-)|VvS zY7Kd>rBb4_fm26oh$t{R*2BZy;SmP-eXZT$76W`^ggd;g0e+>80w**Ub+v|MMe0ky zZ-hMC*1ZiBwVuX$t2?~C0iGJ|4#(+IUw>XZcR1AsmBGFkcQ{qWHE0JztWA`D(@B-{ zB@%6duw+lzxuQkdAa#$8WKe(Zd?@Q$wlJa!jf*nlF|Tds{;;bk<5WDx(cGEw^eoq~`ZfvsbcKs@04!)V%vPPaJAVuMxWDboIoc z)-;#kbWZWa!9_F5iSk$5-4lme9mV-D)e|S)(9X9#JaKL@;Fx=AI7A}5`dC9!(zQ}e zBGhgv1qHn{98&YdAZy5s-p0~xgRSDSKGK0Ms^csH0;oZ6B|>?-FM^d;N+jWSt2nj4 zv^Y&Im@FNFg4h9Apg3k+F;a_v5uP#Z7$9x#uYz&Wh|TH+I$Gl5V z^g2bV9B36c4ALQ-NVAIBL);pqev9%x&EW=aL;9oh($g7kVCvOq?Pi&}-ay=9a+a~RhmD48Ja&P2L8PumHGrb%L^{RiVY=rYx@Srd;$TD~G3}#!&QYFW-H(6- z9RU3rt&mKfQ8L3J-l@x{z;i0eV;kpTv5fU_hByb$NsxAgNXsrjSpnpG>dRbEmw z`a&qX3-Y~48Fror@oruIR(S5O%j3Wwsmu3+=ia(}K0FW9<cF|8|n)2q#o$y8S%P9bZf*59(F|AqRe4G za6qMuAZkx895$#Y)ECaDaFS(;frvvT79tuV&V)GAp>M+38iyT@7*rSP6%7rIk@^zs z5DgAzH8eULMQHh`ceFF=Q-B$l!ZjM(V2C&-QIu$z)Da;kIP|Ci;;=*Gb3)97h(?GK zp$3RU5=Vm_Vj@HwZfM9IA)>9NLrj8*qbm*Bh=d2!VLymCtZpZ!O&+^cKvm0El6=T=~9`Y({xts8k$xOGQ?g zCt!5D7*w#lrj2OMM7>}@u9RQ_Vct)kJ%A1n&Tj~CHAyY<;&XysKKh6rs8*AP zR?!qHNg*Z%!cq1Z7=$|%AO$lBuLTyEgx7;8ZwBF%VFuwikzr85J=pX)S~Ka}{Xr0d zMWe;woj!Rt!vdoB2$r(oX|31OYNVzHhE)UQOZN!zx&BdZ zY-j=~gu#dHBf;Vdo)5TrXpp(F`w@CR2rz-9=&z@k#*~(o*k?{Hv1gUcEGjLtt7rQ5 zyrK#dlj8`Ul|3BJvNG4@Z@#_jtJ1Z33(T{Jc03i46Fl>EJmzx@%)5|r^!-Y}8OzB0 zsPgJ5Q>RMs?B>rG?o6p0M_KSgRjQ9fiBqg+gujQT)=V8o~aR}TdhMU&u~jy?L$ z@hq?vNChlV6_R1jPyIMBhAKW5qPj2{LJ4X*k~e)U#0BUo9Zbg|r|oMJTRXrTD5-{l zf*Qe9of3dY`Tc!DSb(hI(hjtu1cOr2_BRP@7kQ4bnZXev9k_^Bf)!cYFGK~%+7ejt zGguq^NnrL?^9j%1+?bKKeC+TQMG-}M^EbQ_k{Bpv5hYbZquY=LaR9)yDb17Rn`^Rge_jrV?-miD8(UnA|&*U;CS2apL9> z1FU|OKr7=$Pzf0%eUzkHBP9Q_?wswbGeWEJxDVC`f$h63yp>Z8Y$UzwP=58WU>WVV z;^q))Jmk}z01W%NPNZ1fTBInOd@S;0j3L;Uz7Q;I!#xR2G412zb>;%uexxz3k;yck z4q#ZOCZ4+%+_!5IAxKmta?SgK%}m)=1=N;hU-4h^#DFUVrWiWH!3sn7E1*^X#|Bdj zWrQ=P7+@6p5Ca|tVelb_Wk-2ph~;^UkJ;NL%U4Yz23ci+Z4Iyt;EMqd*XcH#X$q~s z=E>k?o(z@(1q@SI2(31ODg42g3}Btamw_3jgu#a?Ja&vH23$HaM}!?5vv)BpKi(u# zctquZZ3#a8f}9eq9mp^(;W|)j*0z&!O{f@^%4GTj_G)VOH%-Fz3}0NsArW8qa_Wb^ z?Z3L7r}%?lK1>;;wP7hdD5e zqqPZO`Bfpd3)9=f>a&4G^*kC+x-s||(hj!_~$PjQ0%&#!?8r zSH_afc%_3u1?A-s?CM~rgn{lil$$4t zL<=7VB=ktoi99Z>^x1F=3mt=7mQU?kZxgvf7N$; zuP$FbD|E2YyD;w}vpq24^M4;WG_K&8Gy8j*TCXo~m%T#8<9<=G{GySEG4K7=f{yX;m4tU672!oS}B%S+XK zzpC1Dj@A!Zb)tLj>obnDkW?RkO8`oJmG9 z^(1R?l7m3~f^suWk!WEVK^meslE{8)6|Iiy4Qv}2njR_tr}ZgUMweR#@!$A_=Kxb{@W!3Eddn=*G)2{wiMSih7S zIm5hh{nDEt@z*aAXMZ?3chbp>+85VtpSJji8~#o*3kj(sN!rNui~r7ZCv?EvTOWku z4DSa8<9_ZGcFn$V*@z9v>vtFZ<@lmT`O%AnD{3Vsl%?iJeJt&Q6iwp{AK!|mHr>>Q zzvTN($+oaZvmW{B-S=w$Qk>IZt%u^p{_>VKVw8_fiLJ-u2SPr1|48oq(86Yw5idqJ zG@-oV*^|h*|1W3opI+_$*$;iEWUbv=`18wq7FPV9Gx&P2HKxJinH9s}WA2|^arn+Z zXU*TXZFGkv>!W@(c-6S*81}={vkhMH^ojC`T|!cjCZGPR$$Pv5!98qruzmcmCLi?T zhHvt+9WIob!qNBo)#^R09)A|Wbo7PHOTKacZ>>JQl2`#vF{|A*sdsEtN|kbCoET>| zTy)Sq1%YZiZXdVCBD@*qeb#ginz1#%!?Z0~D=PmsdG6%{Yq+x}hwfV`YsyN-_*)g( za!R`rX8bY%-$i0t1Lub-30AQYZ{ZrGO<(q=7f0^mmfN&fE^$#4?6;Se@YX99IPhdh z{-@9x>yE$tT-NGk&;6%YWX`>TN}is4GI&TGtX)JiBo8BvEqQz$nZZEm?u~oDtN;4W zbzht~_iSEk{z(nTbn-RR@nZ7w_&8tm*YN0PU!}^0wjeAgULzX6#bmU1^AI;ML-2UJ z$~1Y-Pn?1>`CK>3jD$;;j8Nqajog*ukIHVLJ_%n5P=W*gYJ|)4hl%@| zH@LU;W*B(iNbjt@|MtzUCzG_L@leQIRyjwUy0ob6hD67z=floPGwLP>Ixxqg>2 z#dt9lbCy4%<}ODLvTyt!iVDKS$7qy!p<6zG#C_I;JFwaq-b+IG;u6DKzhS-7ZQ}a9 z1zX~BpBTSr#eV`dYC1)74Iq+d0P{f73?lnZusu5d_aT{eu7|eGdE%8czlk)QtI+qn zxkT3TChjGznM6)J{A0wl>hgluZ~6Mc7GH0AGEgGBX}ae)fF(Rha(q~f*nHRuXGG5P zOKWO&b?A0FKq6(wQFjw;YubjU9*XM-^O`^v_r?nc(MjHpxo1$TvZYB zymKY*hECawYpzDv#w8C)3XB!LMa|9ku&8l=>fEoO=i82gH!jzF_)P0o4yIPPtZW5e z#4#@aU-|P_D=Yb0d9Eu@E491}-JR@l(x#headO8=5+Q39N$L9_%4Z!$SCmYuE-RWL z4@?$^_kcH{l@Lo(nh4r!FIZATiYw&fojjFS{k!V&&`0_VU6taho44b)*-Yhe-LMai za~s8R1|eAaY7Ts2wWQcSv)rz+?&>C{_{n;MDJWLmAc?Hr9+Hrcr}7kD4@BKh2=mwt z)G((?85JIg?IOW!kAfRk4BkD8ZAJ4}hK_&!Ysb67i~or3To9%yRd#gdEuI`;NsKWV z3?I4~X-bx-;5+r?3EsgQY3$38paicYcuj#P!P)5n6I^(6EJa7~g~LK@q<6cJr}g3y zJ^?&1)5OzY)!W3T!JjmrR4trg;^S_Nz5eE^%vt%{Vm`jQXY9nMG!rM)w55O}gu~SY z=HZlLKVAIuTk5U1U+S2DKKEE&g_vl>5zZPacyKtG~59w#VVDf7R&Y4SC2-0wdh*r>xa5Ddm(JbpO{S6gRq!P*0ZKEkp za-MGHd~M|q3>4Z)r~se{YTq|7XDJZ^`^^~ zG{&s>DzqBN!jC^I4(GEnYXFZG?yfk!9fOs`jFE+N zq=`dEycBV8@#&2b|K?7LoLi1Agm(2v%6P7-ziQGgXO^XUP7`m$-FV>2!|D0Yth=Y* zjQ~5# zP7gbjvol1?)LMd4O;U{>{JH6xVkGuc;RNPHl&@0RT;`>k1`#cU@el3#arC0TW7xlFYr@4>-IP|YF&j3X&s zh^Ldh>1p!7)L}g!Xp9qNP5ZUsR)#;d%Yn+_hQmV+F5&zq6(QrBXKlU^ac|hp_-|?n zAs#$)&5^ra!cS#+Omd_fdD%I^rZCh5R=I*S>fI{)K9TTg@1Cn4ANJ15`E!#T`BDC{ zsu(Eya{?9YSs+j~CHC@AlP%=65zc*2tj^h9IeU&N^{+?lgjLmYY7_ z4=pmS5&wCChYHnixCP3kH)DL!)_L*U@`2o~NB{JJFf=-~mT=jG#^~_2cqH947-Jw_ z=1e~iwaMp)1?=Iu>&BJffSOnzb31yH-zEp9U8WM6#tU*?hocRA*NwsGK_HHQ6s})O z(xY7MMu_OVKzZ9r-txH+-dlIpO`z1NE8jQ9GViWM&K(I89@EjgP1f@Kk?a}nBWTC} zPc%3Pm3UW-AqAFm80c_OzUB;knc> zhzSt;Ld5H95LKYxoA&v+X%{TIZ{qi+*`J$6X+Rj{<)d7KRFLw$0DMILF=&zwhYY^; zqkOLVK3pD|A%d?lp$T<_h=D4KUbtx0u`0^f4iPOCE8s%^d59P^t5tli>#YNmo@;(= zZQh!0*PmK9Y|oZ>70dJ@Nwrl3p7YZ;^t=Msks6c|t>(P|(2pPevz&sTXPPH}IYvye L=mEPHbY1hmUCg@; delta 31395 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 diff --git a/Unreal/UnrealPlugin/DazToUnreal/DazToUnreal.uplugin b/Unreal/UnrealPlugin/DazToUnreal/DazToUnreal.uplugin index e09d97a..79e5430 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/DazToUnreal.uplugin +++ b/Unreal/UnrealPlugin/DazToUnreal/DazToUnreal.uplugin @@ -1,7 +1,7 @@ { "FileVersion": 3, "Version": 4, - "VersionName": "4.0", + "VersionName": "4.1.0", "FriendlyName": "DazToUnreal", "Description": "", "Category": "Importers", diff --git a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnreal.cpp b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnreal.cpp index f56e791..df7335b 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnreal.cpp +++ b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnreal.cpp @@ -1031,7 +1031,14 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr JsonObject) MorphName.Split(TEXT("."), &Left, &MorphName); } - MorphMappings.Add(MorphName, MorphLabel); + if (CachedSettings->UseInternalMorphName) + { + MorphMappings.Add(MorphName, MorphName); + } + else + { + MorphMappings.Add(MorphName, MorphLabel); + } } // Get a list of morph name mappings @@ -1224,6 +1231,9 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr JsonObject) // Create Intermediate Materials if (AssetType == DazAssetType::SkeletalMesh || AssetType == DazAssetType::StaticMesh) { + // Create a default Master Subsurface Profile if needed + USubsurfaceProfile* MasterSubsurfaceProfile = FDazToUnrealMaterials::CreateSubsurfaceBaseProfileForCharacter(CharacterMaterialFolder, MaterialProperties); + for (FString IntermediateMaterialName : IntermediateMaterials) { TArray ChildMaterials; @@ -1253,47 +1263,49 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr JsonObject) //MaterialProperties[IntermediateMaterialName] = MaterialProperties[ChildMaterials[0]]; - // Create Material FSoftObjectPath BaseMaterialPath = FDazToUnrealMaterials::GetMostCommonBaseMaterial(ChildMaterials, MaterialProperties);//FDazToUnrealMaterials::GetBaseMaterial(ChildMaterials[0], MaterialProperties[IntermediateMaterialName]); UObject* BaseMaterial = BaseMaterialPath.TryLoad(); - UMaterialInstanceConstant* UnrealMaterialConstant = FDazToUnrealMaterials::CreateMaterial(CharacterMaterialFolder, CharacterTexturesFolder, IntermediateMaterialName, MaterialProperties, CharacterType, nullptr); + UMaterialInstanceConstant* UnrealMaterialConstant = FDazToUnrealMaterials::CreateMaterial(CharacterMaterialFolder, CharacterTexturesFolder, IntermediateMaterialName, MaterialProperties, CharacterType, nullptr, MasterSubsurfaceProfile); UnrealMaterialConstant->SetParentEditorOnly((UMaterial*)BaseMaterial); for (FString MaterialName : ChildMaterials) { - if (FDazToUnrealMaterials::GetBaseMaterial(MaterialName, MaterialProperties[MaterialName]) == BaseMaterialPath) - { - // Remove Identical Properties - //for (FString ChildMaterialNameForRemoval : ChildMaterials) + USubsurfaceProfile* SubsurfaceProfile = MasterSubsurfaceProfile; + if (!FDazToUnrealMaterials::SubsurfaceProfilesWouldBeIdentical(MasterSubsurfaceProfile, MaterialProperties[MaterialName])) + { + SubsurfaceProfile = FDazToUnrealMaterials::CreateSubsurfaceProfileForMaterial(MaterialName, ChildMaterialFolder, MaterialProperties[MaterialName]); + } + + if (FDazToUnrealMaterials::GetBaseMaterial(MaterialName, MaterialProperties[MaterialName]) == BaseMaterialPath) + { + + int32 Length = MaterialProperties[MaterialName].Num(); + for (int32 Index = Length - 1; Index >= 0; Index--) + { + FDUFTextureProperty ChildPropertyForRemoval = MaterialProperties[MaterialName][Index]; + if (ChildPropertyForRemoval.Name == TEXT("Asset Type")) continue; + for (FDUFTextureProperty ParentProperty : MaterialProperties[IntermediateMaterialName]) { - - int32 Length = MaterialProperties[MaterialName].Num(); - for (int32 Index = Length - 1; Index >= 0; Index--) - { - FDUFTextureProperty ChildPropertyForRemoval = MaterialProperties[MaterialName][Index]; - if (ChildPropertyForRemoval.Name == TEXT("Asset Type")) continue; - for (FDUFTextureProperty ParentProperty : MaterialProperties[IntermediateMaterialName]) - { - if (ParentProperty.Name == ChildPropertyForRemoval.Name && ParentProperty.Value == ChildPropertyForRemoval.Value) - { - MaterialProperties[MaterialName].RemoveAt(Index); - break; - } - } - } + if (ParentProperty.Name == ChildPropertyForRemoval.Name && ParentProperty.Value == ChildPropertyForRemoval.Value) + { + MaterialProperties[MaterialName].RemoveAt(Index); + break; + } } - - FDazToUnrealMaterials::CreateMaterial(ChildMaterialFolder, CharacterTexturesFolder, MaterialName, MaterialProperties, CharacterType, UnrealMaterialConstant); - } - else - { - FDazToUnrealMaterials::CreateMaterial(ChildMaterialFolder, CharacterTexturesFolder, MaterialName, MaterialProperties, CharacterType, nullptr); - } + } + + FDazToUnrealMaterials::CreateMaterial(ChildMaterialFolder, CharacterTexturesFolder, MaterialName, MaterialProperties, CharacterType, UnrealMaterialConstant, SubsurfaceProfile); + } + else + { + FDazToUnrealMaterials::CreateMaterial(ChildMaterialFolder, CharacterTexturesFolder, MaterialName, MaterialProperties, CharacterType, nullptr, SubsurfaceProfile); + } } } else if (ChildMaterials.Num() == 1) { - FDazToUnrealMaterials::CreateMaterial(CharacterMaterialFolder / IntermediateMaterialName, CharacterTexturesFolder, ChildMaterials[0], MaterialProperties, CharacterType, nullptr); + USubsurfaceProfile* SubsurfaceProfile = FDazToUnrealMaterials::CreateSubsurfaceProfileForMaterial(ChildMaterials[0], CharacterMaterialFolder / ChildMaterials[0], MaterialProperties[ChildMaterials[0]]); + FDazToUnrealMaterials::CreateMaterial(CharacterMaterialFolder / IntermediateMaterialName, CharacterTexturesFolder, ChildMaterials[0], MaterialProperties, CharacterType, nullptr, SubsurfaceProfile); } } @@ -1307,7 +1319,12 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr JsonObject) { if (UAnimSequence* AnimSequence = Cast(NewObject)) { - FDazToUnrealPoses::CreatePoseAsset(AnimSequence, PoseNameList); + UPoseAsset* NewPoseAsset = FDazToUnrealPoses::CreatePoseAsset(AnimSequence, PoseNameList); + + FContentBrowserModule& ContentBrowserModule = FModuleManager::Get().LoadModuleChecked("ContentBrowser"); + TArray AssetsToSelect; + AssetsToSelect.Add((UObject*)NewPoseAsset); + ContentBrowserModule.Get().SyncBrowserToAssets(AssetsToSelect); } } @@ -1316,7 +1333,7 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr JsonObject) -bool FDazToUnrealModule::CreateMaterials(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, const TArray& MaterialNames, TMap> MaterialProperties, const DazCharacterType CharacterType) +/*bool FDazToUnrealModule::CreateMaterials(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, const TArray& MaterialNames, TMap> MaterialProperties, const DazCharacterType CharacterType) { const UDazToUnrealSettings* CachedSettings = GetDefault(); @@ -1328,7 +1345,7 @@ bool FDazToUnrealModule::CreateMaterials(const FString CharacterMaterialFolder, return true; -} +}*/ // Modified from the FColor::FromHex function @@ -1419,21 +1436,26 @@ UObject* FDazToUnrealModule::ImportFBXAsset(const FString& SourcePath, const FSt FbxFactory->AddToRoot(); USkeleton* Skeleton = nullptr; + FSoftObjectPath SkeletonPath; if (CharacterType == DazCharacterType::Genesis1) { Skeleton = (USkeleton*)CachedSettings->Genesis1Skeleton.TryLoad(); + SkeletonPath = CachedSettings->Genesis1Skeleton; } if (CharacterType == DazCharacterType::Genesis3Male || CharacterType == DazCharacterType::Genesis3Female) { Skeleton = (USkeleton*)CachedSettings->Genesis3Skeleton.TryLoad(); + SkeletonPath = CachedSettings->Genesis3Skeleton; } if (CharacterType == DazCharacterType::Genesis8Male || CharacterType == DazCharacterType::Genesis8Female) { Skeleton = (USkeleton*)CachedSettings->Genesis8Skeleton.TryLoad(); + SkeletonPath = CachedSettings->Genesis8Skeleton; } if (CharacterType == DazCharacterType::Unknown && CachedSettings->OtherSkeletons.Contains(CharacterTypeName)) { Skeleton = (USkeleton*)CachedSettings->OtherSkeletons[CharacterTypeName].TryLoad(); + SkeletonPath = CachedSettings->OtherSkeletons[CharacterTypeName]; } UFbxImportUI* ImportUI = NewObject(); @@ -1449,6 +1471,8 @@ UObject* FDazToUnrealModule::ImportFBXAsset(const FString& SourcePath, const FSt FbxFactory->ImportUI->SkeletalMeshImportData->bImportMorphTargets = true; FbxFactory->ImportUI->bImportAnimations = true; FbxFactory->ImportUI->SkeletalMeshImportData->bUseT0AsRefPose = CachedSettings->FrameZeroIsReferencePose; + FbxFactory->ImportUI->SkeletalMeshImportData->bConvertScene = true; + FbxFactory->ImportUI->SkeletalMeshImportData->bForceFrontXAxis = CachedSettings->ZeroRootRotationOnImport; FbxFactory->ImportUI->MeshTypeToImport = FBXIT_SkeletalMesh; } if (AssetType == DazAssetType::StaticMesh) @@ -1508,17 +1532,9 @@ UObject* FDazToUnrealModule::ImportFBXAsset(const FString& SourcePath, const FSt { if (USkeletalMesh* SkeletalMesh = Cast(ImportedAsset)) { - if (CharacterType == DazCharacterType::Genesis1) - { - SkeletalMesh->PostProcessAnimBlueprint = CachedSettings->Genesis1PostProcessAnimation.TryLoadClass(); - } - if (CharacterType == DazCharacterType::Genesis3Male || CharacterType == DazCharacterType::Genesis3Female) - { - SkeletalMesh->PostProcessAnimBlueprint = CachedSettings->Genesis3PostProcessAnimation.TryLoadClass(); - } - if (CharacterType == DazCharacterType::Genesis8Male || CharacterType == DazCharacterType::Genesis8Female) + if (CachedSettings->SkeletonPostProcessAnimation.Contains(SkeletonPath)) { - SkeletalMesh->PostProcessAnimBlueprint = CachedSettings->Genesis8PostProcessAnimation.TryLoadClass(); + SkeletalMesh->PostProcessAnimBlueprint = CachedSettings->SkeletonPostProcessAnimation[SkeletonPath].TryLoadClass(); } //Get the new skeleton diff --git a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealMaterials.cpp b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealMaterials.cpp index 0204ffa..a04cd3e 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealMaterials.cpp +++ b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealMaterials.cpp @@ -4,7 +4,10 @@ #include "Materials/MaterialInstanceConstant.h" #include "Factories/MaterialInstanceConstantFactoryNew.h" +#include "Factories/SubsurfaceProfileFactory.h" +#include "Engine/SubsurfaceProfile.h" #include "AssetRegistryModule.h" +#include "AssetToolsModule.h" FSoftObjectPath FDazToUnrealMaterials::GetBaseMaterialForShader(FString ShaderName) { @@ -75,7 +78,7 @@ FSoftObjectPath FDazToUnrealMaterials::GetBaseMaterial(FString MaterialName, TAr else if (AssetType == TEXT("Follower/Attachment/Lower-Body/Hip/Front") && MaterialName.Contains(TEXT("_Genitalia"))) { - BaseMaterialAssetPath = CachedSettings->BaseSkinMaterial; + BaseMaterialAssetPath = GetSkinMaterialForShader(ShaderName); } else if (AssetType == TEXT("Actor/Character")) { @@ -130,7 +133,7 @@ FSoftObjectPath FDazToUnrealMaterials::GetBaseMaterial(FString MaterialName, TAr { BaseMaterialAssetPath = CachedSettings->BaseCorneaMaterial; } - else if (MaterialName.EndsWith(TEXT("_sclera"))) + /*else if (MaterialName.EndsWith(TEXT("_sclera"))) { BaseMaterialAssetPath = CachedSettings->BaseMaterial; } @@ -141,10 +144,10 @@ FSoftObjectPath FDazToUnrealMaterials::GetBaseMaterial(FString MaterialName, TAr else if (MaterialName.EndsWith(TEXT("_pupils"))) { BaseMaterialAssetPath = CachedSettings->BaseMaterial; - } + }*/ else { - BaseMaterialAssetPath = CachedSettings->BaseMaterial; + //BaseMaterialAssetPath = CachedSettings->BaseMaterial; for (FDUFTextureProperty Property : Properties) { @@ -184,7 +187,7 @@ FSoftObjectPath FDazToUnrealMaterials::GetBaseMaterial(FString MaterialName, TAr return BaseMaterialAssetPath; } -UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, FString& MaterialName, TMap> MaterialProperties, const DazCharacterType CharacterType, UMaterialInstanceConstant* ParentMaterial) +UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, FString& MaterialName, TMap> MaterialProperties, const DazCharacterType CharacterType, UMaterialInstanceConstant* ParentMaterial, USubsurfaceProfile* SubsurfaceProfile) { const UDazToUnrealSettings* CachedSettings = GetDefault(); @@ -211,21 +214,23 @@ UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString C } if (AssetType == TEXT("Follower/Attachment/Head/Face/Eyelashes") || - AssetType == TEXT("Follower/Attachment/Head/Face/Eyes")) + AssetType == TEXT("Follower/Attachment/Head/Face/Eyes") || + AssetType == TEXT("Follower/Attachment/Head/Face/Eyes/Tear") || + AssetType == TEXT("Follower/Attachment/Head/Face/Tears")) { if (MaterialName.Contains(TEXT("_EyeMoisture")) || MaterialName.EndsWith(TEXT("_EyeReflection"))) { //BaseMaterialAssetPath = CachedSettings->BaseEyeMoistureMaterial; SetMaterialProperty(MaterialName, TEXT("Metallic Weight"), TEXT("Double"), TEXT("1"), MaterialProperties); - SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), TEXT("0.05"), MaterialProperties); + SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), FString::SanitizeFloat(CachedSettings->DefaultEyeMoistureOpacity), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Diffuse Color"), TEXT("Color"), TEXT("#bababa"), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Index of Refraction"), TEXT("Double"), TEXT("1.0"), MaterialProperties); } - else if (MaterialName.EndsWith(TEXT("_Tear"))) + else if (MaterialName.EndsWith(TEXT("_Tear")) || MaterialName.EndsWith(TEXT("_Tears"))) { //BaseMaterialAssetPath = CachedSettings->BaseCorneaMaterial; SetMaterialProperty(MaterialName, TEXT("Metallic Weight"), TEXT("Double"), TEXT("1"), MaterialProperties); - SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), TEXT("0.05"), MaterialProperties); + SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), FString::SanitizeFloat(CachedSettings->DefaultEyeMoistureOpacity), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Index of Refraction"), TEXT("Double"), TEXT("1.0"), MaterialProperties); } else @@ -245,9 +250,11 @@ UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString C { // Check for skin materials if (MaterialName.EndsWith(TEXT("_Face")) || + MaterialName.EndsWith(TEXT("_Head")) || MaterialName.EndsWith(TEXT("_Lips")) || MaterialName.EndsWith(TEXT("_Legs")) || MaterialName.EndsWith(TEXT("_Torso")) || + MaterialName.EndsWith(TEXT("_Body")) || MaterialName.EndsWith(TEXT("_Arms")) || MaterialName.EndsWith(TEXT("_EyeSocket")) || MaterialName.EndsWith(TEXT("_Ears")) || @@ -256,20 +263,21 @@ UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString C MaterialName.EndsWith(TEXT("_Genitalia"))) { //BaseMaterialAssetPath = CachedSettings->BaseSkinMaterial; + SetMaterialProperty(MaterialName, TEXT("Diffuse Subsurface Color Weight"), TEXT("Double"), FString::SanitizeFloat(CachedSettings->DefaultSkinDiffuseSubsurfaceColorWeight), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Subsurface Alpha Texture"), TEXT("Texture"), FDazToUnrealTextures::GetSubSurfaceAlphaTexture(CharacterType, MaterialName), MaterialProperties); } else if (MaterialName.Contains(TEXT("_EyeMoisture"))) { //BaseMaterialAssetPath = CachedSettings->BaseEyeMoistureMaterial; SetMaterialProperty(MaterialName, TEXT("Metallic Weight"), TEXT("Double"), TEXT("1"), MaterialProperties); - SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), TEXT("0.05"), MaterialProperties); + SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), FString::SanitizeFloat(CachedSettings->DefaultEyeMoistureOpacity), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Index of Refraction"), TEXT("Double"), TEXT("1.0"), MaterialProperties); } - else if (MaterialName.EndsWith(TEXT("_EyeReflection")) || MaterialName.EndsWith(TEXT("_Tear"))) + else if (MaterialName.EndsWith(TEXT("_EyeReflection")) || MaterialName.EndsWith(TEXT("_Tear")) || MaterialName.EndsWith(TEXT("_Tears"))) { //BaseMaterialAssetPath = CachedSettings->BaseEyeMoistureMaterial; SetMaterialProperty(MaterialName, TEXT("Metallic Weight"), TEXT("Double"), TEXT("1"), MaterialProperties); - SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), TEXT("0.05"), MaterialProperties); + SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), FString::SanitizeFloat(CachedSettings->DefaultEyeMoistureOpacity), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Index of Refraction"), TEXT("Double"), TEXT("1.0"), MaterialProperties); } else if (MaterialName.EndsWith(TEXT("_EyeLashes")) || MaterialName.EndsWith(TEXT("_Eyelashes"))) @@ -283,7 +291,7 @@ UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString C { //BaseMaterialAssetPath = CachedSettings->BaseCorneaMaterial; SetMaterialProperty(MaterialName, TEXT("Metallic Weight"), TEXT("Double"), TEXT("1"), MaterialProperties); - SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), TEXT("0.05"), MaterialProperties); + SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), FString::SanitizeFloat(CachedSettings->DefaultEyeMoistureOpacity), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Index of Refraction"), TEXT("Double"), TEXT("1.0"), MaterialProperties); } else if (MaterialName.EndsWith(TEXT("_sclera"))) @@ -320,7 +328,7 @@ UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString C { //BaseMaterialAssetPath = CachedSettings->BaseEyeMoistureMaterial; SetMaterialProperty(MaterialName, TEXT("Metallic Weight"), TEXT("Double"), TEXT("1"), MaterialProperties); - SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), TEXT("0.05"), MaterialProperties); + SetMaterialProperty(MaterialName, TEXT("Opacity Strength"), TEXT("Double"), FString::SanitizeFloat(CachedSettings->DefaultEyeMoistureOpacity), MaterialProperties); SetMaterialProperty(MaterialName, TEXT("Index of Refraction"), TEXT("Double"), TEXT("1.0"), MaterialProperties); } else @@ -372,6 +380,19 @@ UMaterialInstanceConstant* FDazToUnrealMaterials::CreateMaterial(const FString C UnrealMaterialConstant->SetParentEditorOnly((UMaterial*)BaseMaterial); } + if (SubsurfaceProfile) + { + if (!ParentMaterial || ParentMaterial->SubsurfaceProfile != SubsurfaceProfile) + { + UnrealMaterialConstant->bOverrideSubsurfaceProfile = 1; + UnrealMaterialConstant->SubsurfaceProfile = SubsurfaceProfile; + } + else + { + UnrealMaterialConstant->bOverrideSubsurfaceProfile = 0; + } + } + // Set the MaterialInstance properties if (MaterialProperties.Contains(MaterialName)) { @@ -571,4 +592,126 @@ FDUFTextureProperty FDazToUnrealMaterials::GetMostCommonProperty(FString Propert MostCommonProperty.Name = TEXT(""); } return MostCommonProperty; +} + +bool FDazToUnrealMaterials::HasMaterialProperty(const FString& PropertyName, const TArray& MaterialProperties) +{ + for (FDUFTextureProperty MaterialProperty : MaterialProperties) + { + if (MaterialProperty.Name == PropertyName) + { + return true; + } + } + return false; +} +FString FDazToUnrealMaterials::GetMaterialProperty(const FString& PropertyName, const TArray& MaterialProperties) +{ + for (FDUFTextureProperty MaterialProperty : MaterialProperties) + { + if (MaterialProperty.Name == PropertyName) + { + return MaterialProperty.Value; + } + } + return FString(); +} + +USubsurfaceProfile* FDazToUnrealMaterials::CreateSubsurfaceBaseProfileForCharacter(const FString CharacterMaterialFolder, TMap>& MaterialProperties) +{ + // Find the torso material. + for (TPair> Pair : MaterialProperties) + { + FString AssetType; + for (FDUFTextureProperty Property : Pair.Value) + { + if (Property.Name == TEXT("Asset Type")) + { + AssetType = Property.Value; + } + } + + if (AssetType == TEXT("Actor/Character")) + { + if (Pair.Key.EndsWith(TEXT("_Torso")) || Pair.Key.EndsWith(TEXT("_Body"))) + { + return CreateSubsurfaceProfileForMaterial(Pair.Key, CharacterMaterialFolder, Pair.Value); + } + + } + } + return nullptr; +} + +USubsurfaceProfile* FDazToUnrealMaterials::CreateSubsurfaceProfileForMaterial(const FString MaterialName, const FString CharacterMaterialFolder, const TArray MaterialProperties) +{ + // Create the Material Instance + //auto SubsurfaceProfileFactory = NewObject(); + + //Only create for the PBRSkin base material + FString ShaderName; + for (FDUFTextureProperty Property : MaterialProperties) + { + if (Property.Name == TEXT("Asset Type")) + { + ShaderName = Property.ShaderName; + } + } + if (ShaderName != TEXT("PBRSkin")) + { + return nullptr; + } + + FString SubsurfaceProfileName = MaterialName + TEXT("_Profile"); + UPackage* Package = CreatePackage(nullptr, *(CharacterMaterialFolder / MaterialName)); + //USubsurfaceProfile* SubsurfaceProfile = (USubsurfaceProfile*)SubsurfaceProfileFactory->FactoryCreateNew(USubsurfaceProfile::StaticClass(), Package, *MaterialName, RF_Standalone | RF_Public, NULL, GWarn); + FAssetToolsModule& AssetToolsModule = FModuleManager::GetModuleChecked("AssetTools"); + USubsurfaceProfile* SubsurfaceProfile = Cast(AssetToolsModule.Get().CreateAsset(SubsurfaceProfileName, FPackageName::GetLongPackagePath(*(CharacterMaterialFolder / MaterialName)), USubsurfaceProfile::StaticClass(), NULL)); + if (HasMaterialProperty(TEXT("Specular Lobe 1 Roughness"), MaterialProperties)) + { + SubsurfaceProfile->Settings.Roughness0 = FCString::Atof(*GetMaterialProperty(TEXT("Specular Lobe 1 Roughness"), MaterialProperties)); + } + if (HasMaterialProperty(TEXT("Specular Lobe 2 Roughness Mult"), MaterialProperties)) + { + SubsurfaceProfile->Settings.Roughness1 = FCString::Atof(*GetMaterialProperty(TEXT("Specular Lobe 2 Roughness Mult"), MaterialProperties)); + } + if (HasMaterialProperty(TEXT("Dual Lobe Specular Ratio"), MaterialProperties)) + { + SubsurfaceProfile->Settings.LobeMix = FCString::Atof(*GetMaterialProperty(TEXT("Dual Lobe Specular Ratio"), MaterialProperties)); + } + if (HasMaterialProperty(TEXT("SSS Color"), MaterialProperties)) + { + SubsurfaceProfile->Settings.SubsurfaceColor = FColor::FromHex(*GetMaterialProperty(TEXT("SSS Color"), MaterialProperties)); + } + if (HasMaterialProperty(TEXT("SSS Color"), MaterialProperties)) + { + SubsurfaceProfile->Settings.SubsurfaceColor = FColor::FromHex(*GetMaterialProperty(TEXT("SSS Color"), MaterialProperties)); + } + if (HasMaterialProperty(TEXT("Transmitted Color"), MaterialProperties)) + { + SubsurfaceProfile->Settings.FalloffColor = FColor::FromHex(*GetMaterialProperty(TEXT("Transmitted Color"), MaterialProperties)); + } + return SubsurfaceProfile; +} + +bool FDazToUnrealMaterials::SubsurfaceProfilesAreIdentical(USubsurfaceProfile* A, USubsurfaceProfile* B) +{ + if (A == nullptr || B == nullptr) return false; + if (A->Settings.Roughness0 != B->Settings.Roughness0) return false; + if (A->Settings.Roughness1 != B->Settings.Roughness1) return false; + if (A->Settings.LobeMix != B->Settings.LobeMix) return false; + if (A->Settings.SubsurfaceColor != B->Settings.SubsurfaceColor) return false; + if (A->Settings.FalloffColor != B->Settings.FalloffColor) return false; + return true; +} + +bool FDazToUnrealMaterials::SubsurfaceProfilesWouldBeIdentical(USubsurfaceProfile* ExistingSubsurfaceProfile, const TArray MaterialProperties) +{ + if (ExistingSubsurfaceProfile == nullptr) return false; + if (ExistingSubsurfaceProfile->Settings.Roughness0 != FCString::Atof(*GetMaterialProperty(TEXT("Specular Lobe 1 Roughness"), MaterialProperties))) return false; + if (ExistingSubsurfaceProfile->Settings.Roughness1 != FCString::Atof(*GetMaterialProperty(TEXT("Specular Lobe 2 Roughness Mult"), MaterialProperties))) return false; + if (ExistingSubsurfaceProfile->Settings.LobeMix != FCString::Atof(*GetMaterialProperty(TEXT("Dual Lobe Specular Ratio"), MaterialProperties))) return false; + if (ExistingSubsurfaceProfile->Settings.SubsurfaceColor != FColor::FromHex(*GetMaterialProperty(TEXT("SSS Color"), MaterialProperties))) return false; + if (ExistingSubsurfaceProfile->Settings.FalloffColor != FColor::FromHex(*GetMaterialProperty(TEXT("Transmitted Color"), MaterialProperties))) return false; + return true; } \ No newline at end of file diff --git a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealPoses.cpp b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealPoses.cpp index 1f78131..7bcf729 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealPoses.cpp +++ b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Private/DazToUnrealPoses.cpp @@ -14,7 +14,7 @@ #include "PackageTools.h" // Partially taken from UPoseAssetFactory::FactoryCreateNew -void FDazToUnrealPoses::CreatePoseAsset(UAnimSequence* SourceAnimation, TArray PoseNames) +UPoseAsset* FDazToUnrealPoses::CreatePoseAsset(UAnimSequence* SourceAnimation, TArray PoseNames) { if (SourceAnimation) { @@ -62,7 +62,10 @@ void FDazToUnrealPoses::CreatePoseAsset(UAnimSequence* SourceAnimation, TArrayCreatePoseFromAnimation(SourceAnimation, &InputPoseNames); PoseAsset->SetSkeleton(TargetSkeleton); PoseAsset->ConvertSpace(true, 0); + + return PoseAsset; } + return nullptr; //return NewPose; //UPoseAssetFactory* Factory = NewObject(); diff --git a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnreal.h b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnreal.h index eeb64fb..4c359e7 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnreal.h +++ b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnreal.h @@ -98,7 +98,7 @@ class FDazToUnrealModule : public IModuleInterface UObject* ImportFBXAsset(const FString& SourcePath, const FString& ImportLocation, const DazAssetType& AssetType, const DazCharacterType& CharacterType, const FString& CharacterTypeName); /** Function for creating the Material Instances for the model*/ - bool CreateMaterials(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, const TArray& MaterialNames, TMap> MaterialProperties, const DazCharacterType CharacterType); + //bool CreateMaterials(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, const TArray& MaterialNames, TMap> MaterialProperties, const DazCharacterType CharacterType); /** Set material properties that will be set on the Material Instances*/ void SetMaterialProperty(const FString& MaterialName, const FString& PropertyName, const FString& PropertyType, const FString& PropertyValue, TMap>& MaterialProperties); diff --git a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealMaterials.h b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealMaterials.h index f15b879..c761f2a 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealMaterials.h +++ b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealMaterials.h @@ -4,6 +4,7 @@ #include "DazToUnrealEnums.h" class UMaterialInstanceConstant; +class USubsurfaceProfile; // struct for holding material override settings struct FDUFTextureProperty { @@ -23,9 +24,10 @@ class FDazToUnrealMaterials { public: static FSoftObjectPath GetBaseMaterial(FString MaterialName, TArray MaterialProperties); - static UMaterialInstanceConstant* CreateMaterial(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, FString& MaterialName, TMap> MaterialProperties, const DazCharacterType CharacterType, UMaterialInstanceConstant* ParentMaterial); + static UMaterialInstanceConstant* CreateMaterial(const FString CharacterMaterialFolder, const FString CharacterTexturesFolder, FString& MaterialName, TMap> MaterialProperties, const DazCharacterType CharacterType, UMaterialInstanceConstant* ParentMaterial, USubsurfaceProfile* SubsurfaceProfile); static void SetMaterialProperty(const FString& MaterialName, const FString& PropertyName, const FString& PropertyType, const FString& PropertyValue, TMap>& MaterialProperties); - + static bool HasMaterialProperty(const FString& PropertyName, const TArray &MaterialProperties); + static FString GetMaterialProperty(const FString& PropertyName, const TArray& MaterialProperties); static FSoftObjectPath GetMostCommonBaseMaterial(TArray MaterialNames, TMap> MaterialProperties); static TArray GetMostCommonProperties(TArray MaterialNames, TMap> MaterialProperties); @@ -33,4 +35,9 @@ class FDazToUnrealMaterials static FSoftObjectPath GetBaseMaterialForShader(FString ShaderName); static FSoftObjectPath GetSkinMaterialForShader(FString ShaderName); + + static USubsurfaceProfile* CreateSubsurfaceBaseProfileForCharacter(const FString CharacterMaterialFolder, TMap>& MaterialProperties); + static USubsurfaceProfile* CreateSubsurfaceProfileForMaterial(const FString MaterialName, const FString CharacterMaterialFolder, const TArray MaterialProperties); + static bool SubsurfaceProfilesAreIdentical(USubsurfaceProfile* A, USubsurfaceProfile* B); + static bool SubsurfaceProfilesWouldBeIdentical(USubsurfaceProfile* ExistingSubsurfaceProfile, const TArray MaterialProperties); }; \ No newline at end of file diff --git a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealPoses.h b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealPoses.h index 02625b8..1a18081 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealPoses.h +++ b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealPoses.h @@ -7,5 +7,5 @@ class FDazToUnrealPoses { public: - static void CreatePoseAsset(UAnimSequence* SourceAnimation, TArray PoseNames); + static UPoseAsset* CreatePoseAsset(UAnimSequence* SourceAnimation, TArray PoseNames); }; \ No newline at end of file diff --git a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealSettings.h b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealSettings.h index 93e6b1b..7661f39 100644 --- a/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealSettings.h +++ b/Unreal/UnrealPlugin/DazToUnreal/Source/DazToUnreal/Public/DazToUnrealSettings.h @@ -23,6 +23,7 @@ class DAZTOUNREAL_API UDazToUnrealSettings : public UDeveloperSettings ShowFBXImportDialog = false; FrameZeroIsReferencePose = false; FixBoneRotationsOnImport = false; + ZeroRootRotationOnImport = false; Genesis1Skeleton = FSoftObjectPath(TEXT("/DazToUnreal/Genesis1BaseSkeleton.Genesis1BaseSkeleton")); Genesis3Skeleton = FSoftObjectPath(TEXT("/DazToUnreal/Genesis3BaseSkeleton.Genesis3BaseSkeleton")); @@ -30,9 +31,8 @@ class DAZTOUNREAL_API UDazToUnrealSettings : public UDeveloperSettings OtherSkeletons.Add(TEXT("Genesis8_1Male"), FSoftObjectPath(TEXT("/DazToUnreal/Genesis8BaseSkeleton.Genesis8BaseSkeleton"))); OtherSkeletons.Add(TEXT("Genesis8_1Female"), FSoftObjectPath(TEXT("/DazToUnreal/Genesis8BaseSkeleton.Genesis8BaseSkeleton"))); - Genesis1PostProcessAnimation = FSoftClassPath(TEXT("/DazToUnreal/Genesis1JCMPostProcess.Genesis1JCMPostProcess_C")); - Genesis3PostProcessAnimation = FSoftClassPath(TEXT("/DazToUnreal/Genesis3JCMPostProcess.Genesis3JCMPostProcess_C")); - Genesis8PostProcessAnimation = FSoftClassPath(TEXT("/DazToUnreal/Genesis8JCMPostProcess.Genesis8JCMPostProcess_C")); + SkeletonPostProcessAnimation.Add(FSoftObjectPath(TEXT("/DazToUnreal/Genesis3BaseSkeleton.Genesis3BaseSkeleton")), FSoftClassPath(TEXT("/DazToUnreal/Genesis3JCMPostProcess.Genesis3JCMPostProcess_C"))); + SkeletonPostProcessAnimation.Add(FSoftObjectPath(TEXT("/DazToUnreal/Genesis8BaseSkeleton.Genesis8BaseSkeleton")), FSoftClassPath(TEXT("/DazToUnreal/Genesis8JCMPostProcess.Genesis8JCMPostProcess_C"))); BaseShaderMaterials.Add(TEXT("Daz Studio Default"), FSoftObjectPath(TEXT("/DazToUnreal/DSDBaseMaterial.DSDBaseMaterial"))); BaseShaderMaterials.Add(TEXT("omUberSurface"), FSoftObjectPath(TEXT("/DazToUnreal/omUberBaseMaterial.omUberBaseMaterial"))); @@ -56,6 +56,8 @@ class DAZTOUNREAL_API UDazToUnrealSettings : public UDeveloperSettings BaseCorneaMaterial = FSoftObjectPath(TEXT("/DazToUnreal/BaseAlphaMaterial.BaseAlphaMaterial")); NoDrawMaterial = FSoftObjectPath(TEXT("/DazToUnreal/NoDrawMaterial.NoDrawMaterial")); + UseInternalMorphName = false; + ArmsSubSurfaceOpacityGenesis1Texture = FSoftObjectPath(TEXT("/Engine/EngineResources/WhiteSquareTexture.WhiteSquareTexture")); FaceSubSurfaceOpacityGenesis1Texture = FSoftObjectPath(TEXT("/Engine/EngineResources/WhiteSquareTexture.WhiteSquareTexture")); LegsSubSurfaceOpacityGenesis1Texture = FSoftObjectPath(TEXT("/Engine/EngineResources/WhiteSquareTexture.WhiteSquareTexture")); @@ -85,6 +87,9 @@ class DAZTOUNREAL_API UDazToUnrealSettings : public UDeveloperSettings MaterialPropertyMapping.Add(TEXT("Specular Strength"), TEXT("Glossy Layered Weight")); MaterialPropertyMapping.Add(TEXT("Specular Strength Texture"), TEXT("Glossy Layered Weight Texture")); MaterialPropertyMapping.Add(TEXT("Specular Strength Texture Active"), TEXT("Glossy Layered Weight Texture Active")); + + DefaultSkinDiffuseSubsurfaceColorWeight = 0.5f; + DefaultEyeMoistureOpacity = 0.04f; } virtual FName GetCategoryName() const { return FName(TEXT("Plugins")); } @@ -117,6 +122,10 @@ class DAZTOUNREAL_API UDazToUnrealSettings : public UDeveloperSettings UPROPERTY(config, EditAnywhere, Category = PluginSettings) bool FixBoneRotationsOnImport; + /** Updates the bones to use a locale rotation. This currently breaks animations coming from Daz Studio. */ + UPROPERTY(config, EditAnywhere, Category = PluginSettings) + bool ZeroRootRotationOnImport; + /** Skeleton to use for Genesis 1 characters */ UPROPERTY(config, EditAnywhere, Category = SkeletonSettings, meta = (AllowedClasses = "Skeleton")) FSoftObjectPath Genesis1Skeleton; @@ -133,17 +142,9 @@ class DAZTOUNREAL_API UDazToUnrealSettings : public UDeveloperSettings UPROPERTY(config, EditAnywhere, Category = SkeletonSettings) TMap OtherSkeletons; - /** Post Process Animation Blueprint to use for Genesis 1 characters */ - UPROPERTY(config, EditAnywhere, Category = SkeletonSettings) - FSoftClassPath Genesis1PostProcessAnimation; - - /** Post Process Animation Blueprint to use for Genesis 3 characters */ + /** A mapping of default post process animations for different skeletons */ UPROPERTY(config, EditAnywhere, Category = SkeletonSettings) - FSoftClassPath Genesis3PostProcessAnimation; - - /** Post Process Animation Blueprint to use for Genesis 8 characters */ - UPROPERTY(config, EditAnywhere, Category = SkeletonSettings) - FSoftClassPath Genesis8PostProcessAnimation; + TMap SkeletonPostProcessAnimation; /** Used to set the default Material to use for a shader type from Daz Studio */ UPROPERTY(config, EditAnywhere, Category = MaterialSettings) @@ -193,6 +194,18 @@ class DAZTOUNREAL_API UDazToUnrealSettings : public UDeveloperSettings UPROPERTY(config, EditAnywhere, Category = MaterialSettings) TMap MaterialPropertyMapping; + /** Default Diffuse Subsurface Color Weight to use for Skin Materials */ + UPROPERTY(config, EditAnywhere, Category = MaterialSettings) + float DefaultSkinDiffuseSubsurfaceColorWeight; + + /** Default Opacity to use for EyeMoisture, Tears, etc */ + UPROPERTY(config, EditAnywhere, Category = MaterialSettings) + float DefaultEyeMoistureOpacity; + + /** Use the internal name rather than the display name when transfering morphs */ + UPROPERTY(config, EditAnywhere, Category = MorphSettings) + bool UseInternalMorphName; + /** Override for the sub surface scatter opacity texture for the arms and fingernails for Genesis 3 Male */ UPROPERTY(config, EditAnywhere, Category = SubSurfaceScatterGenesis, meta = (AllowedClasses = "Texture")) FSoftObjectPath ArmsSubSurfaceOpacityGenesis1Texture; diff --git a/enc_temp_folder/6a78368314534b289560b0c36b376e2d/DzUnrealMorphSelectionDialog.cpp b/enc_temp_folder/6a78368314534b289560b0c36b376e2d/DzUnrealMorphSelectionDialog.cpp deleted file mode 100644 index abc8e75..0000000 --- a/enc_temp_folder/6a78368314534b289560b0c36b376e2d/DzUnrealMorphSelectionDialog.cpp +++ /dev/null @@ -1,722 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dzapp.h" -#include "dzscene.h" -#include "dzstyle.h" -#include "dzmainwindow.h" -#include "dzactionmgr.h" -#include "dzaction.h" -#include "dzskeleton.h" -#include "dzfigure.h" -#include "dzobject.h" -#include "dzshape.h" -#include "dzmodifier.h" -#include "dzpresentation.h" -#include "dzassetmgr.h" -#include "dzproperty.h" -#include "dzsettings.h" -#include "dzmorph.h" -#include "DzUnrealMorphSelectionDialog.h" - -#include "QtGui/qlayout.h" -#include "QtGui/qlineedit.h" - -#include - -/***************************** -Local definitions -*****************************/ -#define DAZ_TO_UNREAL_PLUGIN_NAME "DazToUnreal" - - -DzUnrealMorphSelectionDialog* DzUnrealMorphSelectionDialog::singleton = nullptr; - -// For sorting the lists -class SortingListItem : public QListWidgetItem { - -public: - virtual bool operator< (const QListWidgetItem &otherItem) const - { - if (this->checkState() != otherItem.checkState()) - { - return (this->checkState() == Qt::Checked); - } - return QListWidgetItem::operator<(otherItem); - } -}; - -DzUnrealMorphSelectionDialog::DzUnrealMorphSelectionDialog(QWidget *parent) : - DzBasicDialog(parent, DAZ_TO_UNREAL_PLUGIN_NAME) -{ - morphListWidget = NULL; - morphExportListWidget = NULL; - morphTreeWidget = NULL; - filterEdit = NULL; - presetCombo = NULL; - fullBodyMorphTreeItem = NULL; - charactersTreeItem = NULL; - - // Set the dialog title - setWindowTitle(tr("Select Morphs")); - - // Setup folder - presetsFolder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation) + QDir::separator() + "DazToUnreal" + QDir::separator() + "Presets"; - - - QVBoxLayout* mainLayout = new QVBoxLayout(this); - - // Left tree with morph structure - morphTreeWidget = new QTreeWidget(this); - morphTreeWidget->setHeaderHidden(true); - - // Center list showing morhps for selected tree items - morphListWidget = new QListWidget(this); - morphListWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); - - // Right list showing morphs that will export - morphExportListWidget = new QListWidget(this); - morphExportListWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); - - // Quick filter box - QHBoxLayout* filterLayout = new QHBoxLayout(this); - filterLayout->addWidget(new QLabel("filter")); - filterEdit = new QLineEdit(); - connect(filterEdit, SIGNAL(textChanged(const QString &)), this, SLOT(FilterChanged(const QString &))); - filterLayout->addWidget(filterEdit); - - // Presets - QHBoxLayout* settingsLayout = new QHBoxLayout(this); - presetCombo = new QComboBox(this); - QPushButton* savePresetButton = new QPushButton("Save Preset", this); - connect(savePresetButton, SIGNAL(released()), this, SLOT(HandleSavePreset())); - settingsLayout->addWidget(new QLabel("Choose Preset")); - settingsLayout->addWidget(presetCombo); - settingsLayout->addWidget(savePresetButton); - settingsLayout->addStretch(); - - // All Morphs - QHBoxLayout* morphsLayout = new QHBoxLayout(this); - - // Left Tree - QVBoxLayout* treeLayout = new QVBoxLayout(this); - treeLayout->addWidget(new QLabel("Morph Groups")); - treeLayout->addWidget(new QLabel("Select to see available morphs")); - treeLayout->addWidget(morphTreeWidget); - - // Buttons for quickly adding certain JCMs - QGroupBox* JCMGroupBox = new QGroupBox("Add JCMs", this); - JCMGroupBox->setLayout(new QGridLayout(this)); - QPushButton* ArmsJCMButton = new QPushButton("Arms"); - QPushButton* LegsJCMButton = new QPushButton("Legs"); - QPushButton* TorsoJCMButton = new QPushButton("Torso"); - ((QGridLayout*)JCMGroupBox->layout())->addWidget(ArmsJCMButton, 0, 0); - ((QGridLayout*)JCMGroupBox->layout())->addWidget(LegsJCMButton, 0, 1); - ((QGridLayout*)JCMGroupBox->layout())->addWidget(TorsoJCMButton, 0, 2); - - connect(ArmsJCMButton, SIGNAL(released()), this, SLOT(HandleArmJCMMorphsButton())); - connect(LegsJCMButton, SIGNAL(released()), this, SLOT(HandleLegJCMMorphsButton())); - connect(TorsoJCMButton, SIGNAL(released()), this, SLOT(HandleTorsoJCMMorphsButton())); - - treeLayout->addWidget(JCMGroupBox); - morphsLayout->addLayout(treeLayout); - - - // Center List of morphs based on tree selection - QVBoxLayout* morphListLayout = new QVBoxLayout(this); - morphListLayout->addWidget(new QLabel("Morphs in Group")); - morphListLayout->addWidget(new QLabel("Select and click Add for Export")); - morphListLayout->addLayout(filterLayout); - morphListLayout->addWidget(morphListWidget); - - // Button for adding morphs - QPushButton* addMorphsButton = new QPushButton("Add For Export", this); - connect(addMorphsButton, SIGNAL(released()), this, SLOT(HandleAddMorphsButton())); - morphListLayout->addWidget(addMorphsButton); - morphsLayout->addLayout(morphListLayout); - - // Right List of morphs that will export - QVBoxLayout* selectedListLayout = new QVBoxLayout(this); - selectedListLayout->addWidget(new QLabel("Morphs to Export")); - selectedListLayout->addWidget(morphExportListWidget); - - // Button for clearing morphs from export - QPushButton* removeMorphsButton = new QPushButton("Remove From Export", this); - connect(removeMorphsButton, SIGNAL(released()), this, SLOT(HandleRemoveMorphsButton())); - selectedListLayout->addWidget(removeMorphsButton); - morphsLayout->addLayout(selectedListLayout); - - mainLayout->addLayout(settingsLayout); - mainLayout->addLayout(morphsLayout); - - this->addLayout(mainLayout); - resize(QSize(800, 800));//.expandedTo(minimumSizeHint())); - setFixedWidth(width()); - setFixedHeight(height()); - RefreshPresetsCombo(); - - connect(morphListWidget, SIGNAL(itemChanged(QListWidgetItem*)), - this, SLOT(ItemChanged(QListWidgetItem*))); - - connect(morphTreeWidget, SIGNAL(itemSelectionChanged()), - this, SLOT(ItemSelectionChanged())); - -} - -QSize DzUnrealMorphSelectionDialog::minimumSizeHint() const -{ - return QSize(800, 800); -} - -// Build out the Left morphs tree based on the current selection -void DzUnrealMorphSelectionDialog::PrepareDialog() -{ - DzNode* Selection = dzScene->getPrimarySelection(); - - DzNode* ParentFigureNode = Selection; - // If this is a figure, send it as a skeletal mesh - while (ParentFigureNode->getNodeParent()) - { - ParentFigureNode = ParentFigureNode->getNodeParent(); - if (DzSkeleton* Skeleton = ParentFigureNode->getSkeleton()) - { - if (DzFigure* Figure = qobject_cast(Skeleton)) - { - Selection = ParentFigureNode; - break; - } - } - } - - morphs.clear(); - morphList = GetAvailableMorphs(Selection); - for (int ChildIndex = 0; ChildIndex < Selection->getNumNodeChildren(); ChildIndex++) - { - DzNode* ChildNode = Selection->getNodeChild(ChildIndex); - morphList.append(GetAvailableMorphs(ChildNode)); - } - UpdateMorphsTree(); - HandlePresetChanged("LastUsed.csv"); -} - -// When the filter text is changed, update the center list -void DzUnrealMorphSelectionDialog::FilterChanged(const QString& filter) -{ - morphListWidget->clear(); - QString newFilter = filter; - morphListWidget->clear(); - foreach(MorphInfo morphInfo, selectedInTree) - { - if (newFilter == NULL || newFilter.isEmpty() || morphInfo.Label.contains(newFilter, Qt::CaseInsensitive)) - { - SortingListItem* item = new SortingListItem();// modLabel, morphListWidget); - item->setText(morphInfo.Label); - item->setData(Qt::UserRole, morphInfo.Name); - - morphListWidget->addItem(item); - } - } - - morphListWidget->sortItems(); -} - -// Build a list of availaboe morphs for the node -// TODO: This function evolved a lot as I figured out where to find the morphs. -// There may be dead code in here. -QStringList DzUnrealMorphSelectionDialog::GetAvailableMorphs(DzNode* Node) -{ - QStringList newMorphList; - - DzObject* Object = Node->getObject(); - DzShape* Shape = Object ? Object->getCurrentShape() : NULL; - - for (int index = 0; index < Node->getNumProperties(); index++) - { - DzProperty* property = Node->getProperty(index); - QString propName = property->getName(); - QString propLabel = property->getLabel(); - DzPresentation* presentation = property->getPresentation(); - if (presentation) - { - MorphInfo morphInfo; - morphInfo.Name = propName; - morphInfo.Label = propLabel; - morphInfo.Path = Node->getLabel() + "/" + property->getPath(); - morphInfo.Type = presentation->getType(); - if (!morphs.contains(morphInfo.Name)) - { - morphs.insert(morphInfo.Name, morphInfo); - } - //qDebug() << "Property Name " << propName << " Label " << propLabel << " Presentation Type:" << presentation->getType() << "Path: " << property->getPath(); - //qDebug() << "Path " << property->getGroupOnlyPath(); - } - if (presentation && presentation->getType() == "Modifier/Shape") - { - SortingListItem* item = new SortingListItem();// modLabel, morphListWidget); - item->setText(propLabel); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - if (morphList.contains(propLabel)) - { - item->setCheckState(Qt::Checked); - newMorphList.append(propName); - } - else - { - item->setCheckState(Qt::Unchecked); - } - item->setData(Qt::UserRole, propName); - morphNameMapping.insert(propName, propLabel); - } - } - - if (Object) - { - for (int index = 0; index < Object->getNumModifiers(); index++) - { - DzModifier* modifier = Object->getModifier(index); - QString modName = modifier->getName(); - QString modLabel = modifier->getLabel(); - DzMorph* mod = qobject_cast(modifier); - if (mod) - { - for (int propindex = 0; propindex < modifier->getNumProperties(); propindex++) - { - DzProperty* property = modifier->getProperty(propindex); - QString propName = property->getName(); - QString propLabel = property->getLabel(); - DzPresentation* presentation = property->getPresentation(); - if (presentation) - { - MorphInfo morphInfoProp; - morphInfoProp.Name = modName; - morphInfoProp.Label = propLabel; - morphInfoProp.Path = Node->getLabel() + "/" + property->getPath(); - morphInfoProp.Type = presentation->getType(); - if (!morphs.contains(morphInfoProp.Name)) - { - morphs.insert(morphInfoProp.Name, morphInfoProp); - } - //qDebug() << "Modifier Name " << modName << " Label " << propLabel << " Presentation Type:" << presentation->getType() << " Path: " << property->getPath(); - //qDebug() << "Path " << property->getGroupOnlyPath(); - } - } - - } - - } - } - - return newMorphList; -} - -// Build out the left tree -void DzUnrealMorphSelectionDialog::UpdateMorphsTree() -{ - morphTreeWidget->clear(); - morphsForNode.clear(); - foreach(QString morph, morphs.keys()) - { - QString path = morphs[morph].Path; - QTreeWidgetItem* parentItem = nullptr; - foreach(QString pathPart, path.split("/")) - { - if (pathPart == "") continue; - parentItem = FindTreeItem(parentItem, pathPart); - - if (!morphsForNode.keys().contains(parentItem)) - { - morphsForNode.insert(parentItem, QList()); - } - morphsForNode[parentItem].append(morphs[morph]); - } - } -} - -// This function could be better named. It will find the node matching the property path -// but it will also create the structure of that path in the tree as needed as it searches -QTreeWidgetItem* DzUnrealMorphSelectionDialog::FindTreeItem(QTreeWidgetItem* parent, QString name) -{ - if (parent == nullptr) - { - for(int i = 0; i < morphTreeWidget->topLevelItemCount(); i++) - { - QTreeWidgetItem* item = morphTreeWidget->topLevelItem(i); - if (item->text(0) == name) - { - return item; - } - } - - QTreeWidgetItem* newItem = new QTreeWidgetItem(morphTreeWidget); - newItem->setText(0, name); - newItem->setExpanded(true); - morphTreeWidget->addTopLevelItem(newItem); - return newItem; - } - else - { - for (int i = 0; i < parent->childCount(); i++) - { - QTreeWidgetItem* item = parent->child(i); - if (item->text(0) == name) - { - return item; - } - } - - QTreeWidgetItem* newItem = new QTreeWidgetItem(parent); - newItem->setText(0, name); - newItem->setExpanded(true); - parent->addChild(newItem); - return newItem; - } -} - -// For selection changes in the Left Tree -void DzUnrealMorphSelectionDialog::ItemSelectionChanged() -{ - selectedInTree.clear(); - foreach(QTreeWidgetItem* selectedItem, morphTreeWidget->selectedItems()) - { - SelectMorphsInNode(selectedItem); - } - - FilterChanged(filterEdit->text()); -} - -// Updates the list of selected morphs in the Left Tree -// including any children -void DzUnrealMorphSelectionDialog::SelectMorphsInNode(QTreeWidgetItem* item) -{ - if (morphsForNode.keys().contains(item)) - { - selectedInTree.append(morphsForNode[item]); - } -} - -// Add Morphs for export -void DzUnrealMorphSelectionDialog::HandleAddMorphsButton() -{ - foreach(QListWidgetItem* selectedItem, morphListWidget->selectedItems()) - { - QString morphName = selectedItem->data(Qt::UserRole).toString(); - if (morphs.contains(morphName) && !morphsToExport.contains(morphs[morphName])) - { - morphsToExport.append(morphs[morphName]); - } - } - RefreshExportMorphList(); - RefreshPresetsCombo(); -} - -// Remove morph from export list -void DzUnrealMorphSelectionDialog::HandleRemoveMorphsButton() -{ - foreach(QListWidgetItem* selectedItem, morphExportListWidget->selectedItems()) - { - QString morphName = selectedItem->data(Qt::UserRole).toString(); - if (morphs.keys().contains(morphName)) - { - morphsToExport.removeAll(morphs[morphName]); - } - } - RefreshExportMorphList(); - RefreshPresetsCombo(); -} - -// Brings up a dialgo for choosing a preset name -void DzUnrealMorphSelectionDialog::HandleSavePreset() -{ - QString filters("CSV Files (*.csv)"); - QString defaultFilter("CSV Files (*.csv)"); - QDir dir; - dir.mkpath(presetsFolder); - - QString presetName = QFileDialog::getSaveFileName(this, QString("Save Preset"), - presetsFolder, - filters, - &defaultFilter); - - if (presetName != NULL) - { - SavePresetFile(presetName); - } -} - -// Saves out a preset. If the path isn't supplied, it's saved as the last selection -void DzUnrealMorphSelectionDialog::SavePresetFile(QString filePath) -{ - QDir dir; - dir.mkpath(presetsFolder); - if (filePath == NULL) - { - filePath = presetsFolder + QDir::separator() + "LastUsed.csv"; - } - - QFile file(filePath); - file.open(QIODevice::WriteOnly | QIODevice::Text); - QTextStream out(&file); - out << GetMorphCSVString(); - - // optional, as QFile destructor will already do it: - file.close(); - RefreshPresetsCombo(); - -} - -// Hard coded list of morphs for Genesis 3 and 8 -// It just adds them all, the other functions will ignore any that don't fit the character -void DzUnrealMorphSelectionDialog::HandleArmJCMMorphsButton() -{ - QStringList MorphsToAdd; - - MorphsToAdd.append("pJCMCollarTwist_n30_L"); - MorphsToAdd.append("pJCMCollarTwist_n30_R"); - MorphsToAdd.append("pJCMCollarTwist_p30_L"); - MorphsToAdd.append("pJCMCollarTwist_p30_R"); - MorphsToAdd.append("pJCMCollarUp_55_L"); - MorphsToAdd.append("pJCMCollarUp_55_R"); - MorphsToAdd.append("pJCMCollarUp_50_L"); - MorphsToAdd.append("pJCMCollarUp_50_R"); - MorphsToAdd.append("pJCMForeArmFwd_135_L"); - MorphsToAdd.append("pJCMForeArmFwd_135_R"); - MorphsToAdd.append("pJCMForeArmFwd_75_L"); - MorphsToAdd.append("pJCMForeArmFwd_75_R"); - MorphsToAdd.append("pJCMHandDwn_70_L"); - MorphsToAdd.append("pJCMHandDwn_70_R"); - MorphsToAdd.append("pJCMHandUp_80_L"); - MorphsToAdd.append("pJCMHandUp_80_R"); - MorphsToAdd.append("pJCMShldrDown_40_L"); - MorphsToAdd.append("pJCMShldrDown_40_R"); - MorphsToAdd.append("pJCMShldrDown_75_L"); - MorphsToAdd.append("pJCMShldrDown_75_R"); - MorphsToAdd.append("pJCMShldrDown2_75_L"); - MorphsToAdd.append("pJCMShldrDown2_75_R"); - MorphsToAdd.append("pJCMShldrFront_n110_Bend_n40_L"); - MorphsToAdd.append("pJCMShldrFront_n110_Bend_p90_L"); - MorphsToAdd.append("pJCMShldrFront_p110_Bend_n90_R"); - MorphsToAdd.append("pJCMShldrFront_p110_Bend_p40_R"); - MorphsToAdd.append("pJCMShldrFwdDwn_110_75_L"); - MorphsToAdd.append("pJCMShldrFwdDwn_110_75_R"); - MorphsToAdd.append("pJCMShldrFwd_110_L"); - MorphsToAdd.append("pJCMShldrFwd_110_R"); - MorphsToAdd.append("pJCMShldrFwd_95_L"); - MorphsToAdd.append("pJCMShldrFwd_95_R"); - MorphsToAdd.append("pJCMShldrUp_90_L"); - MorphsToAdd.append("pJCMShldrUp_90_R"); - MorphsToAdd.append("pJCMShldrUp_35_L"); - MorphsToAdd.append("pJCMShldrUp_35_R"); - - // Add the list for export - foreach(QString MorphName, MorphsToAdd) - { - if (morphs.contains(MorphName) && !morphsToExport.contains(morphs[MorphName])) - { - morphsToExport.append(morphs[MorphName]); - } - } - RefreshExportMorphList(); -} - -// Hard coded list of morphs for Genesis 3 and 8 -// It just adds them all, the other functions will ignore any that don't fit the character -void DzUnrealMorphSelectionDialog::HandleLegJCMMorphsButton() -{ - QStringList MorphsToAdd; - - MorphsToAdd.append("pJCMBigToeDown_45_L"); - MorphsToAdd.append("pJCMBigToeDown_45_R"); - MorphsToAdd.append("pJCMFootDwn_75_L"); - MorphsToAdd.append("pJCMFootDwn_75_R"); - MorphsToAdd.append("pJCMFootUp_40_L"); - MorphsToAdd.append("pJCMFootUp_40_R"); - MorphsToAdd.append("pJCMShinBend_155_L"); - MorphsToAdd.append("pJCMShinBend_155_R"); - MorphsToAdd.append("pJCMShinBend_90_L"); - MorphsToAdd.append("pJCMShinBend_90_R"); - MorphsToAdd.append("pJCMThighBack_35_L"); - MorphsToAdd.append("pJCMThighBack_35_R"); - MorphsToAdd.append("pJCMThighFwd_115_L"); - MorphsToAdd.append("pJCMThighFwd_115_R"); - MorphsToAdd.append("pJCMThighFwd_57_L"); - MorphsToAdd.append("pJCMThighFwd_57_R"); - MorphsToAdd.append("pJCMThighSide_85_L"); - MorphsToAdd.append("pJCMThighSide_85_R"); - MorphsToAdd.append("pJCMToesUp_60_L"); - MorphsToAdd.append("pJCMToesUp_60_R"); - - // Add the list for export - foreach(QString MorphName, MorphsToAdd) - { - if (morphs.contains(MorphName) && !morphsToExport.contains(morphs[MorphName])) - { - morphsToExport.append(morphs[MorphName]); - } - } - RefreshExportMorphList(); -} - -// Hard coded list of morphs for Genesis 3 and 8 -// It just adds them all, the other functions will ignore any that don't fit the character -void DzUnrealMorphSelectionDialog::HandleTorsoJCMMorphsButton() -{ - QStringList MorphsToAdd; - - MorphsToAdd.append("pJCMAbdomen2Fwd_40"); - MorphsToAdd.append("pJCMAbdomen2Side_24_L"); - MorphsToAdd.append("pJCMAbdomen2Side_24_R"); - MorphsToAdd.append("pJCMAbdomenFwd_35"); - MorphsToAdd.append("pJCMAbdomenLowerFwd_Navel"); - MorphsToAdd.append("pJCMAbdomenUpperFwd_Navel"); - MorphsToAdd.append("pJCMHeadBack_27"); - MorphsToAdd.append("pJCMHeadFwd_25"); - MorphsToAdd.append("pJCMNeckBack_27"); - MorphsToAdd.append("pJCMNeckFwd_35"); - MorphsToAdd.append("pJCMNeckLowerSide_40_L"); - MorphsToAdd.append("pJCMNeckLowerSide_40_R"); - MorphsToAdd.append("pJCMNeckTwist_22_L"); - MorphsToAdd.append("pJCMNeckTwist_22_R"); - MorphsToAdd.append("pJCMNeckTwist_Reverse"); - MorphsToAdd.append("pJCMPelvisFwd_25"); - MorphsToAdd.append("pJCMChestFwd_35"); - MorphsToAdd.append("pJCMChestSide_20_L"); - MorphsToAdd.append("pJCMChestSide_20_R"); - - // Add the list for export - foreach(QString MorphName, MorphsToAdd) - { - if (morphs.contains(MorphName) && !morphsToExport.contains(morphs[MorphName])) - { - morphsToExport.append(morphs[MorphName]); - } - } - RefreshExportMorphList(); -} - -// Refresh the Right export list -void DzUnrealMorphSelectionDialog::RefreshExportMorphList() -{ - morphExportListWidget->clear(); - foreach(MorphInfo morphInfo, morphsToExport) - { - SortingListItem* item = new SortingListItem(); - item->setText(morphInfo.Label); - item->setData(Qt::UserRole, morphInfo.Name); - - morphExportListWidget->addItem(item); - } - SavePresetFile(NULL); -} - -// Refresh the list of preset csvs from the files in the folder -void DzUnrealMorphSelectionDialog::RefreshPresetsCombo() -{ - disconnect(presetCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(HandlePresetChanged(const QString &))); - - presetCombo->clear(); - presetCombo->addItem("None"); - - QDirIterator it(presetsFolder, QStringList() << "*.csv", QDir::NoFilter, QDirIterator::NoIteratorFlags); - while (it.hasNext()) - { - QString Path = it.next(); - QString NewPath = Path.right(Path.length() - presetsFolder.length() - 1); - presetCombo->addItem(NewPath); - } - connect(presetCombo, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(HandlePresetChanged(const QString &))); -} - -// Call when the preset combo is changed by the user -void DzUnrealMorphSelectionDialog::HandlePresetChanged(const QString& presetName) -{ - morphsToExport.clear(); - QString PresetFilePath = presetsFolder + QDir::separator() + presetName; - - QFile file(PresetFilePath); - if (!file.open(QIODevice::ReadOnly)) { - // TODO: should be an error dialog - return; - } - - // load the selected csv from disk into the export list on the right - QTextStream InStream(&file); - - while (!InStream.atEnd()) { - QString MorphLine = InStream.readLine(); - if (MorphLine.endsWith("\"Export\"")) - { - QStringList Items = MorphLine.split(","); - QString MorphName = Items[0].replace("\"", ""); - if (morphs.contains(MorphName)) - { - morphsToExport.append(morphs[MorphName]); - } - } - } - - RefreshExportMorphList(); - file.close(); -} - -// Get the morph string in the format for the Daz FBX Export -QString DzUnrealMorphSelectionDialog::GetMorphString() -{ - if (morphsToExport.length() == 0) - { - return ""; - } - QStringList morphNamesToExport; - foreach(MorphInfo exportMorph, morphsToExport) - { - morphNamesToExport.append(exportMorph.Name); - } - QString morphString = morphNamesToExport.join("\n1\n"); - morphString += "\n1\n.CTRLVS\n2\nAnything\n0"; - return morphString; -} - -// Get the morph string in the format used for presets -QString DzUnrealMorphSelectionDialog::GetMorphCSVString() -{ - morphList.clear(); - QString morphString; - foreach(MorphInfo exportMorph, morphsToExport) - { - morphList.append(exportMorph.Name); - morphString += "\"" + exportMorph.Name + "\",\"Export\"\n"; - } - morphString += "\".CTRLVS\", \"Ignore\"\n"; - morphString += "\"Anything\", \"Bake\"\n"; - return morphString; -} - -// Get the morph string in an internal name = friendly name format -// Used to rename them to the friendly name in Unreal -QMap DzUnrealMorphSelectionDialog::GetMorphRenaming() -{ - morphNameMapping.clear(); - foreach(MorphInfo exportMorph, morphsToExport) - { - morphNameMapping.insert(exportMorph.Name, exportMorph.Label); - } - - return morphNameMapping; -} - -#include "moc_DzUnrealMorphSelectionDialog.cpp"