From 439c85bb77e774abb1c05a427f34c6531c3d27f6 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 18 Apr 2026 00:58:50 -0400 Subject: [PATCH 01/16] patterns: GVAS pattern for Unreal Engine 4+ games --- README.md | 1 + patterns/gvas.hexpat | 644 ++++++++++++++++++ .../test_data/gvas.hexpat/ue4_utf-16.sav | Bin 0 -> 76756 bytes .../ue5_PROPERTY_TAG_COMPLETE_TYPE_NAME.sav | Bin 0 -> 887605 bytes 4 files changed, 645 insertions(+) create mode 100644 patterns/gvas.hexpat create mode 100644 tests/patterns/test_data/gvas.hexpat/ue4_utf-16.sav create mode 100644 tests/patterns/test_data/gvas.hexpat/ue5_PROPERTY_TAG_COMPLETE_TYPE_NAME.sav diff --git a/README.md b/README.md index f21148ad..22e3cae2 100644 --- a/README.md +++ b/README.md @@ -108,6 +108,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | GGUF | | [`patterns/gguf.hexpat`](patterns/gguf.hexpat) | GGML Inference Models | | GIF | `image/gif` | [`patterns/gif.hexpat`](patterns/gif.hexpat) | GIF image files | | GLTF | `model/gltf-binary` | [`patterns/gltf.hexpat`](patterns/gltf.hexpat) | GL Transmission Format binary 3D model file | +| GVAS | | [`patterns/gvas.hexpat`](patterns/gvas.hexpat) | Unreal Engine 4+ Save Game file | | GZIP | `application/gzip` | [`patterns/gzip.hexpat`](patterns/gzip.hexpat) | GZip compressed data format | | Halo Tag || [`patterns/hinf_tag.hexpat`](patterns/hinf_tag.hexpat) | Halo Infinite Tag Files | | Halo Module || [`patterns/hinf_module.hexpat`](patterns/hinf_module.hexpat) | Halo Infinite Module Archive Files | diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat new file mode 100644 index 00000000..278db7b8 --- /dev/null +++ b/patterns/gvas.hexpat @@ -0,0 +1,644 @@ +#pragma author Scott Anderson +#pragma description Unreal Engine Save Game + +#pragma magic [ 47 56 41 53 0? 00 00 00 ] @ 0x00 +#pragma endian little + +#pragma array_limit 300000 +#pragma pattern_limit 2000000 + +import std.io; +import std.math; +import type.magic; + +// ====== Save Game Header constants ====== + +/// Save Game File Version from FSaveGameFileVersion::Type +/// See: Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp +enum SaveGameFileVersion : u32 { + InitialVersion = 1, + AddedCustomVersions, + PackageFileSummaryVersionChange, +}; + +/// UE4 object versions. +/// See: Engine/Source/Runtime/Core/Public/UObject/ObjectVersion.h +enum EUnrealEngineObjectUE4Version : u32 { + VER_UE4_OLDEST_LOADABLE_PACKAGE = 214, +}; + +/// UE5 object versions +/// See: Engine/Source/Runtime/Core/Public/UObject/ObjectVersion.h +enum EUnrealEngineObjectUE5Version : u32 { + INITIAL_VERSION = 1000, + NAMES_REFERENCED_FROM_EXPORT_DATA, + PAYLOAD_TOC, + OPTIONAL_RESOURCES, + LARGE_WORLD_COORDINATES, + REMOVE_OBJECT_EXPORT_PACKAGE_GUID, + TRACK_OBJECT_EXPORT_IS_INHERITED, + FSOFTOBJECTPATH_REMOVE_ASSET_PATH_FNAMES, + ADD_SOFTOBJECTPATH_LIST, + DATA_RESOURCES, + SCRIPT_SERIALIZATION_OFFSET, + PROPERTY_TAG_EXTENSION_AND_OVERRIDABLE_SERIALIZATION, + PROPERTY_TAG_COMPLETE_TYPE_NAME, + ASSETREGISTRY_PACKAGEBUILDDEPENDENCIES, + METADATA_SERIALIZATION_OFFSET, + VERSE_CELLS, + PACKAGE_SAVED_HASH, + OS_SUB_OBJECT_SHADOW_SERIALIZATION, + IMPORT_TYPE_HIERARCHIES, + + // new versions can be added before this line + AUTOMATIC_VERSION_PLUS_ONE, + AUTOMATIC_VERSION = EUnrealEngineObjectUE5Version::AUTOMATIC_VERSION_PLUS_ONE - 1 +}; + +// ====== Save Game Header types ====== + +struct FString { + s32 length; + if (length > 0) { + // ASCII, treated as UTF-8 + try { + char data[length - 1]; + } catch { + std::error(std::format( + "Invalid string length 0x{:x}", + length)); + } + type::Magic<"\x00"> terminator; + } else if (length < 0) { + // UTF-16 + char16 data[-length - 1]; + type::Magic<"\x00\x00"> terminator; + } else { + // Null + } +} [[sealed, format("format_fstring")]]; + +fn format_fstring(FString string) { + return string.length == 0 + ? "null" + : std::format("\"{}\"", string.data); +}; + +struct FEngineVersion { + u16 major, minor, patch; + u32 changeList; + FString branch; +} [[sealed, format("format_fengineversion")]]; + +fn format_fengineversion(FEngineVersion version) { + return std::format("{}.{}.{}-{}+{}", + version.major, version.minor, version.patch, + version.changeList, version.branch.data); +}; + +struct FCustomVersion { + u128 key; + s32 value; +} [[sealed, name(std::format("0x{:032X}", key)), format("format_fcustomversion")]]; + +fn format_fcustomversion(FCustomVersion version) { + return version.value; +}; + +struct FSaveGameHeader { + type::Magic<"GVAS"> fileTypeTag; + SaveGameFileVersion saveGameFileVersion; + EUnrealEngineObjectUE4Version packageFileVersion; + if (packageFileVersion < EUnrealEngineObjectUE4Version::VER_UE4_OLDEST_LOADABLE_PACKAGE) { + std::error(std::format( + "Package file version {} is too old", + u32(packageFileVersion))); + } + if (saveGameFileVersion >= SaveGameFileVersion::PackageFileSummaryVersionChange) { + EUnrealEngineObjectUE5Version packageFileVersionUE5; + if (packageFileVersionUE5 >= EUnrealEngineObjectUE5Version::AUTOMATIC_VERSION) { + std::warning(std::format( + "Package file version UE5 {} not recognized, attempting to load...", + u32(packageFileVersionUE5))); + } + } + FEngineVersion engineVersion; + if (saveGameFileVersion >= SaveGameFileVersion::AddedCustomVersions) { + s32 customVersionFormat, customVersionLength; + FCustomVersion customVersions[customVersionLength] [[single_color]]; + } + FString saveGameClassName; +}; + +// ====== Save Game Header ====== + +FSaveGameHeader header @ 0; + +// ====== Custom version constants ====== + +/// Custom serialization version for changes made in //UE5/Release-* stream +/// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersion.h +/// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersions.inl +enum EUE5ReleaseStreamObjectVersion : s32 { + BeforeCustomVersionWasAdded = 0, + ReflectionMethodEnum, + WorldPartitionActorDescSerializeHLODInfo, + RemovingTessellation, + LevelInstanceSerializeRuntimeBehavior, + PoseAssetRuntimeRefactor, + WorldPartitionActorDescSerializeActorFolderPath, + HairStrandsVertexFormatChange, + AddChaosMaxLinearAngularSpeed, + PackedLevelInstanceVersion, + PackedLevelInstanceBoundsFix, + CustomPropertyAnimGraphNodesUseOptionalPinManager, + TextFormatArgumentData64bitSupport, + MaterialLayerStacksAreNotParameters, + MaterialInterfaceSavedCachedData, + AddClothMappingLODBias, + AddLevelActorPackagingScheme, + WorldPartitionActorDescSerializeAttachParent, + ConvertedActorGridPlacementToSpatiallyLoadedFlag, + ActorGridPlacementDeprecateDefaultValueFixup, + PackedLevelActorUseWorldPartitionActorDesc, + AddLevelActorFolders, + RemoveSkeletalMeshLODModelBulkDatas, + ExcludeBrightnessFromEncodedHDRCubemap, + VolumetricCloudSampleCountUnification, + PoseAssetRawDataGUID, + ConvolutionBloomIntensity, + WorldPartitionHLODActorDescSerializeHLODSubActors, + LargeWorldCoordinates, +}; +const u128 GUID_UE5_RELEASE_STREAM = 0xDF6417798412ACA824BD4D46D89B5E42; + +/// Custom serialization version for changes made in Dev-Editor stream. +/// See: Engine/Source/Runtime/Core/Public/UObject/EditorObjectVersion.h +enum EEditorObjectVersion : s32 { + BeforeCustomVersionWasAdded = 0, + GatheredTextProcessVersionFlagging, + GatheredTextPackageCacheFixesV1, + RootMetaDataSupport, + GatheredTextPackageCacheFixesV2, + TextFormatArgumentDataIsVariant, + SplineComponentCurvesInStruct, + ComboBoxControllerSupportUpdate, + RefactorMeshEditorMaterials, + AddedFontFaceAssets, + UPropertryForMeshSection, + WidgetGraphSchema, + AddedBackgroundBlurContentSlot, + StableUserDefinedEnumDisplayNames, + AddedInlineFontFaceAssets, + UPropertryForMeshSectionSerialize, + FastWidgetTemplates, + MaterialThumbnailRenderingChanges, + NewSlateClippingSystem, + MovieSceneMetaDataSerialization, + GatheredTextEditorOnlyPackageLocId, + AddedAlwaysSignNumberFormattingOption, + AddedMaterialSharedInputs, + AddedMorphTargetSectionIndices, + SerializeInstancedStaticMeshRenderData, + MeshDescriptionNewSerializationMovedToRelease, + MeshDescriptionNewAttributeFormat, + ChangeSceneCaptureRootComponent, + StaticMeshDeprecatedRawMesh, + MeshDescriptionBulkDataGuid, + MeshDescriptionRemovedHoles, + ChangedWidgetComponentWindowVisibilityDefault, + CultureInvariantTextSerializationKeyStability, +}; +const u128 GUID_EDITOR = 0x2E46BB41A231DA0BF49442E9E4B068ED; + +// ====== Custom version logic ====== + +const bool propertyTagCompleteTypeName = + (header.saveGameFileVersion >= SaveGameFileVersion::PackageFileSummaryVersionChange) && + (header.packageFileVersionUE5 >= EUnrealEngineObjectUE5Version::PROPERTY_TAG_COMPLETE_TYPE_NAME); + +fn custom_version(u128 guid) { + for (u32 i = 0, i < header.customVersionLength, i = i + 1) { + if (header.customVersions[i].key == guid) { + return header.customVersions[i].value; + } + } + return 0; // not found +}; + +const EUE5ReleaseStreamObjectVersion releaseVersion = custom_version(GUID_UE5_RELEASE_STREAM); +const bool largeWorldCoordinates = releaseVersion >= EUE5ReleaseStreamObjectVersion::LargeWorldCoordinates; +const bool text64bitSupport = releaseVersion >= EUE5ReleaseStreamObjectVersion::TextFormatArgumentData64bitSupport; + +const EEditorObjectVersion editorVersion = custom_version(GUID_EDITOR); +const bool cultureInvariantStability = editorVersion >= EEditorObjectVersion::CultureInvariantTextSerializationKeyStability; + +// ====== Property serialization ====== + +enum TextHistoryType : u8 { + None = 255, + Base = 0, + NamedFormat, + OrderedFormat, + ArgumentFormat, + AsNumber, + AsPercent, + AsCurrency, + AsDate, + AsTime, + AsDateTime, + Transform, + StringTableEntry, + TextGenerator, +}; + +enum FormatArgumentType: u8 { + Int, + UInt, + Float, + Double, + Text, +}; + +using FText; +struct FormatArgumentValue { + FormatArgumentType type; + match (type) { + (FormatArgumentType::Int): { + // FUE5ReleaseStreamObjectVersion::TextFormatArgumentData64bitSupport + if (text64bitSupport) { + u64 value; + } else { + u32 value; + } + } + (FormatArgumentType::Text): FText value; + (_): { + std::error(std::format( + "Unknown FormatArgumentValue type {} ({})", + type, u8(type))); + } + } +}; + +struct FormatArgument { + FString key; + FormatArgumentValue value; +}; + +enum RoundingMode : s8 { + HalfToEven, + HalfFromZero, + HalfToZero, + FromZero, + ToZero, + ToNegativeInfinity, + ToPositiveInfinity, +}; + +struct NumberFormattingOptions { + u32 always_include_sign; + u32 use_grouping; + RoundingMode rounding_mode; + s32 minimum_integral_digits; + s32 maximum_integral_digits; + s32 minimum_fractional_digits; + s32 maximum_fractional_digits; +}; + +struct FTextHistory { + TextHistoryType type; + match (type) { + (TextHistoryType::None): { + if (cultureInvariantStability) { + u32 hasCultureInvariantString; + if (hasCultureInvariantString) { + FString cultureInvariantString; + } + } else { + FString cultureInvariantString; + } + } + (TextHistoryType::Base): { + FString nameSpace; + FString key; + FString sourceString; + } + // (TextHistoryType::NamedFormat): {} + // (TextHistoryType::OrderedFormat): {} + (TextHistoryType::ArgumentFormat): { + FText sourceFormat; + u32 argumentCount; + FormatArgument arguments[argumentCount]; + } + (TextHistoryType::AsNumber): { + FormatArgumentValue sourceValue; + u32 hasFormatOptions; + if (hasFormatOptions) { + NumberFormattingOptions formatOptions; + } + FString targetCulture; + } + // (TextHistoryType::AsPercent): {} + // (TextHistoryType::AsCurrency): {} + // (TextHistoryType::AsDate): {} + // (TextHistoryType::AsTime): {} + // (TextHistoryType::AsDateTime): {} + // (TextHistoryType::Transform): {} + (TextHistoryType::StringTableEntry): { + FString tableId; + FString key; + } + // (TextHistoryType::TextGenerator): {} + // (TextHistoryType::RawText): {} + (_): { + std::error(std::format( + "Unsupported TextHistory type {} ({})", + type, u8(type))); + } + } +}; + +struct FText { + u32 flags; + FTextHistory history [[inline]]; +} [[single_color, format("format_ftext")]]; + +fn format_ftext(FText text) { + match (text.history.type) { + (TextHistoryType::None): { + if (cultureInvariantStability) { + if (text.history.hasCultureInvariantString) { + return text.history.cultureInvariantString; + } + return ""; + } else { + return text.history.cultureInvariantString; + } + } + (TextHistoryType::Base): return text.history.sourceString; + } + return text; +}; + +struct Rotator { + if (largeWorldCoordinates) { + double pitch, yaw, roll; + } else { + float pitch, yaw, roll; + } +}; + +struct Vector { + if (largeWorldCoordinates) { + double x, y, z; + } else { + float x, y, z; + } +}; + +struct Quat { + if (largeWorldCoordinates) { + double x, y, z, w; + } else { + float x, y, z, w; + } +}; + +struct Delegate { + FString object, functionName; +}; + +struct MulticastInlineDelegate { + u32 count [[hidden]]; + Delegate delegates[count]; +} [[inline]]; + +struct MulticastSparseDelegate { + u32 count [[hidden]]; + Delegate delegates[count]; +} [[inline]]; + +bitfield PropertyTagFlags { + bool hasArrayIndex : 1; + bool hasPropertyGuid : 1; + bool hasPropertyExtensions : 1; + bool hasBinaryOrNativeSerialize : 1; + bool boolTrue : 1; +}; + +struct TypeTreeNode { + FString name; + u32 children; + if (children > 0) TypeTreeNode child[children]; +} [[format("format_typetreenode")]]; + +fn format_typetreenode(TypeTreeNode node) { + if (node.children == 0) return node.name.data; + str a = std::format("{}<{}", node.name.data, node.child[0]); + for (auto i = 1, i < node.children, i += 1) { + a = std::format("{}, {}", a, node.child[i]); + } + return std::format("{}>", a); +}; + +using Properties; +struct StructPropertyValue { + match (type) { + ("DateTime"): u64 value; + ("Guid"): u128 value; + ("Rotator"): Rotator value; + ("Vector"): Vector value; + ("Quat"): Quat value; + (_): Properties value; + } +} [[inline]]; + +struct SafeStructPropertyValue { + try { + StructPropertyValue value; + } catch { + std::warning(std::format( + "StructPropertyValue parsing failed for {}", + type)); + // Wrap the unknown data + std::mem::Bytes value; + } +} [[inline]]; + +struct FPropertyTag { + const auto dollar = $; + if (propertyTagCompleteTypeName) { + PropertyTagFlags flags; + } + FString name; + if (name.length == 0 || name.data == "None") { + break; + } + const str prefix = std::format( + "FPropertyTag {} @ 0x{:X};", + name.data, dollar); + // Debug logging + if (propertyTagCompleteTypeName) { + TypeTreeNode type; + u32 size; + if (flags.hasArrayIndex) { + u32 arrayIndex; + } + if (flags.hasPropertyGuid) { + u128 guid; + } + if (flags.hasPropertyExtensions) { + std::error(std::format( + "{} hasPropertyExtensions not supported", prefix)); + } + } else { + FString type; + u32 size; + u32 arrayIndex; + match (type.data) { + ("ArrayProperty"): FString propertyType; + ("BoolProperty"): bool value; + ("ByteProperty"): { + FString name; + type::Magic<"\x00"> terminator; + match (size) { + (0|1): u8 value; + (_): FString value; + } + std::error("Not implemented"); + } + ("EnumProperty"): FString enumType; + ("MapProperty"): { + FString keyType; + FString valueType; + } + ("SetProperty"): FString propertyType; + ("StructProperty"): { + FString typeName; + u128 guid; + } + } + type::Magic<"\x00"> terminator; + } + + u32 start = $; + match (propertyTagCompleteTypeName ? type.name.data : type.data) { + ("ArrayProperty"): { + u32 count; + match (propertyTagCompleteTypeName ? type.child[0].name.data : propertyType.data) { + ("BoolProperty"): bool values[count]; + ("ByteProperty"): std::mem::Bytes values; + ("DoubleProperty"): double values[count]; + ("EnumProperty" | "StrProperty" | "NameProperty"): FString values[count]; + ("FloatProperty"): float values[count]; + ("IntProperty"): s32 values[count]; + ("StructProperty"): { + if (!propertyTagCompleteTypeName) { + FString fieldName; + type::Magic<"\x0F\x00\x00\x00StructProperty\x00"> propertyType; + u32 propertySize, arrayIndex; + FString structName; + u128 guid; + type::Magic<"\x00"> terminator; + u32 propertyStart = $; + } + try { + match (propertyTagCompleteTypeName ? type.child[0].child[0].name.data : structName.data) { + ("Guid"): u128 values[count]; + ("Rotator"): Rotator values[count]; + ("Vector"): Vector values[count]; + ("Quat"): Quat values[count]; + (_): Properties values[count]; + } + } catch { + std::warning(std::format( + "{} Failed to parse array of structs size {} in {}", + prefix, size, + propertyTagCompleteTypeName ? type.child[0].child[0] : structName)); + // Wrap the unknown data + std::mem::Bytes values; + } + if (!propertyTagCompleteTypeName) { + s32 propertyBytesRemaining = propertySize + propertyStart - $; + if (propertyBytesRemaining != 0) { + std::print(std::format( + "Struct parsing failed for {}. Bytes remaining: {}", + structName, + propertyBytesRemaining)); + std::mem::Bytes warning; + } + } + } + ("TextProperty"): FText values[count]; + (_): { + std::warning(std::format( + "Unknown array element type {} in {}", + propertyType, name)); + // Wrap the unknown data + std::mem::Bytes values; + } + } + } + ("BoolProperty"): {} + ("DoubleProperty"): double value; + ("FloatProperty"): float value; + ("IntProperty"): s32 value; + ("Int64Property"): s64 value; + ("UInt32Property"): u32 value; + ("DelegateProperty"): Delegate value; + ("MulticastInlineDelegateProperty"): MulticastInlineDelegate value; + ("MulticastSparseDelegateProperty"): MulticastSparseDelegate value; + ("NameProperty"): std::mem::Bytes value; + ("SoftObjectProperty"): std::mem::Bytes value; + ("EnumProperty" | "StrProperty" | "ObjectProperty"): FString value; + ("MapProperty" | "SetProperty"): std::mem::Bytes value; + ("StructProperty"): SafeStructPropertyValue value; + ("TextProperty"): { + try { + FText value; + } catch { + std::warning(std::format( + "FText {} @ 0x{:04X}; Failed to parse", + name.data, $)); + // Wrap the unknown data + std::mem::Bytes value; + } + } + (_): { + std::warning(std::format( + "Unknown property type {} in {}", + type, name)); + // Wrap the unknown data + std::mem::Bytes value; + } + } + + s32 bytesRemaining = size + start - $; + if (bytesRemaining != 0) { + std::warning(std::format( + "Property length mismatch while parsing {}. Bytes {}: {}", + name, + bytesRemaining < 0 ? "overrun" : "remaining", + std::math::abs(bytesRemaining))); + // Adjust the file offset + $ += bytesRemaining; + } +} [[name(name.length == 0 ? "null" : name.data), format("format_fpropertytag")]]; + +fn format_fpropertytag(FPropertyTag property) { + if (property.name.data == "None") { + return ""; + } + match (propertyTagCompleteTypeName ? property.type.name.data : property.type.data) { + ("ArrayProperty"): return property.values; + } + return property.value; +}; + +struct Properties { + FPropertyTag values[while(true)] [[inline]]; +}; + +Properties properties @ $; +type::Magic<"\x00\x00\x00\x00"> footer @ $; diff --git a/tests/patterns/test_data/gvas.hexpat/ue4_utf-16.sav b/tests/patterns/test_data/gvas.hexpat/ue4_utf-16.sav new file mode 100644 index 0000000000000000000000000000000000000000..27f2fd1db4a59e92cbab9fb97f53d20014c9d344 GIT binary patch literal 76756 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

}V4Ym15ZrB3 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

MC#vGOeDbf2I*IhSs-h-7BMl+eI zdm}O92e%F1bn(aP7QC(k3wk$p%qYf_H2f%j^<4?YZ_MDuwg~)cYR}qGTfYyr6NWLK zJL*IXe#pxjZT7*;mYgTJy+3Nd+cKWe5em$h*Nc@EpH|>|SwBW^HXsF4rxAET$3#(; zjIOPms4tKDN!G<+*)Lvp(!)49o*XX;3B!5&Et#B0Gh=Y_Wo~QRyxot+FW_?PAbxN;k%1IwA=#r}t(utq&f>YNx@hJxSk> zW3pxpM9_N;kqv9{K!X+I?+qvM>jf7G>O_6@JrCgFXWVa)CO?W@K5T;IL^HUt@&uZD zY=ci9XpUsRbR6L54>y09!YkL4n3}#6B$4zj0!bD|uknP0YEyXsC<9y2|1ddBH-n9b zv(R8ZX>+geF!u5avkRDo|8CvxG8j^_f3>-R5RJ-*QO|5ja||#A?p*p&+;tQXK9=>*Ud+(rI@0V#O1v@dC$l3A9%bUv{~19oeIMZV`_t&M=nrX{Kl@)~ z;IH=jtUYFNC($-ukM(hA%`vPHb6Y7t;3y97%<=mniJ088IpaBBa}sOPUNZUj=sqL= zAJ?~IViPb3DwtkpcP$Qc!ymJ@y>{M%;)H)0z4moJ`c@jk;&o=AcRUokP2~QosIT-5 zfveotQCE?RH6Aa?<{M_9QRiWK^Lx`2!7909oiEp;vWpwMgF*saW$Z)=19HtR&msu&3Frl35y|%;Y9eM9e#uNB6 z4VSIvz7%E4)7Z!NChJR3k{a`}Z;=6}^!<~aS=e>KBQj(#y=U5(jR}$`z7~NV z|107AJEBp)^96?8zr=>xoey9_+r13`Xsg29GhE+}Z;^)A2PLyMcs|R-t`Ze7 zpxT2jf%mpPvV%&*X42OdXd|D zgO(=ZfV=A$UH&u$^Nw)ej?;+a7#kD7=*v1?#6JFoM6ET0b!iu|>%cS;Me{Mj$a##U zcXB3M(f$0+c^n=eOQv?Fv9`B#t@YwI#k{PmSfhWN45RNn_|Hs0*CB39=JLrY*uQuj z!){Bi;PBdf0#nUkS7iZC7;uQ>$I$mx(k`LPvv|_-61`t$brI7-B1rgCGkEKF7FX5F zNhb$$D7_*lyXZ2Pf0!(TtpxxKOl z!!s{rV#53n%>D`t%*J+m#f<*@-#m03WyFQGE4%Kt3d@ghKb2_d89cL^FnYm= zv-GWrEexORcOJVAYbVF3IDd&V$7aqWcnsESWs1j3CfEy z&x7>t^WZ!jxZFUdurY_Bv1w>H*?3%&Z5!EGf*wDf$WDx+@7tWZfv&0+#FWm53*)pn z;OscrAbJnc{&XRpnQSTxr{^QAxrCy!M@2Sm=~=U!zU%TZzPQwq?#bVdpyFEyv(tYs z(_pTHfpaF(J+SBoE_}LUeBcOrU;cS9impc&s}sy1@Az#T@W@#pegA2-M}|9?h^e8rZCJ@K>e_bWcevm zaCuaO`VX%Yzj9M>FDb@^v~se!z!d(dbZD!fbF8~5yd8ZXV^)kNc-{p5EH1+SosGfB zmbP+!ZeNG=*gi`S{*p8myrFGwQW?D{?$^Fr@S0NefH9WO3g@LA*@cj>OnAXA!uHDGM zlP44~`hf|I+Hn@Wt+&BaV^eU=J&m_b>HmiZo5HO97m+Mp0n>-ldz!O$Xs>oU3bP;5 zcZcTf*4n8Pq0J;31B%Sj_Do3v%U(1W?({G1{?mzIILr(Jlomo-^Sv;G-kBX6Xdo<^ zcNm^gT}ao{UU2%dAKd6W9-6ZGf@t_YI79aw<+tU+%sKJU@Ri1!tj7uT&m{0pMBfit zV1|8W?q|ALK)4Owa*1cy>%I-PIF!P0L+B6;_D*3opyM|BE=TMEhU2P7V{%dg$6;e| zk3}-$_o$KLIz1J`ioD6#e>9g9{cZ-{+REj}b((^;;hbmVh1vA|2`;nUz&V(Zb&!>< z_j1GM-X|GeDEG$Wzc@Xh?-J}8n84_nf%DKqe1hQ+8~VmWOBHKR^6%B?JA?C74qt$t zGtwE|r+6(IOyPZL*KrF@Ucznam+JM{VZl)*Cvw78{Pl>Bi9zEE3^hB=%GN2@p#7XQ z##6F}z7=yLlhGGE-huXTh|ynkr}y{g9cT2B9m4SX72e;HE1{V1X)oi^rmVrBS=o$7 z(RK%VI;An}dp;c3@0rGQ>8%$d=pFM^NTE99cXcQ>Dzl-Io`Z02CthBW z4Pr`HK@6s@JO($Z?lEUzEb2uh!%E6C$|(l5hKWqRbB|~|lE!@+rT4dBy*d|W%%E|6 z`c6*zr$cb1k2!n{rgm$;1ZbrBoIjuM#;;4#U~wDjZ)p*Q2AXV$>Pp{C^9e)K+FWpv znZv4adr|Q*4N4x^ImLRzXzVtcE*hj!&IL_h*@9`zC)<}D9NSz6n#HuLIR3qSs*Vpg}OJp@VeV& zkkR>kw(cMr#HPTEH>Qx*CkZ!CR6&)NzR8of4;uzw0@WBZnD}oZdhg4FuA!!I{B<(A zy-S0sz3E#(#(UB8!c};-!wh!pI81$m*-+|g3fVTX=u=VzNrvW7G$RS!-xPua-FpwY zsj<d1(I26mE<;iVjA{;o%Dt`d{26+_g{x1L+<4Wt&nky0!qKR+|ACe-O>{4nQ(J zmG1_@ASW+Ekj8=)dUeR!KG>z4!Bw(sC8mv2*Lq=^fcA)Tud5N(3h6#<4rD65Q!%#5S6gEyhf$9hJ zZa|$0z|9lb|3Nq$n_&u3H%?(D-9z3hO~Dg0Fy0^d7?iUfqreL63-DPaD2rBtoU<{tXXRU?_D0FtNsR}{4R#b zJ>{6#tDLB}n9@69PqE~2KJlPuncuET>}zqCRP;6jgOT2-DBR0*01>sdMK_C>4?kdS z7>fSvVp#iWE9O4*Wqx(*sWJ3jK|RL*H((tOoWuS3Wika0{NGTf=eVr!z`3_}GX5XB ziHK_lvpfeQUm1!9&1GdZD<|XJ@V|_w^YvM%cJ*RqjfX5lF@2DwNzbW%;DZOx-DEi5 zDTuxwb(>*xnoAg6)|2UkSLu6D9%uex^fyQ2@w}HIlbL&eA1>*V&FWq9Yd>b4GG{!O zRz%^MTfG^ctcb+ywI&R=D~rIy16LSU`R>MUm6Z$|IPJmr6-KPCWl!R;oBbn3uh_O5 z2h8Pqa=mRd;%6QsDA$Bx@0wV~ANe)}ZQBMh+}JY=WB+ks*!S`djGfSjVZRsNxXP(7 z!!x5dVoVl~<7_{+5~Bl0GWxUw!8oPIOook0Hel??sSMZq1>=Xs^gcNqE6wO2`j*uy zhW!?7!?aOH7?w|(iU)6fVQm(7osPAiEEwHE;)OxlIA;53$vW&~oyO>H&sU@4ejdXL zfhCx5csHX<)-J{m7TXxEnlT4&=PhMr#p;FV>cV5G?vEDIH3$W#iGq zpX=%s_o?62vyLCFn z`yTIs^0#>m8$F(fHUoLQUg@(8BQ{=S{E7@W^q9}{1Y%YV!yD5dGJ9OC9D+VRJYLhG zLW(wrcn(JW5&9m~7;dMxz3xHZFsx$yE?0f9RfpS5W`> zK)gQuI>TqiDNrt`87^2i4a=W?V^~);pS~g4z_4G%a@6-0v~ScRltT$+2A;ee+}A57w7<#vW+ap&RpEbZ+a0#+yvpnd{Zl5nBx7xhvJ5 z$767#KI74!x)`koaeq$DFMkYt&Er1iBbVWpaomUYchFR<-`$tVX`JDSJqvm4NvoD) zS!^FhPyIL%UGsY|EG-<3zv6h@%6pw7`kv(d`iH*ZQ~!>~$J^lHnMuy(q)9*(~j4P)55lRahx4rW+xG7cSPIxsoW5d@3ZjbZfs z0d82?Mat+#CuigOVUrp5_&6OKD|p<>rqy74GS7=-o> zlZgkzPRZkO^ouzRSNb}l_iFBsEo(CZjgPu9ddXu))brqFB|ZbNpqA$nBpo2F>TOiK^)| zR`rYPijIme!j>@3)AZi5eHEwI-FPD8E$2F?{CS=5y#4@dgYL>T;V;#hoBV7Iw)D;N zdvQ!3OaEYu85vwZ)QmR4?Y3Nh4n1##`@bD#Wxcxp7DOiwgOchDB8%t3Y0V*6FoeE` zpZi&;Z0!9DQ+Xy~1q?dz`zj)jL|AhoHLAq9f;<`F1; zN8hboSuHr-J_B-}eN%cU@>Fzi->lmZ!UG9zD+8yV8 z>CzVmsku&G*3JRV@=_T+LvDqoZ%;%0SemmZqB+QxTxY&K#~EjOW-uO`H;$OxHjDM$ zivX&ZaveD2;7q(qb+D#39J$#K#Sv$r>8;3wr*c%#T=S+FU-42`)P-DNxN-1sR1V37 z6zcnOm@^(LtMlODa2gYtJQqV#b0MD4w+&yf#ENm}A&Tm#cF|MOr~5@{x(nmf%^&Np z;dt=##LKwM<>S^|CFwXQMOkGOH`U+J$xdk?kov@Q)-(JFz3!b;=o33ko&{HMA$j#=EbuAn>J=cKYeEPlgH(=$n>mZ}KsgX`JA3Xm$WLDEQ z7wkl`n&v1s(%jdMyRm@gh#S$m6g?ue?>n6auaTxu_2iRQ8k!10Ws+k3lkbUT7TLbYqmauXDIyCL2 zgQ_kT;8ksiez#A-Fl%$r>u-hDIcj*;pN=if*Ou$(T%|t1nlH`J%q$(W-OSm`_$L5L-G)3*Qd%Z9;Lc>vj>>59e4TOCfI(v}|9piD=TVZ!)az(44GT z@RaRi8nH8x4=QK$D*Yhxx|;jXEBeKglFvN%(#t8GG(^8-Jo)!^|aJIy!f73(Pb}*+|JK&-Jm=oFKc9FHJ(U@zxmCu zWK$KXY0b}B#h|A$YiFK2s`+kAf^Ttb_tBm-zT>fyI^sj>m-78N=-nYwKaa4 zcm6xm$u;7-oS(%u-Jg=wha8JSKFKO?@f0T9Yko#c^(T|kbR)L6Ywr3GicrWL%8?XFS64Qh8+tuDA=41Yo^QnU5+~((kc;gq+xPr%PRL7pm0{8S_GOJED zC*EDG8CLw2llOOd>`WQDlVqLY=XKq~!^C<$&yQ8~OeKC_cv;Q9dnCC7kL9_Q)RMC6 zJYPlg6J-T2`@%9gjc?xVMvO1>IG~&16q2>ejqsMg%cCi_Rh2!CjNZm|39lvoWd5bGOpd{bc=F*pk7FAAn@{RxJdSDSp(GZ~ zfbj&Z%pkA6I5RA|IKWvkKAPJ^2CHOwDZQP)AiTeKZFdNWz2A*_W?49a2w5iy;E_8 z{1&5&ehrm%`+1njQAD8Z(cG`Her0rTA7Mh~?0&&{x=bO7?YY0*NVS1f=uv(;h9%GT zkn*G1oJVqb-0d2k^QP!NRp!^cJ!xv2=H5wJrmuuyuU`hF?JCYA5z9zSr)GSu-FYUv zJ#Q^ZNu=j&P$yy-%U3EL(OA-~NzUSFvMD-hn^0V*b0D`juV-Zy?!(FCvRQoJ zSlf|=%Xog5BGG~5{gcGjomYJTfoa?hQsxDa-kmv5fWdC^I`}^vmQ03^;&z{OYBHI< zo!e6iAAbUoCwM!>9;B;~%jn$@M4c}M0G8%?@KQNL50mh{aW zC8LWb%yu5;&U5xeuZgVd4q7kmi`NH~U6&P-SH5)4T=bU>+d}12y7YpL?0Rh>X*q#@ z>%$V6LFl{x1VOb_&i^yqM1u%w)%ZwHa*8h%Gb{BrF_mS zTuo)klX;G}A}PdqmNVBC6*c;@_SrHvpR0ackbPUr^?GcS??d)F~1ux8LZq=qu#mC!(GM+&$ zNkwMkwll2R(^fX*AkXI!ElV5kw~ptZh`z0MzLm0wjfrUIC};OieB4CGI>>CFa4fkH zCG(igbGH1Kgd+JA0lZBmq~_{#7vRyXc^lm@edfSC!nBMNQfd z4m2M?G1r9*+q94ME8y;SqMfseVd>5wGGhSmqh0oN^6KnTMpw3)Pj2<}V||o@KiQlb z&FGRI-X!nN9@ZDPT}smF0?#9g6z?W~8hG2>b{-%*m+&?yd&ZNH9sC=4?F}UkHfxw1 zx4S9iJ-u7oqz~)nsmavMAq-1t90}_F>sRA`a?X?csMQ0ulaTZ!jHh8&IN2P;?GDB7 zlf-<^N?tZqAm8bIlO~xii*iT~Ze&>UTTM)daa*RO*LC9bmAAp`*EKRIR>}GjP;`Y1 zs^&I}XxB|LH=B=%M5iO8t9c%jQ9vrWe~jBQ(*0Fr>LOm3^2j@~avJZic=l-bvaFL4X^1uX&Se>A+5mr@G6FVDj$*%-D1X*{^biX{=JCN{oZ$m z`g^<$PRWL_LCbS84QTF2*5S>pt{6#Y8nfcxOXpw!zAtC-xs>pb{FcpRauV&o5x-v3 z84enCjclFH*Uo$QHgK!dmGLKTuOi-U_?}~T;wP#1;P*|E2X}$_Q+Zj{7zxCmTEf>p z%|TedZ#%YHsL6s_$btY{AVF4D1s!P|2Szo)ex?B{kp&iwGo7y0EGyv<)T(1r;=mPCV zcVcw4$!{W~?@>1KxNL0$PHnl)uNF%n_+3{*qk0Ik%{QHXhNar~=2G|UK$ao%(SO0e4lFIEA1DZGO@rL^bnqm5;!_ zUB%k_Zor$|J=5k~iFQADz8d>MAs|4Z7M z@%sy610)|#PGt2uK6^y`tYr*09BuugWaWgzk+WmJgLt>vpD&7?_`uidg*r|gUt~ja(1Fz3wxN49g zczig^u#Uc?*zGHikBB?R6W6qktZkKrtwB^1!0t>%|5;ExVF4e{!JpEK{n}4rJeki; zD9=Nt7X=*=gL;NPlc`7V(hn3|7)~u13?h+hk$0duRBn^d`;A6SrgDTBZt%CnMb@>0c zbnbCEEnOT>NT-s}aY-fVCXSL2Le#7kLXw0^x(S`+PHssOI)spPh*GH}k`j)DT}V9? zg%Hw}bfrUh=bd%_dcL3a`OTWOXZD^wdu|Ue&&s)m;8)X=CGqhh-Z&2n$xRT?*FdJ}g2HR++pFkUfI{&_mdnS@e6vPDwRAzGE$?Ll z3c)u8J8N3N#-#-;nxFlmveyv$f2kDrc51;$z+JSK@5(AG*f{?n!6QJWgTAkACRjjK3fYrJ8$vf@`W8+P`vW4o6X)uUhRzK7 z&dseK3z}*)Zv4^30CXQw|2Aa&Xz=L2OXS-$eE{UVqkf%QvLU>dQC}sNmyh;5>Vsu> zs)KGn8Xt}b(goe&|MfplsDasX>Yub_n!x_`heaR8`H&9eHPiU8PW4ZAd1aKyOONmI zt(g=pG_h^NVe)@#BqCz^z_aVL9v~>(5#;8l-7ziKhAMSOcsRkFjpAbsg)^Ptqoo>q zJ!~+@auIWX}Bi^rN>uJpVJ_MwPD>zU%4^X`?1FMQ0t5rQ1T;O+Kl0ir;(7 z?cvz?hpgfk|4$Y#YkqcIC3E9vH7Fii3e|?O>0Fz@aSW;HeD-IWACBoyR(c z^ZoCuXM%-yJ9Fas2F!K>+n@F9G}8jh*|y-S(hVZ{cg%%4tE!92;0S zPzMT^^1R|5fG@ya={?pQkW^U`8gQ( z?V&=!3|8*s->|Z2(0*bf=>ES==&}U#!VKY}j}}~!bAgIwBf+GH7HB#z0CRqSFWAG! z`IQ}EowqeC=Ffs%)JzyN5g~>@U)gUagI;gyU&Sj=;pcr&Kg}=M6+Y%pfz5nerC^{d zOmYT@i{WP{Mmj;Gy)z8u`Ff>I2k!@SM4zF2{RF5eSS;?Juu~S`(tWkC+pk72U*#j- z#pTh~;1WUoRr}7lFfYwl*k$VTLAj8=(Q4!P`J7hty<>676T)j9!9S9>QE!)m<9io) z!=KZL8`jXCM&D2!!MxvbiTcT@CX>P7Jh9FmXIS@olZc_<+!Ap7Z*PKme-}`HvPHzH zY2gG8VWdz0H3^dU()Uq7z)T4IKwSHWD||UknyvR2K#K|4?T60*|8jc1lDHSjlVcIpCi&6RL2ywNv#%bL*YsfiI^D^eS_K-h~o>|#N1DGQ_Bl1e`?hl8}Cy|LHjr0Mn)-X2ojIeiTjRg5+@qz<>{t3s|QM;k}#Sy-a zBfVdv3+#e;kypHtH3Z6?7y2t5!{B(~d0`K`5&*MzQ9BcLzz@F8r1ef!3w>d6G5NW1 z!4jTKO%`b_{2U>;A8~H~-cVz4R`^ll>lY24(_GKT`FgOnH_ho(d6_}c(hDMO%y1V- zaiq0XdN!M(HHg+4rLUX;cMhZrKSnBZ!EGYV@3<6h29LKVMcN8EOGsONNpR}Bd7uz^ zS#ZepjR2EqPO8Jn4_XrF8rv?q!fE+5;nSw4AOr#rOl&k*{pCnv$o1zEywnu-uA%NF+7zf9og*DS&AnL!ZTm+~zwwSdIY z*MvU&&o!Xrd_`zBMe4%r>lAbL#$fn*km}{i6G!O!;HJ>$ns|V*-*ur^+`R&(SdpKC z@qsWcmEsTF5)5bmpfX9?vIKTG-V$lcyZgafzL#px3f^`tS`J?8H^5BZH;4-KhtMuN z#n@M^&3cGF83J~Tc$;jz1+Ml!0MmfCA=*2j#BeX4PvP%P2nI90*X;EI-dEoc0zM^2 zAis+MC?B!og4~&oGnCaD2dZ5r6HHFnBPT>OE}xewgwz8WQ+iTg21@@J@xFkICaK zy%q$0)&_%rG4C^IghNsCL2#+#^Ixsopmo`1klHo*nzmq2cHYMSOH&I{dmVrp=@4Ys z^EtJ){ot>>7mED(Jdx>N5E!x-UL4@>0>0-=!7v!oBrT97N5HMT7=D&5KaK7*-#t-SsM7x#ea;zz<~Sj%>p zH?~;VNA}qXxx0%&f%m01)%ZeWS)tIB{xJt`&8F+UTjUBgV;=~+d80ij{Vs{LG0irx zua06)GM@-jEb@d#ZMQWj=jIFUroiuYz+>Ggz{zfrznaed*I5pmTfT`0TyQ22BXRRq;p)XtQ5 zC_|CUSz$N-q6#yTk^~#2DZ$9&se%KDnpC;Jf0M)qZ z*pJ!)XZdP2^cP)ArCKv{I7Rno$NVmQZx!8#mD3vdSSY>A+`X%qn?JofIvQ))=+HZ& z4Bg=$rfWp)q5B{igX%bOjg@`c*!#?Ap$W5k$PPZCHL(G<1?=ZWDu>u#d8{~v>O$^q z19O~MAoLxFuCZxI&yI8N+w4>p#b(+yo4F}bUb$<_*psXDPEYqwXR3Mh?8|&p*;;)n zAK8vf78*_0UViceD>kAsZz?KcD?6#oqe2g{XTz!8wkQr~`*i7DP#$!MT`#3FSM>siaF?y zXqL>+6#oBsORSzZQ~D!Ka6pPTyEvK3#FwwZ^jt}GTDf`?TQH8wFzM+Yru>ZR(exMh zvx1&$`{TRW=~0xIj@fwT*@w?}bN`hmCb7YD$!G4KsVrsbd0{tI*ve9(sIKjod9f7> zDK`5@)=alI)nn}RUTn_j6rq<3m19qqQTrcYK7a)V&^z7zc{r&r_Q~6o0)Zd-NH~lK0h+kCf_yz9Qgcu<+eF2hxai=IqWI3c~<^6U%SCI zk1cH0Xq*GDt9;GvV-=RxN&TN7l|Y-Hjz=LtiTCq=b+b9c27nTZR`91=jSFU$%x$txA+BIN6 zh7MTqbs+z*cjxiHgUQnhNaJg1*xTbQN(Jh-r#$e z{72;kK-wva&0^9vz~&Ol_iPXpUnRS9mjc#l@(ikV`L%yfV*RJf;M*8JF6y)z3UADV zhr9Xra z()nEwqO%kZ$`1znqq`t7XEj*V^8d&v3xks-o8aqwZD0ovKvDPI5NNIqu_F&c^^_f; zC&$l1{P#HA3W$JkuJMeD0+Xa;kesOnlZ~U{Y*I9&@8xGmo{s^169<~(wV+qUX&5;^ z6H3E1;aJrvDEgKIN=|$&)~z`3$Vms=ar~^s!+*nYzgwd3vC`@&)cp7EDCFlc?0Zop z>Ln#E4z>@z22c1Hg3+ygkTsv`4o=0u+CKE2b$)yd2H&N6T(kEigp4W@{e;%>haoAD z>cxkj^;fd6RMb($>z!b;fa)~j#Wt`mdoJve#rvVms6z0_qw!GOo&+%l{Jg=KI56vR z2G$hu@Ao*qKOj94JicjzM^Y>VmL7u&qrqTqeiG_^B48|ETe;OL9ums$KtLehTcHvU zg&GB5>aPi1e?JRq&V?{yI)Bz`zp&Z^&!J@`A1ATw3wm=ZLD7`=W5-r8^K~y_hB6;> z*zz0LoO%a&J$YYxqa1W*y@SXPe1F{ho6KXC1+xJDOzFw(H->%eS^+IuT(k5LGwSyNj-duvtuL@SJ>))^@tDJ6cCsO| zDzN2txhq*V^&{?rW&0p#lAFNp_`idFe9SedZmCUp{w-+wi=PcXG|Xm~(oLv%&)X}j zyH=(@`MId-gFtP(JX_Z71-SA3VpjjA*c99?0jmJcYrC>0ewOH!GdzZWFW6XW6hdbr z*Egy#qi|jh8hk%g&NUX0S_2g}8lbbnku7Vjh7k&U|K`0XEM{U26h7C0^h>*#Y;6Oi zw(#-hXdPDE=L1w&X+ZX}Ocq|$0PcKWTg0xDO!4_AFpc8pWUuyNBSu+?anYb&8`(@> zeZdxThgr|enl$1g+T|#ry{aLokE_RA-=64~ZU8w_1G@UFpi!Fvblv<3KP*;8 za|1(2(Eg0QI(uT(2t&9j*NlI95}#e$f``(TgFVbWs*D4kh{b}hZo@m~W- zzFLRl+Iyjqnju&vG~l3DYC<1v^$FdstKnS@LwK0lh*^WkKE{>*c1Ao-uB{Ovl``r-mP%Vxw>5UymhOj}q9tW2875Xoy8Zhx0rJY~#2{&gG zJKy|_bAR;_nu63O>^(_c@Po_E*gKZe&KTc{W8_JbsoRdXk5bwrM%5_0*AF9_4dBIx z8jL#kJLVc2f~8w6j#~A*@Z<7tJ+53wyf2~wXB{EF{Nxkv+E47bwUL)0ana8v>@k!$ zEu|T|93xJzZN-T;#HVC!II*^$@Sif~3x0n{_Q`8&(6zI_u!DXbW=zo#9HZKRY}`P> z%;zJXGZ`TGW&0MUbeFtyG|nxs^jG_l{jy1J7%>} zUcPU?;PRnlmmgb$Lx0y2{=;9^;?XIZg0}|MV@97rf@?HC;{JoAG3(KYzbO#gZ2yc0 zH<3oIunB8)$gX>;1sk4|eZ`Ab?CD4L;P^JQ_&!L)jOAbOdFy|9eXqt$$H5}6pW|v# zUqMH(#*ca&RYG>v{07YaG+3nd-}njtGS(Iv2hGpeAWuBDtO?74DQ$gF3l3=~`;%?0 z82(vXq}}(l4gG(TA3xa_ynUVY@%L(QiZn#{+&Zfk-{ujoI9HEz8;S3nZos3}#AT(Q z@PZR@!at43)(#bE6Gu1U*4;xyUVm%1;6|hW^m(ngHk~xB{_WV~u&&T2@%!-mVST~I z4z;-CAL7wH8}LXW@rR`iI4+6!R^lhza*B9JOe0*h5_Fa7U-1V1Af9Hl_^|X;*kR;K_ht!u~Di6OQ;ucDIS2(J!BP zc5)N4m83C^ZN}vpMna#A{GNY7K6AEx#A`E$3;X+wPx$()vG5=Mp%Il!$(}UL5qqqR zL!Sx7mxaRAmCAds>7SHb0g!R6j=<)AalrQG{ zf_wR*)`B=3`Gk+3oUzBWj(DN(^tP4A~Tq-MCK$$rGI}5o=HN#_Dw9AqC6veNsGLY2ssF(h6L^jr{){;Ex0PkWcfs zcIY0OAoB7(JR5^95y!~Q!*iF3Bd$B4*|h}p<<~WL%pwdKmVgB^es1tASDY)KAYw3E z>yE1{i20wUqrNY3zeq2PDI{K(yBzI~CSdlLL7;lW4@b2npyDe{SgH|#iqVwU-MRqu zI!J6i#SZhfCW?G-s@h{xK$2kdw+>i3CP~C>Gt>zS^AiQ{n7j}#2PcVm?p=4m)J?>W zd)-m0PZain^E^@VA&y$^gE#h&#-nOE2Iwc@2t`fUJ7gu=1twtypC`@j=8tYC$p5#d z05oqV{_w^Qr&mxsA4+HAj_2n^40e+o&}G_r5$D#y^D*`};%V=lvA&A(dZg!qa{|wc zc-H>81Xp(@&dBh<^9ISnt{mxu7Oi9twpxitT9feO8BK^TS%q6(QC?YJ)?kMxv1C32 zU$~@*d>xk0#Iw_hx9;b$Jxdm`^*QH&jhV?pGhJ^!Ufh@>>^~PdV_UZr-1LsG>ptX) zVNWTB$}BgWn@2opfCna6q=?umUA)oy6xsV-^F{f*6kK;s6ZDn*Fjyj=cKcUh;2Fwy z?6x%+w3GN1?*)x~lPdDPaLEoIsaz23ooJ7_Mi)eEcjFweu8}muvK?{Jp;Te_J>!h> z6~uB@i_vUCDyp>ofBw`Bhn1vacC#kzeBp_q4^na6Sw4sL+6xtOQc*66kE!X>Xvd5DH$etYFfI5C;w>5IY9}9_#{1&46JBs;vk_(15kzIGaJ6dKE z8^w6yqFTCkwFEDWY9M`f&T>?^Oqv~4e%OB+@iLE9_&l5R?ezhuzm{U?wbl+peq9!^ z1@xMO9ZNDq%&Gj@&wO`Tuw~Z;C~F~2=YD?QHWF9qyWsWyq@NtH1cSGc{fC|>u6;vk z<;VG8>mJe=yjhO<(PZzs)em(Rl0JU?Dtz*YSk}A-W7~+QuA7baepf_nHs9uAw89k; z&mOe}s9sB4xxyKDpCFDM?Sf%HGK9W0!VUB8Q`&DsJaAkoaiXO+&Nd;wb=4OQ9+CdC zydNqWWQw$or&eLv0rKg3WHuJcUlsP_FXy50pTx2oj`(c|@#0ixY|puc=>w^~%KEPx|8l&rIRxlC~ozUCt6Q zc#K+r2IGm*(-}MZX9-P}oeTCGnJu`>CO5pIPa2mlo~ZkaeAb@zLZi{7H~H5WXAB@s z!9G`vdYLW!Kgi_o`k~i^p9jA@Ftv&7a`-`lH{ESR9zJ8yuU<>fo)H%e`zobgQLqi; z_V>}vQlTcXp-+RP@Hers*9R$COF^W);9ntW^&|V)`ckQM8S$GDk0q8xoH6OUv}R!s z;q$m{o8;4*San&8^r$QG!EZH^Mt9=pe}9llREQ@Wt&l2}h|?OMOE2Vz?^P8`c}?Vh z`lv_J&Yom%U(w0W6C+mY`$g)XNL)ALv-EMCqKM(Zxf-Blh%r zFI6f3CSn+W=cTl>j_ggW()4`Yb)?^H?tam3T*UrTXj#M%C3QjQU^@h+KkwSahG#eK=v zn>eTTp7hR>xUE1g-)w}Eh<|p>FX_=#V*mSX(t&}*J(F9ctO3N%GwP(sp~NljAEfvp z#Bt#jQtA)#x$Hx^Bnu(CSML(Z?Kk4TydO&1Eu`7xDwiMLU0LL7JnENpa0s#6^fu`q z72^5FTcl(CiOo`KB)vhze$LgBN+05GQ(sA^dJzY%dM>5@OL?8kFP8eY5QoMUN;Bq@ zrsA*f(sB(Ik?$_kHp!}*?9Iy?C7nd#`m_e=dSB8km{Bbmbt4|oRv{@3CEnBWOnNbp zIDhP8NhVKhwd9fXvXuNdN$t|6C1fu+@>$ybnfUGRwNg_N@xZ#bQezE)9A-^7`F>!c9Fo+4(qP46YWzQo<->j{Yq|HH^Ek69Ud?kc{n`SjY)efZ>)-cfwem%rs--}v}HdJ2v`@v`|p`N0!k`KuSd`QLx`$shgbXK^U=CG9isx$NXC9{0f) ze*9f;zUjZL2jkdL?+?DPy8P5PzwA|&xBTdDU$sHcyZ&R(vH$bs<#Cp2|I7z8gT)AQc+%71&7S=Pse=eXjL4*FL%UmcKgt$t&LY)z3cl2@l1w@Bc;b-3yC<`oph! zdgJvExaVVk{%tt+waSyuy!z%peC(fp>C(46=o`69=>7Z~{`Io2F5LL$ue{>PAN-lc z>_h0-%O3TZA9%^hjd%U;KYipo@BPECUiNVu`@X0C){p&__x81WzOniCANcV%|Io!a z_Q3}(ec!*`RC;3VBj0z|=RWcE|4G-eS-SZAGnSrkrgpXalGi-vNspv+x%aoe^~Pr$ zIl1_vhdus_FMr2RTz@H!z3UUd`cGl@n?Liz@7#FVH|~AXf6(V%`nZ!5>aY9IiU0V-r|H<;pZ=lp zFK17F`D@>M(>srT;DaCD#`7@V?uRVUrFaFpYUh{Krz5G!>j^&W~>sNkSc~S1GuYKmP{q-+C z_dS328TyR#KmWteyKeD4U(sIk>o0%M-OkmIz_E8e`mtYpPHy4dpL*^`UUAPm@=G|B zdEp~&diYxwzxe6vUvlEd)Sv(6>q(a1xa9XXU$*$#+9%&tdc}*s_hr9F$BupH!(Y4o z-e35;5B<##|KmUX?vMX6>G-!VKg6pou05~(v*rKxH}CoJ&y#$ATl?lauUvZV>UTZo zxgYr4|I)6YbGh?2<6+%j55Tckec|0tc*cn@EZy=u{*Qg|!>hkZ^7!fpPrdcJ6L0vJ z$9?T%Z+Pz)p7@ z`Ul}q=IQ_N*4KV%@zNLG_NU&5{`|jv>!;}8qp$w!4}9&RZ~Ej*-}J(lezEq3kj`cP z?{2&4vk(3H6)!aY^e4_g_mAI8*Y+cCxauWe^FDgdxBstSzx$deKkY#e$Fa;!Kk{ck zU3|vhzW>|b@uBw>f9N<_nV0?B_N|Xwy6z``@Zt}>cdj}+ zb+m3gao6I_FRwlDNAG>>XFu@5>*?6P9RI{)H;~yuXx%Oul`4Rzkho0=6}BB z=KuRlI+q*rf7GD&yZnPIZ@B8jcf9Yi|M-)8?)~ArZ>Q(|$Me7bjTh(6t~}$*zx12h z)BgLno{eKaxbR(<9GSo2Y~$Y7yz!y$Yh6muyZZ4j&;7w8j~Cv1`s{aPp7Q(^I`;Pe z{N()KEFHhO^(^N-Kfie5<+Qd=yx{zc-sU|)|NV!bdEY-@rv5YzWv+d~+s?kf@PtdU zpZV3-f9AP!AE$GEQ2Dpke|7$kZhgr=o_^Jh|M;!v(EI)Rdw=2Xhn{=byWjhshko&r zwI@7=j{WRw7e9M``J<~Z|LSe8aliis&!KzzpAUJ_+n?#Z{X4IG>e`R4eEbQodlHU) z$FqOr%a{F+-_5-@d*ypR_fH=?N_Oq7tDSa{sZ#(!LK_hbL!im%eS{O^DGy&o`^p7hEi^`Cs_pIq{- z@2BVe^Yia{;)_ofZ~L96%{}g0ultonx?b-`8$a=L%P+t7!#{h&&wTVv->TB{7LL8~ z0~gJ|zMl+~3mx8lF*?jJicgkW$2dEN8Ii=vZZGEtltbaGDpZ!=zZO>)pGT8B@k~O>BM?2 z3@gF~iawFvhYsyHRUFG)K?-{!tOl9O@q^c@*KxZ}w6;!>d?xl;bYrviy1za8jlCLg z)um$V;%)oaF>$By7UGfIiwP-P*2@`=Qt*nNW9XV=D%!fL*tTMsnxaWjw&So3;ug?8 zM`sX=o_v@-)NHZZ)U_@>qh*3)JJgJ}X`%AT?PaYN_L}a?9%lSP(CQm;dc7tTvaN^3 z%JyP4HlRgMH(VRvELF+s1%nKzW~i#;z?MqU=}+Ulg-(+JC7oMroUBgJmhFJwGOB!a`s$n~-Zc5RxyK&+|!^pFu$Z4(a zR~vVP^{ut?R#2$GHKDD#Pa9gSgnqNjhSEkXj_tOhnao``CRTLDwBb5jcCR*g{;5h3 z>p{1xR?Heg4-D1RY{#~2DSB`gr<~{k`Kk+*@LaZ1+w@uZxEo#W`F`&DK*D!zJx{Ka z1{Ym-HO*z=C#E6}8v2b(E(AwoFyZUAMmqrf4c&5d&0yglXyM^%5i7e zjuE{BKu&NylRa;7lIYkj|{diChy;h?cZk3yoc0JKCog@9UA z=33hcS8W&9t8n%&cr54#c{=7o)|pjj?un@zv8 zxdpsUBXi^!{t)9W+HjWJ%ax6iU*A{`H(Heh6&4?j@H#P;YHhm~2(VD0+S=NY4}K)x zxX^yb1QsKnPQ}Z|?)S0ydxS#DZ8vuUogPnrc?`Z%-~GDl1Q17*HR;nD;(W!iWA2t90RCd`xR1ZCmH=S$Pp@zK&0}3ZKlz%c=74lt zch(it^|D1pG0dW70=!}xS<5ImUZI#TDA|I0!!>xHYp%UkC~f;n+p;4aNdZ6#kP}^S zA_uAmubwGay|5AvfThDS>%syE++Od>qji&cz>W`E_U}9%_!ZK-iCC}>>VRb5h6zsT z6KAXnk;e_}#W}3`jWgNOW*IP5+7HsUXhlWclZxJ!<|?|O%Son$IQazeKs#sqtS1Rf zoiX_rQskcxsgjp3H)?*fwAn!?cZ2KlhGmfgI4=HI9a~P~_FT6DkaZ%&Q=@GV`Zhkp z!A56H5k^YmYr0twm2cfP6vZ**U|^ottqok39mTw zuR6|YRTFE{uWXe>P}dnSyy+~Jkb{hmpebi!UBrI!QO?1s1 zM1XzRYKm#8S<7JvY~E9Zs3WG)`@kl&p~3{e7YWx?ST9*1L9f{#Ah+n3f;l>i#@vaZ)vWuK zW9|PL;n2fBsw>e-F-_ZcEkhEo5z$;H*T5^~xL>Pn9~0j@ ztAvDds&FS5ZP71sRJ`rJE4p7A*v_YLUQFc0bX}}PK(1{Q=t@V9r_Q@pABZ~MwS>8b zK@g7z;QKHHHp501x()_o_;-c_Se|K1B4qnpT(!6jjLQ>^Te}+EQhM94(Pu6M{=cC$ z&x-sd@V>!WGBr7fP`1%*qx%?UAlF7auD}rjNN7TGDNyS^LM|@G5ssPmDs;Zo@ zhHc*Avw0TCT`85LxtPv?!F_TDtFz`EUd_`j9oa-n(qJvtyu+w@t{6?}8X87Z+7_p; z+0UDjpOI?yRhUyF4*QBLYwD_2tx(P%rr1agtIDa^QL6;ia7yr#5icjRxC+$ z*lhC-pUtxsvq-u%rmfeniTPT^sZ)N*EX`l6CNN!RsyKKMrvfr9c?iYF=dXOvL~louM$on6q6|%655CHo&n} z6EnjkHH))1IVNwC31E7or7r!p4c(B_ug3b#`aPj&sY}0IRW}%?&z{57JqJs1b%W~& z6W6>+=2_Wu==B^5Q5_frN~#J}HfIASuHTez$=2)s_UNOs4>B>hU9?5Nu?0}9im5}K z4Peci&YtdQwik7}D~he!hMd|dXFv~M29!EIN%O$ds_42R36;W{cPKSa*gONtch}Yx zj-YwBoziY=MK;fX?K5nZS=_ky?$J}zJYn-diVm00aOLD~c(*--yR8#dx^>kuXo$ER z^crj4A=Et26O2Zx>jD+5+H&%FTnQXgC6IB!J^5;2Dj!mm_qIhAg6$UH} z9r36S+5)OyH9-9*Me}~@FpZvnNXN=9hv7!%$Wz4jR;urlvtDi1%hl7F2jbbc`IT0X zp*O<8m3kP(C-^m!rEfRjE8;xKHX1>*F}EBvHiO2Tx9QjYQZuMG=57gsS|yk(`lVow z&Z04Q+^^NPkBRS`_3p`fXS0B2(^M!O2_RErZp;aJ26x?<_#*5XM4mxTXr2m$HpcT9 zx|}$i>xui==3E$7x-9c$Fu-(ZhiN9u%$Bv+vc~!ioCc`kbgt@fw2x)d#n?8tJei)> zY@&IVqN8bB4(l*mR<^7Y)^F3oycZOYq(pXHJ34%|qr|eh3dmm#W_y`@v~)4{Oyco0XNBhF1=0>Pe{S@R}tSvkWmGW;I62&e*UXu5?AzrmWvnl~M9GSNI8 z-4rNna_*fqZ%Ud6x+&Ui(G+fIj&909+A->6TvJ&Ybux(=L!KFRvD?6+Di+fCoWW;Q z;8bd(o@3?7Cp8tz1_+;h(#dD=IU0(hp}g=6Fp1if>JYc2eX14efLcZC0xX=|QkXf~0^FqnrmZ%UeHnIfMDFOOz>8*-Wwc(*--yR98%RaC{+bb4?; zkMnuc$>(JaVe@pwwk+Fq+2-+XJEh&$GpJETQ*4Z1a9o$$`dRa)qU3SQB33^nf%EggE56!eei4mTyU&6}Lf+o5?yp?S!B zo0L{z5^uJ76SR4G!^{JyZ@C8OKa4C;gf#Tpbu3JzGdQclS(S-pRZ=z2#2i@5l{Au$ z@q~v1Pq;(#%*f`MmaSX1rZAq6{k+Nfd8wL*z7fOH6y9xF^QNtNV7=B6;yBoe6v(VE9MPC0UD<68VNZ#tUiDu^qP&%+2h zP?sBy99+Wh#ym&&$5lTVU(5cT#{<7I1%Ll?e45v)*D=X#N}niY1l`5B%u|IsF|w_} zgYIf||6EwFY|Jf>FG=3*NMvo3U}kV(EgcGCN`x9Xn_PONxKVaacn!^GOz zieq|OPE(3XL3KdQfE1DGATO?Iikx`j3{IYs7#XCB1PAkC<7Aan8U3a*MwC4$I&>S8 z)8%9`rX%|+9stcc5mti?RUEVRy1(7X5GgsbL@V|1;3gABlsyu|Xjwzgq?AJJbYwrX ztnO*ZT>!M!JL<$@8exL-FoK64Ju@2l1KL{OY zc;Qy95;TL2vG4sI9iWYX-HSmohN=1LRx_-Z{mOFCX!xgtYze=nsahUf!chrQ0p`cC zd7pv$U52j{$U!8I2Y%0d8@^VX^;W5w942r0YJBCltNvEGMDF~$a9zBx+VsoSpe`Kd zEAf=MXx-0sJrzgWMppcUZ;1~yU>ao}ukE!n%dJMabX!?}qb4z91)5-b(+X%;}yB1cm<9ZYY5&nd;xd>&3Xu>hCim(_D+QrC?M!SpfPXtL2pgP|#|W@(Zl8ct`>Lg;uw1G<^1sjL=~ppn;> z^BbwIrW(nfc)yU;K%rQQoncoq+Gm9ZjGzQJ;UUXs(3iYLd<9Ui+9^j11;F zu+_Gz0~aMHn^DDiCyoaFa0)ST`Ro9DOc+*r_ZS@7vB%(TyO!6Cc^QLC9z+}klDw-p zmh0e~l$Fnt7i!t9nFAXB!6k2JwJb^AHVjQwY(q|3i6t*V@;N&v);zeMAbnE~JckUt zu=aEV4!s@DTc%izKqM=+X_|6YBg>@QD=Mf_zoU-YJ~FVXob(G@$WbliaJd&vGYhEj zf%qM9v0_0++i@&Slhjl=%f|jD*o@u~I3I@fTS7`& z9xqo>Z$yX*hEHqfg-ygnvX?S4xGRtW6ZyL79E}2+Hf1#vgOf zY|eEa_pMjeax3f0;n@I{{mnE5bMj8K{vA~X@vkk11oLj3xKJ>vkv{@oYjwZcxFf7@ zQE{(OLGLFOc(27@;?j7wx-BYq$5yd|DuMVpD!8u~E1}=)O1@lO!DyRWoCP#Neu(0x98gZA;XjZj@p=v`0 z>XA9a2p055tBxsW76#W%chvYV;Ic**{$MXw1HHHTa=5WnKE0XhJzJ_*P!!bWEeEAD zWSgbfF)pA&bn#=@0%`$o&@29adhqokYNv3Z(I%l8$Op?w26GQS$zLQxMpcA`6h&C2 zKx(aCK7Bf30P<8Pmj@T##HTi zijg7s`)Z}U5!_y`Lfz^c>EL&_sOzL@hN38jfnGEz8{CeNiq2r-rB8;xx5-_n2};C< zCcG&X?R6H$_sYpkbBzsTTx}RX#+dX)q0lkXGiEx|YHWRwfa@60DrzjYsT%aN6tg)U z_MDlOeVT{1b{{OA-GDI|FM&kFcuEvnElF&R(@}s9SYXB$e_DbF?ElMt6$GvKkrmJj zQC2`VO_~Po%E?1F;U^_%!D(g%W=soGw}Ac2?8PFu8;GyfwN=}(EjhTc^RW_eYKS-n z4-!XkTGS@8k~sqYq2qFAS`yGiPqiE!4u_WYFi{g3YQW$%OqkQ;xF0);tz?PT!WI#Q zW{w=iFMTwT4(@%@r!W`sfHB*U1`Z6Q!pBtsiUxedkdudG0~ger+Zi(N2hG5ZgeS=Y zhmXV*cyJZV1s$%O?RAHVqZH^#W@We#`SwQ&<(w##BR|dn>ADzbg$ms6Qy1sF*I7Vzp`tc^&hoD1uf4X@Q) zErIVW4RV9dPYO0vB=f@IArlQG-1vs-m9^7YIhV}NKQVO?%wXkCu(kw#Oj1<8&fx*&c0Y9gM!0OcZ7=Z;d zD5j7N=zFAf8mw0RS`BIZ)k>J!X<)Rgh$`yJ;2d`3Y&tDmF=f?-Yf8Nwr?QnwcrHHq zvFGwT$~I$L&OGj2ulJEM^09lWtfdqTk>hk6FdE4kCC|Ifcy^m%eGXk0brxj0Eeku1 zq@nVx1>@0zKFvTkmZ&}XRn_5axT+~B_+$kbj{@u&g{C$eb#Dh41yU5jhhYO#sOWNn zkMr2aghRlHl7m)oO^bK#15vWW204~Th!VkmXRE55K7d^uXp={j90D(NpMEpXE~sR7 z6pRIQ2;fsX(qOJIa@l*d_ zno^{A@pt3IlWGF7hwzXo+=TXHSgW5#mbT=#s-?}9dKtsp8jX0%2Y4}8EVzng>u%O@ zvJ}=q9UMgk5vUY};0k6;K1xb(0du829jDi8a*AQS6nL#uiA%YMeqpGcBZ+2sT3bzL z`=(_yLr9sloZ-#}G?77!EsUcno&|zoJ?j=cFS0P24w@pzkmO+Q${BKh*nr@LT*}fX zwx@E5CR!pJ6V}&n%`WEGyA#HWleK7jLF&*k9o>?HnA|-!VX?vKBgk`r^ii7lN$~k{ zBU`H>j})){Zt=(NreoUxO)HY-4DJHVu5O0s7_tIpLjif6TgFh=E=|Z>3eD)?-ZDc; z-u7%uP@kYB6n0;iQ!bz&Lj)T5Uku8ap)EPJU)MhyfSLm1K=vk$%Zs@W)W)P(iXtiY z-?bzsLK-)-?%0sBFDRH<1~LkQ5u%07l2g8&j_hYPqn|2!A|m-lRm=*wnuQ3!v|LAy zBgk6N@q;1Aj$<@n5@1*@P#r5TJP%-pz=WpCp(2{H7Ig0NjBN;mXhGgE^A_kbT*Jy2 z3wePl(Oe6oe=u!IiVrenEtuIIA+6v9>hg*gma8k}(wSB*EhXgS#D1UwxNK`clgWue zc4q|XjDw9^Yh%v~vHW*rggf##K&9i@awdSW{K*T59!c0Tpf51$`qv$rqAdqk$nuY+ zKfEtEr2H*Yu)FJ+o8@5ms2o;YmcMNIgF#6rkSWXmpb|HxMFE2hPSZ@ZHKUbCP9|~( zjml+M4U`#dc&&OJ1GD?i5H41mx|X5AN1_!*q%?7C$LPcR(^5NvuVkY=1mWNyil9?; z=$ewY0#*dl&!kF9za)w}9gnc>5om}8OaPMEBRr@(!e}0$23}22NlTgu%^o4G{OBQR z{p+f0Tbjukp@X{q=b=8mHKKjmied4ygcGt<9jFAylv5bkfe+>}men9L;LblpTd}DE zivT==3LXpeoyo}q?t%rMVq7Q|aTgkJKXl-bd%hP{g*8jjRb8>z=Q~6;zfC0pCNt!J z992>Zm~DRK>1B?H4NRSa`L_`|Iy_?=opo5`Z{d-qA|pBEaH`sG%svA81#;Tow1Dns2hL= zx@>fx@CI-|XSSueeudMg*JJ#!)l{h$K1D*r=A;>5;F5{bxV?s6?B(rrGo zsN#jR4TjnqQ^zxPi{Hyfn+xW0Dd=yMge>0yC*ko-WC(^e0)v}>$Ik1Df@&hj2ORt) z#{#hVmty`C=hCrE70#s`Dl<0!Lioe3`2t?u8(;L(X6h9pIeWM*QIV#IS``|7cS7%)B+&JJV$4} z!JVdYRJR|-C{6x?plmk*Nq0c#8lWB{Y#|6pO#C9pA)NAV&{<^c6KG0NDd>us6QC1| za0iAir}DsBFrF5ZJxxJOBn1}I6!xpwB~V=hRM*H2N^uF6u?2{&;38}Vv&4S&?bm)! zA=%t7$HfV0c;Qy95;P}C>@{OHZba?Y0ILDbuB5pwGppS%dB+tw)^4oo_9M9$12zea zsNE)TW3KB+;*OeG?S9gVmro?hw!7m$Pg}bIkwLOT4k~hHwfkQ`b2)2wY`F1%veKum z-5`6Reh>D$1z2h>Tiq6n5yw``)zg(g{JbjAQ|rY_=r_AKCCDa=W4l=;{`pgPvvywq z+KpaDM3t(Xa>LBp?w3F0!>rvGf_Ceur-Q7GZTC2Bcjjq-#M*r!Xt!Zopdyq5MV?vP z%^AT9BHwMA7{6ts<%(_hIBoZhU$!{kJqFvIhVWe23>(cAa7d@t^zDc?M72Q~r@N*i zC!pMo@MPK$sKWq#M1xB{t6+)9@@&N@NyQ2F*`b?o?^PI7L>%9?5I!YjcB##Q;1T&vj(t7$cR zuNVnlS1>&ibP*Q{TgZf3MrT&~^C=5{A6B@WV$q;F)xxA03=Uz2pzRC|Od}NO34bft zkqEwkr-i2#e2bNGZS`EaS=wA*3QmV<3*YvlE*?y(Gc51~$SH~4i<>Phemtr!vQ#wk zcmPDpHlEy}hb95$aA=1B2^ZQ`n4x`@+k^-4C9lIB>-8u+|5PP)DqSucDVK^7M4+5h zjJ05>QZ}NL&mgmm~Wf^aE2^?bBm8 zm@&7tkYZQ*>OaZa7_7Xm8mfsNR9P$++n2+3tQD@I^m6nG=&IT zH9(G$gO!u0I^K;qrsa8}wRI|}kAJ=e8JQ#_KyJ?MenaHM;4MwE(}lnh?V%m|7#c z4j3w?tvhn|FfNZ`g^NcL3=IghKaN-T`Y&Q5$W_A986>u%p7%7XZ=+HYhsT3@3lk9SQbJ*TraE%+iw+nzQ^zm;d0KKXt~E<#%0h z9)Vh2j_i5!k7YmX${$?v7?>#L=V79b=D_gFiS$_Vqe^}>n{Pq%j-^RTT(QlMrQcO7 z7|`t>V&%6dXWEWqJDOw4DKPQMk7Yls%^z;%cYFJoswN2)%PT*Y{_rb*MERSxrs{?( zhtP`Ue?iFKG+a4ZUY7rbAb$n+Urw%%Ch?dt8w%5+f{$7Tw3+d2J6{+-QUItv!-9h2s@GF zz7kJ~liXcT#nCb03Wsz3;zY0ExPX{ymYn6!reElR_%_|puOole1g_NLLQnmGj?tWl z_VjK5xs~!nNHOVaS6S(eF=cGAfyfS`kJ`_VSa83hI9$xp=p;xCxPWp{L&4$X-;JHr9mC}U>fw^Vlgk!q_eYzQ0l(jo zGZB{UzbyNoEow0PU>8Mqyk=^Qoed7x`tQge6?8{q?CgP+|8ba*-nhTdW_izP(~3KY z04&#(1EBvDEdXDrPyWR_X?OwpaGD~4mCJ}*bf z&UY)><@hDSmrh;@2pJTU0G_Otf_%9#8NHj?1jjt?V6TDOC$Z_-1%VKAHSnf8vWO?A zmDs#rk~)|%i&IFE{D~EB*{}MigZkbGajj_PD7j_1mT6gW_=ZFpjL9SuD7)~k&@4#Enf%UD2H9&eUGC-KugEkd|TT~8oi^{NC5N|`K zZtI2uPAb}-r_M&j+fWCYiTmH#CI_su48IM<*1#}S)zI-ziXKdP8|s83908Hq(IfHG zr>1&s4@lJ=*TQ&qTaF2uvg&p2Gpk;tc*CpSppyzU4|D1WVr=TJW7?8NO7o<`5v)NS=np^%uqE)Gr?*mCs<@) z4%Tz~F>KT}ocyh#6H%C}stRBZGg}I=|OR+J& zidM(eO9wo_NCuMb7#yIxIWDe>^-=!4b28> z1?g0@=F0H^cYxPOAQS4#?Ch&ECiTS>sjsz~VZH2Ez--q5gbldRu%5Q`y+SlN+f@~? zS=o|iTI|~X7aJ$5nIlJWVSO;#9r`J}X=c9}Zm(9jpQuf(jVGj#`=~Cl|pgFscd+SA?*mECh@{hN`QQU^ct55UZQvxv^&< zIv|@F^8(YV(EHOv=|w>gqneni>3}0dP7J^(lz80_58xh7{wP32C4f-R?Wp4Y#u^`FS! zaCL(wtg-z+R1=kA`w#rF4F(lS%wW9!Wv%~?{B;c2)g+DBWBHFR{{c$?-J`WE%|YT9 zG)j)^8bG36ASHmw(*w>}3MdVTveIg7uGT7;^Shq&8$lWf34;`E62FZ`6k!FV_yBid z30zFefbfS`;tK?NO&>&h*-BVF9bLjCrflY(UH6i*+l(p1JZ@tzFnOPutC|rhgK8+~ z@OCBHg1d3zi8Aoa)$u@-(mGZ8VcA1qKrDNjs@jfXsgh=JGf+*g7O0*jxE4)CcN7ye zds23ZDQm%@suu0vvj~I;VConpu+yyB*aD8__{zI@+#%6< zWm>&+e+vd?a+P8o16|kP>(u3d?swr_c+C$e{VX)6H?r|I!%|rBn?d39>9jc4C8Q%3 zzG~^VVY-rFZlA!Ji_nIqAkh9fadV%nup>wDabxW0nOW~>9`~tNyY^wC&ncEeh6PmQ z3ZS%-X6)|RRVFxMb7q<7({`2pQ55lzEd>BNQwO7m6u+3W=vcPxM`H5^+*d}Gzh#*& zhU~EX4_6hnJ!DT&b=8La<+Rc8`j1!t@KHqpZ_&H+_md;l3Q-pgad;>;@?%mgz?8FN zo!E`8cE&lK2GIgjF))clG37*;tOb+Hl=s8zr5DTsg#w5N;0-7ru$p?5&G?@;d8q2nIQ;z&O9{|bGW7wrXtUsu`kv|Ap57pHbN$jrd z35;h0Sbzrgu75$YvF~KMSPxvq)-6S`wUksOi+lu;r&YjLtA4FkMr(E@OdV^JH=>me zuiw%g$B_euY2m7q3OMEYPh~5W@LYWInIlJWY>b%r&Z?TR?LLiMV1VI9CVV~>PzX6% zz{8E8<|G zOvM(AGLCJbRT#W-Qnq}K^v09+8;Mj}*A&dSmBlQ`q|(Cb4{P*CDE`3&2mpd>q9slP zt-KTyuq*4!#lHcwzVj*j{yx}8JEvtS#z!k89vyPFTAgqIE?9Is6ezu~xfo{%#Iv0A zJ{SDOjxW9qyX_Ar|CmeEv<&pXYm&YH89}@>au{RYz;=Y25Fh!K5{@9Bu2EdnyO>GsAZ~hECT0%#$yDA zR08lJ2yS5=#a>WuN#d7hCAct@z_O7GLeXDJDu|Wff=~j~1pos?GaM^HSUa%O#zx!@ zOa)!h)R)FeaDbH{Eley{!mz&BSn|*MX&j8PKj0uiq#C*fF9uN*E|Ey_<;s6zc(U5G*@d8=?qsxDUs&Jubxl|!CF>u&29aRqa zdsl^stHJ};2GdNy{+(b-HYX}Xx`O~fa}_zAVE1ALh$JyFFwfTf0CqIccJ8S;RkRs7 zrma}IB1tScmKuKBjwEa<&+*LstE*a%t5+ z8we{Pw%gbqOc#~Vr4XPY&@DM0C+`Na^oQ>|8+|uG5z3N-LuL6-M*jQ999b(T2(WB0 z5159o%1JwL%#kqbks@5cgnMbp4R13jomspi;y5_&H*RTF(~{euyQ1(`Q$hc&xQ?XB zV$(@(&n(qmn*4WCoeAtqs{G9;y`d_K4$zY-hw*Axa;s3C4CUR-wz>}IXvFYW7kMqk z(HwR(>xXLyOq=h{bu<H>BIhlIE!PM`{i3woa!=Ttwy5SKJl&==>O7E#}7Ci-6u)v%-hotX2E zY|L1akMnq=-aTQTHrRLs2*__R6%d4XQgndZU`Yq?7-!mf|Fo0SCOviF392B!mV)y>3~3op*Mhp^wb5=#dYQ60(b+Ul|PmZU|7~W6GbP(L=&78>(8urBUt{SMeZ7= zZJUyaj#=a*h&(Om8-V4`)?w`pTa!~{VwO9y_Tn+Dvv)mS-RtJB-UrKF7BmN-ya2-) zX1}AML5h*z;o{R7Fv}fo!knnnoD1ufjk#sN*68{@b1DAb`EzDOf-|(WqOU~`v*oU8 zAGGyc=EzZT14{LBtvQ#iZr|otTEVeZu(ehK@pCloY&{o-l?-tsiGw0VM~8N#=e;3 zL(0Eh>c#vD9o#ks%m0ws|5*OEts=oIsk+1KKVJRgP44gCVG=`qRM&7+@L9+S_gVh( z`<)4Q36p4YIkk2%2u`Q5fU8`<9c9-+Q+vT>9`$CYr5AIyP%c%m9UC*$6gdq91f8ZY@u1yp#%XN# zZ|sQW;_9x6;;$md@#jThfBo;evAR)__SU~z^SSNEHukE$| zeRdEUj-#0>Mk-2)FLuC-d64GdgEZ4jKtFr}x)s%!bekq>nv%K-cy7vg*8k92kc+ec zjv(AXw3A9P0#nw4nFXAug_;6za9dbuZ3Q{Mks1wv#g0NvG@3YuqiB-aNzY>o6MG@? zd0dXK=%go4Fh!#r#SmY=8Jw(^f_%9#8BVL2)w{G|&MWnx5mcMG@XoXV)C06ZQ1xSi z8yKxrImyk!k+#ZR1Qj65hfyuHpqe>y6hF_cPN2i(3i^;{u(jC8p7qNW(z6ME8u8CZ zpSI?ondo)V&6}aTM+ecw50F5>rlc zjknVSTQn@enDz$q-e$S7vF?TC>T1(3oeApe3xyNww`Ffx%;uH~JO1FUd)c-1TeFM# zbz5;vPs?cvO|IzLa&=7>f#^@++Ju*ftyg$?;*x6qx$4cqb|Z7-yKy+)dGp%|(fhHk zpT$12UamHEO|+Ma-^F{0pOV}ieS+8ltIgyX4s|}Bo{%J5X3TaC2RuVGC?WwD<8(nZ z?8?aran+I3GB7b0xT*q+b6dhUqvGlv_(^TZ|u0R0oME9h7$S61-K+7LXy+`%rwvrat)tj%8T>bQhw>bl1NV^`5J)t(Yp91?AKq zS^lx~r@j6Y`J0%btAS&d*Z%$Yw12EcSZ`kzvtu3=1RNdcKZrWe zrmZ`2yk)NTbUcPp?7%<(YINv|!GGA35i6rhPs+-l<(+w7ap<1y>BXXMshEdD&MOcs z2wGgnQ6y2NvN(Fg0Rlq|ECZ~JSI3yg6}zx>yZqKxY(A~hiL*N=Zu*g<__*HuKhp?T zHhKx9`=AZS%Fg8hI@0sHXBJf_ic4+PvcMl8#rW>P^-o2y=tE`*f|gdm-@kz@o(yCv z@J!L!Atz(BDVV zQNedmzB8c#a=?c>tUq^k4c^r?WJb!-4VN-fs%hv7=tJee>d!-M6Q`0pIS$fX+CisM zxh6o)P&m^uQ8d;h@s#pZDy+C9uo}?S7+T~O00PoR(X+@$5P90}GQc1*%hePEgUIAK zmpq6Jl8+wKTJoB13qE3tKq4w;l1ND@@REnrr!I2j5DXxKmI6Mhte6 zsWXNhOI!K*u+42)^P8p3^!{JNh3zN!fTn?f+*Re|{+Je;Y`*|d#GAmdS^qRe=m$oo zx!EExq?+PdrmjO5q$B~RyamiGJ?9`=(A`y20FYQ{0jzSZ={ITQHbw01yD6UUIa6U4x0b2K^|4UN8%y=^1kgfiRU+A7Dio zn<9(~22)JaGQoc!Wm{k{SR5jB{FVXnpJ_WnKYoF0TSXBp8n$ZNmL*34rtBSZi~v^Q zZrUgerxcW74hD#57*)zKLj4eWhsY2JfT&LW{+1$XU_CnpV{;19Hif;s!)|k+6m797 zn1=0QalYJf#Pg2>a%eLpckTrkoB7DEG|CI>7s3iW&K!C_kAd$cW^Cmj4b{pKxA% z8-DTpYA#r-mrtLbFn0M-_^@KRT5fCx8^y4G&aZDQhi8K=4Bs9*VtQuFpYynhy{V7f z$~xW1<)E>ds&{szcdDhKXGWLQD1A3hT<9H5)T2rEYjwZcxFf7@t(CWeLdCB&2swW( z{?Z56Zm|;jO)*qe4E+;BRmHJn>L1=GbAS4l$=r2gV&`Wp5w?V@>(z#6c-H!ASUDTi z8w;)SMzG?aPPItcHYu8III8Q~Hn&h6)E2t54GHs?o8=N&g>0!A)^|@)%PP7UMxZ;U z<|vvaCoT4u(BWi5x&pr>dr@xt_HuRn-84J*hKcit&zQ-XPcb?BY(Q4Q6}3Atx~!aNcvlZ!q3WNi za1WozrJf7xm5n*fQf|z3e(z=dUr12_@$9x8zb&k^wo=^>%ZY}#V}7r#qc$Ta8Ou4b z@#Mtj)AXQOuAbSc07Vbf&lre=Qk-JAA~L~vI!vk43{8&z`DZxs!~r2gxY#&Z%^W$3 zpZbVIa$#8M3PdQMO^0^GAvo4$Vy8(oJ!8&C0r#^*VBp$jw;x< zFu%#hObuO;6T6*>?*ZK?a@|)q!*dgK-Dk|59!m0VA(|+RK`JH&LQ2XSPe<}QQ^hkh zv~SozO49}3j%ou>>!_etpcNrXaE;7E@FQ|XiG8~tejfzhbqSuIt!_sJJzCHY#aC?k zl0V>Bh6Abb1X9Cl0Vb*x1fJSd9gJL%|n&_U*rNo^zZ&ju(eE`=rF=fY}Q z_6uA>f`8b6+pF2SDW{&eD+e;+!u5=0zfxu2s@44{zn=3Osi+mVT}#%%BVieqCdd9y zIqd0}*%?!UVYdO8f59gJqFHbcgHB3{7rFKQ38V*B{)-4Ac7=iH=R<2+F1&MnDGZx6fchF~zFInUvyyeMQOn4m9W+*mns2TG)iaE z5=BK*xVD-KSd@w?lAJj-yOw`GXf*5L_5@nqXEv}IvT~?v@yG$)GC@Bo2QbM2^?@}z z!?_)pjZ3*aO~K3?N4HctUG}@|&M6|Q3N~)7O)zUbV+oZ}pj3I=q#D^u^;VEK>k zb`FzJGb68q24Jd&f`()%(&vO)b1rUSI<{J_o~{I91x78Q>;005%&bQ>=qR5=t93&$ z(PJ;ircGm%&&-N^xXsMSNA&?+buAS<+H#PWyqS%@nT;xc(;)eC4)vf?mZk;KOTp=I zDFAP6uGMU&L$5ts058#2hGD+CD`}9zz0m)pDoxmw=!A)KbpRC1HlF-Iyf|uk7Sv%l zlr&J&8bcuxkEBjPKQPK0UEze&?u(vqI5XoI0@|q}W`>r5#Yc+Q%-f96e(^0?0s}IX zjw*i;BP*b-W%)O^GlMcZTnOwoBg)?fvfFSZrD}QokG}p3c#B^ATR)VMy3y|Q15+uD z4U_{!;sy_y4IZjzi8eo5vuxFtH8hm1!01*WwP1_-L#wu0^Ur~5Ev;ayxwc6&V;zK< zU_9b^O^2*-7Wa248v1)2wEMFYctD-NG$&xMv9aA$HntTx0qF2^4D11NG~gWUpGY=P zGJvuKG%=~+wd!>-I;+o-NsHB{u63mwL`O}vLq|zQ_WtyZJ|&5^NadOLu26J9dWfxn zV7r=WNrG-p*&CeM(!&Cjx;G~1vnR%FkF2oK6NUDFIU|$KDT>IlNgJS;do5i z*`_PLy6tI&S!&ZpCc_1OJB z7JrX6&s=Yc{TliUy*~Bbue&ZP*NdH#&aNR&SnP?(`Oz8d!SH+~{?v2D;u`xu>3_#N zh)tQc{`e!4`?O2>ucD`ubXLPVnkP>^H|V0AragbPR4><>Ud3-T_Bv-WDfDXbq!qup zxr>O}3+utH(VOGBnamQtE`A!mb!X=3Npp#6H0IXA?c_INR}p8~dvKi+c3ln#UCF5> zztLO`n#Fp!1;hjtPN+!woE5s^r$j|1+lZdL*uZP|e#I5Sg8G$K5WhfB+2XbF&88E| zJdeI@;j8-+duAgY>(nK#>)l{>U+8Y`_IRD6w5_>@?kYmp+85Kl-K1wdVx=<^t{eR@ ztFGH|TwCuw?Q_(anTvL9O+iZ`Xp0>w=Cg_mNZfe(VJ&QxFbg+x3HI%}wR z)YuqQ0EER*0@adJ&|?*Vri({nrKVHPv!ik@dWtc0%&_J7Pn^h&rQfwn4JiLHm;kii zp|xCh@~&p1Yq$S)CnO6*1;wqR)S$oz&LgRMKLrq zL&?eDu?mc;0xsU5HyrfBaw=V~Yk3%0gOO;+**c0XiOGmz`H!)4kQ74#Y0eaLWK2>!$f4-NhBU}7;j6>v~{$c6*=C-O%Cs3Rtj zQw!jYVDyckkg^dh2Ti}SZxdn8!vISSDFDO5kUBXQV7g6&_e&gZ`e7nXgfj~myD3G_ z@?luNC8UPW;{YTC*;X@LSJS{do-LG3#h_GM(G^LQwk`lC7t@LZh({2_W4;mScg9|P z?%)qd%_hu2e`)(8f(>G59{aV-tUeF7Z?+X#Q+3ru>Qvz>>f!R668USk>6)sfNf+!l z!RWOg$(BA~6@8@rET&*_0j1C}08dU9?Nhh~Vm~8nC~q|YY&PqyE~qErOD}}}>jKWB zH&@e-i=Hb+UX!Nl4!|0U9I|9~(RW~A_rN$`2zoZ3qGtfsFNbG?<)E>d>X^HciUCxw zItl_oDdm8>apJ;|(Tb&^BWrcP+PEXEZ&909q2kvXvFuIIJQHM zZLsiNHzpehUHT05d8IkHg=(oD`lZdihmTkm8Z5w+s_Nw3$Wn+YcX@RJwi(lbG?0kE z7Vkujr&$JMg=}i~GaVImB3Dws4cCfcl*A)3Qv>?BX)3T&`a&VnRG?_)3P=&6JfOoI z;7iKpz$!4R3Z(4>w*-ELutM#cp|`scC!T+&DJDib+O8a+AcwlK^oOq%4=4Xzt{r{2 z;C+EFAjdUi`HwFD0k?o|_J;zPg+-MJJ^zY{N}-f3U`L{Z0);|#(sKyuQ@A;8KwslJ z+_c_Ahewi1^Dbak(2TfFo`q>BvP#e-XZjM48T0;!v-_?U$wk#v#{lo6oF&h8KUT`& z_k9O%(YqX%3i-6f=;VdaLGop)u=0i+G{7t`#(``jD0g+Tji!r1dA2Kw+kckDF`R9T zVUw=oXrRV(2MAZN7p14IfWA@7X-ZKk zm~NEUHysz&%u(ccF-+-+wKbk?Y#wja8|dv*_&2p^h?HYu9-^ZeaxB^`M;Hq!LJ_65 zwR-vV>7afeHF!JX>ayT#YN{qF19LvsPC}Ovh9WxQNu^#pJ{$o+vZZGEEO6z7Y0j4$ zlg{?ic0NPUkF?;XpN+waNa8dF{F*Qfk`#|O256(SjUi`5Wj_^Rj&9hJc)}PFR`s{a zrB(lIK*}&4ZAdc<{p37stvv_Ev|ZO!Y&rfS=R7VTEpQb{tU;^=}{AvsAf&VP$NL3|rF^O?n~dqc)-b>n2+3tLsNn5Pv9+xvi~8mfbmy(H3z za@ed*hAxiqDW1{87ku=cg3{G7X_u$?Lw_|lPJeN5#=AFOe z(9BrMb2Q7Zx#)g$6@_~o4yxrZq^$hDa$9V%DvsZnr{jbPJZMT2LMPM$id2ufRQ9YzAA4 zjqF*!T%l6i1V4=cCDEs?`DZ42T{E`9r5U(>NF=i8=oV@X?2=)+nw;QPzh4CjT!Z4lpv%?oGo>fXH2YEY^N&Am~0 zIkP?I+CfBM8Vp!xsYQ*9|F}y-*3ytv1t>ogJ+P z?iX4u2lrdXStq_4bu*ltWQ2Q|x3JiVDPVlZ#24Pe4r+q)=9GoL;%`(yVeN$*ffsI_ zDp&nxIZPe@WdOP-+7>}1X(2+B6QccPyzI$aA`fUKY?SGg#}D3k*_B;YqzB`pPTg9i zdo=;N@0s8iW*YVz~^!PB4xtuxP#=`FN7T3um;GnA_D|WqGf}GSx)Jm z4bXTD(0qykT4?$8jh!V3-LpNtSkx`>FBWt#FM|fo($R3^VrZ`v%kw!|mPd>>Yc*@F z=K4a=96Km!W&^lk?Tu<%c}fyuo)NV{NP-GY+1|`-_AX5e`XPbvoc3s7!*Y)1DQ7MLZ$k%m8yXzWVA*-_K_DPjP}4*vMvmvha0Uv6@OS{ePK4E9(1K=KZ}9$b z2G=m7t`<{QbfCZG>^lr+5TYMJ`hy~5+kK#_vQatiDg{XmaIQ3r(Pra874^s!oQHp|u1tF^G1W(8s#k!hP4<7?`2tiU_b=a=;S zJsdaTWU17uZR5PXO~3A!KsuW_atz1gF6jKW;6T5qozvG{w`-@VK7Ttk1M*QdVwb=O5b z_`-hC*)_xoi&!f;KRSawT1>CRpL(uXTx0(y{qJ}O(O^!fx%eZK`?RZF{VIAoNoO^@ zqj~bwbAwVdev#;TUoF+kwWfy_pvGS3O#HRyms$bTtSz+;|0-uYSwqW`Sa+_X(Q~u#GYAY z5gt`s{dK(?{q750zcss?KYgP|Vwn!X z7TOmGqFsFg0Mj-#UD9A&cA>|!e-7(N6^&?OnvFT-js<|66hE3BDY8&waikXUM!hC> z!QTpM6@R;M#~s-9cA|2-&8(*zL==cVYS%UZlVn^}J**wrs$iN)=x1YaFeW|H0yMl@ zs-*G|Zw%wH2SaN?yG6rB(Li%dT@EOLwO~A2u#mDV^w}fkL}XE>WvaxqBF8~EA8(J` zBSz8guHbf$Ap1h?5$h+#XJv)r(H`WeDzZE5nGR3NcaRl9&6%Qk$8aqTL!BKtWlIiG zV0Xr|8Kt=-{a6Gw8!3XV>6YW#lBU^wCcX`{6(RFG35K^$vWl$zT6rsIwC84xpHB)O z(D^vBu`>jh8Cui4NYiL;j;1M=9Ig*GIi#Co$%>>YLO-!ETwbyFIF_Lk?K4L~hcP44 z)&flhbPja6k|sw_IToJT_TfB?N^gdg#!uu61 zYSmV2{y8A~(smuC(1y1Hm0_utCTG`S@yEjN%8(6+YfWp-?V8(|GG@vHHxZTJsoZAk zuB4^UW2Sh_R75h{v!5-b*t7mB$uU^l)c`m|B84l-G?8?Y1CM4bn?Iy0Wg%}vU5_AH zu{2Fmrx5R@qwl37${)eIMhyP6DtOi%Zo)xBl8h*S%~f1Sv*naRyQ{*U7=dP6DU zdgN&S5xQUYMmF2vnI@-NcMZdI6h{u2Xcy(lTG%RWvI`)D81+W&lfO?h0s9l)I9Wk> zqdKmuf$`IoL$|j}`aHj9z+igVD!#2mM0+5>09}Bs$|>PYxqdsdpq^oAkB~>zOw*LK z`kD3!yZ5k3)KNt4fKX8mWRyidg2>bAwQGLkOt!RH#)z9OjJiqBoZA{XdXAzv;Q5y{ ztS!WaC)N5(@JsuwIoZ=UQsa8uwO!8sW>_nnKAk4_q80VA0vfD{1~w^C{tlD|ok8JF zOl4|}y;|Baq%)S{OI!6KI{4mJ&}e2$%`mlImQ$ke&ap9>4+DYa#Q4kLt`MvKB1rxr z_=-=ue0Bg%Adoloass9CIdtH8l%U6*!G{n~yl;Sbu@d^tu1_Mi2XSl%yTko)H1nA1 z59N}ro1P~w41<|#m0%FMqk%7N#N&Hh@|1%o}q-O2+ z@2HNI0HarJG}TK2Wu1ZXN>ZET2XjaDeNj30_P3?k{)HA;&G!c5IcBu@9R-yd7d)d< z+&^CY z;C@I^J5D`d-L)UnO+6*@H*_1swzizWljR>vzpL6iU>z;3vvy%KY&2KGaymB5%M+BC4e}(y$bE(Zjefv{s|1 z-qd8Z)pNih7XPqzKS+`OQgAw40xGngYc-o;b$y|5V*R%4EsNRQQenOKkKVeMUE4il zrjSJ}0_8A3cpO2{IG{=S;B8%c-*G9zMXcKoq98agYg1FXBY zAqOF_%R-)FR~;7PJ_h~ulO0Z}3>GnY%C%|yl&UC2Rg88uEYt^dO_LL)ab=M920Vs! z)BCf--D_Sz01=++mVrJFOVXSNUh|RMhnM^S1%Yny>qS$ndkd^*7&v9gS@&EJIIv8s zX-tb0HC_uKfx@9oD0PcHYhrpb)fr7gH5FS@ zAj1izZkf1wY6|qdZWsMN}2;vEO?fpAZ{>#RYT;!jgkj7Zup)QsUP>Z7h2nCa#s~YCCdn8 ztgAT~0w86#dT-qCPb4rC0|<0d5(Ia^J?YGt88^8Ib@(LtY>GVbY5AZ6=A1f_uuk;j z1mj5~=FFKSX~K;8-wTjaZ^Tuo23y|56w>gAKZbasXlEu=;XJn{#Lnkd%3bvLJP%mxY4Qv$9j%t=uNz^+Vsm9 zAG5Yy3q%&BP;G4`d^(g`c_h9H?bq&nI+5%=7GL-IvG{wGp2=-DgXE3r;N$7rWAK&w z?$=!>Kt6)(hfb~`&Q}~u-i1zJkCF9P;!iynEH1JCbN)KsAwy566&`(L8zTxk0HzOGJxywNx+HnqI|kH1;}Y5(vFoJZZ&mZiy59)@T499ySsWS2>!t2njfH=3(K zvse$eR-1LOVvGBbOXCpB&?%l0QBbxKJ$bQ#*Y5p_E9g>pyg-1|@Y?uBG{HBX(&rzz-HbS-N-p9Tj2wDp#A&9!0~ zwQqe}lV}O`Xe`}*+OEZ8$6lAm(6Q==Z2#zRp*Gq93r;}^!xQsLA>kJN>aGj`^($XExau75~5qlM@ zTlhF+_vr@)N=+O}YS`^8vyIubK$6N?@GN;~yLcqK-++>z$E$n2pA?8(caqM|YE(|v z6kug62gB5)EP95>MS}16Jp)R9SfG>}0i|rs0*#I#iR}11E?$^?3N=Mk5LQ}S0rNBh z*g%gx!rQCyr*?R|3Wkhz5f>-X`L4LJ>#5>h#T^$v;oGnlXK*hgpN+f>&<~?@rWjnQ zDVIom0Fv|;-@Z5yD zp)X1ts`!JlmD;A?cd~SVi5i*AT{kA5MzRxrU_&I+ktI)(=?4)aJAx|%Ql1>SGL{QR z#=tNaDQeBG3=~p45)~bTE3-c>c#M(;NE)P|E_3r7*jAi0S9TEjt6&9nnVajd%HOfj zl;zrTY8l)m5nKP^Gfcy+f2UxHE-8rLbqq(+m|m8@EcqwW!@nk;`=@^|t%K?#hV-!g0r@Rbt%vHVAu|B#hUBO5^)bRER3rf$elfGHD$cglD( zmIq360t?krJ@iYPdy~U!Xa%Fpri~cDwOvh4&n)Xel-P|;!LW&-VX7LS{}C*$Hj>*G z$l>Lu^<>NW%MZey6PYZIVGiu5`8 z5KDjf;zODV=o3mwr~~W;nxccK9qhAmlz>e@tOVl>J98DkbSCH58+&jrc#daN;z0!y zq@!ahtrP>m4Rk{G!wP;0ukMXCq6Y5uY^l7F^DBO}gfSrik)?&4#cULE=niP%6hoo@7{4P$1joX;%2@J zznSmpkXEn9L$1y(#A=o18HwW9oMHA=EydjwZ z5!Z_;YOqod8bP(03-4Sf&Z!zGfKtaI=5kR3Atv7`st&F!DUpu?Z&!G|_s6A>4O*<8 z#o34T?ZsxWl{uo~P#+93T`W$`x*(wvoH=_jJmF0VdHoZUM8{dB8J|IuGmL5;QdpL;)NH69}J7w7d=>uHDF3B7;CLpuy!7}4~8x68n6xc`%hdlGAgPw zBQo=xuI!UDSzQ%*IdRVapa1;V?=Kbs)>R^0rb%k54$q}#2y$CVCE~{B>+eDm6qSet z7$g8CW$k*9s-?hd>WHa5<%L0VD|1MZxZa{-y_yn7Zzau|EM)7bqMW5t;%t?~Y3(09 z2%iSjttmBJ@}{!dwOD*sgO66hZ(_=WeuVwc)KoHDeh$yW$RCd152JHZ{yGDHgeK&& zWEcxmLGP*SLNfq~PPrSfS~S-%1a%PL>_U_7^u6}coM1qXJ>WB&-!&jxoF@xv&BrX*F5V+K6@X|$J+E!h(?kQk) zT-@2G~Vq1B=##>wr=e;PhXDSON5DGinG^%67_02w(* z^A+Qjlw5XGxU4!VzoVnk6QUpJ5vH0dD&&ROyc7&$0WsRebO&1$9j^mlVJlXfsGW$E65`e zVd`uhC|Lb7c;2NpmK%c4mT`$fT+&cXhG&UHYXDoTg7A!`tuZ^Eumfs~f|{;LRCrO= z3i@;C4o+!7YM^8Sp-hnK1csqnfHu{{xCkW^tcMBiL5dV3l*smyEeT}Az`r&+bqk^WeVBu67kmV3KzDH5 z4X49R_UfW~K3P+IQ(Te10%{c%oTTqoR#KeTYMQRyB(63!bZ!8Mju@`)1AIYw>MYr$0PcwNsix?M-7&@vKDbp`beVoqSWEt5Tof7ZDzmzK)VzEsyS zRWZ4XlKh(?|MF59>E;M2s)i8X(Kbuvd!TGlS9(TZC-2m4cTAS`W9n#K1}Hx7C`HSREhNV^fTo9skWKjmOq;1nX`au)MSs#e3r?g9j0I&b z!f0@^vjBX{DcSw^JMA*6t1YT8Mdqb}G(S3vg;0H)Me%M4F&317!cK|Pt$?Cxnu;Yx zJ(4H@pd3BwO5hrK(5lYhv|U#R5R4%x#cG>(V|AJ!w#hc5YS@$mE2x+EHq+!T_E=F_ z?F@tS%ha#ejDn$GdU`eE)62GPxcY2Ca4FVD6P<-Zbrc^ajN0IYrU2B{#;rTJlt%8_ zmqY)&-+Qk=IO+M($%F7@ItcC*uCg!j!r{d4!>xIEISLw77ugw3&$GZQ)x;Cpa3}ff z{M$);`ZAu+92T!P*cZ1hCqeebbn!L%@g+PN36t~0AAy^8XhH- zUw6+$Rr)l0)4o4BW5d%-(iQf?D0uwN@%MusB_}o-_wan>>-dqcC8js+H1~EGL+>yi zXTRchKe%js3hyplD;5sZEROH{ifECl7ZVYMv~$zOTN@3!#bZ`)+eEfJ zy?Jkp&tCtDS81wqA7G6;@Y%U9{|52jZTz_XdVYch#q`chXMMADhtFnTw!Lk%m0(^% z^f5CuOVeNf29MDkWHVtjW22+#R@^fIGc?hxNmn;Inwknq%QAHZ>&j^~-9eJDW4-2H}VVA@bPm;w-YNWBKupISQGUc~8JRB~L!3z=+sOSLpu*p?W= zOW!jXFn!b&`pf47J@EF1=V!?urXoyfnK zWoqT|j4V@OaYqZqB#1yMV&YGKfE8fEKQ#$9(noRzX2q{5=9ZlUg3MytkyFqn4i?M);(3*yZA41Fv zsba3j!mPjqd2J&J=>T0-Q%K`nSl{Ymf+nn)vqb~C2U?3mlK z!>25_rX7ZnhmcO0Bim`Wk>*M@M(FZ^RCF;1&lUTITJ=$8O>dJe^tO!jWdUR&{eFKu z35R9GcilEn8j)gSTdspJr5H$ONqk7X^ikKi?cfWFN@qJvWa!AJM7698Azy{k>>$k@ zSytrS&{fwEqjg;1?lZ?01y!ie)7YCv2(M4pA5@`uZnn@{CIzZ6LSFM|IdO8W>Nu*c z+NKy;AQ=IyxgHI)j1eC0dk_4fe;P#B!zb8nkHP1-if$sS$P$Cx%h?XuT79rC7idPD z1YiMgzy$c|3&901)SN*6tyKWa^5FNw z(YW6m1P2o!n3bu2PSPFt6;u`&lfen)^vho0j+G`x2$%P_C48s2oVY*ya#iS34JPQrX0oi zjyK+Ki57Xo8MmY&c>b^zB%1dIMA_D!WMxUW0G4U@!;|~{)3Z`7CQW}qS~u172*Q&h zW@ZeHf42>Su?|&$j_R>ISoCeM0XHH>z1U`|?1IsXa({uPm*W1IXy|O{K&%y_^PS_y z*;XN!AD}H78<+Yt%`GZ?yNl@*DbH{nO7ToeveS_r zqHCNBpTP=AJd>e+qw!4s1Vn87F`nzjGb!EPK)pp1Ma5k^3P;&!!0=Qp)lt>w9fgBP zkXczIcO(i&t zO>lBJJq}X0W4=N~?;2f-G9wGwu`EXr>qJ!g6zQ;AyR)@@vuxI2r1pUYy5L~+j_ z-SbPmb6pjk-9dNV#Hnus8&15-f$pI50m|tB^d<@KFNOGBhPtvJoFG`|4`SDS*`{wH z*ub2CrVeL=E-1z5YJgc%pUJ!F2w*97@!r1^T&5(?7od3t^ZUXe)JzBcvBb1)o^vs7 zaKCTu`M&&q&lA7vB*I?PblXIHQHZeTw%=bU>SMp(4|`Acfnto5l4osw69`MdF&E@q zzLHXK{CGIPjc*_fyR{i5Wf{eUL2xkWpFr0G21RLVL8r^MKapN{(e74EKG{!F9iJ*X z$lbSL6`$M&66m5jz|v~|Bh71@WLE(E8Gdd}7o%rL{}Gr!dt|=#iWyA1_=ch(waACW{7CqB+p>Mi4u4ij z5`#^&{Bh>s%j^DVX~5dpAd?s=KREw|=>9UeGviC*&AKAFET@>#boxC4SVw|>7#%%s z7K)1%tHpf0w(1b>og=2L*i{2yZ`_K)C(_S5YnHO8!QY!;o#Kh?5r$ux-RHV7*-<`* zsGh2eQTuthe74r;t3-3fh-q$Wx<$sGm_)Mw32e%aVbXmz=;oWzoaE_7^2cYAn&z=Z z$%^&ZNbp>tcV!4cUPSDLv|8gJuPrfH-D zH3y?Je`(ae?jZChxsfP6i(ShAI%pIk2zz9sZP{)qi>n_@PyNWt#ntm_cUv(~vJDgm zbosJe)e++d;dS_Kt(4paR~Hqo1uhV;9aCPn(Yg-Z-oyl3<|r?d`K!A@Ynt0B^^s2F zBDca6V{U&4w#^hU64|kjVDqhvB*Zutn?16Vu%gqo%=NY(1!JHEwZad|?7X%b3mo`f zfg}mBLuW5{oQTgt*Jmt8x&X1<-tZ~zIgBo;Ge_f=ic3qRa^+gJPNJONaZMXnd}-rd z`aw;n@(oFw$NfQnf;PN6RK&86V*BZ6yu;c^?qqj%M1PyC|7zh{vHvP9DeQ~QCZ)Yf zgJ7}t#?7aGe?WG9o(Pv%F_58&9u=4U5r&O{kq`GB&BDlgg{ zgW<-yHXQnlB@m%TP)5Yz-3^KiInrOsH*pq-IcSJQzlw7bLE-0-7e5@+>{qxdxnTCPf zJy0JNpqha^J~1-jiU-pR2Vu0lLA-2)WEMn}XMYMrV<1^br(6+Q67H^~E0m`UmkO?s zWhwtsCRVqM@^?$b{`EjK`LLDRgbNW{AB~Az&9DWfivKDI!>kH2{YhX^_i2w2jj40zFWz-x#ph~R8OZ>=p=GaDpTr&aWLMBSw=riBA% zCYT*+TV__31?i~lqTL@iN29>cT0qY!K`mxcX$rOa)LcP9x+m#rLs}-CHV0?n#qz$C zFdXD^F({Zq`37?-pt#o9+U@@~CRaQJNX2**l4s&xe|Q=+r<3qVEz8f*l0Gho>1(cO zTVf)0E-0Vb)U+`PHDCk9_p{wEl^TLjj;6gywoz#JJr4~E%OqKxBb7oGClTj4sIX=n zaYjoz9o?%{F?#dWbOXBa;NLgKBCs=t#m;S}3$Q&KyfjWcWkuq0De1vsvc0 zX7UBA!BQNaQ?XOmmV%AWYM9X>8GUhJP0{(qJuD#^FNh|WHxkdFrohYi&UMk98)({+ z?~s!$Tfi<2&{vi!T!3es%M&iVmP-}R1H8Mw!1>tr7A!KlN4pWZZMq5SA zn-#LucPF90ULk56B zNKUG1qJ+^j#bklBk^7gKt*nLDG>TAHlH7meRvZyrSRVn62v&N|i9sBTi*u^ew{Y!B zCCPpC>K=s0-w%2d6p;8))ThD>tao^R90gH$C;bIABV_Wjl7i3R7jN!PHfL30F4f!!^=^?a%Vfk>3OzP6tVa$ zo}Huuzzg$lCmZ+6i-yJPaZ>J;s^!<{l`r90`t5JN8J81KMkw9f_?p6kjkRp~GrB#R zB00g*70H(AVX-eQ}1_gK@@w_zCSr*BNK0>G^P0W z<98Ty(nyW_c)s#Y{K$!eorB9Us*1)t30KURIAs&cg3dTQxmc`#qW2u%2gu|>FzH6& zd9tCd^#!uD>SLy)H^=dt_r~}vTex!XAv5Ou!8Axe5U*2Vlm1Iu{r?L;C{P~n`_Awb z+lkB+d-CwBwzE*x_wY~j9^UyJK@GhnjEJBJ~`W#5VaIr6^7;??UN;%z`P2N8{u z{kEBbJO=%JC;n&cLmZy<&mjfxB>%4c`%{^k6RuxdEuK%RJChx&H_v_^Ja}cMbUS=! z*b5Mi82OXl+3Zx$ha;2@(;b1;<^cEI*2SFa7a#^Z)l*4&*gp@($$_~vHpO06W5&b` zlNPv^Nm&dMBU8{Q+0ndZj8JCU9{S@a&E8obn#(zKrBu5s=L1VeB9Jb|nH%Q$fNFM< zyOt*A(k5n^a(~5)yaEZQdU2koW2>n5Q7tj0gTp-eNgf<;r~|;(?tZdZil$w5CdWmC z`4Eofc}iR{Y9RATv&DGu&+}v_aV)8hMaXNZ3k>=)s(VpfcV1E|s#ysHsDZGZ?Fzyq zxe~Z*Llus~OX*LXxoQ^SKh`C@qo@jU55y>YlJMBw$s^N3e;yYq?0AAVDav^?U@z0` z)OLKdt7zhe+(SY2yH}3({qQ1)Hn7*X_Gn*Cv2$^{+X@Oeg@mlGP=8a3-PUHDErjRP zJ=@c}T^+dVXw>QG^Dh#P@IXrg!VI~q$2UV z_=2LI*BK!67y;ow1ezXY?WS5^-m*tmH`aFtS$Ud6ogRdo`+t5eQ zV&~9wWS-Dt^%}6h%Vd5eq>xt zl`CXAzcXyyx{ZHjU~_P?C`on?>vTnnnRU=3Ea?%@%f_WbtsQsag3rW3z)6rP^Tn4E z^1qC!ki5yd(`~w!-uEzA!^AV6n>y>IcMmSd$yu&}UVP!ZQ$IpgW8(|?TRob4tyoSf zeL*su7Wo$;`GW3&ZHgO~1yx!DWV@hj|9U0FRt*+dadlu}=%SR6E9tI>;S>d!o76&R z|7?-pX&o$}>MpY21my=v763!CM_n7FOjBzIJ%7;bA@A*K13Xu=IuzWpEW<&wWkGqb ze1KJFhTWF!`?^H8Ro8HJgtdgI=aT3v?etxIx_I6%NT2Dbb{x$Fine9|wqFR{rJIq_ zy}qBR?3kZd@|fONW|_5HEtYj^;+QuzxSfS?fIQ|C4w#)t6*C#iGFcYm71*t$gqb>H zBfDKp66h7`Z>p?qwz^w(-k0UiErC{|Dly`rp=mCX&s{OczC* zOkW8v%IrlxX(c8}dc+qk19Pjh>bJaPGELEKMBwy;N(avchoUpSrvXd%~V}Qj85>AlnIbO$3%kcsr_8G zpDe3py?YjpC;K=dO5w_ZYv!>^W(&4};V5FtOh~{mA%lOnt@5u1O+1|va5P0BSQem8 zktpQel~2+npT6$4u{l5!bZFHy%T}b_-0vOuPXpSpv#m>iWEx||2v+rd;&vEK5Vl6e zGTLrPnyi~9D`ot9amGK;^9&olW--;PjTRuDmYG0WR4|dFKG>?Sp{*F448(a)7dE@!||2 z1cTS9bOK9rw1X0|M{QqQb$6Vg*RAJayyqY%>1nKhd<1ZMkwyNstT z)zCVw$x`}sOHoj&ZHdX~!YEuAz^Pp5VpmzJ=~U-(uIb?tFC z;cVLg@F7CrVyaU(+v8iSo0q{*+Q3ftp9+cAV8Klv1OX=s*FG>H@XHaB3c*jX;6|8u!B32C#4p3w@t;F}^{GiUHn_9~pmE3=x;npGllJ z9@z57L8^u3!veMygW{k#UO}K(7n5}VA?D7sP?9)giSnwvppbNGT_^gQe>~Wzp}l1) zPxV|@rFJ3g}X}p z4S|$y?IFB^;cX{fqf7%wv8xKoaJs?*vQ($y{@=x^QPuEvIx3YN68-^_vjyQ4@;dWh z%Ffg+Gr#VZP@Z|+4x|3*X%Jmsm}A+kHZgz;x0`Njg2KNa;{KUOR65})3*shqsO*%m z-ZB+ox?(aD&_v|Nbpg9XTatU;fy_XgMIx~NwT+INAwachv7CArFxiS`3aSi}Ot2m% zs8=H7G)<3AAV-5MNO9aP_X5tg*p}%abq@m6*u+2qs%{&Uc_a^la1=z7%LXY!H%%S* z7Vf!dgFK@{N|P0ZLj8mnSa%IuOb*DL{Xy)vA?L%^?)@^!zqmt6+cujN@K<%mL;~3J z(jr5G|Sg(PHn7Ww8r$R4rBP;$X#!%EkRoyNtCA z&yF3N1UccTs+gFTEOAN%3;k19xRh1y9t6E8m^{O+=`y#brogk{7?vT%yL7);xqIA2 zu`xiWZeuw%Qr`Lre6dVmp2Ot&OIVT^n=-phbzon_vwb=A&to*#qh=KOmtHuW`28Uj zSL5Z+;F(e>_f}j@4h;4ie$?gc(z?w-c!A8R(xN>p;c68&vxBsGF+#1MPM_B3BY4Uq zZ22Rso~GPYR6+2WlK!ITZ*?8kOWM^GO9d2>m@)}Te^K;zEMU)( zr&M(u*U=n#{@>L2SiSS#u^IhU#X$!a-4K)~A@{$q{h!j`RpRPcAu)1Ee^K;TT&DkP z$dQ8aXQ^Vs5m4LPywa=_hOy@+5Xox;8s|w^#8q}^jDB90UwaG|6VNmds>S{ zvlSa)8Bm+U(&SYW{mB*N%0D0Ke;as$ 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 Date: Sat, 18 Apr 2026 15:25:33 -0400 Subject: [PATCH 02/16] delegate test --- .../patterns/test_data/gvas.hexpat/delegate.sav | Bin 0 -> 1575 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/patterns/test_data/gvas.hexpat/delegate.sav diff --git a/tests/patterns/test_data/gvas.hexpat/delegate.sav b/tests/patterns/test_data/gvas.hexpat/delegate.sav new file mode 100644 index 0000000000000000000000000000000000000000..7c3984441120d0acf06357a6efd3f6289d312aa8 GIT binary patch literal 1575 zcmZ<{a|~u;U|?Vc5-bej42%qWzD;5f28w8Fhq{_*2c_nuCKjjan&=rBGcW^%b%9vv zYRH^@{%R}S*cGQ-Xxfq}4itN0bYlarf2aKRy7OxmdHprx0*YxkAA1<=tFx%BFK2Pj zUhx#55QELZIP>2gPuM=RFl?e1ppd z=ldcPCl@QoiYo)fwt8xBc$NgE9_#Bs6HGML6ATeX<4;3@~U%h_SvSsI@sGVm(V*D0{X%C!zb=A*vHbkuq z%LIwd@BSh5$E&o1=Vr|^&AnC@@<1`4=TX%HJ_VO%gh#B5(o*E+28u~!YF@wVeNA>n z%A>h076)xWZm9@bc<7(k^ZoxPi06cUmknkFid|W}Chwrn8;7^uZQGCbJ8^>id$;td zrn=kW2W6K8=Dxb4qbvv%i(Tft-re(ZeV<+N4A$KTZ-UHwlcSd1?|oeE<`eG4?0=j% zLFOgee&>DVZolYdr~39;o{l^qu{H_WgckplHTN!yt-5yn6|Xc;)ZF0JwYCwM5`**9JfbSZ{{?BHO zx0X&eW(A7*o6Zf;_k8wkQ>*84nPeMwpb*2W?MX|l{APZUe{*o=riUs`Aia{lJkAB4 zA%&TDH-XG!@anog-7Vq;$jw{aYCS;l(e|SNROTh-W+uA;b8>oONh$-#W*8@+D8C@JsHBo17AOb?9zaq* zBsI4{Kh)JFz|%F}AU-s&B(o$ZH6`9q55cqwNG&SPEG|jSEAdG!OU=;(*;!;5@03%T zT2PdkR}yc;0E!p4%%b8Fr_8*R%)E34A)tV7X--LIa$<1_%nb|*$fBNkIhlE>FgdvU z_5;;`0Vuv`>PBiB&IfdCaB6aXUJ5J(B!D9D5C|?vEGmZk6*U}C<>29v2o3}w0ZJ>> RbSg$%ffB7>eqJirLI6?GErkF8 literal 0 HcmV?d00001 From 2ae0588d45283058fbeb01be2a3bf5ab49898295 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:19:16 -0400 Subject: [PATCH 03/16] fengineversion format --- patterns/gvas.hexpat | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 278db7b8..5453e8e0 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -91,9 +91,12 @@ struct FEngineVersion { } [[sealed, format("format_fengineversion")]]; fn format_fengineversion(FEngineVersion version) { - return std::format("{}.{}.{}-{}+{}", + const str branch = std::string::replace(version.branch.data, "+", "/"); + return std::format( + "{}.{}.{}-{} {}", version.major, version.minor, version.patch, - version.changeList, version.branch.data); + version.changeList, + branch); }; struct FCustomVersion { From 8f7b41a65aaebab442e662b4969deb4fb4e7b89f Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:22:50 -0400 Subject: [PATCH 04/16] Show enums in custom versions --- patterns/gvas.hexpat | 168 +++++++++++++++++++++++-------------------- 1 file changed, 90 insertions(+), 78 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 5453e8e0..a5c5ee79 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -55,6 +55,91 @@ enum EUnrealEngineObjectUE5Version : u32 { AUTOMATIC_VERSION = EUnrealEngineObjectUE5Version::AUTOMATIC_VERSION_PLUS_ONE - 1 }; +// ====== Custom version constants ====== + +/// Custom serialization version for changes made in //UE5/Release-* stream +/// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersion.h +/// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersions.inl +enum EUE5ReleaseStreamObjectVersion : s32 { + BeforeCustomVersionWasAdded = 0, + ReflectionMethodEnum, + WorldPartitionActorDescSerializeHLODInfo, + RemovingTessellation, + LevelInstanceSerializeRuntimeBehavior, + PoseAssetRuntimeRefactor, + WorldPartitionActorDescSerializeActorFolderPath, + HairStrandsVertexFormatChange, + AddChaosMaxLinearAngularSpeed, + PackedLevelInstanceVersion, + PackedLevelInstanceBoundsFix, + CustomPropertyAnimGraphNodesUseOptionalPinManager, + TextFormatArgumentData64bitSupport, + MaterialLayerStacksAreNotParameters, + MaterialInterfaceSavedCachedData, + AddClothMappingLODBias, + AddLevelActorPackagingScheme, + WorldPartitionActorDescSerializeAttachParent, + ConvertedActorGridPlacementToSpatiallyLoadedFlag, + ActorGridPlacementDeprecateDefaultValueFixup, + PackedLevelActorUseWorldPartitionActorDesc, + AddLevelActorFolders, + RemoveSkeletalMeshLODModelBulkDatas, + ExcludeBrightnessFromEncodedHDRCubemap, + VolumetricCloudSampleCountUnification, + PoseAssetRawDataGUID, + ConvolutionBloomIntensity, + WorldPartitionHLODActorDescSerializeHLODSubActors, + LargeWorldCoordinates, +}; +const u128 GUID_UE5_RELEASE_STREAM = 0xDF6417798412ACA824BD4D46D89B5E42; + +/// Custom serialization version for changes made in Dev-Editor stream. +/// See: Engine/Source/Runtime/Core/Public/UObject/EditorObjectVersion.h +enum EEditorObjectVersion : s32 { + BeforeCustomVersionWasAdded = 0, + GatheredTextProcessVersionFlagging, + GatheredTextPackageCacheFixesV1, + RootMetaDataSupport, + GatheredTextPackageCacheFixesV2, + TextFormatArgumentDataIsVariant, + SplineComponentCurvesInStruct, + ComboBoxControllerSupportUpdate, + RefactorMeshEditorMaterials, + AddedFontFaceAssets, + UPropertryForMeshSection, + WidgetGraphSchema, + AddedBackgroundBlurContentSlot, + StableUserDefinedEnumDisplayNames, + AddedInlineFontFaceAssets, + UPropertryForMeshSectionSerialize, + FastWidgetTemplates, + MaterialThumbnailRenderingChanges, + NewSlateClippingSystem, + MovieSceneMetaDataSerialization, + GatheredTextEditorOnlyPackageLocId, + AddedAlwaysSignNumberFormattingOption, + AddedMaterialSharedInputs, + AddedMorphTargetSectionIndices, + SerializeInstancedStaticMeshRenderData, + MeshDescriptionNewSerializationMovedToRelease, + MeshDescriptionNewAttributeFormat, + ChangeSceneCaptureRootComponent, + StaticMeshDeprecatedRawMesh, + MeshDescriptionBulkDataGuid, + MeshDescriptionRemovedHoles, + ChangedWidgetComponentWindowVisibilityDefault, + CultureInvariantTextSerializationKeyStability, + ScrollBarThicknessChange, + RemoveLandscapeHoleMaterial, + MeshDescriptionTriangles, + ComputeWeightedNormals, + SkeletalMeshBuildRefactor, + SkeletalMeshMoveEditorSourceDataToPrivateAsset, + NumberParsingOptionsNumberLimitsAndClamping, + SkeletalMeshSourceDataSupport16bitOfMaterialNumber, +}; +const u128 GUID_EDITOR = 0x2E46BB41A231DA0BF49442E9E4B068ED; + // ====== Save Game Header types ====== struct FString { @@ -101,7 +186,11 @@ fn format_fengineversion(FEngineVersion version) { struct FCustomVersion { u128 key; - s32 value; + match (key) { + (GUID_UE5_RELEASE_STREAM): EUE5ReleaseStreamObjectVersion value; + (GUID_EDITOR): EEditorObjectVersion value; + (_): s32 value; + } } [[sealed, name(std::format("0x{:032X}", key)), format("format_fcustomversion")]]; fn format_fcustomversion(FCustomVersion version) { @@ -137,83 +226,6 @@ struct FSaveGameHeader { FSaveGameHeader header @ 0; -// ====== Custom version constants ====== - -/// Custom serialization version for changes made in //UE5/Release-* stream -/// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersion.h -/// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersions.inl -enum EUE5ReleaseStreamObjectVersion : s32 { - BeforeCustomVersionWasAdded = 0, - ReflectionMethodEnum, - WorldPartitionActorDescSerializeHLODInfo, - RemovingTessellation, - LevelInstanceSerializeRuntimeBehavior, - PoseAssetRuntimeRefactor, - WorldPartitionActorDescSerializeActorFolderPath, - HairStrandsVertexFormatChange, - AddChaosMaxLinearAngularSpeed, - PackedLevelInstanceVersion, - PackedLevelInstanceBoundsFix, - CustomPropertyAnimGraphNodesUseOptionalPinManager, - TextFormatArgumentData64bitSupport, - MaterialLayerStacksAreNotParameters, - MaterialInterfaceSavedCachedData, - AddClothMappingLODBias, - AddLevelActorPackagingScheme, - WorldPartitionActorDescSerializeAttachParent, - ConvertedActorGridPlacementToSpatiallyLoadedFlag, - ActorGridPlacementDeprecateDefaultValueFixup, - PackedLevelActorUseWorldPartitionActorDesc, - AddLevelActorFolders, - RemoveSkeletalMeshLODModelBulkDatas, - ExcludeBrightnessFromEncodedHDRCubemap, - VolumetricCloudSampleCountUnification, - PoseAssetRawDataGUID, - ConvolutionBloomIntensity, - WorldPartitionHLODActorDescSerializeHLODSubActors, - LargeWorldCoordinates, -}; -const u128 GUID_UE5_RELEASE_STREAM = 0xDF6417798412ACA824BD4D46D89B5E42; - -/// Custom serialization version for changes made in Dev-Editor stream. -/// See: Engine/Source/Runtime/Core/Public/UObject/EditorObjectVersion.h -enum EEditorObjectVersion : s32 { - BeforeCustomVersionWasAdded = 0, - GatheredTextProcessVersionFlagging, - GatheredTextPackageCacheFixesV1, - RootMetaDataSupport, - GatheredTextPackageCacheFixesV2, - TextFormatArgumentDataIsVariant, - SplineComponentCurvesInStruct, - ComboBoxControllerSupportUpdate, - RefactorMeshEditorMaterials, - AddedFontFaceAssets, - UPropertryForMeshSection, - WidgetGraphSchema, - AddedBackgroundBlurContentSlot, - StableUserDefinedEnumDisplayNames, - AddedInlineFontFaceAssets, - UPropertryForMeshSectionSerialize, - FastWidgetTemplates, - MaterialThumbnailRenderingChanges, - NewSlateClippingSystem, - MovieSceneMetaDataSerialization, - GatheredTextEditorOnlyPackageLocId, - AddedAlwaysSignNumberFormattingOption, - AddedMaterialSharedInputs, - AddedMorphTargetSectionIndices, - SerializeInstancedStaticMeshRenderData, - MeshDescriptionNewSerializationMovedToRelease, - MeshDescriptionNewAttributeFormat, - ChangeSceneCaptureRootComponent, - StaticMeshDeprecatedRawMesh, - MeshDescriptionBulkDataGuid, - MeshDescriptionRemovedHoles, - ChangedWidgetComponentWindowVisibilityDefault, - CultureInvariantTextSerializationKeyStability, -}; -const u128 GUID_EDITOR = 0x2E46BB41A231DA0BF49442E9E4B068ED; - // ====== Custom version logic ====== const bool propertyTagCompleteTypeName = From f867c42172c48b182edb4975d781a0f0f631e02b Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Mon, 20 Apr 2026 20:39:32 -0400 Subject: [PATCH 05/16] Improve property parsing --- patterns/gvas.hexpat | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index a5c5ee79..7db43737 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -458,20 +458,16 @@ fn format_typetreenode(TypeTreeNode node) { }; using Properties; -struct StructPropertyValue { - match (type) { - ("DateTime"): u64 value; - ("Guid"): u128 value; - ("Rotator"): Rotator value; - ("Vector"): Vector value; - ("Quat"): Quat value; - (_): Properties value; - } -} [[inline]]; - -struct SafeStructPropertyValue { +struct StructPropertyValue { try { - StructPropertyValue value; + match (type) { + ("DateTime"): u64 value; + ("Guid"): u128 value; + ("Rotator"): Rotator value; + ("Vector"): Vector value; + ("Quat"): Quat value; + (_): Properties value [[inline]]; + } } catch { std::warning(std::format( "StructPropertyValue parsing failed for {}", @@ -479,7 +475,7 @@ struct SafeStructPropertyValue { // Wrap the unknown data std::mem::Bytes value; } -} [[inline]]; +}; struct FPropertyTag { const auto dollar = $; @@ -498,7 +494,7 @@ struct FPropertyTag { TypeTreeNode type; u32 size; if (flags.hasArrayIndex) { - u32 arrayIndex; + u32 arrayIndex; } if (flags.hasPropertyGuid) { u128 guid; @@ -514,15 +510,7 @@ struct FPropertyTag { match (type.data) { ("ArrayProperty"): FString propertyType; ("BoolProperty"): bool value; - ("ByteProperty"): { - FString name; - type::Magic<"\x00"> terminator; - match (size) { - (0|1): u8 value; - (_): FString value; - } - std::error("Not implemented"); - } + ("ByteProperty"): FString enumName; ("EnumProperty"): FString enumType; ("MapProperty"): { FString keyType; @@ -596,6 +584,12 @@ struct FPropertyTag { } } ("BoolProperty"): {} + ("ByteProperty"): { + match (size) { + (0|1): u8 value; + (_): FString value; + } + } ("DoubleProperty"): double value; ("FloatProperty"): float value; ("IntProperty"): s32 value; @@ -608,7 +602,7 @@ struct FPropertyTag { ("SoftObjectProperty"): std::mem::Bytes value; ("EnumProperty" | "StrProperty" | "ObjectProperty"): FString value; ("MapProperty" | "SetProperty"): std::mem::Bytes value; - ("StructProperty"): SafeStructPropertyValue value; + ("StructProperty"): StructPropertyValue value; ("TextProperty"): { try { FText value; From 4fa774f2d3447e538fd535f35c4dfb7b33dd6870 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 25 Apr 2026 05:49:29 -0400 Subject: [PATCH 06/16] Support more types --- patterns/gvas.hexpat | 14 ++++++++++++-- tests/patterns/test_data/gvas.hexpat/types.sav | Bin 0 -> 2503 bytes 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 tests/patterns/test_data/gvas.hexpat/types.sav diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 7db43737..4427c8d5 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -226,7 +226,7 @@ struct FSaveGameHeader { FSaveGameHeader header @ 0; -// ====== Custom version logic ====== +// ====== Property serialization logic ====== const bool propertyTagCompleteTypeName = (header.saveGameFileVersion >= SaveGameFileVersion::PackageFileSummaryVersionChange) && @@ -583,7 +583,11 @@ struct FPropertyTag { } } } - ("BoolProperty"): {} + ("BoolProperty"): { + if (propertyTagCompleteTypeName) { + const bool value = flags.boolTrue; + } + } ("ByteProperty"): { match (size) { (0|1): u8 value; @@ -593,8 +597,12 @@ struct FPropertyTag { ("DoubleProperty"): double value; ("FloatProperty"): float value; ("IntProperty"): s32 value; + ("Int8Property"): s8 value; + ("Int16Property"): s16 value; ("Int64Property"): s64 value; + ("UInt16Property"): u16 value; ("UInt32Property"): u32 value; + ("UInt64Property"): u64 value; ("DelegateProperty"): Delegate value; ("MulticastInlineDelegateProperty"): MulticastInlineDelegate value; ("MulticastSparseDelegateProperty"): MulticastSparseDelegate value; @@ -651,3 +659,5 @@ struct Properties { Properties properties @ $; type::Magic<"\x00\x00\x00\x00"> footer @ $; + +std::assert_warn(std::mem::eof(), std::format("Expected EOF @ 0x{:04X}", $)); \ No newline at end of file diff --git a/tests/patterns/test_data/gvas.hexpat/types.sav b/tests/patterns/test_data/gvas.hexpat/types.sav new file mode 100644 index 0000000000000000000000000000000000000000..46171b153d5358cfd51380291991d7ff65ead057 GIT binary patch literal 2503 zcmb`J3pA8z7{@=Q+zYkQN{C2e){wBu7-JZh8Eeqwv@{q@4WqeOO71Kvk`gwx8A`1p zVGhzB&MNJ;%Vv`tT{ucq+eNw{_I-wi%I-P4XWw(aZ_fAo{?GG1w|8coeI4lYFbq>f zH(5*zn}=!c)sR_&h>3}hlck9li^F2_S*Dg|_zl>6gl*8Z>W25xOEkkWvYg(b_M~d2 z31a>Du1XbJhK@L{t-RRvos}YDYaB24(mmD{r)63&z_LNR^Ivm*(X1b+t8CBUVE(sT?HfHi+@E zqHXj0y&#^gs{JK3loMNiBD9?P^KP6sLfBRFR+}E@2YwnyNrkalD>ebM(0Ue~PaAqP zlu}(+>{oYf5n_w2%|q@vdYBruDJ1xv_GN?ac;*}RaaUow@~zmD#*Mbtrii%@`0ZA8 zkG!70nQ_{0t)7w!Vw!B@o44IMwabG0ic+kb>>!qCuM^D^t^+?#9?;#9XVJ?r$<5c~S1V}&!NBR*>rKYu|()2+pb zJ?0qh$acH3@>ai+NN${{0REU8U#ko`+ZPXJ7>Nrh4$8pNG_|*-(1OeFbSyj5d1Xii zhgevU`~bsUe@CR2O-hcx;WE&5UYsmq$j~TB>Uw?YWe4q`N9FD3UT_^I3ggcNr;T?S zj)G1}ho({Lbh-MWnf>`aIb-dhOLl#`oE`yg>PaSQ)0nDgt5%;i*!pZ#wIY&zt zX&!(f95@!g)0R>>h|jr@E|+MnC6AaVKFqtqr63_Mzco|*_Usr!*oB@wSq;wJ3B}}& ztbQY@l@GDxq}{9VqNvz@8OpC+Y5F1-SmV1IGgXgr zne1V!#O~5uiv@_$))#r=C=Xs$rBY6<2(pty2pbXyme^7YUg|t!Cd#=JVItXgqW+zdtB5JN_!LIqvLLyyIa0K8CS;)0-e_- z98-xv@6MsAM->48_nYEVXZI*#3!_;CQ#hcBNy)LEa|C@vxD4> z^-H5_ob(kOy3XZyZO63%lVe{DI7evpNqHWcW&eEAAN-B(8W~R}MtL$GoUX&0em_Y< zYilu3UKI)iO!5-k=Y!UnKz3sfCp!0I17V; z5n2Zb5X0b*5@Q4`PaZdt#S_F}5GgE(gvyOzVOS#Q*|YSN2!Zt{dMs5L$%OncE>AG! z8hYo0wB}Y)v7{vkW22MMu~}mHqWK%GY=XoyJ3?TA|Io7qUg{Z|BUuxZlM>&vPHL9P}BB>B#3Yn69N{kC1@K_az1kGKb5YBck@j z6aqvPJfns(lDNV^&PVCuJ zae^^;fh>hVf*E7j5g8*UwYQTPW0G-k6!Hb!@F~GGp7jCI!(;`7uvy6e`yrUCJT_lU z*-1wYeo%v%0#<;49nSj4c-~h)0a=icg*P&oayI*}YxHW^z_42$P7ssFW5xtJ*h22of}oQ!S2Z*x z+hN$pr$-V2z>lww%fpTcoy)J!EWc=oq}7-FZ_+?7XN{+B2#*`CD~S~QZ?B}~f?fXt D0QCKM literal 0 HcmV?d00001 From ba5b57d3cea09ebca6a9f6e1d5b92dbbb94e1bfa Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Mon, 27 Apr 2026 20:52:15 -0400 Subject: [PATCH 07/16] Organize --- patterns/gvas.hexpat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 4427c8d5..4152324c 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -466,7 +466,7 @@ struct StructPropertyValue { ("Rotator"): Rotator value; ("Vector"): Vector value; ("Quat"): Quat value; - (_): Properties value [[inline]]; + (_): Properties value; } } catch { std::warning(std::format( @@ -475,7 +475,7 @@ struct StructPropertyValue { // Wrap the unknown data std::mem::Bytes value; } -}; +} [[inline]]; struct FPropertyTag { const auto dollar = $; From 32c40df62f26d3b68f348fdaf6e58d7bcd1420f0 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Mon, 27 Apr 2026 20:53:39 -0400 Subject: [PATCH 08/16] Support more types --- patterns/gvas.hexpat | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 4152324c..06aacb55 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -531,9 +531,15 @@ struct FPropertyTag { u32 count; match (propertyTagCompleteTypeName ? type.child[0].name.data : propertyType.data) { ("BoolProperty"): bool values[count]; - ("ByteProperty"): std::mem::Bytes values; + ("ByteProperty"): { + if (count + 4 == size) { + std::mem::Bytes values; + } else { + FString values[count]; + } + } ("DoubleProperty"): double values[count]; - ("EnumProperty" | "StrProperty" | "NameProperty"): FString values[count]; + ("EnumProperty" | "StrProperty" | "NameProperty" | "ObjectProperty"): FString values[count]; ("FloatProperty"): float values[count]; ("IntProperty"): s32 values[count]; ("StructProperty"): { From 82e17140927f2cad167274e0f909daac0e82e18c Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 2 May 2026 16:29:20 -0400 Subject: [PATCH 09/16] EEditorObjectVersion::AddedAlwaysSignNumberFormattingOption --- patterns/gvas.hexpat | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 06aacb55..09aa9108 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -242,10 +242,11 @@ fn custom_version(u128 guid) { }; const EUE5ReleaseStreamObjectVersion releaseVersion = custom_version(GUID_UE5_RELEASE_STREAM); +const bool text64bitSupport = releaseVersion >= EUE5ReleaseStreamObjectVersion::TextFormatArgumentData64bitSupport; const bool largeWorldCoordinates = releaseVersion >= EUE5ReleaseStreamObjectVersion::LargeWorldCoordinates; -const bool text64bitSupport = releaseVersion >= EUE5ReleaseStreamObjectVersion::TextFormatArgumentData64bitSupport; const EEditorObjectVersion editorVersion = custom_version(GUID_EDITOR); +const bool includeAlwaysSign = editorVersion >= EEditorObjectVersion::AddedAlwaysSignNumberFormattingOption; const bool cultureInvariantStability = editorVersion >= EEditorObjectVersion::CultureInvariantTextSerializationKeyStability; // ====== Property serialization ====== @@ -312,7 +313,7 @@ enum RoundingMode : s8 { }; struct NumberFormattingOptions { - u32 always_include_sign; + if (includeAlwaysSign) u32 always_sign; u32 use_grouping; RoundingMode rounding_mode; s32 minimum_integral_digits; From 2b21a7afcd39725c1a83279c64b695c353ee67f1 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 2 May 2026 16:46:20 -0400 Subject: [PATCH 10/16] Vector2D --- patterns/gvas.hexpat | 6 ++++++ .../patterns/test_data/gvas.hexpat/vector2d.sav | Bin 0 -> 10752 bytes 2 files changed, 6 insertions(+) create mode 100644 tests/patterns/test_data/gvas.hexpat/vector2d.sav diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 09aa9108..4a99e61b 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -405,6 +405,10 @@ struct Rotator { } }; +struct Vector2D { + double x, y; +}; + struct Vector { if (largeWorldCoordinates) { double x, y, z; @@ -466,6 +470,7 @@ struct StructPropertyValue { ("Guid"): u128 value; ("Rotator"): Rotator value; ("Vector"): Vector value; + ("Vector2D"): Vector2D value; ("Quat"): Quat value; (_): Properties value; } @@ -558,6 +563,7 @@ struct FPropertyTag { ("Guid"): u128 values[count]; ("Rotator"): Rotator values[count]; ("Vector"): Vector values[count]; + ("Vector2D"): Vector2D values[count]; ("Quat"): Quat values[count]; (_): Properties values[count]; } diff --git a/tests/patterns/test_data/gvas.hexpat/vector2d.sav b/tests/patterns/test_data/gvas.hexpat/vector2d.sav new file mode 100644 index 0000000000000000000000000000000000000000..69a9a12761fc10ac130650be1543691d0cfb0139 GIT binary patch literal 10752 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 literal 0 HcmV?d00001 From 0668ca4a1c4fda82d4ef58f64a397244e732b101 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 2 May 2026 16:58:07 -0400 Subject: [PATCH 11/16] GameplayTagContainer --- patterns/gvas.hexpat | 13 ++++++++++++- .../test_data/gvas.hexpat/tagcontainer.sav | Bin 0 -> 1388 bytes 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tests/patterns/test_data/gvas.hexpat/tagcontainer.sav diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 4a99e61b..4f9f9a9e 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -249,7 +249,7 @@ const EEditorObjectVersion editorVersion = custom_version(GUID_EDITOR); const bool includeAlwaysSign = editorVersion >= EEditorObjectVersion::AddedAlwaysSignNumberFormattingOption; const bool cultureInvariantStability = editorVersion >= EEditorObjectVersion::CultureInvariantTextSerializationKeyStability; -// ====== Property serialization ====== +// ====== Text serialization ====== enum TextHistoryType : u8 { None = 255, @@ -397,6 +397,13 @@ fn format_ftext(FText text) { return text; }; +// ====== Struct serialization ====== + +struct GameplayTagContainer { + u32 count; + FString tags[count]; +}; + struct Rotator { if (largeWorldCoordinates) { double pitch, yaw, roll; @@ -425,6 +432,8 @@ struct Quat { } }; +// ====== Property serialization ====== + struct Delegate { FString object, functionName; }; @@ -467,6 +476,7 @@ struct StructPropertyValue { try { match (type) { ("DateTime"): u64 value; + ("GameplayTagContainer"): GameplayTagContainer value; ("Guid"): u128 value; ("Rotator"): Rotator value; ("Vector"): Vector value; @@ -560,6 +570,7 @@ struct FPropertyTag { } try { match (propertyTagCompleteTypeName ? type.child[0].child[0].name.data : structName.data) { + ("GameplayTagContainer"): GameplayTagContainer values[count]; ("Guid"): u128 values[count]; ("Rotator"): Rotator values[count]; ("Vector"): Vector values[count]; diff --git a/tests/patterns/test_data/gvas.hexpat/tagcontainer.sav b/tests/patterns/test_data/gvas.hexpat/tagcontainer.sav new file mode 100644 index 0000000000000000000000000000000000000000..ef40fe8b5f63ab6aed54bdc4f3778d2632e49d56 GIT binary patch literal 1388 zcmZ<{a|~u;U|`?^5-beT3?McGgD?YC^onKLj0g-w9?H&4^@ zNay7WB03>G0q2#cu>r+?Rek-_>{J#I@oeQzBi#l6U4UZCe_wKV>f_;E8fCFzo~K_2 zJ5Wqhd1={JS7lDe8|!A=$kIR03KV0{+!Mdf;Y4W5$Min?kN@Ksfnt6&&zqJyD;pmb z&ffBw*Kj&eh(YOU$eextYAf8>6{lQi+LEXZ6nkQHV*{^$r~LN1^J^A){WaqPifK3> zdl>Aiv#6~vXK~M7@f46=n}c!YzdfF?eQ06WT34v0#sU<3o3Y`^OQ$JcxNjLQa@_5v zrvVhRFZpx6!DWNElt*)0EDqX$+)@#=@X$Z6=llOp5YGwyE*lIAzblK^R@w%|?w*(H`|OHmu_{m%Q!-G0%_PWA1xJRNyJVr>$#2`&C9YwleZTXpUDD_(t| zSVl6(^9Ud1>;h@amWgp{Vjy+b_WYk4!RYVVB&7JLW5pyJP#mqfur%c?bKqJ#v!n zj!_KW^3SD%6{MG~_2H&N=Zl?ofAL$&zN@UAPJoQ@_EN zKh=YCS?|n=bC&Q)OaLYL=kw|dtvolpG@7`%gT2v0ngb{nV3ZNE-eYFNv>7M5xBp!G z8z{se>C59>;2BbwIXkoc>4pjSL1DGm=-(<4pQ*vBaar5$UNjN_+0plKy>f)#L!Y2S ziM`wR1@GhrioM#Nw8YA9<`?-l2WM`2sL}*Ve|!IK)f4bt!`T1Xtnt>;$;P0(;BPuN zK;QG(w@s~{%Vm;nKv{;t;dPkT9l@^xbtac5JcGKZnYjl zKy__DDnsRctR`1;>}uBEnV1Yx7qm}5k=r5o)}ElLTV@;N+srf)ah#ip1Q4oK(Hw#IjWP#N1Q{P+*26riY{!moR_=EV!ho zG`S?8D8C@JsHBo%4NwRKM1dHjz91*D5~$ocKd&S)GcUCWEQvyZT&oVm&KZeCiOD6Y zMS6|}1*t%GUUI6Qe_3i#Vor{8eolUoo_l^y3Iixp6IL3Yky(<;pn^-STTW?O8pP0` d)D#9#p@7v)By~{Q1r{sO9fI43;+ Date: Sat, 2 May 2026 17:15:05 -0400 Subject: [PATCH 12/16] DateTime, Guid, IntPoint, LinearColor, Timespan --- patterns/gvas.hexpat | 51 +++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 4f9f9a9e..038c10b1 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -399,11 +399,33 @@ fn format_ftext(FText text) { // ====== Struct serialization ====== +struct DateTime { + u64 ticks; +}; + struct GameplayTagContainer { u32 count; FString tags[count]; }; +using Guid = u128; + +struct IntPoint { + s32 x, y; +}; + +struct LinearColor { + float r, g, b, a; +}; + +struct Quat { + if (largeWorldCoordinates) { + double x, y, z, w; + } else { + float x, y, z, w; + } +}; + struct Rotator { if (largeWorldCoordinates) { double pitch, yaw, roll; @@ -412,6 +434,10 @@ struct Rotator { } }; +struct Timespan { + u64 ticks; +}; + struct Vector2D { double x, y; }; @@ -424,14 +450,6 @@ struct Vector { } }; -struct Quat { - if (largeWorldCoordinates) { - double x, y, z, w; - } else { - float x, y, z, w; - } -}; - // ====== Property serialization ====== struct Delegate { @@ -475,13 +493,16 @@ using Properties; struct StructPropertyValue { try { match (type) { - ("DateTime"): u64 value; + ("DateTime"): DateTime value; ("GameplayTagContainer"): GameplayTagContainer value; - ("Guid"): u128 value; + ("Guid"): Guid value; + ("IntPoint"): IntPoint value; + ("LinearColor"): LinearColor value; + ("Quat"): Quat value; ("Rotator"): Rotator value; + ("Timespan"): Timespan value; ("Vector"): Vector value; ("Vector2D"): Vector2D value; - ("Quat"): Quat value; (_): Properties value; } } catch { @@ -570,12 +591,16 @@ struct FPropertyTag { } try { match (propertyTagCompleteTypeName ? type.child[0].child[0].name.data : structName.data) { + ("DateTime"): DateTime values[count]; ("GameplayTagContainer"): GameplayTagContainer values[count]; - ("Guid"): u128 values[count]; + ("Guid"): Guid values[count]; + ("IntPoint"): IntPoint values[count]; + ("LinearColor"): LinearColor values[count]; + ("Quat"): Quat values[count]; ("Rotator"): Rotator values[count]; + ("Timespan"): Timespan values[count]; ("Vector"): Vector values[count]; ("Vector2D"): Vector2D values[count]; - ("Quat"): Quat values[count]; (_): Properties values[count]; } } catch { From 0636792fe1b347cef8c74ac3b838f6b161471454 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 2 May 2026 17:45:58 -0400 Subject: [PATCH 13/16] More UE naming convention --- patterns/gvas.hexpat | 111 +++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 038c10b1..9f7c2187 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -59,7 +59,6 @@ enum EUnrealEngineObjectUE5Version : u32 { /// Custom serialization version for changes made in //UE5/Release-* stream /// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersion.h -/// See: Engine/Source/Runtime/Core/Public/UObject/UE5ReleaseStreamObjectVersions.inl enum EUE5ReleaseStreamObjectVersion : s32 { BeforeCustomVersionWasAdded = 0, ReflectionMethodEnum, @@ -251,24 +250,7 @@ const bool cultureInvariantStability = editorVersion >= EEditorObjectVersion::Cu // ====== Text serialization ====== -enum TextHistoryType : u8 { - None = 255, - Base = 0, - NamedFormat, - OrderedFormat, - ArgumentFormat, - AsNumber, - AsPercent, - AsCurrency, - AsDate, - AsTime, - AsDateTime, - Transform, - StringTableEntry, - TextGenerator, -}; - -enum FormatArgumentType: u8 { +enum EFormatArgumentType: u8 { Int, UInt, Float, @@ -277,10 +259,10 @@ enum FormatArgumentType: u8 { }; using FText; -struct FormatArgumentValue { - FormatArgumentType type; +struct FFormatArgumentValue { + EFormatArgumentType type; match (type) { - (FormatArgumentType::Int): { + (EFormatArgumentType::Int): { // FUE5ReleaseStreamObjectVersion::TextFormatArgumentData64bitSupport if (text64bitSupport) { u64 value; @@ -288,7 +270,7 @@ struct FormatArgumentValue { u32 value; } } - (FormatArgumentType::Text): FText value; + (EFormatArgumentType::Text): FText value; (_): { std::error(std::format( "Unknown FormatArgumentValue type {} ({})", @@ -297,12 +279,12 @@ struct FormatArgumentValue { } }; -struct FormatArgument { - FString key; - FormatArgumentValue value; +struct FFormatArgumentData { + FString name; + FFormatArgumentValue value; }; -enum RoundingMode : s8 { +enum ERoundingMode : s8 { HalfToEven, HalfFromZero, HalfToZero, @@ -312,20 +294,37 @@ enum RoundingMode : s8 { ToPositiveInfinity, }; -struct NumberFormattingOptions { - if (includeAlwaysSign) u32 always_sign; - u32 use_grouping; - RoundingMode rounding_mode; - s32 minimum_integral_digits; - s32 maximum_integral_digits; - s32 minimum_fractional_digits; - s32 maximum_fractional_digits; +struct FNumberFormattingOptions { + if (includeAlwaysSign) u32 alwaysSign; + u32 useGrouping; + ERoundingMode roundingMode; + s32 minimumIntegralDigits; + s32 maximumIntegralDigits; + s32 minimumFractionalDigits; + s32 maximumFractionalDigits; +}; + +enum ETextHistoryType : u8 { + None = 255, + Base = 0, + NamedFormat, + OrderedFormat, + ArgumentFormat, + AsNumber, + AsPercent, + AsCurrency, + AsDate, + AsTime, + AsDateTime, + Transform, + StringTableEntry, + TextGenerator, }; struct FTextHistory { - TextHistoryType type; + ETextHistoryType type; match (type) { - (TextHistoryType::None): { + (ETextHistoryType::None): { if (cultureInvariantStability) { u32 hasCultureInvariantString; if (hasCultureInvariantString) { @@ -335,38 +334,38 @@ struct FTextHistory { FString cultureInvariantString; } } - (TextHistoryType::Base): { + (ETextHistoryType::Base): { FString nameSpace; FString key; FString sourceString; } - // (TextHistoryType::NamedFormat): {} - // (TextHistoryType::OrderedFormat): {} - (TextHistoryType::ArgumentFormat): { + // (ETextHistoryType::NamedFormat): {} + // (ETextHistoryType::OrderedFormat): {} + (ETextHistoryType::ArgumentFormat): { FText sourceFormat; u32 argumentCount; - FormatArgument arguments[argumentCount]; + FFormatArgumentData arguments[argumentCount]; } - (TextHistoryType::AsNumber): { - FormatArgumentValue sourceValue; + (ETextHistoryType::AsNumber): { + FFormatArgumentValue sourceValue; u32 hasFormatOptions; if (hasFormatOptions) { - NumberFormattingOptions formatOptions; + FNumberFormattingOptions formatOptions; } FString targetCulture; } - // (TextHistoryType::AsPercent): {} - // (TextHistoryType::AsCurrency): {} - // (TextHistoryType::AsDate): {} - // (TextHistoryType::AsTime): {} - // (TextHistoryType::AsDateTime): {} - // (TextHistoryType::Transform): {} - (TextHistoryType::StringTableEntry): { + // (ETextHistoryType::AsPercent): {} + // (ETextHistoryType::AsCurrency): {} + // (ETextHistoryType::AsDate): {} + // (ETextHistoryType::AsTime): {} + // (ETextHistoryType::AsDateTime): {} + // (ETextHistoryType::Transform): {} + (ETextHistoryType::StringTableEntry): { FString tableId; FString key; } - // (TextHistoryType::TextGenerator): {} - // (TextHistoryType::RawText): {} + // (ETextHistoryType::TextGenerator): {} + // (ETextHistoryType::RawText): {} (_): { std::error(std::format( "Unsupported TextHistory type {} ({})", @@ -382,7 +381,7 @@ struct FText { fn format_ftext(FText text) { match (text.history.type) { - (TextHistoryType::None): { + (ETextHistoryType::None): { if (cultureInvariantStability) { if (text.history.hasCultureInvariantString) { return text.history.cultureInvariantString; @@ -392,7 +391,7 @@ fn format_ftext(FText text) { return text.history.cultureInvariantString; } } - (TextHistoryType::Base): return text.history.sourceString; + (ETextHistoryType::Base): return text.history.sourceString; } return text; }; From 0445ea381dc3de5a50a10c75e5d923d8097ab5b9 Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 2 May 2026 17:46:16 -0400 Subject: [PATCH 14/16] Support more text types --- patterns/gvas.hexpat | 11 ++++++++++- .../gvas.hexpat/text_property_noarray.bin | Bin 0 -> 264566 bytes 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 tests/patterns/test_data/gvas.hexpat/text_property_noarray.bin diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 9f7c2187..ed492096 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -256,14 +256,23 @@ enum EFormatArgumentType: u8 { Float, Double, Text, + Gender, }; using FText; struct FFormatArgumentValue { EFormatArgumentType type; match (type) { + (EFormatArgumentType::Double): double value; + (EFormatArgumentType::Float): float value; (EFormatArgumentType::Int): { - // FUE5ReleaseStreamObjectVersion::TextFormatArgumentData64bitSupport + if (text64bitSupport) { + s64 value; + } else { + s32 value; + } + } + (EFormatArgumentType::UInt | EFormatArgumentType::Gender): { if (text64bitSupport) { u64 value; } else { diff --git a/tests/patterns/test_data/gvas.hexpat/text_property_noarray.bin b/tests/patterns/test_data/gvas.hexpat/text_property_noarray.bin new file mode 100644 index 0000000000000000000000000000000000000000..cfce44cbde6f306d446c164ebaf3afa468cd9ad4 GIT binary patch literal 264566 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 Date: Sat, 2 May 2026 18:26:26 -0400 Subject: [PATCH 15/16] Support old ETextHistoryType::None --- patterns/gvas.hexpat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index ed492096..77dca232 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -340,7 +340,7 @@ struct FTextHistory { FString cultureInvariantString; } } else { - FString cultureInvariantString; + const bool hasCultureInvariantString = false; } } (ETextHistoryType::Base): { From 9a44f950d0b820248d59eda3f75814b529ab84cc Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Sat, 2 May 2026 18:46:22 -0400 Subject: [PATCH 16/16] VER_UE4_FTEXT_HISTORY --- patterns/gvas.hexpat | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/patterns/gvas.hexpat b/patterns/gvas.hexpat index 77dca232..1480aa07 100644 --- a/patterns/gvas.hexpat +++ b/patterns/gvas.hexpat @@ -25,6 +25,7 @@ enum SaveGameFileVersion : u32 { /// See: Engine/Source/Runtime/Core/Public/UObject/ObjectVersion.h enum EUnrealEngineObjectUE4Version : u32 { VER_UE4_OLDEST_LOADABLE_PACKAGE = 214, + VER_UE4_FTEXT_HISTORY = 368, }; /// UE5 object versions @@ -385,7 +386,11 @@ struct FTextHistory { struct FText { u32 flags; - FTextHistory history [[inline]]; + if (header.packageFileVersion < EUnrealEngineObjectUE4Version::VER_UE4_FTEXT_HISTORY) { + std::error("Not supported"); + } else { + FTextHistory history [[inline]]; + } } [[single_color, format("format_ftext")]]; fn format_ftext(FText text) {